Token migration announcement. PRIMATE token contract has migrated to a new address.
ERC-20
Overview
Max Total Supply
2,060,000,000 PRIMATE
Holders
1,085 (0.00%)
Market
Price
$0.01 @ 0.000002 ETH (+0.63%)
Onchain Market Cap
$14,002,355.60
Circulating Supply Market Cap
$11,173,759.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
20,289 PRIMATEValue
$137.91 ( ~0.0413032148850736 Eth) [0.0010%]Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PrimateCoin
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-26 */ // Sources flattened with hardhat v2.6.4 https://hardhat.org // File @animoca/ethereum-contracts-core/contracts/metatx/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.8.0; /* * 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. */ abstract contract ManagedIdentity { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { return msg.data; } } // File @animoca/ethereum-contracts-core/contracts/access/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC-173 Contract Ownership Standard * Note: the ERC-165 identifier for this interface is 0x7f5828d0 */ interface IERC173 { /** * Event emited when ownership of a contract changes. * @param previousOwner the previous owner. * @param newOwner the new owner. */ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * Get the address of the owner * @return The address of the owner. */ function owner() external view returns (address); /** * Set the address of the new owner of the contract * Set newOwner to address(0) to renounce any ownership. * @dev Emits an {OwnershipTransferred} event. * @param newOwner The address of the new owner of the contract. Using the zero address means renouncing ownership. */ function transferOwnership(address newOwner) external; } // File @animoca/ethereum-contracts-core/contracts/access/[email protected] pragma solidity >=0.7.6 <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 ManagedIdentity, IERC173 { address internal _owner; /** * Initializes the contract, setting the deployer as the initial owner. * @dev Emits an {IERC173-OwnershipTransferred(address,address)} event. */ constructor(address owner_) { _owner = owner_; emit OwnershipTransferred(address(0), owner_); } /** * Gets the address of the current contract owner. */ function owner() public view virtual override returns (address) { return _owner; } /** * See {IERC173-transferOwnership(address)} * @dev Reverts if the sender is not the current contract owner. * @param newOwner the address of the new owner. Use the zero address to renounce the ownership. */ function transferOwnership(address newOwner) public virtual override { _requireOwnership(_msgSender()); _owner = newOwner; emit OwnershipTransferred(_owner, newOwner); } /** * @dev Reverts if `account` is not the contract owner. * @param account the account to test. */ function _requireOwnership(address account) internal virtual { require(account == this.owner(), "Ownable: not the owner"); } } // File @animoca/ethereum-contracts-core/contracts/utils/types/[email protected] // Partially derived from OpenZeppelin: // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/406c83649bd6169fc1b578e08506d78f0873b276/contracts/utils/Address.sol pragma solidity >=0.7.6 <0.8.0; /** * @dev Upgrades the address type to check if it is a contract. */ library AddressIsContract { /** * @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; assembly { size := extcodesize(account) } return size > 0; } } // File @animoca/ethereum-contracts-core/contracts/utils/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC20Wrapper * Wraps ERC20 functions to support non-standard implementations which do not return a bool value. * Calls to the wrapped functions revert only if they throw or if they return false. */ library ERC20Wrapper { using AddressIsContract for address; function wrappedTransfer( IWrappedERC20 token, address to, uint256 value ) internal { _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function wrappedTransferFrom( IWrappedERC20 token, address from, address to, uint256 value ) internal { _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function wrappedApprove( IWrappedERC20 token, address spender, uint256 value ) internal { _callWithOptionalReturnData(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function _callWithOptionalReturnData(IWrappedERC20 token, bytes memory callData) internal { address target = address(token); require(target.isContract(), "ERC20Wrapper: non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory data) = target.call(callData); if (success) { if (data.length != 0) { require(abi.decode(data, (bool)), "ERC20Wrapper: operation failed"); } } else { // revert using a standard revert message if (data.length == 0) { revert("ERC20Wrapper: operation failed"); } // revert using the revert message coming from the call assembly { let size := mload(data) revert(add(32, data), size) } } } } interface IWrappedERC20 { function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function approve(address spender, uint256 value) external returns (bool); } // File @animoca/ethereum-contracts-core/contracts/utils/[email protected] pragma solidity >=0.7.6 <0.8.0; abstract contract Recoverable is ManagedIdentity, Ownable { using ERC20Wrapper for IWrappedERC20; /** * Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts. * Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens * so that the extraction is limited to only amounts sent accidentally. * @dev Reverts if the sender is not the contract owner. * @dev Reverts if `accounts`, `tokens` and `amounts` do not have the same length. * @dev Reverts if one of `tokens` is does not implement the ERC20 transfer function. * @dev Reverts if one of the ERC20 transfers fail for any reason. * @param accounts the list of accounts to transfer the tokens to. * @param tokens the list of ERC20 token addresses. * @param amounts the list of token amounts to transfer. */ function recoverERC20s( address[] calldata accounts, address[] calldata tokens, uint256[] calldata amounts ) external virtual { _requireOwnership(_msgSender()); uint256 length = accounts.length; require(length == tokens.length && length == amounts.length, "Recov: inconsistent arrays"); for (uint256 i = 0; i != length; ++i) { IWrappedERC20(tokens[i]).wrappedTransfer(accounts[i], amounts[i]); } } /** * Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts. * Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens * so that the extraction is limited to only tokens sent accidentally. * @dev Reverts if the sender is not the contract owner. * @dev Reverts if `accounts`, `contracts` and `amounts` do not have the same length. * @dev Reverts if one of `contracts` is does not implement the ERC721 transferFrom function. * @dev Reverts if one of the ERC721 transfers fail for any reason. * @param accounts the list of accounts to transfer the tokens to. * @param contracts the list of ERC721 contract addresses. * @param tokenIds the list of token ids to transfer. */ function recoverERC721s( address[] calldata accounts, address[] calldata contracts, uint256[] calldata tokenIds ) external virtual { _requireOwnership(_msgSender()); uint256 length = accounts.length; require(length == contracts.length && length == tokenIds.length, "Recov: inconsistent arrays"); for (uint256 i = 0; i != length; ++i) { IRecoverableERC721(contracts[i]).transferFrom(address(this), accounts[i], tokenIds[i]); } } } interface IRecoverableERC721 { /// See {IERC721-transferFrom(address,address,uint256)} function transferFrom( address from, address to, uint256 tokenId ) external; } // File @animoca/ethereum-contracts-core/contracts/introspection/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165. */ 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 @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC20 Token Standard, basic interface. * @dev See https://eips.ethereum.org/EIPS/eip-20 * @dev Note: The ERC-165 identifier for this interface is 0x36372b07. */ interface IERC20 { /** * @dev Emitted when tokens are transferred, including zero value transfers. * @param _from The account where the transferred tokens are withdrawn from. * @param _to The account where the transferred tokens are deposited to. * @param _value The amount of tokens being transferred. */ event Transfer(address indexed _from, address indexed _to, uint256 _value); /** * @dev Emitted when a successful call to {IERC20-approve(address,uint256)} is made. * @param _owner The account granting an allowance to `_spender`. * @param _spender The account being granted an allowance from `_owner`. * @param _value The allowance amount being granted. */ event Approval(address indexed _owner, address indexed _spender, uint256 _value); /** * @notice Returns the total token supply. * @return The total token supply. */ function totalSupply() external view returns (uint256); /** * @notice Returns the account balance of another account with address `owner`. * @param owner The account whose balance will be returned. * @return The account balance of another account with address `owner`. */ function balanceOf(address owner) external view returns (uint256); /** * Transfers `value` amount of tokens to address `to`. * @dev Reverts if `to` is the zero address. * @dev Reverts if the sender does not have enough balance. * @dev Emits an {IERC20-Transfer} event. * @dev Transfers of 0 values are treated as normal transfers and fire the {IERC20-Transfer} event. * @param to The receiver account. * @param value The amount of tokens to transfer. * @return True if the transfer succeeds, false otherwise. */ function transfer(address to, uint256 value) external returns (bool); /** * @notice Transfers `value` amount of tokens from address `from` to address `to`. * @dev Reverts if `to` is the zero address. * @dev Reverts if `from` does not have at least `value` of balance. * @dev Reverts if the sender is not `from` and has not been approved by `from` for at least `value`. * @dev Emits an {IERC20-Transfer} event. * @dev Transfers of 0 values are treated as normal transfers and fire the {IERC20-Transfer} event. * @param from The emitter account. * @param to The receiver account. * @param value The amount of tokens to transfer. * @return True if the transfer succeeds, false otherwise. */ function transferFrom( address from, address to, uint256 value ) external returns (bool); /** * Sets `value` as the allowance from the caller to `spender`. * 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 * @dev Reverts if `spender` is the zero address. * @dev Emits the {IERC20-Approval} event. * @param spender The account being granted the allowance by the message caller. * @param value The allowance amount to grant. * @return True if the approval succeeds, false otherwise. */ function approve(address spender, uint256 value) external returns (bool); /** * Returns the amount which `spender` is allowed to spend on behalf of `owner`. * @param owner The account that has granted an allowance to `spender`. * @param spender The account that was granted an allowance by `owner`. * @return The amount which `spender` is allowed to spend on behalf of `owner`. */ function allowance(address owner, address spender) external view returns (uint256); } // File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC20 Token Standard, optional extension: Detailed. * @dev See https://eips.ethereum.org/EIPS/eip-20 * @dev Note: the ERC-165 identifier for this interface is 0xa219a025. */ interface IERC20Detailed { /** * Returns the name of the token. E.g. "My Token". * @return The name of the token. */ function name() external view returns (string memory); /** * Returns the symbol of the token. E.g. "HIX". * @return The symbol of the token. */ function symbol() external view returns (string memory); /** * Returns the number of decimals used to display the balances. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. * * @dev Note: This information is only used for _display_ purposes: it does not impact the arithmetic of the contract. * @return The number of decimals used to display the balances. */ function decimals() external view returns (uint8); } // File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC20 Token Standard, optional extension: Allowance. * @dev See https://eips.ethereum.org/EIPS/eip-20 * @dev Note: the ERC-165 identifier for this interface is 0x9d075186. */ interface IERC20Allowance { /** * Increases the allowance granted by the sender to `spender` by `value`. * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * @dev Reverts if `spender` is the zero address. * @dev Reverts if `spender`'s allowance overflows. * @dev Emits an {IERC20-Approval} event with an updated allowance for `spender`. * @param spender The account whose allowance is being increased by the message caller. * @param value The allowance amount increase. * @return True if the allowance increase succeeds, false otherwise. */ function increaseAllowance(address spender, uint256 value) external returns (bool); /** * Decreases the allowance granted by the sender to `spender` by `value`. * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * @dev Reverts if `spender` is the zero address. * @dev Reverts if `spender` has an allowance with the message caller for less than `value`. * @dev Emits an {IERC20-Approval} event with an updated allowance for `spender`. * @param spender The account whose allowance is being decreased by the message caller. * @param value The allowance amount decrease. * @return True if the allowance decrease succeeds, false otherwise. */ function decreaseAllowance(address spender, uint256 value) external returns (bool); } // File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC20 Token Standard, optional extension: Safe Transfers. * @dev See https://eips.ethereum.org/EIPS/eip-20 * @dev Note: the ERC-165 identifier for this interface is 0x53f41a97. */ interface IERC20SafeTransfers { /** * Transfers tokens from the caller to `to`. If this address is a contract, then calls `onERC20Received(address,address,uint256,bytes)` on it. * @dev Reverts if `to` is the zero address. * @dev Reverts if `value` is greater than the sender's balance. * @dev Reverts if `to` is a contract which does not implement `onERC20Received(address,address,uint256,bytes)`. * @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` returns a wrong value. * @dev Emits an {IERC20-Transfer} event. * @param to The address for the tokens to be transferred to. * @param amount The amount of tokens to be transferred. * @param data Optional additional data with no specified format, to be passed to the receiver contract. * @return true. */ function safeTransfer( address to, uint256 amount, bytes calldata data ) external returns (bool); /** * Transfers tokens from `from` to another address, using the allowance mechanism. * If this address is a contract, then calls `onERC20Received(address,address,uint256,bytes)` on it. * @dev Reverts if `to` is the zero address. * @dev Reverts if `value` is greater than `from`'s balance. * @dev Reverts if the sender does not have at least `value` allowance by `from`. * @dev Reverts if `to` is a contract which does not implement `onERC20Received(address,address,uint256,bytes)`. * @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` returns a wrong value. * @dev Emits an {IERC20-Transfer} event. * @param from The address which owns the tokens to be transferred. * @param to The address for the tokens to be transferred to. * @param amount The amount of tokens to be transferred. * @param data Optional additional data with no specified format, to be passed to the receiver contract. * @return true. */ function safeTransferFrom( address from, address to, uint256 amount, bytes calldata data ) external returns (bool); } // File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC20 Token Standard, optional extension: Batch Transfers. * @dev See https://eips.ethereum.org/EIPS/eip-20 * @dev Note: the ERC-165 identifier for this interface is 0xc05327e6. */ interface IERC20BatchTransfers { /** * Moves multiple `amounts` tokens from the caller's account to each of `recipients`. * @dev Reverts if `recipients` and `amounts` have different lengths. * @dev Reverts if one of `recipients` is the zero address. * @dev Reverts if the caller has an insufficient balance. * @dev Emits an {IERC20-Transfer} event for each individual transfer. * @param recipients the list of recipients to transfer the tokens to. * @param amounts the amounts of tokens to transfer to each of `recipients`. * @return a boolean value indicating whether the operation succeeded. */ function batchTransfer(address[] calldata recipients, uint256[] calldata amounts) external returns (bool); /** * Moves multiple `amounts` tokens from an account to each of `recipients`. * @dev Reverts if `recipients` and `amounts` have different lengths. * @dev Reverts if one of `recipients` is the zero address. * @dev Reverts if `from` has an insufficient balance. * @dev Reverts if the sender is not `from` and has an insufficient allowance. * @dev Emits an {IERC20-Transfer} event for each individual transfer. * @dev Emits an {IERC20-Approval} event. * @param from The address which owns the tokens to be transferred. * @param recipients the list of recipients to transfer the tokens to. * @param amounts the amounts of tokens to transfer to each of `recipients`. * @return a boolean value indicating whether the operation succeeded. */ function batchTransferFrom( address from, address[] calldata recipients, uint256[] calldata amounts ) external returns (bool); } // File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC20 Token Standard, ERC1046 optional extension: Metadata. * @dev See https://eips.ethereum.org/EIPS/eip-1046 * @dev Note: the ERC-165 identifier for this interface is 0x3c130d90. */ interface IERC20Metadata { /** * Returns a distinct Uniform Resource Identifier (URI) for the token metadata. * @return a distinct Uniform Resource Identifier (URI) for the token metadata. */ function tokenURI() external view returns (string memory); } // File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC20 Token Standard, ERC2612 optional extension: permit – 712-signed approvals * Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures. * @dev See https://eips.ethereum.org/EIPS/eip-2612 * @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da. */ interface IERC20Permit { /** * Sets `value` as the allowance of `spender` over the tokens of `owner`, given `owner` account's signed permit. * @dev WARNING: The standard ERC-20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114 * @dev Reverts if `owner` is the zero address. * @dev Reverts if the current blocktime is > `deadline`. * @dev Reverts if `r`, `s`, and `v` is not a valid `secp256k1` signature from `owner`. * @dev Emits an {IERC20-Approval} event. * @param owner The token owner granting the allowance to `spender`. * @param spender The token spender being granted the allowance by `owner`. * @param value The token amount of the allowance. * @param deadline The deadline from which the permit signature is no longer valid. * @param v Permit signature v parameter * @param r Permit signature r parameter. * @param s Permis signature s parameter. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * Returns the current permit nonce of `owner`. * @param owner the address to check the nonce of. * @return the current permit nonce of `owner`. */ function nonces(address owner) external view returns (uint256); /** * Returns the EIP-712 encoded hash struct of the domain-specific information for permits. * * @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is: * * keccak256( * abi.encode( * keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), * keccak256(bytes(name)), * keccak256(bytes(version)), * chainId, * address(this))) * * where * - `name` (string) is the ERC-20 token name. * - `version` (string) refers to the ERC-20 token contract version. * - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to. * - `verifyingContract` (address) is the ERC-20 token contract address. * * @return the EIP-712 encoded hash struct of the domain-specific information for permits. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC20 Token Standard, Tokens Receiver. * Interface for any contract that wants to support safeTransfers from ERC20 contracts with Safe Transfers extension. * @dev See https://eips.ethereum.org/EIPS/eip-20 * @dev Note: the ERC-165 identifier for this interface is 0x4fc35859. */ interface IERC20Receiver { /** * Handles the receipt of ERC20 tokens. * @param sender The initiator of the transfer. * @param from The address which transferred the tokens. * @param value The amount of tokens transferred. * @param data Optional additional data with no specified format. * @return bytes4 `bytes4(keccak256("onERC20Received(address,address,uint256,bytes)"))` */ function onERC20Received( address sender, address from, uint256 value, bytes calldata data ) external returns (bytes4); } // File @animoca/ethereum-contracts-assets/contracts/token/ERC20/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC20 Fungible Token Contract. */ contract ERC20 is ManagedIdentity, IERC165, IERC20, IERC20Detailed, IERC20Metadata, IERC20Allowance, IERC20BatchTransfers, IERC20SafeTransfers, IERC20Permit { using AddressIsContract for address; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)") bytes32 internal constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; uint256 public immutable deploymentChainId; // solhint-disable-next-line var-name-mixedcase bytes32 internal immutable _DOMAIN_SEPARATOR; /// @inheritdoc IERC20Permit mapping(address => uint256) public override nonces; string internal _name; string internal _symbol; uint8 internal immutable _decimals; string internal _tokenURI; mapping(address => uint256) internal _balances; mapping(address => mapping(address => uint256)) internal _allowances; uint256 internal _totalSupply; constructor( string memory name_, string memory symbol_, uint8 decimals_ ) { _name = name_; _symbol = symbol_; _decimals = decimals_; uint256 chainId; assembly { chainId := chainid() } deploymentChainId = chainId; _DOMAIN_SEPARATOR = _calculateDomainSeparator(chainId, bytes(name_)); } //======================================================= ERC165 ========================================================// /// @inheritdoc IERC165 function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId || interfaceId == type(IERC20).interfaceId || interfaceId == type(IERC20Detailed).interfaceId || interfaceId == type(IERC20Metadata).interfaceId || interfaceId == type(IERC20Allowance).interfaceId || interfaceId == type(IERC20BatchTransfers).interfaceId || interfaceId == type(IERC20SafeTransfers).interfaceId || interfaceId == type(IERC20Permit).interfaceId; } //======================================================== ERC20 ========================================================// /// @inheritdoc IERC20 function totalSupply() external view override returns (uint256) { return _totalSupply; } /// @inheritdoc IERC20 function balanceOf(address account) external view override returns (uint256) { return _balances[account]; } /// @inheritdoc IERC20 function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /// @inheritdoc IERC20 function approve(address spender, uint256 value) external virtual override returns (bool) { _approve(_msgSender(), spender, value); return true; } /// @inheritdoc IERC20 function transfer(address to, uint256 value) external virtual override returns (bool) { _transfer(_msgSender(), to, value); return true; } /// @inheritdoc IERC20 function transferFrom( address from, address to, uint256 value ) external virtual override returns (bool) { _transferFrom(_msgSender(), from, to, value); return true; } //==================================================== ERC20Detailed ====================================================// /// @inheritdoc IERC20Detailed function name() external view override returns (string memory) { return _name; } /// @inheritdoc IERC20Detailed function symbol() external view override returns (string memory) { return _symbol; } /// @inheritdoc IERC20Detailed function decimals() external view override returns (uint8) { return _decimals; } //==================================================== ERC20Metadata ====================================================// /// @inheritdoc IERC20Metadata function tokenURI() external view override returns (string memory) { return _tokenURI; } //=================================================== ERC20Allowance ====================================================// /// @inheritdoc IERC20Allowance function increaseAllowance(address spender, uint256 addedValue) external virtual override returns (bool) { require(spender != address(0), "ERC20: zero address spender"); address owner = _msgSender(); uint256 allowance_ = _allowances[owner][spender]; if (addedValue != 0) { uint256 newAllowance = allowance_ + addedValue; require(newAllowance > allowance_, "ERC20: allowance overflow"); _allowances[owner][spender] = newAllowance; allowance_ = newAllowance; } emit Approval(owner, spender, allowance_); return true; } /// @inheritdoc IERC20Allowance function decreaseAllowance(address spender, uint256 subtractedValue) external virtual override returns (bool) { require(spender != address(0), "ERC20: zero address spender"); _decreaseAllowance(_msgSender(), spender, subtractedValue); return true; } //================================================= ERC20BatchTransfers =================================================// /// @inheritdoc IERC20BatchTransfers function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual override returns (bool) { uint256 length = recipients.length; require(length == values.length, "ERC20: inconsistent arrays"); address sender = _msgSender(); uint256 balance = _balances[sender]; uint256 totalValue; uint256 selfTransferTotalValue; for (uint256 i; i != length; ++i) { address to = recipients[i]; require(to != address(0), "ERC20: to zero address"); uint256 value = values[i]; if (value != 0) { uint256 newTotalValue = totalValue + value; require(newTotalValue > totalValue, "ERC20: values overflow"); totalValue = newTotalValue; if (sender != to) { _balances[to] += value; } else { require(value <= balance, "ERC20: insufficient balance"); selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true } } emit Transfer(sender, to, value); } if (totalValue != 0 && totalValue != selfTransferTotalValue) { uint256 newBalance = balance - totalValue; require(newBalance < balance, "ERC20: insufficient balance"); // balance must be sufficient, including self-transfers _balances[sender] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance } return true; } /// @inheritdoc IERC20BatchTransfers function batchTransferFrom( address from, address[] calldata recipients, uint256[] calldata values ) external virtual override returns (bool) { uint256 length = recipients.length; require(length == values.length, "ERC20: inconsistent arrays"); uint256 balance = _balances[from]; uint256 totalValue; uint256 selfTransferTotalValue; for (uint256 i; i != length; ++i) { address to = recipients[i]; require(to != address(0), "ERC20: to zero address"); uint256 value = values[i]; if (value != 0) { uint256 newTotalValue = totalValue + value; require(newTotalValue > totalValue, "ERC20: values overflow"); totalValue = newTotalValue; if (from != to) { _balances[to] += value; } else { require(value <= balance, "ERC20: insufficient balance"); selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true } } emit Transfer(from, to, value); } if (totalValue != 0 && totalValue != selfTransferTotalValue) { uint256 newBalance = balance - totalValue; require(newBalance < balance, "ERC20: insufficient balance"); // balance must be sufficient, including self-transfers _balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance } address sender = _msgSender(); if (from != sender) { _decreaseAllowance(from, sender, totalValue); } return true; } //================================================= ERC20SafeTransfers ==================================================// /// @inheritdoc IERC20SafeTransfers function safeTransfer( address to, uint256 amount, bytes calldata data ) external virtual override returns (bool) { address sender = _msgSender(); _transfer(sender, to, amount); if (to.isContract()) { require(IERC20Receiver(to).onERC20Received(sender, sender, amount, data) == type(IERC20Receiver).interfaceId, "ERC20: transfer refused"); } return true; } /// @inheritdoc IERC20SafeTransfers function safeTransferFrom( address from, address to, uint256 amount, bytes calldata data ) external virtual override returns (bool) { address sender = _msgSender(); _transferFrom(sender, from, to, amount); if (to.isContract()) { require(IERC20Receiver(to).onERC20Received(sender, from, amount, data) == type(IERC20Receiver).interfaceId, "ERC20: transfer refused"); } return true; } //===================================================== ERC20Permit =====================================================// /// @inheritdoc IERC20Permit // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() public view override returns (bytes32) { uint256 chainId; assembly { chainId := chainid() } // recompute the domain separator in case of fork and chainid update return chainId == deploymentChainId ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId, bytes(_name)); } /// @inheritdoc IERC20Permit function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external virtual override { require(owner != address(0), "ERC20: zero address owner"); require(block.timestamp <= deadline, "ERC20: expired permit"); bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)); bytes32 hash = keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR(), hashStruct)); address signer = ecrecover(hash, v, r, s); require(signer == owner, "ERC20: invalid permit"); _approve(owner, spender, value); } //============================================ High-level Internal Functions ============================================// function _approve( address owner, address spender, uint256 value ) internal { require(spender != address(0), "ERC20: zero address spender"); _allowances[owner][spender] = value; emit Approval(owner, spender, value); } function _decreaseAllowance( address owner, address spender, uint256 subtractedValue ) internal { uint256 allowance_ = _allowances[owner][spender]; if (allowance_ != type(uint256).max && subtractedValue != 0) { // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717) uint256 newAllowance = allowance_ - subtractedValue; require(newAllowance < allowance_, "ERC20: insufficient allowance"); _allowances[owner][spender] = newAllowance; allowance_ = newAllowance; } emit Approval(owner, spender, allowance_); } function _transfer( address from, address to, uint256 value ) internal virtual { require(to != address(0), "ERC20: to zero address"); if (value != 0) { uint256 balance = _balances[from]; uint256 newBalance = balance - value; require(newBalance < balance, "ERC20: insufficient balance"); if (from != to) { _balances[from] = newBalance; _balances[to] += value; } } emit Transfer(from, to, value); } function _transferFrom( address sender, address from, address to, uint256 value ) internal { _transfer(from, to, value); if (from != sender) { _decreaseAllowance(from, sender, value); } } function _mint(address to, uint256 value) internal virtual { require(to != address(0), "ERC20: zero address"); uint256 supply = _totalSupply; if (value != 0) { uint256 newSupply = supply + value; require(newSupply > supply, "ERC20: supply overflow"); _totalSupply = newSupply; _balances[to] += value; // balance cannot overflow if supply does not } emit Transfer(address(0), to, value); } function _batchMint(address[] memory recipients, uint256[] memory values) internal virtual { uint256 length = recipients.length; require(length == values.length, "ERC20: inconsistent arrays"); uint256 totalValue; for (uint256 i; i != length; ++i) { address to = recipients[i]; require(to != address(0), "ERC20: zero address"); uint256 value = values[i]; if (value != 0) { uint256 newTotalValue = totalValue + value; require(newTotalValue > totalValue, "ERC20: values overflow"); totalValue = newTotalValue; _balances[to] += value; // balance cannot overflow if supply does not } emit Transfer(address(0), to, value); } if (totalValue != 0) { uint256 supply = _totalSupply; uint256 newSupply = supply + totalValue; require(newSupply > supply, "ERC20: supply overflow"); _totalSupply = newSupply; } } function _burn(address from, uint256 value) internal virtual { if (value != 0) { uint256 balance = _balances[from]; uint256 newBalance = balance - value; require(newBalance < balance, "ERC20: insufficient balance"); _balances[from] = newBalance; _totalSupply -= value; // will not underflow if balance does not } emit Transfer(from, address(0), value); } function _burnFrom(address from, uint256 value) internal virtual { _burn(from, value); address sender = _msgSender(); if (from != sender) { _decreaseAllowance(from, sender, value); } } function _batchBurnFrom(address[] memory owners, uint256[] memory values) internal virtual { uint256 length = owners.length; require(length == values.length, "ERC20: inconsistent arrays"); address sender = _msgSender(); uint256 totalValue; for (uint256 i; i != length; ++i) { address from = owners[i]; uint256 value = values[i]; if (value != 0) { uint256 balance = _balances[from]; uint256 newBalance = balance - value; require(newBalance < balance, "ERC20: insufficient balance"); _balances[from] = newBalance; totalValue += value; // totalValue cannot overflow if the individual balances do not underflow } emit Transfer(from, address(0), value); if (from != sender) { _decreaseAllowance(from, sender, value); } } if (totalValue != 0) { _totalSupply -= totalValue; // _totalSupply cannot underfow as balances do not underflow } } //============================================== Helper Internal Functions ==============================================// function _calculateDomainSeparator(uint256 chainId, bytes memory name_) private view returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(name_), keccak256("1"), chainId, address(this) ) ); } } // File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected] pragma solidity ^0.7.0; abstract contract UsingAppendedCallData { function _lastAppendedDataAsSender() internal pure virtual returns (address payable sender) { // Copied from openzeppelin : https://github.com/OpenZeppelin/openzeppelin-contracts/blob/9d5f77db9da0604ce0b25148898a94ae2c20d70f/contracts/metatx/ERC2771Context.sol1 // The assembly code is more direct than the Solidity version using `abi.decode`. // solhint-disable-next-line no-inline-assembly assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } function _msgDataAssuming20BytesAppendedData() internal pure virtual returns (bytes calldata) { return msg.data[:msg.data.length - 20]; } } // File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected] pragma solidity ^0.7.0; interface IERC2771 { function isTrustedForwarder(address forwarder) external view returns (bool); } // File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected] pragma solidity ^0.7.0; interface IForwarderRegistry { function isForwarderFor(address, address) external view returns (bool); } // File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected] pragma solidity ^0.7.0; abstract contract UsingUniversalForwarding is UsingAppendedCallData, IERC2771 { IForwarderRegistry internal immutable _forwarderRegistry; address internal immutable _universalForwarder; constructor(IForwarderRegistry forwarderRegistry, address universalForwarder) { _universalForwarder = universalForwarder; _forwarderRegistry = forwarderRegistry; } function isTrustedForwarder(address forwarder) external view virtual override returns (bool) { return forwarder == _universalForwarder || forwarder == address(_forwarderRegistry); } function _msgSender() internal view virtual returns (address payable) { address payable msgSender = msg.sender; address payable sender = _lastAppendedDataAsSender(); if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) { // if forwarder use appended data return sender; } // if msg.sender is neither the registry nor the universal forwarder, // we have to check the last 20bytes of the call data intepreted as an address // and check if the msg.sender was registered as forewarder for that address // we check tx.origin to save gas in case where msg.sender == tx.origin // solhint-disable-next-line avoid-tx-origin if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(sender, msgSender)) { return sender; } return msgSender; } function _msgData() internal view virtual returns (bytes calldata) { address payable msgSender = msg.sender; if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) { // if forwarder use appended data return _msgDataAssuming20BytesAppendedData(); } // we check tx.origin to save gas in case where msg.sender == tx.origin // solhint-disable-next-line avoid-tx-origin if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(_lastAppendedDataAsSender(), msgSender)) { return _msgDataAssuming20BytesAppendedData(); } return msg.data; } } // File contracts/token/erc20/PrimateCoin.sol pragma solidity >=0.7.6 <0.8.0; /** * @title PrimateCoin */ contract PrimateCoin is ERC20, UsingUniversalForwarding, Recoverable { string public constant NAME = "PRIMATE"; string public constant SYMBOL = "PRIMATE"; uint8 public constant DECIMALS = 18; /** * Constructor. * @dev Reverts if `values` and `recipients` have different lengths. * @dev Reverts if one of `recipients` is the zero address. * @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address. * @param recipients the accounts to deliver the tokens to. * @param values the amounts of tokens to mint to each of `recipients`. * @param forwarderRegistry Registry of approved meta-transaction forwarders. * @param universalForwarder Universal meta-transaction forwarder. */ constructor( address[] memory recipients, uint256[] memory values, IForwarderRegistry forwarderRegistry, address universalForwarder ) ERC20(NAME, SYMBOL, DECIMALS) UsingUniversalForwarding(forwarderRegistry, universalForwarder) Ownable(msg.sender) { _batchMint(recipients, values); } /** * Updates the URI of the token. * @dev Reverts if the sender is not the contract owner. * @param tokenURI_ the updated URI. */ function setTokenURI(string calldata tokenURI_) external { _requireOwnership(_msgSender()); _tokenURI = tokenURI_; } function _msgSender() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (address payable) { return UsingUniversalForwarding._msgSender(); } function _msgData() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (bytes memory ret) { return UsingUniversalForwarding._msgData(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"},{"internalType":"address","name":"universalForwarder","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","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":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYMBOL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deploymentChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101206040523480156200001257600080fd5b5060405162002e4338038062002e43833981810160405260808110156200003857600080fd5b81019080805160405193929190846401000000008211156200005957600080fd5b9083019060208201858111156200006f57600080fd5b82518660208202830111640100000000821117156200008d57600080fd5b82525081516020918201928201910280838360005b83811015620000bc578181015183820152602001620000a2565b5050505090500160405260200180516040519392919084640100000000821115620000e657600080fd5b908301906020820185811115620000fc57600080fd5b82518660208202830111640100000000821117156200011a57600080fd5b82525081516020918201928201910280838360005b83811015620001495781810151838201526020016200012f565b505050509190910160408181526020848101519482015182840183526007808552665052494d41544560c81b83860181815285518087019096529185529284019290925283519597509550339487945086939291601291620001ae9160019162000549565b508151620001c490600290602085019062000549565b507fff0000000000000000000000000000000000000000000000000000000000000060f882901b1660c05246608081905262000201818562000284565b60a05250505050606090811b6001600160601b03199081166101005291901b1660e052600780546001600160a01b0319166001600160a01b0383169081179091556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200027a84846200030e565b50505050620005f5565b8051602091820120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81850152808201929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015260808201939093523060a0808301919091528351808303909101815260c0909101909252815191012090565b81518151811462000366576040805162461bcd60e51b815260206004820152601a60248201527f45524332303a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b6000805b828114620004db5760008582815181106200038157fe5b6020026020010151905060006001600160a01b0316816001600160a01b03161415620003f4576040805162461bcd60e51b815260206004820152601360248201527f45524332303a207a65726f206164647265737300000000000000000000000000604482015290519081900360640190fd5b60008583815181106200040357fe5b60200260200101519050806000146200048f578381018481116200046e576040805162461bcd60e51b815260206004820152601660248201527f45524332303a2076616c756573206f766572666c6f7700000000000000000000604482015290519081900360640190fd5b6001600160a01b038316600090815260046020526040902080548301905593505b6040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350506001016200036a565b50801562000543576006548181018181116200053e576040805162461bcd60e51b815260206004820152601660248201527f45524332303a20737570706c79206f766572666c6f7700000000000000000000604482015290519081900360640190fd5b600655505b50505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620005815760008555620005cc565b82601f106200059c57805160ff1916838001178555620005cc565b82800160010185558215620005cc579182015b82811115620005cc578251825591602001919060010190620005af565b50620005da929150620005de565b5090565b5b80821115620005da5760008155600101620005df565b60805160a05160c05160f81c60e05160601c6101005160601c6127f162000652600039806111e652806123ef52508061122152806123b45280612447525080610c01525080610ceb525080610c285280611a2152506127f16000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806388d695b211610104578063c3666c36116100a2578063e0df5b6f11610071578063e0df5b6f14610932578063eb795549146109a0578063f2fde38b14610a23578063f76f8d78146106af576101da565b8063c3666c361461079d578063cd0d0096146108ab578063d505accf146108b3578063dd62ed3e14610904576101da565b8063a3f4df7e116100de578063a3f4df7e146106af578063a457c2d7146106b7578063a9059cbb146106e3578063b88d4fde1461070f576101da565b806388d695b2146105c55780638da5cb5b1461068357806395d89b41146106a7576101da565b80633644e5151161017c578063572b6c051161014b578063572b6c051461044357806370a082311461046957806373c8a9581461048f5780637ecebe001461059f576101da565b80633644e5151461033957806339509351146103415780633c130d901461036d5780634885b25414610375576101da565b806318160ddd116101b857806318160ddd146102c357806323b872dd146102dd5780632e0f262514610313578063313ce56714610331576101da565b806301ffc9a7146101df57806306fdde031461021a578063095ea7b314610297575b600080fd5b610206600480360360208110156101f557600080fd5b50356001600160e01b031916610a49565b604080519115158252519081900360200190f35b610222610b22565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025c578181015183820152602001610244565b50505050905090810190601f1680156102895780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610206600480360360408110156102ad57600080fd5b506001600160a01b038135169060200135610bb8565b6102cb610bd5565b60408051918252519081900360200190f35b610206600480360360608110156102f357600080fd5b506001600160a01b03813581169160208101359091169060400135610bdb565b61031b610bfa565b6040805160ff9092168252519081900360200190f35b61031b610bff565b6102cb610c23565b6102066004803603604081101561035757600080fd5b506001600160a01b038135169060200135610d11565b610222610e7f565b6102066004803603606081101561038b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156103b557600080fd5b8201836020820111156103c757600080fd5b803590602001918460208302840111600160201b831117156103e857600080fd5b919390929091602081019035600160201b81111561040557600080fd5b82018360208201111561041757600080fd5b803590602001918460208302840111600160201b8311171561043857600080fd5b509092509050610ee0565b6102066004803603602081101561045957600080fd5b50356001600160a01b03166111e2565b6102cb6004803603602081101561047f57600080fd5b50356001600160a01b031661125b565b61059d600480360360608110156104a557600080fd5b810190602081018135600160201b8111156104bf57600080fd5b8201836020820111156104d157600080fd5b803590602001918460208302840111600160201b831117156104f257600080fd5b919390929091602081019035600160201b81111561050f57600080fd5b82018360208201111561052157600080fd5b803590602001918460208302840111600160201b8311171561054257600080fd5b919390929091602081019035600160201b81111561055f57600080fd5b82018360208201111561057157600080fd5b803590602001918460208302840111600160201b8311171561059257600080fd5b509092509050611276565b005b6102cb600480360360208110156105b557600080fd5b50356001600160a01b0316611368565b610206600480360360408110156105db57600080fd5b810190602081018135600160201b8111156105f557600080fd5b82018360208201111561060757600080fd5b803590602001918460208302840111600160201b8311171561062857600080fd5b919390929091602081019035600160201b81111561064557600080fd5b82018360208201111561065757600080fd5b803590602001918460208302840111600160201b8311171561067857600080fd5b50909250905061137a565b61068b611657565b604080516001600160a01b039092168252519081900360200190f35b610222611666565b6102226116c4565b610206600480360360408110156106cd57600080fd5b506001600160a01b0381351690602001356116e7565b610206600480360360408110156106f957600080fd5b506001600160a01b038135169060200135611756565b6102066004803603608081101561072557600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561075f57600080fd5b82018360208201111561077157600080fd5b803590602001918460018302840111600160201b8311171561079257600080fd5b50909250905061176a565b61059d600480360360608110156107b357600080fd5b810190602081018135600160201b8111156107cd57600080fd5b8201836020820111156107df57600080fd5b803590602001918460208302840111600160201b8311171561080057600080fd5b919390929091602081019035600160201b81111561081d57600080fd5b82018360208201111561082f57600080fd5b803590602001918460208302840111600160201b8311171561085057600080fd5b919390929091602081019035600160201b81111561086d57600080fd5b82018360208201111561087f57600080fd5b803590602001918460208302840111600160201b831117156108a057600080fd5b5090925090506118d7565b6102cb611a1f565b61059d600480360360e08110156108c957600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611a43565b6102cb6004803603604081101561091a57600080fd5b506001600160a01b0381358116916020013516611c97565b61059d6004803603602081101561094857600080fd5b810190602081018135600160201b81111561096257600080fd5b82018360208201111561097457600080fd5b803590602001918460018302840111600160201b8311171561099557600080fd5b509092509050611cc2565b610206600480360360608110156109b657600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156109e557600080fd5b8201836020820111156109f757600080fd5b803590602001918460018302840111600160201b83111715610a1857600080fd5b509092509050611cde565b61059d60048036036020811015610a3957600080fd5b50356001600160a01b0316611e49565b60006001600160e01b031982166301ffc9a760e01b1480610a7a57506001600160e01b031982166336372b0760e01b145b80610a9557506001600160e01b0319821663a219a02560e01b145b80610ab057506001600160e01b031982166303c130d960e41b145b80610acb57506001600160e01b03198216634e83a8c360e11b145b80610ae657506001600160e01b0319821663602993f360e11b145b80610b0157506001600160e01b031982166353f41a9760e01b145b80610b1c57506001600160e01b03198216634ec7fbed60e11b145b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bad5780601f10610b8257610100808354040283529160200191610bad565b820191906000526020600020905b815481529060010190602001808311610b9057829003601f168201915b505050505090505b90565b6000610bcc610bc5611ea4565b8484611eb3565b50600192915050565b60065490565b6000610bf0610be8611ea4565b858585611f70565b5060019392505050565b601281565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610ce95760018054604080516020600284861615610100026000190190941693909304601f8101849004840282018401909252818152610ce493859391929091830182828015610cda5780601f10610caf57610100808354040283529160200191610cda565b820191906000526020600020905b815481529060010190602001808311610cbd57829003601f168201915b5050505050611fa5565b610d0b565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60006001600160a01b038316610d6e576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b6000610d78611ea4565b6001600160a01b038082166000908152600560209081526040808320938916835292905220549091508315610e2957808401818111610dfe576040805162461bcd60e51b815260206004820152601960248201527f45524332303a20616c6c6f77616e6365206f766572666c6f7700000000000000604482015290519081900360640190fd5b6001600160a01b038084166000908152600560209081526040808320938a1683529290522081905590505b846001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3506001949350505050565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bad5780601f10610b8257610100808354040283529160200191610bad565b600083828114610f37576040805162461bcd60e51b815260206004820152601a60248201527f45524332303a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b6001600160a01b0387166000908152600460205260408120549080805b8481146111295760008a8a83818110610f6957fe5b905060200201356001600160a01b0316905060006001600160a01b0316816001600160a01b03161415610fdc576040805162461bcd60e51b815260206004820152601660248201527545524332303a20746f207a65726f206164647265737360501b604482015290519081900360640190fd5b6000898984818110610fea57fe5b905060200201359050806000146110d45784810185811161104b576040805162461bcd60e51b815260206004820152601660248201527545524332303a2076616c756573206f766572666c6f7760501b604482015290519081900360640190fd5b809550826001600160a01b03168e6001600160a01b03161461108a576001600160a01b03831660009081526004602052604090208054830190556110d2565b868211156110cd576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b938101935b505b816001600160a01b03168d6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050600101610f54565b5081158015906111395750808214155b156111a157818303838110611183576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b6001600160a01b038b16600090815260046020526040902090820190555b60006111ab611ea4565b9050806001600160a01b03168b6001600160a01b0316146111d1576111d18b828561202f565b5060019a9950505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610b1c57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316149050919050565b6001600160a01b031660009081526004602052604090205490565b611286611281611ea4565b61213e565b84838114801561129557508082145b6112e6576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461135e576113568888838181106112ff57fe5b905060200201356001600160a01b031685858481811061131b57fe5b9050602002013588888581811061132e57fe5b905060200201356001600160a01b03166001600160a01b03166121fe9092919063ffffffff16565b6001016112e9565b5050505050505050565b60006020819052908152604090205481565b6000838281146113d1576040805162461bcd60e51b815260206004820152601a60248201527f45524332303a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60006113db611ea4565b6001600160a01b03811660009081526004602052604081205491925080805b8581146115cf5760008b8b8381811061140f57fe5b905060200201356001600160a01b0316905060006001600160a01b0316816001600160a01b03161415611482576040805162461bcd60e51b815260206004820152601660248201527545524332303a20746f207a65726f206164647265737360501b604482015290519081900360640190fd5b60008a8a8481811061149057fe5b9050602002013590508060001461157a578481018581116114f1576040805162461bcd60e51b815260206004820152601660248201527545524332303a2076616c756573206f766572666c6f7760501b604482015290519081900360640190fd5b809550826001600160a01b0316886001600160a01b031614611530576001600160a01b0383166000908152600460205260409020805483019055611578565b86821115611573576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b938101935b505b816001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350506001016113fa565b5081158015906115df5750808214155b1561164757818303838110611629576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b6001600160a01b038516600090815260046020526040902090820190555b5060019998505050505050505050565b6007546001600160a01b031690565b60028054604080516020601f6000196101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015610bad5780601f10610b8257610100808354040283529160200191610bad565b604051806040016040528060078152602001665052494d41544560c81b81525081565b60006001600160a01b038316611744576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b610bcc61174f611ea4565b848461202f565b6000610bcc611763611ea4565b8484612250565b600080611775611ea4565b905061178381888888611f70565b611795866001600160a01b031661239e565b156118ca57634fc3585960e01b6001600160e01b031916866001600160a01b0316634fc35859838a8989896040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b505050506040513d602081101561187257600080fd5b50516001600160e01b031916146118ca576040805162461bcd60e51b8152602060048201526017602482015276115490cc8c0e881d1c985b9cd9995c881c99599d5cd959604a1b604482015290519081900360640190fd5b5060019695505050505050565b6118e2611281611ea4565b8483811480156118f157508082145b611942576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461135e5785858281811061195857fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a8581811061198357fe5b905060200201356001600160a01b031687878681811061199f57fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156119fc57600080fd5b505af1158015611a10573d6000803e3d6000fd5b50505050806001019050611945565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b038716611a9e576040805162461bcd60e51b815260206004820152601960248201527f45524332303a207a65726f2061646472657373206f776e657200000000000000604482015290519081900360640190fd5b83421115611aeb576040805162461bcd60e51b8152602060048201526015602482015274115490cc8c0e88195e1c1a5c9959081c195c9b5a5d605a1b604482015290519081900360640190fd5b6001600160a01b0380881660008181526020818152604080832080546001810190915581517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98185015280830195909552948b166060850152608084018a905260a084019490945260c08084018990528451808503909101815260e09093019093528151919092012090611b7d610c23565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611c16573d6000803e3d6000fd5b505050602060405103519050896001600160a01b0316816001600160a01b031614611c80576040805162461bcd60e51b8152602060048201526015602482015274115490cc8c0e881a5b9d985b1a59081c195c9b5a5d605a1b604482015290519081900360640190fd5b611c8b8a8a8a611eb3565b50505050505050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b611ccd611281611ea4565b611cd9600383836126fa565b505050565b600080611ce9611ea4565b9050611cf6818787612250565b611d08866001600160a01b031661239e565b15611e3d57634fc3585960e01b6001600160e01b031916866001600160a01b0316634fc3585983848989896040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b158015611dbb57600080fd5b505af1158015611dcf573d6000803e3d6000fd5b505050506040513d6020811015611de557600080fd5b50516001600160e01b03191614611e3d576040805162461bcd60e51b8152602060048201526017602482015276115490cc8c0e881d1c985b9cd9995c881c99599d5cd959604a1b604482015290519081900360640190fd5b50600195945050505050565b611e54611281611ea4565b600780546001600160a01b0319166001600160a01b0383811691821792839055604051919216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6000611eae6123a4565b905090565b6001600160a01b038216611f0e576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b6001600160a01b03808416600081815260056020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b611f7b838383612250565b836001600160a01b0316836001600160a01b031614611f9f57611f9f83858361202f565b50505050565b8051602091820120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81850152808201929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015260808201939093523060a0808301919091528351808303909101815260c0909101909252815191012090565b6001600160a01b03808416600090815260056020908152604080832093861683529290522054600019811480159061206657508115155b156120ed578181038181106120c2576040805162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015290519081900360640190fd5b6001600160a01b03808616600090815260056020908152604080832093881683529290522081905590505b826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a350505050565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561217757600080fd5b505afa15801561218b573d6000803e3d6000fd5b505050506040513d60208110156121a157600080fd5b50516001600160a01b038281169116146121fb576040805162461bcd60e51b815260206004820152601660248201527527bbb730b136329d103737ba103a34329037bbb732b960511b604482015290519081900360640190fd5b50565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611cd9908490612504565b6001600160a01b0382166122a4576040805162461bcd60e51b815260206004820152601660248201527545524332303a20746f207a65726f206164647265737360501b604482015290519081900360640190fd5b801561234e576001600160a01b038316600090815260046020526040902054818103818110612308576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03161461234b576001600160a01b038086166000908152600460205260408082208490559186168152208054840190555b50505b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b3b151590565b600033816123b06126ee565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148061242357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b15612431579150610bb59050565b6001600160a01b03821632148015906124f057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156124c357600080fd5b505afa1580156124d7573d6000803e3d6000fd5b505050506040513d60208110156124ed57600080fd5b50515b156124fe579150610bb59050565b50905090565b816125176001600160a01b03821661239e565b612568576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b602083106125a55780518252601f199092019160209182019101612586565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612607576040519150601f19603f3d011682016040523d82523d6000602084013e61260c565b606091505b5091509150811561268b578051156126865780806020019051602081101561263357600080fd5b5051612686576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b6126e7565b80516126de576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b5050505050565b60131936013560601c90565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826127305760008555612776565b82601f106127495782800160ff19823516178555612776565b82800160010185558215612776579182015b8281111561277657823582559160200191906001019061275b565b50612782929150612786565b5090565b5b80821115612782576000815560010161278756fe45524332303a20696e73756666696369656e742062616c616e63650000000000a26469706673582212201f9c631b722e0bd11309a56d5c35d0eefcf0557bb95f5a05add164a843e69f7264736f6c634300070600330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000071bee13e92e64701b78f059801a70857e4683acd00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2000000000000000000000000000000000000000000000000000000000000000400000000000000000000000028ccf125b7751e830fc0f345690806905caa4e0a000000000000000000000000a62b87cd634fceab940361e6c9584d620e904e1100000000000000000000000041c517c9a1051da7704d8de3e6e642597d7e13fc00000000000000000000000088bb5b695535d7acb5970fe9f9e698d16f55bf160000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000c2632f86d61e22cb00000000000000000000000000000000000000000000000014adf4b7320334b90000000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000000a56fa5b99019a5c8000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806388d695b211610104578063c3666c36116100a2578063e0df5b6f11610071578063e0df5b6f14610932578063eb795549146109a0578063f2fde38b14610a23578063f76f8d78146106af576101da565b8063c3666c361461079d578063cd0d0096146108ab578063d505accf146108b3578063dd62ed3e14610904576101da565b8063a3f4df7e116100de578063a3f4df7e146106af578063a457c2d7146106b7578063a9059cbb146106e3578063b88d4fde1461070f576101da565b806388d695b2146105c55780638da5cb5b1461068357806395d89b41146106a7576101da565b80633644e5151161017c578063572b6c051161014b578063572b6c051461044357806370a082311461046957806373c8a9581461048f5780637ecebe001461059f576101da565b80633644e5151461033957806339509351146103415780633c130d901461036d5780634885b25414610375576101da565b806318160ddd116101b857806318160ddd146102c357806323b872dd146102dd5780632e0f262514610313578063313ce56714610331576101da565b806301ffc9a7146101df57806306fdde031461021a578063095ea7b314610297575b600080fd5b610206600480360360208110156101f557600080fd5b50356001600160e01b031916610a49565b604080519115158252519081900360200190f35b610222610b22565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025c578181015183820152602001610244565b50505050905090810190601f1680156102895780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610206600480360360408110156102ad57600080fd5b506001600160a01b038135169060200135610bb8565b6102cb610bd5565b60408051918252519081900360200190f35b610206600480360360608110156102f357600080fd5b506001600160a01b03813581169160208101359091169060400135610bdb565b61031b610bfa565b6040805160ff9092168252519081900360200190f35b61031b610bff565b6102cb610c23565b6102066004803603604081101561035757600080fd5b506001600160a01b038135169060200135610d11565b610222610e7f565b6102066004803603606081101561038b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156103b557600080fd5b8201836020820111156103c757600080fd5b803590602001918460208302840111600160201b831117156103e857600080fd5b919390929091602081019035600160201b81111561040557600080fd5b82018360208201111561041757600080fd5b803590602001918460208302840111600160201b8311171561043857600080fd5b509092509050610ee0565b6102066004803603602081101561045957600080fd5b50356001600160a01b03166111e2565b6102cb6004803603602081101561047f57600080fd5b50356001600160a01b031661125b565b61059d600480360360608110156104a557600080fd5b810190602081018135600160201b8111156104bf57600080fd5b8201836020820111156104d157600080fd5b803590602001918460208302840111600160201b831117156104f257600080fd5b919390929091602081019035600160201b81111561050f57600080fd5b82018360208201111561052157600080fd5b803590602001918460208302840111600160201b8311171561054257600080fd5b919390929091602081019035600160201b81111561055f57600080fd5b82018360208201111561057157600080fd5b803590602001918460208302840111600160201b8311171561059257600080fd5b509092509050611276565b005b6102cb600480360360208110156105b557600080fd5b50356001600160a01b0316611368565b610206600480360360408110156105db57600080fd5b810190602081018135600160201b8111156105f557600080fd5b82018360208201111561060757600080fd5b803590602001918460208302840111600160201b8311171561062857600080fd5b919390929091602081019035600160201b81111561064557600080fd5b82018360208201111561065757600080fd5b803590602001918460208302840111600160201b8311171561067857600080fd5b50909250905061137a565b61068b611657565b604080516001600160a01b039092168252519081900360200190f35b610222611666565b6102226116c4565b610206600480360360408110156106cd57600080fd5b506001600160a01b0381351690602001356116e7565b610206600480360360408110156106f957600080fd5b506001600160a01b038135169060200135611756565b6102066004803603608081101561072557600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561075f57600080fd5b82018360208201111561077157600080fd5b803590602001918460018302840111600160201b8311171561079257600080fd5b50909250905061176a565b61059d600480360360608110156107b357600080fd5b810190602081018135600160201b8111156107cd57600080fd5b8201836020820111156107df57600080fd5b803590602001918460208302840111600160201b8311171561080057600080fd5b919390929091602081019035600160201b81111561081d57600080fd5b82018360208201111561082f57600080fd5b803590602001918460208302840111600160201b8311171561085057600080fd5b919390929091602081019035600160201b81111561086d57600080fd5b82018360208201111561087f57600080fd5b803590602001918460208302840111600160201b831117156108a057600080fd5b5090925090506118d7565b6102cb611a1f565b61059d600480360360e08110156108c957600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611a43565b6102cb6004803603604081101561091a57600080fd5b506001600160a01b0381358116916020013516611c97565b61059d6004803603602081101561094857600080fd5b810190602081018135600160201b81111561096257600080fd5b82018360208201111561097457600080fd5b803590602001918460018302840111600160201b8311171561099557600080fd5b509092509050611cc2565b610206600480360360608110156109b657600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156109e557600080fd5b8201836020820111156109f757600080fd5b803590602001918460018302840111600160201b83111715610a1857600080fd5b509092509050611cde565b61059d60048036036020811015610a3957600080fd5b50356001600160a01b0316611e49565b60006001600160e01b031982166301ffc9a760e01b1480610a7a57506001600160e01b031982166336372b0760e01b145b80610a9557506001600160e01b0319821663a219a02560e01b145b80610ab057506001600160e01b031982166303c130d960e41b145b80610acb57506001600160e01b03198216634e83a8c360e11b145b80610ae657506001600160e01b0319821663602993f360e11b145b80610b0157506001600160e01b031982166353f41a9760e01b145b80610b1c57506001600160e01b03198216634ec7fbed60e11b145b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bad5780601f10610b8257610100808354040283529160200191610bad565b820191906000526020600020905b815481529060010190602001808311610b9057829003601f168201915b505050505090505b90565b6000610bcc610bc5611ea4565b8484611eb3565b50600192915050565b60065490565b6000610bf0610be8611ea4565b858585611f70565b5060019392505050565b601281565b7f000000000000000000000000000000000000000000000000000000000000001290565b6000467f00000000000000000000000000000000000000000000000000000000000000018114610ce95760018054604080516020600284861615610100026000190190941693909304601f8101849004840282018401909252818152610ce493859391929091830182828015610cda5780601f10610caf57610100808354040283529160200191610cda565b820191906000526020600020905b815481529060010190602001808311610cbd57829003601f168201915b5050505050611fa5565b610d0b565b7f8b85057b2108e0cd88ae3916c9df2f1e5f6ba370d24086199ba10ce6bce3163c5b91505090565b60006001600160a01b038316610d6e576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b6000610d78611ea4565b6001600160a01b038082166000908152600560209081526040808320938916835292905220549091508315610e2957808401818111610dfe576040805162461bcd60e51b815260206004820152601960248201527f45524332303a20616c6c6f77616e6365206f766572666c6f7700000000000000604482015290519081900360640190fd5b6001600160a01b038084166000908152600560209081526040808320938a1683529290522081905590505b846001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3506001949350505050565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bad5780601f10610b8257610100808354040283529160200191610bad565b600083828114610f37576040805162461bcd60e51b815260206004820152601a60248201527f45524332303a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b6001600160a01b0387166000908152600460205260408120549080805b8481146111295760008a8a83818110610f6957fe5b905060200201356001600160a01b0316905060006001600160a01b0316816001600160a01b03161415610fdc576040805162461bcd60e51b815260206004820152601660248201527545524332303a20746f207a65726f206164647265737360501b604482015290519081900360640190fd5b6000898984818110610fea57fe5b905060200201359050806000146110d45784810185811161104b576040805162461bcd60e51b815260206004820152601660248201527545524332303a2076616c756573206f766572666c6f7760501b604482015290519081900360640190fd5b809550826001600160a01b03168e6001600160a01b03161461108a576001600160a01b03831660009081526004602052604090208054830190556110d2565b868211156110cd576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b938101935b505b816001600160a01b03168d6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050600101610f54565b5081158015906111395750808214155b156111a157818303838110611183576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b6001600160a01b038b16600090815260046020526040902090820190555b60006111ab611ea4565b9050806001600160a01b03168b6001600160a01b0316146111d1576111d18b828561202f565b5060019a9950505050505050505050565b60007f00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad26001600160a01b0316826001600160a01b03161480610b1c57507f00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd6001600160a01b0316826001600160a01b0316149050919050565b6001600160a01b031660009081526004602052604090205490565b611286611281611ea4565b61213e565b84838114801561129557508082145b6112e6576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461135e576113568888838181106112ff57fe5b905060200201356001600160a01b031685858481811061131b57fe5b9050602002013588888581811061132e57fe5b905060200201356001600160a01b03166001600160a01b03166121fe9092919063ffffffff16565b6001016112e9565b5050505050505050565b60006020819052908152604090205481565b6000838281146113d1576040805162461bcd60e51b815260206004820152601a60248201527f45524332303a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60006113db611ea4565b6001600160a01b03811660009081526004602052604081205491925080805b8581146115cf5760008b8b8381811061140f57fe5b905060200201356001600160a01b0316905060006001600160a01b0316816001600160a01b03161415611482576040805162461bcd60e51b815260206004820152601660248201527545524332303a20746f207a65726f206164647265737360501b604482015290519081900360640190fd5b60008a8a8481811061149057fe5b9050602002013590508060001461157a578481018581116114f1576040805162461bcd60e51b815260206004820152601660248201527545524332303a2076616c756573206f766572666c6f7760501b604482015290519081900360640190fd5b809550826001600160a01b0316886001600160a01b031614611530576001600160a01b0383166000908152600460205260409020805483019055611578565b86821115611573576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b938101935b505b816001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350506001016113fa565b5081158015906115df5750808214155b1561164757818303838110611629576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b6001600160a01b038516600090815260046020526040902090820190555b5060019998505050505050505050565b6007546001600160a01b031690565b60028054604080516020601f6000196101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015610bad5780601f10610b8257610100808354040283529160200191610bad565b604051806040016040528060078152602001665052494d41544560c81b81525081565b60006001600160a01b038316611744576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b610bcc61174f611ea4565b848461202f565b6000610bcc611763611ea4565b8484612250565b600080611775611ea4565b905061178381888888611f70565b611795866001600160a01b031661239e565b156118ca57634fc3585960e01b6001600160e01b031916866001600160a01b0316634fc35859838a8989896040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b505050506040513d602081101561187257600080fd5b50516001600160e01b031916146118ca576040805162461bcd60e51b8152602060048201526017602482015276115490cc8c0e881d1c985b9cd9995c881c99599d5cd959604a1b604482015290519081900360640190fd5b5060019695505050505050565b6118e2611281611ea4565b8483811480156118f157508082145b611942576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461135e5785858281811061195857fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a8581811061198357fe5b905060200201356001600160a01b031687878681811061199f57fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156119fc57600080fd5b505af1158015611a10573d6000803e3d6000fd5b50505050806001019050611945565b7f000000000000000000000000000000000000000000000000000000000000000181565b6001600160a01b038716611a9e576040805162461bcd60e51b815260206004820152601960248201527f45524332303a207a65726f2061646472657373206f776e657200000000000000604482015290519081900360640190fd5b83421115611aeb576040805162461bcd60e51b8152602060048201526015602482015274115490cc8c0e88195e1c1a5c9959081c195c9b5a5d605a1b604482015290519081900360640190fd5b6001600160a01b0380881660008181526020818152604080832080546001810190915581517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98185015280830195909552948b166060850152608084018a905260a084019490945260c08084018990528451808503909101815260e09093019093528151919092012090611b7d610c23565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611c16573d6000803e3d6000fd5b505050602060405103519050896001600160a01b0316816001600160a01b031614611c80576040805162461bcd60e51b8152602060048201526015602482015274115490cc8c0e881a5b9d985b1a59081c195c9b5a5d605a1b604482015290519081900360640190fd5b611c8b8a8a8a611eb3565b50505050505050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b611ccd611281611ea4565b611cd9600383836126fa565b505050565b600080611ce9611ea4565b9050611cf6818787612250565b611d08866001600160a01b031661239e565b15611e3d57634fc3585960e01b6001600160e01b031916866001600160a01b0316634fc3585983848989896040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b158015611dbb57600080fd5b505af1158015611dcf573d6000803e3d6000fd5b505050506040513d6020811015611de557600080fd5b50516001600160e01b03191614611e3d576040805162461bcd60e51b8152602060048201526017602482015276115490cc8c0e881d1c985b9cd9995c881c99599d5cd959604a1b604482015290519081900360640190fd5b50600195945050505050565b611e54611281611ea4565b600780546001600160a01b0319166001600160a01b0383811691821792839055604051919216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6000611eae6123a4565b905090565b6001600160a01b038216611f0e576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b6001600160a01b03808416600081815260056020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b611f7b838383612250565b836001600160a01b0316836001600160a01b031614611f9f57611f9f83858361202f565b50505050565b8051602091820120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81850152808201929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015260808201939093523060a0808301919091528351808303909101815260c0909101909252815191012090565b6001600160a01b03808416600090815260056020908152604080832093861683529290522054600019811480159061206657508115155b156120ed578181038181106120c2576040805162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015290519081900360640190fd5b6001600160a01b03808616600090815260056020908152604080832093881683529290522081905590505b826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a350505050565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561217757600080fd5b505afa15801561218b573d6000803e3d6000fd5b505050506040513d60208110156121a157600080fd5b50516001600160a01b038281169116146121fb576040805162461bcd60e51b815260206004820152601660248201527527bbb730b136329d103737ba103a34329037bbb732b960511b604482015290519081900360640190fd5b50565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611cd9908490612504565b6001600160a01b0382166122a4576040805162461bcd60e51b815260206004820152601660248201527545524332303a20746f207a65726f206164647265737360501b604482015290519081900360640190fd5b801561234e576001600160a01b038316600090815260046020526040902054818103818110612308576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03161461234b576001600160a01b038086166000908152600460205260408082208490559186168152208054840190555b50505b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b3b151590565b600033816123b06126ee565b90507f00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd6001600160a01b0316826001600160a01b0316148061242357507f00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad26001600160a01b0316826001600160a01b0316145b15612431579150610bb59050565b6001600160a01b03821632148015906124f057507f00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd6001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156124c357600080fd5b505afa1580156124d7573d6000803e3d6000fd5b505050506040513d60208110156124ed57600080fd5b50515b156124fe579150610bb59050565b50905090565b816125176001600160a01b03821661239e565b612568576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b602083106125a55780518252601f199092019160209182019101612586565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612607576040519150601f19603f3d011682016040523d82523d6000602084013e61260c565b606091505b5091509150811561268b578051156126865780806020019051602081101561263357600080fd5b5051612686576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b6126e7565b80516126de576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b5050505050565b60131936013560601c90565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826127305760008555612776565b82601f106127495782800160ff19823516178555612776565b82800160010185558215612776579182015b8281111561277657823582559160200191906001019061275b565b50612782929150612786565b5090565b5b80821115612782576000815560010161278756fe45524332303a20696e73756666696369656e742062616c616e63650000000000a26469706673582212201f9c631b722e0bd11309a56d5c35d0eefcf0557bb95f5a05add164a843e69f7264736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000071bee13e92e64701b78f059801a70857e4683acd00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2000000000000000000000000000000000000000000000000000000000000000400000000000000000000000028ccf125b7751e830fc0f345690806905caa4e0a000000000000000000000000a62b87cd634fceab940361e6c9584d620e904e1100000000000000000000000041c517c9a1051da7704d8de3e6e642597d7e13fc00000000000000000000000088bb5b695535d7acb5970fe9f9e698d16f55bf160000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000c2632f86d61e22cb00000000000000000000000000000000000000000000000014adf4b7320334b90000000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000000a56fa5b99019a5c8000000
-----Decoded View---------------
Arg [0] : recipients (address[]): 0x28CCF125B7751e830FC0f345690806905CAA4E0a,0xa62b87cd634fCeab940361e6C9584d620E904e11,0x41c517C9A1051da7704D8DE3e6e642597D7e13FC,0x88BB5B695535D7ACb5970FE9F9E698d16f55bf16
Arg [1] : values (uint256[]): 235000000000000000000000000,25000000000000000000000000,1600000000000000000000000000,200000000000000000000000000
Arg [2] : forwarderRegistry (address): 0x71beE13E92e64701b78f059801A70857E4683ACd
Arg [3] : universalForwarder (address): 0x56133a31F4cD01EDe8c6EE780071c021bd324aD2
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd
Arg [3] : 00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 00000000000000000000000028ccf125b7751e830fc0f345690806905caa4e0a
Arg [6] : 000000000000000000000000a62b87cd634fceab940361e6c9584d620e904e11
Arg [7] : 00000000000000000000000041c517c9a1051da7704d8de3e6e642597d7e13fc
Arg [8] : 00000000000000000000000088bb5b695535d7acb5970fe9f9e698d16f55bf16
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [10] : 000000000000000000000000000000000000000000c2632f86d61e22cb000000
Arg [11] : 00000000000000000000000000000000000000000014adf4b7320334b9000000
Arg [12] : 0000000000000000000000000000000000000000052b7d2dcc80cd2e40000000
Arg [13] : 000000000000000000000000000000000000000000a56fa5b99019a5c8000000
Deployed Bytecode Sourcemap
49823:1821:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29967:620;;;;;;;;;;;;;;;;-1:-1:-1;29967:620:0;-1:-1:-1;;;;;;29967:620:0;;:::i;:::-;;;;;;;;;;;;;;;;;;32036:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31236:169;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31236:169:0;;;;;;;;:::i;30754:102::-;;;:::i;:::-;;;;;;;;;;;;;;;;31638:223;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31638:223:0;;;;;;;;;;;;;;;;;:::i;49993:35::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32316:94;;;:::i;38896:361::-;;;:::i;32863:638::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32863:638:0;;;;;;;;:::i;32585:102::-;;;:::i;35704:1801::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35704:1801:0;;;;;;;;;;;;;;;-1:-1:-1;;;35704:1801:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35704:1801:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35704:1801:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35704:1801:0;;;;;;;;;;-1:-1:-1;35704:1801:0;;-1:-1:-1;35704:1801:0;-1:-1:-1;35704:1801:0;:::i;47877:195::-;;;;;;;;;;;;;;;;-1:-1:-1;47877:195:0;-1:-1:-1;;;;;47877:195:0;;:::i;30892:121::-;;;;;;;;;;;;;;;;-1:-1:-1;30892:121:0;-1:-1:-1;;;;;30892:121:0;;:::i;8513:492::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8513:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8513:492:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8513:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8513:492:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8513:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8513:492:0;;;;;;;;;;-1:-1:-1;8513:492:0;;-1:-1:-1;8513:492:0;-1:-1:-1;8513:492:0;:::i;:::-;;29032:50;;;;;;;;;;;;;;;;-1:-1:-1;29032:50:0;-1:-1:-1;;;;;29032:50:0;;:::i;34008:1646::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34008:1646:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34008:1646:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34008:1646:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34008:1646:0;;;;;;;;;;-1:-1:-1;34008:1646:0;;-1:-1:-1;34008:1646:0;-1:-1:-1;34008:1646:0;:::i;2876:96::-;;;:::i;:::-;;;;-1:-1:-1;;;;;2876:96:0;;;;;;;;;;;;;;32174:98;;;:::i;49899:39::-;;;:::i;33546:281::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33546:281:0;;;;;;;;:::i;31441:161::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31441:161:0;;;;;;;;:::i;38184:485::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38184:485:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38184:485:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38184:485:0;;;;;;;;;;-1:-1:-1;38184:485:0;;-1:-1:-1;38184:485:0;-1:-1:-1;38184:485:0;:::i;9831:522::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9831:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9831:522:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9831:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9831:522:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9831:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9831:522:0;;;;;;;;;;-1:-1:-1;9831:522:0;;-1:-1:-1;9831:522:0;-1:-1:-1;9831:522:0;:::i;28841:42::-;;;:::i;39299:727::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39299:727:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31049:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31049:151:0;;;;;;;;;;:::i;51119:139::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51119:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51119:139:0;;;;;;;;;;-1:-1:-1;51119:139:0;;-1:-1:-1;51119:139:0;-1:-1:-1;51119:139:0;:::i;37685:450::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37685:450:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37685:450:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37685:450:0;;;;;;;;;;-1:-1:-1;37685:450:0;;-1:-1:-1;37685:450:0;-1:-1:-1;37685:450:0;:::i;3219:201::-;;;;;;;;;;;;;;;;-1:-1:-1;3219:201:0;-1:-1:-1;;;;;3219:201:0;;:::i;29967:620::-;30052:4;-1:-1:-1;;;;;;30089:40:0;;-1:-1:-1;;;30089:40:0;;:96;;-1:-1:-1;;;;;;;30146:39:0;;-1:-1:-1;;;30146:39:0;30089:96;:160;;;-1:-1:-1;;;;;;;30202:47:0;;-1:-1:-1;;;30202:47:0;30089:160;:224;;;-1:-1:-1;;;;;;;30266:47:0;;-1:-1:-1;;;30266:47:0;30089:224;:289;;;-1:-1:-1;;;;;;;30330:48:0;;-1:-1:-1;;;30330:48:0;30089:289;:359;;;-1:-1:-1;;;;;;;30395:53:0;;-1:-1:-1;;;30395:53:0;30089:359;:428;;;-1:-1:-1;;;;;;;30465:52:0;;-1:-1:-1;;;30465:52:0;30089:428;:490;;;-1:-1:-1;;;;;;;30534:45:0;;-1:-1:-1;;;30534:45:0;30089:490;30069:510;29967:620;-1:-1:-1;;29967:620:0:o;32036:94::-;32117:5;32110:12;;;;;;;;-1:-1:-1;;32110:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32084:13;;32110:12;;32117:5;;32110:12;;32117:5;32110:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32036:94;;:::o;31236:169::-;31320:4;31337:38;31346:12;:10;:12::i;:::-;31360:7;31369:5;31337:8;:38::i;:::-;-1:-1:-1;31393:4:0;31236:169;;;;:::o;30754:102::-;30836:12;;30754:102;:::o;31638:223::-;31770:4;31787:44;31801:12;:10;:12::i;:::-;31815:4;31821:2;31825:5;31787:13;:44::i;:::-;-1:-1:-1;31849:4:0;31638:223;;;;;:::o;49993:35::-;50026:2;49993:35;:::o;32316:94::-;32393:9;32316:94;:::o;38896:361::-;38954:7;39035:9;39161:17;39150:28;;:99;;39242:5;39201:48;;;;;;;;;;;;;-1:-1:-1;;39201:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39227:7;;39201:48;;39242:5;;39201:48;;39242:5;39201:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;:48::i;:::-;39150:99;;;39181:17;39150:99;39143:106;;;38896:361;:::o;32863:638::-;32962:4;-1:-1:-1;;;;;32987:21:0;;32979:61;;;;;-1:-1:-1;;;32979:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33051:13;33067:12;:10;:12::i;:::-;-1:-1:-1;;;;;33111:18:0;;;33090;33111;;;:11;:18;;;;;;;;:27;;;;;;;;;;33051:28;;-1:-1:-1;33153:15:0;;33149:269;;33208:23;;;33254:25;;;33246:63;;;;;-1:-1:-1;;;33246:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33324:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:42;;;33354:12;-1:-1:-1;33149:269:0;33449:7;-1:-1:-1;;;;;33433:36:0;33442:5;-1:-1:-1;;;;;33433:36:0;;33458:10;33433:36;;;;;;;;;;;;;;;;;;-1:-1:-1;33489:4:0;;32863:638;-1:-1:-1;;;;32863:638:0:o;32585:102::-;32670:9;32663:16;;;;;;;;-1:-1:-1;;32663:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32637:13;;32663:16;;32670:9;;32663:16;;32670:9;32663:16;;;;;;;;;;;;;;;;;;;;;;;;35704:1801;35872:4;35906:10;35942:23;;;35934:62;;;;;-1:-1:-1;;;35934:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36027:15:0;;36009;36027;;;:9;:15;;;;;;;36009;;36125:810;36146:6;36141:1;:11;36125:810;;36174:10;36187;;36198:1;36187:13;;;;;;;;;;;;;-1:-1:-1;;;;;36187:13:0;36174:26;;36237:1;-1:-1:-1;;;;;36223:16:0;:2;-1:-1:-1;;;;;36223:16:0;;;36215:51;;;;;-1:-1:-1;;;36215:51:0;;;;;;;;;;;;-1:-1:-1;;;36215:51:0;;;;;;;;;;;;;;;36283:13;36299:6;;36306:1;36299:9;;;;;;;;;;;;;36283:25;;36329:5;36338:1;36329:10;36325:552;;36384:18;;;36429:26;;;36421:61;;;;;-1:-1:-1;;;36421:61:0;;;;;;;;;;;;-1:-1:-1;;;36421:61:0;;;;;;;;;;;;;;;36514:13;36501:26;;36558:2;-1:-1:-1;;;;;36550:10:0;:4;-1:-1:-1;;;;;36550:10:0;;36546:316;;-1:-1:-1;;;;;36585:13:0;;;;;;:9;:13;;;;;:22;;;;;;36546:316;;;36673:7;36664:5;:16;;36656:56;;;;;-1:-1:-1;;;36656:56:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36656:56:0;;;;;;;;;;;;;;;36735:31;;;;36546:316;36325:552;;36913:2;-1:-1:-1;;;;;36898:25:0;36907:4;-1:-1:-1;;;;;36898:25:0;;36917:5;36898:25;;;;;;;;;;;;;;;;;;-1:-1:-1;;36154:3:0;;36125:810;;;-1:-1:-1;36951:15:0;;;;;:55;;;36984:22;36970:10;:36;;36951:55;36947:384;;;37044:20;;;37087;;;37079:60;;;;;-1:-1:-1;;;37079:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37079:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37210:15:0;;;;;;:9;:15;;;;;37228:35;;;37210:53;;36947:384;37343:14;37360:12;:10;:12::i;:::-;37343:29;;37395:6;-1:-1:-1;;;;;37387:14:0;:4;-1:-1:-1;;;;;37387:14:0;;37383:91;;37418:44;37437:4;37443:6;37451:10;37418:18;:44::i;:::-;-1:-1:-1;37493:4:0;;35704:1801;-1:-1:-1;;;;;;;;;;35704:1801:0:o;47877:195::-;47964:4;48001:19;-1:-1:-1;;;;;47988:32:0;:9;-1:-1:-1;;;;;47988:32:0;;:76;;;;48045:18;-1:-1:-1;;;;;48024:40:0;:9;-1:-1:-1;;;;;48024:40:0;;47981:83;;47877:195;;;:::o;30892:121::-;-1:-1:-1;;;;;30987:18:0;30960:7;30987:18;;;:9;:18;;;;;;;30892:121::o;8513:492::-;8682:31;8700:12;:10;:12::i;:::-;8682:17;:31::i;:::-;8741:8;8775:23;;;:51;;;;-1:-1:-1;8802:24:0;;;8775:51;8767:90;;;;;-1:-1:-1;;;8767:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8873:9;8868:130;8893:6;8888:1;:11;8868:130;;8921:65;8962:8;;8971:1;8962:11;;;;;;;;;;;;;-1:-1:-1;;;;;8962:11:0;8975:7;;8983:1;8975:10;;;;;;;;;;;;;8935:6;;8942:1;8935:9;;;;;;;;;;;;;-1:-1:-1;;;;;8935:9:0;-1:-1:-1;;;;;8921:40:0;;;:65;;;;;:::i;:::-;8901:3;;8868:130;;;;8513:492;;;;;;;:::o;29032:50::-;;;;;;;;;;;;;;:::o;34008:1646::-;34124:4;34158:10;34194:23;;;34186:62;;;;;-1:-1:-1;;;34186:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34259:14;34276:12;:10;:12::i;:::-;-1:-1:-1;;;;;34317:17:0;;34299:15;34317:17;;;:9;:17;;;;;;34259:29;;-1:-1:-1;34299:15:0;;34417:810;34438:6;34433:1;:11;34417:810;;34466:10;34479;;34490:1;34479:13;;;;;;;;;;;;;-1:-1:-1;;;;;34479:13:0;34466:26;;34529:1;-1:-1:-1;;;;;34515:16:0;:2;-1:-1:-1;;;;;34515:16:0;;;34507:51;;;;;-1:-1:-1;;;34507:51:0;;;;;;;;;;;;-1:-1:-1;;;34507:51:0;;;;;;;;;;;;;;;34575:13;34591:6;;34598:1;34591:9;;;;;;;;;;;;;34575:25;;34619:5;34628:1;34619:10;34615:554;;34674:18;;;34719:26;;;34711:61;;;;;-1:-1:-1;;;34711:61:0;;;;;;;;;;;;-1:-1:-1;;;34711:61:0;;;;;;;;;;;;;;;34804:13;34791:26;;34850:2;-1:-1:-1;;;;;34840:12:0;:6;-1:-1:-1;;;;;34840:12:0;;34836:318;;-1:-1:-1;;;;;34877:13:0;;;;;;:9;:13;;;;;:22;;;;;;34836:318;;;34965:7;34956:5;:16;;34948:56;;;;;-1:-1:-1;;;34948:56:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34948:56:0;;;;;;;;;;;;;;;35027:31;;;;34836:318;34615:554;;35205:2;-1:-1:-1;;;;;35188:27:0;35197:6;-1:-1:-1;;;;;35188:27:0;;35209:5;35188:27;;;;;;;;;;;;;;;;;;-1:-1:-1;;34446:3:0;;34417:810;;;-1:-1:-1;35243:15:0;;;;;:55;;;35276:22;35262:10;:36;;35243:55;35239:386;;;35336:20;;;35379;;;35371:60;;;;;-1:-1:-1;;;35371:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35371:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35502:17:0;;;;;;:9;:17;;;;;35522:35;;;35502:55;;35239:386;-1:-1:-1;35642:4:0;;34008:1646;-1:-1:-1;;;;;;;;;34008:1646:0:o;2876:96::-;2958:6;;-1:-1:-1;;;;;2958:6:0;2876:96;:::o;32174:98::-;32257:7;32250:14;;;;;;;-1:-1:-1;;32250:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32224:13;;32250:14;;32257:7;;32250:14;;32257:7;32250:14;;;;;;;;;;;;;;;;;;;;;;;;49899:39;;;;;;;;;;;;;;-1:-1:-1;;;49899:39:0;;;;:::o;33546:281::-;33650:4;-1:-1:-1;;;;;33675:21:0;;33667:61;;;;;-1:-1:-1;;;33667:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33739:58;33758:12;:10;:12::i;:::-;33772:7;33781:15;33739:18;:58::i;31441:161::-;31521:4;31538:34;31548:12;:10;:12::i;:::-;31562:2;31566:5;31538:9;:34::i;38184:485::-;38351:4;38368:14;38385:12;:10;:12::i;:::-;38368:29;;38408:39;38422:6;38430:4;38436:2;38440:6;38408:13;:39::i;:::-;38462:15;:2;-1:-1:-1;;;;;38462:13:0;;:15::i;:::-;38458:182;;;-1:-1:-1;;;;;;;;38502:98:0;;38517:2;-1:-1:-1;;;;;38502:34:0;;38537:6;38545:4;38551:6;38559:4;;38502:62;;;;;;;;;;;;;-1:-1:-1;;;;;38502:62:0;;;;;;-1:-1:-1;;;;;38502:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38502:62:0;-1:-1:-1;;;;;;38502:98:0;;38494:134;;;;;-1:-1:-1;;;38494:134:0;;;;;;;;;;;;-1:-1:-1;;;38494:134:0;;;;;;;;;;;;;;;-1:-1:-1;38657:4:0;;38184:485;-1:-1:-1;;;;;;38184:485:0:o;9831:522::-;10005:31;10023:12;:10;:12::i;10005:31::-;10064:8;10098:26;;;:55;;;;-1:-1:-1;10128:25:0;;;10098:55;10090:94;;;;;-1:-1:-1;;;10090:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10200:9;10195:151;10220:6;10215:1;:11;10195:151;;10267:9;;10277:1;10267:12;;;;;;;;;;;;;-1:-1:-1;;;;;10267:12:0;-1:-1:-1;;;;;10248:45:0;;10302:4;10309:8;;10318:1;10309:11;;;;;;;;;;;;;-1:-1:-1;;;;;10309:11:0;10322:8;;10331:1;10322:11;;;;;;;;;;;;;10248:86;;;;;;;;;;;;;-1:-1:-1;;;;;10248:86:0;;;;;;-1:-1:-1;;;;;10248:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10228:3;;;;;10195:151;;28841:42;;;:::o;39299:727::-;-1:-1:-1;;;;;39526:19:0;;39518:57;;;;;-1:-1:-1;;;39518:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39613:8;39594:15;:27;;39586:61;;;;;-1:-1:-1;;;39586:61:0;;;;;;;;;;;;-1:-1:-1;;;39586:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39740:13:0;;;39658:18;39740:13;;;;;;;;;;;:15;;;;;;;;39689:77;;28766:66;39689:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39679:88;;;;;;;;39832:18;:16;:18::i;:::-;39852:10;39803:60;;;;;;-1:-1:-1;;;39803:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39793:71;;;;;;39778:86;;39875:14;39892:24;39902:4;39908:1;39911;39914;39892:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39875:41;;39945:5;-1:-1:-1;;;;;39935:15:0;:6;-1:-1:-1;;;;;39935:15:0;;39927:49;;;;;-1:-1:-1;;;39927:49:0;;;;;;;;;;;;-1:-1:-1;;;39927:49:0;;;;;;;;;;;;;;;39987:31;39996:5;40003:7;40012:5;39987:8;:31::i;:::-;39299:727;;;;;;;;;;:::o;31049:151::-;-1:-1:-1;;;;;31165:18:0;;;31138:7;31165:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;31049:151::o;51119:139::-;51187:31;51205:12;:10;:12::i;51187:31::-;51229:21;:9;51241;;51229:21;:::i;:::-;;51119:139;;:::o;37685:450::-;37825:4;37842:14;37859:12;:10;:12::i;:::-;37842:29;;37882;37892:6;37900:2;37904:6;37882:9;:29::i;:::-;37926:15;:2;-1:-1:-1;;;;;37926:13:0;;:15::i;:::-;37922:184;;;-1:-1:-1;;;;;;;;37966:100:0;;37981:2;-1:-1:-1;;;;;37966:34:0;;38001:6;38009;38017;38025:4;;37966:64;;;;;;;;;;;;;-1:-1:-1;;;;;37966:64:0;;;;;;-1:-1:-1;;;;;37966:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37966:64:0;-1:-1:-1;;;;;;37966:100:0;;37958:136;;;;;-1:-1:-1;;;37958:136:0;;;;;;;;;;;;-1:-1:-1;;;37958:136:0;;;;;;;;;;;;;;;-1:-1:-1;38123:4:0;;37685:450;-1:-1:-1;;;;;37685:450:0:o;3219:201::-;3299:31;3317:12;:10;:12::i;3299:31::-;3341:6;:17;;-1:-1:-1;;;;;;3341:17:0;-1:-1:-1;;;;;3341:17:0;;;;;;;;;;3374:38;;3341:17;;3395:6;;3374:38;;-1:-1:-1;;3374:38:0;3219:201;:::o;51266:185::-;51371:15;51406:37;:35;:37::i;:::-;51399:44;;51266:185;:::o;40165:281::-;-1:-1:-1;;;;;40292:21:0;;40284:61;;;;;-1:-1:-1;;;40284:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40356:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;40407:31;;;;;;;;;;;;;;;;;40165:281;;;:::o;41739:273::-;41882:26;41892:4;41898:2;41902:5;41882:9;:26::i;:::-;41931:6;-1:-1:-1;;;;;41923:14:0;:4;-1:-1:-1;;;;;41923:14:0;;41919:86;;41954:39;41973:4;41979:6;41987:5;41954:18;:39::i;:::-;41739:273;;;;:::o;45562:474::-;45875:16;;;;;;;45724:289;;;45757:95;45724:289;;;;;;;;;;;45914:14;45724:289;;;;;;;;;;;45989:4;45724:289;;;;;;;;;;;;;;;;;;;;;;;;;45696:332;;;;;;45562:474::o;40454:697::-;-1:-1:-1;;;;;40614:18:0;;;40593;40614;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;40658:31:0;;;;;:55;;-1:-1:-1;40693:20:0;;;40658:55;40654:438;;;40873:28;;;40924:25;;;40916:67;;;;;-1:-1:-1;;;40916:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40998:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:42;;;41028:12;-1:-1:-1;40654:438:0;41123:7;-1:-1:-1;;;;;41107:36:0;41116:5;-1:-1:-1;;;;;41107:36:0;;41132:10;41107:36;;;;;;;;;;;;;;;;;;40454:697;;;;:::o;3551:138::-;3642:4;-1:-1:-1;;;;;3642:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3642:12:0;-1:-1:-1;;;;;3631:23:0;;;;;;3623:58;;;;;-1:-1:-1;;;3623:58:0;;;;;;;;;;;;-1:-1:-1;;;3623:58:0;;;;;;;;;;;;;;;3551:138;:::o;5506:229::-;5668:58;;;-1:-1:-1;;;;;5668:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5668:58:0;-1:-1:-1;;;5668:58:0;;;5633:94;;5661:5;;5633:27;:94::i;41159:572::-;-1:-1:-1;;;;;41289:16:0;;41281:51;;;;;-1:-1:-1;;;41281:51:0;;;;;;;;;;;;-1:-1:-1;;;41281:51:0;;;;;;;;;;;;;;;41349:10;;41345:336;;-1:-1:-1;;;;;41394:15:0;;41376;41394;;;:9;:15;;;;;;41445;;;41483:20;;;41475:60;;;;;-1:-1:-1;;;41475:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;41475:60:0;;;;;;;;;;;;;;;41562:2;-1:-1:-1;;;;;41554:10:0;:4;-1:-1:-1;;;;;41554:10:0;;41550:120;;-1:-1:-1;;;;;41585:15:0;;;;;;;:9;:15;;;;;;:28;;;41632:13;;;;;;:22;;;;;;41550:120;41345:336;;;41713:2;-1:-1:-1;;;;;41698:25:0;41707:4;-1:-1:-1;;;;;41698:25:0;;41717:5;41698:25;;;;;;;;;;;;;;;;;;41159:572;;;:::o;4699:387::-;5022:20;5070:8;;;4699:387::o;48080:922::-;48133:15;48189:10;48133:15;48235:27;:25;:27::i;:::-;48210:52;;48298:18;-1:-1:-1;;;;;48277:40:0;:9;-1:-1:-1;;;;;48277:40:0;;:76;;;;48334:19;-1:-1:-1;;;;;48321:32:0;:9;-1:-1:-1;;;;;48321:32:0;;48277:76;48273:169;;;48424:6;-1:-1:-1;48417:13:0;;-1:-1:-1;48417:13:0;48273:169;-1:-1:-1;;;;;48846:22:0;;48859:9;48846:22;;;;:78;;;48872:18;-1:-1:-1;;;;;48872:33:0;;48906:6;48914:9;48872:52;;;;;;;;;;;;;-1:-1:-1;;;;;48872:52:0;;;;;;-1:-1:-1;;;;;48872:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48872:52:0;48846:78;48842:124;;;48948:6;-1:-1:-1;48941:13:0;;-1:-1:-1;48941:13:0;48842:124;-1:-1:-1;48985:9:0;-1:-1:-1;48080:922:0;:::o;6262:892::-;6388:5;6413:19;-1:-1:-1;;;;;6413:17:0;;;:19::i;:::-;6405:58;;;;;-1:-1:-1;;;6405:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6537:12;6551:17;6572:6;-1:-1:-1;;;;;6572:11:0;6584:8;6572:21;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6572:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6536:57;;;;6608:7;6604:543;;;6636:11;;:16;6632:124;;6692:4;6681:24;;;;;;;;;;;;;;;-1:-1:-1;6681:24:0;6673:67;;;;;-1:-1:-1;;;6673:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6604:543;;;6847:11;;6843:97;;6884:40;;;-1:-1:-1;;;6884:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6843:97;7071:4;7065:11;7116:4;7109;7105:2;7101:13;7094:27;7034:102;6262:892;;;;;:::o;46211:526::-;-1:-1:-1;;46698:14:0;46694:23;46681:37;46677:2;46673:46;;46648:82::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://1f9c631b722e0bd11309a56d5c35d0eefcf0557bb95f5a05add164a843e69f72
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.