ETH Price: $3,335.39 (-1.17%)

Token

Ikebana (GCP5)
 

Overview

Max Total Supply

1,213 GCP5

Holders

1,060

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 GCP5
0xce83ef147d12bdc4e129c4327577a180ef520bfd
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Next Gen NFT Platform.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Ikebana

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 4000 runs

Other Settings:
default evmVersion, MIT license
File 1 of 21 : Ikebana.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./GeneticChainMetadata.sol";

/**
 * @title Ikebana
 * GeneticChain - Project #5 - Ikebana
 */
contract Ikebana is GeneticChainMetadata {

    struct ArtState {
        uint64 cubesize;
        uint64 speed;
        uint128 offset;
    }

    // Token State
    mapping(uint256 => bool) _set;
    mapping(uint256 => ArtState) _state;

    // StateChange
    event StateChange(address indexed owner, uint256 tokenId, ArtState state);

    constructor(
        IpfsAsset memory lib,
        string memory code_,
        string memory baseUri,
        uint256[3] memory tokenMax,
        uint256 seed,
        address proxyRegistryAddress)
        GeneticChainMetadata(
          lib,
          code_,
          baseUri,
          tokenMax,
          seed,
          proxyRegistryAddress)
    {
    }

    function state(uint256 tokenId)
        public
        view
        validTokenId(tokenId)
        returns (uint64 cubesize, uint64 speed, uint128 offset)
    {
        if (_set[tokenId] == false) {
            cubesize = 60;
            speed    = 10;
            offset   = 50;
        } else {
            cubesize = _state[tokenId].cubesize;
            speed    = _state[tokenId].speed;
            offset   = _state[tokenId].offset;
        }
    }

    /**
     * Updates state of token, only owner or approved is allowed.
     * @param tokenId - token to update state on
     * @param cubesize - size of cubes; 10-100
     * @param speed - speed to run at; 5-50
     * @param offset - camera offset; 10-200
     *
     * Emits a {StateUpdated} event.
     */
    function updateState(uint256 tokenId, uint64 cubesize, uint64 speed, uint128 offset)
        public
        approvedOrOwner(_msgSender(), tokenId)
    {
        require(10 <= cubesize && cubesize <= 100, "invalid cubesize, 10-100 allowed.");
        require(5 <= speed && speed <= 50, "invalid speed, 5-50 allowed.");
        require(10 <= offset && offset <= 200, "invalid offset, 10-200 allowed.");
        _set[tokenId]            = true;
        _state[tokenId].cubesize = cubesize;
        _state[tokenId].speed    = speed;
        _state[tokenId].offset   = offset;

        emit StateChange(msg.sender, tokenId, _state[tokenId]);
    }

}

File 2 of 21 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        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;
    }
}

File 3 of 21 : ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @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 { }
}

File 4 of 21 : IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 5 of 21 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 6 of 21 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 7 of 21 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 8 of 21 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

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

File 9 of 21 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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);
            }
        }
    }
}

File 10 of 21 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 11 of 21 : Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @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] = "0";
        buffer[1] = "x";
        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);
    }

}

File 12 of 21 : ECDSA.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            // solhint-disable-next-line no-inline-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
        } else if (signature.length == 64) {
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            // solhint-disable-next-line no-inline-assembly
            assembly {
                let vs := mload(add(signature, 0x40))
                r := mload(add(signature, 0x20))
                s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
                v := add(shr(255, vs), 27)
            }
        } else {
            revert("ECDSA: invalid signature length");
        }

        return recover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 13 of 21 : ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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;
    }
}

File 14 of 21 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 15 of 21 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 16 of 21 : GeneticChain721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "openzeppelin-solidity/contracts/token/ERC721/ERC721.sol";
import "openzeppelin-solidity/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "openzeppelin-solidity/contracts/access/Ownable.sol";
import "openzeppelin-solidity/contracts/utils/cryptography/ECDSA.sol";
import "openzeppelin-solidity/contracts/utils/Strings.sol";

import "./common/meta-transactions/ContentMixin.sol";
import "./common/meta-transactions/NativeMetaTransaction.sol";

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

/**
 * @title GeneticChain721
 * GeneticChainBase - ERC721 contract that whitelists a trading address, and has
 *  minting functionality.
 */
abstract contract GeneticChain721 is
    ContextMixin,
    ERC721Enumerable,
    NativeMetaTransaction,
    Ownable
{
    using ECDSA for bytes32;

    // message signer
    address constant private _signer = 0xDA9F95f43d4189285fA618Df89f66d9666e80694;

    // opensea proxy
    address _proxyRegistryAddress;

    // mapping from token id to token hash
    mapping (uint256 => bytes32) private _hash;

    // only allow nonces to be used once
    mapping(string => bool) private _usedNonces;

    // track mint count per address
    mapping (address => uint256) private _mints;

    // token data
    uint256 private _currentTokenId = 0;
    uint256 private _seed;

    // settings
    bool private _locked   = false;
    bool public publicLive = false;

    // mint price (0.03 / 0.05)
    uint256 public memberPrice = 30000000000000000;
    uint256 public publicPrice = 50000000000000000;

    // token limits
    uint256 public publicMax;
    uint256 public artistMax;
    uint256 public galleryMax;
    uint256 public tokenMax;
    uint256 public publicMinted = 0;
    uint256 public artistMinted = 0;
    uint256 public galleryMinted = 0;

    // roles
    address private _burnerAddress;
    address private _artistAddress = 0xC76cb2613026998b82cEB467134ecFF003Ebbb80;

    modifier validTokenId(uint256 tokenId) {
        require(_exists(tokenId), "invalid token");
        _;
    }

    modifier approvedOrOwner(address operator, uint256 tokenId) {
        require(_isApprovedOrOwner(operator, tokenId));
        _;
    }

    modifier isArtist() {
        require(_msgSender() == _artistAddress, "caller not artist");
        _;
    }

    modifier isBurner() {
        require(_msgSender() == _burnerAddress, "caller not burner");
        _;
    }

    modifier notLocked() {
        require(!_locked, "contract is locked");
        _;
    }

    constructor(
        uint256[3] memory tokenMax_,
        uint256 seed,
        address proxyRegistryAddress)
        ERC721("Ikebana", "GCP5")
    {
        publicMax             = tokenMax_[0];
        artistMax             = tokenMax_[1];
        galleryMax            = tokenMax_[2];
        tokenMax              = publicMax + artistMax + galleryMax;
        _seed                 = seed;
        _proxyRegistryAddress = proxyRegistryAddress;
        _initializeEIP712("Ikebana");
    }

    /**
     * Set artist address.
     */
    function setArtistAddress(address artist)
        public
        onlyOwner
    {
        _artistAddress = artist;
    }

    /**
     * Set burner address.
     */
    function setBurnerAddress(address burner)
        public
        onlyOwner
    {
        _burnerAddress = burner;
    }

    /**
     * Enable public minting.
     */
    function enablePublicMint()
        public
        onlyOwner
    {
        publicLive = true;
    }

    /**
     * Lock contract.  Disable public/member minting.
     *  Disallow on-chain code/library updates.
     */
    function lockContract()
        public
        onlyOwner
    {
        _locked = true;
    }

    /**
     * Validate hash contains input data.
     */
    function validateHash(bytes32 msgHash, address sender, uint256 allocation, uint256 count, string memory nonce)
        private
        pure
        returns(bool)
    {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32",
            keccak256(abi.encodePacked(sender, allocation, count, nonce)))) == msgHash;
    }

    /**
     * Validate message was signed by signer.
     */
    function validateSigner(bytes32 msgHash, bytes memory signature)
        private
        pure
        returns(bool)
    {
        return msgHash.recover(signature) == _signer;
    }

    /**
     * Allow anyone to mint tokens for the right price.
     */
    function mint()
        payable
        public
        notLocked
    {
        require(publicLive, "public mint not live");
        require(publicPrice == msg.value, "insufficient funds");
        require(totalSupply() < tokenMax, "exceed token supply");
        require(publicMinted < publicMax, "exceed public supply");
        ++publicMinted;
        _mintTo(msg.sender);
    }

    /**
     * @dev Mints a token to an address.
     * @param _to address of the future owner of the token
     */
    function galleryMintTo(address _to, uint256 count)
        external
        onlyOwner
    {
        require(totalSupply() + count <= tokenMax, "exceed token supply");
        require(galleryMinted + count <= galleryMax, "exceed gallery supply");
        galleryMinted += count;
        for (uint256 i = 0; i < count; ++i) {
            _mintTo(_to);
        }
    }

    /**
     * @dev Mints a token to an address.
     * @param _to address of the future owner of the token
     */
    function artistMintTo(address _to, uint256 count)
        external
        isArtist
    {
        require(totalSupply() + count <= tokenMax, "exceed token supply");
        require(artistMinted + count <= artistMax, "exceed artist supply");
        artistMinted += count;
        for (uint256 i = 0; i < count; ++i) {
            _mintTo(_to);
        }
    }

    /**
     * Mint count tokens using securely signed message.
     */
    function secureMint(bytes32 msgHash, bytes memory signature, uint256 allocation, uint256 count, string memory nonce)
        payable
        external
        notLocked
    {
        require(memberPrice * count == msg.value, "insufficient funds");
        require(!_usedNonces[nonce], "invalid nonce");
        require(totalSupply() < tokenMax, "all tokens minted");
        require(totalSupply() + count <= tokenMax, "exceed token supply");
        require(publicMinted + count <= publicMax, "exceed public supply");
        require(_mints[msg.sender] + count <= allocation, "exceed allocation");
        require(validateSigner(msgHash, signature), "invalid signer");
        require(validateHash(msgHash, msg.sender, allocation, count, nonce), "invalid hash");
        publicMinted += count;
        _mints[msg.sender] += count;
        _usedNonces[nonce] = true;
        for (uint256 i = 0; i < count; ++i) {
            _mintTo(msg.sender);
        }
    }

    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     */
    function burn(uint256 tokenId)
        public
        isBurner
    {
        _burn(tokenId);
    }

    /**
     * @dev Mints a token to an address with a tokenURI.
     * @param _to address of the future owner of the token
     */
    function _mintTo(address _to)
        internal
    {
        uint256 newTokenId = totalSupply() + 1;
        _safeMint(_to, newTokenId);
        _hash[newTokenId] = _randomHash(_to, newTokenId);
    }

    function baseTokenURI()
        virtual
        public
        view
        returns (string memory);

    /**
     * @dev Returns uri of a token.  Not guarenteed token exists.
     */
    function tokenURI(uint256 tokenId)
        override
        public
        view
        returns (string memory)
    {
        return string(abi.encodePacked(baseTokenURI(), "/", Strings.toString(tokenId), "/meta"));
    }

    /**
     * @return randomly generated hash associated with valid a token.
     */
    function tokenHash(uint256 tokenId)
        public
        view
        validTokenId(tokenId)
        returns (bytes32)
    {
        return _hash[tokenId];
    }

    /**
     * Pull money out of this contract.
     */
    function withdraw(address to, uint256 amount)
        public
        onlyOwner
    {
        require(amount > 0, "amount empty");
        require(amount <= address(this).balance, "amount exceeds balance");
        require(to != address(0), "address null");
        payable(to).transfer(amount);
    }

    /**
     * @dev Pseudo-random number generator.
     */
    function _randomHash(address _to, uint256 tokenId)
        internal
        returns (bytes32)
    {
      bytes32 hash = keccak256(
          abi.encodePacked(
              blockhash(block.number - 1),
              msg.sender,
              _seed,
              tokenId,
              _to));
      _seed = uint256(hash);
      return hash;
    }

    /**
     * Override isApprovedForAll to whitelist user's OpenSea proxy accounts
     *  to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator)
        override
        public
        view
        returns (bool)
    {
        // whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(_proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    /**
     * This is used instead of msg.sender as transactions won't be sent by
     *  the original token owner, but by OpenSea.
     */
    function _msgSender()
        internal
        override
        view
        returns (address sender)
    {
        return ContextMixin.msgSender();
    }

}

File 17 of 21 : GeneticChainMetadata.sol
// SPDX-License-Identifier: MIT

import "./GeneticChain721.sol";

pragma solidity ^0.8.0;

/**
 * @title GeneticChainMetadata
 * Holds all required metadata for genetic chain projects.
 */
abstract contract GeneticChainMetadata is GeneticChain721 {

    struct IpfsAsset {
        string name;
        string hash;
    }

    uint256 constant public projectId  = 5;
    string constant public artist      = "Jento";
    string constant public description = "A digital abstraction of the Ikebana art's quest for harmony, balance and grace. Dancing forever in honor of beauty.";

    string public code;
    IpfsAsset[] public libraries;
    string private _baseUri;

    constructor(
        IpfsAsset memory lib,
        string memory code_,
        string memory baseUri_,
        uint256[3] memory tokenMax,
        uint256 seed,
        address proxyRegistryAddress)
        GeneticChain721(
          tokenMax,
          seed,
          proxyRegistryAddress)
    {
        code     = code_;
        _baseUri = baseUri_;
        addLibrary(lib.name, lib.hash);
    }

    function setCode(string memory code_)
        public
        onlyOwner
        notLocked
    {
        code = code_;
    }

    function addLibrary(string memory name, string memory hash)
        public
        onlyOwner
        notLocked
    {
        IpfsAsset memory lib = IpfsAsset(name, hash);
        libraries.push(lib);
    }

    function removeLibrary(uint256 index)
        public
        onlyOwner
        notLocked
    {
        require(index < libraries.length);
        libraries[index] = libraries[libraries.length-1];
        libraries.pop();
    }

    function getLibraryCount()
        public
        view
        returns (uint256)
    {
        return libraries.length;
    }

    function getLibraries()
        public
        view
        returns (IpfsAsset[] memory)
    {
        IpfsAsset[] memory libs = new IpfsAsset[](libraries.length);
        for (uint256 i = 0; i < libraries.length; ++i) {
          IpfsAsset storage lib = libraries[i];
          libs[i] = lib;
        }
        return libs;
    }

    function baseTokenURI()
        override
        public
        view
        returns (string memory)
    {
        return string(abi.encodePacked(_baseUri, "/api/project/", Strings.toString(projectId), "/token"));
    }

    function contractURI()
        public
        view
        returns (string memory)
    {
        return string(abi.encodePacked(_baseUri, "/api/project/", Strings.toString(projectId), "/contract"));
    }

}

