Source Code
Latest 25 from a total of 132 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Join | 14793946 | 1380 days ago | IN | 0.03 ETH | 0.00208849 | ||||
| Join | 14793936 | 1380 days ago | IN | 0.03 ETH | 0.00233873 | ||||
| List | 14793897 | 1380 days ago | IN | 0 ETH | 0.01510798 | ||||
| Claim | 14502071 | 1425 days ago | IN | 0 ETH | 0.00475594 | ||||
| Cancel | 14209874 | 1471 days ago | IN | 0 ETH | 0.00632907 | ||||
| Relist Payout An... | 14002970 | 1503 days ago | IN | 0 ETH | 0.07093262 | ||||
| Accept | 13993550 | 1504 days ago | IN | 0 ETH | 0.01696164 | ||||
| Relist Payout An... | 13759620 | 1541 days ago | IN | 0 ETH | 0.05881925 | ||||
| Leave | 13715733 | 1548 days ago | IN | 0 ETH | 0.00972357 | ||||
| Claim | 13692184 | 1551 days ago | IN | 0 ETH | 0.01021981 | ||||
| Claim | 13691392 | 1551 days ago | IN | 0 ETH | 0.0069316 | ||||
| Relist Payout An... | 13676821 | 1554 days ago | IN | 0 ETH | 0.0048953 | ||||
| Relist | 13664609 | 1556 days ago | IN | 0 ETH | 0.0717589 | ||||
| Join | 13651834 | 1558 days ago | IN | 0.08 ETH | 0.00631333 | ||||
| Join | 13646833 | 1559 days ago | IN | 0.05 ETH | 0.00791597 | ||||
| Join | 13646567 | 1559 days ago | IN | 0.038 ETH | 0.00761697 | ||||
| Join | 13642231 | 1559 days ago | IN | 0.035 ETH | 0.01002037 | ||||
| Join | 13642040 | 1559 days ago | IN | 0.035 ETH | 0.00921149 | ||||
| Join | 13642000 | 1559 days ago | IN | 0.02 ETH | 0.0096227 | ||||
| List | 13641848 | 1559 days ago | IN | 0 ETH | 0.0873364 | ||||
| Claim | 13613488 | 1564 days ago | IN | 0 ETH | 0.00811149 | ||||
| Claim | 13595646 | 1567 days ago | IN | 0 ETH | 0.01132971 | ||||
| Leave | 13576416 | 1570 days ago | IN | 0 ETH | 0.00404297 | ||||
| Claim | 13576404 | 1570 days ago | IN | 0 ETH | 0.00722376 | ||||
| Claim | 13575983 | 1570 days ago | IN | 0 ETH | 0.00722376 |
Latest 15 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 14002970 | 1503 days ago | 2.8215 ETH | ||||
| - | 14002970 | 1503 days ago | 0.1485 ETH | ||||
| - | 13715733 | 1548 days ago | 0.5 ETH | ||||
| - | 13676821 | 1554 days ago | 0.2451 ETH | ||||
| - | 13676821 | 1554 days ago | 0.0129 ETH | ||||
| - | 13576416 | 1570 days ago | 0.5 ETH | ||||
| - | 13566721 | 1571 days ago | 2.19469 ETH | ||||
| - | 13566721 | 1571 days ago | 0.11551 ETH | ||||
| - | 13564254 | 1572 days ago | 0.5 ETH | ||||
| - | 13477744 | 1585 days ago | 0.038 ETH | ||||
| - | 13477744 | 1585 days ago | 0.002 ETH | ||||
| - | 13468520 | 1587 days ago | 1.045 ETH | ||||
| - | 13468520 | 1587 days ago | 0.055 ETH | ||||
| - | 13464939 | 1587 days ago | 0.5 ETH | ||||
| - | 13456617 | 1588 days ago | 0.2 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CollectivePurchase
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-10-09
*/
// SPDX-License-Identifier: GPL-3.0-only
// File: @openzeppelin/contracts/GSN/Context.sol
pragma solidity >=0.6.0 <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 GSN 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 payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @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 () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = 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");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @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) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @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 sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @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) {
// 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 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts 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) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts 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 mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
// File: @openzeppelin/contracts/token/ERC721/ERC721Holder.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Implementation of the {IERC721Receiver} interface.
*
* Accepts all token transfers.
* Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
*/
contract ERC721Holder is IERC721Receiver {
/**
* @dev See {IERC721Receiver-onERC721Received}.
*
* Always returns `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) {
return this.onERC721Received.selector;
}
}
// File: @openzeppelin/contracts/introspection/IERC165.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol
pragma solidity >=0.6.0 <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 () internal {
_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 make 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;
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: contracts/v1.5/SafeERC721.sol
pragma solidity ^0.6.0;
library SafeERC721
{
function safeName(IERC721Metadata _metadata) internal view returns (string memory _name)
{
try _metadata.name() returns (string memory _n) { return _n; } catch {}
}
function safeSymbol(IERC721Metadata _metadata) internal view returns (string memory _symbol)
{
try _metadata.symbol() returns (string memory _s) { return _s; } catch {}
}
function safeTokenURI(IERC721Metadata _metadata, uint256 _tokenId) internal view returns (string memory _tokenURI)
{
try _metadata.tokenURI(_tokenId) returns (string memory _t) { return _t; } catch {}
}
function safeTransfer(IERC721 _token, address _to, uint256 _tokenId) internal
{
address _from = address(this);
try _token.transferFrom(_from, _to, _tokenId) { return; } catch {}
// attempts to handle non-conforming ERC721 contracts
_token.approve(_from, _tokenId);
_token.transferFrom(_from, _to, _tokenId);
}
}
// File: contracts/v1.5/CollectivePurchase.sol
pragma solidity ^0.6.0;
interface IAuctionFractionalizer
{
function fractionalize(address _target, uint256 _tokenId, string memory _name, string memory _symbol, uint8 _decimals, uint256 _fractionsCount, uint256 _fractionPrice, address _paymentToken, uint256 _kickoff, uint256 _duration, uint256 _fee) external returns (address _fractions);
}
contract CollectivePurchase is ERC721Holder, Ownable, ReentrancyGuard
{
using SafeERC20 for IERC20;
using SafeERC721 for IERC721;
using SafeMath for uint256;
enum State { Created, Funded, Started, Ended }
struct BuyerInfo {
uint256 amount;
}
struct ListingInfo {
State state;
address payable seller;
address collection;
uint256 tokenId;
address paymentToken;
uint256 reservePrice;
uint256 limitPrice;
uint256 extension;
uint256 priceMultiplier;
bytes extra;
uint256 amount;
uint256 cutoff;
uint256 fractionsCount;
address fractions;
mapping (address => BuyerInfo) buyers;
}
uint8 constant public FRACTIONS_DECIMALS = 6;
uint256 constant public FRACTIONS_COUNT = 100000e6;
uint256 public immutable fee;
address payable public immutable vault;
mapping (bytes32 => address) public fractionalizers;
mapping (address => uint256) private balances;
mapping (address => mapping (uint256 => bool)) private items;
ListingInfo[] public listings;
modifier onlySeller(uint256 _listingId)
{
ListingInfo storage _listing = listings[_listingId];
require(msg.sender == _listing.seller, "access denied");
_;
}
modifier inState(uint256 _listingId, State _state)
{
ListingInfo storage _listing = listings[_listingId];
require(_state == _listing.state, "not available");
_;
}
modifier notInState(uint256 _listingId, State _state)
{
ListingInfo storage _listing = listings[_listingId];
require(_state != _listing.state, "not available");
_;
}
constructor (uint256 _fee, address payable _vault) public
{
require(_fee <= 1e18, "invalid fee");
require(_vault != address(0), "invalid address");
fee = _fee;
vault = _vault;
}
function listingCount() external view returns (uint256 _count)
{
return listings.length;
}
function buyers(uint256 _listingId, address _buyer) external view returns (uint256 _amount)
{
ListingInfo storage _listing = listings[_listingId];
BuyerInfo storage _info = _listing.buyers[_buyer];
return _info.amount;
}
function status(uint256 _listingId) external view returns (string memory _status)
{
ListingInfo storage _listing = listings[_listingId];
if (_listing.state == State.Created) return "CREATED";
if (_listing.state == State.Funded) return "FUNDED";
if (_listing.state == State.Started) return now <= _listing.cutoff ? "STARTED" : "ENDING";
return "ENDED";
}
function maxJoinAmount(uint256 _listingId) external view returns (uint256 _amount)
{
ListingInfo storage _listing = listings[_listingId];
return _listing.limitPrice - _listing.amount;
}
function buyerFractionsCount(uint256 _listingId, address _buyer) external view inState(_listingId, State.Ended) returns (uint256 _fractionsCount)
{
ListingInfo storage _listing = listings[_listingId];
uint256 _amount = _listing.buyers[_buyer].amount;
_fractionsCount = (_amount * _listing.fractionsCount) / _listing.reservePrice;
return _fractionsCount;
}
function sellerPayout(uint256 _listingId) external view returns (uint256 _netAmount, uint256 _feeAmount, uint256 _netFractionsCount, uint256 _feeFractionsCount)
{
ListingInfo storage _listing = listings[_listingId];
uint256 _reservePrice = _listing.reservePrice;
uint256 _amount = _listing.amount;
_feeAmount = (_amount * fee) / 1e18;
_netAmount = _amount - _feeAmount;
_feeFractionsCount = 0;
_netFractionsCount = 0;
if (_reservePrice > _amount) {
uint256 _missingAmount = _reservePrice - _amount;
uint256 _missingFeeAmount = (_missingAmount * fee) / 1e18;
uint256 _missingNetAmount = _missingAmount - _missingFeeAmount;
uint256 _fractionsCount = _issuing(_listing.extra);
_feeFractionsCount = _fractionsCount * _missingFeeAmount / _reservePrice;
_netFractionsCount = _fractionsCount * _missingNetAmount / _reservePrice;
}
}
function addFractionalizer(bytes32 _type, address _fractionalizer) external onlyOwner
{
require(fractionalizers[_type] == address(0), "already defined");
fractionalizers[_type] = _fractionalizer;
emit AddFractionalizer(_type, _fractionalizer);
}
function list(address _collection, uint256 _tokenId, address _paymentToken, uint256 _reservePrice, uint256 _limitPrice, uint256 _extension, uint256 _priceMultiplier, bytes calldata _extra) external nonReentrant returns (uint256 _listingId)
{
address payable _seller = msg.sender;
require(_limitPrice * 1e18 / _limitPrice == 1e18, "price overflow");
require(0 < _reservePrice && _reservePrice <= _limitPrice, "invalid price");
require(30 minutes <= _extension && _extension <= 731 days, "invalid duration");
require(0 < _priceMultiplier && _priceMultiplier <= 10000, "invalid multiplier"); // from 1% up to 100x
_validate(_extra);
IERC721(_collection).transferFrom(_seller, address(this), _tokenId);
items[_collection][_tokenId] = true;
_listingId = listings.length;
listings.push(ListingInfo({
state: State.Created,
seller: _seller,
collection: _collection,
tokenId: _tokenId,
paymentToken: _paymentToken,
reservePrice: _reservePrice,
limitPrice: _limitPrice,
extension: _extension,
priceMultiplier: _priceMultiplier,
extra: _extra,
amount: 0,
cutoff: uint256(-1),
fractionsCount: 0,
fractions: address(0)
}));
emit Listed(_listingId);
return _listingId;
}
function cancel(uint256 _listingId) external nonReentrant onlySeller(_listingId) inState(_listingId, State.Created)
{
ListingInfo storage _listing = listings[_listingId];
_listing.state = State.Ended;
items[_listing.collection][_listing.tokenId] = false;
IERC721(_listing.collection).safeTransfer(_listing.seller, _listing.tokenId);
emit Canceled(_listingId);
}
function updatePrice(uint256 _listingId, uint256 _newReservePrice, uint256 _newLimitPrice) external onlySeller(_listingId) inState(_listingId, State.Created)
{
require(_newLimitPrice * 1e18 / _newLimitPrice == 1e18, "price overflow");
require(0 < _newReservePrice && _newReservePrice <= _newLimitPrice, "invalid price");
ListingInfo storage _listing = listings[_listingId];
uint256 _oldReservePrice = _listing.reservePrice;
uint256 _oldLimitPrice = _listing.limitPrice;
_listing.reservePrice = _newReservePrice;
_listing.limitPrice = _newLimitPrice;
emit UpdatePrice(_listingId, _oldReservePrice, _oldLimitPrice, _newReservePrice, _newLimitPrice);
}
function accept(uint256 _listingId) external onlySeller(_listingId) inState(_listingId, State.Funded)
{
ListingInfo storage _listing = listings[_listingId];
uint256 _amount = _listing.reservePrice - _listing.amount;
uint256 _feeAmount = (_amount * fee) / 1e18;
uint256 _netAmount = _amount - _feeAmount;
_listing.state = State.Started;
_listing.cutoff = now - 1;
_listing.buyers[vault].amount += _feeAmount;
_listing.buyers[_listing.seller].amount += _netAmount;
emit Sold(_listingId);
}
function join(uint256 _listingId, uint256 _amount) external payable nonReentrant notInState(_listingId, State.Ended)
{
address payable _buyer = msg.sender;
uint256 _value = msg.value;
ListingInfo storage _listing = listings[_listingId];
require(now <= _listing.cutoff, "not available");
uint256 _leftAmount = _listing.limitPrice - _listing.amount;
require(_amount <= _leftAmount, "limit exceeded");
_safeTransferFrom(_listing.paymentToken, _buyer, _value, payable(address(this)), _amount);
balances[_listing.paymentToken] += _amount;
_listing.amount += _amount;
_listing.buyers[_buyer].amount += _amount;
if (_listing.state == State.Created) _listing.state = State.Funded;
if (_listing.state == State.Funded) {
if (_listing.amount >= _listing.reservePrice) {
_listing.state = State.Started;
_listing.cutoff = now + _listing.extension;
emit Sold(_listingId);
}
}
if (_listing.state == State.Started) _listing.reservePrice = _listing.amount;
emit Join(_listingId, _buyer, _amount);
}
function leave(uint256 _listingId) external nonReentrant inState(_listingId, State.Funded)
{
address payable _buyer = msg.sender;
ListingInfo storage _listing = listings[_listingId];
uint256 _amount = _listing.buyers[_buyer].amount;
require(_amount > 0, "insufficient balance");
_listing.buyers[_buyer].amount = 0;
_listing.amount -= _amount;
balances[_listing.paymentToken] -= _amount;
if (_listing.amount == 0) _listing.state = State.Created;
_safeTransfer(_listing.paymentToken, _buyer, _amount);
emit Leave(_listingId, _buyer, _amount);
}
function relist(uint256 _listingId) public nonReentrant inState(_listingId, State.Started)
{
ListingInfo storage _listing = listings[_listingId];
require(now > _listing.cutoff, "not available");
uint256 _fractionPrice = (_listing.reservePrice + (FRACTIONS_COUNT - 1)) / FRACTIONS_COUNT;
uint256 _relistFractionPrice = (_listing.priceMultiplier * _fractionPrice + 99) / 100;
_listing.state = State.Ended;
_listing.fractions = _fractionalize(_listingId, _relistFractionPrice);
_listing.fractionsCount = _balanceOf(_listing.fractions);
items[_listing.collection][_listing.tokenId] = false;
balances[_listing.fractions] = _listing.fractionsCount;
emit Relisted(_listingId);
}
function payout(uint256 _listingId) public nonReentrant inState(_listingId, State.Ended)
{
ListingInfo storage _listing = listings[_listingId];
uint256 _amount = _listing.amount;
require(_amount > 0, "insufficient balance");
uint256 _feeAmount = (_amount * fee) / 1e18;
uint256 _netAmount = _amount - _feeAmount;
_listing.amount = 0;
balances[_listing.paymentToken] -= _amount;
_safeTransfer(_listing.paymentToken, vault, _feeAmount);
_safeTransfer(_listing.paymentToken, _listing.seller, _netAmount);
emit Payout(_listingId, _listing.seller, _netAmount, _feeAmount);
}
function claim(uint256 _listingId, address payable _buyer) public nonReentrant inState(_listingId, State.Ended)
{
ListingInfo storage _listing = listings[_listingId];
uint256 _amount = _listing.buyers[_buyer].amount;
require(_amount > 0, "insufficient balance");
uint256 _fractionsCount = (_amount * _listing.fractionsCount) / _listing.reservePrice;
_listing.buyers[_buyer].amount = 0;
balances[_listing.fractions] -= _fractionsCount;
_safeTransfer(_listing.fractions, _buyer, _fractionsCount);
emit Claim(_listingId, _buyer, _amount, _fractionsCount);
}
function relistPayoutAndClaim(uint256 _listingId, address payable[] calldata _buyers) external
{
ListingInfo storage _listing = listings[_listingId];
if (_listing.state != State.Ended) {
relist(_listingId);
}
if (_listing.amount > 0) {
payout(_listingId);
}
if (_listing.buyers[vault].amount > 0) {
claim(_listingId, vault);
}
if (_listing.buyers[_listing.seller].amount > 0) {
claim(_listingId, _listing.seller);
}
for (uint256 _i = 0; _i < _buyers.length; _i++) {
address payable _buyer = _buyers[_i];
if (_listing.buyers[_buyer].amount > 0) {
claim(_listingId, _buyer);
}
}
}
function recoverLostFunds(address _token, address payable _to) external onlyOwner nonReentrant
{
uint256 _balance = balances[_token];
uint256 _current = _balanceOf(_token);
if (_current > _balance) {
uint256 _excess = _current - _balance;
_safeTransfer(_token, _to, _excess);
}
}
function recoverLostItem(address _collection, uint256 _tokenId, address _to) external onlyOwner nonReentrant
{
if (items[_collection][_tokenId]) return;
IERC721(_collection).safeTransfer(_to, _tokenId);
}
function _validate(bytes calldata _extra) internal view
{
(bytes32 _type,,, uint256 _duration, uint256 _fee) = abi.decode(_extra, (bytes32, string, string, uint256, uint256));
require(fractionalizers[_type] != address(0), "unsupported type");
require(30 minutes <= _duration && _duration <= 731 days, "invalid duration");
require(_fee <= 1e18, "invalid fee");
}
function _issuing(bytes storage _extra) internal pure returns (uint256 _fractionsCount)
{
(,,,, uint256 _fee) = abi.decode(_extra, (bytes32, string, string, uint256, uint256));
return FRACTIONS_COUNT - (FRACTIONS_COUNT * _fee / 1e18);
}
function _fractionalize(uint256 _listingId, uint256 _fractionPrice) internal returns (address _fractions)
{
ListingInfo storage _listing = listings[_listingId];
(bytes32 _type, string memory _name, string memory _symbol, uint256 _duration, uint256 _fee) = abi.decode(_listing.extra, (bytes32, string, string, uint256, uint256));
IERC721(_listing.collection).approve(fractionalizers[_type], _listing.tokenId);
return IAuctionFractionalizer(fractionalizers[_type]).fractionalize(_listing.collection, _listing.tokenId, _name, _symbol, FRACTIONS_DECIMALS, FRACTIONS_COUNT, _fractionPrice, _listing.paymentToken, 0, _duration, _fee);
}
function _balanceOf(address _token) internal view returns (uint256 _balance)
{
if (_token == address(0)) {
return address(this).balance;
} else {
return IERC20(_token).balanceOf(address(this));
}
}
function _safeTransfer(address _token, address payable _to, uint256 _amount) internal
{
if (_token == address(0)) {
_to.transfer(_amount);
} else {
IERC20(_token).safeTransfer(_to, _amount);
}
}
function _safeTransferFrom(address _token, address payable _from, uint256 _value, address payable _to, uint256 _amount) internal
{
if (_token == address(0)) {
require(_value == _amount, "invalid value");
if (_to != address(this)) _to.transfer(_amount);
} else {
require(_value == 0, "invalid value");
IERC20(_token).safeTransferFrom(_from, _to, _amount);
}
}
event AddFractionalizer(bytes32 indexed _type, address indexed _fractionalizer);
event Listed(uint256 indexed _listingId);
event Sold(uint256 indexed _listingId);
event Relisted(uint256 indexed _listingId);
event Canceled(uint256 indexed _listingId);
event UpdatePrice(uint256 indexed _listingId, uint256 _oldReservePrice, uint256 _oldLimitPrice, uint256 _newReservePrice, uint256 _newLimitPrice);
event Join(uint256 indexed _listingId, address indexed _buyer, uint256 _amount);
event Leave(uint256 indexed _listingId, address indexed _buyer, uint256 _amount);
event Payout(uint256 indexed _listingId, address indexed _seller, uint256 _netAmount, uint256 _feeAmount);
event Claim(uint256 indexed _listingId, address indexed _buyer, uint256 _amount, uint256 _fractionsCount);
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"address payable","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_type","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_fractionalizer","type":"address"}],"name":"AddFractionalizer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_listingId","type":"uint256"}],"name":"Canceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_listingId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_fractionsCount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_listingId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Join","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_listingId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Leave","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_listingId","type":"uint256"}],"name":"Listed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_listingId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"_netAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_feeAmount","type":"uint256"}],"name":"Payout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_listingId","type":"uint256"}],"name":"Relisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_listingId","type":"uint256"}],"name":"Sold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_listingId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_oldReservePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_oldLimitPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newReservePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newLimitPrice","type":"uint256"}],"name":"UpdatePrice","type":"event"},{"inputs":[],"name":"FRACTIONS_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FRACTIONS_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"}],"name":"accept","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_type","type":"bytes32"},{"internalType":"address","name":"_fractionalizer","type":"address"}],"name":"addFractionalizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"},{"internalType":"address","name":"_buyer","type":"address"}],"name":"buyerFractionsCount","outputs":[{"internalType":"uint256","name":"_fractionsCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"},{"internalType":"address","name":"_buyer","type":"address"}],"name":"buyers","outputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"},{"internalType":"address payable","name":"_buyer","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"fractionalizers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"join","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"}],"name":"leave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_paymentToken","type":"address"},{"internalType":"uint256","name":"_reservePrice","type":"uint256"},{"internalType":"uint256","name":"_limitPrice","type":"uint256"},{"internalType":"uint256","name":"_extension","type":"uint256"},{"internalType":"uint256","name":"_priceMultiplier","type":"uint256"},{"internalType":"bytes","name":"_extra","type":"bytes"}],"name":"list","outputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"listingCount","outputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"listings","outputs":[{"internalType":"enum CollectivePurchase.State","name":"state","type":"uint8"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"reservePrice","type":"uint256"},{"internalType":"uint256","name":"limitPrice","type":"uint256"},{"internalType":"uint256","name":"extension","type":"uint256"},{"internalType":"uint256","name":"priceMultiplier","type":"uint256"},{"internalType":"bytes","name":"extra","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"cutoff","type":"uint256"},{"internalType":"uint256","name":"fractionsCount","type":"uint256"},{"internalType":"address","name":"fractions","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"}],"name":"maxJoinAmount","outputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"}],"name":"payout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address payable","name":"_to","type":"address"}],"name":"recoverLostFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"recoverLostItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"}],"name":"relist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"},{"internalType":"address payable[]","name":"_buyers","type":"address[]"}],"name":"relistPayoutAndClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"}],"name":"sellerPayout","outputs":[{"internalType":"uint256","name":"_netAmount","type":"uint256"},{"internalType":"uint256","name":"_feeAmount","type":"uint256"},{"internalType":"uint256","name":"_netFractionsCount","type":"uint256"},{"internalType":"uint256","name":"_feeFractionsCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"}],"name":"status","outputs":[{"internalType":"string","name":"_status","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingId","type":"uint256"},{"internalType":"uint256","name":"_newReservePrice","type":"uint256"},{"internalType":"uint256","name":"_newLimitPrice","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c06040523480156200001157600080fd5b506040516200602838038062006028833981810160405260408110156200003757600080fd5b8101908080519060200190929190805190602001909291905050506000620000646200027360201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060018081905550670de0b6b3a764000082111562000188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f696e76616c69642066656500000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200022c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f696e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b81608081815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050506200027b565b600033905090565b60805160a05160601c615d5e620002ca6000398061146452806140b652806143c7528061446152806144ca525080610df05280610e4452806113f752806138ae5280613fdf5250615d5e6000f3fe6080604052600436106101c25760003560e01c80638da5cb5b116100f7578063dc6b340111610095578063e115234311610064578063e115234314610c51578063f2fde38b14610c8c578063fbfa77cf14610cdd578063ff61be9c14610d1e576101c2565b8063dc6b3401146109ea578063ddca3f4314610a59578063ddd5e1b214610a84578063de74e57b14610adf576101c2565b8063b262fc5f116100d1578063b262fc5f14610813578063cf6ed0b414610884578063d04915de146108af578063db51af9f146109bc576101c2565b80638da5cb5b14610758578063941bc7bb14610799578063a9b07c26146107e8576101c2565b806342326d621161016457806367dfd4c91161013e57806367dfd4c914610693578063715018a6146106ce57806379e66b46146106e55780637d418ad11461071d576101c2565b806342326d621461051f57806342d21ef7146105845780634c03b77a14610638576101c2565b806319b05f49116101a057806319b05f49146103bf5780631dcb8298146103fa578063388fc40c1461047557806340e58ee5146104e4576101c2565b80630d86f604146101c75780630f4361291461022b578063150b7a021461027a575b600080fd5b3480156101d357600080fd5b50610200600480360360208110156101ea57600080fd5b8101908080359060200190929190505050610dae565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b34801561023757600080fd5b506102786004803603606081101561024e57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610eb1565b005b34801561028657600080fd5b5061038a6004803603608081101561029d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561030457600080fd5b82018360208201111561031657600080fd5b8035906020019184600183028401116401000000008311171561033857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611205565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3480156103cb57600080fd5b506103f8600480360360208110156103e257600080fd5b8101908080359060200190929190505050611219565b005b34801561040657600080fd5b506104736004803603606081101561041d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061157c565b005b34801561048157600080fd5b506104ce6004803603604081101561049857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611765565b6040518082815260200191505060405180910390f35b3480156104f057600080fd5b5061051d6004803603602081101561050757600080fd5b81019080803590602001909291905050506117d9565b005b34801561052b57600080fd5b506105586004803603602081101561054257600080fd5b8101908080359060200190929190505050611b86565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059057600080fd5b506105bd600480360360208110156105a757600080fd5b8101908080359060200190929190505050611bb9565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156105fd5780820151818401526020810190506105e2565b50505050905090810190601f16801561062a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561064457600080fd5b506106916004803603604081101561065b57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dab565b005b34801561069f57600080fd5b506106cc600480360360208110156106b657600080fd5b8101908080359060200190929190505050611fe2565b005b3480156106da57600080fd5b506106e3612393565b005b61071b600480360360408110156106fb57600080fd5b810190808035906020019092919080359060200190929190505050612519565b005b34801561072957600080fd5b506107566004803603602081101561074057600080fd5b8101908080359060200190929190505050612a20565b005b34801561076457600080fd5b5061076d612e11565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a557600080fd5b506107d2600480360360208110156107bc57600080fd5b8101908080359060200190929190505050612e3a565b6040518082815260200191505060405180910390f35b3480156107f457600080fd5b506107fd612e6d565b6040518082815260200191505060405180910390f35b34801561081f57600080fd5b506108826004803603604081101561083657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e7a565b005b34801561089057600080fd5b5061089961303d565b6040518082815260200191505060405180910390f35b3480156108bb57600080fd5b506109a660048036036101008110156108d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561096257600080fd5b82018360208201111561097457600080fd5b8035906020019184600183028401116401000000008311171561099657600080fd5b9091929391929390505050613046565b6040518082815260200191505060405180910390f35b3480156109c857600080fd5b506109d161375e565b604051808260ff16815260200191505060405180910390f35b3480156109f657600080fd5b50610a4360048036036040811015610a0d57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613763565b6040518082815260200191505060405180910390f35b348015610a6557600080fd5b50610a6e6138ac565b6040518082815260200191505060405180910390f35b348015610a9057600080fd5b50610add60048036036040811015610aa757600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506138d0565b005b348015610aeb57600080fd5b50610b1860048036036020811015610b0257600080fd5b8101908080359060200190929190505050613c57565b604051808f6003811115610b2857fe5b81526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff1681526020018c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a8152602001898152602001888152602001878152602001806020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825287818151815260200191508051906020019080838360005b83811015610c09578082015181840152602081019050610bee565b50505050905090810190601f168015610c365780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390f35b348015610c5d57600080fd5b50610c8a60048036036020811015610c7457600080fd5b8101908080359060200190929190505050613df5565b005b348015610c9857600080fd5b50610cdb60048036036020811015610caf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506141ba565b005b348015610ce957600080fd5b50610cf26143c5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d2a57600080fd5b50610dac60048036036040811015610d4157600080fd5b810190808035906020019092919080359060200190640100000000811115610d6857600080fd5b820183602082011115610d7a57600080fd5b80359060200191846020830284011164010000000083111715610d9c57600080fd5b90919293919293905050506143e9565b005b600080600080600060058681548110610dc357fe5b90600052602060002090600e02019050600081600401549050600082600901549050670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000000000000820281610e1857fe5b0495508581039650600093506000945080821115610ea757600081830390506000670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000000000000830281610e6c57fe5b049050600081830390506000610e8487600801614637565b90508583820281610e9157fe5b0497508582820281610e9f57fe5b049850505050505b5050509193509193565b82600060058281548110610ec157fe5b90600052602060002090600e020190508060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b8460008060058381548110610fa757fe5b90600052602060002090600e020190508060000160009054906101000a900460ff166003811115610fd457fe5b826003811115610fe057fe5b14611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b670de0b6b3a764000086670de0b6b3a764000088028161106f57fe5b04146110e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f7072696365206f766572666c6f7700000000000000000000000000000000000081525060200191505060405180910390fd5b8660001080156110f35750858711155b611165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c69642070726963650000000000000000000000000000000000000081525060200191505060405180910390fd5b60006005898154811061117457fe5b90600052602060002090600e020190506000816004015490506000826005015490508983600401819055508883600501819055508a7fd37605941cf2403b0eed3b571758fd57ec7a4c6829d707fac05db895c662b8ee83838d8d6040518085815260200184815260200183815260200182815260200194505050505060405180910390a25050505050505050505050565b600063150b7a0260e01b9050949350505050565b8060006005828154811061122957fe5b90600052602060002090600e020190508060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b82600160006005838154811061131057fe5b90600052602060002090600e020190508060000160009054906101000a900460ff16600381111561133d57fe5b82600381111561134957fe5b146113bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600587815481106113cb57fe5b90600052602060002090600e020190506000816009015482600401540390506000670de0b6b3a76400007f000000000000000000000000000000000000000000000000000000000000000083028161141f57fe5b0490506000818303905060028460000160006101000a81548160ff0219169083600381111561144a57fe5b02179055506001420384600a01819055508184600d0160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825401925050819055508084600d0160008660000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282540192505081905550897f92f64ca637d023f354075a4be751b169c1a8a9ccb6d33cdd0cb352054399572760405160405180910390a250505050505050505050565b6115846148a9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611644576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600260015414156116bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff161561172d57611759565b61175881838573ffffffffffffffffffffffffffffffffffffffff166148b19092919063ffffffff16565b5b60018081905550505050565b6000806005848154811061177557fe5b90600052602060002090600e02019050600081600d0160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600001549250505092915050565b60026001541415611852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055508060006005828154811061186a57fe5b90600052602060002090600e020190508060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b826000806005838154811061195057fe5b90600052602060002090600e020190508060000160009054906101000a900460ff16600381111561197d57fe5b82600381111561198957fe5b146119fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b600060058781548110611a0b57fe5b90600052602060002090600e0201905060038160000160006101000a81548160ff02191690836003811115611a3c57fe5b02179055506000600460008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008360020154815260200190815260200160002060006101000a81548160ff021916908315150217905550611b498160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600201548360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166148b19092919063ffffffff16565b867f829a8683c544ad289ce92d3ce06e9ebad69b18a6916e60ec766c2c217461d8e960405160405180910390a25050505050506001808190555050565b60026020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600060058381548110611bca57fe5b90600052602060002090600e0201905060006003811115611be757fe5b8160000160009054906101000a900460ff166003811115611c0457fe5b1415611c48576040518060400160405280600781526020017f4352454154454400000000000000000000000000000000000000000000000000815250915050611da6565b60016003811115611c5557fe5b8160000160009054906101000a900460ff166003811115611c7257fe5b1415611cb6576040518060400160405280600681526020017f46554e4445440000000000000000000000000000000000000000000000000000815250915050611da6565b60026003811115611cc357fe5b8160000160009054906101000a900460ff166003811115611ce057fe5b1415611d6c5780600a0154421115611d2d576040518060400160405280600681526020017f454e44494e470000000000000000000000000000000000000000000000000000815250611d64565b6040518060400160405280600781526020017f53544152544544000000000000000000000000000000000000000000000000008152505b915050611da6565b6040518060400160405280600581526020017f454e4445440000000000000000000000000000000000000000000000000000008152509150505b919050565b611db36148a9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e73576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f616c726561647920646566696e6564000000000000000000000000000000000081525060200191505060405180910390fd5b806002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16827fb518f99c3cca8be486ff3581576be9f6b1a0a54162660ec8912ab7114df7831160405160405180910390a35050565b6002600154141561205b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b600260018190555080600160006005838154811061207557fe5b90600052602060002090600e020190508060000160009054906101000a900460ff1660038111156120a257fe5b8260038111156120ae57fe5b14612121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b600033905060006005868154811061213557fe5b90600052602060002090600e02019050600081600d0160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111612204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e73756666696369656e742062616c616e636500000000000000000000000081525060200191505060405180910390fd5b600082600d0160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555080826009016000828254039250508190555080600360008460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506000826009015414156123055760008260000160006101000a81548160ff021916908360038111156122ff57fe5b02179055505b6123348260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168483614a9c565b8273ffffffffffffffffffffffffffffffffffffffff16877f75cd3de90897f0cf79288829aee15498f4200042cd444b6f68332a31199a89a2836040518082815260200191505060405180910390a35050505050506001808190555050565b61239b6148a9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461245b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60026001541415612592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055508160036000600583815481106125ac57fe5b90600052602060002090600e020190508060000160009054906101000a900460ff1660038111156125d957fe5b8260038111156125e557fe5b1415612659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b6000339050600034905060006005888154811061267257fe5b90600052602060002090600e0201905080600a01544211156126fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b60008160090154826005015403905080881115612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f6c696d697420657863656564656400000000000000000000000000000000000081525060200191505060405180910390fd5b6127b28260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168585308c614b4e565b87600360008460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508782600901600082825401925050819055508782600d0160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825401925050819055506000600381111561289457fe5b8260000160009054906101000a900460ff1660038111156128b157fe5b14156128de5760018260000160006101000a81548160ff021916908360038111156128d857fe5b02179055505b600160038111156128eb57fe5b8260000160009054906101000a900460ff16600381111561290857fe5b14156129815781600401548260090154106129805760028260000160006101000a81548160ff0219169083600381111561293e57fe5b02179055508160060154420182600a0181905550887f92f64ca637d023f354075a4be751b169c1a8a9ccb6d33cdd0cb352054399572760405160405180910390a25b5b6002600381111561298e57fe5b8260000160009054906101000a900460ff1660038111156129ab57fe5b14156129bf57816009015482600401819055505b8373ffffffffffffffffffffffffffffffffffffffff16897fb3e822478fa19cb993157f15b49a00501cc8d45226c1e7233aef1e281dc567f98a6040518082815260200191505060405180910390a350505050505050600180819055505050565b60026001541415612a99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550806002600060058381548110612ab357fe5b90600052602060002090600e020190508060000160009054906101000a900460ff166003811115612ae057fe5b826003811115612aec57fe5b14612b5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b600060058581548110612b6e57fe5b90600052602060002090600e0201905080600a01544211612bf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b600064174876e800600164174876e8000383600401540181612c1557fe5b049050600060646063838560070154020181612c2d57fe5b04905060038360000160006101000a81548160ff02191690836003811115612c5157fe5b0217905550612c608782614d23565b83600c0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612ccf83600c0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166152e8565b83600b01819055506000600460008560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008560020154815260200190815260200160002060006101000a81548160ff02191690831515021790555082600b01546003600085600c0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550867fc50147ebd01fc785c70bd92a0c4aeb1440fcb4b4f5a50f3b865ef618f2236a4060405160405180910390a25050505050506001808190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060058381548110612e4a57fe5b90600052602060002090600e020190508060090154816005015403915050919050565b6000600580549050905090565b612e826148a9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612f42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60026001541415612fbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000613012846152e8565b905081811115613030576000828203905061302e858583614a9c565b505b5050600180819055505050565b64174876e80081565b6000600260015414156130c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000339050670de0b6b3a764000087670de0b6b3a76400008902816130ea57fe5b041461315e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f7072696365206f766572666c6f7700000000000000000000000000000000000081525060200191505060405180910390fd5b87600010801561316e5750868811155b6131e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c69642070726963650000000000000000000000000000000000000081525060200191505060405180910390fd5b85610708111580156131f657506303c3b8808611155b613268576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f696e76616c6964206475726174696f6e0000000000000000000000000000000081525060200191505060405180910390fd5b84600010801561327a57506127108511155b6132ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e76616c6964206d756c7469706c696572000000000000000000000000000081525060200191505060405180910390fd5b6132f684846153d0565b8a73ffffffffffffffffffffffffffffffffffffffff166323b872dd82308d6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561338557600080fd5b505af1158015613399573d6000803e3d6000fd5b505050506001600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c815260200190815260200160002060006101000a81548160ff02191690831515021790555060058054905091506005604051806101c001604052806000600381111561342957fe5b81526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff1681526020018c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188815260200187815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001600081526020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090806001815401808255809150506001900390600052602060002090600e020160009091909190915060008201518160000160006101000a81548160ff0219169083600381111561358657fe5b021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816002015560808201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816004015560c0820151816005015560e0820151816006015561010082015181600701556101208201518160080190805190602001906136b0929190615c15565b50610140820151816009015561016082015181600a015561018082015181600b01556101a082015181600c0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050817ff3ecdc9ffda52c5ad69793c567cb456f83bba2d14f196542e0be80c919a8bda360405160405180910390a250600180819055509998505050505050505050565b600681565b600082600360006005838154811061377757fe5b90600052602060002090600e020190508060000160009054906101000a900460ff1660038111156137a457fe5b8260038111156137b057fe5b14613823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b60006005878154811061383257fe5b90600052602060002090600e02019050600081600d0160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050816004015482600b015482028161389e57fe5b049550505050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026001541415613949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b600260018190555081600360006005838154811061396357fe5b90600052602060002090600e020190508060000160009054906101000a900460ff16600381111561399057fe5b82600381111561399c57fe5b14613a0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b600060058681548110613a1e57fe5b90600052602060002090600e02019050600081600d0160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111613aed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e73756666696369656e742062616c616e636500000000000000000000000081525060200191505060405180910390fd5b6000826004015483600b0154830281613b0257fe5b049050600083600d0160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550806003600085600c0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550613bef83600c0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168883614a9c565b8673ffffffffffffffffffffffffffffffffffffffff16887fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec2888088484604051808381526020018281526020019250505060405180910390a3505050505050600180819055505050565b60058181548110613c6457fe5b90600052602060002090600e02016000915090508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806004015490806005015490806006015490806007015490806008018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613db35780601f10613d8857610100808354040283529160200191613db3565b820191906000526020600020905b815481529060010190602001808311613d9657829003601f168201915b50505050509080600901549080600a01549080600b01549080600c0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508e565b60026001541415613e6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550806003600060058381548110613e8857fe5b90600052602060002090600e020190508060000160009054906101000a900460ff166003811115613eb557fe5b826003811115613ec157fe5b14613f34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b600060058581548110613f4357fe5b90600052602060002090600e0201905060008160090154905060008111613fd2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e73756666696369656e742062616c616e636500000000000000000000000081525060200191505060405180910390fd5b6000670de0b6b3a76400007f000000000000000000000000000000000000000000000000000000000000000083028161400757fe5b049050600081830390506000846009018190555082600360008660030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506140db8460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000084614a9c565b61412e8460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168560000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614a9c565b8360000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16887fa5df5a195b51346b41c715be6896ddef8de524059309701b83d22c7e4ec1aa4c8385604051808381526020018281526020019250505060405180910390a3505050505050506001808190555050565b6141c26148a9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614282576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614308576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615cb36026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600584815481106143f857fe5b90600052602060002090600e0201905060038081111561441457fe5b8160000160009054906101000a900460ff16600381111561443157fe5b146144405761443f84612a20565b5b6000816009015411156144575761445684613df5565b5b600081600d0160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411156144ef576144ee847f00000000000000000000000000000000000000000000000000000000000000006138d0565b5b600081600d0160008360000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154111561458f5761458e848260000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166138d0565b5b60005b838390508110156146305760008484838181106145ab57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff169050600083600d0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411156146225761462186826138d0565b5b508080600101915050614592565b5050505050565b600080828054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156146cf5780601f106146a4576101008083540402835291602001916146cf565b820191906000526020600020905b8154815290600101906020018083116146b257829003601f168201915b505050505080602001905160a08110156146e857600080fd5b81019080805190602001909291908051604051939291908464010000000082111561471257600080fd5b8382019150602082018581111561472857600080fd5b825186600182028301116401000000008211171561474557600080fd5b8083526020830192505050908051906020019080838360005b8381101561477957808201518184015260208101905061475e565b50505050905090810190601f1680156147a65780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156147c957600080fd5b838201915060208201858111156147df57600080fd5b82518660018202830111640100000000821117156147fc57600080fd5b8083526020830192505050908051906020019080838360005b83811015614830578082015181840152602081019050614815565b50505050905090810190601f16801561485d5780820380516001836020036101000a031916815260200191505b506040526020018051906020019092919080519060200190929190505050945050505050670de0b6b3a76400008164174876e800028161489957fe5b0464174876e80003915050919050565b600033905090565b60003090508373ffffffffffffffffffffffffffffffffffffffff166323b872dd8285856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561494557600080fd5b505af1925050508015614956575060015b61495f57614965565b50614a97565b8373ffffffffffffffffffffffffffffffffffffffff1663095ea7b382846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156149d657600080fd5b505af11580156149ea573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff166323b872dd8285856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015614a7d57600080fd5b505af1158015614a91573d6000803e3d6000fd5b50505050505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614b1d578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614b17573d6000803e3d6000fd5b50614b49565b614b4882828573ffffffffffffffffffffffffffffffffffffffff166157239092919063ffffffff16565b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415614c7857808314614bf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c69642076616c75650000000000000000000000000000000000000081525060200191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614614c73578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614c71573d6000803e3d6000fd5b505b614d1c565b60008314614cee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c69642076616c75650000000000000000000000000000000000000081525060200191505060405180910390fd5b614d1b8483838873ffffffffffffffffffffffffffffffffffffffff166157c5909392919063ffffffff16565b5b5050505050565b60008060058481548110614d3357fe5b90600052602060002090600e020190506000606080600080856008018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015614de35780601f10614db857610100808354040283529160200191614de3565b820191906000526020600020905b815481529060010190602001808311614dc657829003601f168201915b505050505080602001905160a0811015614dfc57600080fd5b810190808051906020019092919080516040519392919084640100000000821115614e2657600080fd5b83820191506020820185811115614e3c57600080fd5b8251866001820283011164010000000082111715614e5957600080fd5b8083526020830192505050908051906020019080838360005b83811015614e8d578082015181840152602081019050614e72565b50505050905090810190601f168015614eba5780820380516001836020036101000a031916815260200191505b5060405260200180516040519392919084640100000000821115614edd57600080fd5b83820191506020820185811115614ef357600080fd5b8251866001820283011164010000000082111715614f1057600080fd5b8083526020830192505050908051906020019080838360005b83811015614f44578082015181840152602081019050614f29565b50505050905090810190601f168015614f715780820380516001836020036101000a031916815260200191505b506040526020018051906020019092919080519060200190929190505050945094509450945094508560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b36002600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688600201546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561506557600080fd5b505af1158015615079573d6000803e3d6000fd5b505050506002600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f11cc0a8760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688600201548787600664174876e8008f8e60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660008c8c6040518c63ffffffff1660e01b8152600401808c73ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200180602001806020018a60ff1681526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183810383528c818151815260200191508051906020019080838360005b838110156151e25780820151818401526020810190506151c7565b50505050905090810190601f16801561520f5780820380516001836020036101000a031916815260200191505b5083810382528b818151815260200191508051906020019080838360005b8381101561524857808201518184015260208101905061522d565b50505050905090810190601f1680156152755780820380516001836020036101000a031916815260200191505b509d5050505050505050505050505050602060405180830381600087803b15801561529f57600080fd5b505af11580156152b3573d6000803e3d6000fd5b505050506040513d60208110156152c957600080fd5b8101908080519060200190929190505050965050505050505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415615326574790506153cb565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561538d57600080fd5b505afa1580156153a1573d6000803e3d6000fd5b505050506040513d60208110156153b757600080fd5b810190808051906020019092919050505090505b919050565b6000806000848460a08110156153e557600080fd5b81019080803590602001909291908035906020019064010000000081111561540c57600080fd5b82018360208201111561541e57600080fd5b8035906020019184600183028401116401000000008311171561544057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156154a357600080fd5b8201836020820111156154b557600080fd5b803590602001918460018302840111640100000000831117156154d757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803590602001909291905050509450945050509250600073ffffffffffffffffffffffffffffffffffffffff166002600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415615616576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f756e737570706f7274656420747970650000000000000000000000000000000081525060200191505060405180910390fd5b816107081115801561562c57506303c3b8808211155b61569e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f696e76616c6964206475726174696f6e0000000000000000000000000000000081525060200191505060405180910390fd5b670de0b6b3a764000081111561571c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f696e76616c69642066656500000000000000000000000000000000000000000081525060200191505060405180910390fd5b5050505050565b6157c08363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050615886565b505050565b615880846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050615886565b50505050565b60606158e8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166159759092919063ffffffff16565b90506000815111156159705780806020019051602081101561590957600080fd5b810190808051906020019092919050505061596f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615cff602a913960400191505060405180910390fd5b5b505050565b6060615984848460008561598d565b90509392505050565b6060824710156159e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615cd96026913960400191505060405180910390fd5b6159f185615b36565b615a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310615ab35780518252602082019150602081019050602083039250615a90565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615b15576040519150601f19603f3d011682016040523d82523d6000602084013e615b1a565b606091505b5091509150615b2a828286615b49565b92505050949350505050565b600080823b905060008111915050919050565b60608315615b5957829050615c0e565b600083511115615b6c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615bd3578082015181840152602081019050615bb8565b50505050905090810190601f168015615c005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615c5657805160ff1916838001178555615c84565b82800160010185558215615c84579182015b82811115615c83578251825591602001919060010190615c68565b5b509050615c919190615c95565b5090565b5b80821115615cae576000816000905550600101615c96565b509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122012ca4acf2319dfd32a6b3abd6dd98182023211403fa53aa81abd2949b1d9f60a64736f6c634300060c003300000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000002fe2000660e1bf9bae5411dd42bbc8a46ac04903
Deployed Bytecode
0x6080604052600436106101c25760003560e01c80638da5cb5b116100f7578063dc6b340111610095578063e115234311610064578063e115234314610c51578063f2fde38b14610c8c578063fbfa77cf14610cdd578063ff61be9c14610d1e576101c2565b8063dc6b3401146109ea578063ddca3f4314610a59578063ddd5e1b214610a84578063de74e57b14610adf576101c2565b8063b262fc5f116100d1578063b262fc5f14610813578063cf6ed0b414610884578063d04915de146108af578063db51af9f146109bc576101c2565b80638da5cb5b14610758578063941bc7bb14610799578063a9b07c26146107e8576101c2565b806342326d621161016457806367dfd4c91161013e57806367dfd4c914610693578063715018a6146106ce57806379e66b46146106e55780637d418ad11461071d576101c2565b806342326d621461051f57806342d21ef7146105845780634c03b77a14610638576101c2565b806319b05f49116101a057806319b05f49146103bf5780631dcb8298146103fa578063388fc40c1461047557806340e58ee5146104e4576101c2565b80630d86f604146101c75780630f4361291461022b578063150b7a021461027a575b600080fd5b3480156101d357600080fd5b50610200600480360360208110156101ea57600080fd5b8101908080359060200190929190505050610dae565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b34801561023757600080fd5b506102786004803603606081101561024e57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610eb1565b005b34801561028657600080fd5b5061038a6004803603608081101561029d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561030457600080fd5b82018360208201111561031657600080fd5b8035906020019184600183028401116401000000008311171561033857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611205565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3480156103cb57600080fd5b506103f8600480360360208110156103e257600080fd5b8101908080359060200190929190505050611219565b005b34801561040657600080fd5b506104736004803603606081101561041d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061157c565b005b34801561048157600080fd5b506104ce6004803603604081101561049857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611765565b6040518082815260200191505060405180910390f35b3480156104f057600080fd5b5061051d6004803603602081101561050757600080fd5b81019080803590602001909291905050506117d9565b005b34801561052b57600080fd5b506105586004803603602081101561054257600080fd5b8101908080359060200190929190505050611b86565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059057600080fd5b506105bd600480360360208110156105a757600080fd5b8101908080359060200190929190505050611bb9565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156105fd5780820151818401526020810190506105e2565b50505050905090810190601f16801561062a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561064457600080fd5b506106916004803603604081101561065b57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dab565b005b34801561069f57600080fd5b506106cc600480360360208110156106b657600080fd5b8101908080359060200190929190505050611fe2565b005b3480156106da57600080fd5b506106e3612393565b005b61071b600480360360408110156106fb57600080fd5b810190808035906020019092919080359060200190929190505050612519565b005b34801561072957600080fd5b506107566004803603602081101561074057600080fd5b8101908080359060200190929190505050612a20565b005b34801561076457600080fd5b5061076d612e11565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a557600080fd5b506107d2600480360360208110156107bc57600080fd5b8101908080359060200190929190505050612e3a565b6040518082815260200191505060405180910390f35b3480156107f457600080fd5b506107fd612e6d565b6040518082815260200191505060405180910390f35b34801561081f57600080fd5b506108826004803603604081101561083657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e7a565b005b34801561089057600080fd5b5061089961303d565b6040518082815260200191505060405180910390f35b3480156108bb57600080fd5b506109a660048036036101008110156108d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561096257600080fd5b82018360208201111561097457600080fd5b8035906020019184600183028401116401000000008311171561099657600080fd5b9091929391929390505050613046565b6040518082815260200191505060405180910390f35b3480156109c857600080fd5b506109d161375e565b604051808260ff16815260200191505060405180910390f35b3480156109f657600080fd5b50610a4360048036036040811015610a0d57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613763565b6040518082815260200191505060405180910390f35b348015610a6557600080fd5b50610a6e6138ac565b6040518082815260200191505060405180910390f35b348015610a9057600080fd5b50610add60048036036040811015610aa757600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506138d0565b005b348015610aeb57600080fd5b50610b1860048036036020811015610b0257600080fd5b8101908080359060200190929190505050613c57565b604051808f6003811115610b2857fe5b81526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff1681526020018c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a8152602001898152602001888152602001878152602001806020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825287818151815260200191508051906020019080838360005b83811015610c09578082015181840152602081019050610bee565b50505050905090810190601f168015610c365780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390f35b348015610c5d57600080fd5b50610c8a60048036036020811015610c7457600080fd5b8101908080359060200190929190505050613df5565b005b348015610c9857600080fd5b50610cdb60048036036020811015610caf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506141ba565b005b348015610ce957600080fd5b50610cf26143c5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d2a57600080fd5b50610dac60048036036040811015610d4157600080fd5b810190808035906020019092919080359060200190640100000000811115610d6857600080fd5b820183602082011115610d7a57600080fd5b80359060200191846020830284011164010000000083111715610d9c57600080fd5b90919293919293905050506143e9565b005b600080600080600060058681548110610dc357fe5b90600052602060002090600e02019050600081600401549050600082600901549050670de0b6b3a76400007f00000000000000000000000000000000000000000000000000b1a2bc2ec50000820281610e1857fe5b0495508581039650600093506000945080821115610ea757600081830390506000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000b1a2bc2ec50000830281610e6c57fe5b049050600081830390506000610e8487600801614637565b90508583820281610e9157fe5b0497508582820281610e9f57fe5b049850505050505b5050509193509193565b82600060058281548110610ec157fe5b90600052602060002090600e020190508060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b8460008060058381548110610fa757fe5b90600052602060002090600e020190508060000160009054906101000a900460ff166003811115610fd457fe5b826003811115610fe057fe5b14611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b670de0b6b3a764000086670de0b6b3a764000088028161106f57fe5b04146110e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f7072696365206f766572666c6f7700000000000000000000000000000000000081525060200191505060405180910390fd5b8660001080156110f35750858711155b611165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c69642070726963650000000000000000000000000000000000000081525060200191505060405180910390fd5b60006005898154811061117457fe5b90600052602060002090600e020190506000816004015490506000826005015490508983600401819055508883600501819055508a7fd37605941cf2403b0eed3b571758fd57ec7a4c6829d707fac05db895c662b8ee83838d8d6040518085815260200184815260200183815260200182815260200194505050505060405180910390a25050505050505050505050565b600063150b7a0260e01b9050949350505050565b8060006005828154811061122957fe5b90600052602060002090600e020190508060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b82600160006005838154811061131057fe5b90600052602060002090600e020190508060000160009054906101000a900460ff16600381111561133d57fe5b82600381111561134957fe5b146113bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600587815481106113cb57fe5b90600052602060002090600e020190506000816009015482600401540390506000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000b1a2bc2ec5000083028161141f57fe5b0490506000818303905060028460000160006101000a81548160ff0219169083600381111561144a57fe5b02179055506001420384600a01819055508184600d0160007f0000000000000000000000002fe2000660e1bf9bae5411dd42bbc8a46ac0490373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825401925050819055508084600d0160008660000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282540192505081905550897f92f64ca637d023f354075a4be751b169c1a8a9ccb6d33cdd0cb352054399572760405160405180910390a250505050505050505050565b6115846148a9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611644576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600260015414156116bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff161561172d57611759565b61175881838573ffffffffffffffffffffffffffffffffffffffff166148b19092919063ffffffff16565b5b60018081905550505050565b6000806005848154811061177557fe5b90600052602060002090600e02019050600081600d0160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600001549250505092915050565b60026001541415611852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055508060006005828154811061186a57fe5b90600052602060002090600e020190508060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b826000806005838154811061195057fe5b90600052602060002090600e020190508060000160009054906101000a900460ff16600381111561197d57fe5b82600381111561198957fe5b146119fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b600060058781548110611a0b57fe5b90600052602060002090600e0201905060038160000160006101000a81548160ff02191690836003811115611a3c57fe5b02179055506000600460008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008360020154815260200190815260200160002060006101000a81548160ff021916908315150217905550611b498160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600201548360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166148b19092919063ffffffff16565b867f829a8683c544ad289ce92d3ce06e9ebad69b18a6916e60ec766c2c217461d8e960405160405180910390a25050505050506001808190555050565b60026020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600060058381548110611bca57fe5b90600052602060002090600e0201905060006003811115611be757fe5b8160000160009054906101000a900460ff166003811115611c0457fe5b1415611c48576040518060400160405280600781526020017f4352454154454400000000000000000000000000000000000000000000000000815250915050611da6565b60016003811115611c5557fe5b8160000160009054906101000a900460ff166003811115611c7257fe5b1415611cb6576040518060400160405280600681526020017f46554e4445440000000000000000000000000000000000000000000000000000815250915050611da6565b60026003811115611cc357fe5b8160000160009054906101000a900460ff166003811115611ce057fe5b1415611d6c5780600a0154421115611d2d576040518060400160405280600681526020017f454e44494e470000000000000000000000000000000000000000000000000000815250611d64565b6040518060400160405280600781526020017f53544152544544000000000000000000000000000000000000000000000000008152505b915050611da6565b6040518060400160405280600581526020017f454e4445440000000000000000000000000000000000000000000000000000008152509150505b919050565b611db36148a9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e73576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f616c726561647920646566696e6564000000000000000000000000000000000081525060200191505060405180910390fd5b806002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16827fb518f99c3cca8be486ff3581576be9f6b1a0a54162660ec8912ab7114df7831160405160405180910390a35050565b6002600154141561205b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b600260018190555080600160006005838154811061207557fe5b90600052602060002090600e020190508060000160009054906101000a900460ff1660038111156120a257fe5b8260038111156120ae57fe5b14612121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b600033905060006005868154811061213557fe5b90600052602060002090600e02019050600081600d0160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111612204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e73756666696369656e742062616c616e636500000000000000000000000081525060200191505060405180910390fd5b600082600d0160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555080826009016000828254039250508190555080600360008460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506000826009015414156123055760008260000160006101000a81548160ff021916908360038111156122ff57fe5b02179055505b6123348260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168483614a9c565b8273ffffffffffffffffffffffffffffffffffffffff16877f75cd3de90897f0cf79288829aee15498f4200042cd444b6f68332a31199a89a2836040518082815260200191505060405180910390a35050505050506001808190555050565b61239b6148a9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461245b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60026001541415612592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055508160036000600583815481106125ac57fe5b90600052602060002090600e020190508060000160009054906101000a900460ff1660038111156125d957fe5b8260038111156125e557fe5b1415612659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b6000339050600034905060006005888154811061267257fe5b90600052602060002090600e0201905080600a01544211156126fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b60008160090154826005015403905080881115612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f6c696d697420657863656564656400000000000000000000000000000000000081525060200191505060405180910390fd5b6127b28260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168585308c614b4e565b87600360008460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508782600901600082825401925050819055508782600d0160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825401925050819055506000600381111561289457fe5b8260000160009054906101000a900460ff1660038111156128b157fe5b14156128de5760018260000160006101000a81548160ff021916908360038111156128d857fe5b02179055505b600160038111156128eb57fe5b8260000160009054906101000a900460ff16600381111561290857fe5b14156129815781600401548260090154106129805760028260000160006101000a81548160ff0219169083600381111561293e57fe5b02179055508160060154420182600a0181905550887f92f64ca637d023f354075a4be751b169c1a8a9ccb6d33cdd0cb352054399572760405160405180910390a25b5b6002600381111561298e57fe5b8260000160009054906101000a900460ff1660038111156129ab57fe5b14156129bf57816009015482600401819055505b8373ffffffffffffffffffffffffffffffffffffffff16897fb3e822478fa19cb993157f15b49a00501cc8d45226c1e7233aef1e281dc567f98a6040518082815260200191505060405180910390a350505050505050600180819055505050565b60026001541415612a99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550806002600060058381548110612ab357fe5b90600052602060002090600e020190508060000160009054906101000a900460ff166003811115612ae057fe5b826003811115612aec57fe5b14612b5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b600060058581548110612b6e57fe5b90600052602060002090600e0201905080600a01544211612bf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b600064174876e800600164174876e8000383600401540181612c1557fe5b049050600060646063838560070154020181612c2d57fe5b04905060038360000160006101000a81548160ff02191690836003811115612c5157fe5b0217905550612c608782614d23565b83600c0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612ccf83600c0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166152e8565b83600b01819055506000600460008560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008560020154815260200190815260200160002060006101000a81548160ff02191690831515021790555082600b01546003600085600c0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550867fc50147ebd01fc785c70bd92a0c4aeb1440fcb4b4f5a50f3b865ef618f2236a4060405160405180910390a25050505050506001808190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060058381548110612e4a57fe5b90600052602060002090600e020190508060090154816005015403915050919050565b6000600580549050905090565b612e826148a9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612f42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60026001541415612fbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000613012846152e8565b905081811115613030576000828203905061302e858583614a9c565b505b5050600180819055505050565b64174876e80081565b6000600260015414156130c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000339050670de0b6b3a764000087670de0b6b3a76400008902816130ea57fe5b041461315e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f7072696365206f766572666c6f7700000000000000000000000000000000000081525060200191505060405180910390fd5b87600010801561316e5750868811155b6131e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c69642070726963650000000000000000000000000000000000000081525060200191505060405180910390fd5b85610708111580156131f657506303c3b8808611155b613268576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f696e76616c6964206475726174696f6e0000000000000000000000000000000081525060200191505060405180910390fd5b84600010801561327a57506127108511155b6132ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e76616c6964206d756c7469706c696572000000000000000000000000000081525060200191505060405180910390fd5b6132f684846153d0565b8a73ffffffffffffffffffffffffffffffffffffffff166323b872dd82308d6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561338557600080fd5b505af1158015613399573d6000803e3d6000fd5b505050506001600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c815260200190815260200160002060006101000a81548160ff02191690831515021790555060058054905091506005604051806101c001604052806000600381111561342957fe5b81526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff1681526020018c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188815260200187815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001600081526020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090806001815401808255809150506001900390600052602060002090600e020160009091909190915060008201518160000160006101000a81548160ff0219169083600381111561358657fe5b021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816002015560808201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816004015560c0820151816005015560e0820151816006015561010082015181600701556101208201518160080190805190602001906136b0929190615c15565b50610140820151816009015561016082015181600a015561018082015181600b01556101a082015181600c0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050817ff3ecdc9ffda52c5ad69793c567cb456f83bba2d14f196542e0be80c919a8bda360405160405180910390a250600180819055509998505050505050505050565b600681565b600082600360006005838154811061377757fe5b90600052602060002090600e020190508060000160009054906101000a900460ff1660038111156137a457fe5b8260038111156137b057fe5b14613823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b60006005878154811061383257fe5b90600052602060002090600e02019050600081600d0160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050816004015482600b015482028161389e57fe5b049550505050505092915050565b7f00000000000000000000000000000000000000000000000000b1a2bc2ec5000081565b60026001541415613949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b600260018190555081600360006005838154811061396357fe5b90600052602060002090600e020190508060000160009054906101000a900460ff16600381111561399057fe5b82600381111561399c57fe5b14613a0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b600060058681548110613a1e57fe5b90600052602060002090600e02019050600081600d0160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111613aed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e73756666696369656e742062616c616e636500000000000000000000000081525060200191505060405180910390fd5b6000826004015483600b0154830281613b0257fe5b049050600083600d0160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550806003600085600c0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550613bef83600c0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168883614a9c565b8673ffffffffffffffffffffffffffffffffffffffff16887fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec2888088484604051808381526020018281526020019250505060405180910390a3505050505050600180819055505050565b60058181548110613c6457fe5b90600052602060002090600e02016000915090508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806004015490806005015490806006015490806007015490806008018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613db35780601f10613d8857610100808354040283529160200191613db3565b820191906000526020600020905b815481529060010190602001808311613d9657829003601f168201915b50505050509080600901549080600a01549080600b01549080600c0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508e565b60026001541415613e6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550806003600060058381548110613e8857fe5b90600052602060002090600e020190508060000160009054906101000a900460ff166003811115613eb557fe5b826003811115613ec157fe5b14613f34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f7420617661696c61626c650000000000000000000000000000000000000081525060200191505060405180910390fd5b600060058581548110613f4357fe5b90600052602060002090600e0201905060008160090154905060008111613fd2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e73756666696369656e742062616c616e636500000000000000000000000081525060200191505060405180910390fd5b6000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000b1a2bc2ec5000083028161400757fe5b049050600081830390506000846009018190555082600360008660030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506140db8460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000002fe2000660e1bf9bae5411dd42bbc8a46ac0490384614a9c565b61412e8460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168560000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614a9c565b8360000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16887fa5df5a195b51346b41c715be6896ddef8de524059309701b83d22c7e4ec1aa4c8385604051808381526020018281526020019250505060405180910390a3505050505050506001808190555050565b6141c26148a9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614282576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614308576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615cb36026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f0000000000000000000000002fe2000660e1bf9bae5411dd42bbc8a46ac0490381565b6000600584815481106143f857fe5b90600052602060002090600e0201905060038081111561441457fe5b8160000160009054906101000a900460ff16600381111561443157fe5b146144405761443f84612a20565b5b6000816009015411156144575761445684613df5565b5b600081600d0160007f0000000000000000000000002fe2000660e1bf9bae5411dd42bbc8a46ac0490373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411156144ef576144ee847f0000000000000000000000002fe2000660e1bf9bae5411dd42bbc8a46ac049036138d0565b5b600081600d0160008360000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154111561458f5761458e848260000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166138d0565b5b60005b838390508110156146305760008484838181106145ab57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff169050600083600d0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411156146225761462186826138d0565b5b508080600101915050614592565b5050505050565b600080828054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156146cf5780601f106146a4576101008083540402835291602001916146cf565b820191906000526020600020905b8154815290600101906020018083116146b257829003601f168201915b505050505080602001905160a08110156146e857600080fd5b81019080805190602001909291908051604051939291908464010000000082111561471257600080fd5b8382019150602082018581111561472857600080fd5b825186600182028301116401000000008211171561474557600080fd5b8083526020830192505050908051906020019080838360005b8381101561477957808201518184015260208101905061475e565b50505050905090810190601f1680156147a65780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156147c957600080fd5b838201915060208201858111156147df57600080fd5b82518660018202830111640100000000821117156147fc57600080fd5b8083526020830192505050908051906020019080838360005b83811015614830578082015181840152602081019050614815565b50505050905090810190601f16801561485d5780820380516001836020036101000a031916815260200191505b506040526020018051906020019092919080519060200190929190505050945050505050670de0b6b3a76400008164174876e800028161489957fe5b0464174876e80003915050919050565b600033905090565b60003090508373ffffffffffffffffffffffffffffffffffffffff166323b872dd8285856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561494557600080fd5b505af1925050508015614956575060015b61495f57614965565b50614a97565b8373ffffffffffffffffffffffffffffffffffffffff1663095ea7b382846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156149d657600080fd5b505af11580156149ea573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff166323b872dd8285856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015614a7d57600080fd5b505af1158015614a91573d6000803e3d6000fd5b50505050505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614b1d578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614b17573d6000803e3d6000fd5b50614b49565b614b4882828573ffffffffffffffffffffffffffffffffffffffff166157239092919063ffffffff16565b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415614c7857808314614bf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c69642076616c75650000000000000000000000000000000000000081525060200191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614614c73578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614c71573d6000803e3d6000fd5b505b614d1c565b60008314614cee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c69642076616c75650000000000000000000000000000000000000081525060200191505060405180910390fd5b614d1b8483838873ffffffffffffffffffffffffffffffffffffffff166157c5909392919063ffffffff16565b5b5050505050565b60008060058481548110614d3357fe5b90600052602060002090600e020190506000606080600080856008018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015614de35780601f10614db857610100808354040283529160200191614de3565b820191906000526020600020905b815481529060010190602001808311614dc657829003601f168201915b505050505080602001905160a0811015614dfc57600080fd5b810190808051906020019092919080516040519392919084640100000000821115614e2657600080fd5b83820191506020820185811115614e3c57600080fd5b8251866001820283011164010000000082111715614e5957600080fd5b8083526020830192505050908051906020019080838360005b83811015614e8d578082015181840152602081019050614e72565b50505050905090810190601f168015614eba5780820380516001836020036101000a031916815260200191505b5060405260200180516040519392919084640100000000821115614edd57600080fd5b83820191506020820185811115614ef357600080fd5b8251866001820283011164010000000082111715614f1057600080fd5b8083526020830192505050908051906020019080838360005b83811015614f44578082015181840152602081019050614f29565b50505050905090810190601f168015614f715780820380516001836020036101000a031916815260200191505b506040526020018051906020019092919080519060200190929190505050945094509450945094508560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b36002600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688600201546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561506557600080fd5b505af1158015615079573d6000803e3d6000fd5b505050506002600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f11cc0a8760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688600201548787600664174876e8008f8e60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660008c8c6040518c63ffffffff1660e01b8152600401808c73ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200180602001806020018a60ff1681526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183810383528c818151815260200191508051906020019080838360005b838110156151e25780820151818401526020810190506151c7565b50505050905090810190601f16801561520f5780820380516001836020036101000a031916815260200191505b5083810382528b818151815260200191508051906020019080838360005b8381101561524857808201518184015260208101905061522d565b50505050905090810190601f1680156152755780820380516001836020036101000a031916815260200191505b509d5050505050505050505050505050602060405180830381600087803b15801561529f57600080fd5b505af11580156152b3573d6000803e3d6000fd5b505050506040513d60208110156152c957600080fd5b8101908080519060200190929190505050965050505050505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415615326574790506153cb565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561538d57600080fd5b505afa1580156153a1573d6000803e3d6000fd5b505050506040513d60208110156153b757600080fd5b810190808051906020019092919050505090505b919050565b6000806000848460a08110156153e557600080fd5b81019080803590602001909291908035906020019064010000000081111561540c57600080fd5b82018360208201111561541e57600080fd5b8035906020019184600183028401116401000000008311171561544057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156154a357600080fd5b8201836020820111156154b557600080fd5b803590602001918460018302840111640100000000831117156154d757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803590602001909291905050509450945050509250600073ffffffffffffffffffffffffffffffffffffffff166002600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415615616576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f756e737570706f7274656420747970650000000000000000000000000000000081525060200191505060405180910390fd5b816107081115801561562c57506303c3b8808211155b61569e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f696e76616c6964206475726174696f6e0000000000000000000000000000000081525060200191505060405180910390fd5b670de0b6b3a764000081111561571c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f696e76616c69642066656500000000000000000000000000000000000000000081525060200191505060405180910390fd5b5050505050565b6157c08363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050615886565b505050565b615880846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050615886565b50505050565b60606158e8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166159759092919063ffffffff16565b90506000815111156159705780806020019051602081101561590957600080fd5b810190808051906020019092919050505061596f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615cff602a913960400191505060405180910390fd5b5b505050565b6060615984848460008561598d565b90509392505050565b6060824710156159e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615cd96026913960400191505060405180910390fd5b6159f185615b36565b615a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310615ab35780518252602082019150602081019050602083039250615a90565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615b15576040519150601f19603f3d011682016040523d82523d6000602084013e615b1a565b606091505b5091509150615b2a828286615b49565b92505050949350505050565b600080823b905060008111915050919050565b60608315615b5957829050615c0e565b600083511115615b6c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615bd3578082015181840152602081019050615bb8565b50505050905090810190601f168015615c005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615c5657805160ff1916838001178555615c84565b82800160010185558215615c84579182015b82811115615c83578251825591602001919060010190615c68565b5b509050615c919190615c95565b5090565b5b80821115615cae576000816000905550600101615c96565b509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122012ca4acf2319dfd32a6b3abd6dd98182023211403fa53aa81abd2949b1d9f60a64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000002fe2000660e1bf9bae5411dd42bbc8a46ac04903
-----Decoded View---------------
Arg [0] : _fee (uint256): 50000000000000000
Arg [1] : _vault (address): 0x2fE2000660e1Bf9BAe5411dD42bbC8A46ac04903
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000b1a2bc2ec50000
Arg [1] : 0000000000000000000000002fe2000660e1bf9bae5411dd42bbc8a46ac04903
Deployed Bytecode Sourcemap
34362:14698:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37424:880;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40217:677;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23779:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;40899:518;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45927:214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36233:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39832:380;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35189:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36471:372;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38309:258;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42480:576;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2779:148;;;;;;;;;;;;;:::i;:::-;;41422:1053;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43061:705;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2137:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36848:195;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36131:97;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45619:303;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35059:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38572:1255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35011:44;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37048:371;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35115:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44379:582;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35361:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43771:603;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3082:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35147:38;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44966:648;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37424:880;37489:18;37509;37529:26;37557;37592:28;37623:8;37632:10;37623:20;;;;;;;;;;;;;;;;;;37592:51;;37648:21;37672:8;:21;;;37648:45;;37698:15;37716:8;:15;;;37698:33;;37767:4;37760:3;37750:7;:13;37749:22;;;;;;37736:35;;37799:10;37789:7;:20;37776:33;;37835:1;37814:22;;37862:1;37841:22;;37888:7;37872:13;:23;37868:432;;;37903:22;37944:7;37928:13;:23;37903:48;;37957:25;38010:4;38003:3;37986:14;:20;37985:29;;;;;;37957:57;;38020:25;38065:17;38048:14;:34;38020:62;;38088:23;38114:24;38123:8;:14;;38114:8;:24::i;:::-;38088:50;;38203:13;38183:17;38165:15;:35;:51;;;;;;38144:72;;38281:13;38261:17;38243:15;:35;:51;;;;;;38222:72;;37868:432;;;;;37424:880;;;;;;;;:::o;40217:677::-;40328:10;35443:28;35474:8;35483:10;35474:20;;;;;;;;;;;;;;;;;;35443:51;;35521:8;:15;;;;;;;;;;;;35507:29;;:10;:29;;;35499:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40348:10:::1;40360:13;35628:28:::0;35659:8:::1;35668:10;35659:20;;;;;;;;;;;;;;;;;;35628:51;;35702:8;:14;;;;;;;;;;;;35692:24;;;;;;;;:6;:24;;;;;;;;;35684:50;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;40432:4:::2;40414:14;40407:4;40390:14;:21;:38;;;;;;:46;40382:73;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;40472:16;40468:1;:20;:58;;;;;40512:14;40492:16;:34;;40468:58;40460:84;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;40549:28;40580:8;40589:10;40580:20;;;;;;;;;;;;;;;;;;40549:51;;40605:24;40632:8;:21;;;40605:48;;40658:22;40683:8;:19;;;40658:44;;40731:16;40707:8;:21;;:40;;;;40774:14;40752:8;:19;;:36;;;;40810:10;40798:91;40822:16;40840:14;40856:16;40874:14;40798:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35739:1;;;35559::::1;;;40217:677:::0;;;;;:::o;23779:164::-;23879:6;23905:30;;;23898:37;;23779:164;;;;;;:::o;40899:518::-;40955:10;35443:28;35474:8;35483:10;35474:20;;;;;;;;;;;;;;;;;;35443:51;;35521:8;:15;;;;;;;;;;;;35507:29;;:10;:29;;;35499:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40975:10:::1;40987:12;35628:28;35659:8;35668:10;35659:20;;;;;;;;;;;;;;;;;;35628:51;;35702:8;:14;;;;;;;;;;;;35692:24;;;;;;;;:6;:24;;;;;;;;;35684:50;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;41008:28:::2;41039:8;41048:10;41039:20;;;;;;;;;;;;;;;;;;41008:51;;41064:15;41106:8;:15;;;41082:8;:21;;;:39;41064:57;;41126:18;41165:4;41158:3;41148:7;:13;41147:22;;;;;;41126:43;;41174:18;41205:10;41195:7;:20;41174:41;;41237:13;41220:8;:14;;;:30;;;;;;;;;;;;;;;;;;;;;;;;41279:1;41273:3;:7;41255:8;:15;;:25;;;;41318:10;41285:8;:15;;:22;41301:5;41285:22;;;;;;;;;;;;;;;:29;;;:43;;;;;;;;;;;41376:10;41333:8;:15;;:32;41349:8;:15;;;;;;;;;;;;41333:32;;;;;;;;;;;;;;;:39;;;:53;;;;;;;;;;;41401:10;41396:16;;;;;;;;;;35739:1;;;;35559::::1;;;40899:518:::0;;;:::o;45927:214::-;2359:12;:10;:12::i;:::-;2349:22;;:6;;;;;;;;;;:22;;;2341:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31255:1:::1;31861:7;;:19;;31853:63;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;31255:1;31994:7;:18;;;;46047:5:::2;:18;46053:11;46047:18;;;;;;;;;;;;;;;:28;46066:8;46047:28;;;;;;;;;;;;;;;;;;;;;46043:41;;;46077:7;;46043:41;46088:48;46122:3;46127:8;46096:11;46088:33;;;;:48;;;;;:::i;:::-;32025:1;31211::::1;32173:7:::0;:22:::1;;;;45927:214:::0;;;:::o;36233:233::-;36308:15;36332:28;36363:8;36372:10;36363:20;;;;;;;;;;;;;;;;;;36332:51;;36388:23;36414:8;:15;;:23;36430:6;36414:23;;;;;;;;;;;;;;;36388:49;;36449:5;:12;;;36442:19;;;;36233:233;;;;:::o;39832:380::-;31255:1;31861:7;;:19;;31853:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31255:1;31994:7;:18;;;;39901:10:::1;35443:28;35474:8;35483:10;35474:20;;;;;;;;;;;;;;;;;;35443:51;;35521:8;:15;;;;;;;;;;;;35507:29;;:10;:29;;;35499:55;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;39921:10:::2;39933:13;35628:28:::0;35659:8:::2;35668:10;35659:20;;;;;;;;;;;;;;;;;;35628:51;;35702:8;:14;;;;;;;;;;;;35692:24;;;;;;;;:6;:24;;;;;;;;;35684:50;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;39955:28:::3;39986:8;39995:10;39986:20;;;;;;;;;;;;;;;;;;39955:51;;40028:11;40011:8;:14;;;:28;;;;;;;;;;;;;;;;;;;;;;;;40091:5;40044;:26;40050:8;:19;;;;;;;;;;;;40044:26;;;;;;;;;;;;;;;:44;40071:8;:16;;;40044:44;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;40101:76;40143:8;:15;;;;;;;;;;;;40160:8;:16;;;40109:8;:19;;;;;;;;;;;;40101:41;;;;:76;;;;;:::i;:::-;40196:10;40187:20;;;;;;;;;;35739:1;35559::::2;;;32025::::1;;31211::::0;32173:7;:22;;;;39832:380;:::o;35189:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;36471:372::-;36530:21;36560:28;36591:8;36600:10;36591:20;;;;;;;;;;;;;;;;;;36560:51;;36638:13;36620:31;;;;;;;;:8;:14;;;;;;;;;;;;:31;;;;;;;;;36616:53;;;36653:16;;;;;;;;;;;;;;;;;;;;;;36616:53;36696:12;36678:30;;;;;;;;:8;:14;;;;;;;;;;;;:30;;;;;;;;;36674:51;;;36710:15;;;;;;;;;;;;;;;;;;;;;;36674:51;36752:13;36734:31;;;;;;;;:8;:14;;;;;;;;;;;;:31;;;;;;;;;36730:89;;;36781:8;:15;;;36774:3;:22;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36767:52;;;;;36730:89;36824:14;;;;;;;;;;;;;;;;;;;;36471:372;;;;:::o;38309:258::-;2359:12;:10;:12::i;:::-;2349:22;;:6;;;;;;;;;;:22;;;2341:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38444:1:::1;38410:36;;:15;:22;38426:5;38410:22;;;;;;;;;;;;;;;;;;;;;:36;;;38402:64;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;38496:15;38471;:22;38487:5;38471:22;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;38546:15;38521:41;;38539:5;38521:41;;;;;;;;;;38309:258:::0;;:::o;42480:576::-;31255:1;31861:7;;:19;;31853:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31255:1;31994:7;:18;;;;42545:10:::1;42557:12;35628:28;35659:8;35668:10;35659:20;;;;;;;;;;;;;;;;;;35628:51;;35702:8;:14;;;;;;;;;;;;35692:24;;;;;;;;:6;:24;;;;;;;;;35684:50;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;42578:22:::2;42603:10;42578:35;;42618:28;42649:8;42658:10;42649:20;;;;;;;;;;;;;;;;;;42618:51;;42674:15;42692:8;:15;;:23;42708:6;42692:23;;;;;;;;;;;;;;;:30;;;42674:48;;42745:1;42735:7;:11;42727:44;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;42809:1;42776:8;:15;;:23;42792:6;42776:23;;;;;;;;;;;;;;;:30;;:34;;;;42834:7;42815:8;:15;;;:26;;;;;;;;;;;42881:7;42846:8;:31;42855:8;:21;;;;;;;;;;;;42846:31;;;;;;;;;;;;;;;;:42;;;;;;;;;;;42916:1;42897:8;:15;;;:20;42893:56;;;42936:13;42919:8;:14;;;:30;;;;;;;;;;;;;;;;;;;;;;;;42893:56;42954:53;42968:8;:21;;;;;;;;;;;;42991:6;42999:7;42954:13;:53::i;:::-;43035:6;43017:34;;43023:10;43017:34;43043:7;43017:34;;;;;;;;;;;;;;;;;;35739:1;;;32025::::1;;;31211::::0;32173:7;:22;;;;42480:576;:::o;2779:148::-;2359:12;:10;:12::i;:::-;2349:22;;:6;;;;;;;;;;:22;;;2341:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2886:1:::1;2849:40;;2870:6;::::0;::::1;;;;;;;;2849:40;;;;;;;;;;;;2917:1;2900:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2779:148::o:0;41422:1053::-;31255:1;31861:7;;:19;;31853:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31255:1;31994:7;:18;;;;41514:10:::1;41526:11;35811:28;35842:8;35851:10;35842:20;;;;;;;;;;;;;;;;;;35811:51;;35885:8;:14;;;;;;;;;;;;35875:24;;;;;;;;:6;:24;;;;;;;;;;35867:50;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;41546:22:::2;41571:10;41546:35;;41586:14;41603:9;41586:26;;41617:28;41648:8;41657:10;41648:20;;;;;;;;;;;;;;;;;;41617:51;;41688:8;:15;;;41681:3;:22;;41673:48;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;41726:19;41770:8;:15;;;41748:8;:19;;;:37;41726:59;;41809:11;41798:7;:22;;41790:49;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;41844:89;41862:8;:21;;;;;;;;;;;;41885:6;41893;41917:4;41925:7;41844:17;:89::i;:::-;41973:7;41938:8;:31;41947:8;:21;;;;;;;;;;;;41938:31;;;;;;;;;;;;;;;;:42;;;;;;;;;;;42004:7;41985:8;:15;;;:26;;;;;;;;;;;42050:7;42016:8;:15;;:23;42032:6;42016:23;;;;;;;;;;;;;;;:30;;;:41;;;;;;;;;;;42084:13;42066:31;;;;;;;;:8;:14;;;;;;;;;;;;:31;;;;;;;;;42062:66;;;42116:12;42099:8;:14;;;:29;;;;;;;;;;;;;;;;;;;;;;;;42062:66;42155:12;42137:30;;;;;;;;:8;:14;;;;;;;;;;;;:30;;;;;;;;;42133:214;;;42198:8;:21;;;42179:8;:15;;;:40;42175:167;;42245:13;42228:8;:14;;;:30;;;;;;;;;;;;;;;;;;;;;;;;42289:8;:18;;;42283:3;:24;42265:8;:15;;:42;;;;42324:10;42319:16;;;;;;;;;;42175:167;42133:214;42373:13;42355:31;;;;;;;;:8;:14;;;;;;;;;;;;:31;;;;;;;;;42351:76;;;42412:8;:15;;;42388:8;:21;;:39;;;;42351:76;42454:6;42437:33;;42442:10;42437:33;42462:7;42437:33;;;;;;;;;;;;;;;;;;35922:1;;;;32025::::1;;;31211::::0;32173:7;:22;;;;41422:1053;;:::o;43061:705::-;31255:1;31861:7;;:19;;31853:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31255:1;31994:7;:18;;;;43125:10:::1;43137:13;35628:28;35659:8;35668:10;35659:20;;;;;;;;;;;;;;;;;;35628:51;;35702:8;:14;;;;;;;;;;;;35692:24;;;;;;;;:6;:24;;;;;;;;;35684:50;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;43159:28:::2;43190:8;43199:10;43190:20;;;;;;;;;;;;;;;;;;43159:51;;43229:8;:15;;;43223:3;:21;43215:47;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;43267:22;35101:8;43336:1;35101:8;43318:19;43293:8;:21;;;:45;43292:65;;;;;;43267:90;;43362:28;43444:3;43438:2;43421:14;43394:8;:24;;;:41;:46;43393:54;;;;;;43362:85;;43469:11;43452:8;:14;;;:28;;;;;;;;;;;;;;;;;;;;;;;;43506:48;43521:10;43533:20;43506:14;:48::i;:::-;43485:8;:18;;;:69;;;;;;;;;;;;;;;;;;43585:30;43596:8;:18;;;;;;;;;;;;43585:10;:30::i;:::-;43559:8;:23;;:56;;;;43667:5;43620;:26;43626:8;:19;;;;;;;;;;;;43620:26;;;;;;;;;;;;;;;:44;43647:8;:16;;;43620:44;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;43708:8;:23;;;43677:8;:28;43686:8;:18;;;;;;;;;;;;43677:28;;;;;;;;;;;;;;;:54;;;;43750:10;43741:20;;;;;;;;;;35739:1;;;32025::::1;;;31211::::0;32173:7;:22;;;;43061:705;:::o;2137:79::-;2175:7;2202:6;;;;;;;;;;;2195:13;;2137:79;:::o;36848:195::-;36914:15;36938:28;36969:8;36978:10;36969:20;;;;;;;;;;;;;;;;;;36938:51;;37023:8;:15;;;37001:8;:19;;;:37;36994:44;;;36848:195;;;:::o;36131:97::-;36178:14;36208:8;:15;;;;36201:22;;36131:97;:::o;45619:303::-;2359:12;:10;:12::i;:::-;2349:22;;:6;;;;;;;;;;:22;;;2341:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31255:1:::1;31861:7;;:19;;31853:63;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;31255:1;31994:7;:18;;;;45721:16:::2;45740:8;:16;45749:6;45740:16;;;;;;;;;;;;;;;;45721:35;;45761:16;45780:18;45791:6;45780:10;:18::i;:::-;45761:37;;45818:8;45807;:19;45803:115;;;45834:15;45863:8;45852;:19;45834:37;;45877:35;45891:6;45899:3;45904:7;45877:13;:35::i;:::-;45803:115;;32025:1;;31211::::1;32173:7:::0;:22:::1;;;;45619:303:::0;;:::o;35059:50::-;35101:8;35059:50;:::o;38572:1255::-;38792:18;31255:1;31861:7;;:19;;31853:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31255:1;31994:7;:18;;;;38819:23:::1;38845:10;38819:36;;38904:4;38889:11;38882:4;38868:11;:18;:32;;;;;;:40;38860:67;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;38944:13;38940:1;:17;:49;;;;;38978:11;38961:13;:28;;38940:49;38932:75;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;39034:10;39020;:24;;:50;;;;;39062:8;39048:10;:22;;39020:50;39012:79;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;39108:16;39104:1;:20;:49;;;;;39148:5;39128:16;:25;;39104:49;39096:80;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;39203:17;39213:6;;39203:9;:17::i;:::-;39233:11;39225:33;;;39259:7;39276:4;39283:8;39225:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39328:4;39297:5;:18;39303:11;39297:18;;;;;;;;;;;;;;;:28;39316:8;39297:28;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;39350:8;:15;;;;39337:28;;39370:8;39384:387;;;;;;;;39409:13;39384:387;;;;;;;;;;;;39436:7;39384:387;;;;;;39461:11;39384:387;;;;;;39487:8;39384:387;;;;39515:13;39384:387;;;;;;39548:13;39384:387;;;;39579:11;39384:387;;;;39607:10;39384:387;;;;39640:16;39384:387;;;;39669:6;;39384:387;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39689:1;39384:387;;;;39712:2;39384:387;;;;39737:1;39384:387;;;;39763:1;39384:387;;;;::::0;39370:402:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39789:10;39782:18;;;;;;;;;;39805:17;31211:1:::0;32173:7;:22;;;;38572:1255;;;;;;;;;;;:::o;35011:44::-;35054:1;35011:44;:::o;37048:371::-;37169:23;37135:10;37147:11;35628:28;35659:8;35668:10;35659:20;;;;;;;;;;;;;;;;;;35628:51;;35702:8;:14;;;;;;;;;;;;35692:24;;;;;;;;:6;:24;;;;;;;;;35684:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37201:28:::1;37232:8;37241:10;37232:20;;;;;;;;;;;;;;;;;;37201:51;;37257:15;37275:8;:15;;:23;37291:6;37275:23;;;;;;;;;;;;;;;:30;;;37257:48;;37366:8;:21;;;37339:8;:23;;;37329:7;:33;37328:59;;;;;;37310:77;;37392:22;;37048:371:::0;;;;;;;:::o;35115:28::-;;;:::o;44379:582::-;31255:1;31861:7;;:19;;31853:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31255:1;31994:7;:18;;;;44466:10:::1;44478:11;35628:28;35659:8;35668:10;35659:20;;;;;;;;;;;;;;;;;;35628:51;;35702:8;:14;;;;;;;;;;;;35692:24;;;;;;;;:6;:24;;;;;;;;;35684:50;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;44498:28:::2;44529:8;44538:10;44529:20;;;;;;;;;;;;;;;;;;44498:51;;44554:15;44572:8;:15;;:23;44588:6;44572:23;;;;;;;;;;;;;;;:30;;;44554:48;;44625:1;44615:7;:11;44607:44;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;44656:23;44720:8;:21;;;44693:8;:23;;;44683:7;:33;44682:59;;;;;;44656:85;;44779:1;44746:8;:15;;:23;44762:6;44746:23;;;;;;;;;;;;;;;:30;;:34;;;;44817:15;44785:8;:28;44794:8;:18;;;;;;;;;;;;44785:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;44837:58;44851:8;:18;;;;;;;;;;;;44871:6;44879:15;44837:13;:58::i;:::-;44923:6;44905:51;;44911:10;44905:51;44931:7;44940:15;44905:51;;;;;;;;;;;;;;;;;;;;;;;;35739:1;;;32025::::1;;;31211::::0;32173:7;:22;;;;44379:582;;:::o;35361:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43771:603::-;31255:1;31861:7;;:19;;31853:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31255:1;31994:7;:18;;;;43835:10:::1;43847:11;35628:28;35659:8;35668:10;35659:20;;;;;;;;;;;;;;;;;;35628:51;;35702:8;:14;;;;;;;;;;;;35692:24;;;;;;;;:6;:24;;;;;;;;;35684:50;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;43867:28:::2;43898:8;43907:10;43898:20;;;;;;;;;;;;;;;;;;43867:51;;43923:15;43941:8;:15;;;43923:33;;43979:1;43969:7;:11;43961:44;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;44010:18;44049:4;44042:3;44032:7;:13;44031:22;;;;;;44010:43;;44058:18;44089:10;44079:7;:20;44058:41;;44122:1;44104:8;:15;;:19;;;;44163:7;44128:8;:31;44137:8;:21;;;;;;;;;;;;44128:31;;;;;;;;;;;;;;;;:42;;;;;;;;;;;44175:55;44189:8;:21;;;;;;;;;;;;44212:5;44219:10;44175:13;:55::i;:::-;44235:65;44249:8;:21;;;;;;;;;;;;44272:8;:15;;;;;;;;;;;;44289:10;44235:13;:65::i;:::-;44329:8;:15;;;;;;;;;;;;44310:59;;44317:10;44310:59;44346:10;44358;44310:59;;;;;;;;;;;;;;;;;;;;;;;;35739:1;;;;32025::::1;;;31211::::0;32173:7;:22;;;;43771:603;:::o;3082:244::-;2359:12;:10;:12::i;:::-;2349:22;;:6;;;;;;;;;;:22;;;2341:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3191:1:::1;3171:22;;:8;:22;;;;3163:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3281:8;3252:38;;3273:6;::::0;::::1;;;;;;;;3252:38;;;;;;;;;;;;3310:8;3301:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;3082:244:::0;:::o;35147:38::-;;;:::o;44966:648::-;45068:28;45099:8;45108:10;45099:20;;;;;;;;;;;;;;;;;;45068:51;;45146:11;45128:29;;;;;;;;:8;:14;;;;;;;;;;;;:29;;;;;;;;;45124:65;;45165:18;45172:10;45165:6;:18::i;:::-;45124:65;45215:1;45197:8;:15;;;:19;45193:55;;;45224:18;45231:10;45224:6;:18::i;:::-;45193:55;45288:1;45256:8;:15;;:22;45272:5;45256:22;;;;;;;;;;;;;;;:29;;;:33;45252:75;;;45297:24;45303:10;45315:5;45297;:24::i;:::-;45252:75;45377:1;45335:8;:15;;:32;45351:8;:15;;;;;;;;;;;;45335:32;;;;;;;;;;;;;;;:39;;;:43;45331:95;;;45386:34;45392:10;45404:8;:15;;;;;;;;;;;;45386:5;:34::i;:::-;45331:95;45435:10;45430:180;45456:7;;:14;;45451:2;:19;45430:180;;;45484:22;45509:7;;45517:2;45509:11;;;;;;;;;;;;;;;45484:36;;45563:1;45530:8;:15;;:23;45546:6;45530:23;;;;;;;;;;;;;;;:30;;;:34;45526:79;;;45573:25;45579:10;45591:6;45573:5;:25::i;:::-;45526:79;45430:180;45472:4;;;;;;;45430:180;;;;44966:648;;;;:::o;46528:246::-;46591:23;46629:12;46656:6;46645:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46623:85;;;;;;46764:4;46757;35101:8;46739:22;:29;;;;;;35101:8;46720:49;46713:56;;;46528:246;;;:::o;674:106::-;727:15;762:10;755:17;;674:106;:::o;33609:328::-;33694:13;33718:4;33694:29;;33732:6;:19;;;33752:5;33759:3;33764:8;33732:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33728:66;;;;;33776:7;;;33728:66;33855:6;:14;;;33870:5;33877:8;33855:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33891:6;:19;;;33911:5;33918:3;33923:8;33891:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33609:328;;;;;:::o;47653:215::-;47768:1;47750:20;;:6;:20;;;47746:118;;;47778:3;:12;;:21;47791:7;47778:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47746:118;;;47817:41;47845:3;47850:7;47824:6;47817:27;;;;:41;;;;;:::i;:::-;47746:118;47653:215;;;:::o;47873:387::-;48031:1;48013:20;;:6;:20;;;48009:247;;;48059:7;48049:6;:17;48041:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48109:4;48094:20;;:3;:20;;;48090:47;;48116:3;:12;;:21;48129:7;48116:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48090:47;48009:247;;;48173:1;48163:6;:11;48155:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48198:52;48230:5;48237:3;48242:7;48205:6;48198:31;;;;:52;;;;;;:::i;:::-;48009:247;47873:387;;;;;:::o;46779:646::-;46865:18;46892:28;46923:8;46932:10;46923:20;;;;;;;;;;;;;;;;;;46892:51;;46949:13;46964:19;46985:21;47008:17;47027:12;47054:8;:14;;47043:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46948:166;;;;;;;;;;47127:8;:19;;;;;;;;;;;;47119:36;;;47156:15;:22;47172:5;47156:22;;;;;;;;;;;;;;;;;;;;;47180:8;:16;;;47119:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47232:15;:22;47248:5;47232:22;;;;;;;;;;;;;;;;;;;;;47209:60;;;47270:8;:19;;;;;;;;;;;;47291:8;:16;;;47309:5;47316:7;35054:1;35101:8;47362:14;47378:8;:21;;;;;;;;;;;;47401:1;47404:9;47415:4;47209:211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47202:218;;;;;;;;46779:646;;;;:::o;47430:218::-;47489:16;47536:1;47518:20;;:6;:20;;;47514:130;;;47553:21;47546:28;;;;47514:130;47606:6;47599:24;;;47632:4;47599:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47592:46;;47430:218;;;;:::o;46146:377::-;46210:13;46227:17;46246:12;46273:6;;46262:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46209:116;;;;;;;;46372:1;46338:36;;:15;:22;46354:5;46338:22;;;;;;;;;;;;;;;;;;;;;:36;;;;46330:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46422:9;46408:10;:23;;:48;;;;;46448:8;46435:9;:21;;46408:48;46400:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46498:4;46490;:12;;46482:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46146:377;;;;;:::o;19224:177::-;19307:86;19327:5;19357:23;;;19382:2;19386:5;19334:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19307:19;:86::i;:::-;19224:177;;;:::o;19409:205::-;19510:96;19530:5;19560:27;;;19589:4;19595:2;19599:5;19537:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19510:19;:96::i;:::-;19409:205;;;;:::o;21529:761::-;21953:23;21979:69;22007:4;21979:69;;;;;;;;;;;;;;;;;21987:5;21979:27;;;;:69;;;;;:::i;:::-;21953:95;;22083:1;22063:10;:17;:21;22059:224;;;22205:10;22194:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22186:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22059:224;21529:761;;;:::o;15223:195::-;15326:12;15358:52;15380:6;15388:4;15394:1;15397:12;15358:21;:52::i;:::-;15351:59;;15223:195;;;;;:::o;16275:530::-;16402:12;16460:5;16435:21;:30;;16427:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16527:18;16538:6;16527:10;:18::i;:::-;16519:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16653:12;16667:23;16694:6;:11;;16714:5;16722:4;16694:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16652:75;;;;16745:52;16763:7;16772:10;16784:12;16745:17;:52::i;:::-;16738:59;;;;16275:530;;;;;;:::o;12305:422::-;12365:4;12573:12;12684:7;12672:20;12664:28;;12718:1;12711:4;:8;12704:15;;;12305:422;;;:::o;17811:742::-;17926:12;17955:7;17951:595;;;17986:10;17979:17;;;;17951:595;18120:1;18100:10;:17;:21;18096:439;;;18363:10;18357:17;18424:15;18411:10;18407:2;18403:19;18396:44;18311:148;18506:12;18499:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17811:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://12ca4acf2319dfd32a6b3abd6dd98182023211403fa53aa81abd2949b1d9f60a
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.