ETH Price: $3,336.35 (-1.72%)
Gas: 41 Gwei

Token

layer_two by Takens Theorem (L2TT0)
 

Overview

Max Total Supply

0 L2TT0

Holders

77

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
thedavidmurray.eth
Balance
4 L2TT0
0x198109b0d2c786a230d18b622d3b7a1946131e09
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

*layer_two* is free for collectors of the_coin (only gas), and enables them to mint 100% on-chain NFTs by calling raw data of the_coin’s on-chain visuals, leading to forms more complex, curious.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
L2TT0

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-22
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

/**
 *
 *   layer_two
 *     by Takens Theorem
 *
 *   Terms, conditions: Experimental, use at your own risk. Each token provided 
 *   as-is and as-available without any and all warranty. By using this contract 
 *   you accept sole responsibility for any and all transactions involving 
 *   layer_two. Tokens may appear different across browsers, and may not be formatted
 *   correctly on all exchanges. No assurances of any kind given. Like any project of 
 *   this nature, there may be unforeseen errors or issues that are discovered during 
 *   the course of deployment and use. These are important caveats, but I hope you 
 *   like it.
 *
 *   Coded mostly by someone named 'OpenZeppelin' + some twists by Takens.
 *
 * 
 */

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
      * @dev Safely transfers `tokenId` token from `from` to `to`.
      *
      * Requirements:
      *
      * - `from` cannot be the zero address.
      * - `to` cannot be the zero address.
      * - `tokenId` token must exist and be owned by `from`.
      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
      *
      * Emits a {Transfer} event.
      */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping (uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping (address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC721).interfaceId
            || interfaceId == type(IERC721Metadata).interfaceId
            || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0
            ? string(abi.encodePacked(baseURI, tokenId.toString()))
            : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");        
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "";
        buffer[1] = "";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = alphabet[value & 0xf];
            value >>= 4; 
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
    
    // adapted from tkeber solution: https://ethereum.stackexchange.com/a/8447
    function toAsciiString(address x) internal pure returns (string memory) {
        bytes memory s = new bytes(40);
        for (uint i = 0; i < 20; i++) {
            bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i)))));
            bytes1 hi = bytes1(uint8(b) / 16);
            bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
            s[2*i] = char(hi);
            s[2*i+1] = char(lo);            
        }
        return string(s);
    }
    
    function char(bytes1 b) internal pure returns (bytes1 c) {
        if (uint8(b) < 10) return bytes1(uint8(b) + 0x30);
        else return bytes1(uint8(b) + 0x57);
    }    
    
    // adapted from t-nicci solution https://ethereum.stackexchange.com/a/31470
    function subString(string memory str, uint startIndex, uint endIndex) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex-startIndex);
        for(uint i = startIndex; i < endIndex; i++) {
            result[i-startIndex] = strBytes[i];
        }
        return string(result);
    }    
    
    function compareStrings(string memory a, string memory b) internal pure returns (bool) {
        return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));
    }
    
    // nice solution: https://ethereum.stackexchange.com/questions/56319/how-to-convert-bytes32-to-string
    function toShortString(bytes32 _data) internal pure returns (string memory) {
      bytes memory _bytesContainer = new bytes(32);
      uint256 _charCount = 0;
      // loop through every element in bytes32
      for (uint256 _bytesCounter = 0; _bytesCounter < 32; _bytesCounter++) {
        bytes1 _char = bytes1(bytes32(uint256(_data) * 2 ** (8 * _bytesCounter)));
        if (_char != 0) {
          _bytesContainer[_charCount] = _char;
          _charCount++;
        }
      }
    
      bytes memory _bytesContainerTrimmed = new bytes(_charCount);
    
      for (uint256 _charCounter = 0; _charCounter < _charCount; _charCounter++) {
        _bytesContainerTrimmed[_charCounter] = _bytesContainer[_charCounter];
      }
    
      return string(_bytesContainerTrimmed);
    }    
    
}

// base layer
contract the_coin {
    function ownerOf(uint256 tokenId) external view returns (address) {}
    function reveal(uint256 tokenId) external view returns (string memory) {}
    function tokenURI(uint256 tokenId) external view returns (string memory) {}
    function isApprovedForAll(address owner, address operator) external view returns (bool) {}
}

/**
 * @title layer_two contract
 * @dev Extends ERC721 Non-Fungible Token Standard basic implementation
 */