File 18 of 21 : ContentMixin.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract ContextMixin {
    function msgSender()
        internal
        view
        returns (address payable sender)
    {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

File 19 of 21 : EIP712Base.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import {Initializable} from "./Initializable.sol";

contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

File 20 of 21 : Initializable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

File 21 of 21 : NativeMetaTransaction.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import {SafeMath} from  "openzeppelin-solidity/contracts/utils/math/SafeMath.sol";
import {EIP712Base} from "./EIP712Base.sol";

contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 4000
  },
  "evmVersion": "london",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"hash","type":"string"}],"internalType":"struct GeneticChainMetadata.IpfsAsset","name":"lib","type":"tuple"},{"internalType":"string","name":"code_","type":"string"},{"internalType":"string","name":"baseUri","type":"string"},{"internalType":"uint256[3]","name":"tokenMax","type":"uint256[3]"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"address","name":"proxyRegistryAddress","type":"address"}],"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":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","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":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint64","name":"cubesize","type":"uint64"},{"internalType":"uint64","name":"speed","type":"uint64"},{"internalType":"uint128","name":"offset","type":"uint128"}],"indexed":false,"internalType":"struct Ikebana.ArtState","name":"state","type":"tuple"}],"name":"StateChange","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":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"hash","type":"string"}],"name":"addLibrary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artist","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artistMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"artistMintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"code","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enablePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"galleryMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"galleryMintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"galleryMinted","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":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLibraries","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"hash","type":"string"}],"internalType":"struct GeneticChainMetadata.IpfsAsset[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLibraryCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"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":"","type":"uint256"}],"name":"libraries","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"hash","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"memberPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","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":[],"name":"projectId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeLibrary","outputs":[],"stateMutability":"nonpayable","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":"bytes32","name":"msgHash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"allocation","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"string","name":"nonce","type":"string"}],"name":"secureMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"artist","type":"address"}],"name":"setArtistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"burner","type":"address"}],"name":"setBurnerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"code_","type":"string"}],"name":"setCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"state","outputs":[{"internalType":"uint64","name":"cubesize","type":"uint64"},{"internalType":"uint64","name":"speed","type":"uint64"},{"internalType":"uint128","name":"offset","type":"uint128"}],"stateMutability":"view","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint64","name":"cubesize","type":"uint64"},{"internalType":"uint64","name":"speed","type":"uint64"},{"internalType":"uint128","name":"offset","type":"uint128"}],"name":"updateState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a805460ff19169055600060128190556014805461ffff19169055666a94d74f43000060155566b1a2bc2ec50000601655601b819055601c819055601d55601f80546001600160a01b03191673c76cb2613026998b82ceb467134ecff003ebbb801790553480156200007657600080fd5b50604051620059af380380620059af833981016040819052620000999162000753565b85858585858582828260405180604001604052806007815260200166496b6562616e6160c81b815250604051806040016040528060048152602001634743503560e01b8152508160009080519060200190620000f792919062000513565b5080516200010d90600190602084019062000513565b5050506000620001226200024360201b60201c565b600d80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350825160178190556020840151601881905560408501516019819055916200019891906200086f565b620001a491906200086f565b601a556013829055600e80546001600160a01b0319166001600160a01b038316179055604080518082019091526007815266496b6562616e6160c81b6020820152620001f0906200025f565b505085516200020791506020908188019062000513565b5083516200021d90602290602087019062000513565b5085516020870151620002319190620002c4565b505050505050505050505050620008d3565b60006200025a6200041260201b620031091760201c565b905090565b600a5460ff1615620002a95760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b60448201526064015b60405180910390fd5b620002b48162000471565b50600a805460ff19166001179055565b620002ce62000243565b6001600160a01b0316620002ea600d546001600160a01b031690565b6001600160a01b031614620003425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620002a0565b60145460ff16156200038c5760405162461bcd60e51b815260206004820152601260248201527118dbdb9d1c9858dd081a5cc81b1bd8dad95960721b6044820152606401620002a0565b6040805180820190915282815260208082018390526021805460018101825560009190915282518051849360029093027f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b5700192620003ef92849291019062000513565b5060208281015180516200040a926001850192019062000513565b505050505050565b6000333014156200046b57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506200046e9050565b50335b90565b6040518060800160405280604f815260200162005960604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600b55565b828054620005219062000896565b90600052602060002090601f01602090048101928262000545576000855562000590565b82601f106200056057805160ff191683800117855562000590565b8280016001018555821562000590579182015b828111156200059057825182559160200191906001019062000573565b506200059e929150620005a2565b5090565b5b808211156200059e5760008155600101620005a3565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715620005f457620005f4620005b9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006255762000625620005b9565b604052919050565b600082601f8301126200063f57600080fd5b81516001600160401b038111156200065b576200065b620005b9565b602062000671601f8301601f19168201620005fa565b82815285828487010111156200068657600080fd5b60005b83811015620006a657858101830151828201840152820162000689565b83811115620006b85760008385840101525b5095945050505050565b600082601f830112620006d457600080fd5b604051606081016001600160401b0381118282101715620006f957620006f9620005b9565b6040528060608401858111156200070f57600080fd5b845b818110156200072b57805183526020928301920162000711565b509195945050505050565b80516001600160a01b03811681146200074e57600080fd5b919050565b60008060008060008061010087890312156200076e57600080fd5b86516001600160401b03808211156200078657600080fd5b908801906040828b0312156200079b57600080fd5b620007a5620005cf565b825182811115620007b557600080fd5b620007c38c8286016200062d565b825250602083015182811115620007d957600080fd5b620007e78c8286016200062d565b6020830152508098505060208901519150808211156200080657600080fd5b620008148a838b016200062d565b965060408901519150808211156200082b57600080fd5b506200083a89828a016200062d565b9450506200084c8860608901620006c2565b925060c087015191506200086360e0880162000736565b90509295509295509295565b600082198211156200089157634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620008ab57607f821691505b60208210811415620008cd57634e487b7160e01b600052602260045260246000fd5b50919050565b61507d80620008e36000396000f3fe60806040526004361061038c5760003560e01c806371dedace116101dc578063b88d4fde11610102578063e8a3d485116100a0578063f2fde38b1161006f578063f2fde38b14610a52578063f3fef3a314610a72578063f7ee706814610a92578063f8f0b80e14610aa857600080fd5b8063e8a3d485146109f1578063e985e9c514610a06578063ed329fa814610a26578063ef3c662414610a3c57600080fd5b8063d547cfb7116100dc578063d547cfb714610991578063d62f3b1c146109a6578063e403f1a7146109bb578063e527c6dd146109db57600080fd5b8063b88d4fde14610931578063c87b56dd14610951578063c93ed70a1461097157600080fd5b80639df806d61161017a578063a4f4f8af11610149578063a4f4f8af146108b8578063a945bf80146108ce578063b1fbe72d146108e4578063b7f751d81461091257600080fd5b80639df806d614610838578063a22cb46514610858578063a22e4faa14610878578063a38643971461089857600080fd5b806380a1962f116101b657806380a1962f146107d257806380e6fd89146107e55780638da5cb5b1461080557806395d89b411461082357600080fd5b806371dedace146107925780637284e416146107a8578063753868e3146107bd57600080fd5b80633408e470116102c157806343bc16121161025f578063636e746b1161022e578063636e746b14610727578063638e19b41461073d57806370a082311461075d578063715018a61461077d57600080fd5b806343bc16121461067e57806344be774f146106c75780634f6ccce7146106e75780636352211e1461070757600080fd5b80633e4f49e61161029b5780633e4f49e6146105d05780633fafa1271461062957806342842e0e1461063e57806342966c681461065e57600080fd5b80633408e470146105855780633763e75b146105985780633e02bc38146105ae57600080fd5b806314d7d5171161032e57806323b872dd1161030857806323b872dd146104fa57806324c12bf61461051a5780632d0335ab1461052f5780632f745c591461056557600080fd5b806314d7d517146104a657806318160ddd146104c657806320379ee5146104e557600080fd5b8063095ea7b31161036a578063095ea7b3146104205780630c53c51c146104425780630f7e5970146104555780631249c58b1461049e57600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004614573565b610abd565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610b19565b6040516103bd91906145e8565b3480156103f457600080fd5b506104086104033660046145fb565b610bab565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004614629565b610c56565b005b6103db6104503660046146f8565b610d9a565b34801561046157600080fd5b506103db6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b610440610fa0565b3480156104b257600080fd5b506104406104c1366004614629565b61115f565b3480156104d257600080fd5b506008545b6040519081526020016103bd565b3480156104f157600080fd5b50600b546104d7565b34801561050657600080fd5b50610440610515366004614776565b6112c9565b34801561052657600080fd5b506103db611357565b34801561053b57600080fd5b506104d761054a3660046147b7565b6001600160a01b03166000908152600c602052604090205490565b34801561057157600080fd5b506104d7610580366004614629565b6113e5565b34801561059157600080fd5b50466104d7565b3480156105a457600080fd5b506104d7601d5481565b3480156105ba57600080fd5b506105c361148d565b6040516103bd91906147d4565b3480156105dc57600080fd5b506105f06105eb3660046145fb565b61168d565b6040805167ffffffffffffffff94851681529390921660208401526fffffffffffffffffffffffffffffffff16908201526060016103bd565b34801561063557600080fd5b506104d7600581565b34801561064a57600080fd5b50610440610659366004614776565b611784565b34801561066a57600080fd5b506104406106793660046145fb565b61179f565b34801561068a57600080fd5b506103db6040518060400160405280600581526020017f4a656e746f00000000000000000000000000000000000000000000000000000081525081565b3480156106d357600080fd5b506104406106e2366004614629565b611815565b3480156106f357600080fd5b506104d76107023660046145fb565b61198e565b34801561071357600080fd5b506104086107223660046145fb565b611a32565b34801561073357600080fd5b506104d760155481565b34801561074957600080fd5b50610440610758366004614877565b611abd565b34801561076957600080fd5b506104d76107783660046147b7565b611c0b565b34801561078957600080fd5b50610440611ca5565b34801561079e57600080fd5b506104d760195481565b3480156107b457600080fd5b506103db611d75565b3480156107c957600080fd5b50610440611d91565b6104406107e03660046148db565b611e19565b3480156107f157600080fd5b50610440610800366004614979565b6121fc565b34801561081157600080fd5b50600d546001600160a01b0316610408565b34801561082f57600080fd5b506103db6124a2565b34801561084457600080fd5b506104406108533660046147b7565b6124b1565b34801561086457600080fd5b506104406108733660046149dd565b612559565b34801561088457600080fd5b506104406108933660046147b7565b61265b565b3480156108a457600080fd5b506104d76108b33660046145fb565b612703565b3480156108c457600080fd5b506104d7601b5481565b3480156108da57600080fd5b506104d760165481565b3480156108f057600080fd5b506109046108ff3660046145fb565b61277d565b6040516103bd929190614a1b565b34801561091e57600080fd5b506014546103b190610100900460ff1681565b34801561093d57600080fd5b5061044061094c366004614a40565b6128c1565b34801561095d57600080fd5b506103db61096c3660046145fb565b612956565b34801561097d57600080fd5b5061044061098c3660046145fb565b612990565b34801561099d57600080fd5b506103db612b42565b3480156109b257600080fd5b50610440612b75565b3480156109c757600080fd5b506104406109d6366004614aac565b612c1c565b3480156109e757600080fd5b506104d760175481565b3480156109fd57600080fd5b506103db612cfe565b348015610a1257600080fd5b506103b1610a21366004614ae1565b612d1d565b348015610a3257600080fd5b506104d7601c5481565b348015610a4857600080fd5b506104d760185481565b348015610a5e57600080fd5b50610440610a6d3660046147b7565b612e06565b348015610a7e57600080fd5b50610440610a8d366004614629565b612f64565b348015610a9e57600080fd5b506104d7601a5481565b348015610ab457600080fd5b506021546104d7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610b135750610b1382613166565b92915050565b606060008054610b2890614b0f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5490614b0f565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c3a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c6182611a32565b9050806001600160a01b0316836001600160a01b03161415610ceb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c31565b806001600160a01b0316610cfd613249565b6001600160a01b03161480610d195750610d1981610a21613249565b610d8b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c31565b610d958383613258565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610dd887828787876132d3565b610e4a5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610c31565b6001600160a01b0387166000908152600c6020526040902054610e6e9060016133db565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610ebe90899033908a90614b44565b60405180910390a1600080306001600160a01b0316888a604051602001610ee6929190614b70565b60408051601f1981840301815290829052610f0091614bba565b6000604051808303816000865af19150503d8060008114610f3d576040519150601f19603f3d011682016040523d82523d6000602084013e610f42565b606091505b509150915081610f945760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610c31565b98975050505050505050565b60145460ff1615610ff35760405162461bcd60e51b815260206004820152601260248201527f636f6e7472616374206973206c6f636b656400000000000000000000000000006044820152606401610c31565b601454610100900460ff1661104a5760405162461bcd60e51b815260206004820152601460248201527f7075626c6963206d696e74206e6f74206c6976650000000000000000000000006044820152606401610c31565b346016541461109b5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e647300000000000000000000000000006044820152606401610c31565b601a54600854106110ee5760405162461bcd60e51b815260206004820152601360248201527f65786365656420746f6b656e20737570706c79000000000000000000000000006044820152606401610c31565b601754601b54106111415760405162461bcd60e51b815260206004820152601460248201527f657863656564207075626c696320737570706c790000000000000000000000006044820152606401610c31565b601b6000815461115090614bec565b9091555061115d336133ee565b565b601f546001600160a01b0316611173613249565b6001600160a01b0316146111c95760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206172746973740000000000000000000000000000006044820152606401610c31565b601a54816111d660085490565b6111e09190614c07565b111561122e5760405162461bcd60e51b815260206004820152601360248201527f65786365656420746f6b656e20737570706c79000000000000000000000000006044820152606401610c31565b60185481601c5461123f9190614c07565b111561128d5760405162461bcd60e51b815260206004820152601460248201527f6578636565642061727469737420737570706c790000000000000000000000006044820152606401610c31565b80601c600082825461129f9190614c07565b90915550600090505b81811015610d95576112b9836133ee565b6112c281614bec565b90506112a8565b6112da6112d4613249565b8261342d565b61134c5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c31565b610d9583838361350d565b6020805461136490614b0f565b80601f016020809104026020016040519081016040528092919081815260200182805461139090614b0f565b80156113dd5780601f106113b2576101008083540402835291602001916113dd565b820191906000526020600020905b8154815290600101906020018083116113c057829003601f168201915b505050505081565b60006113f083611c0b565b82106114645760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610c31565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60215460609060009067ffffffffffffffff8111156114ae576114ae614655565b6040519080825280602002602001820160405280156114f357816020015b60408051808201909152606080825260208201528152602001906001900390816114cc5790505b50905060005b6021548110156116875760006021828154811061151857611518614c1f565b906000526020600020906002020190508060405180604001604052908160008201805461154490614b0f565b80601f016020809104026020016040519081016040528092919081815260200182805461157090614b0f565b80156115bd5780601f10611592576101008083540402835291602001916115bd565b820191906000526020600020905b8154815290600101906020018083116115a057829003601f168201915b505050505081526020016001820180546115d690614b0f565b80601f016020809104026020016040519081016040528092919081815260200182805461160290614b0f565b801561164f5780601f106116245761010080835404028352916020019161164f565b820191906000526020600020905b81548152906001019060200180831161163257829003601f168201915b50505050508152505083838151811061166a5761166a614c1f565b6020026020010181905250508061168090614bec565b90506114f9565b50919050565b6000806000836116b4816000908152600260205260409020546001600160a01b0316151590565b6117005760405162461bcd60e51b815260206004820152600d60248201527f696e76616c696420746f6b656e000000000000000000000000000000000000006044820152606401610c31565b60008581526023602052604090205460ff1661172757603c9350600a92506032915061177c565b60008581526024602052604090205467ffffffffffffffff808216955068010000000000000000820416935070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1691505b509193909250565b610d95838383604051806020016040528060008152506128c1565b601e546001600160a01b03166117b3613249565b6001600160a01b0316146118095760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206275726e65720000000000000000000000000000006044820152606401610c31565b611812816136f2565b50565b61181d613249565b6001600160a01b0316611838600d546001600160a01b031690565b6001600160a01b03161461188e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b601a548161189b60085490565b6118a59190614c07565b11156118f35760405162461bcd60e51b815260206004820152601360248201527f65786365656420746f6b656e20737570706c79000000000000000000000000006044820152606401610c31565b60195481601d546119049190614c07565b11156119525760405162461bcd60e51b815260206004820152601560248201527f6578636565642067616c6c65727920737570706c7900000000000000000000006044820152606401610c31565b80601d60008282546119649190614c07565b90915550600090505b81811015610d955761197e836133ee565b61198781614bec565b905061196d565b600061199960085490565b8210611a0d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610c31565b60088281548110611a2057611a20614c1f565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b031680610b135760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c31565b611ac5613249565b6001600160a01b0316611ae0600d546001600160a01b031690565b6001600160a01b031614611b365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b60145460ff1615611b895760405162461bcd60e51b815260206004820152601260248201527f636f6e7472616374206973206c6f636b656400000000000000000000000000006044820152606401610c31565b6040805180820190915282815260208082018390526021805460018101825560009190915282518051849360029093027f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b5700192611bea9284929101906143fb565b506020828101518051611c0392600185019201906143fb565b505050505050565b60006001600160a01b038216611c895760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c31565b506001600160a01b031660009081526003602052604090205490565b611cad613249565b6001600160a01b0316611cc8600d546001600160a01b031690565b6001600160a01b031614611d1e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d805473ffffffffffffffffffffffffffffffffffffffff19169055565b6040518060a0016040528060748152602001614fd46074913981565b611d99613249565b6001600160a01b0316611db4600d546001600160a01b031690565b6001600160a01b031614611e0a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b6014805460ff19166001179055565b60145460ff1615611e6c5760405162461bcd60e51b815260206004820152601260248201527f636f6e7472616374206973206c6f636b656400000000000000000000000000006044820152606401610c31565b3482601554611e7b9190614c35565b14611ec85760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e647300000000000000000000000000006044820152606401610c31565b601081604051611ed89190614bba565b9081526040519081900360200190205460ff1615611f385760405162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610c31565b601a5460085410611f8b5760405162461bcd60e51b815260206004820152601160248201527f616c6c20746f6b656e73206d696e7465640000000000000000000000000000006044820152606401610c31565b601a5482611f9860085490565b611fa29190614c07565b1115611ff05760405162461bcd60e51b815260206004820152601360248201527f65786365656420746f6b656e20737570706c79000000000000000000000000006044820152606401610c31565b60175482601b546120019190614c07565b111561204f5760405162461bcd60e51b815260206004820152601460248201527f657863656564207075626c696320737570706c790000000000000000000000006044820152606401610c31565b33600090815260116020526040902054839061206c908490614c07565b11156120ba5760405162461bcd60e51b815260206004820152601160248201527f65786365656420616c6c6f636174696f6e0000000000000000000000000000006044820152606401610c31565b6120c485856137a6565b6121105760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964207369676e65720000000000000000000000000000000000006044820152606401610c31565b61211d85338585856137d8565b6121695760405162461bcd60e51b815260206004820152600c60248201527f696e76616c6964206861736800000000000000000000000000000000000000006044820152606401610c31565b81601b600082825461217b9190614c07565b9091555050336000908152601160205260408120805484929061219f908490614c07565b9250508190555060016010826040516121b89190614bba565b908152604051908190036020019020805491151560ff1990921691909117905560005b82811015611c03576121ec336133ee565b6121f581614bec565b90506121db565b612204613249565b8461220f828261342d565b61221857600080fd5b8467ffffffffffffffff16600a1115801561223e575060648567ffffffffffffffff1611155b6122b05760405162461bcd60e51b815260206004820152602160248201527f696e76616c6964206375626573697a652c2031302d31303020616c6c6f77656460448201527f2e000000000000000000000000000000000000000000000000000000000000006064820152608401610c31565b8367ffffffffffffffff166005111580156122d6575060328467ffffffffffffffff1611155b6123225760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642073706565642c20352d353020616c6c6f7765642e000000006044820152606401610c31565b826fffffffffffffffffffffffffffffffff16600a11158015612358575060c8836fffffffffffffffffffffffffffffffff1611155b6123a45760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206f66667365742c2031302d32303020616c6c6f7765642e006044820152606401610c31565b6000868152602360209081526040808320805460ff1916600117905560249091529081902080546fffffffffffffffffffffffffffffffff8087167001000000000000000000000000000000000267ffffffffffffffff89811668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909416908b16179290921716178155905133917fd62e6c1961fbe8f87220b61031525490ea48d9f3060db66ae86f7ab8f8465a8e91612492918a82525467ffffffffffffffff8082166020840152604082811c90911690830152608090811c60608301520190565b60405180910390a2505050505050565b606060018054610b2890614b0f565b6124b9613249565b6001600160a01b03166124d4600d546001600160a01b031690565b6001600160a01b03161461252a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b601e805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b612561613249565b6001600160a01b0316826001600160a01b031614156125c25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c31565b80600560006125cf613249565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155612613613249565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161264f911515815260200190565b60405180910390a35050565b612663613249565b6001600160a01b031661267e600d546001600160a01b031690565b6001600160a01b0316146126d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b601f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60008181526002602052604081205482906001600160a01b03166127695760405162461bcd60e51b815260206004820152600d60248201527f696e76616c696420746f6b656e000000000000000000000000000000000000006044820152606401610c31565b50506000908152600f602052604090205490565b6021818154811061278d57600080fd5b90600052602060002090600202016000915090508060000180546127b090614b0f565b80601f01602080910402602001604051908101604052809291908181526020018280546127dc90614b0f565b80156128295780601f106127fe57610100808354040283529160200191612829565b820191906000526020600020905b81548152906001019060200180831161280c57829003601f168201915b50505050509080600101805461283e90614b0f565b80601f016020809104026020016040519081016040528092919081815260200182805461286a90614b0f565b80156128b75780601f1061288c576101008083540402835291602001916128b7565b820191906000526020600020905b81548152906001019060200180831161289a57829003601f168201915b5050505050905082565b6128d26128cc613249565b8361342d565b6129445760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c31565b6129508484848461385d565b50505050565b6060612960612b42565b612969836138e6565b60405160200161297a929190614c54565b6040516020818303038152906040529050919050565b612998613249565b6001600160a01b03166129b3600d546001600160a01b031690565b6001600160a01b031614612a095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b60145460ff1615612a5c5760405162461bcd60e51b815260206004820152601260248201527f636f6e7472616374206973206c6f636b656400000000000000000000000000006044820152606401610c31565b6021548110612a6a57600080fd5b60218054612a7a90600190614cd6565b81548110612a8a57612a8a614c1f565b906000526020600020906002020160218281548110612aab57612aab614c1f565b90600052602060002090600202016000820181600001908054612acd90614b0f565b612ad892919061447f565b506001820181600101908054612aed90614b0f565b612af892919061447f565b509050506021805480612b0d57612b0d614ced565b60008281526020812060001990920191600283020190612b2d82826144fa565b612b3b6001830160006144fa565b5050905550565b60606022612b5060056138e6565b604051602001612b61929190614d9d565b604051602081830303815290604052905090565b612b7d613249565b6001600160a01b0316612b98600d546001600160a01b031690565b6001600160a01b031614612bee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b601480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b612c24613249565b6001600160a01b0316612c3f600d546001600160a01b031690565b6001600160a01b031614612c955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b60145460ff1615612ce85760405162461bcd60e51b815260206004820152601260248201527f636f6e7472616374206973206c6f636b656400000000000000000000000000006044820152606401610c31565b8051612cfa90602090818401906143fb565b5050565b60606022612d0c60056138e6565b604051602001612b61929190614e15565b600e546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015612d8357600080fd5b505afa158015612d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dbb9190614e8d565b6001600160a01b03161415612dd4576001915050610b13565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b612e0e613249565b6001600160a01b0316612e29600d546001600160a01b031690565b6001600160a01b031614612e7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b6001600160a01b038116612efb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c31565b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b612f6c613249565b6001600160a01b0316612f87600d546001600160a01b031690565b6001600160a01b031614612fdd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b6000811161302d5760405162461bcd60e51b815260206004820152600c60248201527f616d6f756e7420656d70747900000000000000000000000000000000000000006044820152606401610c31565b4781111561307d5760405162461bcd60e51b815260206004820152601660248201527f616d6f756e7420657863656564732062616c616e6365000000000000000000006044820152606401610c31565b6001600160a01b0382166130d35760405162461bcd60e51b815260206004820152600c60248201527f61646472657373206e756c6c00000000000000000000000000000000000000006044820152606401610c31565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610d95573d6000803e3d6000fd5b60003330141561316057600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506131639050565b50335b90565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806131f957507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b1357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610b13565b6000613253613109565b905090565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416908117909155819061329a82611a32565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166133515760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201527f49474e45520000000000000000000000000000000000000000000000000000006064820152608401610c31565b600161336461335f87613a18565b613a95565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156133b2573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006133e78284614c07565b9392505050565b60006133f960085490565b613404906001614c07565b90506134108282613ae0565b61341a8282613afa565b6000918252600f60205260409091205550565b6000818152600260205260408120546001600160a01b03166134b75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c31565b60006134c283611a32565b9050806001600160a01b0316846001600160a01b031614806134fd5750836001600160a01b03166134f284610bab565b6001600160a01b0316145b80612dfe5750612dfe8185612d1d565b826001600160a01b031661352082611a32565b6001600160a01b03161461359c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610c31565b6001600160a01b0382166136175760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c31565b613622838383613b86565b61362d600082613258565b6001600160a01b0383166000908152600360205260408120805460019290613656908490614cd6565b90915550506001600160a01b0382166000908152600360205260408120805460019290613684908490614c07565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006136fd82611a32565b905061370b81600084613b86565b613716600083613258565b6001600160a01b038116600090815260036020526040812080546001929061373f908490614cd6565b9091555050600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600073da9f95f43d4189285fa618df89f66d9666e806946137c78484613c3e565b6001600160a01b0316149392505050565b600085858585856040516020016137f29493929190614eaa565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c016040516020818303038152906040528051906020012014905095945050505050565b61386884848461350d565b61387484848484613d0d565b6129505760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c31565b60608161392657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613950578061393a81614bec565b91506139499050600a83614f19565b915061392a565b60008167ffffffffffffffff81111561396b5761396b614655565b6040519080825280601f01601f191660200182016040528015613995576020820181803683370190505b5090505b8415612dfe576139aa600183614cd6565b91506139b7600a86614f2d565b6139c2906030614c07565b60f81b8183815181106139d7576139d7614c1f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613a11600a86614f19565b9450613999565b6000604051806080016040528060438152602001614f916043913980516020918201208351848301516040808701518051908601209051613a78950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000613aa0600b5490565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201613a78565b612cfa828260405180602001604052806000815250613ea8565b600080613b08600143614cd6565b60135460408051924060208401527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000033606090811b82169285019290925260548401929092526074830186905286901b16609482015260a80160408051808303601f1901815291905280516020909101206013819055949350505050565b6001600160a01b038316613be157613bdc81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613c04565b816001600160a01b0316836001600160a01b031614613c0457613c048382613f31565b6001600160a01b038216613c1b57610d9581613fce565b826001600160a01b0316826001600160a01b031614610d9557610d95828261407d565b600080600080845160411415613c685750505060208201516040830151606084015160001a613cf7565b845160401415613caf5750505060408201516020830151907f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81169060ff1c601b01613cf7565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c31565b613d03868285856140c1565b9695505050505050565b60006001600160a01b0384163b15613e9d57836001600160a01b031663150b7a02613d36613249565b8786866040518563ffffffff1660e01b8152600401613d589493929190614f41565b602060405180830381600087803b158015613d7257600080fd5b505af1925050508015613da2575060408051601f3d908101601f19168201909252613d9f91810190614f73565b60015b613e52573d808015613dd0576040519150601f19603f3d011682016040523d82523d6000602084013e613dd5565b606091505b508051613e4a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c31565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612dfe565b506001949350505050565b613eb283836142a0565b613ebf6000848484613d0d565b610d955760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c31565b60006001613f3e84611c0b565b613f489190614cd6565b600083815260076020526040902054909150808214613f9b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613fe090600190614cd6565b6000838152600960205260408120546008805493945090928490811061400857614008614c1f565b90600052602060002001549050806008838154811061402957614029614c1f565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061406157614061614ced565b6001900381819060005260206000200160009055905550505050565b600061408883611c0b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156141595760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610c31565b8360ff16601b148061416e57508360ff16601c145b6141e05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610c31565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015614234573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166142975760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610c31565b95945050505050565b6001600160a01b0382166142f65760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c31565b6000818152600260205260409020546001600160a01b03161561435b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c31565b61436760008383613b86565b6001600160a01b0382166000908152600360205260408120805460019290614390908490614c07565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461440790614b0f565b90600052602060002090601f016020900481019282614429576000855561446f565b82601f1061444257805160ff191683800117855561446f565b8280016001018555821561446f579182015b8281111561446f578251825591602001919060010190614454565b5061447b929150614530565b5090565b82805461448b90614b0f565b90600052602060002090601f0160209004810192826144ad576000855561446f565b82601f106144be578054855561446f565b8280016001018555821561446f57600052602060002091601f016020900482015b8281111561446f5782548255916001019190600101906144df565b50805461450690614b0f565b6000825580601f10614516575050565b601f01602090049060005260206000209081019061181291905b5b8082111561447b5760008155600101614531565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461181257600080fd5b60006020828403121561458557600080fd5b81356133e781614545565b60005b838110156145ab578181015183820152602001614593565b838111156129505750506000910152565b600081518084526145d4816020860160208601614590565b601f01601f19169290920160200192915050565b6020815260006133e760208301846145bc565b60006020828403121561460d57600080fd5b5035919050565b6001600160a01b038116811461181257600080fd5b6000806040838503121561463c57600080fd5b823561464781614614565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261467c57600080fd5b813567ffffffffffffffff8082111561469757614697614655565b604051601f8301601f19908116603f011681019082821181831017156146bf576146bf614655565b816040528381528660208588010111156146d857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a0868803121561471057600080fd5b853561471b81614614565b9450602086013567ffffffffffffffff81111561473757600080fd5b6147438882890161466b565b9450506040860135925060608601359150608086013560ff8116811461476857600080fd5b809150509295509295909350565b60008060006060848603121561478b57600080fd5b833561479681614614565b925060208401356147a681614614565b929592945050506040919091013590565b6000602082840312156147c957600080fd5b81356133e781614614565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015614869577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151805187855261483d888601826145bc565b91890151858303868b015291905061485581836145bc565b9689019694505050908601906001016147fb565b509098975050505050505050565b6000806040838503121561488a57600080fd5b823567ffffffffffffffff808211156148a257600080fd5b6148ae8683870161466b565b935060208501359150808211156148c457600080fd5b506148d18582860161466b565b9150509250929050565b600080600080600060a086880312156148f357600080fd5b85359450602086013567ffffffffffffffff8082111561491257600080fd5b61491e89838a0161466b565b95506040880135945060608801359350608088013591508082111561494257600080fd5b5061494f8882890161466b565b9150509295509295909350565b803567ffffffffffffffff8116811461497457600080fd5b919050565b6000806000806080858703121561498f57600080fd5b8435935061499f6020860161495c565b92506149ad6040860161495c565b915060608501356fffffffffffffffffffffffffffffffff811681146149d257600080fd5b939692955090935050565b600080604083850312156149f057600080fd5b82356149fb81614614565b915060208301358015158114614a1057600080fd5b809150509250929050565b604081526000614a2e60408301856145bc565b828103602084015261429781856145bc565b60008060008060808587031215614a5657600080fd5b8435614a6181614614565b93506020850135614a7181614614565b925060408501359150606085013567ffffffffffffffff811115614a9457600080fd5b614aa08782880161466b565b91505092959194509250565b600060208284031215614abe57600080fd5b813567ffffffffffffffff811115614ad557600080fd5b612dfe8482850161466b565b60008060408385031215614af457600080fd5b8235614aff81614614565b91506020830135614a1081614614565b600181811c90821680614b2357607f821691505b6020821081141561168757634e487b7160e01b600052602260045260246000fd5b60006001600160a01b0380861683528085166020840152506060604083015261429760608301846145bc565b60008351614b82818460208801614590565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b60008251614bcc818460208701614590565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415614c0057614c00614bd6565b5060010190565b60008219821115614c1a57614c1a614bd6565b500190565b634e487b7160e01b600052603260045260246000fd5b6000816000190483118215151615614c4f57614c4f614bd6565b500290565b60008351614c66818460208801614590565b7f2f000000000000000000000000000000000000000000000000000000000000009083019081528351614ca0816001840160208801614590565b7f2f6d65746100000000000000000000000000000000000000000000000000000060019290910191820152600601949350505050565b600082821015614ce857614ce8614bd6565b500390565b634e487b7160e01b600052603160045260246000fd5b8054600090600181811c9080831680614d1d57607f831692505b6020808410821415614d3f57634e487b7160e01b600052602260045260246000fd5b818015614d535760018114614d6457614d91565b60ff19861689528489019650614d91565b60008881526020902060005b86811015614d895781548b820152908501908301614d70565b505084890196505b50505050505092915050565b6000614da98285614d03565b7f2f6170692f70726f6a6563742f0000000000000000000000000000000000000081528351614ddf81600d840160208801614590565b7f2f746f6b656e0000000000000000000000000000000000000000000000000000600d9290910191820152601301949350505050565b6000614e218285614d03565b7f2f6170692f70726f6a6563742f0000000000000000000000000000000000000081528351614e5781600d840160208801614590565b7f2f636f6e74726163740000000000000000000000000000000000000000000000600d9290910191820152601601949350505050565b600060208284031215614e9f57600080fd5b81516133e781614614565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008560601b16815283601482015282603482015260008251614ef3816054850160208701614590565b9190910160540195945050505050565b634e487b7160e01b600052601260045260246000fd5b600082614f2857614f28614f03565b500490565b600082614f3c57614f3c614f03565b500690565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613d0360808301846145bc565b600060208284031215614f8557600080fd5b81516133e78161454556fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e61747572652941206469676974616c206162737472616374696f6e206f662074686520496b6562616e6120617274277320717565737420666f72206861726d6f6e792c2062616c616e636520616e642067726163652e2044616e63696e6720666f726576657220696e20686f6e6f72206f66206265617574792ea2646970667358221220cb72a63d5f48b22ea5733189dee5ef0b4ad5cac2779078b4c1cd1072712b53bc64736f6c63430008090033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000001860000000000000000000000000000000000000000000000000000000000000079e00000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019d7b49f8181bae3ddfce8160a049e526bb5bc6e6497e92ddddc3bd8a01c6bf4fd000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001070352d76312e342e302e6d696e2e6a7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e516d65596b4435614c386465395a4778567244484e316a773267704a654d7a574e3848767152577237554e444c53000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164c636f6e7374207536343d613d3e426967496e742e617355696e744e2836342c61292c726f746c3d28612c62293d3e75363428613c3c627c613e3e36346e2d62292c786f736869726f3235367374727374723d613d3e28293d3e7b636f6e737420623d75363428396e2a726f746c2875363428356e2a615b315d292c376e29293b6c657420633d75363428615b315d3c3c31376e293b72657475726e20615b325d5e3d615b305d2c615b335d5e3d615b315d2c615b315d5e3d615b325d2c615b305d5e3d615b335d2c615b325d5e3d632c615b335d3d726f746c28615b335d2c34356e292c627d2c72616e646f6d446563696d616c3d613d3e28293d3e7b636f6e737420623d6128293b72657475726e204e756d626572286225393030373139393235343734303939316e292f393030373139393235343734303939317d2c72616e646f6d4e756d6265723d633d3e28642c61293d3e642b28612d64292a6328292c72616e646f6d496e743d633d3e28642c61293d3e4d6174682e666c6f6f72286328642c612b3129292c6d6b52616e646f6d3d613d3e7b636f6e737420623d41727261792834292e66696c6c28292e6d61702828612c62293d3e31362a622b32292e6d617028623d3e75363428603078247b612e736c69636528622c622b3136297d6029292c633d786f736869726f3235367374727374722862292c643d72616e646f6d446563696d616c2863292c653d72616e646f6d4e756d6265722864292c663d72616e646f6d496e742865293b72657475726e7b723a642c726e3a652c72693a667d7d2c73687566666c653d28612c62293d3e7b76617220633d4d6174682e666c6f6f723b666f72286c657420642c652c663d612e6c656e6774683b663b29653d63286228292a662d2d292c643d615b665d2c615b665d3d615b655d2c615b655d3d643b72657475726e20617d2c7265706561743d28612c62293d3e41727261792e66726f6d287b6c656e6774683a627d292e6d61702828293d3e61292c73656c65637452616e646f6d3d28612c62293d3e615b4d6174682e666c6f6f72286228292a612e6c656e677468295d2c73656c65637452616e646f6d446973743d28622c63293d3e7b636f6e737420613d4f626a6563742e6b6579732862292e7265647563652828632c61293d3e632e636f6e6361742872657065617428612c3130302a625b615d29292c5b5d293b72657475726e2073656c65637452616e646f6d2873687566666c6528612c63292c63297d2c746f4865783d613d3e612e746f537472696e67283136292e706164537461727428322c223022292c66726f6d4865783d613d3e7061727365496e7428612c3136292c72616e646f6d436f6c6f724865783d613d3e7b636f6e737420623d28293d3e746f486578284d6174682e666c6f6f72283235362a61282929292c633d6228292c643d6228292c653d6228293b72657475726e6023247b637d247b647d247b657d607d2c636f6c446973743d7b303a2e312c313a2e312c323a2e312c333a2e30352c343a2e30342c353a2e3032352c363a2e30352c373a2e312c383a2e312c393a2e312c31303a2e30352c31313a2e312c31323a2e30352c31333a2e3032352c31343a2e30317d2c73796d446973743d7b333a2e30362c343a2e30352c353a2e30322c363a2e312c373a2e31322c383a2e31352c393a2e31352c31303a2e31352c31313a2e31352c31323a2e30357d2c737072656164446973743d7b303a2e30352c313a2e31352c323a2e332c333a2e31352c343a2e31352c353a2e312c363a2e317d2c6375626573446973743d7b34303a2e312c35303a2e322c36303a2e32352c37303a2e332c38303a2e312c39303a2e30357d2c68617368546f5472616974733d613d3e7b636f6e737420623d6d6b52616e646f6d2861292c633d622e7269283230302c343030292c643d622e7269283230302c343030292c653d622e7269283230302c353030292c663d622e726928312c34292c673d622e726928312c34292c683d622e726928312c34292c693d622e726928312c34292c6a3d7061727365496e742873656c65637452616e646f6d446973742873796d446973742c622e7229292c6b3d7061727365496e742873656c65637452616e646f6d4469737428737072656164446973742c622e7229292c6c3d7061727365496e742873656c65637452616e646f6d4469737428636f6c446973742c622e7229292c6d3d7061727365496e742873656c65637452616e646f6d44697374286375626573446973742c622e7229293b72657475726e7b73697a65783a632c73697a65793a642c73697a657a3a652c636f73783a662c73696e783a672c636f73793a682c73696e793a692c637562656e756d3a6d2c73796d6d657472793a6a2c7370726561643a6b2c636f6c7365743a6c7d7d3b6c65742077656972646b2c6c61737470696e63682c74696d656f75742c72656e64657265722c616e673d302c73697a3d36302c6b73706565643d2e332c6b6f66663d3830302c63756d756c3d302c70696e6368696e673d21312c70696e6368646973743d302c746f7a3d323830302c7a733d35302c636f66783d312c636f66793d312c636f667a3d312c70726576526f743d5b312c302c302c305d2c63757272526f743d5b312c302c302c305d2c636f6c734172723d5b5b2223393235653738222c2223626439336264222c2223663265646562222c2223663035333635222c2223666162633261225d2c5b2223323563656431222c2223666666666666222c2223666365616465222c2223666638613562222c2223656135323666225d2c5b2223626662646331222c2223366436613735222c2223333733323365222c2223646562383431222c2223646539653336225d2c5b2223433946424646222c2223333734433643222c2223363837434131222c2223376434653537222c2223453038433742225d2c5b2223346334346366222c2223653935336461222c2223663563316630222c2223316538636230222c2223313432663438225d2c5b2223303333663633222c2223323836363665222c2223376339383835222c2223623562363832222c2223666564633937225d2c5b2223386563616536222c2223323139656263222c2223303233303437222c2223666662373033222c2223666238353030225d2c5b2223663466316465222c2223653037613566222c2223336434303562222c2223383162323961222c2223663263633866225d2c5b2223443136363636222c2223326634353530222c2223353836663763222c2223623864626439222c2223663466346639225d2c5b2223336433343862222c2223373637386564222c2223663762383031222c2223444244424641222c2223663335623034225d2c5b2223464345394545222c2223463843384435222c2223423634433632222c2223364131333145222c2223463441453634225d2c5b2223306433623636222c2223666166306361222c2223663464333565222c2223656539363462222c2223663935373338225d2c5b2223666661663837222c2223464643454332222c2223656436613565222c2223346365306233222c2223333737373731225d2c5b2223353630336164222c2223383336376337222c2223623365396337222c2223633266386362222c2223663066666631225d2c5b2223303030303030222c2223324332633263222c2223434343434343222c2223336133613361222c2223383830303030225d5d2c62674172723d5b2223334432393239222c2223313632363265222c2223303030303030222c2223313131353163222c2223313632363265222c2223303231323039222c2223313831313134222c2223313031393135222c2223313030353035222c2223304430423145222c2223323631413141222c2223314531443230222c2223313632363265222c2223314530313343222c2223464646464646225d3b636f6e737420637075506f733d28622c63293d3e7b76617220643d4d6174682e73696e2c653d4d6174682e636f733b6c657420663d5b5d3b666f72286c657420673d303b673c622e6c656e6774683b672b2b297b6c657420683d625b675d2b635b345d2c613d635b305d2a28322b6528636f73782a6829292a652873696e782a68293b612a3d303d3d635b335d3f313a635b335d2a652868292f642868293b6c657420693d635b315d2a28322b6528636f73792a6829292a642873696e792a68292c6a3d635b325d2a6428322a68293b662e70757368285b612c692c6a5d297d72657475726e20667d2c637075526f743d28612c62293d3e7b6c657420633d5b5d3b666f72286c657420653d303b653c612e6c656e6774683b652b2b297b6c657420663d5b625b655d5b305d2d615b655d5b305d2c625b655d5b315d2d615b655d5b315d2c625b655d5b325d2d615b655d5b325d5d2c643d4d6174682e7371727428665b305d2a665b305d2b665b315d2a665b315d2b665b325d2a665b325d293b665b305d2f3d642c665b315d2f3d642c665b325d2f3d643b6c657420673d4d6174682e6173696e282d665b315d293b2e34393c665b305d26262e353e665b305d3f665b305d3d2e353a2d2e34393e665b305d26262d2e353c665b305d262628665b305d3d2d2e35293b6c657420683d4d6174682e6174616e3228665b305d2c665b325d293b632e70757368285b672c685d297d72657475726e20637d3b6c65742073697a65782c73697a65792c73697a657a2c636f73782c73696e782c636f73792c73696e792c637562656e756d2c73796d6d657472792c7370726561642c636f6c7365743b66756e6374696f6e2061737369676e54726169747328297b6c657420613d68617368546f54726169747328746f6b656e446174612e68617368293b73697a65783d612e73697a65782c73697a65793d612e73697a65792c73697a657a3d612e73697a657a2c636f73783d612e636f73782c73696e783d612e73696e782c636f73793d612e636f73792c73696e793d612e73696e792c637562656e756d3d612e637562656e756d2c73796d6d657472793d612e73796d6d657472792c7370726561643d612e7370726561642c636f6c7365743d612e636f6c7365742c77656972646b3d7370726561642f327d66756e6374696f6e2070646973742861297b72657475726e204d6174682e6879706f7428612e746f75636865735b305d2e70616765582d612e746f75636865735b315d2e70616765582c612e746f75636865735b305d2e70616765592d612e746f75636865735b315d2e7061676559297d66756e6374696f6e20776865656c2861297b76617220623d612e776865656c44656c74613b7a6f6f6d2862297d66756e6374696f6e207a6f6f6d2861297b313830303e3d746f7a2626303e617c7c343230303c3d746f7a2626303c617c7c28746f7a2b3d61297d66756e6374696f6e20746f75636873746172742861297b323d3d3d612e746f75636865732e6c656e67746826262870696e6368696e673d21302c70696e6368646973743d7064697374286129297d66756e6374696f6e20746f7563686d6f76652861297b69662870696e6368696e67297b6966286c61737470696e63683d70696e6368646973742c70696e6368646973743d70646973742861292c303d3d70696e6368646973747c7c303d3d6c61737470696e63682972657475726e3b63756d756c2b3d2d2870696e6368646973742d6c61737470696e6368297d7d66756e6374696f6e20746f756368656e6428297b70696e6368696e673d21312c6c61737470696e63683d302c70696e6368646973743d302c63756d756c3d307d66756e6374696f6e20736574757028297b61737369676e54726169747328292c70352e64697361626c65467269656e646c794572726f72733d21303b636f6e737420613d77696e646f772e696e6e657257696474682c623d77696e646f772e696e6e65724865696768743b616e676c654d6f64652844454752454553292c72656e64657265723d63726561746543616e76617328612c622c574542474c292c72656e64657265722e6d6f757365576865656c28776865656c292c72656e64657265722e746f7563685374617274656428746f7563687374617274292c72656e64657265722e746f7563684d6f76656428746f7563686d6f7665292c72656e64657265722e746f756368456e64656428746f756368656e64292c6e6f5374726f6b6528297d636f6e737420636f6d7075746553697a653d613d3e7b6c657420623d6d61702873696e2861292c2d312c312c302c73697a292c633d6d617028636f732861292c2d312c312c302c73697a292c643d6d61702873696e2861292c2d312c312c302c73697a293b72657475726e20637265617465566563746f7228622c632c64297d3b66756e6374696f6e206472617728297b63616d65726128302c302c746f7a292c6b73706565643d746f6b656e53746174652e73706565642f3130302c6b6f66663d746f6b656e53746174652e6f66667365742c73697a3d746f6b656e53746174652e6375626573697a652c616d6269656e744c69676874283136382c3136382c313638292c646972656374696f6e616c4c69676874283132382c3132382c3132382c302c302c2d31292c6261636b67726f756e642862674172725b636f6c7365745d293b6c657420613d77656972646b3f6b73706565642f323a6b73706565642c623d302c633d303b726f746174655a28616e67293b6c657420643d5b5d3b636f66783d73697a65782b6b6f66662a61627328636f7328322a616e6729292c636f66793d73697a65792b6b6f66662a6162732873696e28322a616e6729293b6c657420653d5b636f66782c636f66792c73697a657a2c77656972646b2c305d2c663d5b636f66782c636f66792c73697a657a2c77656972646b2c2e30315d3b666f72286c657420613d303b3336303e613b612b3d3336302f637562656e756d29642e707573682872616469616e7328616e672b6129293b6c657420673d637075506f7328642c65292c683d637075506f7328642c66292c693d637075526f7428672c68293b666f72283b3336303e3d623b297b7075736828292c726f746174655a2862293b6c657420613d302c643d303b666f72283b643c637562656e756d3b297b7075736828292c7472616e736c61746528675b645d5b305d2c675b645d5b315d2c675b645d5b325d292c726f7461746559286465677265657328695b645d5b315d29292c726f7461746558286465677265657328695b645d5b305d29293b6c657420623d636f6c734172725b636f6c7365745d2c633d696e74286d617028612c302c3336302c302c637562656e756d292925622e6c656e6774683b633e622e6c656e6774682d31262628633d622e6c656e6774682d31292c66696c6c28625b635d293b6c657420653d636f6d7075746553697a6528612b616e67293b626f7828652e782c652e792c652e7a292c706f7028292c612b3d3336302f637562656e756d2c642b2b7d622b3d3336302f73796d6d657472792c632b3d6b6f66662c706f7028297d696628616e672b3d612c3336303c3d616e67262628616e673d30292c30213d63756d756c29696628303c63756d756c297b6c657420613d63756d756c3c7a733f63756d756c3a7a733b7a6f6f6d2861292c63756d756c2b3d617d656c736520696628303e63756d756c297b6c657420613d63756d756c3e2d7a733f63756d756c3a2d7a733b7a6f6f6d2861292c63756d756c2b3d617d7d66756e6374696f6e2077696e646f77526573697a656428297b726573697a6543616e7661732877696e646f7757696474682c77696e646f77486569676874297d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001768747470733a2f2f67656e65746963636861696e2e696f000000000000000000

