Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- RafflePool
- Optimization enabled
- false
- Compiler version
- v0.8.19+commit.7dd6d404
- EVM Version
- default
- Verified at
- 2024-05-23T09:14:41.645377Z
Constructor Arguments
0000000000000000000000009829d6ac67e49e0b95af2859fff15302151518150000000000000000000000000000000000000000000000000000000000000060000000000000000000000000be1513f5fd788092a8b4ca25a0a0042be183118e000000000000000000000000000000000000000000000000000000000000000e706f6f6c312875696e7432353629000000000000000000000000000000000000
Arg [0] (address) : 0x9829d6ac67e49e0b95af2859fff1530215151815
Arg [1] (string) : pool1(uint256)
Arg [2] (address) : 0xbe1513f5fd788092a8b4ca25a0a0042be183118e
contracts/RafflePool.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "@openzeppelin/contracts/access/Ownable.sol"; import "./RNG/interfaces/IRNG.sol"; contract RafflePool is Ownable { struct Payout { uint256 from; uint256 to; uint256 amount; } struct Pool { address poolAddress; bytes4 selector; } Pool public pool; uint256[] public places; mapping(uint256 => bool) public paidTable; uint256 public currentRafflePosition = 0; uint256 public currentPayPosition = 0; Payout[] public payoutStructure; IRNG public rng; event Claimed(address indexed user, uint256 indexed index, uint256 amount); receive() external payable {} fallback() external payable {} constructor(address poolAddress_, string memory functionPrototype_, address rng_) { pool.poolAddress = poolAddress_; pool.selector = bytes4(keccak256(bytes(functionPrototype_))); rng = IRNG(rng_); (bool success, ) = pool.poolAddress.call(abi.encodeWithSelector(pool.selector, 0)); require(success, "RafflePool: Invalid pool address or selector"); } function setPayoutStructure(uint256[] calldata payoutStructure_) external onlyOwner() { require(0 == payoutStructure.length, "RafflePool: Payout structure already set"); require(0 != payoutStructure_.length, "RafflePool: Length of payout structure cannot be 0"); require(0 == payoutStructure_.length % 3, "RafflePool: length % 3 should be 0"); uint256 pl = payoutStructure_[payoutStructure_.length - 2]; (bool success, ) = pool.poolAddress.staticcall(abi.encodeWithSelector(pool.selector, pl - 1)); require(success, "RafflePool: Payout structure not correspond with pool"); (success, ) = pool.poolAddress.staticcall(abi.encodeWithSelector(pool.selector, pl)); require(! success, "RafflePool: Payout structure not correspond with pool"); require(0 == payoutStructure_[0], "RafflePool: Invalid payout structure"); require(payoutStructure_[0] < payoutStructure_[1], "RafflePool: Invalid payout structure"); payoutStructure.push(Payout({ from: payoutStructure_[0], to: payoutStructure_[1], amount: payoutStructure_[2] })); for (uint256 i = 3; i < payoutStructure_.length; i += 3) { require(payoutStructure_[i] == payoutStructure[payoutStructure.length - 1].to, "RafflePool: Invalid payout structure"); require(payoutStructure_[i] < payoutStructure_[i + 1], "RafflePool: Invalid payout structure"); payoutStructure.push(Payout({ from: payoutStructure_[i], to: payoutStructure_[i + 1], amount: payoutStructure_[i + 2] })); } } function getUserInfo(address user) external view returns(uint256 place, uint256 amount) { for (uint256 i = 0; i < places.length; i++) { (bool success, bytes memory data) = pool.poolAddress.staticcall(abi.encodeWithSelector(pool.selector, i)); require(success, "RafflePool: cannot get user address"); address user_ = _bytesToAddress(data); if (user == user_) { Payout memory payout; for (uint256 j = 0; j < payoutStructure.length; j++) { payout = payoutStructure[j]; if (payout.from <= places[i] && payout.to > places[i]) { return (places[i], payout.amount); } } } } } function getNumber() external onlyOwner() { rng.requestRandomWords(); } function rafflePool(uint256 count_) external onlyOwner() { require(0 != payoutStructure.length, "RafflePool: Payout structure not set"); uint256 pl = payoutStructure[payoutStructure.length - 1].to; require(pl != currentRafflePosition, "RafflePool: Pool already raffled"); require(0 != count_, "RafflePool: Count must be greater than 0"); require(currentRafflePosition + count_ - 1 < pl, "RafflePool: Out of index"); uint256 lastRequestId = rng.lastRequestId(); (bool fulfilled, uint256[] memory numbers) = rng.getRequestStatus(lastRequestId); require(fulfilled, "RafflePool: wait for fulfillment"); bytes32 hash = bytes32(numbers[0]); uint256 from = currentRafflePosition; currentRafflePosition += count_; uint256[] storage places_ = places; for (uint256 i = from; i < currentRafflePosition; i++) { places_.push(places_.length); uint256 n = uint256(hash) % (i + 1); uint256 t = places_[n]; places_[n] = places_[places_.length - 1]; places_[places_.length - 1] = t; hash = keccak256(abi.encodePacked(hash)); } } function payWithIndex(uint256 userIndex_) external { _pay(userIndex_); } function payWithCount(uint256 count_) external { require(0 != count_, "RafflePool: Count must be greater than 0"); uint256 pl = payoutStructure[payoutStructure.length - 1].to; require(currentPayPosition + count_ <= pl, "RafflePool: Out of index"); for (uint256 i = 0; i < count_; i++) { _pay(currentPayPosition); ++currentPayPosition; } } function getPayoutStructure() external view returns (Payout[] memory) { return payoutStructure; } function getPlaces() external view returns (uint256[] memory) { return places; } function withdraw(address _recipient) public onlyOwner() { payable(_recipient).transfer(address(this).balance); } /// Helper member functions function _pay(uint256 index_) private { uint256 pl = payoutStructure[payoutStructure.length - 1].to; require(pl == currentRafflePosition, "RafflePool: Raffle not ended"); require(pl > currentPayPosition, "RafflePool: Pool already paid"); if (paidTable[index_]) { return; } (bool success, bytes memory data) = pool.poolAddress.call(abi.encodeWithSelector(pool.selector, index_)); require(success, "RafflePool: Pool call failed"); address ua = _bytesToAddress(data); Payout memory payout; for (uint256 i = 0; i < payoutStructure.length; i++) { payout = payoutStructure[i]; if (payout.from <= places[index_] && places[index_] < payout.to) { paidTable[index_] = true; (success,) = payable(ua).call{ value: payout.amount }(""); require(success, "RafflePool: transfer failed"); emit Claimed(ua, index_, payout.amount); return; } } } function _bytesToAddress(bytes memory data) private pure returns (address addr) { require(data.length >= 20, "RafflePool: Invalid address data"); assembly { addr := mload(add(data, 0x20)) } } }
@openzeppelin/contracts/access/Ownable.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
contracts/RNG/interfaces/IRNG.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IRNG { function lastRequestId() external returns(uint256); function requestRandomWords() external; function getRequestStatus(uint256) external view returns (bool, uint256[] memory); }
Compiler Settings
{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":false},"libraries":{}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"poolAddress_","internalType":"address"},{"type":"string","name":"functionPrototype_","internalType":"string"},{"type":"address","name":"rng_","internalType":"address"}]},{"type":"event","name":"Claimed","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"index","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentPayPosition","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentRafflePosition","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"getNumber","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct RafflePool.Payout[]","components":[{"type":"uint256","name":"from","internalType":"uint256"},{"type":"uint256","name":"to","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"}]}],"name":"getPayoutStructure","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getPlaces","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"place","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"}],"name":"getUserInfo","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paidTable","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"payWithCount","inputs":[{"type":"uint256","name":"count_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"payWithIndex","inputs":[{"type":"uint256","name":"userIndex_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"from","internalType":"uint256"},{"type":"uint256","name":"to","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"}],"name":"payoutStructure","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"places","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"poolAddress","internalType":"address"},{"type":"bytes4","name":"selector","internalType":"bytes4"}],"name":"pool","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rafflePool","inputs":[{"type":"uint256","name":"count_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IRNG"}],"name":"rng","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPayoutStructure","inputs":[{"type":"uint256[]","name":"payoutStructure_","internalType":"uint256[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"address","name":"_recipient","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x6080604052600060045560006005553480156200001b57600080fd5b506040516200381d3803806200381d833981810160405281019062000041919062000538565b62000061620000556200027460201b60201c565b6200027c60201b60201c565b82600160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508180519060200120600160000160146101000a81548163ffffffff021916908360e01c021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b60006040516024016200017391906200060d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051620001df919062000677565b6000604051808303816000865af19150503d80600081146200021e576040519150601f19603f3d011682016040523d82523d6000602084013e62000223565b606091505b50509050806200026a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002619062000717565b60405180910390fd5b5050505062000739565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003818262000354565b9050919050565b620003938162000374565b81146200039f57600080fd5b50565b600081519050620003b38162000388565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200040e82620003c3565b810181811067ffffffffffffffff8211171562000430576200042f620003d4565b5b80604052505050565b60006200044562000340565b905062000453828262000403565b919050565b600067ffffffffffffffff821115620004765762000475620003d4565b5b6200048182620003c3565b9050602081019050919050565b60005b83811015620004ae57808201518184015260208101905062000491565b60008484015250505050565b6000620004d1620004cb8462000458565b62000439565b905082815260208101848484011115620004f057620004ef620003be565b5b620004fd8482856200048e565b509392505050565b600082601f8301126200051d576200051c620003b9565b5b81516200052f848260208601620004ba565b91505092915050565b6000806000606084860312156200055457620005536200034a565b5b60006200056486828701620003a2565b935050602084015167ffffffffffffffff8111156200058857620005876200034f565b5b620005968682870162000505565b9250506040620005a986828701620003a2565b9150509250925092565b6000819050919050565b600060ff82169050919050565b6000819050919050565b6000620005f5620005ef620005e984620005b3565b620005ca565b620005bd565b9050919050565b6200060781620005d4565b82525050565b6000602082019050620006246000830184620005fc565b92915050565b600081519050919050565b600081905092915050565b60006200064d826200062a565b62000659818562000635565b93506200066b8185602086016200048e565b80840191505092915050565b600062000685828462000640565b915081905092915050565b600082825260208201905092915050565b7f526166666c65506f6f6c3a20496e76616c696420706f6f6c206164647265737360008201527f206f722073656c6563746f720000000000000000000000000000000000000000602082015250565b6000620006ff602c8362000690565b91506200070c82620006a1565b604082019050919050565b600060208201905081810360008301526200073281620006f0565b9050919050565b6130d480620007496000396000f3fe6080604052600436106101185760003560e01c80639c2d2d8e116100a0578063d605787b11610064578063d605787b14610383578063e557bb4e146103ae578063f289eaa5146103eb578063f2c9ecd81461042a578063f2fde38b146104415761011f565b80639c2d2d8e1461029e578063a980e79f146102c9578063bc23f848146102f2578063c7634a791461031b578063cc5ee365146103585761011f565b806351cff8d9116100e757806351cff8d9146101cc5780636386c1c7146101f5578063715018a6146102335780638da5cb5b1461024a5780639494582d146102755761011f565b806308d62b03146101215780630cff68271461014a57806316f0115b146101755780633b0e84de146101a15761011f565b3661011f57005b005b34801561012d57600080fd5b5061014860048036038101906101439190611dea565b61046a565b005b34801561015657600080fd5b5061015f61057c565b60405161016c9190611e26565b60405180910390f35b34801561018157600080fd5b5061018a610582565b604051610198929190611ebd565b60405180910390f35b3480156101ad57600080fd5b506101b66105c1565b6040516101c39190611fa4565b60405180910390f35b3480156101d857600080fd5b506101f360048036038101906101ee9190611ff2565b610619565b005b34801561020157600080fd5b5061021c60048036038101906102179190611ff2565b61066b565b60405161022a92919061201f565b60405180910390f35b34801561023f57600080fd5b50610248610933565b005b34801561025657600080fd5b5061025f610947565b60405161026c9190612048565b60405180910390f35b34801561028157600080fd5b5061029c600480360381019061029791906120c8565b610970565b005b3480156102aa57600080fd5b506102b36110c0565b6040516102c09190612206565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190611dea565b61113d565b005b3480156102fe57600080fd5b5061031960048036038101906103149190611dea565b6115b9565b005b34801561032757600080fd5b50610342600480360381019061033d9190611dea565b6115c5565b60405161034f9190612243565b60405180910390f35b34801561036457600080fd5b5061036d6115e5565b60405161037a9190611e26565b60405180910390f35b34801561038f57600080fd5b506103986115eb565b6040516103a591906122bd565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190611dea565b611611565b6040516103e29190611e26565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d9190611dea565b611635565b604051610421939291906122d8565b60405180910390f35b34801561043657600080fd5b5061043f61166f565b005b34801561044d57600080fd5b5061046860048036038101906104639190611ff2565b6116fb565b005b806000036104ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a490612392565b60405180910390fd5b6000600660016006805490506104c391906123e1565b815481106104d4576104d3612415565b5b906000526020600020906003020160010154905080826005546104f79190612444565b1115610538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052f906124c4565b60405180910390fd5b60005b828110156105775761054e60055461177e565b60056000815461055d906124e4565b91905081905550808061056f906124e4565b91505061053b565b505050565b60045481565b60018060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460e01b905082565b6060600280548060200260200160405190810160405280929190818152602001828054801561060f57602002820191906000526020600020905b8154815260200190600101908083116105fb575b5050505050905090565b610621611be2565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610667573d6000803e3d6000fd5b5050565b60008060005b60028054905081101561092c57600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b846040516024016106e19190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161074b919061259d565b600060405180830381855afa9150503d8060008114610786576040519150601f19603f3d011682016040523d82523d6000602084013e61078b565b606091505b5091509150816107d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c790612626565b60405180910390fd5b60006107db82611c60565b90508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff160361091657610818611d7f565b60005b600680549050811015610913576006818154811061083c5761083b612415565b5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505091506002868154811061088957610888612415565b5b90600052602060002001548260000151111580156108c85750600286815481106108b6576108b5612415565b5b90600052602060002001548260200151115b1561090057600286815481106108e1576108e0612415565b5b906000526020600020015482604001519750975050505050505061092e565b808061090b906124e4565b91505061081b565b50505b5050508080610924906124e4565b915050610671565b505b915091565b61093b611be2565b6109456000611cb3565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610978611be2565b6006805490506000146109c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b7906126b8565b60405180910390fd5b81819050600003610a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fd9061274a565b60405180910390fd5b600382829050610a169190612799565b600014610a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4f9061283c565b60405180910390fd5b60008282600285859050610a6c91906123e1565b818110610a7c57610a7b612415565b5b9050602002013590506000600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b600184610ae391906123e1565b604051602401610af39190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610b5d919061259d565b600060405180830381855afa9150503d8060008114610b98576040519150601f19603f3d011682016040523d82523d6000602084013e610b9d565b606091505b5050905080610be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd8906128ce565b60405180910390fd5b600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b83604051602401610c419190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610cab919061259d565b600060405180830381855afa9150503d8060008114610ce6576040519150601f19603f3d011682016040523d82523d6000602084013e610ceb565b606091505b5050809150508015610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d29906128ce565b60405180910390fd5b83836000818110610d4657610d45612415565b5b90506020020135600014610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8690612960565b60405180910390fd5b83836001818110610da357610da2612415565b5b9050602002013584846000818110610dbe57610dbd612415565b5b9050602002013510610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc90612960565b60405180910390fd5b6006604051806060016040528086866000818110610e2657610e25612415565b5b90506020020135815260200186866001818110610e4657610e45612415565b5b90506020020135815260200186866002818110610e6657610e65612415565b5b90506020020135815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506000600390505b848490508110156110b95760066001600680549050610edf91906123e1565b81548110610ef057610eef612415565b5b906000526020600020906003020160010154858583818110610f1557610f14612415565b5b9050602002013514610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390612960565b60405180910390fd5b8484600183610f6b9190612444565b818110610f7b57610f7a612415565b5b90506020020135858583818110610f9557610f94612415565b5b9050602002013510610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd390612960565b60405180910390fd5b60066040518060600160405280878785818110610ffc57610ffb612415565b5b90506020020135815260200187876001866110179190612444565b81811061102757611026612415565b5b90506020020135815260200187876002866110429190612444565b81811061105257611051612415565b5b90506020020135815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506003816110b29190612444565b9050610ec0565b5050505050565b60606006805480602002602001604051908101604052809291908181526020016000905b8282101561113457838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050815260200190600101906110e4565b50505050905090565b611145611be2565b60068054905060000361118d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611184906129f2565b60405180910390fd5b6000600660016006805490506111a391906123e1565b815481106111b4576111b3612415565b5b9060005260206000209060030201600101549050600454810361120c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120390612a5e565b60405180910390fd5b8160000361124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690612392565b60405180910390fd5b806001836004546112609190612444565b61126a91906123e1565b106112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a1906124c4565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc2a88c36040518163ffffffff1660e01b81526004016020604051808303816000875af115801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190612a93565b9050600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d8a4676f846040518263ffffffff1660e01b815260040161139f9190611e26565b600060405180830381865afa1580156113bc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113e59190612c3b565b9150915081611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090612ce3565b60405180910390fd5b60008160008151811061143f5761143e612415565b5b602002602001015160001b90506000600454905086600460008282546114659190612444565b9250508190555060006002905060008290505b6004548110156115ae57818280549050908060018154018082558091505060019003906000526020600020016000909190919091505560006001826114bd9190612444565b8560001c6114cb9190612799565b905060008382815481106114e2576114e1612415565b5b90600052602060002001549050836001858054905061150191906123e1565b8154811061151257611511612415565b5b90600052602060002001548483815481106115305761152f612415565b5b906000526020600020018190555080846001868054905061155191906123e1565b8154811061156257611561612415565b5b9060005260206000200181905550856040516020016115819190612d2e565b604051602081830303815290604052805190602001209550505080806115a6906124e4565b915050611478565b505050505050505050565b6115c28161177e565b50565b60036020528060005260406000206000915054906101000a900460ff1681565b60055481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002818154811061162157600080fd5b906000526020600020016000915090505481565b6006818154811061164557600080fd5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b611677611be2565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e0c862896040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156116e157600080fd5b505af11580156116f5573d6000803e3d6000fd5b50505050565b611703611be2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176990612dbb565b60405180910390fd5b61177b81611cb3565b50565b60006006600160068054905061179491906123e1565b815481106117a5576117a4612415565b5b906000526020600020906003020160010154905060045481146117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f490612e27565b60405180910390fd5b6005548111611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183890612e93565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900460ff161561186d5750611bdf565b600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b856040516024016118d09190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161193a919061259d565b6000604051808303816000865af19150503d8060008114611977576040519150601f19603f3d011682016040523d82523d6000602084013e61197c565b606091505b5091509150816119c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b890612eff565b60405180910390fd5b60006119cc82611c60565b90506119d6611d7f565b60005b600680549050811015611bd857600681815481106119fa576119f9612415565b5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050915060028781548110611a4757611a46612415565b5b9060005260206000200154826000015111158015611a865750816020015160028881548110611a7957611a78612415565b5b9060005260206000200154105b15611bc55760016003600089815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff168260400151604051611adf90612f45565b60006040518083038185875af1925050503d8060008114611b1c576040519150601f19603f3d011682016040523d82523d6000602084013e611b21565b606091505b50508095505084611b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5e90612fa6565b60405180910390fd5b868373ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a8460400151604051611bb29190611e26565b60405180910390a3505050505050611bdf565b8080611bd0906124e4565b9150506119d9565b5050505050505b50565b611bea611d77565b73ffffffffffffffffffffffffffffffffffffffff16611c08610947565b73ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590613012565b60405180910390fd5b565b6000601482511015611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e9061307e565b60405180910390fd5b60208201519050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60405180606001604052806000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611dc781611db4565b8114611dd257600080fd5b50565b600081359050611de481611dbe565b92915050565b600060208284031215611e0057611dff611daa565b5b6000611e0e84828501611dd5565b91505092915050565b611e2081611db4565b82525050565b6000602082019050611e3b6000830184611e17565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e6c82611e41565b9050919050565b611e7c81611e61565b82525050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611eb781611e82565b82525050565b6000604082019050611ed26000830185611e73565b611edf6020830184611eae565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611f1b81611db4565b82525050565b6000611f2d8383611f12565b60208301905092915050565b6000602082019050919050565b6000611f5182611ee6565b611f5b8185611ef1565b9350611f6683611f02565b8060005b83811015611f97578151611f7e8882611f21565b9750611f8983611f39565b925050600181019050611f6a565b5085935050505092915050565b60006020820190508181036000830152611fbe8184611f46565b905092915050565b611fcf81611e61565b8114611fda57600080fd5b50565b600081359050611fec81611fc6565b92915050565b60006020828403121561200857612007611daa565b5b600061201684828501611fdd565b91505092915050565b60006040820190506120346000830185611e17565b6120416020830184611e17565b9392505050565b600060208201905061205d6000830184611e73565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261208857612087612063565b5b8235905067ffffffffffffffff8111156120a5576120a4612068565b5b6020830191508360208202830111156120c1576120c061206d565b5b9250929050565b600080602083850312156120df576120de611daa565b5b600083013567ffffffffffffffff8111156120fd576120fc611daf565b5b61210985828601612072565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6060820160008201516121576000850182611f12565b50602082015161216a6020850182611f12565b50604082015161217d6040850182611f12565b50505050565b600061218f8383612141565b60608301905092915050565b6000602082019050919050565b60006121b382612115565b6121bd8185612120565b93506121c883612131565b8060005b838110156121f95781516121e08882612183565b97506121eb8361219b565b9250506001810190506121cc565b5085935050505092915050565b6000602082019050818103600083015261222081846121a8565b905092915050565b60008115159050919050565b61223d81612228565b82525050565b60006020820190506122586000830184612234565b92915050565b6000819050919050565b600061228361227e61227984611e41565b61225e565b611e41565b9050919050565b600061229582612268565b9050919050565b60006122a78261228a565b9050919050565b6122b78161229c565b82525050565b60006020820190506122d260008301846122ae565b92915050565b60006060820190506122ed6000830186611e17565b6122fa6020830185611e17565b6123076040830184611e17565b949350505050565b600082825260208201905092915050565b7f526166666c65506f6f6c3a20436f756e74206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b600061237c60288361230f565b915061238782612320565b604082019050919050565b600060208201905081810360008301526123ab8161236f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006123ec82611db4565b91506123f783611db4565b925082820390508181111561240f5761240e6123b2565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061244f82611db4565b915061245a83611db4565b9250828201905080821115612472576124716123b2565b5b92915050565b7f526166666c65506f6f6c3a204f7574206f6620696e6465780000000000000000600082015250565b60006124ae60188361230f565b91506124b982612478565b602082019050919050565b600060208201905081810360008301526124dd816124a1565b9050919050565b60006124ef82611db4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612521576125206123b2565b5b600182019050919050565b600081519050919050565b600081905092915050565b60005b83811015612560578082015181840152602081019050612545565b60008484015250505050565b60006125778261252c565b6125818185612537565b9350612591818560208601612542565b80840191505092915050565b60006125a9828461256c565b915081905092915050565b7f526166666c65506f6f6c3a2063616e6e6f74206765742075736572206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061261060238361230f565b915061261b826125b4565b604082019050919050565b6000602082019050818103600083015261263f81612603565b9050919050565b7f526166666c65506f6f6c3a205061796f75742073747275637475726520616c7260008201527f6561647920736574000000000000000000000000000000000000000000000000602082015250565b60006126a260288361230f565b91506126ad82612646565b604082019050919050565b600060208201905081810360008301526126d181612695565b9050919050565b7f526166666c65506f6f6c3a204c656e677468206f66207061796f75742073747260008201527f7563747572652063616e6e6f7420626520300000000000000000000000000000602082015250565b600061273460328361230f565b915061273f826126d8565b604082019050919050565b6000602082019050818103600083015261276381612727565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127a482611db4565b91506127af83611db4565b9250826127bf576127be61276a565b5b828206905092915050565b7f526166666c65506f6f6c3a206c656e677468202520332073686f756c6420626560008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b600061282660228361230f565b9150612831826127ca565b604082019050919050565b6000602082019050818103600083015261285581612819565b9050919050565b7f526166666c65506f6f6c3a205061796f757420737472756374757265206e6f7460008201527f20636f72726573706f6e64207769746820706f6f6c0000000000000000000000602082015250565b60006128b860358361230f565b91506128c38261285c565b604082019050919050565b600060208201905081810360008301526128e7816128ab565b9050919050565b7f526166666c65506f6f6c3a20496e76616c6964207061796f757420737472756360008201527f7475726500000000000000000000000000000000000000000000000000000000602082015250565b600061294a60248361230f565b9150612955826128ee565b604082019050919050565b600060208201905081810360008301526129798161293d565b9050919050565b7f526166666c65506f6f6c3a205061796f757420737472756374757265206e6f7460008201527f2073657400000000000000000000000000000000000000000000000000000000602082015250565b60006129dc60248361230f565b91506129e782612980565b604082019050919050565b60006020820190508181036000830152612a0b816129cf565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c726561647920726166666c6564600082015250565b6000612a4860208361230f565b9150612a5382612a12565b602082019050919050565b60006020820190508181036000830152612a7781612a3b565b9050919050565b600081519050612a8d81611dbe565b92915050565b600060208284031215612aa957612aa8611daa565b5b6000612ab784828501612a7e565b91505092915050565b612ac981612228565b8114612ad457600080fd5b50565b600081519050612ae681612ac0565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b3582612aec565b810181811067ffffffffffffffff82111715612b5457612b53612afd565b5b80604052505050565b6000612b67611da0565b9050612b738282612b2c565b919050565b600067ffffffffffffffff821115612b9357612b92612afd565b5b602082029050602081019050919050565b6000612bb7612bb284612b78565b612b5d565b90508083825260208201905060208402830185811115612bda57612bd961206d565b5b835b81811015612c035780612bef8882612a7e565b845260208401935050602081019050612bdc565b5050509392505050565b600082601f830112612c2257612c21612063565b5b8151612c32848260208601612ba4565b91505092915050565b60008060408385031215612c5257612c51611daa565b5b6000612c6085828601612ad7565b925050602083015167ffffffffffffffff811115612c8157612c80611daf565b5b612c8d85828601612c0d565b9150509250929050565b7f526166666c65506f6f6c3a207761697420666f722066756c66696c6c6d656e74600082015250565b6000612ccd60208361230f565b9150612cd882612c97565b602082019050919050565b60006020820190508181036000830152612cfc81612cc0565b9050919050565b6000819050919050565b6000819050919050565b612d28612d2382612d03565b612d0d565b82525050565b6000612d3a8284612d17565b60208201915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612da560268361230f565b9150612db082612d49565b604082019050919050565b60006020820190508181036000830152612dd481612d98565b9050919050565b7f526166666c65506f6f6c3a20526166666c65206e6f7420656e64656400000000600082015250565b6000612e11601c8361230f565b9150612e1c82612ddb565b602082019050919050565b60006020820190508181036000830152612e4081612e04565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c72656164792070616964000000600082015250565b6000612e7d601d8361230f565b9150612e8882612e47565b602082019050919050565b60006020820190508181036000830152612eac81612e70565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c2063616c6c206661696c656400000000600082015250565b6000612ee9601c8361230f565b9150612ef482612eb3565b602082019050919050565b60006020820190508181036000830152612f1881612edc565b9050919050565b50565b6000612f2f600083612537565b9150612f3a82612f1f565b600082019050919050565b6000612f5082612f22565b9150819050919050565b7f526166666c65506f6f6c3a207472616e73666572206661696c65640000000000600082015250565b6000612f90601b8361230f565b9150612f9b82612f5a565b602082019050919050565b60006020820190508181036000830152612fbf81612f83565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612ffc60208361230f565b915061300782612fc6565b602082019050919050565b6000602082019050818103600083015261302b81612fef565b9050919050565b7f526166666c65506f6f6c3a20496e76616c696420616464726573732064617461600082015250565b600061306860208361230f565b915061307382613032565b602082019050919050565b600060208201905081810360008301526130978161305b565b905091905056fea2646970667358221220cb03d8d41da183ed4875181f727dfe6f60d3bdb5ecd782fa1ec1c7798cfb3e7064736f6c634300081300330000000000000000000000009829d6ac67e49e0b95af2859fff15302151518150000000000000000000000000000000000000000000000000000000000000060000000000000000000000000be1513f5fd788092a8b4ca25a0a0042be183118e000000000000000000000000000000000000000000000000000000000000000e706f6f6c312875696e7432353629000000000000000000000000000000000000
Deployed ByteCode
0x6080604052600436106101185760003560e01c80639c2d2d8e116100a0578063d605787b11610064578063d605787b14610383578063e557bb4e146103ae578063f289eaa5146103eb578063f2c9ecd81461042a578063f2fde38b146104415761011f565b80639c2d2d8e1461029e578063a980e79f146102c9578063bc23f848146102f2578063c7634a791461031b578063cc5ee365146103585761011f565b806351cff8d9116100e757806351cff8d9146101cc5780636386c1c7146101f5578063715018a6146102335780638da5cb5b1461024a5780639494582d146102755761011f565b806308d62b03146101215780630cff68271461014a57806316f0115b146101755780633b0e84de146101a15761011f565b3661011f57005b005b34801561012d57600080fd5b5061014860048036038101906101439190611dea565b61046a565b005b34801561015657600080fd5b5061015f61057c565b60405161016c9190611e26565b60405180910390f35b34801561018157600080fd5b5061018a610582565b604051610198929190611ebd565b60405180910390f35b3480156101ad57600080fd5b506101b66105c1565b6040516101c39190611fa4565b60405180910390f35b3480156101d857600080fd5b506101f360048036038101906101ee9190611ff2565b610619565b005b34801561020157600080fd5b5061021c60048036038101906102179190611ff2565b61066b565b60405161022a92919061201f565b60405180910390f35b34801561023f57600080fd5b50610248610933565b005b34801561025657600080fd5b5061025f610947565b60405161026c9190612048565b60405180910390f35b34801561028157600080fd5b5061029c600480360381019061029791906120c8565b610970565b005b3480156102aa57600080fd5b506102b36110c0565b6040516102c09190612206565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190611dea565b61113d565b005b3480156102fe57600080fd5b5061031960048036038101906103149190611dea565b6115b9565b005b34801561032757600080fd5b50610342600480360381019061033d9190611dea565b6115c5565b60405161034f9190612243565b60405180910390f35b34801561036457600080fd5b5061036d6115e5565b60405161037a9190611e26565b60405180910390f35b34801561038f57600080fd5b506103986115eb565b6040516103a591906122bd565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190611dea565b611611565b6040516103e29190611e26565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d9190611dea565b611635565b604051610421939291906122d8565b60405180910390f35b34801561043657600080fd5b5061043f61166f565b005b34801561044d57600080fd5b5061046860048036038101906104639190611ff2565b6116fb565b005b806000036104ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a490612392565b60405180910390fd5b6000600660016006805490506104c391906123e1565b815481106104d4576104d3612415565b5b906000526020600020906003020160010154905080826005546104f79190612444565b1115610538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052f906124c4565b60405180910390fd5b60005b828110156105775761054e60055461177e565b60056000815461055d906124e4565b91905081905550808061056f906124e4565b91505061053b565b505050565b60045481565b60018060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460e01b905082565b6060600280548060200260200160405190810160405280929190818152602001828054801561060f57602002820191906000526020600020905b8154815260200190600101908083116105fb575b5050505050905090565b610621611be2565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610667573d6000803e3d6000fd5b5050565b60008060005b60028054905081101561092c57600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b846040516024016106e19190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161074b919061259d565b600060405180830381855afa9150503d8060008114610786576040519150601f19603f3d011682016040523d82523d6000602084013e61078b565b606091505b5091509150816107d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c790612626565b60405180910390fd5b60006107db82611c60565b90508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff160361091657610818611d7f565b60005b600680549050811015610913576006818154811061083c5761083b612415565b5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505091506002868154811061088957610888612415565b5b90600052602060002001548260000151111580156108c85750600286815481106108b6576108b5612415565b5b90600052602060002001548260200151115b1561090057600286815481106108e1576108e0612415565b5b906000526020600020015482604001519750975050505050505061092e565b808061090b906124e4565b91505061081b565b50505b5050508080610924906124e4565b915050610671565b505b915091565b61093b611be2565b6109456000611cb3565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610978611be2565b6006805490506000146109c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b7906126b8565b60405180910390fd5b81819050600003610a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fd9061274a565b60405180910390fd5b600382829050610a169190612799565b600014610a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4f9061283c565b60405180910390fd5b60008282600285859050610a6c91906123e1565b818110610a7c57610a7b612415565b5b9050602002013590506000600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b600184610ae391906123e1565b604051602401610af39190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610b5d919061259d565b600060405180830381855afa9150503d8060008114610b98576040519150601f19603f3d011682016040523d82523d6000602084013e610b9d565b606091505b5050905080610be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd8906128ce565b60405180910390fd5b600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b83604051602401610c419190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610cab919061259d565b600060405180830381855afa9150503d8060008114610ce6576040519150601f19603f3d011682016040523d82523d6000602084013e610ceb565b606091505b5050809150508015610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d29906128ce565b60405180910390fd5b83836000818110610d4657610d45612415565b5b90506020020135600014610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8690612960565b60405180910390fd5b83836001818110610da357610da2612415565b5b9050602002013584846000818110610dbe57610dbd612415565b5b9050602002013510610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc90612960565b60405180910390fd5b6006604051806060016040528086866000818110610e2657610e25612415565b5b90506020020135815260200186866001818110610e4657610e45612415565b5b90506020020135815260200186866002818110610e6657610e65612415565b5b90506020020135815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506000600390505b848490508110156110b95760066001600680549050610edf91906123e1565b81548110610ef057610eef612415565b5b906000526020600020906003020160010154858583818110610f1557610f14612415565b5b9050602002013514610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390612960565b60405180910390fd5b8484600183610f6b9190612444565b818110610f7b57610f7a612415565b5b90506020020135858583818110610f9557610f94612415565b5b9050602002013510610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd390612960565b60405180910390fd5b60066040518060600160405280878785818110610ffc57610ffb612415565b5b90506020020135815260200187876001866110179190612444565b81811061102757611026612415565b5b90506020020135815260200187876002866110429190612444565b81811061105257611051612415565b5b90506020020135815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506003816110b29190612444565b9050610ec0565b5050505050565b60606006805480602002602001604051908101604052809291908181526020016000905b8282101561113457838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050815260200190600101906110e4565b50505050905090565b611145611be2565b60068054905060000361118d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611184906129f2565b60405180910390fd5b6000600660016006805490506111a391906123e1565b815481106111b4576111b3612415565b5b9060005260206000209060030201600101549050600454810361120c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120390612a5e565b60405180910390fd5b8160000361124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690612392565b60405180910390fd5b806001836004546112609190612444565b61126a91906123e1565b106112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a1906124c4565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc2a88c36040518163ffffffff1660e01b81526004016020604051808303816000875af115801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190612a93565b9050600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d8a4676f846040518263ffffffff1660e01b815260040161139f9190611e26565b600060405180830381865afa1580156113bc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113e59190612c3b565b9150915081611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090612ce3565b60405180910390fd5b60008160008151811061143f5761143e612415565b5b602002602001015160001b90506000600454905086600460008282546114659190612444565b9250508190555060006002905060008290505b6004548110156115ae57818280549050908060018154018082558091505060019003906000526020600020016000909190919091505560006001826114bd9190612444565b8560001c6114cb9190612799565b905060008382815481106114e2576114e1612415565b5b90600052602060002001549050836001858054905061150191906123e1565b8154811061151257611511612415565b5b90600052602060002001548483815481106115305761152f612415565b5b906000526020600020018190555080846001868054905061155191906123e1565b8154811061156257611561612415565b5b9060005260206000200181905550856040516020016115819190612d2e565b604051602081830303815290604052805190602001209550505080806115a6906124e4565b915050611478565b505050505050505050565b6115c28161177e565b50565b60036020528060005260406000206000915054906101000a900460ff1681565b60055481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002818154811061162157600080fd5b906000526020600020016000915090505481565b6006818154811061164557600080fd5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b611677611be2565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e0c862896040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156116e157600080fd5b505af11580156116f5573d6000803e3d6000fd5b50505050565b611703611be2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176990612dbb565b60405180910390fd5b61177b81611cb3565b50565b60006006600160068054905061179491906123e1565b815481106117a5576117a4612415565b5b906000526020600020906003020160010154905060045481146117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f490612e27565b60405180910390fd5b6005548111611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183890612e93565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900460ff161561186d5750611bdf565b600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b856040516024016118d09190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161193a919061259d565b6000604051808303816000865af19150503d8060008114611977576040519150601f19603f3d011682016040523d82523d6000602084013e61197c565b606091505b5091509150816119c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b890612eff565b60405180910390fd5b60006119cc82611c60565b90506119d6611d7f565b60005b600680549050811015611bd857600681815481106119fa576119f9612415565b5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050915060028781548110611a4757611a46612415565b5b9060005260206000200154826000015111158015611a865750816020015160028881548110611a7957611a78612415565b5b9060005260206000200154105b15611bc55760016003600089815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff168260400151604051611adf90612f45565b60006040518083038185875af1925050503d8060008114611b1c576040519150601f19603f3d011682016040523d82523d6000602084013e611b21565b606091505b50508095505084611b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5e90612fa6565b60405180910390fd5b868373ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a8460400151604051611bb29190611e26565b60405180910390a3505050505050611bdf565b8080611bd0906124e4565b9150506119d9565b5050505050505b50565b611bea611d77565b73ffffffffffffffffffffffffffffffffffffffff16611c08610947565b73ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590613012565b60405180910390fd5b565b6000601482511015611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e9061307e565b60405180910390fd5b60208201519050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60405180606001604052806000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611dc781611db4565b8114611dd257600080fd5b50565b600081359050611de481611dbe565b92915050565b600060208284031215611e0057611dff611daa565b5b6000611e0e84828501611dd5565b91505092915050565b611e2081611db4565b82525050565b6000602082019050611e3b6000830184611e17565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e6c82611e41565b9050919050565b611e7c81611e61565b82525050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611eb781611e82565b82525050565b6000604082019050611ed26000830185611e73565b611edf6020830184611eae565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611f1b81611db4565b82525050565b6000611f2d8383611f12565b60208301905092915050565b6000602082019050919050565b6000611f5182611ee6565b611f5b8185611ef1565b9350611f6683611f02565b8060005b83811015611f97578151611f7e8882611f21565b9750611f8983611f39565b925050600181019050611f6a565b5085935050505092915050565b60006020820190508181036000830152611fbe8184611f46565b905092915050565b611fcf81611e61565b8114611fda57600080fd5b50565b600081359050611fec81611fc6565b92915050565b60006020828403121561200857612007611daa565b5b600061201684828501611fdd565b91505092915050565b60006040820190506120346000830185611e17565b6120416020830184611e17565b9392505050565b600060208201905061205d6000830184611e73565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261208857612087612063565b5b8235905067ffffffffffffffff8111156120a5576120a4612068565b5b6020830191508360208202830111156120c1576120c061206d565b5b9250929050565b600080602083850312156120df576120de611daa565b5b600083013567ffffffffffffffff8111156120fd576120fc611daf565b5b61210985828601612072565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6060820160008201516121576000850182611f12565b50602082015161216a6020850182611f12565b50604082015161217d6040850182611f12565b50505050565b600061218f8383612141565b60608301905092915050565b6000602082019050919050565b60006121b382612115565b6121bd8185612120565b93506121c883612131565b8060005b838110156121f95781516121e08882612183565b97506121eb8361219b565b9250506001810190506121cc565b5085935050505092915050565b6000602082019050818103600083015261222081846121a8565b905092915050565b60008115159050919050565b61223d81612228565b82525050565b60006020820190506122586000830184612234565b92915050565b6000819050919050565b600061228361227e61227984611e41565b61225e565b611e41565b9050919050565b600061229582612268565b9050919050565b60006122a78261228a565b9050919050565b6122b78161229c565b82525050565b60006020820190506122d260008301846122ae565b92915050565b60006060820190506122ed6000830186611e17565b6122fa6020830185611e17565b6123076040830184611e17565b949350505050565b600082825260208201905092915050565b7f526166666c65506f6f6c3a20436f756e74206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b600061237c60288361230f565b915061238782612320565b604082019050919050565b600060208201905081810360008301526123ab8161236f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006123ec82611db4565b91506123f783611db4565b925082820390508181111561240f5761240e6123b2565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061244f82611db4565b915061245a83611db4565b9250828201905080821115612472576124716123b2565b5b92915050565b7f526166666c65506f6f6c3a204f7574206f6620696e6465780000000000000000600082015250565b60006124ae60188361230f565b91506124b982612478565b602082019050919050565b600060208201905081810360008301526124dd816124a1565b9050919050565b60006124ef82611db4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612521576125206123b2565b5b600182019050919050565b600081519050919050565b600081905092915050565b60005b83811015612560578082015181840152602081019050612545565b60008484015250505050565b60006125778261252c565b6125818185612537565b9350612591818560208601612542565b80840191505092915050565b60006125a9828461256c565b915081905092915050565b7f526166666c65506f6f6c3a2063616e6e6f74206765742075736572206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061261060238361230f565b915061261b826125b4565b604082019050919050565b6000602082019050818103600083015261263f81612603565b9050919050565b7f526166666c65506f6f6c3a205061796f75742073747275637475726520616c7260008201527f6561647920736574000000000000000000000000000000000000000000000000602082015250565b60006126a260288361230f565b91506126ad82612646565b604082019050919050565b600060208201905081810360008301526126d181612695565b9050919050565b7f526166666c65506f6f6c3a204c656e677468206f66207061796f75742073747260008201527f7563747572652063616e6e6f7420626520300000000000000000000000000000602082015250565b600061273460328361230f565b915061273f826126d8565b604082019050919050565b6000602082019050818103600083015261276381612727565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127a482611db4565b91506127af83611db4565b9250826127bf576127be61276a565b5b828206905092915050565b7f526166666c65506f6f6c3a206c656e677468202520332073686f756c6420626560008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b600061282660228361230f565b9150612831826127ca565b604082019050919050565b6000602082019050818103600083015261285581612819565b9050919050565b7f526166666c65506f6f6c3a205061796f757420737472756374757265206e6f7460008201527f20636f72726573706f6e64207769746820706f6f6c0000000000000000000000602082015250565b60006128b860358361230f565b91506128c38261285c565b604082019050919050565b600060208201905081810360008301526128e7816128ab565b9050919050565b7f526166666c65506f6f6c3a20496e76616c6964207061796f757420737472756360008201527f7475726500000000000000000000000000000000000000000000000000000000602082015250565b600061294a60248361230f565b9150612955826128ee565b604082019050919050565b600060208201905081810360008301526129798161293d565b9050919050565b7f526166666c65506f6f6c3a205061796f757420737472756374757265206e6f7460008201527f2073657400000000000000000000000000000000000000000000000000000000602082015250565b60006129dc60248361230f565b91506129e782612980565b604082019050919050565b60006020820190508181036000830152612a0b816129cf565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c726561647920726166666c6564600082015250565b6000612a4860208361230f565b9150612a5382612a12565b602082019050919050565b60006020820190508181036000830152612a7781612a3b565b9050919050565b600081519050612a8d81611dbe565b92915050565b600060208284031215612aa957612aa8611daa565b5b6000612ab784828501612a7e565b91505092915050565b612ac981612228565b8114612ad457600080fd5b50565b600081519050612ae681612ac0565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b3582612aec565b810181811067ffffffffffffffff82111715612b5457612b53612afd565b5b80604052505050565b6000612b67611da0565b9050612b738282612b2c565b919050565b600067ffffffffffffffff821115612b9357612b92612afd565b5b602082029050602081019050919050565b6000612bb7612bb284612b78565b612b5d565b90508083825260208201905060208402830185811115612bda57612bd961206d565b5b835b81811015612c035780612bef8882612a7e565b845260208401935050602081019050612bdc565b5050509392505050565b600082601f830112612c2257612c21612063565b5b8151612c32848260208601612ba4565b91505092915050565b60008060408385031215612c5257612c51611daa565b5b6000612c6085828601612ad7565b925050602083015167ffffffffffffffff811115612c8157612c80611daf565b5b612c8d85828601612c0d565b9150509250929050565b7f526166666c65506f6f6c3a207761697420666f722066756c66696c6c6d656e74600082015250565b6000612ccd60208361230f565b9150612cd882612c97565b602082019050919050565b60006020820190508181036000830152612cfc81612cc0565b9050919050565b6000819050919050565b6000819050919050565b612d28612d2382612d03565b612d0d565b82525050565b6000612d3a8284612d17565b60208201915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612da560268361230f565b9150612db082612d49565b604082019050919050565b60006020820190508181036000830152612dd481612d98565b9050919050565b7f526166666c65506f6f6c3a20526166666c65206e6f7420656e64656400000000600082015250565b6000612e11601c8361230f565b9150612e1c82612ddb565b602082019050919050565b60006020820190508181036000830152612e4081612e04565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c72656164792070616964000000600082015250565b6000612e7d601d8361230f565b9150612e8882612e47565b602082019050919050565b60006020820190508181036000830152612eac81612e70565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c2063616c6c206661696c656400000000600082015250565b6000612ee9601c8361230f565b9150612ef482612eb3565b602082019050919050565b60006020820190508181036000830152612f1881612edc565b9050919050565b50565b6000612f2f600083612537565b9150612f3a82612f1f565b600082019050919050565b6000612f5082612f22565b9150819050919050565b7f526166666c65506f6f6c3a207472616e73666572206661696c65640000000000600082015250565b6000612f90601b8361230f565b9150612f9b82612f5a565b602082019050919050565b60006020820190508181036000830152612fbf81612f83565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612ffc60208361230f565b915061300782612fc6565b602082019050919050565b6000602082019050818103600083015261302b81612fef565b9050919050565b7f526166666c65506f6f6c3a20496e76616c696420616464726573732064617461600082015250565b600061306860208361230f565b915061307382613032565b602082019050919050565b600060208201905081810360008301526130978161305b565b905091905056fea2646970667358221220cb03d8d41da183ed4875181f727dfe6f60d3bdb5ecd782fa1ec1c7798cfb3e7064736f6c63430008130033