contract L2TT0 is ERC721, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    mapping (uint256 => uint256) private last_minted;
    address private the_coin_address = 0xf76c5d925b27a63a3745A6b787664A7f38fA79bd; // mainnet
    uint256 private waitTimeInBlocks = 210000/5; // just under a week

    struct L2 {
        address builder;
        uint256 nonce;
        uint256 mint_block;
        uint256 base_layer;
    }
    mapping (uint256 => L2) private L2s;    

    // estimate next minting time for a base layer token
    function nextMinting(uint256 baseTokenId) public view returns (string memory) {
        require(baseTokenId < 85 && baseTokenId > 0, "ERROR: not valid base token ID");
        uint256 nextTime = waitTimeInBlocks+last_minted[baseTokenId];
        string memory userMsg;
        if (block.number >= nextTime) {
            userMsg = "READY,0,0,0,0,0";
        } else {
            uint256 b = nextTime - block.number;
            userMsg = string(abi.encodePacked("WAIT,",
                        s(b),",", // blocks
                        s(b*13),",", // ~seconds
                        s(b*13/60),",", // ~mins
                        s(b*13/60/60),",", // ~hrs
                        s(b*13/60/60/24) // ~days
                    ));
        }
        return userMsg;
    }

    // wee bit of tidying...
    function s(uint256 v) private pure returns (string memory) {
        return Strings.toString(v);
    }

    // single css rendering function for L2 token; restyles stochastically
    function makeStyle(uint256 nonce) private view returns (string memory) {
        
        // pseudorand using keccak... color bases and transform base
        bytes20 cb1 = bytes20(keccak256(abi.encodePacked(nonce)));
        bytes20 cb2 = bytes20(keccak256(abi.encodePacked(nonce*2+1)));
        bytes20 tfb;

        uint256 h = vl(0,cb1) % 4 + 1; // nth child count
        string memory out = '';

        for (uint256 i = 1; i <= h; i++) {
            tfb = bytes20(keccak256(abi.encodePacked(nonce+i))); // unique for each nth child
            uint256 j = (i-1) * 2 + (i%2); // shifting color bytes
            out = string(abi.encodePacked(out,"line, text, circle, path:nth-child(",s(h),"n+",s(i-1),"){fill:#",cl(j,cb1,"77"),"!important;"));
            out = string(abi.encodePacked(out,"stroke:#",cl(j,cb2,"77"),"!important;"));
            out = string(abi.encodePacked(out,"stroke-width:",s(vl(1,tfb)/2),"pt!important;"));
            out = string(abi.encodePacked(out,"transform:skew(",s(7*(vl(2,tfb)/5)),"deg,",s(7*(vl(3,tfb)/5)),"deg)"));
            out = string(abi.encodePacked(out," scale(",s(vl(4,tfb)/128+1),".",s(vl(4,tfb)%10),",",s(vl(5,tfb)/128+1),".",s(vl(5,tfb)%10),");}"));
        }
        out = string(abi.encodePacked(out,c[0],cl(10,tfb,"ff"),"!important;transform:scale(1,1)!important;}"));        
        return out;
    }

    // clip out element from bytes20
    function vl(uint256 i, bytes20 base) private pure returns (uint256) {
        return uint256(uint8(base[i]));
    }
 
    // render color from bytes20 pos
    function cl(uint256 shift, bytes20 base, string memory alpha) private pure returns (string memory) {        
        return string(abi.encodePacked(Strings.subString(Strings.toAsciiString(address(base)), shift, shift+6),alpha));    
    }

    // permits hashing / testing of restyle for l2 (without minting)
    function previewL2(uint256 baseTokenId, uint256 nonce) public view returns (string memory) {
        // implied by .reveal(id) but let's force check anyway
        require(baseTokenId < 85 && baseTokenId > 0, 'ERROR: not valid base token ID');

        string memory svg = the_coin(the_coin_address).reveal(baseTokenId);

        uint256 startStyle = 0;
        uint256 stopStyle = 0;
        string memory c1;
        string memory c2;
        for (uint i = 1; i < bytes(svg).length; i++) {
            c1 = string(abi.encodePacked(bytes(svg)[i-1]));
            c2 = string(abi.encodePacked(bytes(svg)[i]));
            if (Strings.compareStrings(c1,'e') && Strings.compareStrings(c2,'>') && startStyle == 0) {
                startStyle = i;
            } else if (Strings.compareStrings(c1,'e') && Strings.compareStrings(c2,'>') && i > startStyle) {
                stopStyle = i-7;
                break;
            }
        }

        return string(abi.encodePacked(Strings.subString(svg,0,startStyle+1),
                        makeStyle(nonce),
                        Strings.subString(svg,stopStyle,bytes(svg).length)));
    }

    string ncp = 'WAIT';
    string[] private c = ['', ''];
    function setStr(string memory val) public onlyOwner {
        require(bytes(ncp).length > 0, 'ERROR: Already configured');
        if (bytes(c[0]).length == 0) {
            c[0] = val;
        } else if (bytes(c[1]).length == 0) {
            c[1] = val;
        } else if (bytes(ncp).length > 0) {
            ncp = val;        
        }
    }    

    // time to commit: set nonce and base layer, creates new token
    function mintL2Token(uint256 baseTokenId, uint256 nonce) public {        
        require(bytes(ncp).length==0, "ERROR: Misconfigured");
        // let's force check at the front
        require(baseTokenId < 85 && baseTokenId > 0, "ERROR: not valid base token ID");
        // next implies correct token # too; and checking owner / operator
        address theOwner = the_coin(the_coin_address).ownerOf(baseTokenId);
        bool isOperator = the_coin(the_coin_address).isApprovedForAll(theOwner, msg.sender);
        require(theOwner == msg.sender || isOperator, "ERROR: not owner or operator of base layer");
        // check that time has elapsed, in blocks
        require(block.number - last_minted[baseTokenId] >= waitTimeInBlocks, "ERROR: mint interval not reached");        

        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();

        L2s[newItemId] = L2(msg.sender, nonce, block.number, baseTokenId);
        last_minted[baseTokenId] = block.number;

        _mint(msg.sender, newItemId);
    }    

    // use tokenuri data on the_coin to find base layer name
    function getBaseName(uint256 baseTokenId) private view returns (string memory) {
        string memory URI = the_coin(the_coin_address).tokenURI(baseTokenId);        
        string memory key = Strings.subString(URI,26,27);
        if (Strings.compareStrings(key,"s")) {
            return "Issuance";
        } else if (Strings.compareStrings(key,"i")) {
            return "Miner 1";
        } else if (Strings.compareStrings(key,"e")) {
            return "Security";
        } else {
            return "Integration";
        }
    }

    // attributes json for opensea
    function makeAttributes(uint256 tokenId) private view returns (string memory) {  
        string memory content = string(abi.encodePacked( 
            '{"trait_type":"Mint Block","value":"', s(L2s[tokenId].mint_block), '"},',
            '{"trait_type":"Base Token","value":"', getBaseName(L2s[tokenId].base_layer), '"},',
            '{"trait_type":"Base Token #","value":"', s(L2s[tokenId].base_layer), '"},',
            '{"trait_type":"Builder","value":"0x', Strings.toAsciiString(L2s[tokenId].builder), '"}'
        ));
        return content; 
    }

    // render name for metadata    
    function makeName(uint256 tokenId) private view returns (string memory) {
        return string(abi.encodePacked("L2 #", s(tokenId), " (",            
            getBaseName(L2s[tokenId].base_layer),"/#",
            s(L2s[tokenId].base_layer),")"));
    }

    // render main description in metadata
    function makeDescription(uint256 tokenId) private view returns (string memory) {
        return string(abi.encodePacked("L2 #", s(tokenId), " of the_coin token #",
            s(L2s[tokenId].base_layer),"\\n\\n- Base layer contract:\\n- 0x",
            Strings.toAsciiString(the_coin_address),
            "\\n\\n- Builder:\\n- 0x",
            Strings.toAsciiString(L2s[tokenId].builder)));
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(bytes(ncp).length==0, "ERROR: Misconfigured");
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
                
        bytes memory json = abi.encodePacked('{"name":"', makeName(tokenId),
                                            '", "description":"',makeDescription(tokenId),
                                            '", "attributes":[', makeAttributes(tokenId),
                                            '], "created_by":"Takens Theorem", "image":"',
            previewL2(L2s[tokenId].base_layer,L2s[tokenId].nonce), '"}');
        
        return string(abi.encodePacked('data:text/plain,', json));
    }

    constructor() ERC721("layer_two by Takens Theorem", "L2TT0") {
        for (uint i=1;i<85;i++) { last_minted[i] = 0;}
    }    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"baseTokenId","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"mintL2Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"baseTokenId","type":"uint256"}],"name":"nextMinting","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"baseTokenId","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"previewL2","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"val","type":"string"}],"name":"setStr","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600980546001600160a01b03191673f76c5d925b27a63a3745a6b787664a7f38fa79bd17905561a410600a5560c0604052600460808190526315d0525560e21b60a09081526200005391600c9190620001b2565b50604080516060810182526000818301818152825282516020818101909452908152918101919091526200008c90600d90600262000241565b503480156200009a57600080fd5b50604080518082018252601b81527f6c617965725f74776f2062792054616b656e73205468656f72656d000000000060208083019182528351808501909452600584526404c325454360dc1b908401528151919291620000fd91600091620001b2565b50805162000113906001906020840190620001b2565b505050600062000128620001ae60201b60201c565b600680546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060015b6055811015620001a757600081815260086020526040812055806200019e8162000358565b91505062000179565b5062000382565b3390565b828054620001c0906200031b565b90600052602060002090601f016020900481019282620001e457600085556200022f565b82601f10620001ff57805160ff19168380011785556200022f565b828001600101855582156200022f579182015b828111156200022f57825182559160200191906001019062000212565b506200023d929150620002a1565b5090565b82805482825590600052602060002090810192821562000293579160200282015b8281111562000293578251805162000282918491602090910190620001b2565b509160200191906001019062000262565b506200023d929150620002b8565b5b808211156200023d5760008155600101620002a2565b808211156200023d576000620002cf8282620002d9565b50600101620002b8565b508054620002e7906200031b565b6000825580601f10620002f8575050565b601f016020900490600052602060002090810190620003189190620002a1565b50565b600181811c908216806200033057607f821691505b602082108114156200035257634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200037b57634e487b7160e01b600052601160045260246000fd5b5060010190565b61347180620003926000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063715018a6116100ad578063b88d4fde11610071578063b88d4fde14610275578063c87b56dd14610288578063e985e9c51461029b578063f2fde38b146102ae578063f3966ea4146102c157600080fd5b8063715018a61461022e5780638da5cb5b1461023657806395d89b4114610247578063a22cb4651461024f578063b768fa6d1461026257600080fd5b8063191347df116100f4578063191347df146101c157806323b872dd146101d457806342842e0e146101e75780636352211e146101fa57806370a082311461020d57600080fd5b806301ffc9a714610131578063051d466a1461015957806306fdde0314610179578063081812fc14610181578063095ea7b3146101ac575b600080fd5b61014461013f36600461253e565b6102d4565b60405190151581526020015b60405180910390f35b61016c610167366004612638565b610326565b6040516101509190612fc1565b61016c61045a565b61019461018f366004612638565b6104ec565b6040516001600160a01b039091168152602001610150565b6101bf6101ba3660046124f5565b610581565b005b6101bf6101cf366004612578565b610697565b6101bf6101e2366004612406565b6107f9565b6101bf6101f5366004612406565b61082a565b610194610208366004612638565b610845565b61022061021b366004612393565b6108bc565b604051908152602001610150565b6101bf610943565b6006546001600160a01b0316610194565b61016c6109b7565b6101bf61025d3660046124c7565b6109c6565b6101bf610270366004612651565b610a8b565b6101bf610283366004612447565b610d8d565b61016c610296366004612638565b610dc5565b6101446102a93660046123cd565b610f24565b6101bf6102bc366004612393565b610f52565b61016c6102cf366004612651565b61103d565b60006001600160e01b031982166380ac58cd60e01b148061030557506001600160e01b03198216635b5e139f60e01b145b8061032057506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606055821080156103385750600082115b61035d5760405162461bcd60e51b815260040161035490613026565b60405180910390fd5b600082815260086020526040812054600a54610379919061313c565b905060608143106103b0575060408051808201909152600f81526e052454144592c302c302c302c302c3608c1b6020820152610453565b60006103bc43846132da565b90506103c7816112c9565b6103da6103d583600d61329a565b6112c9565b6103f4603c6103ea85600d61329a565b6103d59190613179565b61040f603c8061040587600d61329a565b6103ea9190613179565b61042c6018603c8061042289600d61329a565b6104059190613179565b604051602001610440959493929190612bfc565b6040516020818303038152906040529150505b9392505050565b60606000805461046990613340565b80601f016020809104026020016040519081016040528092919081815260200182805461049590613340565b80156104e25780601f106104b7576101008083540402835291602001916104e2565b820191906000526020600020905b8154815290600101906020018083116104c557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105655760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610354565b506000908152600460205260409020546001600160a01b031690565b600061058c82610845565b9050806001600160a01b0316836001600160a01b031614156105fa5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610354565b336001600160a01b038216148061061657506106168133610f24565b6106885760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610354565b61069283836112d4565b505050565b6006546001600160a01b031633146106c15760405162461bcd60e51b81526004016103549061305d565b6000600c80546106d090613340565b90501161071f5760405162461bcd60e51b815260206004820152601960248201527f4552524f523a20416c726561647920636f6e66696775726564000000000000006044820152606401610354565b600d600081548110610733576107336133d6565b90600052602060002001805461074890613340565b151590506107865780600d600081548110610765576107656133d6565b9060005260206000200190805190602001906107829291906122bc565b5050565b600d60018154811061079a5761079a6133d6565b9060005260206000200180546107af90613340565b151590506107cc5780600d600181548110610765576107656133d6565b6000600c80546107db90613340565b905011156107f657805161078290600c9060208401906122bc565b50565b6108033382611342565b61081f5760405162461bcd60e51b815260040161035490613092565b610692838383611419565b61069283838360405180602001604052806000815250610d8d565b6000818152600260205260408120546001600160a01b0316806103205760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610354565b60006001600160a01b0382166109275760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610354565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461096d5760405162461bcd60e51b81526004016103549061305d565b6006546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b60606001805461046990613340565b6001600160a01b038216331415610a1f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610354565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c8054610a9890613340565b159050610ade5760405162461bcd60e51b815260206004820152601460248201527311549493d48e88135a5cd8dbdb999a59dd5c995960621b6044820152606401610354565b605582108015610aee5750600082115b610b0a5760405162461bcd60e51b815260040161035490613026565b6009546040516331a9108f60e11b8152600481018490526000916001600160a01b031690636352211e9060240160206040518083038186803b158015610b4f57600080fd5b505afa158015610b63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8791906123b0565b60095460405163e985e9c560e01b81526001600160a01b0380841660048301523360248301529293506000929091169063e985e9c59060440160206040518083038186803b158015610bd857600080fd5b505afa158015610bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c109190612521565b90506001600160a01b038216331480610c265750805b610c855760405162461bcd60e51b815260206004820152602a60248201527f4552524f523a206e6f74206f776e6572206f72206f70657261746f72206f66206044820152693130b9b2903630bcb2b960b11b6064820152608401610354565b600a54600085815260086020526040902054610ca190436132da565b1015610cef5760405162461bcd60e51b815260206004820181905260248201527f4552524f523a206d696e7420696e74657276616c206e6f7420726561636865646044820152606401610354565b610cfd600780546001019055565b6000610d0860075490565b6040805160808101825233808252602080830189815243848601818152606086018d81526000898152600b8652888120975188546001600160a01b0319166001600160a01b039091161788559351600188015590516002870155516003909501949094558a815260089091529290922055909150610d8690826115b9565b5050505050565b610d973383611342565b610db35760405162461bcd60e51b815260040161035490613092565b610dbf848484846116fb565b50505050565b6060600c8054610dd490613340565b159050610e1a5760405162461bcd60e51b815260206004820152601460248201527311549493d48e88135a5cd8dbdb999a59dd5c995960621b6044820152606401610354565b6000828152600260205260409020546001600160a01b0316610e985760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610354565b6000610ea38361172e565b610eac84611797565b610eb585611806565b6000868152600b602052604090206003810154600190910154610ed8919061103d565b604051602001610eeb9493929190612b04565b604051602081830303815290604052905080604051602001610f0d9190612ca3565b604051602081830303815290604052915050919050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6006546001600160a01b03163314610f7c5760405162461bcd60e51b81526004016103549061305d565b6001600160a01b038116610fe15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610354565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b606060558310801561104f5750600083115b61106b5760405162461bcd60e51b815260040161035490613026565b60095460405163c2ca0ac560e01b8152600481018590526000916001600160a01b03169063c2ca0ac59060240160006040518083038186803b1580156110b057600080fd5b505afa1580156110c4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110ec91908101906125c1565b905060008060608060015b855181101561126f578561110c6001836132da565b8151811061111c5761111c6133d6565b016020908101516040516001600160f81b031990911691810191909152602101604051602081830303815290604052925085818151811061115f5761115f6133d6565b016020908101516040516001600160f81b03199091169181019190915260210160408051601f1981840301815282820190915260018252606560f81b602083015292506111ad9084906118a6565b80156111d757506111d782604051806040016040528060018152602001601f60f91b8152506118a6565b80156111e1575084155b156111ee5780945061125d565b61121183604051806040016040528060018152602001606560f81b8152506118a6565b801561123b575061123b82604051806040016040528060018152602001601f60f91b8152506118a6565b801561124657508481115b1561125d576112566007826132da565b935061126f565b806112678161337b565b9150506110f7565b5061128685600061128187600161313c565b6118ff565b61128f886119cc565b61129b878689516118ff565b6040516020016112ad93929190612706565b6040516020818303038152906040529550505050505092915050565b606061032082611d22565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061130982610845565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166113bb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610354565b60006113c683610845565b9050806001600160a01b0316846001600160a01b031614806114015750836001600160a01b03166113f6846104ec565b6001600160a01b0316145b8061141157506114118185610f24565b949350505050565b826001600160a01b031661142c82610845565b6001600160a01b0316146114945760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610354565b6001600160a01b0382166114f65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610354565b6115016000826112d4565b6001600160a01b038316600090815260036020526040812080546001929061152a9084906132da565b90915550506001600160a01b038216600090815260036020526040812080546001929061155890849061313c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b03821661160f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610354565b6000818152600260205260409020546001600160a01b0316156116745760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610354565b6001600160a01b038216600090815260036020526040812080546001929061169d90849061313c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b611706848484611419565b61171284848484611e20565b610dbf5760405162461bcd60e51b815260040161035490612fd4565b6060611739826112c9565b6000838152600b602052604090206003015461175490611f2d565b6000848152600b602052604090206003015461176f906112c9565b60405160200161178193929190612cdb565b6040516020818303038152906040529050919050565b60606117a2826112c9565b6000838152600b60205260409020600301546117bd906112c9565b6009546117d2906001600160a01b03166120dc565b6000858152600b60205260409020546117f3906001600160a01b03166120dc565b6040516020016117819493929190612d5a565b6000818152600b602052604081206002015460609190611825906112c9565b6000848152600b602052604090206003015461184090611f2d565b6000858152600b602052604090206003015461185b906112c9565b6000868152600b602052604090205461187c906001600160a01b03166120dc565b60405160200161188f9493929190612e2e565b60408051601f198184030181529190529392505050565b6000816040516020016118b991906126bb565b60405160208183030381529060405280519060200120836040516020016118e091906126bb565b6040516020818303038152906040528051906020012014905092915050565b606083600061190e85856132da565b67ffffffffffffffff811115611926576119266133ec565b6040519080825280601f01601f191660200182016040528015611950576020820181803683370190505b509050845b848110156119c25782818151811061196f5761196f6133d6565b01602001516001600160f81b0319168261198988846132da565b81518110611999576119996133d6565b60200101906001600160f81b031916908160001a905350806119ba8161337b565b915050611955565b5095945050505050565b60606000826040516020016119e391815260200190565b6040516020818303038152906040528051906020012090506000836002611a0a919061329a565b611a1590600161313c565b604051602001611a2791815260200190565b6040516020818303038152906040528051906020012090506000806004611a4f600086612223565b611a599190613396565b611a6490600161313c565b60408051602081019091526000815290915060015b828111611caf57611a8a818961313c565b604051602001611a9c91815260200190565b6040516020818303038152906040528051906020012093506000600282611ac39190613396565b611ace6001846132da565b611ad990600261329a565b611ae3919061313c565b905082611aef856112c9565b611afd6103d56001866132da565b611b22848b60405180604001604052806002815260200161373760f01b81525061223f565b604051602001611b359493929190612a39565b60408051601f198184030181528282019091526002825261373760f01b602083015293508390611b68908390899061223f565b604051602001611b79929190612928565b604051602081830303815290604052925082611b9b60026103ea600189612223565b604051602001611bac9291906128c6565b604051602081830303815290604052925082611be36005611bce600289612223565b611bd89190613179565b6103d590600761329a565b611bf36005611bce60038a612223565b604051602001611c0593929190612845565b604051602081830303815290604052925082611c3c6080611c27600489612223565b611c319190613179565b6103d590600161313c565b611c56600a611c4c60048a612223565b6103d59190613396565b611c666080611c2760058b612223565b611c76600a611c4c60058c612223565b604051602001611c8a959493929190612983565b6040516020818303038152906040529250508080611ca79061337b565b915050611a79565b5080600d600081548110611cc557611cc56133d6565b90600052602060002001611cf5600a8660405180604001604052806002815260200161333360f11b81525061223f565b604051602001611d0793929190612749565b60408051601f19818403018152919052979650505050505050565b606081611d465750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d705780611d5a8161337b565b9150611d699050600a83613179565b9150611d4a565b60008167ffffffffffffffff811115611d8b57611d8b6133ec565b6040519080825280601f01601f191660200182016040528015611db5576020820181803683370190505b5090505b841561141157611dca6001836132da565b9150611dd7600a86613396565b611de290603061313c565b60f81b818381518110611df757611df76133d6565b60200101906001600160f81b031916908160001a905350611e19600a86613179565b9450611db9565b60006001600160a01b0384163b15611f2257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e64903390899088908890600401612f84565b602060405180830381600087803b158015611e7e57600080fd5b505af1925050508015611eae575060408051601f3d908101601f19168201909252611eab9181019061255b565b60015b611f08573d808015611edc576040519150601f19603f3d011682016040523d82523d6000602084013e611ee1565b606091505b508051611f005760405162461bcd60e51b815260040161035490612fd4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611411565b506001949350505050565b60095460405163c87b56dd60e01b8152600481018390526060916000916001600160a01b039091169063c87b56dd9060240160006040518083038186803b158015611f7757600080fd5b505afa158015611f8b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fb391908101906125c1565b90506000611fc482601a601b6118ff565b9050611fe981604051806040016040528060018152602001607360f81b8152506118a6565b1561201557505060408051808201909152600881526749737375616e636560c01b602082015292915050565b61203881604051806040016040528060018152602001606960f81b8152506118a6565b156120635750506040805180820190915260078152664d696e6572203160c81b602082015292915050565b61208681604051806040016040528060018152602001606560f81b8152506118a6565b156120b2575050604080518082019091526008815267536563757269747960c01b602082015292915050565b505060408051808201909152600b81526a24b73a32b3b930ba34b7b760a91b602082015292915050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b601481101561221c5760006121198260136132da565b61212490600861329a565b61212f9060026131f2565b612142906001600160a01b038716613179565b60f81b9050600060108260f81c612159919061318d565b60f81b905060008160f81c601061217091906132b9565b8360f81c61217e91906132f1565b60f81b905061218c82612286565b8561219886600261329a565b815181106121a8576121a86133d6565b60200101906001600160f81b031916908160001a9053506121c881612286565b856121d486600261329a565b6121df90600161313c565b815181106121ef576121ef6133d6565b60200101906001600160f81b031916908160001a90535050505080806122149061337b565b915050612103565b5092915050565b6000818360148110612237576122376133d6565b1a9392505050565b606061225c6122508460601c6120dc565b8561128181600661313c565b8260405160200161226e9291906126d7565b60405160208183030381529060405290509392505050565b6000600a60f883901c10156122ad576122a460f883901c6030613154565b60f81b92915050565b6122a460f883901c6057613154565b8280546122c890613340565b90600052602060002090601f0160209004810192826122ea5760008555612330565b82601f1061230357805160ff1916838001178555612330565b82800160010185558215612330579182015b82811115612330578251825591602001919060010190612315565b5061233c929150612340565b5090565b5b8082111561233c5760008155600101612341565b600061236861236384613114565b6130e3565b905082815283838301111561237c57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156123a557600080fd5b813561045381613402565b6000602082840312156123c257600080fd5b815161045381613402565b600080604083850312156123e057600080fd5b82356123eb81613402565b915060208301356123fb81613402565b809150509250929050565b60008060006060848603121561241b57600080fd5b833561242681613402565b9250602084013561243681613402565b929592945050506040919091013590565b6000806000806080858703121561245d57600080fd5b843561246881613402565b9350602085013561247881613402565b925060408501359150606085013567ffffffffffffffff81111561249b57600080fd5b8501601f810187136124ac57600080fd5b6124bb87823560208401612355565b91505092959194509250565b600080604083850312156124da57600080fd5b82356124e581613402565b915060208301356123fb81613417565b6000806040838503121561250857600080fd5b823561251381613402565b946020939093013593505050565b60006020828403121561253357600080fd5b815161045381613417565b60006020828403121561255057600080fd5b813561045381613425565b60006020828403121561256d57600080fd5b815161045381613425565b60006020828403121561258a57600080fd5b813567ffffffffffffffff8111156125a157600080fd5b8201601f810184136125b257600080fd5b61141184823560208401612355565b6000602082840312156125d357600080fd5b815167ffffffffffffffff8111156125ea57600080fd5b8201601f810184136125fb57600080fd5b805161260961236382613114565b81815285602083850101111561261e57600080fd5b61262f826020830160208601613314565b95945050505050565b60006020828403121561264a57600080fd5b5035919050565b6000806040838503121561266457600080fd5b50508035926020909101359150565b6000815180845261268b816020860160208601613314565b601f01601f19169290920160200192915050565b600081516126b1818560208601613314565b9290920192915050565b600082516126cd818460208701613314565b9190910192915050565b600083516126e9818460208801613314565b8351908301906126fd818360208801613314565b01949350505050565b60008451612718818460208901613314565b84519083019061272c818360208901613314565b845191019061273f818360208801613314565b0195945050505050565b60008451602061275c8285838a01613314565b855491840191600090600181811c908083168061277a57607f831692505b85831081141561279857634e487b7160e01b85526022600452602485fd5b8080156127ac57600181146127bd576127ea565b60ff198516885283880195506127ea565b60008c81526020902060005b858110156127e25781548a8201529084019088016127c9565b505083880195505b50505050506128396127fc828861269f565b7f21696d706f7274616e743b7472616e73666f726d3a7363616c6528312c31292181526a696d706f7274616e743b7d60a81b6020820152602b0190565b98975050505050505050565b60008451612857818460208901613314565b6e0e8e4c2dce6ccdee4da74e6d6caee5608b1b908301908152845161288381600f840160208901613314565b63191959cb60e21b600f929091019182015283516128a8816013840160208801613314565b636465672960e01b6013929091019182015260170195945050505050565b600083516128d8818460208801613314565b6c39ba3937b5b296bbb4b23a341d60991b908301908152835161290281600d840160208801613314565b6c707421696d706f7274616e743b60981b600d9290910191820152601a01949350505050565b6000835161293a818460208801613314565b677374726f6b653a2360c01b908301908152835161295f816008840160208801613314565b6a21696d706f7274616e743b60a81b60089290910191820152601301949350505050565b60008651612995818460208b01613314565b66040e6c6c2d8ca560cb1b90830190815286516129b9816007840160208b01613314565b808201915050601760f91b80600783015286516129dd816008850160208b01613314565b600b60fa1b6008939091019283015285516129ff816009850160208a01613314565b60099201918201528351612a1a81600a840160208801613314565b62293b7d60e81b600a9290910191820152600d01979650505050505050565b60008551612a4b818460208a01613314565b80830190507f6c696e652c20746578742c20636972636c652c20706174683a6e74682d6368698152620d8c8560eb1b60208201528551612a92816023840160208a01613314565b616e2b60f01b602392909101918201528451612ab5816025840160208901613314565b67297b66696c6c3a2360c01b602592909101918201528351612ade81602d840160208801613314565b6a21696d706f7274616e743b60a81b602d92909101918201526038019695505050505050565b683d913730b6b2911d1160b91b81528451600090612b29816009850160208a01613314565b71111610113232b9b1b934b83a34b7b7111d1160711b6009918401918201528551612b5b81601b840160208a01613314565b70222c202261747472696275746573223a5b60781b601b92909101918201528451612b8d81602c840160208901613314565b7f5d2c2022637265617465645f6279223a2254616b656e73205468656f72656d22602c92909101918201526a16101134b6b0b3b2911d1160a91b604c8201528351612bdf816057840160208801613314565b61227d60f01b605792909101918201526059019695505050505050565b6415d052550b60da1b815260008651612c1c816005850160208b01613314565b8083019050600b60fa1b8060058301528751612c3f816006850160208c01613314565b600692019182018190528651612c5c816007850160208b01613314565b600792019182018190528551612c79816008850160208a01613314565b60089201918201528351612c94816009840160208801613314565b01600901979650505050505050565b6f19185d184e9d195e1d0bdc1b185a5b8b60821b815260008251612cce816010850160208701613314565b9190910160100192915050565b634c32202360e01b815260008451612cfa816004850160208901613314565b61040560f31b6004918401918201528451612d1c816006840160208901613314565b612f2360f01b600692909101918201528351612d3f816008840160208801613314565b602960f81b6008929091019182015260090195945050505050565b634c32202360e01b815260008551612d79816004850160208a01613314565b73206f66207468655f636f696e20746f6b656e202360601b6004918401918201528551612dad816018840160208a01613314565b7f5c6e5c6e2d2042617365206c6179657220636f6e74726163743a5c6e2d203078601892909101918201528451612deb816038840160208901613314565b730b8dcb8dc5a4084ead2d8c8cae474b8dc5a4060f60631b603892909101918201528351612e2081604c840160208801613314565b01604c019695505050505050565b7f7b2274726169745f74797065223a224d696e7420426c6f636b222c2276616c75815260006332911d1160e11b8060208401528651612e74816024860160208b01613314565b62089f4b60ea1b60249185019182018190527f7b2274726169745f74797065223a224261736520546f6b656e222c2276616c7560278301526047820192909252865191612ec883604b840160208b01613314565b9101604b8101919091527f7b2274726169745f74797065223a224261736520546f6b656e2023222c227661604e82015265363ab2911d1160d11b606e8201528451612f1a816074840160208901613314565b612839612f76612f70612f3b60748587010162089f4b60ea1b815260030190565b7f7b2274726169745f74797065223a224275696c646572222c2276616c7565223a81526204460f60eb1b602082015260230190565b8761269f565b61227d60f01b815260020190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612fb790830184612673565b9695505050505050565b6020815260006104536020830184612673565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601e908201527f4552524f523a206e6f742076616c6964206261736520746f6b656e2049440000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561310c5761310c6133ec565b604052919050565b600067ffffffffffffffff82111561312e5761312e6133ec565b50601f01601f191660200190565b6000821982111561314f5761314f6133aa565b500190565b600060ff821660ff84168060ff03821115613171576131716133aa565b019392505050565b600082613188576131886133c0565b500490565b600060ff8316806131a0576131a06133c0565b8060ff84160491505092915050565b600181815b808511156131ea5781600019048211156131d0576131d06133aa565b808516156131dd57918102915b93841c93908002906131b4565b509250929050565b6000610453838360008261320857506001610320565b8161321557506000610320565b816001811461322b576002811461323557613251565b6001915050610320565b60ff841115613246576132466133aa565b50506001821b610320565b5060208310610133831016604e8410600b8410161715613274575081810a610320565b61327e83836131af565b8060001904821115613292576132926133aa565b029392505050565b60008160001904831182151516156132b4576132b46133aa565b500290565b600060ff821660ff84168160ff0481118215151615613292576132926133aa565b6000828210156132ec576132ec6133aa565b500390565b600060ff821660ff84168082101561330b5761330b6133aa565b90039392505050565b60005b8381101561332f578181015183820152602001613317565b83811115610dbf5750506000910152565b600181811c9082168061335457607f821691505b6020821081141561337557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561338f5761338f6133aa565b5060010190565b6000826133a5576133a56133c0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146107f657600080fd5b80151581146107f657600080fd5b6001600160e01b0319811681146107f657600080fdfea2646970667358221220aa7b37bf65ed4912a88d3cdfcd9dbd4c63d2caff23f3c745a9fcbb5509a1941e64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061012c5760003560e01c8063715018a6116100ad578063b88d4fde11610071578063b88d4fde14610275578063c87b56dd14610288578063e985e9c51461029b578063f2fde38b146102ae578063f3966ea4146102c157600080fd5b8063715018a61461022e5780638da5cb5b1461023657806395d89b4114610247578063a22cb4651461024f578063b768fa6d1461026257600080fd5b8063191347df116100f4578063191347df146101c157806323b872dd146101d457806342842e0e146101e75780636352211e146101fa57806370a082311461020d57600080fd5b806301ffc9a714610131578063051d466a1461015957806306fdde0314610179578063081812fc14610181578063095ea7b3146101ac575b600080fd5b61014461013f36600461253e565b6102d4565b60405190151581526020015b60405180910390f35b61016c610167366004612638565b610326565b6040516101509190612fc1565b61016c61045a565b61019461018f366004612638565b6104ec565b6040516001600160a01b039091168152602001610150565b6101bf6101ba3660046124f5565b610581565b005b6101bf6101cf366004612578565b610697565b6101bf6101e2366004612406565b6107f9565b6101bf6101f5366004612406565b61082a565b610194610208366004612638565b610845565b61022061021b366004612393565b6108bc565b604051908152602001610150565b6101bf610943565b6006546001600160a01b0316610194565b61016c6109b7565b6101bf61025d3660046124c7565b6109c6565b6101bf610270366004612651565b610a8b565b6101bf610283366004612447565b610d8d565b61016c610296366004612638565b610dc5565b6101446102a93660046123cd565b610f24565b6101bf6102bc366004612393565b610f52565b61016c6102cf366004612651565b61103d565b60006001600160e01b031982166380ac58cd60e01b148061030557506001600160e01b03198216635b5e139f60e01b145b8061032057506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606055821080156103385750600082115b61035d5760405162461bcd60e51b815260040161035490613026565b60405180910390fd5b600082815260086020526040812054600a54610379919061313c565b905060608143106103b0575060408051808201909152600f81526e052454144592c302c302c302c302c3608c1b6020820152610453565b60006103bc43846132da565b90506103c7816112c9565b6103da6103d583600d61329a565b6112c9565b6103f4603c6103ea85600d61329a565b6103d59190613179565b61040f603c8061040587600d61329a565b6103ea9190613179565b61042c6018603c8061042289600d61329a565b6104059190613179565b604051602001610440959493929190612bfc565b6040516020818303038152906040529150505b9392505050565b60606000805461046990613340565b80601f016020809104026020016040519081016040528092919081815260200182805461049590613340565b80156104e25780601f106104b7576101008083540402835291602001916104e2565b820191906000526020600020905b8154815290600101906020018083116104c557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105655760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610354565b506000908152600460205260409020546001600160a01b031690565b600061058c82610845565b9050806001600160a01b0316836001600160a01b031614156105fa5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610354565b336001600160a01b038216148061061657506106168133610f24565b6106885760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610354565b61069283836112d4565b505050565b6006546001600160a01b031633146106c15760405162461bcd60e51b81526004016103549061305d565b6000600c80546106d090613340565b90501161071f5760405162461bcd60e51b815260206004820152601960248201527f4552524f523a20416c726561647920636f6e66696775726564000000000000006044820152606401610354565b600d600081548110610733576107336133d6565b90600052602060002001805461074890613340565b151590506107865780600d600081548110610765576107656133d6565b9060005260206000200190805190602001906107829291906122bc565b5050565b600d60018154811061079a5761079a6133d6565b9060005260206000200180546107af90613340565b151590506107cc5780600d600181548110610765576107656133d6565b6000600c80546107db90613340565b905011156107f657805161078290600c9060208401906122bc565b50565b6108033382611342565b61081f5760405162461bcd60e51b815260040161035490613092565b610692838383611419565b61069283838360405180602001604052806000815250610d8d565b6000818152600260205260408120546001600160a01b0316806103205760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610354565b60006001600160a01b0382166109275760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610354565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461096d5760405162461bcd60e51b81526004016103549061305d565b6006546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b60606001805461046990613340565b6001600160a01b038216331415610a1f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610354565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c8054610a9890613340565b159050610ade5760405162461bcd60e51b815260206004820152601460248201527311549493d48e88135a5cd8dbdb999a59dd5c995960621b6044820152606401610354565b605582108015610aee5750600082115b610b0a5760405162461bcd60e51b815260040161035490613026565b6009546040516331a9108f60e11b8152600481018490526000916001600160a01b031690636352211e9060240160206040518083038186803b158015610b4f57600080fd5b505afa158015610b63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8791906123b0565b60095460405163e985e9c560e01b81526001600160a01b0380841660048301523360248301529293506000929091169063e985e9c59060440160206040518083038186803b158015610bd857600080fd5b505afa158015610bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c109190612521565b90506001600160a01b038216331480610c265750805b610c855760405162461bcd60e51b815260206004820152602a60248201527f4552524f523a206e6f74206f776e6572206f72206f70657261746f72206f66206044820152693130b9b2903630bcb2b960b11b6064820152608401610354565b600a54600085815260086020526040902054610ca190436132da565b1015610cef5760405162461bcd60e51b815260206004820181905260248201527f4552524f523a206d696e7420696e74657276616c206e6f7420726561636865646044820152606401610354565b610cfd600780546001019055565b6000610d0860075490565b6040805160808101825233808252602080830189815243848601818152606086018d81526000898152600b8652888120975188546001600160a01b0319166001600160a01b039091161788559351600188015590516002870155516003909501949094558a815260089091529290922055909150610d8690826115b9565b5050505050565b610d973383611342565b610db35760405162461bcd60e51b815260040161035490613092565b610dbf848484846116fb565b50505050565b6060600c8054610dd490613340565b159050610e1a5760405162461bcd60e51b815260206004820152601460248201527311549493d48e88135a5cd8dbdb999a59dd5c995960621b6044820152606401610354565b6000828152600260205260409020546001600160a01b0316610e985760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610354565b6000610ea38361172e565b610eac84611797565b610eb585611806565b6000868152600b602052604090206003810154600190910154610ed8919061103d565b604051602001610eeb9493929190612b04565b604051602081830303815290604052905080604051602001610f0d9190612ca3565b604051602081830303815290604052915050919050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6006546001600160a01b03163314610f7c5760405162461bcd60e51b81526004016103549061305d565b6001600160a01b038116610fe15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610354565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b606060558310801561104f5750600083115b61106b5760405162461bcd60e51b815260040161035490613026565b60095460405163c2ca0ac560e01b8152600481018590526000916001600160a01b03169063c2ca0ac59060240160006040518083038186803b1580156110b057600080fd5b505afa1580156110c4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110ec91908101906125c1565b905060008060608060015b855181101561126f578561110c6001836132da565b8151811061111c5761111c6133d6565b016020908101516040516001600160f81b031990911691810191909152602101604051602081830303815290604052925085818151811061115f5761115f6133d6565b016020908101516040516001600160f81b03199091169181019190915260210160408051601f1981840301815282820190915260018252606560f81b602083015292506111ad9084906118a6565b80156111d757506111d782604051806040016040528060018152602001601f60f91b8152506118a6565b80156111e1575084155b156111ee5780945061125d565b61121183604051806040016040528060018152602001606560f81b8152506118a6565b801561123b575061123b82604051806040016040528060018152602001601f60f91b8152506118a6565b801561124657508481115b1561125d576112566007826132da565b935061126f565b806112678161337b565b9150506110f7565b5061128685600061128187600161313c565b6118ff565b61128f886119cc565b61129b878689516118ff565b6040516020016112ad93929190612706565b6040516020818303038152906040529550505050505092915050565b606061032082611d22565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061130982610845565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166113bb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610354565b60006113c683610845565b9050806001600160a01b0316846001600160a01b031614806114015750836001600160a01b03166113f6846104ec565b6001600160a01b0316145b8061141157506114118185610f24565b949350505050565b826001600160a01b031661142c82610845565b6001600160a01b0316146114945760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610354565b6001600160a01b0382166114f65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610354565b6115016000826112d4565b6001600160a01b038316600090815260036020526040812080546001929061152a9084906132da565b90915550506001600160a01b038216600090815260036020526040812080546001929061155890849061313c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b03821661160f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610354565b6000818152600260205260409020546001600160a01b0316156116745760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610354565b6001600160a01b038216600090815260036020526040812080546001929061169d90849061313c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b611706848484611419565b61171284848484611e20565b610dbf5760405162461bcd60e51b815260040161035490612fd4565b6060611739826112c9565b6000838152600b602052604090206003015461175490611f2d565b6000848152600b602052604090206003015461176f906112c9565b60405160200161178193929190612cdb565b6040516020818303038152906040529050919050565b60606117a2826112c9565b6000838152600b60205260409020600301546117bd906112c9565b6009546117d2906001600160a01b03166120dc565b6000858152600b60205260409020546117f3906001600160a01b03166120dc565b6040516020016117819493929190612d5a565b6000818152600b602052604081206002015460609190611825906112c9565b6000848152600b602052604090206003015461184090611f2d565b6000858152600b602052604090206003015461185b906112c9565b6000868152600b602052604090205461187c906001600160a01b03166120dc565b60405160200161188f9493929190612e2e565b60408051601f198184030181529190529392505050565b6000816040516020016118b991906126bb565b60405160208183030381529060405280519060200120836040516020016118e091906126bb565b6040516020818303038152906040528051906020012014905092915050565b606083600061190e85856132da565b67ffffffffffffffff811115611926576119266133ec565b6040519080825280601f01601f191660200182016040528015611950576020820181803683370190505b509050845b848110156119c25782818151811061196f5761196f6133d6565b01602001516001600160f81b0319168261198988846132da565b81518110611999576119996133d6565b60200101906001600160f81b031916908160001a905350806119ba8161337b565b915050611955565b5095945050505050565b60606000826040516020016119e391815260200190565b6040516020818303038152906040528051906020012090506000836002611a0a919061329a565b611a1590600161313c565b604051602001611a2791815260200190565b6040516020818303038152906040528051906020012090506000806004611a4f600086612223565b611a599190613396565b611a6490600161313c565b60408051602081019091526000815290915060015b828111611caf57611a8a818961313c565b604051602001611a9c91815260200190565b6040516020818303038152906040528051906020012093506000600282611ac39190613396565b611ace6001846132da565b611ad990600261329a565b611ae3919061313c565b905082611aef856112c9565b611afd6103d56001866132da565b611b22848b60405180604001604052806002815260200161373760f01b81525061223f565b604051602001611b359493929190612a39565b60408051601f198184030181528282019091526002825261373760f01b602083015293508390611b68908390899061223f565b604051602001611b79929190612928565b604051602081830303815290604052925082611b9b60026103ea600189612223565b604051602001611bac9291906128c6565b604051602081830303815290604052925082611be36005611bce600289612223565b611bd89190613179565b6103d590600761329a565b611bf36005611bce60038a612223565b604051602001611c0593929190612845565b604051602081830303815290604052925082611c3c6080611c27600489612223565b611c319190613179565b6103d590600161313c565b611c56600a611c4c60048a612223565b6103d59190613396565b611c666080611c2760058b612223565b611c76600a611c4c60058c612223565b604051602001611c8a959493929190612983565b6040516020818303038152906040529250508080611ca79061337b565b915050611a79565b5080600d600081548110611cc557611cc56133d6565b90600052602060002001611cf5600a8660405180604001604052806002815260200161333360f11b81525061223f565b604051602001611d0793929190612749565b60408051601f19818403018152919052979650505050505050565b606081611d465750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d705780611d5a8161337b565b9150611d699050600a83613179565b9150611d4a565b60008167ffffffffffffffff811115611d8b57611d8b6133ec565b6040519080825280601f01601f191660200182016040528015611db5576020820181803683370190505b5090505b841561141157611dca6001836132da565b9150611dd7600a86613396565b611de290603061313c565b60f81b818381518110611df757611df76133d6565b60200101906001600160f81b031916908160001a905350611e19600a86613179565b9450611db9565b60006001600160a01b0384163b15611f2257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e64903390899088908890600401612f84565b602060405180830381600087803b158015611e7e57600080fd5b505af1925050508015611eae575060408051601f3d908101601f19168201909252611eab9181019061255b565b60015b611f08573d808015611edc576040519150601f19603f3d011682016040523d82523d6000602084013e611ee1565b606091505b508051611f005760405162461bcd60e51b815260040161035490612fd4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611411565b506001949350505050565b60095460405163c87b56dd60e01b8152600481018390526060916000916001600160a01b039091169063c87b56dd9060240160006040518083038186803b158015611f7757600080fd5b505afa158015611f8b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fb391908101906125c1565b90506000611fc482601a601b6118ff565b9050611fe981604051806040016040528060018152602001607360f81b8152506118a6565b1561201557505060408051808201909152600881526749737375616e636560c01b602082015292915050565b61203881604051806040016040528060018152602001606960f81b8152506118a6565b156120635750506040805180820190915260078152664d696e6572203160c81b602082015292915050565b61208681604051806040016040528060018152602001606560f81b8152506118a6565b156120b2575050604080518082019091526008815267536563757269747960c01b602082015292915050565b505060408051808201909152600b81526a24b73a32b3b930ba34b7b760a91b602082015292915050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b601481101561221c5760006121198260136132da565b61212490600861329a565b61212f9060026131f2565b612142906001600160a01b038716613179565b60f81b9050600060108260f81c612159919061318d565b60f81b905060008160f81c601061217091906132b9565b8360f81c61217e91906132f1565b60f81b905061218c82612286565b8561219886600261329a565b815181106121a8576121a86133d6565b60200101906001600160f81b031916908160001a9053506121c881612286565b856121d486600261329a565b6121df90600161313c565b815181106121ef576121ef6133d6565b60200101906001600160f81b031916908160001a90535050505080806122149061337b565b915050612103565b5092915050565b6000818360148110612237576122376133d6565b1a9392505050565b606061225c6122508460601c6120dc565b8561128181600661313c565b8260405160200161226e9291906126d7565b60405160208183030381529060405290509392505050565b6000600a60f883901c10156122ad576122a460f883901c6030613154565b60f81b92915050565b6122a460f883901c6057613154565b8280546122c890613340565b90600052602060002090601f0160209004810192826122ea5760008555612330565b82601f1061230357805160ff1916838001178555612330565b82800160010185558215612330579182015b82811115612330578251825591602001919060010190612315565b5061233c929150612340565b5090565b5b8082111561233c5760008155600101612341565b600061236861236384613114565b6130e3565b905082815283838301111561237c57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156123a557600080fd5b813561045381613402565b6000602082840312156123c257600080fd5b815161045381613402565b600080604083850312156123e057600080fd5b82356123eb81613402565b915060208301356123fb81613402565b809150509250929050565b60008060006060848603121561241b57600080fd5b833561242681613402565b9250602084013561243681613402565b929592945050506040919091013590565b6000806000806080858703121561245d57600080fd5b843561246881613402565b9350602085013561247881613402565b925060408501359150606085013567ffffffffffffffff81111561249b57600080fd5b8501601f810187136124ac57600080fd5b6124bb87823560208401612355565b91505092959194509250565b600080604083850312156124da57600080fd5b82356124e581613402565b915060208301356123fb81613417565b6000806040838503121561250857600080fd5b823561251381613402565b946020939093013593505050565b60006020828403121561253357600080fd5b815161045381613417565b60006020828403121561255057600080fd5b813561045381613425565b60006020828403121561256d57600080fd5b815161045381613425565b60006020828403121561258a57600080fd5b813567ffffffffffffffff8111156125a157600080fd5b8201601f810184136125b257600080fd5b61141184823560208401612355565b6000602082840312156125d357600080fd5b815167ffffffffffffffff8111156125ea57600080fd5b8201601f810184136125fb57600080fd5b805161260961236382613114565b81815285602083850101111561261e57600080fd5b61262f826020830160208601613314565b95945050505050565b60006020828403121561264a57600080fd5b5035919050565b6000806040838503121561266457600080fd5b50508035926020909101359150565b6000815180845261268b816020860160208601613314565b601f01601f19169290920160200192915050565b600081516126b1818560208601613314565b9290920192915050565b600082516126cd818460208701613314565b9190910192915050565b600083516126e9818460208801613314565b8351908301906126fd818360208801613314565b01949350505050565b60008451612718818460208901613314565b84519083019061272c818360208901613314565b845191019061273f818360208801613314565b0195945050505050565b60008451602061275c8285838a01613314565b855491840191600090600181811c908083168061277a57607f831692505b85831081141561279857634e487b7160e01b85526022600452602485fd5b8080156127ac57600181146127bd576127ea565b60ff198516885283880195506127ea565b60008c81526020902060005b858110156127e25781548a8201529084019088016127c9565b505083880195505b50505050506128396127fc828861269f565b7f21696d706f7274616e743b7472616e73666f726d3a7363616c6528312c31292181526a696d706f7274616e743b7d60a81b6020820152602b0190565b98975050505050505050565b60008451612857818460208901613314565b6e0e8e4c2dce6ccdee4da74e6d6caee5608b1b908301908152845161288381600f840160208901613314565b63191959cb60e21b600f929091019182015283516128a8816013840160208801613314565b636465672960e01b6013929091019182015260170195945050505050565b600083516128d8818460208801613314565b6c39ba3937b5b296bbb4b23a341d60991b908301908152835161290281600d840160208801613314565b6c707421696d706f7274616e743b60981b600d9290910191820152601a01949350505050565b6000835161293a818460208801613314565b677374726f6b653a2360c01b908301908152835161295f816008840160208801613314565b6a21696d706f7274616e743b60a81b60089290910191820152601301949350505050565b60008651612995818460208b01613314565b66040e6c6c2d8ca560cb1b90830190815286516129b9816007840160208b01613314565b808201915050601760f91b80600783015286516129dd816008850160208b01613314565b600b60fa1b6008939091019283015285516129ff816009850160208a01613314565b60099201918201528351612a1a81600a840160208801613314565b62293b7d60e81b600a9290910191820152600d01979650505050505050565b60008551612a4b818460208a01613314565b80830190507f6c696e652c20746578742c20636972636c652c20706174683a6e74682d6368698152620d8c8560eb1b60208201528551612a92816023840160208a01613314565b616e2b60f01b602392909101918201528451612ab5816025840160208901613314565b67297b66696c6c3a2360c01b602592909101918201528351612ade81602d840160208801613314565b6a21696d706f7274616e743b60a81b602d92909101918201526038019695505050505050565b683d913730b6b2911d1160b91b81528451600090612b29816009850160208a01613314565b71111610113232b9b1b934b83a34b7b7111d1160711b6009918401918201528551612b5b81601b840160208a01613314565b70222c202261747472696275746573223a5b60781b601b92909101918201528451612b8d81602c840160208901613314565b7f5d2c2022637265617465645f6279223a2254616b656e73205468656f72656d22602c92909101918201526a16101134b6b0b3b2911d1160a91b604c8201528351612bdf816057840160208801613314565b61227d60f01b605792909101918201526059019695505050505050565b6415d052550b60da1b815260008651612c1c816005850160208b01613314565b8083019050600b60fa1b8060058301528751612c3f816006850160208c01613314565b600692019182018190528651612c5c816007850160208b01613314565b600792019182018190528551612c79816008850160208a01613314565b60089201918201528351612c94816009840160208801613314565b01600901979650505050505050565b6f19185d184e9d195e1d0bdc1b185a5b8b60821b815260008251612cce816010850160208701613314565b9190910160100192915050565b634c32202360e01b815260008451612cfa816004850160208901613314565b61040560f31b6004918401918201528451612d1c816006840160208901613314565b612f2360f01b600692909101918201528351612d3f816008840160208801613314565b602960f81b6008929091019182015260090195945050505050565b634c32202360e01b815260008551612d79816004850160208a01613314565b73206f66207468655f636f696e20746f6b656e202360601b6004918401918201528551612dad816018840160208a01613314565b7f5c6e5c6e2d2042617365206c6179657220636f6e74726163743a5c6e2d203078601892909101918201528451612deb816038840160208901613314565b730b8dcb8dc5a4084ead2d8c8cae474b8dc5a4060f60631b603892909101918201528351612e2081604c840160208801613314565b01604c019695505050505050565b7f7b2274726169745f74797065223a224d696e7420426c6f636b222c2276616c75815260006332911d1160e11b8060208401528651612e74816024860160208b01613314565b62089f4b60ea1b60249185019182018190527f7b2274726169745f74797065223a224261736520546f6b656e222c2276616c7560278301526047820192909252865191612ec883604b840160208b01613314565b9101604b8101919091527f7b2274726169745f74797065223a224261736520546f6b656e2023222c227661604e82015265363ab2911d1160d11b606e8201528451612f1a816074840160208901613314565b612839612f76612f70612f3b60748587010162089f4b60ea1b815260030190565b7f7b2274726169745f74797065223a224275696c646572222c2276616c7565223a81526204460f60eb1b602082015260230190565b8761269f565b61227d60f01b815260020190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612fb790830184612673565b9695505050505050565b6020815260006104536020830184612673565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601e908201527f4552524f523a206e6f742076616c6964206261736520746f6b656e2049440000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561310c5761310c6133ec565b604052919050565b600067ffffffffffffffff82111561312e5761312e6133ec565b50601f01601f191660200190565b6000821982111561314f5761314f6133aa565b500190565b600060ff821660ff84168060ff03821115613171576131716133aa565b019392505050565b600082613188576131886133c0565b500490565b600060ff8316806131a0576131a06133c0565b8060ff84160491505092915050565b600181815b808511156131ea5781600019048211156131d0576131d06133aa565b808516156131dd57918102915b93841c93908002906131b4565b509250929050565b6000610453838360008261320857506001610320565b8161321557506000610320565b816001811461322b576002811461323557613251565b6001915050610320565b60ff841115613246576132466133aa565b50506001821b610320565b5060208310610133831016604e8410600b8410161715613274575081810a610320565b61327e83836131af565b8060001904821115613292576132926133aa565b029392505050565b60008160001904831182151516156132b4576132b46133aa565b500290565b600060ff821660ff84168160ff0481118215151615613292576132926133aa565b6000828210156132ec576132ec6133aa565b500390565b600060ff821660ff84168082101561330b5761330b6133aa565b90039392505050565b60005b8381101561332f578181015183820152602001613317565b83811115610dbf5750506000910152565b600181811c9082168061335457607f821691505b6020821081141561337557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561338f5761338f6133aa565b5060010190565b6000826133a5576133a56133c0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146107f657600080fd5b80151581146107f657600080fd5b6001600160e01b0319811681146107f657600080fdfea2646970667358221220aa7b37bf65ed4912a88d3cdfcd9dbd4c63d2caff23f3c745a9fcbb5509a1941e64736f6c63430008070033