Deployed Bytecode

0x60806040526004361061038c5760003560e01c806371dedace116101dc578063b88d4fde11610102578063e8a3d485116100a0578063f2fde38b1161006f578063f2fde38b14610a52578063f3fef3a314610a72578063f7ee706814610a92578063f8f0b80e14610aa857600080fd5b8063e8a3d485146109f1578063e985e9c514610a06578063ed329fa814610a26578063ef3c662414610a3c57600080fd5b8063d547cfb7116100dc578063d547cfb714610991578063d62f3b1c146109a6578063e403f1a7146109bb578063e527c6dd146109db57600080fd5b8063b88d4fde14610931578063c87b56dd14610951578063c93ed70a1461097157600080fd5b80639df806d61161017a578063a4f4f8af11610149578063a4f4f8af146108b8578063a945bf80146108ce578063b1fbe72d146108e4578063b7f751d81461091257600080fd5b80639df806d614610838578063a22cb46514610858578063a22e4faa14610878578063a38643971461089857600080fd5b806380a1962f116101b657806380a1962f146107d257806380e6fd89146107e55780638da5cb5b1461080557806395d89b411461082357600080fd5b806371dedace146107925780637284e416146107a8578063753868e3146107bd57600080fd5b80633408e470116102c157806343bc16121161025f578063636e746b1161022e578063636e746b14610727578063638e19b41461073d57806370a082311461075d578063715018a61461077d57600080fd5b806343bc16121461067e57806344be774f146106c75780634f6ccce7146106e75780636352211e1461070757600080fd5b80633e4f49e61161029b5780633e4f49e6146105d05780633fafa1271461062957806342842e0e1461063e57806342966c681461065e57600080fd5b80633408e470146105855780633763e75b146105985780633e02bc38146105ae57600080fd5b806314d7d5171161032e57806323b872dd1161030857806323b872dd146104fa57806324c12bf61461051a5780632d0335ab1461052f5780632f745c591461056557600080fd5b806314d7d517146104a657806318160ddd146104c657806320379ee5146104e557600080fd5b8063095ea7b31161036a578063095ea7b3146104205780630c53c51c146104425780630f7e5970146104555780631249c58b1461049e57600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004614573565b610abd565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610b19565b6040516103bd91906145e8565b3480156103f457600080fd5b506104086104033660046145fb565b610bab565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004614629565b610c56565b005b6103db6104503660046146f8565b610d9a565b34801561046157600080fd5b506103db6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b610440610fa0565b3480156104b257600080fd5b506104406104c1366004614629565b61115f565b3480156104d257600080fd5b506008545b6040519081526020016103bd565b3480156104f157600080fd5b50600b546104d7565b34801561050657600080fd5b50610440610515366004614776565b6112c9565b34801561052657600080fd5b506103db611357565b34801561053b57600080fd5b506104d761054a3660046147b7565b6001600160a01b03166000908152600c602052604090205490565b34801561057157600080fd5b506104d7610580366004614629565b6113e5565b34801561059157600080fd5b50466104d7565b3480156105a457600080fd5b506104d7601d5481565b3480156105ba57600080fd5b506105c361148d565b6040516103bd91906147d4565b3480156105dc57600080fd5b506105f06105eb3660046145fb565b61168d565b6040805167ffffffffffffffff94851681529390921660208401526fffffffffffffffffffffffffffffffff16908201526060016103bd565b34801561063557600080fd5b506104d7600581565b34801561064a57600080fd5b50610440610659366004614776565b611784565b34801561066a57600080fd5b506104406106793660046145fb565b61179f565b34801561068a57600080fd5b506103db6040518060400160405280600581526020017f4a656e746f00000000000000000000000000000000000000000000000000000081525081565b3480156106d357600080fd5b506104406106e2366004614629565b611815565b3480156106f357600080fd5b506104d76107023660046145fb565b61198e565b34801561071357600080fd5b506104086107223660046145fb565b611a32565b34801561073357600080fd5b506104d760155481565b34801561074957600080fd5b50610440610758366004614877565b611abd565b34801561076957600080fd5b506104d76107783660046147b7565b611c0b565b34801561078957600080fd5b50610440611ca5565b34801561079e57600080fd5b506104d760195481565b3480156107b457600080fd5b506103db611d75565b3480156107c957600080fd5b50610440611d91565b6104406107e03660046148db565b611e19565b3480156107f157600080fd5b50610440610800366004614979565b6121fc565b34801561081157600080fd5b50600d546001600160a01b0316610408565b34801561082f57600080fd5b506103db6124a2565b34801561084457600080fd5b506104406108533660046147b7565b6124b1565b34801561086457600080fd5b506104406108733660046149dd565b612559565b34801561088457600080fd5b506104406108933660046147b7565b61265b565b3480156108a457600080fd5b506104d76108b33660046145fb565b612703565b3480156108c457600080fd5b506104d7601b5481565b3480156108da57600080fd5b506104d760165481565b3480156108f057600080fd5b506109046108ff3660046145fb565b61277d565b6040516103bd929190614a1b565b34801561091e57600080fd5b506014546103b190610100900460ff1681565b34801561093d57600080fd5b5061044061094c366004614a40565b6128c1565b34801561095d57600080fd5b506103db61096c3660046145fb565b612956565b34801561097d57600080fd5b5061044061098c3660046145fb565b612990565b34801561099d57600080fd5b506103db612b42565b3480156109b257600080fd5b50610440612b75565b3480156109c757600080fd5b506104406109d6366004614aac565b612c1c565b3480156109e757600080fd5b506104d760175481565b3480156109fd57600080fd5b506103db612cfe565b348015610a1257600080fd5b506103b1610a21366004614ae1565b612d1d565b348015610a3257600080fd5b506104d7601c5481565b348015610a4857600080fd5b506104d760185481565b348015610a5e57600080fd5b50610440610a6d3660046147b7565b612e06565b348015610a7e57600080fd5b50610440610a8d366004614629565b612f64565b348015610a9e57600080fd5b506104d7601a5481565b348015610ab457600080fd5b506021546104d7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610b135750610b1382613166565b92915050565b606060008054610b2890614b0f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5490614b0f565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c3a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c6182611a32565b9050806001600160a01b0316836001600160a01b03161415610ceb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c31565b806001600160a01b0316610cfd613249565b6001600160a01b03161480610d195750610d1981610a21613249565b610d8b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c31565b610d958383613258565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610dd887828787876132d3565b610e4a5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610c31565b6001600160a01b0387166000908152600c6020526040902054610e6e9060016133db565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610ebe90899033908a90614b44565b60405180910390a1600080306001600160a01b0316888a604051602001610ee6929190614b70565b60408051601f1981840301815290829052610f0091614bba565b6000604051808303816000865af19150503d8060008114610f3d576040519150601f19603f3d011682016040523d82523d6000602084013e610f42565b606091505b509150915081610f945760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610c31565b98975050505050505050565b60145460ff1615610ff35760405162461bcd60e51b815260206004820152601260248201527f636f6e7472616374206973206c6f636b656400000000000000000000000000006044820152606401610c31565b601454610100900460ff1661104a5760405162461bcd60e51b815260206004820152601460248201527f7075626c6963206d696e74206e6f74206c6976650000000000000000000000006044820152606401610c31565b346016541461109b5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e647300000000000000000000000000006044820152606401610c31565b601a54600854106110ee5760405162461bcd60e51b815260206004820152601360248201527f65786365656420746f6b656e20737570706c79000000000000000000000000006044820152606401610c31565b601754601b54106111415760405162461bcd60e51b815260206004820152601460248201527f657863656564207075626c696320737570706c790000000000000000000000006044820152606401610c31565b601b6000815461115090614bec565b9091555061115d336133ee565b565b601f546001600160a01b0316611173613249565b6001600160a01b0316146111c95760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206172746973740000000000000000000000000000006044820152606401610c31565b601a54816111d660085490565b6111e09190614c07565b111561122e5760405162461bcd60e51b815260206004820152601360248201527f65786365656420746f6b656e20737570706c79000000000000000000000000006044820152606401610c31565b60185481601c5461123f9190614c07565b111561128d5760405162461bcd60e51b815260206004820152601460248201527f6578636565642061727469737420737570706c790000000000000000000000006044820152606401610c31565b80601c600082825461129f9190614c07565b90915550600090505b81811015610d95576112b9836133ee565b6112c281614bec565b90506112a8565b6112da6112d4613249565b8261342d565b61134c5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c31565b610d9583838361350d565b6020805461136490614b0f565b80601f016020809104026020016040519081016040528092919081815260200182805461139090614b0f565b80156113dd5780601f106113b2576101008083540402835291602001916113dd565b820191906000526020600020905b8154815290600101906020018083116113c057829003601f168201915b505050505081565b60006113f083611c0b565b82106114645760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610c31565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60215460609060009067ffffffffffffffff8111156114ae576114ae614655565b6040519080825280602002602001820160405280156114f357816020015b60408051808201909152606080825260208201528152602001906001900390816114cc5790505b50905060005b6021548110156116875760006021828154811061151857611518614c1f565b906000526020600020906002020190508060405180604001604052908160008201805461154490614b0f565b80601f016020809104026020016040519081016040528092919081815260200182805461157090614b0f565b80156115bd5780601f10611592576101008083540402835291602001916115bd565b820191906000526020600020905b8154815290600101906020018083116115a057829003601f168201915b505050505081526020016001820180546115d690614b0f565b80601f016020809104026020016040519081016040528092919081815260200182805461160290614b0f565b801561164f5780601f106116245761010080835404028352916020019161164f565b820191906000526020600020905b81548152906001019060200180831161163257829003601f168201915b50505050508152505083838151811061166a5761166a614c1f565b6020026020010181905250508061168090614bec565b90506114f9565b50919050565b6000806000836116b4816000908152600260205260409020546001600160a01b0316151590565b6117005760405162461bcd60e51b815260206004820152600d60248201527f696e76616c696420746f6b656e000000000000000000000000000000000000006044820152606401610c31565b60008581526023602052604090205460ff1661172757603c9350600a92506032915061177c565b60008581526024602052604090205467ffffffffffffffff808216955068010000000000000000820416935070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1691505b509193909250565b610d95838383604051806020016040528060008152506128c1565b601e546001600160a01b03166117b3613249565b6001600160a01b0316146118095760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206275726e65720000000000000000000000000000006044820152606401610c31565b611812816136f2565b50565b61181d613249565b6001600160a01b0316611838600d546001600160a01b031690565b6001600160a01b03161461188e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b601a548161189b60085490565b6118a59190614c07565b11156118f35760405162461bcd60e51b815260206004820152601360248201527f65786365656420746f6b656e20737570706c79000000000000000000000000006044820152606401610c31565b60195481601d546119049190614c07565b11156119525760405162461bcd60e51b815260206004820152601560248201527f6578636565642067616c6c65727920737570706c7900000000000000000000006044820152606401610c31565b80601d60008282546119649190614c07565b90915550600090505b81811015610d955761197e836133ee565b61198781614bec565b905061196d565b600061199960085490565b8210611a0d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610c31565b60088281548110611a2057611a20614c1f565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b031680610b135760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c31565b611ac5613249565b6001600160a01b0316611ae0600d546001600160a01b031690565b6001600160a01b031614611b365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b60145460ff1615611b895760405162461bcd60e51b815260206004820152601260248201527f636f6e7472616374206973206c6f636b656400000000000000000000000000006044820152606401610c31565b6040805180820190915282815260208082018390526021805460018101825560009190915282518051849360029093027f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b5700192611bea9284929101906143fb565b506020828101518051611c0392600185019201906143fb565b505050505050565b60006001600160a01b038216611c895760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c31565b506001600160a01b031660009081526003602052604090205490565b611cad613249565b6001600160a01b0316611cc8600d546001600160a01b031690565b6001600160a01b031614611d1e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d805473ffffffffffffffffffffffffffffffffffffffff19169055565b6040518060a0016040528060748152602001614fd46074913981565b611d99613249565b6001600160a01b0316611db4600d546001600160a01b031690565b6001600160a01b031614611e0a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b6014805460ff19166001179055565b60145460ff1615611e6c5760405162461bcd60e51b815260206004820152601260248201527f636f6e7472616374206973206c6f636b656400000000000000000000000000006044820152606401610c31565b3482601554611e7b9190614c35565b14611ec85760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e647300000000000000000000000000006044820152606401610c31565b601081604051611ed89190614bba565b9081526040519081900360200190205460ff1615611f385760405162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610c31565b601a5460085410611f8b5760405162461bcd60e51b815260206004820152601160248201527f616c6c20746f6b656e73206d696e7465640000000000000000000000000000006044820152606401610c31565b601a5482611f9860085490565b611fa29190614c07565b1115611ff05760405162461bcd60e51b815260206004820152601360248201527f65786365656420746f6b656e20737570706c79000000000000000000000000006044820152606401610c31565b60175482601b546120019190614c07565b111561204f5760405162461bcd60e51b815260206004820152601460248201527f657863656564207075626c696320737570706c790000000000000000000000006044820152606401610c31565b33600090815260116020526040902054839061206c908490614c07565b11156120ba5760405162461bcd60e51b815260206004820152601160248201527f65786365656420616c6c6f636174696f6e0000000000000000000000000000006044820152606401610c31565b6120c485856137a6565b6121105760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964207369676e65720000000000000000000000000000000000006044820152606401610c31565b61211d85338585856137d8565b6121695760405162461bcd60e51b815260206004820152600c60248201527f696e76616c6964206861736800000000000000000000000000000000000000006044820152606401610c31565b81601b600082825461217b9190614c07565b9091555050336000908152601160205260408120805484929061219f908490614c07565b9250508190555060016010826040516121b89190614bba565b908152604051908190036020019020805491151560ff1990921691909117905560005b82811015611c03576121ec336133ee565b6121f581614bec565b90506121db565b612204613249565b8461220f828261342d565b61221857600080fd5b8467ffffffffffffffff16600a1115801561223e575060648567ffffffffffffffff1611155b6122b05760405162461bcd60e51b815260206004820152602160248201527f696e76616c6964206375626573697a652c2031302d31303020616c6c6f77656460448201527f2e000000000000000000000000000000000000000000000000000000000000006064820152608401610c31565b8367ffffffffffffffff166005111580156122d6575060328467ffffffffffffffff1611155b6123225760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642073706565642c20352d353020616c6c6f7765642e000000006044820152606401610c31565b826fffffffffffffffffffffffffffffffff16600a11158015612358575060c8836fffffffffffffffffffffffffffffffff1611155b6123a45760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206f66667365742c2031302d32303020616c6c6f7765642e006044820152606401610c31565b6000868152602360209081526040808320805460ff1916600117905560249091529081902080546fffffffffffffffffffffffffffffffff8087167001000000000000000000000000000000000267ffffffffffffffff89811668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909416908b16179290921716178155905133917fd62e6c1961fbe8f87220b61031525490ea48d9f3060db66ae86f7ab8f8465a8e91612492918a82525467ffffffffffffffff8082166020840152604082811c90911690830152608090811c60608301520190565b60405180910390a2505050505050565b606060018054610b2890614b0f565b6124b9613249565b6001600160a01b03166124d4600d546001600160a01b031690565b6001600160a01b03161461252a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b601e805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b612561613249565b6001600160a01b0316826001600160a01b031614156125c25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c31565b80600560006125cf613249565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155612613613249565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161264f911515815260200190565b60405180910390a35050565b612663613249565b6001600160a01b031661267e600d546001600160a01b031690565b6001600160a01b0316146126d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b601f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60008181526002602052604081205482906001600160a01b03166127695760405162461bcd60e51b815260206004820152600d60248201527f696e76616c696420746f6b656e000000000000000000000000000000000000006044820152606401610c31565b50506000908152600f602052604090205490565b6021818154811061278d57600080fd5b90600052602060002090600202016000915090508060000180546127b090614b0f565b80601f01602080910402602001604051908101604052809291908181526020018280546127dc90614b0f565b80156128295780601f106127fe57610100808354040283529160200191612829565b820191906000526020600020905b81548152906001019060200180831161280c57829003601f168201915b50505050509080600101805461283e90614b0f565b80601f016020809104026020016040519081016040528092919081815260200182805461286a90614b0f565b80156128b75780601f1061288c576101008083540402835291602001916128b7565b820191906000526020600020905b81548152906001019060200180831161289a57829003601f168201915b5050505050905082565b6128d26128cc613249565b8361342d565b6129445760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c31565b6129508484848461385d565b50505050565b6060612960612b42565b612969836138e6565b60405160200161297a929190614c54565b6040516020818303038152906040529050919050565b612998613249565b6001600160a01b03166129b3600d546001600160a01b031690565b6001600160a01b031614612a095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b60145460ff1615612a5c5760405162461bcd60e51b815260206004820152601260248201527f636f6e7472616374206973206c6f636b656400000000000000000000000000006044820152606401610c31565b6021548110612a6a57600080fd5b60218054612a7a90600190614cd6565b81548110612a8a57612a8a614c1f565b906000526020600020906002020160218281548110612aab57612aab614c1f565b90600052602060002090600202016000820181600001908054612acd90614b0f565b612ad892919061447f565b506001820181600101908054612aed90614b0f565b612af892919061447f565b509050506021805480612b0d57612b0d614ced565b60008281526020812060001990920191600283020190612b2d82826144fa565b612b3b6001830160006144fa565b5050905550565b60606022612b5060056138e6565b604051602001612b61929190614d9d565b604051602081830303815290604052905090565b612b7d613249565b6001600160a01b0316612b98600d546001600160a01b031690565b6001600160a01b031614612bee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b601480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b612c24613249565b6001600160a01b0316612c3f600d546001600160a01b031690565b6001600160a01b031614612c955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b60145460ff1615612ce85760405162461bcd60e51b815260206004820152601260248201527f636f6e7472616374206973206c6f636b656400000000000000000000000000006044820152606401610c31565b8051612cfa90602090818401906143fb565b5050565b60606022612d0c60056138e6565b604051602001612b61929190614e15565b600e546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015612d8357600080fd5b505afa158015612d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dbb9190614e8d565b6001600160a01b03161415612dd4576001915050610b13565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b612e0e613249565b6001600160a01b0316612e29600d546001600160a01b031690565b6001600160a01b031614612e7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b6001600160a01b038116612efb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c31565b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b612f6c613249565b6001600160a01b0316612f87600d546001600160a01b031690565b6001600160a01b031614612fdd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c31565b6000811161302d5760405162461bcd60e51b815260206004820152600c60248201527f616d6f756e7420656d70747900000000000000000000000000000000000000006044820152606401610c31565b4781111561307d5760405162461bcd60e51b815260206004820152601660248201527f616d6f756e7420657863656564732062616c616e6365000000000000000000006044820152606401610c31565b6001600160a01b0382166130d35760405162461bcd60e51b815260206004820152600c60248201527f61646472657373206e756c6c00000000000000000000000000000000000000006044820152606401610c31565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610d95573d6000803e3d6000fd5b60003330141561316057600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506131639050565b50335b90565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806131f957507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b1357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610b13565b6000613253613109565b905090565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416908117909155819061329a82611a32565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166133515760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201527f49474e45520000000000000000000000000000000000000000000000000000006064820152608401610c31565b600161336461335f87613a18565b613a95565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156133b2573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006133e78284614c07565b9392505050565b60006133f960085490565b613404906001614c07565b90506134108282613ae0565b61341a8282613afa565b6000918252600f60205260409091205550565b6000818152600260205260408120546001600160a01b03166134b75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c31565b60006134c283611a32565b9050806001600160a01b0316846001600160a01b031614806134fd5750836001600160a01b03166134f284610bab565b6001600160a01b0316145b80612dfe5750612dfe8185612d1d565b826001600160a01b031661352082611a32565b6001600160a01b03161461359c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610c31565b6001600160a01b0382166136175760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c31565b613622838383613b86565b61362d600082613258565b6001600160a01b0383166000908152600360205260408120805460019290613656908490614cd6565b90915550506001600160a01b0382166000908152600360205260408120805460019290613684908490614c07565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006136fd82611a32565b905061370b81600084613b86565b613716600083613258565b6001600160a01b038116600090815260036020526040812080546001929061373f908490614cd6565b9091555050600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600073da9f95f43d4189285fa618df89f66d9666e806946137c78484613c3e565b6001600160a01b0316149392505050565b600085858585856040516020016137f29493929190614eaa565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c016040516020818303038152906040528051906020012014905095945050505050565b61386884848461350d565b61387484848484613d0d565b6129505760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c31565b60608161392657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613950578061393a81614bec565b91506139499050600a83614f19565b915061392a565b60008167ffffffffffffffff81111561396b5761396b614655565b6040519080825280601f01601f191660200182016040528015613995576020820181803683370190505b5090505b8415612dfe576139aa600183614cd6565b91506139b7600a86614f2d565b6139c2906030614c07565b60f81b8183815181106139d7576139d7614c1f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613a11600a86614f19565b9450613999565b6000604051806080016040528060438152602001614f916043913980516020918201208351848301516040808701518051908601209051613a78950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000613aa0600b5490565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201613a78565b612cfa828260405180602001604052806000815250613ea8565b600080613b08600143614cd6565b60135460408051924060208401527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000033606090811b82169285019290925260548401929092526074830186905286901b16609482015260a80160408051808303601f1901815291905280516020909101206013819055949350505050565b6001600160a01b038316613be157613bdc81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613c04565b816001600160a01b0316836001600160a01b031614613c0457613c048382613f31565b6001600160a01b038216613c1b57610d9581613fce565b826001600160a01b0316826001600160a01b031614610d9557610d95828261407d565b600080600080845160411415613c685750505060208201516040830151606084015160001a613cf7565b845160401415613caf5750505060408201516020830151907f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81169060ff1c601b01613cf7565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c31565b613d03868285856140c1565b9695505050505050565b60006001600160a01b0384163b15613e9d57836001600160a01b031663150b7a02613d36613249565b8786866040518563ffffffff1660e01b8152600401613d589493929190614f41565b602060405180830381600087803b158015613d7257600080fd5b505af1925050508015613da2575060408051601f3d908101601f19168201909252613d9f91810190614f73565b60015b613e52573d808015613dd0576040519150601f19603f3d011682016040523d82523d6000602084013e613dd5565b606091505b508051613e4a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c31565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612dfe565b506001949350505050565b613eb283836142a0565b613ebf6000848484613d0d565b610d955760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c31565b60006001613f3e84611c0b565b613f489190614cd6565b600083815260076020526040902054909150808214613f9b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613fe090600190614cd6565b6000838152600960205260408120546008805493945090928490811061400857614008614c1f565b90600052602060002001549050806008838154811061402957614029614c1f565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061406157614061614ced565b6001900381819060005260206000200160009055905550505050565b600061408883611c0b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156141595760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610c31565b8360ff16601b148061416e57508360ff16601c145b6141e05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610c31565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015614234573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166142975760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610c31565b95945050505050565b6001600160a01b0382166142f65760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c31565b6000818152600260205260409020546001600160a01b03161561435b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c31565b61436760008383613b86565b6001600160a01b0382166000908152600360205260408120805460019290614390908490614c07565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461440790614b0f565b90600052602060002090601f016020900481019282614429576000855561446f565b82601f1061444257805160ff191683800117855561446f565b8280016001018555821561446f579182015b8281111561446f578251825591602001919060010190614454565b5061447b929150614530565b5090565b82805461448b90614b0f565b90600052602060002090601f0160209004810192826144ad576000855561446f565b82601f106144be578054855561446f565b8280016001018555821561446f57600052602060002091601f016020900482015b8281111561446f5782548255916001019190600101906144df565b50805461450690614b0f565b6000825580601f10614516575050565b601f01602090049060005260206000209081019061181291905b5b8082111561447b5760008155600101614531565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461181257600080fd5b60006020828403121561458557600080fd5b81356133e781614545565b60005b838110156145ab578181015183820152602001614593565b838111156129505750506000910152565b600081518084526145d4816020860160208601614590565b601f01601f19169290920160200192915050565b6020815260006133e760208301846145bc565b60006020828403121561460d57600080fd5b5035919050565b6001600160a01b038116811461181257600080fd5b6000806040838503121561463c57600080fd5b823561464781614614565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261467c57600080fd5b813567ffffffffffffffff8082111561469757614697614655565b604051601f8301601f19908116603f011681019082821181831017156146bf576146bf614655565b816040528381528660208588010111156146d857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a0868803121561471057600080fd5b853561471b81614614565b9450602086013567ffffffffffffffff81111561473757600080fd5b6147438882890161466b565b9450506040860135925060608601359150608086013560ff8116811461476857600080fd5b809150509295509295909350565b60008060006060848603121561478b57600080fd5b833561479681614614565b925060208401356147a681614614565b929592945050506040919091013590565b6000602082840312156147c957600080fd5b81356133e781614614565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015614869577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151805187855261483d888601826145bc565b91890151858303868b015291905061485581836145bc565b9689019694505050908601906001016147fb565b509098975050505050505050565b6000806040838503121561488a57600080fd5b823567ffffffffffffffff808211156148a257600080fd5b6148ae8683870161466b565b935060208501359150808211156148c457600080fd5b506148d18582860161466b565b9150509250929050565b600080600080600060a086880312156148f357600080fd5b85359450602086013567ffffffffffffffff8082111561491257600080fd5b61491e89838a0161466b565b95506040880135945060608801359350608088013591508082111561494257600080fd5b5061494f8882890161466b565b9150509295509295909350565b803567ffffffffffffffff8116811461497457600080fd5b919050565b6000806000806080858703121561498f57600080fd5b8435935061499f6020860161495c565b92506149ad6040860161495c565b915060608501356fffffffffffffffffffffffffffffffff811681146149d257600080fd5b939692955090935050565b600080604083850312156149f057600080fd5b82356149fb81614614565b915060208301358015158114614a1057600080fd5b809150509250929050565b604081526000614a2e60408301856145bc565b828103602084015261429781856145bc565b60008060008060808587031215614a5657600080fd5b8435614a6181614614565b93506020850135614a7181614614565b925060408501359150606085013567ffffffffffffffff811115614a9457600080fd5b614aa08782880161466b565b91505092959194509250565b600060208284031215614abe57600080fd5b813567ffffffffffffffff811115614ad557600080fd5b612dfe8482850161466b565b60008060408385031215614af457600080fd5b8235614aff81614614565b91506020830135614a1081614614565b600181811c90821680614b2357607f821691505b6020821081141561168757634e487b7160e01b600052602260045260246000fd5b60006001600160a01b0380861683528085166020840152506060604083015261429760608301846145bc565b60008351614b82818460208801614590565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b60008251614bcc818460208701614590565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415614c0057614c00614bd6565b5060010190565b60008219821115614c1a57614c1a614bd6565b500190565b634e487b7160e01b600052603260045260246000fd5b6000816000190483118215151615614c4f57614c4f614bd6565b500290565b60008351614c66818460208801614590565b7f2f000000000000000000000000000000000000000000000000000000000000009083019081528351614ca0816001840160208801614590565b7f2f6d65746100000000000000000000000000000000000000000000000000000060019290910191820152600601949350505050565b600082821015614ce857614ce8614bd6565b500390565b634e487b7160e01b600052603160045260246000fd5b8054600090600181811c9080831680614d1d57607f831692505b6020808410821415614d3f57634e487b7160e01b600052602260045260246000fd5b818015614d535760018114614d6457614d91565b60ff19861689528489019650614d91565b60008881526020902060005b86811015614d895781548b820152908501908301614d70565b505084890196505b50505050505092915050565b6000614da98285614d03565b7f2f6170692f70726f6a6563742f0000000000000000000000000000000000000081528351614ddf81600d840160208801614590565b7f2f746f6b656e0000000000000000000000000000000000000000000000000000600d9290910191820152601301949350505050565b6000614e218285614d03565b7f2f6170692f70726f6a6563742f0000000000000000000000000000000000000081528351614e5781600d840160208801614590565b7f2f636f6e74726163740000000000000000000000000000000000000000000000600d9290910191820152601601949350505050565b600060208284031215614e9f57600080fd5b81516133e781614614565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008560601b16815283601482015282603482015260008251614ef3816054850160208701614590565b9190910160540195945050505050565b634e487b7160e01b600052601260045260246000fd5b600082614f2857614f28614f03565b500490565b600082614f3c57614f3c614f03565b500690565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613d0360808301846145bc565b600060208284031215614f8557600080fd5b81516133e78161454556fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e61747572652941206469676974616c206162737472616374696f6e206f662074686520496b6562616e6120617274277320717565737420666f72206861726d6f6e792c2062616c616e636520616e642067726163652e2044616e63696e6720666f726576657220696e20686f6e6f72206f66206265617574792ea2646970667358221220cb72a63d5f48b22ea5733189dee5ef0b4ad5cac2779078b4c1cd1072712b53bc64736f6c63430008090033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000001860000000000000000000000000000000000000000000000000000000000000079e00000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019d7b49f8181bae3ddfce8160a049e526bb5bc6e6497e92ddddc3bd8a01c6bf4fd000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001070352d76312e342e302e6d696e2e6a7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e516d65596b4435614c386465395a4778567244484e316a773267704a654d7a574e3848767152577237554e444c53000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164c636f6e7374207536343d613d3e426967496e742e617355696e744e2836342c61292c726f746c3d28612c62293d3e75363428613c3c627c613e3e36346e2d62292c786f736869726f3235367374727374723d613d3e28293d3e7b636f6e737420623d75363428396e2a726f746c2875363428356e2a615b315d292c376e29293b6c657420633d75363428615b315d3c3c31376e293b72657475726e20615b325d5e3d615b305d2c615b335d5e3d615b315d2c615b315d5e3d615b325d2c615b305d5e3d615b335d2c615b325d5e3d632c615b335d3d726f746c28615b335d2c34356e292c627d2c72616e646f6d446563696d616c3d613d3e28293d3e7b636f6e737420623d6128293b72657475726e204e756d626572286225393030373139393235343734303939316e292f393030373139393235343734303939317d2c72616e646f6d4e756d6265723d633d3e28642c61293d3e642b28612d64292a6328292c72616e646f6d496e743d633d3e28642c61293d3e4d6174682e666c6f6f72286328642c612b3129292c6d6b52616e646f6d3d613d3e7b636f6e737420623d41727261792834292e66696c6c28292e6d61702828612c62293d3e31362a622b32292e6d617028623d3e75363428603078247b612e736c69636528622c622b3136297d6029292c633d786f736869726f3235367374727374722862292c643d72616e646f6d446563696d616c2863292c653d72616e646f6d4e756d6265722864292c663d72616e646f6d496e742865293b72657475726e7b723a642c726e3a652c72693a667d7d2c73687566666c653d28612c62293d3e7b76617220633d4d6174682e666c6f6f723b666f72286c657420642c652c663d612e6c656e6774683b663b29653d63286228292a662d2d292c643d615b665d2c615b665d3d615b655d2c615b655d3d643b72657475726e20617d2c7265706561743d28612c62293d3e41727261792e66726f6d287b6c656e6774683a627d292e6d61702828293d3e61292c73656c65637452616e646f6d3d28612c62293d3e615b4d6174682e666c6f6f72286228292a612e6c656e677468295d2c73656c65637452616e646f6d446973743d28622c63293d3e7b636f6e737420613d4f626a6563742e6b6579732862292e7265647563652828632c61293d3e632e636f6e6361742872657065617428612c3130302a625b615d29292c5b5d293b72657475726e2073656c65637452616e646f6d2873687566666c6528612c63292c63297d2c746f4865783d613d3e612e746f537472696e67283136292e706164537461727428322c223022292c66726f6d4865783d613d3e7061727365496e7428612c3136292c72616e646f6d436f6c6f724865783d613d3e7b636f6e737420623d28293d3e746f486578284d6174682e666c6f6f72283235362a61282929292c633d6228292c643d6228292c653d6228293b72657475726e6023247b637d247b647d247b657d607d2c636f6c446973743d7b303a2e312c313a2e312c323a2e312c333a2e30352c343a2e30342c353a2e3032352c363a2e30352c373a2e312c383a2e312c393a2e312c31303a2e30352c31313a2e312c31323a2e30352c31333a2e3032352c31343a2e30317d2c73796d446973743d7b333a2e30362c343a2e30352c353a2e30322c363a2e312c373a2e31322c383a2e31352c393a2e31352c31303a2e31352c31313a2e31352c31323a2e30357d2c737072656164446973743d7b303a2e30352c313a2e31352c323a2e332c333a2e31352c343a2e31352c353a2e312c363a2e317d2c6375626573446973743d7b34303a2e312c35303a2e322c36303a2e32352c37303a2e332c38303a2e312c39303a2e30357d2c68617368546f5472616974733d613d3e7b636f6e737420623d6d6b52616e646f6d2861292c633d622e7269283230302c343030292c643d622e7269283230302c343030292c653d622e7269283230302c353030292c663d622e726928312c34292c673d622e726928312c34292c683d622e726928312c34292c693d622e726928312c34292c6a3d7061727365496e742873656c65637452616e646f6d446973742873796d446973742c622e7229292c6b3d7061727365496e742873656c65637452616e646f6d4469737428737072656164446973742c622e7229292c6c3d7061727365496e742873656c65637452616e646f6d4469737428636f6c446973742c622e7229292c6d3d7061727365496e742873656c65637452616e646f6d44697374286375626573446973742c622e7229293b72657475726e7b73697a65783a632c73697a65793a642c73697a657a3a652c636f73783a662c73696e783a672c636f73793a682c73696e793a692c637562656e756d3a6d2c73796d6d657472793a6a2c7370726561643a6b2c636f6c7365743a6c7d7d3b6c65742077656972646b2c6c61737470696e63682c74696d656f75742c72656e64657265722c616e673d302c73697a3d36302c6b73706565643d2e332c6b6f66663d3830302c63756d756c3d302c70696e6368696e673d21312c70696e6368646973743d302c746f7a3d323830302c7a733d35302c636f66783d312c636f66793d312c636f667a3d312c70726576526f743d5b312c302c302c305d2c63757272526f743d5b312c302c302c305d2c636f6c734172723d5b5b2223393235653738222c2223626439336264222c2223663265646562222c2223663035333635222c2223666162633261225d2c5b2223323563656431222c2223666666666666222c2223666365616465222c2223666638613562222c2223656135323666225d2c5b2223626662646331222c2223366436613735222c2223333733323365222c2223646562383431222c2223646539653336225d2c5b2223433946424646222c2223333734433643222c2223363837434131222c2223376434653537222c2223453038433742225d2c5b2223346334346366222c2223653935336461222c2223663563316630222c2223316538636230222c2223313432663438225d2c5b2223303333663633222c2223323836363665222c2223376339383835222c2223623562363832222c2223666564633937225d2c5b2223386563616536222c2223323139656263222c2223303233303437222c2223666662373033222c2223666238353030225d2c5b2223663466316465222c2223653037613566222c2223336434303562222c2223383162323961222c2223663263633866225d2c5b2223443136363636222c2223326634353530222c2223353836663763222c2223623864626439222c2223663466346639225d2c5b2223336433343862222c2223373637386564222c2223663762383031222c2223444244424641222c2223663335623034225d2c5b2223464345394545222c2223463843384435222c2223423634433632222c2223364131333145222c2223463441453634225d2c5b2223306433623636222c2223666166306361222c2223663464333565222c2223656539363462222c2223663935373338225d2c5b2223666661663837222c2223464643454332222c2223656436613565222c2223346365306233222c2223333737373731225d2c5b2223353630336164222c2223383336376337222c2223623365396337222c2223633266386362222c2223663066666631225d2c5b2223303030303030222c2223324332633263222c2223434343434343222c2223336133613361222c2223383830303030225d5d2c62674172723d5b2223334432393239222c2223313632363265222c2223303030303030222c2223313131353163222c2223313632363265222c2223303231323039222c2223313831313134222c2223313031393135222c2223313030353035222c2223304430423145222c2223323631413141222c2223314531443230222c2223313632363265222c2223314530313343222c2223464646464646225d3b636f6e737420637075506f733d28622c63293d3e7b76617220643d4d6174682e73696e2c653d4d6174682e636f733b6c657420663d5b5d3b666f72286c657420673d303b673c622e6c656e6774683b672b2b297b6c657420683d625b675d2b635b345d2c613d635b305d2a28322b6528636f73782a6829292a652873696e782a68293b612a3d303d3d635b335d3f313a635b335d2a652868292f642868293b6c657420693d635b315d2a28322b6528636f73792a6829292a642873696e792a68292c6a3d635b325d2a6428322a68293b662e70757368285b612c692c6a5d297d72657475726e20667d2c637075526f743d28612c62293d3e7b6c657420633d5b5d3b666f72286c657420653d303b653c612e6c656e6774683b652b2b297b6c657420663d5b625b655d5b305d2d615b655d5b305d2c625b655d5b315d2d615b655d5b315d2c625b655d5b325d2d615b655d5b325d5d2c643d4d6174682e7371727428665b305d2a665b305d2b665b315d2a665b315d2b665b325d2a665b325d293b665b305d2f3d642c665b315d2f3d642c665b325d2f3d643b6c657420673d4d6174682e6173696e282d665b315d293b2e34393c665b305d26262e353e665b305d3f665b305d3d2e353a2d2e34393e665b305d26262d2e353c665b305d262628665b305d3d2d2e35293b6c657420683d4d6174682e6174616e3228665b305d2c665b325d293b632e70757368285b672c685d297d72657475726e20637d3b6c65742073697a65782c73697a65792c73697a657a2c636f73782c73696e782c636f73792c73696e792c637562656e756d2c73796d6d657472792c7370726561642c636f6c7365743b66756e6374696f6e2061737369676e54726169747328297b6c657420613d68617368546f54726169747328746f6b656e446174612e68617368293b73697a65783d612e73697a65782c73697a65793d612e73697a65792c73697a657a3d612e73697a657a2c636f73783d612e636f73782c73696e783d612e73696e782c636f73793d612e636f73792c73696e793d612e73696e792c637562656e756d3d612e637562656e756d2c73796d6d657472793d612e73796d6d657472792c7370726561643d612e7370726561642c636f6c7365743d612e636f6c7365742c77656972646b3d7370726561642f327d66756e6374696f6e2070646973742861297b72657475726e204d6174682e6879706f7428612e746f75636865735b305d2e70616765582d612e746f75636865735b315d2e70616765582c612e746f75636865735b305d2e70616765592d612e746f75636865735b315d2e7061676559297d66756e6374696f6e20776865656c2861297b76617220623d612e776865656c44656c74613b7a6f6f6d2862297d66756e6374696f6e207a6f6f6d2861297b313830303e3d746f7a2626303e617c7c343230303c3d746f7a2626303c617c7c28746f7a2b3d61297d66756e6374696f6e20746f75636873746172742861297b323d3d3d612e746f75636865732e6c656e67746826262870696e6368696e673d21302c70696e6368646973743d7064697374286129297d66756e6374696f6e20746f7563686d6f76652861297b69662870696e6368696e67297b6966286c61737470696e63683d70696e6368646973742c70696e6368646973743d70646973742861292c303d3d70696e6368646973747c7c303d3d6c61737470696e63682972657475726e3b63756d756c2b3d2d2870696e6368646973742d6c61737470696e6368297d7d66756e6374696f6e20746f756368656e6428297b70696e6368696e673d21312c6c61737470696e63683d302c70696e6368646973743d302c63756d756c3d307d66756e6374696f6e20736574757028297b61737369676e54726169747328292c70352e64697361626c65467269656e646c794572726f72733d21303b636f6e737420613d77696e646f772e696e6e657257696474682c623d77696e646f772e696e6e65724865696768743b616e676c654d6f64652844454752454553292c72656e64657265723d63726561746543616e76617328612c622c574542474c292c72656e64657265722e6d6f757365576865656c28776865656c292c72656e64657265722e746f7563685374617274656428746f7563687374617274292c72656e64657265722e746f7563684d6f76656428746f7563686d6f7665292c72656e64657265722e746f756368456e64656428746f756368656e64292c6e6f5374726f6b6528297d636f6e737420636f6d7075746553697a653d613d3e7b6c657420623d6d61702873696e2861292c2d312c312c302c73697a292c633d6d617028636f732861292c2d312c312c302c73697a292c643d6d61702873696e2861292c2d312c312c302c73697a293b72657475726e20637265617465566563746f7228622c632c64297d3b66756e6374696f6e206472617728297b63616d65726128302c302c746f7a292c6b73706565643d746f6b656e53746174652e73706565642f3130302c6b6f66663d746f6b656e53746174652e6f66667365742c73697a3d746f6b656e53746174652e6375626573697a652c616d6269656e744c69676874283136382c3136382c313638292c646972656374696f6e616c4c69676874283132382c3132382c3132382c302c302c2d31292c6261636b67726f756e642862674172725b636f6c7365745d293b6c657420613d77656972646b3f6b73706565642f323a6b73706565642c623d302c633d303b726f746174655a28616e67293b6c657420643d5b5d3b636f66783d73697a65782b6b6f66662a61627328636f7328322a616e6729292c636f66793d73697a65792b6b6f66662a6162732873696e28322a616e6729293b6c657420653d5b636f66782c636f66792c73697a657a2c77656972646b2c305d2c663d5b636f66782c636f66792c73697a657a2c77656972646b2c2e30315d3b666f72286c657420613d303b3336303e613b612b3d3336302f637562656e756d29642e707573682872616469616e7328616e672b6129293b6c657420673d637075506f7328642c65292c683d637075506f7328642c66292c693d637075526f7428672c68293b666f72283b3336303e3d623b297b7075736828292c726f746174655a2862293b6c657420613d302c643d303b666f72283b643c637562656e756d3b297b7075736828292c7472616e736c61746528675b645d5b305d2c675b645d5b315d2c675b645d5b325d292c726f7461746559286465677265657328695b645d5b315d29292c726f7461746558286465677265657328695b645d5b305d29293b6c657420623d636f6c734172725b636f6c7365745d2c633d696e74286d617028612c302c3336302c302c637562656e756d292925622e6c656e6774683b633e622e6c656e6774682d31262628633d622e6c656e6774682d31292c66696c6c28625b635d293b6c657420653d636f6d7075746553697a6528612b616e67293b626f7828652e782c652e792c652e7a292c706f7028292c612b3d3336302f637562656e756d2c642b2b7d622b3d3336302f73796d6d657472792c632b3d6b6f66662c706f7028297d696628616e672b3d612c3336303c3d616e67262628616e673d30292c30213d63756d756c29696628303c63756d756c297b6c657420613d63756d756c3c7a733f63756d756c3a7a733b7a6f6f6d2861292c63756d756c2b3d617d656c736520696628303e63756d756c297b6c657420613d63756d756c3e2d7a733f63756d756c3a2d7a733b7a6f6f6d2861292c63756d756c2b3d617d7d66756e6374696f6e2077696e646f77526573697a656428297b726573697a6543616e7661732877696e646f7757696474682c77696e646f77486569676874297d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001768747470733a2f2f67656e65746963636861696e2e696f000000000000000000