Deployed Bytecode Sourcemap

38593:9138:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11010:292;;;;;;:::i;:::-;;:::i;:::-;;;26142:14:1;;26135:22;26117:41;;26105:2;26090:18;11010:292:0;;;;;;;;39180:794;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11942:100::-;;;:::i;13402:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;25120:32:1;;;25102:51;;25090:2;25075:18;13402:221:0;24956:203:1;12939:397:0;;;;;;:::i;:::-;;:::i;:::-;;43337:355;;;;;;:::i;:::-;;:::i;14292:305::-;;;;;;:::i;:::-;;:::i;14668:151::-;;;;;;:::i;:::-;;:::i;11636:239::-;;;;;;:::i;:::-;;:::i;11366:208::-;;;;;;:::i;:::-;;:::i;:::-;;;34768:25:1;;;34756:2;34741:18;11366:208:0;34622:177:1;24481:148:0;;;:::i;23830:87::-;23903:6;;-1:-1:-1;;;;;23903:6:0;23830:87;;12111:104;;;:::i;13695:295::-;;;;;;:::i;:::-;;:::i;43772:1052::-;;;;;;:::i;:::-;;:::i;14890:285::-;;;;;;:::i;:::-;;:::i;46826:765::-;;;;;;:::i;:::-;;:::i;14061:164::-;;;;;;:::i;:::-;;:::i;24784:244::-;;;;;;:::i;:::-;;:::i;42105:1162::-;;;;;;:::i;:::-;;:::i;11010:292::-;11112:4;-1:-1:-1;;;;;;11136:40:0;;-1:-1:-1;;;11136:40:0;;:105;;-1:-1:-1;;;;;;;11193:48:0;;-1:-1:-1;;;11193:48:0;11136:105;:158;;;-1:-1:-1;;;;;;;;;;7605:40:0;;;11258:36;11129:165;11010:292;-1:-1:-1;;11010:292:0:o;39180:794::-;39243:13;39291:2;39277:11;:16;:35;;;;;39311:1;39297:11;:15;39277:35;39269:78;;;;-1:-1:-1;;;39269:78:0;;;;;;;:::i;:::-;;;;;;;;;39358:16;39394:24;;;:11;:24;;;;;;39377:16;;:41;;39394:24;39377:41;:::i;:::-;39358:60;;39429:21;39481:8;39465:12;:24;39461:481;;-1:-1:-1;39506:27:0;;;;;;;;;;;;-1:-1:-1;;;39506:27:0;;;;39461:481;;;39566:9;39578:23;39589:12;39578:8;:23;:::i;:::-;39566:35;;39684:4;39686:1;39684;:4::i;:::-;39729:7;39731:4;:1;39733:2;39731:4;:::i;:::-;39729:1;:7::i;:::-;39779:10;39786:2;39781:4;:1;39783:2;39781:4;:::i;:::-;:7;;;;:::i;39779:10::-;39829:13;39839:2;;39831:4;:1;39833:2;39831:4;:::i;:::-;:7;;;;:::i;39829:13::-;39881:16;39894:2;39891;;39883:4;:1;39885:2;39883:4;:::i;:::-;:7;;;;:::i;39881:16::-;39633:296;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39616:314;;39551:391;39461:481;39959:7;39180:794;-1:-1:-1;;;39180:794:0:o;11942:100::-;11996:13;12029:5;12022:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11942:100;:::o;13402:221::-;13478:7;16731:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16731:16:0;13498:73;;;;-1:-1:-1;;;13498:73:0;;32107:2:1;13498:73:0;;;32089:21:1;32146:2;32126:18;;;32119:30;32185:34;32165:18;;;32158:62;-1:-1:-1;;;32236:18:1;;;32229:42;32288:19;;13498:73:0;31905:408:1;13498:73:0;-1:-1:-1;13591:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;13591:24:0;;13402:221::o;12939:397::-;13020:13;13036:23;13051:7;13036:14;:23::i;:::-;13020:39;;13084:5;-1:-1:-1;;;;;13078:11:0;:2;-1:-1:-1;;;;;13078:11:0;;;13070:57;;;;-1:-1:-1;;;13070:57:0;;33650:2:1;13070:57:0;;;33632:21:1;33689:2;33669:18;;;33662:30;33728:34;33708:18;;;33701:62;-1:-1:-1;;;33779:18:1;;;33772:31;33820:19;;13070:57:0;33448:397:1;13070:57:0;8279:10;-1:-1:-1;;;;;13148:21:0;;;;:62;;-1:-1:-1;13173:37:0;13190:5;8279:10;14061:164;:::i;13173:37::-;13140:154;;;;-1:-1:-1;;;13140:154:0;;29322:2:1;13140:154:0;;;29304:21:1;29361:2;29341:18;;;29334:30;29400:34;29380:18;;;29373:62;29471:26;29451:18;;;29444:54;29515:19;;13140:154:0;29120:420:1;13140:154:0;13307:21;13316:2;13320:7;13307:8;:21::i;:::-;13009:327;12939:397;;:::o;43337:355::-;23903:6;;-1:-1:-1;;;;;23903:6:0;8279:10;24050:23;24042:68;;;;-1:-1:-1;;;24042:68:0;;;;;;;:::i;:::-;43428:1:::1;43414:3;43408:17;;;;;:::i;:::-;;;:21;43400:59;;;::::0;-1:-1:-1;;;43400:59:0;;34470:2:1;43400:59:0::1;::::0;::::1;34452:21:1::0;34509:2;34489:18;;;34482:30;34548:27;34528:18;;;34521:55;34593:18;;43400:59:0::1;34268:349:1::0;43400:59:0::1;43480:1;43482;43480:4;;;;;;;;:::i;:::-;;;;;;;;43474:18;;;;;:::i;:::-;:23:::0;43470:215:::1;::::0;-1:-1:-1;43470:215:0::1;;43521:3;43514:1;43516;43514:4;;;;;;;;:::i;:::-;;;;;;;;:10;;;;;;;;;;;;:::i;:::-;;43337:355:::0;:::o;43470:215::-:1;43552:1;43554;43552:4;;;;;;;;:::i;:::-;;;;;;;;43546:18;;;;;:::i;:::-;:23:::0;43542:143:::1;::::0;-1:-1:-1;43542:143:0::1;;43593:3;43586:1;43588;43586:4;;;;;;;;:::i;43542:143::-;43638:1;43624:3;43618:17;;;;;:::i;:::-;;;:21;43614:71;;;43656:9:::0;;::::1;::::0;:3:::1;::::0;:9:::1;::::0;::::1;::::0;::::1;:::i;43614:71::-;43337:355:::0;:::o;14292:305::-;14453:41;8279:10;14486:7;14453:18;:41::i;:::-;14445:103;;;;-1:-1:-1;;;14445:103:0;;;;;;;:::i;:::-;14561:28;14571:4;14577:2;14581:7;14561:9;:28::i;14668:151::-;14772:39;14789:4;14795:2;14799:7;14772:39;;;;;;;;;;;;:16;:39::i;11636:239::-;11708:7;11744:16;;;:7;:16;;;;;;-1:-1:-1;;;;;11744:16:0;11779:19;11771:73;;;;-1:-1:-1;;;11771:73:0;;30507:2:1;11771:73:0;;;30489:21:1;30546:2;30526:18;;;30519:30;30585:34;30565:18;;;30558:62;-1:-1:-1;;;30636:18:1;;;30629:39;30685:19;;11771:73:0;30305:405:1;11366:208:0;11438:7;-1:-1:-1;;;;;11466:19:0;;11458:74;;;;-1:-1:-1;;;11458:74:0;;30096:2:1;11458:74:0;;;30078:21:1;30135:2;30115:18;;;30108:30;30174:34;30154:18;;;30147:62;-1:-1:-1;;;30225:18:1;;;30218:40;30275:19;;11458:74:0;29894:406:1;11458:74:0;-1:-1:-1;;;;;;11550:16:0;;;;;:9;:16;;;;;;;11366:208::o;24481:148::-;23903:6;;-1:-1:-1;;;;;23903:6:0;8279:10;24050:23;24042:68;;;;-1:-1:-1;;;24042:68:0;;;;;;;:::i;:::-;24572:6:::1;::::0;24551:40:::1;::::0;24588:1:::1;::::0;-1:-1:-1;;;;;24572:6:0::1;::::0;24551:40:::1;::::0;24588:1;;24551:40:::1;24602:6;:19:::0;;-1:-1:-1;;;;;;24602:19:0::1;::::0;;24481:148::o;12111:104::-;12167:13;12200:7;12193:14;;;;;:::i;13695:295::-;-1:-1:-1;;;;;13798:24:0;;8279:10;13798:24;;13790:62;;;;-1:-1:-1;;;13790:62:0;;28194:2:1;13790:62:0;;;28176:21:1;28233:2;28213:18;;;28206:30;28272:27;28252:18;;;28245:55;28317:18;;13790:62:0;27992:349:1;13790:62:0;8279:10;13865:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;13865:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;13865:53:0;;;;;;;;;;13934:48;;26117:41:1;;;13865:42:0;;8279:10;13934:48;;26090:18:1;13934:48:0;;;;;;;13695:295;;:::o;43772:1052::-;43869:3;43863:17;;;;;:::i;:::-;:20;;-1:-1:-1;43855:53:0;;;;-1:-1:-1;;;43855:53:0;;29747:2:1;43855:53:0;;;29729:21:1;29786:2;29766:18;;;29759:30;-1:-1:-1;;;29805:18:1;;;29798:50;29865:18;;43855:53:0;29545:344:1;43855:53:0;43984:2;43970:11;:16;:35;;;;;44004:1;43990:11;:15;43970:35;43962:78;;;;-1:-1:-1;;;43962:78:0;;;;;;;:::i;:::-;44155:16;;44146:47;;-1:-1:-1;;;44146:47:0;;;;;34768:25:1;;;44127:16:0;;-1:-1:-1;;;;;44155:16:0;;44146:34;;34741:18:1;;44146:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44231:16;;44222:65;;-1:-1:-1;;;44222:65:0;;-1:-1:-1;;;;;25394:15:1;;;44222:65:0;;;25376:34:1;44276:10:0;25426:18:1;;;25419:43;44127:66:0;;-1:-1:-1;44204:15:0;;44231:16;;;;44222:43;;25311:18:1;;44222:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44204:83;-1:-1:-1;;;;;;44306:22:0;;44318:10;44306:22;;:36;;;44332:10;44306:36;44298:91;;;;-1:-1:-1;;;44298:91:0;;31696:2:1;44298:91:0;;;31678:21:1;31735:2;31715:18;;;31708:30;31774:34;31754:18;;;31747:62;-1:-1:-1;;;31825:18:1;;;31818:40;31875:19;;44298:91:0;31494:406:1;44298:91:0;44502:16;;44474:24;;;;:11;:24;;;;;;44459:39;;:12;:39;:::i;:::-;:59;;44451:104;;;;-1:-1:-1;;;44451:104:0;;28548:2:1;44451:104:0;;;28530:21:1;;;28567:18;;;28560:30;28626:34;28606:18;;;28599:62;28678:18;;44451:104:0;28346:356:1;44451:104:0;44576:21;:9;9489:19;;9507:1;9489:19;;;9400:127;44576:21;44608:17;44628:19;:9;9370:14;;9278:114;44628:19;44677:48;;;;;;;;44680:10;44677:48;;;;;;;;;;44699:12;44677:48;;;;;;;;;;;;-1:-1:-1;44660:14:0;;;:3;:14;;;;;:65;;;;-1:-1:-1;;;;;;44660:65:0;-1:-1:-1;;;;;44660:65:0;;;;;;;;-1:-1:-1;44660:65:0;;;;;;;;;;;;;;;;;;44736:24;;;:11;:24;;;;;;;:39;44660:14;;-1:-1:-1;44788:28:0;;44660:14;44788:5;:28::i;:::-;43836:988;;;43772:1052;;:::o;14890:285::-;15022:41;8279:10;15055:7;15022:18;:41::i;:::-;15014:103;;;;-1:-1:-1;;;15014:103:0;;;;;;;:::i;:::-;15128:39;15142:4;15148:2;15152:7;15161:5;15128:13;:39::i;:::-;14890:285;;;;:::o;46826:765::-;46891:13;46931:3;46925:17;;;;;:::i;:::-;:20;;-1:-1:-1;46917:53:0;;;;-1:-1:-1;;;46917:53:0;;29747:2:1;46917:53:0;;;29729:21:1;29786:2;29766:18;;;29759:30;-1:-1:-1;;;29805:18:1;;;29798:50;29865:18;;46917:53:0;29545:344:1;46917:53:0;16707:4;16731:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16731:16:0;46981:78;;;;-1:-1:-1;;;46981:78:0;;31278:2:1;46981:78:0;;;31260:21:1;31317:2;31297:18;;;31290:30;31356:34;31336:18;;;31329:62;-1:-1:-1;;;31407:18:1;;;31400:47;31464:19;;46981:78:0;31076:413:1;46981:78:0;47088:17;47138;47147:7;47138:8;:17::i;:::-;47223:24;47239:7;47223:15;:24::i;:::-;47315:23;47330:7;47315:14;:23::i;:::-;47455:12;;;;:3;:12;;;;;:23;;;;47479:18;;;;;47445:53;;47455:23;47445:9;:53::i;:::-;47108:397;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47088:417;;47577:4;47540:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;47526:57;;;46826:765;;;:::o;14061:164::-;-1:-1:-1;;;;;14182:25:0;;;14158:4;14182:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;14061:164::o;24784:244::-;23903:6;;-1:-1:-1;;;;;23903:6:0;8279:10;24050:23;24042:68;;;;-1:-1:-1;;;24042:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24873:22:0;::::1;24865:73;;;::::0;-1:-1:-1;;;24865:73:0;;27025:2:1;24865:73:0::1;::::0;::::1;27007:21:1::0;27064:2;27044:18;;;27037:30;27103:34;27083:18;;;27076:62;-1:-1:-1;;;27154:18:1;;;27147:36;27200:19;;24865:73:0::1;26823:402:1::0;24865:73:0::1;24975:6;::::0;24954:38:::1;::::0;-1:-1:-1;;;;;24954:38:0;;::::1;::::0;24975:6:::1;::::0;24954:38:::1;::::0;24975:6:::1;::::0;24954:38:::1;25003:6;:17:::0;;-1:-1:-1;;;;;;25003:17:0::1;-1:-1:-1::0;;;;;25003:17:0;;;::::1;::::0;;;::::1;::::0;;24784:244::o;42105:1162::-;42181:13;42293:2;42279:11;:16;:35;;;;;42313:1;42299:11;:15;42279:35;42271:78;;;;-1:-1:-1;;;42271:78:0;;;;;;;:::i;:::-;42391:16;;42382:46;;-1:-1:-1;;;42382:46:0;;;;;34768:25:1;;;42362:17:0;;-1:-1:-1;;;;;42391:16:0;;42382:33;;34741:18:1;;42382:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42382:46:0;;;;;;;;;;;;:::i;:::-;42362:66;-1:-1:-1;42441:18:0;;42506:16;;42574:1;42560:497;42587:3;42581:17;42577:1;:21;42560:497;;;42655:3;42660;42662:1;42660;:3;:::i;:::-;42649:15;;;;;;;;:::i;:::-;;;;;;;42632:33;;-1:-1:-1;;;;;;42649:15:0;;;42632:33;;;6786:39:1;;;;6841:11;;42632:33:0;;;;;;;;;;;;42620:46;;42716:3;42721:1;42710:13;;;;;;;;:::i;:::-;;;;;;;42693:31;;-1:-1:-1;;;;;;42710:13:0;;;42693:31;;;6786:39:1;;;;6841:11;;42693:31:0;;;-1:-1:-1;;42693:31:0;;;;;;42744:30;;;;;;;;;-1:-1:-1;;;42693:31:0;42744:30;;;42693:31;-1:-1:-1;42744:30:0;;42767:2;;42744:22;:30::i;:::-;:64;;;;;42778:30;42801:2;42778:30;;;;;;;;;;;;;-1:-1:-1;;;42778:30:0;;;:22;:30::i;:::-;42744:83;;;;-1:-1:-1;42812:15:0;;42744:83;42740:306;;;42861:1;42848:14;;42740:306;;;42888:30;42911:2;42888:30;;;;;;;;;;;;;-1:-1:-1;;;42888:30:0;;;:22;:30::i;:::-;:64;;;;;42922:30;42945:2;42922:30;;;;;;;;;;;;;-1:-1:-1;;;42922:30:0;;;:22;:30::i;:::-;42888:82;;;;;42960:10;42956:1;:14;42888:82;42884:162;;;43003:3;43005:1;43003;:3;:::i;:::-;42991:15;;43025:5;;42884:162;42600:3;;;;:::i;:::-;;;;42560:497;;;-1:-1:-1;43100:37:0;43118:3;43122:1;43124:12;:10;43135:1;43124:12;:::i;:::-;43100:17;:37::i;:::-;43164:16;43174:5;43164:9;:16::i;:::-;43207:50;43225:3;43229:9;43245:3;43239:17;43207;:50::i;:::-;43083:175;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43069:190;;;;;;;42105:1162;;;;:::o;40012:104::-;40056:13;40089:19;40106:1;40089:16;:19::i;20527:174::-;20602:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;20602:29:0;-1:-1:-1;;;;;20602:29:0;;;;;;;;:24;;20656:23;20602:24;20656:14;:23::i;:::-;-1:-1:-1;;;;;20647:46:0;;;;;;;;;;;20527:174;;:::o;16936:348::-;17029:4;16731:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16731:16:0;17046:73;;;;-1:-1:-1;;;17046:73:0;;28909:2:1;17046:73:0;;;28891:21:1;28948:2;28928:18;;;28921:30;28987:34;28967:18;;;28960:62;-1:-1:-1;;;29038:18:1;;;29031:42;29090:19;;17046:73:0;28707:408:1;17046:73:0;17130:13;17146:23;17161:7;17146:14;:23::i;:::-;17130:39;;17199:5;-1:-1:-1;;;;;17188:16:0;:7;-1:-1:-1;;;;;17188:16:0;;:51;;;;17232:7;-1:-1:-1;;;;;17208:31:0;:20;17220:7;17208:11;:20::i;:::-;-1:-1:-1;;;;;17208:31:0;;17188:51;:87;;;;17243:32;17260:5;17267:7;17243:16;:32::i;:::-;17180:96;16936:348;-1:-1:-1;;;;16936:348:0:o;19865:544::-;19990:4;-1:-1:-1;;;;;19963:31:0;:23;19978:7;19963:14;:23::i;:::-;-1:-1:-1;;;;;19963:31:0;;19955:85;;;;-1:-1:-1;;;19955:85:0;;33240:2:1;19955:85:0;;;33222:21:1;33279:2;33259:18;;;33252:30;33318:34;33298:18;;;33291:62;-1:-1:-1;;;33369:18:1;;;33362:39;33418:19;;19955:85:0;33038:405:1;19955:85:0;-1:-1:-1;;;;;20059:16:0;;20051:65;;;;-1:-1:-1;;;20051:65:0;;27789:2:1;20051:65:0;;;27771:21:1;27828:2;27808:18;;;27801:30;27867:34;27847:18;;;27840:62;-1:-1:-1;;;27918:18:1;;;27911:34;27962:19;;20051:65:0;27587:400:1;20051:65:0;20233:29;20250:1;20254:7;20233:8;:29::i;:::-;-1:-1:-1;;;;;20275:15:0;;;;;;:9;:15;;;;;:20;;20294:1;;20275:15;:20;;20294:1;;20275:20;:::i;:::-;;;;-1:-1:-1;;;;;;;20306:13:0;;;;;;:9;:13;;;;;:18;;20323:1;;20306:13;:18;;20323:1;;20306:18;:::i;:::-;;;;-1:-1:-1;;20335:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;20335:21:0;-1:-1:-1;;;;;20335:21:0;;;;;;;;;20374:27;;20335:16;;20374:27;;;;;;;19865:544;;;:::o;18557:382::-;-1:-1:-1;;;;;18637:16:0;;18629:61;;;;-1:-1:-1;;;18629:61:0;;30917:2:1;18629:61:0;;;30899:21:1;;;30936:18;;;30929:30;30995:34;30975:18;;;30968:62;31047:18;;18629:61:0;30715:356:1;18629:61:0;16707:4;16731:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16731:16:0;:30;18701:58;;;;-1:-1:-1;;;18701:58:0;;27432:2:1;18701:58:0;;;27414:21:1;27471:2;27451:18;;;27444:30;27510;27490:18;;;27483:58;27558:18;;18701:58:0;27230:352:1;18701:58:0;-1:-1:-1;;;;;18830:13:0;;;;;;:9;:13;;;;;:18;;18847:1;;18830:13;:18;;18847:1;;18830:18;:::i;:::-;;;;-1:-1:-1;;18859:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;18859:21:0;-1:-1:-1;;;;;18859:21:0;;;;;;;;18898:33;;18859:16;;;18898:33;;18859:16;;18898:33;18557:382;;:::o;16057:272::-;16171:28;16181:4;16187:2;16191:7;16171:9;:28::i;:::-;16218:48;16241:4;16247:2;16251:7;16260:5;16218:22;:48::i;:::-;16210:111;;;;-1:-1:-1;;;16210:111:0;;;;;;;:::i;46101:261::-;46158:13;46223:10;46225:7;46223:1;:10::i;:::-;46278:12;;;;:3;:12;;;;;:23;;;46266:36;;:11;:36::i;:::-;46324:12;;;;:3;:12;;;;;:23;;;46322:26;;:1;:26::i;:::-;46198:155;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46184:170;;46101:261;;;:::o;46414:404::-;46478:13;46543:10;46545:7;46543:1;:10::i;:::-;46594:12;;;;:3;:12;;;;;:23;;;46592:26;;:1;:26::i;:::-;46693:16;;46671:39;;-1:-1:-1;;;;;46693:16:0;46671:21;:39::i;:::-;46787:12;;;;:3;:12;;;;;:20;46765:43;;-1:-1:-1;;;;;46787:20:0;46765:21;:43::i;:::-;46518:291;;;;;;;;;;;:::i;45492:564::-;45583:21;45688:12;;;:3;:12;;;;;:23;;;45555:13;;45583:21;45686:26;;:1;:26::i;:::-;45786:12;;;;:3;:12;;;;;:23;;;45774:36;;:11;:36::i;:::-;45876:12;;;;:3;:12;;;;;:23;;;45874:26;;:1;:26::i;:::-;45983:12;;;;:3;:12;;;;;:20;45961:43;;-1:-1:-1;;;;;45983:20:0;45961:21;:43::i;:::-;45614:407;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;45614:407:0;;;;;;;;;;45492:564;-1:-1:-1;;;45492:564:0:o;36989:183::-;37070:4;37159:1;37141:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;37131:32;;;;;;37123:1;37105:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;37095:32;;;;;;:68;37087:77;;36989:183;;;;:::o;36602:371::-;36695:13;36751:3;36721:21;36798:19;36807:10;36798:8;:19;:::i;:::-;36788:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36788:30:0;-1:-1:-1;36766:52:0;-1:-1:-1;36842:10:0;36829:105;36858:8;36854:1;:12;36829:105;;;36911:8;36920:1;36911:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;36911:11:0;36888:6;36895:12;36897:10;36895:1;:12;:::i;:::-;36888:20;;;;;;;;:::i;:::-;;;;:34;-1:-1:-1;;;;;36888:34:0;;;;;;;;-1:-1:-1;36868:3:0;;;;:::i;:::-;;;;36829:105;;;-1:-1:-1;36958:6:0;36602:371;-1:-1:-1;;;;;36602:371:0:o;40200:1377::-;40256:13;40362:11;40411:5;40394:23;;;;;;24898:19:1;;24942:2;24933:12;;24769:182;40394:23:0;;;;;;;;;;;;;40384:34;;;;;;40362:57;;40430:11;40479:5;40485:1;40479:7;;;;:::i;:::-;:9;;40487:1;40479:9;:::i;:::-;40462:27;;;;;;24898:19:1;;24942:2;24933:12;;24769:182;40462:27:0;;;;;;;;;;;;;40452:38;;;;;;40430:61;;40502:11;40526:9;40550:1;40538:9;40541:1;40543:3;40538:2;:9::i;:::-;:13;;;;:::i;:::-;:17;;40554:1;40538:17;:::i;:::-;40585:22;;;;;;;;;:17;:22;;40526:29;;-1:-1:-1;40637:1:0;40620:808;40645:1;40640;:6;40620:808;;40709:7;40715:1;40709:5;:7;:::i;:::-;40692:25;;;;;;24898:19:1;;24942:2;24933:12;;24769:182;40692:25:0;;;;;;;;;;;;;40682:36;;;;;;40668:51;;40763:9;40790:1;40788;:3;;;;:::i;:::-;40776;40778:1;40776;:3;:::i;:::-;40775:9;;40783:1;40775:9;:::i;:::-;:17;;;;:::i;:::-;40763:29;;40861:3;40903:4;40905:1;40903;:4::i;:::-;40913:6;40915:3;40917:1;40915;:3;:::i;40913:6::-;40931:14;40934:1;40936:3;40931:14;;;;;;;;;;;;;-1:-1:-1;;;40931:14:0;;;:2;:14::i;:::-;40844:116;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;40844:116:0;;;;;;41021:14;;;;;;;;;-1:-1:-1;;;40844:116:0;41021:14;;;40844:116;-1:-1:-1;40844:116:0;;41021:14;;41024:1;;41026:3;;41021:2;:14::i;:::-;40989:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40976:75;;41096:3;41116:14;41128:1;41118:9;41121:1;41123:3;41118:2;:9::i;41116:14::-;41079:68;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41066:82;;41193:3;41215:18;41230:1;41220:9;41223:1;41225:3;41220:2;:9::i;:::-;:11;;;;:::i;:::-;41217:15;;:1;:15;:::i;41215:18::-;41241;41256:1;41246:9;41249:1;41251:3;41246:2;:9::i;41241:18::-;41176:91;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41163:105;;41313:3;41327:18;41339:3;41329:9;41332:1;41334:3;41329:2;:9::i;:::-;:13;;;;:::i;:::-;:15;;41343:1;41329:15;:::i;41327:18::-;41350:15;41362:2;41352:9;41355:1;41357:3;41352:2;:9::i;:::-;:12;;;;:::i;41350:15::-;41370:18;41382:3;41372:9;41375:1;41377:3;41372:2;:9::i;41370:18::-;41393:15;41405:2;41395:9;41398:1;41400:3;41395:2;:9::i;41393:15::-;41296:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41283:133;;40653:775;40648:3;;;;;:::i;:::-;;;;40620:808;;;;41468:3;41472:1;41474;41472:4;;;;;;;;:::i;:::-;;;;;;;;41477:15;41480:2;41483:3;41477:15;;;;;;;;;;;;;-1:-1:-1;;;41477:15:0;;;:2;:15::i;:::-;41451:88;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;41451:88:0;;;;;;;;;;40200:1377;-1:-1:-1;;;;;;;40200:1377:0:o;34020:723::-;34076:13;34297:10;34293:53;;-1:-1:-1;;34324:10:0;;;;;;;;;;;;-1:-1:-1;;;34324:10:0;;;;;34020:723::o;34293:53::-;34371:5;34356:12;34412:78;34419:9;;34412:78;;34445:8;;;;:::i;:::-;;-1:-1:-1;34468:10:0;;-1:-1:-1;34476:2:0;34468:10;;:::i;:::-;;;34412:78;;;34500:19;34532:6;34522:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34522:17:0;;34500:39;;34550:154;34557:10;;34550:154;;34584:11;34594:1;34584:11;;:::i;:::-;;-1:-1:-1;34653:10:0;34661:2;34653:5;:10;:::i;:::-;34640:24;;:2;:24;:::i;:::-;34627:39;;34610:6;34617;34610:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;34610:56:0;;;;;;;;-1:-1:-1;34681:11:0;34690:2;34681:11;;:::i;:::-;;;34550:154;;21266:843;21387:4;-1:-1:-1;;;;;21413:13:0;;26906:20;26945:8;21409:693;;21449:72;;-1:-1:-1;;;21449:72:0;;-1:-1:-1;;;;;21449:36:0;;;;;:72;;8279:10;;21500:4;;21506:7;;21515:5;;21449:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21449:72:0;;;;;;;;-1:-1:-1;;21449:72:0;;;;;;;;;;;;:::i;:::-;;;21445:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21695:13:0;;21691:341;;21738:60;;-1:-1:-1;;;21738:60:0;;;;;;;:::i;21691:341::-;21982:6;21976:13;21967:6;21963:2;21959:15;21952:38;21445:602;-1:-1:-1;;;;;;21572:55:0;-1:-1:-1;;;21572:55:0;;-1:-1:-1;21565:62:0;;21409:693;-1:-1:-1;22086:4:0;21266:843;;;;;;:::o;44898:550::-;45017:16;;45008:48;;-1:-1:-1;;;45008:48:0;;;;;34768:25:1;;;44962:13:0;;44988:17;;-1:-1:-1;;;;;45017:16:0;;;;45008:35;;34741:18:1;;45008:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45008:48:0;;;;;;;;;;;;:::i;:::-;44988:68;;45075:17;45095:28;45113:3;45117:2;45120;45095:17;:28::i;:::-;45075:48;;45138:31;45161:3;45138:31;;;;;;;;;;;;;-1:-1:-1;;;45138:31:0;;;:22;:31::i;:::-;45134:307;;;-1:-1:-1;;45186:17:0;;;;;;;;;;;;-1:-1:-1;;;45186:17:0;;;;;44898:550;-1:-1:-1;;44898:550:0:o;45134:307::-;45225:31;45248:3;45225:31;;;;;;;;;;;;;-1:-1:-1;;;45225:31:0;;;:22;:31::i;:::-;45221:220;;;-1:-1:-1;;45273:16:0;;;;;;;;;;;;-1:-1:-1;;;45273:16:0;;;;;44898:550;-1:-1:-1;;44898:550:0:o;45221:220::-;45311:31;45334:3;45311:31;;;;;;;;;;;;;-1:-1:-1;;;45311:31:0;;;:22;:31::i;:::-;45307:134;;;-1:-1:-1;;45359:17:0;;;;;;;;;;;;-1:-1:-1;;;45359:17:0;;;;;44898:550;-1:-1:-1;;44898:550:0:o;45307:134::-;-1:-1:-1;;45409:20:0;;;;;;;;;;;;-1:-1:-1;;;45409:20:0;;;;;44898:550;-1:-1:-1;;44898:550:0:o;35859:463::-;35959:13;;;35969:2;35959:13;;;35916;35959;;;;;;35942:14;;35959:13;;;;;;;;;;;-1:-1:-1;35959:13:0;35942:30;;35988:6;35983:305;36004:2;36000:1;:6;35983:305;;;36028:8;36079:6;36084:1;36079:2;:6;:::i;:::-;36076:10;;:1;:10;:::i;:::-;36072:15;;:1;:15;:::i;:::-;36052:36;;-1:-1:-1;;;;;36052:16:0;;:36;:::i;:::-;36039:51;;36028:62;;36105:9;36135:2;36130:1;36124:8;;:13;;;;:::i;:::-;36117:21;;36105:33;;36153:9;36194:2;36188:9;;36183:2;:14;;;;:::i;:::-;36178:1;36172:8;;:25;;;;:::i;:::-;36165:33;;36153:45;;36222:8;36227:2;36222:4;:8::i;:::-;36213:1;36215:3;36217:1;36215;:3;:::i;:::-;36213:6;;;;;;;;:::i;:::-;;;;:17;-1:-1:-1;;;;;36213:17:0;;;;;;;;;36256:8;36261:2;36256:4;:8::i;:::-;36245:1;36247:3;36249:1;36247;:3;:::i;:::-;:5;;36251:1;36247:5;:::i;:::-;36245:8;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;36245:19:0;;;;;;;;;36013:275;;;36008:3;;;;;:::i;:::-;;;;35983:305;;;-1:-1:-1;36312:1:0;35859:463;-1:-1:-1;;35859:463:0:o;41623:117::-;41682:7;41723:4;41728:1;41723:7;;;;;;;:::i;:::-;;;41623:117;-1:-1:-1;;;41623:117:0:o;41787:240::-;41871:13;41936:71;41954:36;41984:4;41976:13;;41954:21;:36::i;:::-;41992:5;41999:7;41992:5;42005:1;41999:7;:::i;41936:71::-;42008:5;41919:95;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41905:110;;41787:240;;;;;:::o;36334:171::-;36381:8;36417:2;36406:8;;;;:13;36402:95;;;36435:15;:8;;;;36446:4;36435:15;:::i;:::-;36428:23;;;36334:171;-1:-1:-1;;36334:171:0:o;36402:95::-;36481:15;:8;;;;36492:4;36481:15;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:336:1;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:45;;;239:1;236;229:12;198:45;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;14:336;;;;;:::o;355:247::-;414:6;467:2;455:9;446:7;442:23;438:32;435:52;;;483:1;480;473:12;435:52;522:9;509:23;541:31;566:5;541:31;:::i;607:251::-;677:6;730:2;718:9;709:7;705:23;701:32;698:52;;;746:1;743;736:12;698:52;778:9;772:16;797:31;822:5;797:31;:::i;863:388::-;931:6;939;992:2;980:9;971:7;967:23;963:32;960:52;;;1008:1;1005;998:12;960:52;1047:9;1034:23;1066:31;1091:5;1066:31;:::i;:::-;1116:5;-1:-1:-1;1173:2:1;1158:18;;1145:32;1186:33;1145:32;1186:33;:::i;:::-;1238:7;1228:17;;;863:388;;;;;:::o;1256:456::-;1333:6;1341;1349;1402:2;1390:9;1381:7;1377:23;1373:32;1370:52;;;1418:1;1415;1408:12;1370:52;1457:9;1444:23;1476:31;1501:5;1476:31;:::i;:::-;1526:5;-1:-1:-1;1583:2:1;1568:18;;1555:32;1596:33;1555:32;1596:33;:::i;:::-;1256:456;;1648:7;;-1:-1:-1;;;1702:2:1;1687:18;;;;1674:32;;1256:456::o;1717:794::-;1812:6;1820;1828;1836;1889:3;1877:9;1868:7;1864:23;1860:33;1857:53;;;1906:1;1903;1896:12;1857:53;1945:9;1932:23;1964:31;1989:5;1964:31;:::i;:::-;2014:5;-1:-1:-1;2071:2:1;2056:18;;2043:32;2084:33;2043:32;2084:33;:::i;:::-;2136:7;-1:-1:-1;2190:2:1;2175:18;;2162:32;;-1:-1:-1;2245:2:1;2230:18;;2217:32;2272:18;2261:30;;2258:50;;;2304:1;2301;2294:12;2258:50;2327:22;;2380:4;2372:13;;2368:27;-1:-1:-1;2358:55:1;;2409:1;2406;2399:12;2358:55;2432:73;2497:7;2492:2;2479:16;2474:2;2470;2466:11;2432:73;:::i;:::-;2422:83;;;1717:794;;;;;;;:::o;2516:382::-;2581:6;2589;2642:2;2630:9;2621:7;2617:23;2613:32;2610:52;;;2658:1;2655;2648:12;2610:52;2697:9;2684:23;2716:31;2741:5;2716:31;:::i;:::-;2766:5;-1:-1:-1;2823:2:1;2808:18;;2795:32;2836:30;2795:32;2836:30;:::i;2903:315::-;2971:6;2979;3032:2;3020:9;3011:7;3007:23;3003:32;3000:52;;;3048:1;3045;3038:12;3000:52;3087:9;3074:23;3106:31;3131:5;3106:31;:::i;:::-;3156:5;3208:2;3193:18;;;;3180:32;;-1:-1:-1;;;2903:315:1:o;3223:245::-;3290:6;3343:2;3331:9;3322:7;3318:23;3314:32;3311:52;;;3359:1;3356;3349:12;3311:52;3391:9;3385:16;3410:28;3432:5;3410:28;:::i;3473:245::-;3531:6;3584:2;3572:9;3563:7;3559:23;3555:32;3552:52;;;3600:1;3597;3590:12;3552:52;3639:9;3626:23;3658:30;3682:5;3658:30;:::i;3723:249::-;3792:6;3845:2;3833:9;3824:7;3820:23;3816:32;3813:52;;;3861:1;3858;3851:12;3813:52;3893:9;3887:16;3912:30;3936:5;3912:30;:::i;3977:450::-;4046:6;4099:2;4087:9;4078:7;4074:23;4070:32;4067:52;;;4115:1;4112;4105:12;4067:52;4155:9;4142:23;4188:18;4180:6;4177:30;4174:50;;;4220:1;4217;4210:12;4174:50;4243:22;;4296:4;4288:13;;4284:27;-1:-1:-1;4274:55:1;;4325:1;4322;4315:12;4274:55;4348:73;4413:7;4408:2;4395:16;4390:2;4386;4382:11;4348:73;:::i;4432:635::-;4512:6;4565:2;4553:9;4544:7;4540:23;4536:32;4533:52;;;4581:1;4578;4571:12;4533:52;4614:9;4608:16;4647:18;4639:6;4636:30;4633:50;;;4679:1;4676;4669:12;4633:50;4702:22;;4755:4;4747:13;;4743:27;-1:-1:-1;4733:55:1;;4784:1;4781;4774:12;4733:55;4813:2;4807:9;4838:48;4854:31;4882:2;4854:31;:::i;4838:48::-;4909:2;4902:5;4895:17;4949:7;4944:2;4939;4935;4931:11;4927:20;4924:33;4921:53;;;4970:1;4967;4960:12;4921:53;4983:54;5034:2;5029;5022:5;5018:14;5013:2;5009;5005:11;4983:54;:::i;:::-;5056:5;4432:635;-1:-1:-1;;;;;4432:635:1:o;5072:180::-;5131:6;5184:2;5172:9;5163:7;5159:23;5155:32;5152:52;;;5200:1;5197;5190:12;5152:52;-1:-1:-1;5223:23:1;;5072:180;-1:-1:-1;5072:180:1:o;5257:248::-;5325:6;5333;5386:2;5374:9;5365:7;5361:23;5357:32;5354:52;;;5402:1;5399;5392:12;5354:52;-1:-1:-1;;5425:23:1;;;5495:2;5480:18;;;5467:32;;-1:-1:-1;5257:248:1:o;5510:268::-;5562:3;5600:5;5594:12;5627:6;5622:3;5615:19;5643:63;5699:6;5692:4;5687:3;5683:14;5676:4;5669:5;5665:16;5643:63;:::i;:::-;5760:2;5739:15;-1:-1:-1;;5735:29:1;5726:39;;;;5767:4;5722:50;;5510:268;-1:-1:-1;;5510:268:1:o;5783:184::-;5824:3;5862:5;5856:12;5877:52;5922:6;5917:3;5910:4;5903:5;5899:16;5877:52;:::i;:::-;5945:16;;;;;5783:184;-1:-1:-1;;5783:184:1:o;6863:276::-;6994:3;7032:6;7026:13;7048:53;7094:6;7089:3;7082:4;7074:6;7070:17;7048:53;:::i;:::-;7117:16;;;;;6863:276;-1:-1:-1;;6863:276:1:o;7144:470::-;7323:3;7361:6;7355:13;7377:53;7423:6;7418:3;7411:4;7403:6;7399:17;7377:53;:::i;:::-;7493:13;;7452:16;;;;7515:57;7493:13;7452:16;7549:4;7537:17;;7515:57;:::i;:::-;7588:20;;7144:470;-1:-1:-1;;;;7144:470:1:o;7619:664::-;7846:3;7884:6;7878:13;7900:53;7946:6;7941:3;7934:4;7926:6;7922:17;7900:53;:::i;:::-;8016:13;;7975:16;;;;8038:57;8016:13;7975:16;8072:4;8060:17;;8038:57;:::i;:::-;8162:13;;8117:20;;;8184:57;8162:13;8117:20;8218:4;8206:17;;8184:57;:::i;:::-;8257:20;;7619:664;-1:-1:-1;;;;;7619:664:1:o;8288:1541::-;8613:3;8651:6;8645:13;8677:4;8690:51;8734:6;8729:3;8724:2;8716:6;8712:15;8690:51;:::i;:::-;8826:13;;8763:16;;;;8799:1;;8886;8908:18;;;;8961;;;;8988:93;;9066:4;9056:8;9052:19;9040:31;;8988:93;9129:2;9119:8;9116:16;9096:18;9093:40;9090:167;;;-1:-1:-1;;;9156:33:1;;9212:4;9209:1;9202:15;9242:4;9163:3;9230:17;9090:167;9273:18;9300:110;;;;9424:1;9419:328;;;;9266:481;;9300:110;-1:-1:-1;;9335:24:1;;9321:39;;9380:20;;;;-1:-1:-1;9300:110:1;;9419:328;35348:1;35341:14;;;35385:4;35372:18;;9514:1;9528:169;9542:8;9539:1;9536:15;9528:169;;;9624:14;;9609:13;;;9602:37;9667:16;;;;9559:10;;9528:169;;;9532:3;;9728:8;9721:5;9717:20;9710:27;;9266:481;;;;;;9763:60;9793:29;9818:3;9810:6;9793:29;:::i;:::-;6181:34;6169:47;;-1:-1:-1;;;6241:2:1;6232:12;;6225:35;6285:2;6276:12;;6104:190;9763:60;9756:67;8288:1541;-1:-1:-1;;;;;;;;8288:1541:1:o;9834:1119::-;10364:3;10402:6;10396:13;10418:53;10464:6;10459:3;10452:4;10444:6;10440:17;10418:53;:::i;:::-;-1:-1:-1;;;10493:16:1;;;10518:32;;;10575:13;;10597:66;10575:13;10649:2;10638:14;;10631:4;10619:17;;10597:66;:::i;:::-;-1:-1:-1;;;10726:2:1;10682:20;;;;10718:11;;;10711:27;10763:13;;10785:63;10763:13;10834:2;10826:11;;10819:4;10807:17;;10785:63;:::i;:::-;-1:-1:-1;;;10908:2:1;10867:17;;;;10900:11;;;10893:27;10944:2;10936:11;;9834:1119;-1:-1:-1;;;;;9834:1119:1:o;10958:795::-;11339:3;11377:6;11371:13;11393:53;11439:6;11434:3;11427:4;11419:6;11415:17;11393:53;:::i;:::-;-1:-1:-1;;;11468:16:1;;;11493:30;;;11548:13;;11570:66;11548:13;11622:2;11611:14;;11604:4;11592:17;;11570:66;:::i;:::-;-1:-1:-1;;;11699:2:1;11655:20;;;;11691:11;;;11684:36;11744:2;11736:11;;10958:795;-1:-1:-1;;;;10958:795:1:o;11758:786::-;12139:3;12177:6;12171:13;12193:53;12239:6;12234:3;12227:4;12219:6;12215:17;12193:53;:::i;:::-;-1:-1:-1;;;12268:16:1;;;12293:25;;;12343:13;;12365:65;12343:13;12417:1;12406:13;;12399:4;12387:17;;12365:65;:::i;:::-;-1:-1:-1;;;12493:1:1;12449:20;;;;12485:10;;;12478:33;12535:2;12527:11;;11758:786;-1:-1:-1;;;;11758:786:1:o;12549:1777::-;13377:3;13415:6;13409:13;13431:53;13477:6;13472:3;13465:4;13457:6;13453:17;13431:53;:::i;:::-;-1:-1:-1;;;13506:16:1;;;13531:24;;;13580:13;;13602:65;13580:13;13654:1;13643:13;;13636:4;13624:17;;13602:65;:::i;:::-;13697:8;13690:5;13686:20;13676:30;;;-1:-1:-1;;;13756:2:1;13752:1;13748:2;13744:10;13737:22;13790:6;13784:13;13806:62;13859:8;13855:1;13851:2;13847:10;13840:4;13832:6;13828:17;13806:62;:::i;:::-;-1:-1:-1;;;13928:1:1;13887:17;;;;13920:10;;;13913:23;13961:13;;13983:62;13961:13;14032:1;14024:10;;14017:4;14005:17;;13983:62;:::i;:::-;14105:1;14064:17;;14097:10;;;14090:22;14137:13;;14159:63;14137:13;14208:2;14200:11;;14193:4;14181:17;;14159:63;:::i;:::-;-1:-1:-1;;;14282:2:1;14241:17;;;;14274:11;;;14267:26;14317:2;14309:11;;12549:1777;-1:-1:-1;;;;;;;12549:1777:1:o;14331:1516::-;15010:3;15048:6;15042:13;15064:53;15110:6;15105:3;15098:4;15090:6;15086:17;15064:53;:::i;:::-;15148:6;15143:3;15139:16;15126:29;;15178:34;15171:5;15164:49;-1:-1:-1;;;15240:4:1;15233:5;15229:16;15222:31;15284:6;15278:13;15300:66;15357:8;15352:2;15345:5;15341:14;15334:4;15326:6;15322:17;15300:66;:::i;:::-;-1:-1:-1;;;15429:2:1;15385:20;;;;15421:11;;;15414:25;15464:13;;15486:63;15464:13;15535:2;15527:11;;15520:4;15508:17;;15486:63;:::i;:::-;-1:-1:-1;;;15609:2:1;15568:17;;;;15601:11;;;15594:31;15650:13;;15672:63;15650:13;15721:2;15713:11;;15706:4;15694:17;;15672:63;:::i;:::-;-1:-1:-1;;;15795:2:1;15754:17;;;;15787:11;;;15780:34;15838:2;15830:11;;14331:1516;-1:-1:-1;;;;;;14331:1516:1:o;15852:1810::-;-1:-1:-1;;;16650:43:1;;16716:13;;16632:3;;16738:61;16716:13;16788:1;16779:11;;16772:4;16760:17;;16738:61;:::i;:::-;-1:-1:-1;;;16858:1:1;16818:16;;;16850:10;;;16843:68;16936:13;;16958:63;16936:13;17007:2;16999:11;;16992:4;16980:17;;16958:63;:::i;:::-;-1:-1:-1;;;17081:2:1;17040:17;;;;17073:11;;;17066:67;17158:13;;17180:63;17158:13;17229:2;17221:11;;17214:4;17202:17;;17180:63;:::i;:::-;17308:66;17303:2;17262:17;;;;17295:11;;;17288:87;-1:-1:-1;;;17399:2:1;17391:11;;17384:55;17464:13;;17486:63;17464:13;17535:2;17527:11;;17520:4;17508:17;;17486:63;:::i;:::-;-1:-1:-1;;;17609:2:1;17568:17;;;;17601:11;;;17594:35;17653:2;17645:11;;15852:1810;-1:-1:-1;;;;;;15852:1810:1:o;17667:1744::-;-1:-1:-1;;;18520:3:1;18513:20;18495:3;18562:6;18556:13;18578:61;18632:6;18628:1;18623:3;18619:11;18612:4;18604:6;18600:17;18578:61;:::i;:::-;18667:6;18662:3;18658:16;18648:26;;-1:-1:-1;;;18724:2:1;18720:1;18716:2;18712:10;18705:22;18758:6;18752:13;18774:62;18827:8;18823:1;18819:2;18815:10;18808:4;18800:6;18796:17;18774:62;:::i;:::-;18896:1;18855:17;;18888:10;;;18881:22;;;18928:13;;18950:62;18928:13;18999:1;18991:10;;18984:4;18972:17;;18950:62;:::i;:::-;19072:1;19031:17;;19064:10;;;19057:22;;;19104:13;;19126:62;19104:13;19175:1;19167:10;;19160:4;19148:17;;19126:62;:::i;:::-;19248:1;19207:17;;19240:10;;;19233:22;19280:13;;19302:62;19280:13;19351:1;19343:10;;19336:4;19324:17;;19302:62;:::i;:::-;19384:17;19403:1;19380:25;;17667:1744;-1:-1:-1;;;;;;;17667:1744:1:o;19416:433::-;-1:-1:-1;;;19671:3:1;19664:31;19646:3;19724:6;19718:13;19740:62;19795:6;19790:2;19785:3;19781:12;19774:4;19766:6;19762:17;19740:62;:::i;:::-;19822:16;;;;19840:2;19818:25;;19416:433;-1:-1:-1;;19416:433:1:o;19854:1229::-;-1:-1:-1;;;20510:3:1;20503:19;20485:3;20551:6;20545:13;20567:61;20621:6;20617:1;20612:3;20608:11;20601:4;20593:6;20589:17;20567:61;:::i;:::-;-1:-1:-1;;;20687:1:1;20647:16;;;20679:10;;;20672:24;20721:13;;20743:62;20721:13;20792:1;20784:10;;20777:4;20765:17;;20743:62;:::i;:::-;-1:-1:-1;;;20865:1:1;20824:17;;;;20857:10;;;20850:24;20899:13;;20921:62;20899:13;20970:1;20962:10;;20955:4;20943:17;;20921:62;:::i;:::-;-1:-1:-1;;;21043:1:1;21002:17;;;;21035:10;;;21028:23;21075:1;21067:10;;19854:1229;-1:-1:-1;;;;;19854:1229:1:o;21088:1480::-;-1:-1:-1;;;21792:3:1;21785:19;21767:3;21833:6;21827:13;21849:61;21903:6;21899:1;21894:3;21890:11;21883:4;21875:6;21871:17;21849:61;:::i;:::-;-1:-1:-1;;;21969:1:1;21929:16;;;21961:10;;;21954:42;22021:13;;22043:63;22021:13;22092:2;22084:11;;22077:4;22065:17;;22043:63;:::i;:::-;22171:37;22166:2;22125:17;;;;22158:11;;;22151:58;22234:13;;22256:63;22234:13;22305:2;22297:11;;22290:4;22278:17;;22256:63;:::i;:::-;-1:-1:-1;;;22379:2:1;22338:17;;;;22371:11;;;22364:46;22435:13;;22457:63;22435:13;22506:2;22498:11;;22491:4;22479:17;;22457:63;:::i;:::-;22540:17;22559:2;22536:26;;21088:1480;-1:-1:-1;;;;;;21088:1480:1:o;22573:2191::-;23686:66;23681:3;23674:79;23656:3;23781:10;23776:3;23772:20;23822:2;23817;23812:3;23808:12;23801:24;23854:6;23848:13;23870:60;23923:6;23918:2;23913:3;23909:12;23904:2;23896:6;23892:15;23870:60;:::i;:::-;-1:-1:-1;;;24024:2:1;23949:16;;;24016:11;;;24009:23;;;24061:66;24056:2;24048:11;;24041:87;24152:2;24144:11;;24137:23;;;;24185:13;;;24207:61;24185:13;24254:2;24246:11;;24241:2;24229:15;;24207:61;:::i;:::-;24287:17;;24328:2;24320:11;;24313:23;;;;24365:66;24360:2;24352:11;;24345:87;-1:-1:-1;;;24456:3:1;24448:12;;24441:46;24512:13;;24534:62;24512:13;24581:3;24573:12;;24568:2;24556:15;;24534:62;:::i;:::-;24612:146;24642:115;24667:89;24697:58;24750:3;24739:8;24735:2;24731:17;24727:27;-1:-1:-1;;;6037:29:1;;6091:1;6082:11;;5972:127;24697:58;6506:66;6494:79;;-1:-1:-1;;;6598:2:1;6589:12;;6582:38;6645:2;6636:12;;6429:225;24667:89;24659:6;24642:115;:::i;:::-;-1:-1:-1;;;6364:27:1;;6416:1;6407:11;;6299:125;25473:499;-1:-1:-1;;;;;25742:15:1;;;25724:34;;25794:15;;25789:2;25774:18;;25767:43;25841:2;25826:18;;25819:34;;;25889:3;25884:2;25869:18;;25862:31;;;25667:4;;25910:56;;25946:19;;25938:6;25910:56;:::i;:::-;25902:64;25473:499;-1:-1:-1;;;;;;25473:499:1:o;26169:230::-;26318:2;26307:9;26300:21;26281:4;26338:55;26389:2;26378:9;26374:18;26366:6;26338:55;:::i;26404:414::-;26606:2;26588:21;;;26645:2;26625:18;;;26618:30;26684:34;26679:2;26664:18;;26657:62;-1:-1:-1;;;26750:2:1;26735:18;;26728:48;26808:3;26793:19;;26404:414::o;32318:354::-;32520:2;32502:21;;;32559:2;32539:18;;;32532:30;32598:32;32593:2;32578:18;;32571:60;32663:2;32648:18;;32318:354::o;32677:356::-;32879:2;32861:21;;;32898:18;;;32891:30;32957:34;32952:2;32937:18;;32930:62;33024:2;33009:18;;32677:356::o;33850:413::-;34052:2;34034:21;;;34091:2;34071:18;;;34064:30;34130:34;34125:2;34110:18;;34103:62;-1:-1:-1;;;34196:2:1;34181:18;;34174:47;34253:3;34238:19;;33850:413::o;34804:275::-;34875:2;34869:9;34940:2;34921:13;;-1:-1:-1;;34917:27:1;34905:40;;34975:18;34960:34;;34996:22;;;34957:62;34954:88;;;35022:18;;:::i;:::-;35058:2;35051:22;34804:275;;-1:-1:-1;34804:275:1:o;35084:186::-;35132:4;35165:18;35157:6;35154:30;35151:56;;;35187:18;;:::i;:::-;-1:-1:-1;35253:2:1;35232:15;-1:-1:-1;;35228:29:1;35259:4;35224:40;;35084:186::o;35401:128::-;35441:3;35472:1;35468:6;35465:1;35462:13;35459:39;;;35478:18;;:::i;:::-;-1:-1:-1;35514:9:1;;35401:128::o;35534:204::-;35572:3;35608:4;35605:1;35601:12;35640:4;35637:1;35633:12;35675:3;35669:4;35665:14;35660:3;35657:23;35654:49;;;35683:18;;:::i;:::-;35719:13;;35534:204;-1:-1:-1;;;35534:204:1:o;35743:120::-;35783:1;35809;35799:35;;35814:18;;:::i;:::-;-1:-1:-1;35848:9:1;;35743:120::o;35868:165::-;35906:1;35940:4;35937:1;35933:12;35964:3;35954:37;;35971:18;;:::i;:::-;36023:3;36016:4;36013:1;36009:12;36005:22;36000:27;;;35868:165;;;;:::o;36038:422::-;36127:1;36170:5;36127:1;36184:270;36205:7;36195:8;36192:21;36184:270;;;36264:4;36260:1;36256:6;36252:17;36246:4;36243:27;36240:53;;;36273:18;;:::i;:::-;36323:7;36313:8;36309:22;36306:55;;;36343:16;;;;36306:55;36422:22;;;;36382:15;;;;36184:270;;;36188:3;36038:422;;;;;:::o;36465:131::-;36525:5;36554:36;36581:8;36575:4;36650:5;36680:8;36670:80;;-1:-1:-1;36721:1:1;36735:5;;36670:80;36769:4;36759:76;;-1:-1:-1;36806:1:1;36820:5;;36759:76;36851:4;36869:1;36864:59;;;;36937:1;36932:130;;;;36844:218;;36864:59;36894:1;36885:10;;36908:5;;;36932:130;36969:3;36959:8;36956:17;36953:43;;;36976:18;;:::i;:::-;-1:-1:-1;;37032:1:1;37018:16;;37047:5;;36844:218;;37146:2;37136:8;37133:16;37127:3;37121:4;37118:13;37114:36;37108:2;37098:8;37095:16;37090:2;37084:4;37081:12;37077:35;37074:77;37071:159;;;-1:-1:-1;37183:19:1;;;37215:5;;37071:159;37262:34;37287:8;37281:4;37262:34;:::i;:::-;37332:6;37328:1;37324:6;37320:19;37311:7;37308:32;37305:58;;;37343:18;;:::i;:::-;37381:20;;36601:806;-1:-1:-1;;;36601:806:1:o;37412:168::-;37452:7;37518:1;37514;37510:6;37506:14;37503:1;37500:21;37495:1;37488:9;37481:17;37477:45;37474:71;;;37525:18;;:::i;:::-;-1:-1:-1;37565:9:1;;37412:168::o;37585:238::-;37623:7;37663:4;37660:1;37656:12;37695:4;37692:1;37688:12;37755:3;37749:4;37745:14;37740:3;37737:23;37730:3;37723:11;37716:19;37712:49;37709:75;;;37764:18;;:::i;37828:125::-;37868:4;37896:1;37893;37890:8;37887:34;;;37901:18;;:::i;:::-;-1:-1:-1;37938:9:1;;37828:125::o;37958:195::-;37996:4;38033;38030:1;38026:12;38065:4;38062:1;38058:12;38090:3;38085;38082:12;38079:38;;;38097:18;;:::i;:::-;38134:13;;;37958:195;-1:-1:-1;;;37958:195:1:o;38158:258::-;38230:1;38240:113;38254:6;38251:1;38248:13;38240:113;;;38330:11;;;38324:18;38311:11;;;38304:39;38276:2;38269:10;38240:113;;;38371:6;38368:1;38365:13;38362:48;;;-1:-1:-1;;38406:1:1;38388:16;;38381:27;38158:258::o;38421:380::-;38500:1;38496:12;;;;38543;;;38564:61;;38618:4;38610:6;38606:17;38596:27;;38564:61;38671:2;38663:6;38660:14;38640:18;38637:38;38634:161;;;38717:10;38712:3;38708:20;38705:1;38698:31;38752:4;38749:1;38742:15;38780:4;38777:1;38770:15;38634:161;;38421:380;;;:::o;38806:135::-;38845:3;-1:-1:-1;;38866:17:1;;38863:43;;;38886:18;;:::i;:::-;-1:-1:-1;38933:1:1;38922:13;;38806:135::o;38946:112::-;38978:1;39004;38994:35;;39009:18;;:::i;:::-;-1:-1:-1;39043:9:1;;38946:112::o;39063:127::-;39124:10;39119:3;39115:20;39112:1;39105:31;39155:4;39152:1;39145:15;39179:4;39176:1;39169:15;39195:127;39256:10;39251:3;39247:20;39244:1;39237:31;39287:4;39284:1;39277:15;39311:4;39308:1;39301:15;39327:127;39388:10;39383:3;39379:20;39376:1;39369:31;39419:4;39416:1;39409:15;39443:4;39440:1;39433:15;39459:127;39520:10;39515:3;39511:20;39508:1;39501:31;39551:4;39548:1;39541:15;39575:4;39572:1;39565:15;39591:131;-1:-1:-1;;;;;39666:31:1;;39656:42;;39646:70;;39712:1;39709;39702:12;39727:118;39813:5;39806:13;39799:21;39792:5;39789:32;39779:60;;39835:1;39832;39825:12;39850:131;-1:-1:-1;;;;;;39924:32:1;;39914:43;;39904:71;;39971:1;39968;39961:12

Swarm Source

ipfs://aa7b37bf65ed4912a88d3cdfcd9dbd4c63d2caff23f3c745a9fcbb5509a1941e
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.