-----Decoded View---------------
Arg [0] : lib (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [1] : code_ (string): const u64=a=>BigInt.asUintN(64,a),rotl=(a,b)=>u64(a<<b|a>>64n-b),xoshiro256strstr=a=>()=>{const b=u64(9n*rotl(u64(5n*a[1]),7n));let c=u64(a[1]<<17n);return a[2]^=a[0],a[3]^=a[1],a[1]^=a[2],a[0]^=a[3],a[2]^=c,a[3]=rotl(a[3],45n),b},randomDecimal=a=>()=>{const b=a();return Number(b%9007199254740991n)/9007199254740991},randomNumber=c=>(d,a)=>d+(a-d)*c(),randomInt=c=>(d,a)=>Math.floor(c(d,a+1)),mkRandom=a=>{const b=Array(4).fill().map((a,b)=>16*b+2).map(b=>u64(`0x${a.slice(b,b+16)}`)),c=xoshiro256strstr(b),d=randomDecimal(c),e=randomNumber(d),f=randomInt(e);return{r:d,rn:e,ri:f}},shuffle=(a,b)=>{var c=Math.floor;for(let d,e,f=a.length;f;)e=c(b()*f--),d=a[f],a[f]=a[e],a[e]=d;return a},repeat=(a,b)=>Array.from({length:b}).map(()=>a),selectRandom=(a,b)=>a[Math.floor(b()*a.length)],selectRandomDist=(b,c)=>{const a=Object.keys(b).reduce((c,a)=>c.concat(repeat(a,100*b[a])),[]);return selectRandom(shuffle(a,c),c)},toHex=a=>a.toString(16).padStart(2,"0"),fromHex=a=>parseInt(a,16),randomColorHex=a=>{const b=()=>toHex(Math.floor(256*a())),c=b(),d=b(),e=b();return`#${c}${d}${e}`},colDist={0:.1,1:.1,2:.1,3:.05,4:.04,5:.025,6:.05,7:.1,8:.1,9:.1,10:.05,11:.1,12:.05,13:.025,14:.01},symDist={3:.06,4:.05,5:.02,6:.1,7:.12,8:.15,9:.15,10:.15,11:.15,12:.05},spreadDist={0:.05,1:.15,2:.3,3:.15,4:.15,5:.1,6:.1},cubesDist={40:.1,50:.2,60:.25,70:.3,80:.1,90:.05},hashToTraits=a=>{const b=mkRandom(a),c=b.ri(200,400),d=b.ri(200,400),e=b.ri(200,500),f=b.ri(1,4),g=b.ri(1,4),h=b.ri(1,4),i=b.ri(1,4),j=parseInt(selectRandomDist(symDist,b.r)),k=parseInt(selectRandomDist(spreadDist,b.r)),l=parseInt(selectRandomDist(colDist,b.r)),m=parseInt(selectRandomDist(cubesDist,b.r));return{sizex:c,sizey:d,sizez:e,cosx:f,sinx:g,cosy:h,siny:i,cubenum:m,symmetry:j,spread:k,colset:l}};let weirdk,lastpinch,timeout,renderer,ang=0,siz=60,kspeed=.3,koff=800,cumul=0,pinching=!1,pinchdist=0,toz=2800,zs=50,cofx=1,cofy=1,cofz=1,prevRot=[1,0,0,0],currRot=[1,0,0,0],colsArr=[["#925e78","#bd93bd","#f2edeb","#f05365","#fabc2a"],["#25ced1","#ffffff","#fceade","#ff8a5b","#ea526f"],["#bfbdc1","#6d6a75","#37323e","#deb841","#de9e36"],["#C9FBFF","#374C6C","#687CA1","#7d4e57","#E08C7B"],["#4c44cf","#e953da","#f5c1f0","#1e8cb0","#142f48"],["#033f63","#28666e","#7c9885","#b5b682","#fedc97"],["#8ecae6","#219ebc","#023047","#ffb703","#fb8500"],["#f4f1de","#e07a5f","#3d405b","#81b29a","#f2cc8f"],["#D16666","#2f4550","#586f7c","#b8dbd9","#f4f4f9"],["#3d348b","#7678ed","#f7b801","#DBDBFA","#f35b04"],["#FCE9EE","#F8C8D5","#B64C62","#6A131E","#F4AE64"],["#0d3b66","#faf0ca","#f4d35e","#ee964b","#f95738"],["#ffaf87","#FFCEC2","#ed6a5e","#4ce0b3","#377771"],["#5603ad","#8367c7","#b3e9c7","#c2f8cb","#f0fff1"],["#000000","#2C2c2c","#CCCCCC","#3a3a3a","#880000"]],bgArr=["#3D2929","#16262e","#000000","#11151c","#16262e","#021209","#181114","#101915","#100505","#0D0B1E","#261A1A","#1E1D20","#16262e","#1E013C","#FFFFFF"];const cpuPos=(b,c)=>{var d=Math.sin,e=Math.cos;let f=[];for(let g=0;g<b.length;g++){let h=b[g]+c[4],a=c[0]*(2+e(cosx*h))*e(sinx*h);a*=0==c[3]?1:c[3]*e(h)/d(h);let i=c[1]*(2+e(cosy*h))*d(siny*h),j=c[2]*d(2*h);f.push([a,i,j])}return f},cpuRot=(a,b)=>{let c=[];for(let e=0;e<a.length;e++){let f=[b[e][0]-a[e][0],b[e][1]-a[e][1],b[e][2]-a[e][2]],d=Math.sqrt(f[0]*f[0]+f[1]*f[1]+f[2]*f[2]);f[0]/=d,f[1]/=d,f[2]/=d;let g=Math.asin(-f[1]);.49<f[0]&&.5>f[0]?f[0]=.5:-.49>f[0]&&-.5<f[0]&&(f[0]=-.5);let h=Math.atan2(f[0],f[2]);c.push([g,h])}return c};let sizex,sizey,sizez,cosx,sinx,cosy,siny,cubenum,symmetry,spread,colset;function assignTraits(){let a=hashToTraits(tokenData.hash);sizex=a.sizex,sizey=a.sizey,sizez=a.sizez,cosx=a.cosx,sinx=a.sinx,cosy=a.cosy,siny=a.siny,cubenum=a.cubenum,symmetry=a.symmetry,spread=a.spread,colset=a.colset,weirdk=spread/2}function pdist(a){return Math.hypot(a.touches[0].pageX-a.touches[1].pageX,a.touches[0].pageY-a.touches[1].pageY)}function wheel(a){var b=a.wheelDelta;zoom(b)}function zoom(a){1800>=toz&&0>a||4200<=toz&&0<a||(toz+=a)}function touchstart(a){2===a.touches.length&&(pinching=!0,pinchdist=pdist(a))}function touchmove(a){if(pinching){if(lastpinch=pinchdist,pinchdist=pdist(a),0==pinchdist||0==lastpinch)return;cumul+=-(pinchdist-lastpinch)}}function touchend(){pinching=!1,lastpinch=0,pinchdist=0,cumul=0}function setup(){assignTraits(),p5.disableFriendlyErrors=!0;const a=window.innerWidth,b=window.innerHeight;angleMode(DEGREES),renderer=createCanvas(a,b,WEBGL),renderer.mouseWheel(wheel),renderer.touchStarted(touchstart),renderer.touchMoved(touchmove),renderer.touchEnded(touchend),noStroke()}const computeSize=a=>{let b=map(sin(a),-1,1,0,siz),c=map(cos(a),-1,1,0,siz),d=map(sin(a),-1,1,0,siz);return createVector(b,c,d)};function draw(){camera(0,0,toz),kspeed=tokenState.speed/100,koff=tokenState.offset,siz=tokenState.cubesize,ambientLight(168,168,168),directionalLight(128,128,128,0,0,-1),background(bgArr[colset]);let a=weirdk?kspeed/2:kspeed,b=0,c=0;rotateZ(ang);let d=[];cofx=sizex+koff*abs(cos(2*ang)),cofy=sizey+koff*abs(sin(2*ang));let e=[cofx,cofy,sizez,weirdk,0],f=[cofx,cofy,sizez,weirdk,.01];for(let a=0;360>a;a+=360/cubenum)d.push(radians(ang+a));let g=cpuPos(d,e),h=cpuPos(d,f),i=cpuRot(g,h);for(;360>=b;){push(),rotateZ(b);let a=0,d=0;for(;d<cubenum;){push(),translate(g[d][0],g[d][1],g[d][2]),rotateY(degrees(i[d][1])),rotateX(degrees(i[d][0]));let b=colsArr[colset],c=int(map(a,0,360,0,cubenum))%b.length;c>b.length-1&&(c=b.length-1),fill(b[c]);let e=computeSize(a+ang);box(e.x,e.y,e.z),pop(),a+=360/cubenum,d++}b+=360/symmetry,c+=koff,pop()}if(ang+=a,360<=ang&&(ang=0),0!=cumul)if(0<cumul){let a=cumul<zs?cumul:zs;zoom(a),cumul+=a}else if(0>cumul){let a=cumul>-zs?cumul:-zs;zoom(a),cumul+=a}}function windowResized(){resizeCanvas(windowWidth,windowHeight)}
Arg [2] : baseUri (string): https://geneticchain.io
Arg [3] : tokenMax (uint256[3]): 1950,25,25
Arg [4] : seed (uint256): 97566395786226810197200518557424060934844991221482948725813309602003573011709
Arg [5] : proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
197 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001860
Arg [3] : 000000000000000000000000000000000000000000000000000000000000079e
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [6] : d7b49f8181bae3ddfce8160a049e526bb5bc6e6497e92ddddc3bd8a01c6bf4fd
Arg [7] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [11] : 70352d76312e342e302e6d696e2e6a7300000000000000000000000000000000
Arg [12] : 000000000000000000000000000000000000000000000000000000000000002e
Arg [13] : 516d65596b4435614c386465395a4778567244484e316a773267704a654d7a57
Arg [14] : 4e3848767152577237554e444c53000000000000000000000000000000000000
Arg [15] : 000000000000000000000000000000000000000000000000000000000000164c
Arg [16] : 636f6e7374207536343d613d3e426967496e742e617355696e744e2836342c61
Arg [17] : 292c726f746c3d28612c62293d3e75363428613c3c627c613e3e36346e2d6229
Arg [18] : 2c786f736869726f3235367374727374723d613d3e28293d3e7b636f6e737420
Arg [19] : 623d75363428396e2a726f746c2875363428356e2a615b315d292c376e29293b
Arg [20] : 6c657420633d75363428615b315d3c3c31376e293b72657475726e20615b325d
Arg [21] : 5e3d615b305d2c615b335d5e3d615b315d2c615b315d5e3d615b325d2c615b30
Arg [22] : 5d5e3d615b335d2c615b325d5e3d632c615b335d3d726f746c28615b335d2c34
Arg [23] : 356e292c627d2c72616e646f6d446563696d616c3d613d3e28293d3e7b636f6e
Arg [24] : 737420623d6128293b72657475726e204e756d62657228622539303037313939
Arg [25] : 3235343734303939316e292f393030373139393235343734303939317d2c7261
Arg [26] : 6e646f6d4e756d6265723d633d3e28642c61293d3e642b28612d64292a632829
Arg [27] : 2c72616e646f6d496e743d633d3e28642c61293d3e4d6174682e666c6f6f7228
Arg [28] : 6328642c612b3129292c6d6b52616e646f6d3d613d3e7b636f6e737420623d41
Arg [29] : 727261792834292e66696c6c28292e6d61702828612c62293d3e31362a622b32
Arg [30] : 292e6d617028623d3e75363428603078247b612e736c69636528622c622b3136
Arg [31] : 297d6029292c633d786f736869726f3235367374727374722862292c643d7261
Arg [32] : 6e646f6d446563696d616c2863292c653d72616e646f6d4e756d626572286429
Arg [33] : 2c663d72616e646f6d496e742865293b72657475726e7b723a642c726e3a652c
Arg [34] : 72693a667d7d2c73687566666c653d28612c62293d3e7b76617220633d4d6174
Arg [35] : 682e666c6f6f723b666f72286c657420642c652c663d612e6c656e6774683b66
Arg [36] : 3b29653d63286228292a662d2d292c643d615b665d2c615b665d3d615b655d2c
Arg [37] : 615b655d3d643b72657475726e20617d2c7265706561743d28612c62293d3e41
Arg [38] : 727261792e66726f6d287b6c656e6774683a627d292e6d61702828293d3e6129
Arg [39] : 2c73656c65637452616e646f6d3d28612c62293d3e615b4d6174682e666c6f6f
Arg [40] : 72286228292a612e6c656e677468295d2c73656c65637452616e646f6d446973
Arg [41] : 743d28622c63293d3e7b636f6e737420613d4f626a6563742e6b657973286229
Arg [42] : 2e7265647563652828632c61293d3e632e636f6e636174287265706561742861
Arg [43] : 2c3130302a625b615d29292c5b5d293b72657475726e2073656c65637452616e
Arg [44] : 646f6d2873687566666c6528612c63292c63297d2c746f4865783d613d3e612e
Arg [45] : 746f537472696e67283136292e706164537461727428322c223022292c66726f
Arg [46] : 6d4865783d613d3e7061727365496e7428612c3136292c72616e646f6d436f6c
Arg [47] : 6f724865783d613d3e7b636f6e737420623d28293d3e746f486578284d617468
Arg [48] : 2e666c6f6f72283235362a61282929292c633d6228292c643d6228292c653d62
Arg [49] : 28293b72657475726e6023247b637d247b647d247b657d607d2c636f6c446973
Arg [50] : 743d7b303a2e312c313a2e312c323a2e312c333a2e30352c343a2e30342c353a
Arg [51] : 2e3032352c363a2e30352c373a2e312c383a2e312c393a2e312c31303a2e3035
Arg [52] : 2c31313a2e312c31323a2e30352c31333a2e3032352c31343a2e30317d2c7379
Arg [53] : 6d446973743d7b333a2e30362c343a2e30352c353a2e30322c363a2e312c373a
Arg [54] : 2e31322c383a2e31352c393a2e31352c31303a2e31352c31313a2e31352c3132
Arg [55] : 3a2e30357d2c737072656164446973743d7b303a2e30352c313a2e31352c323a
Arg [56] : 2e332c333a2e31352c343a2e31352c353a2e312c363a2e317d2c637562657344
Arg [57] : 6973743d7b34303a2e312c35303a2e322c36303a2e32352c37303a2e332c3830
Arg [58] : 3a2e312c39303a2e30357d2c68617368546f5472616974733d613d3e7b636f6e
Arg [59] : 737420623d6d6b52616e646f6d2861292c633d622e7269283230302c34303029
Arg [60] : 2c643d622e7269283230302c343030292c653d622e7269283230302c35303029
Arg [61] : 2c663d622e726928312c34292c673d622e726928312c34292c683d622e726928
Arg [62] : 312c34292c693d622e726928312c34292c6a3d7061727365496e742873656c65
Arg [63] : 637452616e646f6d446973742873796d446973742c622e7229292c6b3d706172
Arg [64] : 7365496e742873656c65637452616e646f6d4469737428737072656164446973
Arg [65] : 742c622e7229292c6c3d7061727365496e742873656c65637452616e646f6d44
Arg [66] : 69737428636f6c446973742c622e7229292c6d3d7061727365496e742873656c
Arg [67] : 65637452616e646f6d44697374286375626573446973742c622e7229293b7265
Arg [68] : 7475726e7b73697a65783a632c73697a65793a642c73697a657a3a652c636f73
Arg [69] : 783a662c73696e783a672c636f73793a682c73696e793a692c637562656e756d
Arg [70] : 3a6d2c73796d6d657472793a6a2c7370726561643a6b2c636f6c7365743a6c7d
Arg [71] : 7d3b6c65742077656972646b2c6c61737470696e63682c74696d656f75742c72
Arg [72] : 656e64657265722c616e673d302c73697a3d36302c6b73706565643d2e332c6b
Arg [73] : 6f66663d3830302c63756d756c3d302c70696e6368696e673d21312c70696e63
Arg [74] : 68646973743d302c746f7a3d323830302c7a733d35302c636f66783d312c636f
Arg [75] : 66793d312c636f667a3d312c70726576526f743d5b312c302c302c305d2c6375
Arg [76] : 7272526f743d5b312c302c302c305d2c636f6c734172723d5b5b222339323565
Arg [77] : 3738222c2223626439336264222c2223663265646562222c2223663035333635
Arg [78] : 222c2223666162633261225d2c5b2223323563656431222c2223666666666666
Arg [79] : 222c2223666365616465222c2223666638613562222c2223656135323666225d
Arg [80] : 2c5b2223626662646331222c2223366436613735222c2223333733323365222c
Arg [81] : 2223646562383431222c2223646539653336225d2c5b2223433946424646222c
Arg [82] : 2223333734433643222c2223363837434131222c2223376434653537222c2223
Arg [83] : 453038433742225d2c5b2223346334346366222c2223653935336461222c2223
Arg [84] : 663563316630222c2223316538636230222c2223313432663438225d2c5b2223
Arg [85] : 303333663633222c2223323836363665222c2223376339383835222c22236235
Arg [86] : 62363832222c2223666564633937225d2c5b2223386563616536222c22233231
Arg [87] : 39656263222c2223303233303437222c2223666662373033222c222366623835
Arg [88] : 3030225d2c5b2223663466316465222c2223653037613566222c222333643430
Arg [89] : 3562222c2223383162323961222c2223663263633866225d2c5b222344313636
Arg [90] : 3636222c2223326634353530222c2223353836663763222c2223623864626439
Arg [91] : 222c2223663466346639225d2c5b2223336433343862222c2223373637386564
Arg [92] : 222c2223663762383031222c2223444244424641222c2223663335623034225d
Arg [93] : 2c5b2223464345394545222c2223463843384435222c2223423634433632222c
Arg [94] : 2223364131333145222c2223463441453634225d2c5b2223306433623636222c
Arg [95] : 2223666166306361222c2223663464333565222c2223656539363462222c2223
Arg [96] : 663935373338225d2c5b2223666661663837222c2223464643454332222c2223
Arg [97] : 656436613565222c2223346365306233222c2223333737373731225d2c5b2223
Arg [98] : 353630336164222c2223383336376337222c2223623365396337222c22236332
Arg [99] : 66386362222c2223663066666631225d2c5b2223303030303030222c22233243
Arg [100] : 32633263222c2223434343434343222c2223336133613361222c222338383030
Arg [101] : 3030225d5d2c62674172723d5b2223334432393239222c222331363236326522
Arg [102] : 2c2223303030303030222c2223313131353163222c2223313632363265222c22
Arg [103] : 23303231323039222c2223313831313134222c2223313031393135222c222331
Arg [104] : 3030353035222c2223304430423145222c2223323631413141222c2223314531
Arg [105] : 443230222c2223313632363265222c2223314530313343222c22234646464646
Arg [106] : 46225d3b636f6e737420637075506f733d28622c63293d3e7b76617220643d4d
Arg [107] : 6174682e73696e2c653d4d6174682e636f733b6c657420663d5b5d3b666f7228
Arg [108] : 6c657420673d303b673c622e6c656e6774683b672b2b297b6c657420683d625b
Arg [109] : 675d2b635b345d2c613d635b305d2a28322b6528636f73782a6829292a652873
Arg [110] : 696e782a68293b612a3d303d3d635b335d3f313a635b335d2a652868292f6428
Arg [111] : 68293b6c657420693d635b315d2a28322b6528636f73792a6829292a64287369
Arg [112] : 6e792a68292c6a3d635b325d2a6428322a68293b662e70757368285b612c692c
Arg [113] : 6a5d297d72657475726e20667d2c637075526f743d28612c62293d3e7b6c6574
Arg [114] : 20633d5b5d3b666f72286c657420653d303b653c612e6c656e6774683b652b2b
Arg [115] : 297b6c657420663d5b625b655d5b305d2d615b655d5b305d2c625b655d5b315d
Arg [116] : 2d615b655d5b315d2c625b655d5b325d2d615b655d5b325d5d2c643d4d617468
Arg [117] : 2e7371727428665b305d2a665b305d2b665b315d2a665b315d2b665b325d2a66
Arg [118] : 5b325d293b665b305d2f3d642c665b315d2f3d642c665b325d2f3d643b6c6574
Arg [119] : 20673d4d6174682e6173696e282d665b315d293b2e34393c665b305d26262e35
Arg [120] : 3e665b305d3f665b305d3d2e353a2d2e34393e665b305d26262d2e353c665b30
Arg [121] : 5d262628665b305d3d2d2e35293b6c657420683d4d6174682e6174616e322866
Arg [122] : 5b305d2c665b325d293b632e70757368285b672c685d297d72657475726e2063
Arg [123] : 7d3b6c65742073697a65782c73697a65792c73697a657a2c636f73782c73696e
Arg [124] : 782c636f73792c73696e792c637562656e756d2c73796d6d657472792c737072
Arg [125] : 6561642c636f6c7365743b66756e6374696f6e2061737369676e547261697473
Arg [126] : 28297b6c657420613d68617368546f54726169747328746f6b656e446174612e
Arg [127] : 68617368293b73697a65783d612e73697a65782c73697a65793d612e73697a65
Arg [128] : 792c73697a657a3d612e73697a657a2c636f73783d612e636f73782c73696e78
Arg [129] : 3d612e73696e782c636f73793d612e636f73792c73696e793d612e73696e792c
Arg [130] : 637562656e756d3d612e637562656e756d2c73796d6d657472793d612e73796d
Arg [131] : 6d657472792c7370726561643d612e7370726561642c636f6c7365743d612e63
Arg [132] : 6f6c7365742c77656972646b3d7370726561642f327d66756e6374696f6e2070
Arg [133] : 646973742861297b72657475726e204d6174682e6879706f7428612e746f7563
Arg [134] : 6865735b305d2e70616765582d612e746f75636865735b315d2e70616765582c
Arg [135] : 612e746f75636865735b305d2e70616765592d612e746f75636865735b315d2e
Arg [136] : 7061676559297d66756e6374696f6e20776865656c2861297b76617220623d61
Arg [137] : 2e776865656c44656c74613b7a6f6f6d2862297d66756e6374696f6e207a6f6f
Arg [138] : 6d2861297b313830303e3d746f7a2626303e617c7c343230303c3d746f7a2626
Arg [139] : 303c617c7c28746f7a2b3d61297d66756e6374696f6e20746f75636873746172
Arg [140] : 742861297b323d3d3d612e746f75636865732e6c656e67746826262870696e63
Arg [141] : 68696e673d21302c70696e6368646973743d7064697374286129297d66756e63
Arg [142] : 74696f6e20746f7563686d6f76652861297b69662870696e6368696e67297b69
Arg [143] : 66286c61737470696e63683d70696e6368646973742c70696e6368646973743d
Arg [144] : 70646973742861292c303d3d70696e6368646973747c7c303d3d6c6173747069
Arg [145] : 6e63682972657475726e3b63756d756c2b3d2d2870696e6368646973742d6c61
Arg [146] : 737470696e6368297d7d66756e6374696f6e20746f756368656e6428297b7069
Arg [147] : 6e6368696e673d21312c6c61737470696e63683d302c70696e6368646973743d
Arg [148] : 302c63756d756c3d307d66756e6374696f6e20736574757028297b6173736967
Arg [149] : 6e54726169747328292c70352e64697361626c65467269656e646c794572726f
Arg [150] : 72733d21303b636f6e737420613d77696e646f772e696e6e657257696474682c
Arg [151] : 623d77696e646f772e696e6e65724865696768743b616e676c654d6f64652844
Arg [152] : 454752454553292c72656e64657265723d63726561746543616e76617328612c
Arg [153] : 622c574542474c292c72656e64657265722e6d6f757365576865656c28776865
Arg [154] : 656c292c72656e64657265722e746f7563685374617274656428746f75636873
Arg [155] : 74617274292c72656e64657265722e746f7563684d6f76656428746f7563686d
Arg [156] : 6f7665292c72656e64657265722e746f756368456e64656428746f756368656e
Arg [157] : 64292c6e6f5374726f6b6528297d636f6e737420636f6d7075746553697a653d
Arg [158] : 613d3e7b6c657420623d6d61702873696e2861292c2d312c312c302c73697a29
Arg [159] : 2c633d6d617028636f732861292c2d312c312c302c73697a292c643d6d617028
Arg [160] : 73696e2861292c2d312c312c302c73697a293b72657475726e20637265617465
Arg [161] : 566563746f7228622c632c64297d3b66756e6374696f6e206472617728297b63
Arg [162] : 616d65726128302c302c746f7a292c6b73706565643d746f6b656e5374617465
Arg [163] : 2e73706565642f3130302c6b6f66663d746f6b656e53746174652e6f66667365
Arg [164] : 742c73697a3d746f6b656e53746174652e6375626573697a652c616d6269656e
Arg [165] : 744c69676874283136382c3136382c313638292c646972656374696f6e616c4c
Arg [166] : 69676874283132382c3132382c3132382c302c302c2d31292c6261636b67726f
Arg [167] : 756e642862674172725b636f6c7365745d293b6c657420613d77656972646b3f
Arg [168] : 6b73706565642f323a6b73706565642c623d302c633d303b726f746174655a28
Arg [169] : 616e67293b6c657420643d5b5d3b636f66783d73697a65782b6b6f66662a6162
Arg [170] : 7328636f7328322a616e6729292c636f66793d73697a65792b6b6f66662a6162
Arg [171] : 732873696e28322a616e6729293b6c657420653d5b636f66782c636f66792c73
Arg [172] : 697a657a2c77656972646b2c305d2c663d5b636f66782c636f66792c73697a65
Arg [173] : 7a2c77656972646b2c2e30315d3b666f72286c657420613d303b3336303e613b
Arg [174] : 612b3d3336302f637562656e756d29642e707573682872616469616e7328616e
Arg [175] : 672b6129293b6c657420673d637075506f7328642c65292c683d637075506f73
Arg [176] : 28642c66292c693d637075526f7428672c68293b666f72283b3336303e3d623b
Arg [177] : 297b7075736828292c726f746174655a2862293b6c657420613d302c643d303b
Arg [178] : 666f72283b643c637562656e756d3b297b7075736828292c7472616e736c6174
Arg [179] : 6528675b645d5b305d2c675b645d5b315d2c675b645d5b325d292c726f746174
Arg [180] : 6559286465677265657328695b645d5b315d29292c726f746174655828646567
Arg [181] : 7265657328695b645d5b305d29293b6c657420623d636f6c734172725b636f6c
Arg [182] : 7365745d2c633d696e74286d617028612c302c3336302c302c637562656e756d
Arg [183] : 292925622e6c656e6774683b633e622e6c656e6774682d31262628633d622e6c
Arg [184] : 656e6774682d31292c66696c6c28625b635d293b6c657420653d636f6d707574
Arg [185] : 6553697a6528612b616e67293b626f7828652e782c652e792c652e7a292c706f
Arg [186] : 7028292c612b3d3336302f637562656e756d2c642b2b7d622b3d3336302f7379
Arg [187] : 6d6d657472792c632b3d6b6f66662c706f7028297d696628616e672b3d612c33
Arg [188] : 36303c3d616e67262628616e673d30292c30213d63756d756c29696628303c63
Arg [189] : 756d756c297b6c657420613d63756d756c3c7a733f63756d756c3a7a733b7a6f
Arg [190] : 6f6d2861292c63756d756c2b3d617d656c736520696628303e63756d756c297b
Arg [191] : 6c657420613d63756d756c3e2d7a733f63756d756c3a2d7a733b7a6f6f6d2861
Arg [192] : 292c63756d756c2b3d617d7d66756e6374696f6e2077696e646f77526573697a
Arg [193] : 656428297b726573697a6543616e7661732877696e646f7757696474682c7769
Arg [194] : 6e646f77486569676874297d0000000000000000000000000000000000000000
Arg [195] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [196] : 68747470733a2f2f67656e65746963636861696e2e696f000000000000000000


Deployed Bytecode Sourcemap

161:2123:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:234:11;;;;;;;;;;-1:-1:-1;910:234:11;;;;;:::i;:::-;;:::i;:::-;;;611:14:21;;604:22;586:41;;574:2;559:18;910:234:11;;;;;;;;2408:98:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3820:217::-;;;;;;;;;;-1:-1:-1;3820:217:8;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1797:55:21;;;1779:74;;1767:2;1752:18;3820:217:8;1633:226:21;3371:388:8;;;;;;;;;;-1:-1:-1;3371:388:8;;;;;:::i;:::-;;:::i;:::-;;984:1117:6;;;;;;:::i;:::-;;:::i;288:43:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4569:380:0;;;:::i;5558:359::-;;;;;;;;;;-1:-1:-1;5558:359:0;;;;;:::i;:::-;;:::i;1547:111:11:-;;;;;;;;;;-1:-1:-1;1634:10:11;:17;1547:111;;;4446:25:21;;;4434:2;4419:18;1547:111:11;4300:177:21;1264:99:4;;;;;;;;;;-1:-1:-1;1341:15:4;;1264:99;;4684:300:8;;;;;;;;;;-1:-1:-1;4684:300:8;;;;;:::i;:::-;;:::i;582:18:1:-;;;;;;;;;;;;;:::i;2509:105:6:-;;;;;;;;;;-1:-1:-1;2509:105:6;;;;;:::i;:::-;-1:-1:-1;;;;;2595:12:6;2562:13;2595:12;;;:6;:12;;;;;;;2509:105;1223:253:11;;;;;;;;;;-1:-1:-1;1223:253:11;;;;;:::i;:::-;;:::i;1369:155:4:-;;;;;;;;;;-1:-1:-1;1480:9:4;1369:155;;1898:32:0;;;;;;;;;;;;;;;;1777:330:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;869:453:2:-;;;;;;;;;;-1:-1:-1;869:453:2;;;;;:::i;:::-;;:::i;:::-;;;;6800:18:21;6845:15;;;6827:34;;6897:15;;;;6892:2;6877:18;;6870:43;6961:34;6949:47;6929:18;;;6922:75;6778:2;6763:18;869:453:2;6592:411:21;326:38:1;;;;;;;;;;;;363:1;326:38;;5050:149:8;;;;;;;;;;-1:-1:-1;5050:149:8;;;;;:::i;:::-;;:::i;7025:98:0:-;;;;;;;;;;-1:-1:-1;7025:98:0;;;;;:::i;:::-;;:::i;370:44:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5071:365:0;;;;;;;;;;-1:-1:-1;5071:365:0;;;;;:::i;:::-;;:::i;1730:230:11:-;;;;;;;;;;-1:-1:-1;1730:230:11;;;;;:::i;:::-;;:::i;2111:235:8:-;;;;;;;;;;-1:-1:-1;2111:235:8;;;;;:::i;:::-;;:::i;1579:46:0:-;;;;;;;;;;;;;;;;1203:205:1;;;;;;;;;;-1:-1:-1;1203:205:1;;;;;:::i;:::-;;:::i;1849::8:-;;;;;;;;;;-1:-1:-1;1849:205:8;;;;;:::i;:::-;;:::i;1700:145:7:-;;;;;;;;;;;;;:::i;1764:25:0:-;;;;;;;;;;;;;;;;420:155:1;;;;;;;;;;;;;:::i;3747:92:0:-;;;;;;;;;;;;;:::i;5995:959::-;;;;;;:::i;:::-;;:::i;1639:642:2:-;;;;;;;;;;-1:-1:-1;1639:642:2;;;;;:::i;:::-;;:::i;1068:85:7:-;;;;;;;;;;-1:-1:-1;1140:6:7;;-1:-1:-1;;;;;1140:6:7;1068:85;;2570:102:8;;;;;;;;;;;;;:::i;3353:119:0:-;;;;;;;;;;-1:-1:-1;3353:119:0;;;;;:::i;:::-;;:::i;4104:290:8:-;;;;;;;;;;-1:-1:-1;4104:290:8;;;;;:::i;:::-;;:::i;3185:119:0:-;;;;;;;;;;-1:-1:-1;3185:119:0;;;;;:::i;:::-;;:::i;7968:162::-;;;;;;;;;;-1:-1:-1;7968:162:0;;;;;:::i;:::-;;:::i;1824:31::-;;;;;;;;;;;;;;;;1631:46;;;;;;;;;;;;;;;;606:28:1;;;;;;;;;;-1:-1:-1;606:28:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;1510:30:0:-;;;;;;;;;;-1:-1:-1;1510:30:0;;;;;;;;;;;5265:282:8;;;;;;;;;;-1:-1:-1;5265:282:8;;;;;:::i;:::-;;:::i;7655:221:0:-;;;;;;;;;;-1:-1:-1;7655:221:0;;;;;:::i;:::-;;:::i;1414:226:1:-;;;;;;;;;;-1:-1:-1;1414:226:1;;;;;:::i;:::-;;:::i;2113:219::-;;;;;;;;;;;;;:::i;3524:99:0:-;;;;;;;;;;;;;:::i;1075:122:1:-;;;;;;;;;;-1:-1:-1;1075:122:1;;;;;:::i;:::-;;:::i;1704:24:0:-;;;;;;;;;;;;;;;;2338:204:1;;;;;;;;;;;;;:::i;9040:433:0:-;;;;;;;;;;-1:-1:-1;9040:433:0;;;;;:::i;:::-;;:::i;1861:31::-;;;;;;;;;;;;;;;;1734:24;;;;;;;;;;;;;;;;1994:240:7;;;;;;;;;;-1:-1:-1;1994:240:7;;;;;:::i;:::-;;:::i;8192:300:0:-;;;;;;;;;;-1:-1:-1;8192:300:0;;;;;:::i;:::-;;:::i;1795:23::-;;;;;;;;;;;;;;;;1646:125:1;;;;;;;;;;-1:-1:-1;1748:9:1;:16;1646:125;;910:234:11;1012:4;1035:50;;;1050:35;1035:50;;:102;;;1101:36;1125:11;1101:23;:36::i;:::-;1028:109;910:234;-1:-1:-1;;910:234:11:o;2408:98:8:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3820:217::-;3896:7;7069:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7069:16:8;3915:73;;;;-1:-1:-1;;;3915:73:8;;11842:2:21;3915:73:8;;;11824:21:21;11881:2;11861:18;;;11854:30;11920:34;11900:18;;;11893:62;11991:14;11971:18;;;11964:42;12023:19;;3915:73:8;;;;;;;;;-1:-1:-1;4006:24:8;;;;:15;:24;;;;;;-1:-1:-1;;;;;4006:24:8;;3820:217::o;3371:388::-;3451:13;3467:23;3482:7;3467:14;:23::i;:::-;3451:39;;3514:5;-1:-1:-1;;;;;3508:11:8;:2;-1:-1:-1;;;;;3508:11:8;;;3500:57;;;;-1:-1:-1;;;3500:57:8;;12255:2:21;3500:57:8;;;12237:21:21;12294:2;12274:18;;;12267:30;12333:34;12313:18;;;12306:62;12404:3;12384:18;;;12377:31;12425:19;;3500:57:8;12053:397:21;3500:57:8;3592:5;-1:-1:-1;;;;;3576:21:8;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3576:21:8;;:62;;;;3601:37;3618:5;3625:12;:10;:12::i;3601:37::-;3568:152;;;;-1:-1:-1;;;3568:152:8;;12657:2:21;3568:152:8;;;12639:21:21;12696:2;12676:18;;;12669:30;12735:34;12715:18;;;12708:62;12806:26;12786:18;;;12779:54;12850:19;;3568:152:8;12455:420:21;3568:152:8;3731:21;3740:2;3744:7;3731:8;:21::i;:::-;3441:318;3371:388;;:::o;984:1117:6:-;1235:148;;;1179:12;1235:148;;;;;-1:-1:-1;;;;;1272:19:6;;1203:29;1272:19;;;:6;:19;;;;;;;;;1235:148;;;;;;;;;;;1415:45;1279:11;1235:148;1443:4;1449;1455;1415:6;:45::i;:::-;1394:125;;;;-1:-1:-1;;;1394:125:6;;13082:2:21;1394:125:6;;;13064:21:21;13121:2;13101:18;;;13094:30;13160:34;13140:18;;;13133:62;13231:3;13211:18;;;13204:31;13252:19;;1394:125:6;12880:397:21;1394:125:6;-1:-1:-1;;;;;1605:19:6;;;;;;:6;:19;;;;;;:26;;1629:1;1605:23;:26::i;:::-;-1:-1:-1;;;;;1583:19:6;;;;;;:6;:19;;;;;;;:48;;;;1647:122;;;;;1590:11;;1717:10;;1742:17;;1647:122;:::i;:::-;;;;;;;;1877:12;1891:23;1926:4;-1:-1:-1;;;;;1918:18:6;1967:17;1986:11;1950:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1950:48:6;;;;;;;;;;1918:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1876:132;;;;2026:7;2018:48;;;;-1:-1:-1;;;2018:48:6;;14678:2:21;2018:48:6;;;14660:21:21;14717:2;14697:18;;;14690:30;14756;14736:18;;;14729:58;14804:18;;2018:48:6;14476:352:21;2018:48:6;2084:10;984:1117;-1:-1:-1;;;;;;;;984:1117:6:o;4569:380:0:-;2591:7;;;;2590:8;2582:39;;;;-1:-1:-1;;;2582:39:0;;15035:2:21;2582:39:0;;;15017:21:21;15074:2;15054:18;;;15047:30;15113:20;15093:18;;;15086:48;15151:18;;2582:39:0;14833:342:21;2582:39:0;4656:10:::1;::::0;::::1;::::0;::::1;;;4648:43;;;::::0;-1:-1:-1;;;4648:43:0;;15382:2:21;4648:43:0::1;::::0;::::1;15364:21:21::0;15421:2;15401:18;;;15394:30;15460:22;15440:18;;;15433:50;15500:18;;4648:43:0::1;15180:344:21::0;4648:43:0::1;4724:9;4709:11;;:24;4701:55;;;::::0;-1:-1:-1;;;4701:55:0;;15731:2:21;4701:55:0::1;::::0;::::1;15713:21:21::0;15770:2;15750:18;;;15743:30;15809:20;15789:18;;;15782:48;15847:18;;4701:55:0::1;15529:342:21::0;4701:55:0::1;4790:8;::::0;1634:10:11;:17;4774:24:0::1;4766:56;;;::::0;-1:-1:-1;;;4766:56:0;;16078:2:21;4766:56:0::1;::::0;::::1;16060:21:21::0;16117:2;16097:18;;;16090:30;16156:21;16136:18;;;16129:49;16195:18;;4766:56:0::1;15876:343:21::0;4766:56:0::1;4855:9;;4840:12;;:24;4832:57;;;::::0;-1:-1:-1;;;4832:57:0;;16426:2:21;4832:57:0::1;::::0;::::1;16408:21:21::0;16465:2;16445:18;;;16438:30;16504:22;16484:18;;;16477:50;16544:18;;4832:57:0::1;16224:344:21::0;4832:57:0::1;4901:12;;4899:14;;;;;:::i;:::-;::::0;;;-1:-1:-1;4923:19:0::1;4931:10;4923:7;:19::i;:::-;4569:380::o:0;5558:359::-;2377:14;;-1:-1:-1;;;;;2377:14:0;2361:12;:10;:12::i;:::-;-1:-1:-1;;;;;2361:30:0;;2353:60;;;;-1:-1:-1;;;2353:60:0;;17164:2:21;2353:60:0;;;17146:21:21;17203:2;17183:18;;;17176:30;17242:19;17222:18;;;17215:47;17279:18;;2353:60:0;16962:341:21;2353:60:0;5689:8:::1;;5680:5;5664:13;1634:10:11::0;:17;;1547:111;5664:13:0::1;:21;;;;:::i;:::-;:33;;5656:65;;;::::0;-1:-1:-1;;;5656:65:0;;16078:2:21;5656:65:0::1;::::0;::::1;16060:21:21::0;16117:2;16097:18;;;16090:30;16156:21;16136:18;;;16129:49;16195:18;;5656:65:0::1;15876:343:21::0;5656:65:0::1;5763:9;;5754:5;5739:12;;:20;;;;:::i;:::-;:33;;5731:66;;;::::0;-1:-1:-1;;;5731:66:0;;17643:2:21;5731:66:0::1;::::0;::::1;17625:21:21::0;17682:2;17662:18;;;17655:30;17721:22;17701:18;;;17694:50;17761:18;;5731:66:0::1;17441:344:21::0;5731:66:0::1;5823:5;5807:12;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;5843:9:0::1;::::0;-1:-1:-1;5838:73:0::1;5862:5;5858:1;:9;5838:73;;;5888:12;5896:3;5888:7;:12::i;:::-;5869:3;::::0;::::1;:::i;:::-;;;5838:73;;4684:300:8::0;4843:41;4862:12;:10;:12::i;:::-;4876:7;4843:18;:41::i;:::-;4835:103;;;;-1:-1:-1;;;4835:103:8;;17992:2:21;4835:103:8;;;17974:21:21;18031:2;18011:18;;;18004:30;18070:34;18050:18;;;18043:62;18141:19;18121:18;;;18114:47;18178:19;;4835:103:8;17790:413:21;4835:103:8;4949:28;4959:4;4965:2;4969:7;4949:9;:28::i;582:18:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1223:253:11:-;1320:7;1355:23;1372:5;1355:16;:23::i;:::-;1347:5;:31;1339:87;;;;-1:-1:-1;;;1339:87:11;;18410:2:21;1339:87:11;;;18392:21:21;18449:2;18429:18;;;18422:30;18488:34;18468:18;;;18461:62;18559:13;18539:18;;;18532:41;18590:19;;1339:87:11;18208:407:21;1339:87:11;-1:-1:-1;;;;;;1443:19:11;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1223:253::o;1777:330:1:-;1922:9;:16;1846:18;;1880:23;;1906:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;1906:33:1;;;;;;;;;;;;;;;;1880:59;;1954:9;1949:131;1973:9;:16;1969:20;;1949:131;;;2008:21;2032:9;2042:1;2032:12;;;;;;;;:::i;:::-;;;;;;;;;;;2008:36;;2066:3;2056:13;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;2061:1;2056:7;;;;;;;;:::i;:::-;;;;;;:13;;;;1996:84;1991:3;;;;:::i;:::-;;;1949:131;;;-1:-1:-1;2096:4:1;1777:330;-1:-1:-1;1777:330:1:o;869:453:2:-;976:15;993:12;1007:14;950:7;2125:16:0;2133:7;7046:4:8;7069:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7069:16:8;:30;;;6981:125;2125:16:0;2117:42;;;;-1:-1:-1;;;2117:42:0;;19011:2:21;2117:42:0;;;18993:21:21;19050:2;19030:18;;;19023:30;19089:15;19069:18;;;19062:43;19122:18;;2117:42:0;18809:337:21;2117:42:0;1041:13:2::1;::::0;;;:4:::1;:13;::::0;;;;;::::1;;1037:279;;1090:2;1079:13;;1117:2;1106:13;;1144:2;1133:13;;1037:279;;;1188:15;::::0;;;:6:::1;:15;::::0;;;;:24;::::1;::::0;;::::1;::::0;-1:-1:-1;1237:21:2;;::::1;;::::0;-1:-1:-1;1283:22:2;;::::1;;;::::0;-1:-1:-1;1037:279:2::1;869:453:::0;;;;;;:::o;5050:149:8:-;5153:39;5170:4;5176:2;5180:7;5153:39;;;;;;;;;;;;:16;:39::i;7025:98:0:-;2491:14;;-1:-1:-1;;;;;2491:14:0;2475:12;:10;:12::i;:::-;-1:-1:-1;;;;;2475:30:0;;2467:60;;;;-1:-1:-1;;;2467:60:0;;19353:2:21;2467:60:0;;;19335:21:21;19392:2;19372:18;;;19365:30;19431:19;19411:18;;;19404:47;19468:18;;2467:60:0;19151:341:21;2467:60:0;7102:14:::1;7108:7;7102:5;:14::i;:::-;7025:98:::0;:::o;5071:365::-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;1140:6;;-1:-1:-1;;;;;1140:6:7;;1068:85;1280:7;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;19699:2:21;1272:68:7;;;19681:21:21;;;19718:18;;;19711:30;19777:34;19757:18;;;19750:62;19829:18;;1272:68:7;19497:356:21;1272:68:7;5204:8:0::1;;5195:5;5179:13;1634:10:11::0;:17;;1547:111;5179:13:0::1;:21;;;;:::i;:::-;:33;;5171:65;;;::::0;-1:-1:-1;;;5171:65:0;;16078:2:21;5171:65:0::1;::::0;::::1;16060:21:21::0;16117:2;16097:18;;;16090:30;16156:21;16136:18;;;16129:49;16195:18;;5171:65:0::1;15876:343:21::0;5171:65:0::1;5279:10;;5270:5;5254:13;;:21;;;;:::i;:::-;:35;;5246:69;;;::::0;-1:-1:-1;;;5246:69:0;;20060:2:21;5246:69:0::1;::::0;::::1;20042:21:21::0;20099:2;20079:18;;;20072:30;20138:23;20118:18;;;20111:51;20179:18;;5246:69:0::1;19858:345:21::0;5246:69:0::1;5342:5;5325:13;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;5362:9:0::1;::::0;-1:-1:-1;5357:73:0::1;5381:5;5377:1;:9;5357:73;;;5407:12;5415:3;5407:7;:12::i;:::-;5388:3;::::0;::::1;:::i;:::-;;;5357:73;;1730:230:11::0;1805:7;1840:30;1634:10;:17;;1547:111;1840:30;1832:5;:38;1824:95;;;;-1:-1:-1;;;1824:95:11;;20410:2:21;1824:95:11;;;20392:21:21;20449:2;20429:18;;;20422:30;20488:34;20468:18;;;20461:62;20559:14;20539:18;;;20532:42;20591:19;;1824:95:11;20208:408:21;1824:95:11;1936:10;1947:5;1936:17;;;;;;;;:::i;:::-;;;;;;;;;1929:24;;1730:230;;;:::o;2111:235:8:-;2183:7;2218:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2218:16:8;2252:19;2244:73;;;;-1:-1:-1;;;2244:73:8;;20823:2:21;2244:73:8;;;20805:21:21;20862:2;20842:18;;;20835:30;20901:34;20881:18;;;20874:62;20972:11;20952:18;;;20945:39;21001:19;;2244:73:8;20621:405:21;1203:205:1;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;1140:6;;-1:-1:-1;;;;;1140:6:7;;1068:85;1280:7;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;19699:2:21;1272:68:7;;;19681:21:21;;;19718:18;;;19711:30;19777:34;19757:18;;;19750:62;19829:18;;1272:68:7;19497:356:21;1272:68:7;2591:7:0::1;::::0;::::1;;2590:8;2582:39;;;::::0;-1:-1:-1;;;2582:39:0;;15035:2:21;2582:39:0::1;::::0;::::1;15017:21:21::0;15074:2;15054:18;;;15047:30;15113:20;15093:18;;;15086:48;15151:18;;2582:39:0::1;14833:342:21::0;2582:39:0::1;1351:21:1::2;::::0;;;;::::2;::::0;;;;;;::::2;::::0;;::::2;::::0;;;1382:9:::2;:19:::0;;::::2;::::0;::::2;::::0;;1328:20:::2;1382:19:::0;;;;;;;;1351:21;;1382:19:::2;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;1382:19:1::2;::::0;;::::2;::::0;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;:::i;:::-;;;;1318:90;1203:205:::0;;:::o;1849::8:-;1921:7;-1:-1:-1;;;;;1948:19:8;;1940:74;;;;-1:-1:-1;;;1940:74:8;;21233:2:21;1940:74:8;;;21215:21:21;21272:2;21252:18;;;21245:30;21311:34;21291:18;;;21284:62;21382:12;21362:18;;;21355:40;21412:19;;1940:74:8;21031:406:21;1940:74:8;-1:-1:-1;;;;;;2031:16:8;;;;;:9;:16;;;;;;;1849:205::o;1700:145:7:-;1291:12;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;1140:6;;-1:-1:-1;;;;;1140:6:7;;1068:85;1280:7;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;19699:2:21;1272:68:7;;;19681:21:21;;;19718:18;;;19711:30;19777:34;19757:18;;;19750:62;19829:18;;1272:68:7;19497:356:21;1272:68:7;1790:6:::1;::::0;1769:40:::1;::::0;1806:1:::1;::::0;-1:-1:-1;;;;;1790:6:7::1;::::0;1769:40:::1;::::0;1806:1;;1769:40:::1;1819:6;:19:::0;;-1:-1:-1;;1819:19:7::1;::::0;;1700:145::o;420:155:1:-;;;;;;;;;;;;;;;;;;;:::o;3747:92:0:-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;1140:6;;-1:-1:-1;;;;;1140:6:7;;1068:85;1280:7;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;19699:2:21;1272:68:7;;;19681:21:21;;;19718:18;;;19711:30;19777:34;19757:18;;;19750:62;19829:18;;1272:68:7;19497:356:21;1272:68:7;3818:7:0::1;:14:::0;;-1:-1:-1;;3818:14:0::1;3828:4;3818:14;::::0;;3747:92::o;5995:959::-;2591:7;;;;2590:8;2582:39;;;;-1:-1:-1;;;2582:39:0;;15035:2:21;2582:39:0;;;15017:21:21;15074:2;15054:18;;;15047:30;15113:20;15093:18;;;15086:48;15151:18;;2582:39:0;14833:342:21;2582:39:0;6208:9:::1;6199:5;6185:11;;:19;;;;:::i;:::-;:32;6177:63;;;::::0;-1:-1:-1;;;6177:63:0;;15731:2:21;6177:63:0::1;::::0;::::1;15713:21:21::0;15770:2;15750:18;;;15743:30;15809:20;15789:18;;;15782:48;15847:18;;6177:63:0::1;15529:342:21::0;6177:63:0::1;6259:11;6271:5;6259:18;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;6258:19;6250:45;;;::::0;-1:-1:-1;;;6250:45:0;;22158:2:21;6250:45:0::1;::::0;::::1;22140:21:21::0;22197:2;22177:18;;;22170:30;22236:15;22216:18;;;22209:43;22269:18;;6250:45:0::1;21956:337:21::0;6250:45:0::1;6329:8;::::0;1634:10:11;:17;6313:24:0::1;6305:54;;;::::0;-1:-1:-1;;;6305:54:0;;22500:2:21;6305:54:0::1;::::0;::::1;22482:21:21::0;22539:2;22519:18;;;22512:30;22578:19;22558:18;;;22551:47;22615:18;;6305:54:0::1;22298:341:21::0;6305:54:0::1;6402:8;;6393:5;6377:13;1634:10:11::0;:17;;1547:111;6377:13:0::1;:21;;;;:::i;:::-;:33;;6369:65;;;::::0;-1:-1:-1;;;6369:65:0;;16078:2:21;6369:65:0::1;::::0;::::1;16060:21:21::0;16117:2;16097:18;;;16090:30;16156:21;16136:18;;;16129:49;16195:18;;6369:65:0::1;15876:343:21::0;6369:65:0::1;6476:9;;6467:5;6452:12;;:20;;;;:::i;:::-;:33;;6444:66;;;::::0;-1:-1:-1;;;6444:66:0;;16426:2:21;6444:66:0::1;::::0;::::1;16408:21:21::0;16465:2;16445:18;;;16438:30;16504:22;16484:18;;;16477:50;16544:18;;6444:66:0::1;16224:344:21::0;6444:66:0::1;6535:10;6528:18;::::0;;;:6:::1;:18;::::0;;;;;6558:10;;6528:26:::1;::::0;6549:5;;6528:26:::1;:::i;:::-;:40;;6520:70;;;::::0;-1:-1:-1;;;6520:70:0;;22846:2:21;6520:70:0::1;::::0;::::1;22828:21:21::0;22885:2;22865:18;;;22858:30;22924:19;22904:18;;;22897:47;22961:18;;6520:70:0::1;22644:341:21::0;6520:70:0::1;6608:34;6623:7;6632:9;6608:14;:34::i;:::-;6600:61;;;::::0;-1:-1:-1;;;6600:61:0;;23192:2:21;6600:61:0::1;::::0;::::1;23174:21:21::0;23231:2;23211:18;;;23204:30;23270:16;23250:18;;;23243:44;23304:18;;6600:61:0::1;22990:338:21::0;6600:61:0::1;6679:59;6692:7;6701:10;6713;6725:5;6732;6679:12;:59::i;:::-;6671:84;;;::::0;-1:-1:-1;;;6671:84:0;;23535:2:21;6671:84:0::1;::::0;::::1;23517:21:21::0;23574:2;23554:18;;;23547:30;23613:14;23593:18;;;23586:42;23645:18;;6671:84:0::1;23333:336:21::0;6671:84:0::1;6781:5;6765:12;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;6803:10:0::1;6796:18;::::0;;;:6:::1;:18;::::0;;;;:27;;6818:5;;6796:18;:27:::1;::::0;6818:5;;6796:27:::1;:::i;:::-;;;;;;;;6854:4;6833:11;6845:5;6833:18;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:25;;;::::1;;-1:-1:-1::0;;6833:25:0;;::::1;::::0;;;::::1;::::0;;:18:::1;6868:80;6892:5;6888:1;:9;6868:80;;;6918:19;6926:10;6918:7;:19::i;:::-;6899:3;::::0;::::1;:::i;:::-;;;6868:80;;1639:642:2::0;1763:12;:10;:12::i;:::-;1777:7;2261:37:0;2280:8;2290:7;2261:18;:37::i;:::-;2253:46;;;;;;1814:8:2::1;1808:14;;:2;:14;;:33;;;;;1838:3;1826:8;:15;;;;1808:33;1800:79;;;::::0;-1:-1:-1;;;1800:79:2;;23876:2:21;1800:79:2::1;::::0;::::1;23858:21:21::0;23915:2;23895:18;;;23888:30;23954:34;23934:18;;;23927:62;24025:3;24005:18;;;23998:31;24046:19;;1800:79:2::1;23674:397:21::0;1800:79:2::1;1902:5;1897:10;;:1;:10;;:25;;;;;1920:2;1911:5;:11;;;;1897:25;1889:66;;;::::0;-1:-1:-1;;;1889:66:2;;24278:2:21;1889:66:2::1;::::0;::::1;24260:21:21::0;24317:2;24297:18;;;24290:30;24356;24336:18;;;24329:58;24404:18;;1889:66:2::1;24076:352:21::0;1889:66:2::1;1979:6;1973:12;;:2;:12;;:29;;;;;1999:3;1989:6;:13;;;;1973:29;1965:73;;;::::0;-1:-1:-1;;;1965:73:2;;24635:2:21;1965:73:2::1;::::0;::::1;24617:21:21::0;24674:2;24654:18;;;24647:30;24713:33;24693:18;;;24686:61;24764:18;;1965:73:2::1;24433:355:21::0;1965:73:2::1;2048:13;::::0;;;:4:::1;:13;::::0;;;;;;;:31;;-1:-1:-1;;2048:31:2::1;2075:4;2048:31;::::0;;2089:6:::1;:15:::0;;;;;;;:35;;2176:33:::1;::::0;;::::1;::::0;::::1;2089:35;2134:32:::0;;::::1;::::0;::::1;::::0;;;;2089:35;;::::1;2134:32:::0;;;;::::1;2176:33;;::::0;;2225:49;;2237:10:::1;::::0;2225:49:::1;::::0;::::1;::::0;2053:7;25017:25:21;;25068:13;25100:18;25154;;;25149:2;25134:18;;25127:46;25217:2;25213:18;;;25209:27;;;25189:18;;;25182:55;25004:3;25273:19;;;25268:2;25253:18;;25246:47;24989:19;;24793:506;2225:49:2::1;;;;;;;;1639:642:::0;;;;;;:::o;2570:102:8:-;2626:13;2658:7;2651:14;;;;;:::i;3353:119:0:-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;1140:6;;-1:-1:-1;;;;;1140:6:7;;1068:85;1280:7;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;19699:2:21;1272:68:7;;;19681:21:21;;;19718:18;;;19711:30;19777:34;19757:18;;;19750:62;19829:18;;1272:68:7;19497:356:21;1272:68:7;3442:14:0::1;:23:::0;;-1:-1:-1;;3442:23:0::1;-1:-1:-1::0;;;;;3442:23:0;;;::::1;::::0;;;::::1;::::0;;3353:119::o;4104:290:8:-;4218:12;:10;:12::i;:::-;-1:-1:-1;;;;;4206:24:8;:8;-1:-1:-1;;;;;4206:24:8;;;4198:62;;;;-1:-1:-1;;;4198:62:8;;25506:2:21;4198:62:8;;;25488:21:21;25545:2;25525:18;;;25518:30;25584:27;25564:18;;;25557:55;25629:18;;4198:62:8;25304:349:21;4198:62:8;4316:8;4271:18;:32;4290:12;:10;:12::i;:::-;-1:-1:-1;;;;;4271:32:8;;;;;;;;;;;;;;;;;-1:-1:-1;4271:32:8;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4271:53:8;;;;;;;;;;;4354:12;:10;:12::i;:::-;-1:-1:-1;;;;;4339:48:8;;4378:8;4339:48;;;;611:14:21;604:22;586:41;;574:2;559:18;;446:187;4339:48:8;;;;;;;;4104:290;;:::o;3185:119:0:-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;1140:6;;-1:-1:-1;;;;;1140:6:7;;1068:85;1280:7;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;19699:2:21;1272:68:7;;;19681:21:21;;;19718:18;;;19711:30;19777:34;19757:18;;;19750:62;19829:18;;1272:68:7;19497:356:21;1272:68:7;3274:14:0::1;:23:::0;;-1:-1:-1;;3274:23:0::1;-1:-1:-1::0;;;;;3274:23:0;;;::::1;::::0;;;::::1;::::0;;3185:119::o;7968:162::-;8079:7;7069:16:8;;;:7;:16;;;;;;8053:7:0;;-1:-1:-1;;;;;7069:16:8;2117:42:0;;;;-1:-1:-1;;;2117:42:0;;19011:2:21;2117:42:0;;;18993:21:21;19050:2;19030:18;;;19023:30;19089:15;19069:18;;;19062:43;19122:18;;2117:42:0;18809:337:21;2117:42:0;-1:-1:-1;;8109:14:0::1;::::0;;;:5:::1;:14;::::0;;;;;;7968:162::o;606:28:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5265:282:8:-;5396:41;5415:12;:10;:12::i;:::-;5429:7;5396:18;:41::i;:::-;5388:103;;;;-1:-1:-1;;;5388:103:8;;17992:2:21;5388:103:8;;;17974:21:21;18031:2;18011:18;;;18004:30;18070:34;18050:18;;;18043:62;18141:19;18121:18;;;18114:47;18178:19;;5388:103:8;17790:413:21;5388:103:8;5501:39;5515:4;5521:2;5525:7;5534:5;5501:13;:39::i;:::-;5265:282;;;;:::o;7655:221:0:-;7752:13;7812:14;:12;:14::i;:::-;7833:25;7850:7;7833:16;:25::i;:::-;7795:73;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7781:88;;7655:221;;;:::o;1414:226:1:-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;1140:6;;-1:-1:-1;;;;;1140:6:7;;1068:85;1280:7;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;19699:2:21;1272:68:7;;;19681:21:21;;;19718:18;;;19711:30;19777:34;19757:18;;;19750:62;19829:18;;1272:68:7;19497:356:21;1272:68:7;2591:7:0::1;::::0;::::1;;2590:8;2582:39;;;::::0;-1:-1:-1;;;2582:39:0;;15035:2:21;2582:39:0::1;::::0;::::1;15017:21:21::0;15074:2;15054:18;;;15047:30;15113:20;15093:18;;;15086:48;15151:18;;2582:39:0::1;14833:342:21::0;2582:39:0::1;1533:9:1::2;:16:::0;1525:24;::::2;1517:33;;;::::0;::::2;;1579:9;1589:16:::0;;:18:::2;::::0;1606:1:::2;::::0;1589:18:::2;:::i;:::-;1579:29;;;;;;;;:::i;:::-;;;;;;;;;;;1560:9;1570:5;1560:16;;;;;;;;:::i;:::-;;;;;;;;;;;:48;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;1618:9;:15;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;-1:-1:-1;;1618:15:1;;;;::::2;::::0;::::2;;::::0;::::2;::::0;;::::2;:::i;:::-;;;::::0;::::2;;;:::i;:::-;;;;;1414:226:::0;:::o;2113:219::-;2199:13;2259:8;2286:27;363:1;2286:16;:27::i;:::-;2242:82;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2228:97;;2113:219;:::o;3524:99:0:-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;1140:6;;-1:-1:-1;;;;;1140:6:7;;1068:85;1280:7;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;19699:2:21;1272:68:7;;;19681:21:21;;;19718:18;;;19711:30;19777:34;19757:18;;;19750:62;19829:18;;1272:68:7;19497:356:21;1272:68:7;3599:10:0::1;:17:::0;;;::::1;;;::::0;;3524:99::o;1075:122:1:-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;1140:6;;-1:-1:-1;;;;;1140:6:7;;1068:85;1280:7;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;19699:2:21;1272:68:7;;;19681:21:21;;;19718:18;;;19711:30;19777:34;19757:18;;;19750:62;19829:18;;1272:68:7;19497:356:21;1272:68:7;2591:7:0::1;::::0;::::1;;2590:8;2582:39;;;::::0;-1:-1:-1;;;2582:39:0;;15035:2:21;2582:39:0::1;::::0;::::1;15017:21:21::0;15074:2;15054:18;;;15047:30;15113:20;15093:18;;;15086:48;15151:18;;2582:39:0::1;14833:342:21::0;2582:39:0::1;1178:12:1::0;;::::2;::::0;:4:::2;::::0;:12;;::::2;::::0;::::2;:::i;:::-;;1075:122:::0;:::o;2338:204::-;2406:13;2466:8;2493:27;363:1;2493:16;:27::i;:::-;2449:85;;;;;;;;;:::i;9040:433:0:-;9287:21;;9331:28;;;;;-1:-1:-1;;;;;1797:55:21;;;9331:28:0;;;1779:74:21;9161:4:0;;9287:21;;;9323:49;;;;9287:21;;9331;;1752:18:21;;9331:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9323:49:0;;9319:91;;;9395:4;9388:11;;;;;9319:91;-1:-1:-1;;;;;4580:25:8;;;4557:4;4580:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;9427:39:0;9420:46;9040:433;-1:-1:-1;;;;9040:433:0:o;1994:240:7:-;1291:12;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;1140:6;;-1:-1:-1;;;;;1140:6:7;;1068:85;1280:7;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;19699:2:21;1272:68:7;;;19681:21:21;;;19718:18;;;19711:30;19777:34;19757:18;;;19750:62;19829:18;;1272:68:7;19497:356:21;1272:68:7;-1:-1:-1;;;;;2082:22:7;::::1;2074:73;;;::::0;-1:-1:-1;;;2074:73:7;;29852:2:21;2074:73:7::1;::::0;::::1;29834:21:21::0;29891:2;29871:18;;;29864:30;29930:34;29910:18;;;29903:62;30001:8;29981:18;;;29974:36;30027:19;;2074:73:7::1;29650:402:21::0;2074:73:7::1;2183:6;::::0;2162:38:::1;::::0;-1:-1:-1;;;;;2162:38:7;;::::1;::::0;2183:6:::1;::::0;2162:38:::1;::::0;2183:6:::1;::::0;2162:38:::1;2210:6;:17:::0;;-1:-1:-1;;2210:17:7::1;-1:-1:-1::0;;;;;2210:17:7;;;::::1;::::0;;;::::1;::::0;;1994:240::o;8192:300:0:-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;1140:6;;-1:-1:-1;;;;;1140:6:7;;1068:85;1280:7;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;19699:2:21;1272:68:7;;;19681:21:21;;;19718:18;;;19711:30;19777:34;19757:18;;;19750:62;19829:18;;1272:68:7;19497:356:21;1272:68:7;8302:1:0::1;8293:6;:10;8285:35;;;::::0;-1:-1:-1;;;8285:35:0;;30259:2:21;8285:35:0::1;::::0;::::1;30241:21:21::0;30298:2;30278:18;;;30271:30;30337:14;30317:18;;;30310:42;30369:18;;8285:35:0::1;30057:336:21::0;8285:35:0::1;8348:21;8338:6;:31;;8330:66;;;::::0;-1:-1:-1;;;8330:66:0;;30600:2:21;8330:66:0::1;::::0;::::1;30582:21:21::0;30639:2;30619:18;;;30612:30;30678:24;30658:18;;;30651:52;30720:18;;8330:66:0::1;30398:346:21::0;8330:66:0::1;-1:-1:-1::0;;;;;8414:16:0;::::1;8406:41;;;::::0;-1:-1:-1;;;8406:41:0;;30951:2:21;8406:41:0::1;::::0;::::1;30933:21:21::0;30990:2;30970:18;;;30963:30;31029:14;31009:18;;;31002:42;31061:18;;8406:41:0::1;30749:336:21::0;8406:41:0::1;8457:28;::::0;-1:-1:-1;;;;;8457:20:0;::::1;::::0;:28;::::1;;;::::0;8478:6;;8457:28:::1;::::0;;;8478:6;8457:20;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;95:631:3::0;163:22;205:10;227:4;205:27;201:496;;;248:18;269:8;;248:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;307:8:3;514:17;508:24;-1:-1:-1;;;;;483:131:3;;-1:-1:-1;201:496:3;;-1:-1:-1;201:496:3;;-1:-1:-1;675:10:3;201:496;95:631;:::o;1502:288:8:-;1604:4;1627:40;;;1642:25;1627:40;;:104;;-1:-1:-1;1683:48:8;;;1698:33;1683:48;1627:104;:156;;;-1:-1:-1;886:25:18;871:40;;;;1747:36:8;763:155:18;9620:154:0;9706:14;9743:24;:22;:24::i;:::-;9736:31;;9620:154;:::o;10738:171:8:-;10812:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;10812:29:8;-1:-1:-1;;;;;10812:29:8;;;;;;;;:24;;10865:23;10812:24;10865:14;:23::i;:::-;-1:-1:-1;;;;;10856:46:8;;;;;;;;;;;10738:171;;:::o;2620:470:6:-;2792:4;-1:-1:-1;;;;;2816:20:6;;2808:70;;;;-1:-1:-1;;;2808:70:6;;31292:2:21;2808:70:6;;;31274:21:21;31331:2;31311:18;;;31304:30;31370:34;31350:18;;;31343:62;31441:7;31421:18;;;31414:35;31466:19;;2808:70:6;31090:401:21;2808:70:6;2929:154;2956:47;2975:27;2995:6;2975:19;:27::i;:::-;2956:18;:47::i;:::-;2929:154;;;;;;;;;;;;31723:25:21;;;;31796:4;31784:17;;31764:18;;;31757:45;31818:18;;;31811:34;;;31861:18;;;31854:34;;;31695:19;;2929:154:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2907:176:6;:6;-1:-1:-1;;;;;2907:176:6;;2888:195;;2620:470;;;;;;;:::o;2672:96:20:-;2730:7;2756:5;2760:1;2756;:5;:::i;:::-;2749:12;2672:96;-1:-1:-1;;;2672:96:20:o;7261:200:0:-;7322:18;7343:13;1634:10:11;:17;;1547:111;7343:13:0;:17;;7359:1;7343:17;:::i;:::-;7322:38;;7370:26;7380:3;7385:10;7370:9;:26::i;:::-;7426:28;7438:3;7443:10;7426:11;:28::i;:::-;7406:17;;;;:5;:17;;;;;;:48;-1:-1:-1;7261:200:0:o;7264:344:8:-;7357:4;7069:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7069:16:8;7373:73;;;;-1:-1:-1;;;7373:73:8;;32101:2:21;7373:73:8;;;32083:21:21;32140:2;32120:18;;;32113:30;32179:34;32159:18;;;32152:62;32250:14;32230:18;;;32223:42;32282:19;;7373:73:8;31899:408:21;7373:73:8;7456:13;7472:23;7487:7;7472:14;:23::i;:::-;7456:39;;7524:5;-1:-1:-1;;;;;7513:16:8;:7;-1:-1:-1;;;;;7513:16:8;;:51;;;;7557:7;-1:-1:-1;;;;;7533:31:8;:20;7545:7;7533:11;:20::i;:::-;-1:-1:-1;;;;;7533:31:8;;7513:51;:87;;;;7568:32;7585:5;7592:7;7568:16;:32::i;10097:530::-;10221:4;-1:-1:-1;;;;;10194:31:8;:23;10209:7;10194:14;:23::i;:::-;-1:-1:-1;;;;;10194:31:8;;10186:85;;;;-1:-1:-1;;;10186:85:8;;32514:2:21;10186:85:8;;;32496:21:21;32553:2;32533:18;;;32526:30;32592:34;32572:18;;;32565:62;32663:11;32643:18;;;32636:39;32692:19;;10186:85:8;32312:405:21;10186:85:8;-1:-1:-1;;;;;10289:16:8;;10281:65;;;;-1:-1:-1;;;10281:65:8;;32924:2:21;10281:65:8;;;32906:21:21;32963:2;32943:18;;;32936:30;33002:34;32982:18;;;32975:62;33073:6;33053:18;;;33046:34;33097:19;;10281:65:8;32722:400:21;10281:65:8;10357:39;10378:4;10384:2;10388:7;10357:20;:39::i;:::-;10458:29;10475:1;10479:7;10458:8;:29::i;:::-;-1:-1:-1;;;;;10498:15:8;;;;;;:9;:15;;;;;:20;;10517:1;;10498:15;:20;;10517:1;;10498:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10528:13:8;;;;;;:9;:13;;;;;:18;;10545:1;;10528:13;:18;;10545:1;;10528:18;:::i;:::-;;;;-1:-1:-1;;10556:16:8;;;;:7;:16;;;;;;:21;;-1:-1:-1;;10556:21:8;-1:-1:-1;;;;;10556:21:8;;;;;;;;;10593:27;;10556:16;;10593:27;;;;;;;10097:530;;;:::o;9425:348::-;9484:13;9500:23;9515:7;9500:14;:23::i;:::-;9484:39;;9534:48;9555:5;9570:1;9574:7;9534:20;:48::i;:::-;9620:29;9637:1;9641:7;9620:8;:29::i;:::-;-1:-1:-1;;;;;9660:16:8;;;;;;:9;:16;;;;;:21;;9680:1;;9660:16;:21;;9680:1;;9660:21;:::i;:::-;;;;-1:-1:-1;;9698:16:8;;;;:7;:16;;;;;;9691:23;;-1:-1:-1;;9691:23:8;;;9730:36;9706:7;;9698:16;-1:-1:-1;;;;;9730:36:8;;;;;9698:16;;9730:36;9474:299;9425:348;:::o;4310:181:0:-;4420:4;996:42;4447:26;:7;4463:9;4447:15;:26::i;:::-;-1:-1:-1;;;;;4447:37:0;;;4310:181;-1:-1:-1;;;4310:181:0:o;3903:339::-;4059:4;4228:7;4188:6;4196:10;4208:5;4215;4171:50;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4171:50:0;;;;;;;;;;4161:61;;4171:50;4161:61;;;;33936:66:21;4096:127:0;;;33924:79:21;;;;34019:12;;;34012:28;34056:12;;4096:127:0;;;;;;;;;;;;4086:138;;;;;;:149;4079:156;;3903:339;;;;;;;:::o;6409:269:8:-;6522:28;6532:4;6538:2;6542:7;6522:9;:28::i;:::-;6568:48;6591:4;6597:2;6601:7;6610:5;6568:22;:48::i;:::-;6560:111;;;;-1:-1:-1;;;6560:111:8;;34281:2:21;6560:111:8;;;34263:21:21;34320:2;34300:18;;;34293:30;34359:34;34339:18;;;34332:62;34430:20;34410:18;;;34403:48;34468:19;;6560:111:8;34079:414:21;271:703:16;327:13;544:10;540:51;;-1:-1:-1;;570:10:16;;;;;;;;;;;;;;;;;;271:703::o;540:51::-;615:5;600:12;654:75;661:9;;654:75;;686:8;;;;:::i;:::-;;-1:-1:-1;708:10:16;;-1:-1:-1;716:2:16;708:10;;:::i;:::-;;;654:75;;;738:19;770:6;760:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;760:17:16;;738:39;;787:150;794:10;;787:150;;820:11;830:1;820:11;;:::i;:::-;;-1:-1:-1;888:10:16;896:2;888:5;:10;:::i;:::-;875:24;;:2;:24;:::i;:::-;862:39;;845:6;852;845:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;915:11:16;924:2;915:11;;:::i;:::-;;;787:150;;2107:396:6;2214:7;342:98;;;;;;;;;;;;;;;;;323:123;;;;;;;2362:12;;2396:11;;;;2439:24;;;;;2429:35;;;;;;2283:199;;;;;35160:25:21;;;35216:2;35201:18;;35194:34;;;;-1:-1:-1;;;;;35264:55:21;35259:2;35244:18;;35237:83;35351:2;35336:18;;35329:34;35147:3;35132:19;;34929:440;2283:199:6;;;;;;;;;;;;;2256:240;;;;;;2237:259;;2107:396;;;:::o;1884:249:4:-;1980:7;2078:20;1341:15;;;1264:99;2078:20;2049:63;;35644:66:21;2049:63:4;;;35632:79:21;35727:11;;;35720:27;;;;35763:12;;;35756:28;;;35800:12;;2049:63:4;35374:444:21;7938:108:8;8013:26;8023:2;8027:7;8013:26;;;;;;;;;;;;:9;:26::i;8558:347:0:-;8643:7;;8742:16;8757:1;8742:12;:16;:::i;:::-;8801:5;;8700:149;;;8732:27;;8700:149;;;36064:19:21;36102:66;8775:10:0;36206:2:21;36202:15;;;36198:24;;36184:12;;;36177:46;;;;36239:12;;;36232:28;;;;36276:12;;;36269:28;;;36332:15;;;36328:24;36313:13;;;36306:47;36369:13;;8700:149:0;;;;;;-1:-1:-1;;8700:149:0;;;;;;8679:171;;8700:149;8679:171;;;;8858:5;:21;;;8679:171;8558:347;-1:-1:-1;;;;8558:347:0:o;2556:542:11:-;-1:-1:-1;;;;;2725:18:11;;2721:183;;2759:40;2791:7;3907:10;:17;;3880:24;;;;:15;:24;;;;;:44;;;3934:24;;;;;;;;;;;;3804:161;2759:40;2721:183;;;2828:2;-1:-1:-1;;;;;2820:10:11;:4;-1:-1:-1;;;;;2820:10:11;;2816:88;;2846:47;2879:4;2885:7;2846:32;:47::i;:::-;-1:-1:-1;;;;;2917:16:11;;2913:179;;2949:45;2986:7;2949:36;:45::i;2913:179::-;3021:4;-1:-1:-1;;;;;3015:10:11;:2;-1:-1:-1;;;;;3015:10:11;;3011:81;;3041:40;3069:2;3073:7;3041:27;:40::i;1064:1459:17:-;1142:7;1217:9;1236;1255:7;1470:9;:16;1490:2;1470:22;1466:1011;;;-1:-1:-1;;;1752:4:17;1737:20;;1731:27;1801:4;1786:20;;1780:27;1858:4;1843:20;;1837:27;1834:1;1829:36;1466:1011;;;1899:9;:16;1919:2;1899:22;1895:582;;;-1:-1:-1;;;2186:4:17;2171:20;;2165:27;2235:4;2220:20;;2214:27;;2271:66;2263:75;;;2368:3;2364:12;2378:2;2360:21;1895:582;;;2425:41;;-1:-1:-1;;;2425:41:17;;36595:2:21;2425:41:17;;;36577:21:21;36634:2;36614:18;;;36607:30;36673:33;36653:18;;;36646:61;36724:18;;2425:41:17;36393:355:21;1895:582:17;2494:22;2502:4;2508:1;2511;2514;2494:7;:22::i;:::-;2487:29;1064:1459;-1:-1:-1;;;;;;1064:1459:17:o;11462:824:8:-;11582:4;-1:-1:-1;;;;;11606:13:8;;1078:20:14;1116:8;11602:678:8;;11657:2;-1:-1:-1;;;;;11641:36:8;;11678:12;:10;:12::i;:::-;11692:4;11698:7;11707:5;11641:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11641:72:8;;;;;;;;-1:-1:-1;;11641:72:8;;;;;;;;;;;;:::i;:::-;;;11637:591;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11884:13:8;;11880:334;;11926:60;;-1:-1:-1;;;11926:60:8;;34281:2:21;11926:60:8;;;34263:21:21;34320:2;34300:18;;;34293:30;34359:34;34339:18;;;34332:62;34430:20;34410:18;;;34403:48;34468:19;;11926:60:8;34079:414:21;11880:334:8;12166:6;12160:13;12151:6;12147:2;12143:15;12136:38;11637:591;11763:55;;11773:45;11763:55;;-1:-1:-1;11756:62:8;;11602:678;-1:-1:-1;12265:4:8;11462:824;;;;;;:::o;8267:247::-;8362:18;8368:2;8372:7;8362:5;:18::i;:::-;8398:54;8429:1;8433:2;8437:7;8446:5;8398:22;:54::i;:::-;8390:117;;;;-1:-1:-1;;;8390:117:8;;34281:2:21;8390:117:8;;;34263:21:21;34320:2;34300:18;;;34293:30;34359:34;34339:18;;;34332:62;34430:20;34410:18;;;34403:48;34468:19;;8390:117:8;34079:414:21;4582:970:11;4844:22;4894:1;4869:22;4886:4;4869:16;:22::i;:::-;:26;;;;:::i;:::-;4905:18;4926:26;;;:17;:26;;;;;;4844:51;;-1:-1:-1;5056:28:11;;;5052:323;;-1:-1:-1;;;;;5122:18:11;;5100:19;5122:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5171:30;;;;;;:44;;;5287:30;;:17;:30;;;;;:43;;;5052:323;-1:-1:-1;5468:26:11;;;;:17;:26;;;;;;;;5461:33;;;-1:-1:-1;;;;;5511:18:11;;;;;:12;:18;;;;;:34;;;;;;;5504:41;4582:970::o;5840:1061::-;6114:10;:17;6089:22;;6114:21;;6134:1;;6114:21;:::i;:::-;6145:18;6166:24;;;:15;:24;;;;;;6534:10;:26;;6089:46;;-1:-1:-1;6166:24:11;;6089:46;;6534:26;;;;;;:::i;:::-;;;;;;;;;6512:48;;6596:11;6571:10;6582;6571:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6675:28;;;:15;:28;;;;;;;:41;;;6844:24;;;;;6837:31;6878:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5911:990;;;5840:1061;:::o;3392:217::-;3476:14;3493:20;3510:2;3493:16;:20::i;:::-;-1:-1:-1;;;;;3523:16:11;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3567:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3392:217:11:o;2656:1414:17:-;2741:7;3656:66;3642:80;;;3634:127;;;;-1:-1:-1;;;3634:127:17;;37726:2:21;3634:127:17;;;37708:21:21;37765:2;37745:18;;;37738:30;37804:34;37784:18;;;37777:62;37875:4;37855:18;;;37848:32;37897:19;;3634:127:17;37524:398:21;3634:127:17;3779:1;:7;;3784:2;3779:7;:18;;;;3790:1;:7;;3795:2;3790:7;3779:18;3771:65;;;;-1:-1:-1;;;3771:65:17;;38129:2:21;3771:65:17;;;38111:21:21;38168:2;38148:18;;;38141:30;38207:34;38187:18;;;38180:62;38278:4;38258:18;;;38251:32;38300:19;;3771:65:17;37927:398:21;3771:65:17;3948:24;;;3931:14;3948:24;;;;;;;;;31723:25:21;;;31796:4;31784:17;;31764:18;;;31757:45;;;;31818:18;;;31811:34;;;31861:18;;;31854:34;;;3948:24:17;;31695:19:21;;3948:24:17;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3948:24:17;;-1:-1:-1;;3948:24:17;;;-1:-1:-1;;;;;;;3990:20:17;;3982:57;;;;-1:-1:-1;;;3982:57:17;;38532:2:21;3982:57:17;;;38514:21:21;38571:2;38551:18;;;38544:30;38610:26;38590:18;;;38583:54;38654:18;;3982:57:17;38330:348:21;3982:57:17;4057:6;2656:1414;-1:-1:-1;;;;;2656:1414:17:o;8836:372:8:-;-1:-1:-1;;;;;8915:16:8;;8907:61;;;;-1:-1:-1;;;8907:61:8;;38885:2:21;8907:61:8;;;38867:21:21;;;38904:18;;;38897:30;38963:34;38943:18;;;38936:62;39015:18;;8907:61:8;38683:356:21;8907:61:8;7046:4;7069:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7069:16:8;:30;8978:58;;;;-1:-1:-1;;;8978:58:8;;39246:2:21;8978:58:8;;;39228:21:21;39285:2;39265:18;;;39258:30;39324;39304:18;;;39297:58;39372:18;;8978:58:8;39044:352:21;8978:58:8;9047:45;9076:1;9080:2;9084:7;9047:20;:45::i;:::-;-1:-1:-1;;;;;9103:13:8;;;;;;:9;:13;;;;;:18;;9120:1;;9103:13;:18;;9120:1;;9103:18;:::i;:::-;;;;-1:-1:-1;;9131:16:8;;;;:7;:16;;;;;;:21;;-1:-1:-1;;9131:21:8;-1:-1:-1;;;;;9131:21:8;;;;;;;;9168:33;;9131:16;;;9168:33;;9131:16;;9168:33;8836:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:177:21;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:21;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;-1:-1:-1;;1116:88:21;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:21:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1448:180::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;-1:-1:-1;1599:23:21;;1448:180;-1:-1:-1;1448:180:21:o;1864:154::-;-1:-1:-1;;;;;1943:5:21;1939:54;1932:5;1929:65;1919:93;;2008:1;2005;1998:12;2023:315;2091:6;2099;2152:2;2140:9;2131:7;2127:23;2123:32;2120:52;;;2168:1;2165;2158:12;2120:52;2207:9;2194:23;2226:31;2251:5;2226:31;:::i;:::-;2276:5;2328:2;2313:18;;;;2300:32;;-1:-1:-1;;;2023:315:21:o;2343:184::-;-1:-1:-1;;;2392:1:21;2385:88;2492:4;2489:1;2482:15;2516:4;2513:1;2506:15;2532:777;2574:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:55;;2645:1;2642;2635:12;2594:55;2681:6;2668:20;2707:18;2744:2;2740;2737:10;2734:36;;;2750:18;;:::i;:::-;2884:2;2878:9;2946:4;2938:13;;-1:-1:-1;;2934:22:21;;;2958:2;2930:31;2926:40;2914:53;;;2982:18;;;3002:22;;;2979:46;2976:72;;;3028:18;;:::i;:::-;3068:10;3064:2;3057:22;3103:2;3095:6;3088:18;3149:3;3142:4;3137:2;3129:6;3125:15;3121:26;3118:35;3115:55;;;3166:1;3163;3156:12;3115:55;3230:2;3223:4;3215:6;3211:17;3204:4;3196:6;3192:17;3179:54;3277:1;3270:4;3265:2;3257:6;3253:15;3249:26;3242:37;3297:6;3288:15;;;;;;2532:777;;;;:::o;3314:758::-;3416:6;3424;3432;3440;3448;3501:3;3489:9;3480:7;3476:23;3472:33;3469:53;;;3518:1;3515;3508:12;3469:53;3557:9;3544:23;3576:31;3601:5;3576:31;:::i;:::-;3626:5;-1:-1:-1;3682:2:21;3667:18;;3654:32;3709:18;3698:30;;3695:50;;;3741:1;3738;3731:12;3695:50;3764:49;3805:7;3796:6;3785:9;3781:22;3764:49;:::i;:::-;3754:59;;;3860:2;3849:9;3845:18;3832:32;3822:42;;3911:2;3900:9;3896:18;3883:32;3873:42;;3967:3;3956:9;3952:19;3939:33;4016:4;4007:7;4003:18;3994:7;3991:31;3981:59;;4036:1;4033;4026:12;3981:59;4059:7;4049:17;;;3314:758;;;;;;;;:::o;4664:456::-;4741:6;4749;4757;4810:2;4798:9;4789:7;4785:23;4781:32;4778:52;;;4826:1;4823;4816:12;4778:52;4865:9;4852:23;4884:31;4909:5;4884:31;:::i;:::-;4934:5;-1:-1:-1;4991:2:21;4976:18;;4963:32;5004:33;4963:32;5004:33;:::i;:::-;4664:456;;5056:7;;-1:-1:-1;;;5110:2:21;5095:18;;;;5082:32;;4664:456::o;5125:247::-;5184:6;5237:2;5225:9;5216:7;5212:23;5208:32;5205:52;;;5253:1;5250;5243:12;5205:52;5292:9;5279:23;5311:31;5336:5;5311:31;:::i;5377:1210::-;5571:4;5600:2;5640;5629:9;5625:18;5670:2;5659:9;5652:21;5693:6;5728;5722:13;5759:6;5751;5744:22;5785:2;5775:12;;5818:2;5807:9;5803:18;5796:25;;5880:2;5870:6;5867:1;5863:14;5852:9;5848:30;5844:39;5918:2;5910:6;5906:15;5939:1;5949:609;5963:6;5960:1;5957:13;5949:609;;;6052:66;6040:9;6032:6;6028:22;6024:95;6019:3;6012:108;6149:6;6143:13;6195:2;6189:9;6226:2;6218:6;6211:18;6256:48;6300:2;6292:6;6288:15;6274:12;6256:48;:::i;:::-;6345:11;;;6339:18;6394:19;;;6377:15;;;6370:44;6339:18;6242:62;-1:-1:-1;6437:41:21;6242:62;6339:18;6437:41;:::i;:::-;6536:12;;;;6427:51;-1:-1:-1;;;6501:15:21;;;;5985:1;5978:9;5949:609;;;-1:-1:-1;6575:6:21;;5377:1210;-1:-1:-1;;;;;;;;5377:1210:21:o;7008:541::-;7096:6;7104;7157:2;7145:9;7136:7;7132:23;7128:32;7125:52;;;7173:1;7170;7163:12;7125:52;7213:9;7200:23;7242:18;7283:2;7275:6;7272:14;7269:34;;;7299:1;7296;7289:12;7269:34;7322:49;7363:7;7354:6;7343:9;7339:22;7322:49;:::i;:::-;7312:59;;7424:2;7413:9;7409:18;7396:32;7380:48;;7453:2;7443:8;7440:16;7437:36;;;7469:1;7466;7459:12;7437:36;;7492:51;7535:7;7524:8;7513:9;7509:24;7492:51;:::i;:::-;7482:61;;;7008:541;;;;;:::o;7554:746::-;7668:6;7676;7684;7692;7700;7753:3;7741:9;7732:7;7728:23;7724:33;7721:53;;;7770:1;7767;7760:12;7721:53;7806:9;7793:23;7783:33;;7867:2;7856:9;7852:18;7839:32;7890:18;7931:2;7923:6;7920:14;7917:34;;;7947:1;7944;7937:12;7917:34;7970:49;8011:7;8002:6;7991:9;7987:22;7970:49;:::i;:::-;7960:59;;8066:2;8055:9;8051:18;8038:32;8028:42;;8117:2;8106:9;8102:18;8089:32;8079:42;;8174:3;8163:9;8159:19;8146:33;8130:49;;8204:2;8194:8;8191:16;8188:36;;;8220:1;8217;8210:12;8188:36;;8243:51;8286:7;8275:8;8264:9;8260:24;8243:51;:::i;:::-;8233:61;;;7554:746;;;;;;;;:::o;8305:171::-;8372:20;;8432:18;8421:30;;8411:41;;8401:69;;8466:1;8463;8456:12;8401:69;8305:171;;;:::o;8481:514::-;8565:6;8573;8581;8589;8642:3;8630:9;8621:7;8617:23;8613:33;8610:53;;;8659:1;8656;8649:12;8610:53;8695:9;8682:23;8672:33;;8724:37;8757:2;8746:9;8742:18;8724:37;:::i;:::-;8714:47;;8780:37;8813:2;8802:9;8798:18;8780:37;:::i;:::-;8770:47;;8867:2;8856:9;8852:18;8839:32;8911:34;8904:5;8900:46;8893:5;8890:57;8880:85;;8961:1;8958;8951:12;8880:85;8481:514;;;;-1:-1:-1;8481:514:21;;-1:-1:-1;;8481:514:21:o;9000:416::-;9065:6;9073;9126:2;9114:9;9105:7;9101:23;9097:32;9094:52;;;9142:1;9139;9132:12;9094:52;9181:9;9168:23;9200:31;9225:5;9200:31;:::i;:::-;9250:5;-1:-1:-1;9307:2:21;9292:18;;9279:32;9349:15;;9342:23;9330:36;;9320:64;;9380:1;9377;9370:12;9320:64;9403:7;9393:17;;;9000:416;;;;;:::o;9421:383::-;9618:2;9607:9;9600:21;9581:4;9644:45;9685:2;9674:9;9670:18;9662:6;9644:45;:::i;:::-;9737:9;9729:6;9725:22;9720:2;9709:9;9705:18;9698:50;9765:33;9791:6;9783;9765:33;:::i;9809:665::-;9904:6;9912;9920;9928;9981:3;9969:9;9960:7;9956:23;9952:33;9949:53;;;9998:1;9995;9988:12;9949:53;10037:9;10024:23;10056:31;10081:5;10056:31;:::i;:::-;10106:5;-1:-1:-1;10163:2:21;10148:18;;10135:32;10176:33;10135:32;10176:33;:::i;:::-;10228:7;-1:-1:-1;10282:2:21;10267:18;;10254:32;;-1:-1:-1;10337:2:21;10322:18;;10309:32;10364:18;10353:30;;10350:50;;;10396:1;10393;10386:12;10350:50;10419:49;10460:7;10451:6;10440:9;10436:22;10419:49;:::i;:::-;10409:59;;;9809:665;;;;;;;:::o;10479:321::-;10548:6;10601:2;10589:9;10580:7;10576:23;10572:32;10569:52;;;10617:1;10614;10607:12;10569:52;10657:9;10644:23;10690:18;10682:6;10679:30;10676:50;;;10722:1;10719;10712:12;10676:50;10745:49;10786:7;10777:6;10766:9;10762:22;10745:49;:::i;10805:388::-;10873:6;10881;10934:2;10922:9;10913:7;10909:23;10905:32;10902:52;;;10950:1;10947;10940:12;10902:52;10989:9;10976:23;11008:31;11033:5;11008:31;:::i;:::-;11058:5;-1:-1:-1;11115:2:21;11100:18;;11087:32;11128:33;11087:32;11128:33;:::i;11198:437::-;11277:1;11273:12;;;;11320;;;11341:61;;11395:4;11387:6;11383:17;11373:27;;11341:61;11448:2;11440:6;11437:14;11417:18;11414:38;11411:218;;;-1:-1:-1;;;11482:1:21;11475:88;11586:4;11583:1;11576:15;11614:4;11611:1;11604:15;13282:455;13464:4;-1:-1:-1;;;;;13574:2:21;13566:6;13562:15;13551:9;13544:34;13626:2;13618:6;13614:15;13609:2;13598:9;13594:18;13587:43;;13666:2;13661;13650:9;13646:18;13639:30;13686:45;13727:2;13716:9;13712:18;13704:6;13686:45;:::i;13742:450::-;13899:3;13937:6;13931:13;13953:53;13999:6;13994:3;13987:4;13979:6;13975:17;13953:53;:::i;:::-;14075:2;14071:15;;;;14088:66;14067:88;14028:16;;;;14053:103;;;14183:2;14172:14;;13742:450;-1:-1:-1;;13742:450:21:o;14197:274::-;14326:3;14364:6;14358:13;14380:53;14426:6;14421:3;14414:4;14406:6;14402:17;14380:53;:::i;:::-;14449:16;;;;;14197:274;-1:-1:-1;;14197:274:21:o;16573:184::-;-1:-1:-1;;;16622:1:21;16615:88;16722:4;16719:1;16712:15;16746:4;16743:1;16736:15;16762:195;16801:3;-1:-1:-1;;16825:5:21;16822:77;16819:103;;;16902:18;;:::i;:::-;-1:-1:-1;16949:1:21;16938:13;;16762:195::o;17308:128::-;17348:3;17379:1;17375:6;17372:1;17369:13;17366:39;;;17385:18;;:::i;:::-;-1:-1:-1;17421:9:21;;17308:128::o;18620:184::-;-1:-1:-1;;;18669:1:21;18662:88;18769:4;18766:1;18759:15;18793:4;18790:1;18783:15;21442:228;21482:7;21608:1;-1:-1:-1;;21536:74:21;21533:1;21530:81;21525:1;21518:9;21511:17;21507:105;21504:131;;;21615:18;;:::i;:::-;-1:-1:-1;21655:9:21;;21442:228::o;25658:772::-;26039:3;26077:6;26071:13;26093:53;26139:6;26134:3;26127:4;26119:6;26115:17;26093:53;:::i;:::-;26207:3;26168:16;;;26193:18;;;26236:13;;26258:65;26236:13;26310:1;26299:13;;26292:4;26280:17;;26258:65;:::i;:::-;26390:7;26386:1;26342:20;;;;26378:10;;;26371:27;26422:1;26414:10;;25658:772;-1:-1:-1;;;;25658:772:21:o;26435:125::-;26475:4;26503:1;26500;26497:8;26494:34;;;26508:18;;:::i;:::-;-1:-1:-1;26545:9:21;;26435:125::o;26565:184::-;-1:-1:-1;;;26614:1:21;26607:88;26714:4;26711:1;26704:15;26738:4;26735:1;26728:15;26880:1088;26965:12;;26930:3;;27020:1;27040:18;;;;27093;;;;27120:61;;27174:4;27166:6;27162:17;27152:27;;27120:61;27200:2;27248;27240:6;27237:14;27217:18;27214:38;27211:218;;;-1:-1:-1;;;27282:1:21;27275:88;27386:4;27383:1;27376:15;27414:4;27411:1;27404:15;27211:218;27445:18;27472:162;;;;27648:1;27643:319;;;;27438:524;;27472:162;-1:-1:-1;;27509:9:21;27505:82;27500:3;27493:95;27617:6;27612:3;27608:16;27601:23;;27472:162;;27643:319;26827:1;26820:14;;;26864:4;26851:18;;27737:1;27751:165;27765:6;27762:1;27759:13;27751:165;;;27843:14;;27830:11;;;27823:35;27886:16;;;;27780:10;;27751:165;;;27755:3;;27945:6;27940:3;27936:16;27929:23;;27438:524;;;;;;;26880:1088;;;;:::o;27973:691::-;28351:3;28379:38;28413:3;28405:6;28379:38;:::i;:::-;28437:15;28433:2;28426:27;28482:6;28476:13;28498:61;28552:6;28547:2;28543;28539:11;28532:4;28524:6;28520:17;28498:61;:::i;:::-;28622:8;28617:2;28578:15;;;;28609:11;;;28602:29;28655:2;28647:11;;27973:691;-1:-1:-1;;;;27973:691:21:o;28669:694::-;29047:3;29075:38;29109:3;29101:6;29075:38;:::i;:::-;29133:15;29129:2;29122:27;29178:6;29172:13;29194:61;29248:6;29243:2;29239;29235:11;29228:4;29220:6;29216:17;29194:61;:::i;:::-;29318:11;29313:2;29274:15;;;;29305:11;;;29298:32;29354:2;29346:11;;28669:694;-1:-1:-1;;;;28669:694:21:o;29368:277::-;29464:6;29517:2;29505:9;29496:7;29492:23;29488:32;29485:52;;;29533:1;29530;29523:12;29485:52;29565:9;29559:16;29584:31;29609:5;29584:31;:::i;33127:562::-;33393:66;33384:6;33380:2;33376:15;33372:88;33367:3;33360:101;33491:6;33486:2;33481:3;33477:12;33470:28;33528:6;33523:2;33518:3;33514:12;33507:28;33342:3;33564:6;33558:13;33580:62;33635:6;33630:2;33625:3;33621:12;33614:4;33606:6;33602:17;33580:62;:::i;:::-;33662:16;;;;33680:2;33658:25;;33127:562;-1:-1:-1;;;;;33127:562:21:o;34498:184::-;-1:-1:-1;;;34547:1:21;34540:88;34647:4;34644:1;34637:15;34671:4;34668:1;34661:15;34687:120;34727:1;34753;34743:35;;34758:18;;:::i;:::-;-1:-1:-1;34792:9:21;;34687:120::o;34812:112::-;34844:1;34870;34860:35;;34875:18;;:::i;:::-;-1:-1:-1;34909:9:21;;34812:112::o;36753:512::-;36947:4;-1:-1:-1;;;;;37057:2:21;37049:6;37045:15;37034:9;37027:34;37109:2;37101:6;37097:15;37092:2;37081:9;37077:18;37070:43;;37149:6;37144:2;37133:9;37129:18;37122:34;37192:3;37187:2;37176:9;37172:18;37165:31;37213:46;37254:3;37243:9;37239:19;37231:6;37213:46;:::i;37270:249::-;37339:6;37392:2;37380:9;37371:7;37367:23;37363:32;37360:52;;;37408:1;37405;37398:12;37360:52;37440:9;37434:16;37459:30;37483:5;37459:30;:::i

Swarm Source

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