ETH Price: $3,345.33 (-1.29%)

Token

GEN.ART Drop (GENART)
 

Overview

Max Total Supply

11,716 GENART

Holders

2,663

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 GENART
0xf2439241881964006369c0e2377d45f3740f48a0
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

As a member of GEN.ART you’ll be able to mint exclusive NFT (ERC-721) artwork by world-renowned artists. We’re limiting membership to 5,100. As a lifetime member, you will not only be part of a special group of collectors and artists but have an active say in the future of GEN...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GenArtCollectionDrop

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-29
*/

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

/**
 * GEN.ART Collection Contract
 */

interface IGenArt {
    function getTokensByOwner(address owner)
        external
        view
        returns (uint256[] memory);

    function ownerOf(uint256 tokenId) external view returns (address);

    function isGoldToken(uint256 _tokenId) external view returns (bool);
}

interface IGenArtInterfaceV2 {
    function getMaxMintForMembership(uint256 _membershipId)
        external
        view
        returns (uint256);

    function getMaxMintForOwner(address owner) external view returns (uint256);

    function upgradeGenArtTokenContract(address _genArtTokenAddress) external;

    function setAllowGen(bool allow) external;

    function genAllowed() external view returns (bool);

    function isGoldToken(uint256 _membershipId) external view returns (bool);

    function transferFrom(
        address _from,
        address _to,
        uint256 _amount
    ) external;

    function getRandomChoice(uint256[] memory choices, uint256 seed)
        external
        view
        returns (uint256);

    function balanceOf(address _owner) external view returns (uint256);

    function ownerOf(uint256 _membershipId) external view returns (address);
}

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

/**
 * @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() {
        _setOwner(_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 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"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

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

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

    function reset(Counter storage counter) internal {
        counter._value = 10000;
    }
}

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "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 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;
        assembly {
            size := extcodesize(account)
        }
        return size > 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. 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;
        }
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @title ERC-721 Non-Fungible Token Standard, optional 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);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

/**
 * @dev Implementation of 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}.
 */

/**
 * GEN.ART Collection Drop Contract ERC721 Implementation
 */

contract GenArtCollectionDrop is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable,
    Ownable
{
    using Address for address;
    using Strings for uint256;
    using Counters for Counters.Counter;
    using SafeMath for uint256;

    struct CollectionGroup {
        uint256 tier;
        uint256 price;
        uint256 priceGen;
        uint256[] collections;
    }

    struct Collection {
        uint256 group;
        uint256 invocations;
        uint256 maxInvocations;
        string script;
        string script_type;
        uint256 artistPercentage;
        address artist;
    }

    event Mint(address to, uint256 collectionId, uint256 tokenId, bytes32 hash);
    mapping(uint256 => Collection) private _collectionsMap;
    mapping(uint256 => CollectionGroup) private _collectionGroupsMap;

    // Mapping collectionId to membershipId and total mints
    mapping(uint256 => mapping(uint256 => uint256)) private _collectionsMintMap;

    mapping(uint256 => bytes32) private _tokenIdToHashMap;
    mapping(uint256 => uint256) private _tokenIdToCollectionIdMap;
    Counters.Counter private _collectionIdCounter;
    IGenArtInterfaceV2 private _genArtInterface;
    uint256 private nonce;
    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Base URI
    string private _baseURI;

    // 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;

    // 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 Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        string memory uri_,
        address genArtInterfaceAddress_
    ) {
        _name = name_;
        _symbol = symbol_;
        _baseURI = uri_;
        _genArtInterface = IGenArtInterfaceV2(genArtInterfaceAddress_);
        _collectionIdCounter.reset();
    }

    modifier onlyArtist(uint256 _collectionId) {
        require(
            _collectionsMap[_collectionId].artist == _msgSender(),
            "GenArtCollectionDrop: only artist can call this function"
        );
        _;
    }

    function withdraw(uint256 value) public onlyOwner {
        address _owner = owner();
        payable(_owner).transfer(value);
    }

    function createGenCollectionGroup(
        uint256 _groupId,
        uint256 _tier,
        uint256 _price,
        uint256 _priceGen
    ) public onlyOwner {
        uint256[] memory _collections;
        _collectionGroupsMap[_groupId] = CollectionGroup({
            tier: _tier,
            price: _price,
            priceGen: _priceGen,
            collections: _collections
        });
    }

    function createGenCollection(
        address _artist,
        uint256 _artistPercentage,
        uint256 _maxInvocations,
        uint256 _groupId,
        string memory _script,
        string memory _script_type
    ) public onlyOwner {
        uint256 _collectionId = _collectionIdCounter.current();

        _collectionsMap[_collectionId] = Collection({
            group: _groupId,
            invocations: 0,
            maxInvocations: _maxInvocations,
            script: _script,
            script_type: _script_type,
            artistPercentage: _artistPercentage,
            artist: _artist
        });
        _collectionGroupsMap[_groupId].collections.push(_collectionId);
        _collectionIdCounter.increment();
    }

    function checkMint(
        address _sender,
        uint256 _groupId,
        uint256 _membershipId,
        uint256 _amount
    ) internal view returns (uint256[] memory) {
       
        require(
            _collectionGroupsMap[_groupId].tier != 0,
            "GenArtCollectionDrop: incorrect collection id"
        );
        uint256 counter;
        uint256[] memory collectionIds = new uint256[](10);
        uint256 remainingInvocations;
        for (
            uint256 i = 0;
            i < _collectionGroupsMap[_groupId].collections.length;
            i++
        ) {
            uint256 invocations = _collectionsMap[
                _collectionGroupsMap[_groupId].collections[i]
            ].maxInvocations -
                _collectionsMap[_collectionGroupsMap[_groupId].collections[i]]
                    .invocations;
            if (invocations > 0) {
                collectionIds[counter] = _collectionGroupsMap[_groupId]
                    .collections[i];
                counter++;
            }
            remainingInvocations += invocations;
        }
        uint256[] memory slicedCollectionIds = new uint256[](counter);
        for (uint256 j = 0; j < slicedCollectionIds.length; j++) {
            slicedCollectionIds[j] = collectionIds[j];
        }
        require(
            collectionIds.length > 0 && remainingInvocations >= _amount,
            "GenArtCollectionDrop: max invocations reached"
        );

        address _membershipOwner = _genArtInterface.ownerOf(_membershipId);
        require(
            _membershipOwner == _sender,
            "GenArtCollectionDrop: sender must be membership owner"
        );
        bool _isGoldMember = _genArtInterface.isGoldToken(_membershipId);
        uint256 _tier = _isGoldMember ? 2 : 1;
        require(
            _collectionGroupsMap[_groupId].tier == 3 ||
                _collectionGroupsMap[_groupId].tier == _tier,
            "GenArtCollectionDrop: no valid membership"
        );
        uint256 maxMint = getAllowedMintForMembership(_groupId, _membershipId);
        require(
            maxMint >= _amount,
            "GenArtCollectionDrop: no mints available"
        );

        return slicedCollectionIds;
    }

    function checkFunds(
        uint256 _groupId,
        uint256 _value,
        uint256 _amount,
        bool _isEthPayment
    ) internal view {
        if (_isEthPayment) {
            require(
                _collectionGroupsMap[_groupId].price.mul(_amount) <= _value,
                "GenArtCollectionDrop: incorrect amount sent"
            );
        } else {
            require(
                _collectionGroupsMap[_groupId].priceGen.mul(_amount) <= _value,
                "GenArtCollectionDrop: insufficient $GEN balance"
            );
        }
    }

    function mint(
        address _to,
        uint256 _groupId,
        uint256 _membershipId
    ) public payable {
        uint256[] memory collectionIds = checkMint(
            msg.sender,
            _groupId,
            _membershipId,
            1
        );
        checkFunds(_groupId, msg.value, 1, true);
        updateMintState(_groupId, _membershipId, 1);
        uint256 _collectionId = _mintOne(_to, collectionIds);
        splitFunds(msg.sender, _groupId, _collectionId, 1, true);
    }

    function mintGen(
        address _to,
        uint256 _groupId,
        uint256 _membershipId
    ) public {
        bool _genAllowed = _genArtInterface.genAllowed();
        require(
            _genAllowed,
            "GenArtCollectionDrop: Mint with $GENART not allowed"
        );
        uint256 balance = _genArtInterface.balanceOf(msg.sender);
        uint256[] memory collectionIds = checkMint(
            msg.sender,
            _groupId,
            _membershipId,
            1
        );
        checkFunds(_groupId, balance, 1, false);
        updateMintState(_groupId, _membershipId, 1);
        uint256 _collectionId = _mintOne(_to, collectionIds);
        splitFunds(msg.sender, _groupId, _collectionId, 1, false);
    }

    function mintMany(
        address _to,
        uint256 _groupId,
        uint256 _membershipId,
        uint256 _amount
    ) public payable {
        checkFunds(_groupId, msg.value, _amount, true);
        for (uint256 i = 0; i < _amount; i++) {
            mint(_to, _groupId, _membershipId);
        }
    }

    function mintManyGen(
        address _to,
        uint256 _groupId,
        uint256 _membershipId,
        uint256 _amount
    ) public {
        bool _genAllowed = _genArtInterface.genAllowed();
        require(
            _genAllowed,
            "GenArtCollectionDrop: Mint with $GENART not allowed"
        );
        uint256 balance = _genArtInterface.balanceOf(msg.sender);
        checkFunds(_groupId, balance, _amount, false);

        for (uint256 i = 0; i < _amount; i++) {
            mintGen(_to, _groupId, _membershipId);
        }
    }

    function _mintOne(address _to, uint256[] memory _collectionIds)
        internal
        virtual
        returns (uint256)
    {
        uint256 _collectionId = _genArtInterface.getRandomChoice(
            _collectionIds,
            nonce
        );
        nonce++;
        uint256 invocation = _collectionsMap[_collectionId].invocations + 1;
        uint256 _tokenId = _collectionId * 100_000 + invocation;
        _collectionsMap[_collectionId].invocations = invocation;

        bytes32 hash = keccak256(
            abi.encodePacked(invocation, block.number, block.timestamp, _to)
        );
        _tokenIdToHashMap[_tokenId] = hash;
        _tokenIdToCollectionIdMap[_tokenId] = _collectionId;

        _safeMint(_to, _tokenId);

        emit Mint(_to, _collectionId, _tokenId, hash);

        return _collectionId;
    }

    function splitFunds(
        address _sender,
        uint256 _groupId,
        uint256 _collectionId,
        uint256 _amount,
        bool _isEthPayment
    ) internal virtual {
        uint256 value = _isEthPayment
            ? _collectionGroupsMap[_groupId].price.mul(_amount)
            : _collectionGroupsMap[_groupId].priceGen.mul(_amount);
        address _owner = owner();
        uint256 artistReward = (value *
            _collectionsMap[_collectionId].artistPercentage) / 100;
        if (_isEthPayment) {
            payable(_collectionsMap[_collectionId].artist).transfer(
                artistReward
            );
        } else {
            _genArtInterface.transferFrom(
                _sender,
                _owner,
                value - artistReward
            );
            _genArtInterface.transferFrom(
                _sender,
                _collectionsMap[_collectionId].artist,
                artistReward
            );
        }
    }

    function getAllowedMintForMembership(uint256 _group, uint256 _membershipId)
        public
        view
        returns (uint256)
    {
        uint256 maxMint = _collectionGroupsMap[_group].tier == 2
            ? 1
            : _genArtInterface.getMaxMintForMembership(_membershipId);
        return maxMint - _collectionsMintMap[_group][_membershipId];
    }

    function updateMintState(
        uint256 _group,
        uint256 _membershipId,
        uint256 _amount
    ) internal virtual {
        _collectionsMintMap[_group][_membershipId] =
            _collectionsMintMap[_group][_membershipId] +
            _amount;
    }

    function updateArtistAddress(uint256 _collectionId, address _artist)
        public
        onlyArtist(_collectionId)
    {
        _collectionsMap[_collectionId].artist = _artist;
    }

    function updateScript(uint256 _collectionId, string memory _script)
        public
        onlyOwner
    {
        _collectionsMap[_collectionId].script = _script;
    }

    function upgradeGenArtInterfaceContract(address _genArtInterfaceAddress)
        public
        onlyOwner
    {
        _genArtInterface = IGenArtInterfaceV2(_genArtInterfaceAddress);
    }

    function updatePrice(
        uint256 _groupId,
        uint256 _price,
        uint256 _priceGen
    ) public onlyOwner {
        _collectionGroupsMap[_groupId].price = _price;
        _collectionGroupsMap[_groupId].priceGen = _priceGen;
    }

    function getTokensByOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }

        return tokenIds;
    }

    // /**
    //  * @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 ||
            interfaceId == type(IERC721Enumerable).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}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function baseURI() internal view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function setBaseURI(string memory baseURI_) public onlyOwner {
        _baseURI = baseURI_;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = GenArtCollectionDrop.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 = GenArtCollectionDrop.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) public {
        address owner = GenArtCollectionDrop.ownerOf(tokenId);
        require(
            _msgSender() == owner,
            "GenArtCollectionDrop: only token owner can burn"
        );
        _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(
            GenArtCollectionDrop.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(GenArtCollectionDrop.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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < GenArtCollectionDrop.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 < GenArtCollectionDrop.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 {
        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 = GenArtCollectionDrop.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 = GenArtCollectionDrop.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();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"uri_","type":"string"},{"internalType":"address","name":"genArtInterfaceAddress_","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":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"collectionId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_artist","type":"address"},{"internalType":"uint256","name":"_artistPercentage","type":"uint256"},{"internalType":"uint256","name":"_maxInvocations","type":"uint256"},{"internalType":"uint256","name":"_groupId","type":"uint256"},{"internalType":"string","name":"_script","type":"string"},{"internalType":"string","name":"_script_type","type":"string"}],"name":"createGenCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_groupId","type":"uint256"},{"internalType":"uint256","name":"_tier","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_priceGen","type":"uint256"}],"name":"createGenCollectionGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_group","type":"uint256"},{"internalType":"uint256","name":"_membershipId","type":"uint256"}],"name":"getAllowedMintForMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getTokensByOwner","outputs":[{"internalType":"uint256[]","name":"","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":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_groupId","type":"uint256"},{"internalType":"uint256","name":"_membershipId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_groupId","type":"uint256"},{"internalType":"uint256","name":"_membershipId","type":"uint256"}],"name":"mintGen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_groupId","type":"uint256"},{"internalType":"uint256","name":"_membershipId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintMany","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_groupId","type":"uint256"},{"internalType":"uint256","name":"_membershipId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintManyGen","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","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":"_collectionId","type":"uint256"},{"internalType":"address","name":"_artist","type":"address"}],"name":"updateArtistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_groupId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_priceGen","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionId","type":"uint256"},{"internalType":"string","name":"_script","type":"string"}],"name":"updateScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_genArtInterfaceAddress","type":"address"}],"name":"upgradeGenArtInterfaceContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200650338038062006503833981810160405281019062000037919062000323565b620000576200004b6200010460201b60201c565b6200010c60201b60201c565b83600990805190602001906200006f929190620001de565b5082600a908051906020019062000088929190620001de565b5081600b9080519060200190620000a1929190620001de565b5080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620000fa6006620001d060201b620022371760201c565b50505050620005c4565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612710816000018190555050565b828054620001ec90620004bb565b90600052602060002090601f0160209004810192826200021057600085556200025c565b82601f106200022b57805160ff19168380011785556200025c565b828001600101855582156200025c579182015b828111156200025b5782518255916020019190600101906200023e565b5b5090506200026b91906200026f565b5090565b5b808211156200028a57600081600090555060010162000270565b5090565b6000620002a56200029f846200041b565b620003f2565b905082815260208101848484011115620002c457620002c36200058a565b5b620002d184828562000485565b509392505050565b600081519050620002ea81620005aa565b92915050565b600082601f83011262000308576200030762000585565b5b81516200031a8482602086016200028e565b91505092915050565b6000806000806080858703121562000340576200033f62000594565b5b600085015167ffffffffffffffff8111156200036157620003606200058f565b5b6200036f87828801620002f0565b945050602085015167ffffffffffffffff8111156200039357620003926200058f565b5b620003a187828801620002f0565b935050604085015167ffffffffffffffff811115620003c557620003c46200058f565b5b620003d387828801620002f0565b9250506060620003e687828801620002d9565b91505092959194509250565b6000620003fe62000411565b90506200040c8282620004f1565b919050565b6000604051905090565b600067ffffffffffffffff82111562000439576200043862000556565b5b620004448262000599565b9050602081019050919050565b60006200045e8262000465565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620004a557808201518184015260208101905062000488565b83811115620004b5576000848401525b50505050565b60006002820490506001821680620004d457607f821691505b60208210811415620004eb57620004ea62000527565b5b50919050565b620004fc8262000599565b810181811067ffffffffffffffff821117156200051e576200051d62000556565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620005b58162000451565b8114620005c157600080fd5b50565b615f2f80620005d46000396000f3fe6080604052600436106101ee5760003560e01c806355f804b31161010d578063a22cb465116100a0578063c86e7a191161006f578063c86e7a19146106fd578063c87b56dd14610726578063e8d390de14610763578063e985e9c51461078c578063f2fde38b146107c9576101ee565b8063a22cb46514610645578063b155d57e1461066e578063b88d4fde14610697578063c65be562146106c0576101ee565b80637e3ca9ea116100dc5780637e3ca9ea146105aa5780638da5cb5b146105c657806395d89b41146105f1578063a1cf31381461061c576101ee565b806355f804b3146104de5780635845bfb1146105075780636352211e1461053057806370a082311461056d576101ee565b80632e1a7d4d1161018557806342842e0e1161015457806342842e0e1461042657806342966c681461044f5780634b411607146104785780634f6ccce7146104a1576101ee565b80632e1a7d4d1461035a5780632f745c59146103835780633efd9ae8146103c057806340398d67146103e9576101ee565b80630f436129116101c15780630f436129146102c1578063156e29f6146102ea57806318160ddd1461030657806323b872dd14610331576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190614356565b6107f2565b6040516102279190614d75565b60405180910390f35b34801561023c57600080fd5b5061024561093c565b6040516102529190614d90565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d91906143f9565b6109ce565b60405161028f9190614c40565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba919061416a565b610a53565b005b3480156102cd57600080fd5b506102e860048036038101906102e3919061452f565b610b6b565b005b61030460048036038101906102ff91906141aa565b610c22565b005b34801561031257600080fd5b5061031b610c6f565b6040516103289190615132565b60405180910390f35b34801561033d57600080fd5b5061035860048036038101906103539190614054565b610c7c565b005b34801561036657600080fd5b50610381600480360381019061037c91906143f9565b610cdc565b005b34801561038f57600080fd5b506103aa60048036038101906103a5919061416a565b610daf565b6040516103b79190615132565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e291906141fd565b610e54565b005b3480156103f557600080fd5b50610410600480360381019061040b9190613fba565b611026565b60405161041d9190614d23565b60405180910390f35b34801561043257600080fd5b5061044d60048036038101906104489190614054565b6110d4565b005b34801561045b57600080fd5b50610476600480360381019061047191906143f9565b6110f4565b005b34801561048457600080fd5b5061049f600480360381019061049a9190614582565b61127a565b005b3480156104ad57600080fd5b506104c860048036038101906104c391906143f9565b611371565b6040516104d59190615132565b60405180910390f35b3480156104ea57600080fd5b50610505600480360381019061050091906143b0565b6113e2565b005b34801561051357600080fd5b5061052e600480360381019061052991906141aa565b611478565b005b34801561053c57600080fd5b50610557600480360381019061055291906143f9565b61165c565b6040516105649190614c40565b60405180910390f35b34801561057957600080fd5b50610594600480360381019061058f9190613fba565b61170e565b6040516105a19190615132565b60405180910390f35b6105c460048036038101906105bf91906141fd565b6117c6565b005b3480156105d257600080fd5b506105db611803565b6040516105e89190614c40565b60405180910390f35b3480156105fd57600080fd5b5061060661182c565b6040516106139190614d90565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e9190613fba565b6118be565b005b34801561065157600080fd5b5061066c6004803603810190610667919061412a565b61197e565b005b34801561067a57600080fd5b5061069560048036038101906106909190614493565b611aff565b005b3480156106a357600080fd5b506106be60048036038101906106b991906140a7565b611baa565b005b3480156106cc57600080fd5b506106e760048036038101906106e291906144ef565b611c0c565b6040516106f49190615132565b60405180910390f35b34801561070957600080fd5b50610724600480360381019061071f9190614453565b611d1a565b005b34801561073257600080fd5b5061074d600480360381019061074891906143f9565b611e20565b60405161075a9190614d90565b60405180910390f35b34801561076f57600080fd5b5061078a60048036038101906107859190614264565b611ec8565b005b34801561079857600080fd5b506107b360048036038101906107ae9190614014565b6120ab565b6040516107c09190614d75565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb9190613fba565b61213f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108bd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061092557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610935575061093482612245565b5b9050919050565b60606009805461094b9061543a565b80601f01602080910402602001604051908101604052809291908181526020018280546109779061543a565b80156109c45780601f10610999576101008083540402835291602001916109c4565b820191906000526020600020905b8154815290600101906020018083116109a757829003601f168201915b5050505050905090565b60006109d9826122af565b610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f90614fd2565b60405180910390fd5b600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a5e8261165c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac690615072565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aee61231b565b73ffffffffffffffffffffffffffffffffffffffff161480610b1d5750610b1c81610b1761231b565b6120ab565b5b610b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5390614f12565b60405180910390fd5b610b668383612323565b505050565b610b7361231b565b73ffffffffffffffffffffffffffffffffffffffff16610b91611803565b73ffffffffffffffffffffffffffffffffffffffff1614610be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bde90614ff2565b60405180910390fd5b816002600085815260200190815260200160002060010181905550806002600085815260200190815260200160002060020181905550505050565b6000610c3133848460016123dc565b9050610c408334600180612993565b610c4c83836001612a7b565b6000610c588583612ad8565b9050610c68338583600180612cb8565b5050505050565b6000601280549050905090565b610c8d610c8761231b565b82612f4d565b610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc3906150b2565b60405180910390fd5b610cd783838361302b565b505050565b610ce461231b565b73ffffffffffffffffffffffffffffffffffffffff16610d02611803565b73ffffffffffffffffffffffffffffffffffffffff1614610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f90614ff2565b60405180910390fd5b6000610d62611803565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610daa573d6000803e3d6000fd5b505050565b6000610dba8361170e565b8210610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df290614dd2565b60405180910390fd5b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636feaa9666040518163ffffffff1660e01b815260040160206040518083038186803b158015610ebe57600080fd5b505afa158015610ed2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef69190614329565b905080610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90614f92565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610f959190614c40565b60206040518083038186803b158015610fad57600080fd5b505afa158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe59190614426565b9050610ff48582856000612993565b60005b8381101561101d5761100a878787611478565b80806110159061549d565b915050610ff7565b50505050505050565b606060006110338361170e565b905060008167ffffffffffffffff81111561105157611050615630565b5b60405190808252806020026020018201604052801561107f5781602001602082028036833780820191505090505b50905060005b828110156110c9576110978582610daf565b8282815181106110aa576110a9615601565b5b60200260200101818152505080806110c19061549d565b915050611085565b508092505050919050565b6110ef83838360405180602001604052806000815250611baa565b505050565b60006110ff8261165c565b90508073ffffffffffffffffffffffffffffffffffffffff1661112061231b565b73ffffffffffffffffffffffffffffffffffffffff1614611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d90615052565b60405180910390fd5b61118281600084613287565b61118d600083612323565b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111dd9190615346565b92505081905550600c600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61128261231b565b73ffffffffffffffffffffffffffffffffffffffff166112a0611803565b73ffffffffffffffffffffffffffffffffffffffff16146112f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ed90614ff2565b60405180910390fd5b6060604051806080016040528085815260200184815260200183815260200182815250600260008781526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003019080519060200190611366929190613d42565b509050505050505050565b600061137b610c6f565b82106113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b3906150f2565b60405180910390fd5b601282815481106113d0576113cf615601565b5b90600052602060002001549050919050565b6113ea61231b565b73ffffffffffffffffffffffffffffffffffffffff16611408611803565b73ffffffffffffffffffffffffffffffffffffffff161461145e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145590614ff2565b60405180910390fd5b80600b9080519060200190611474929190613d8f565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636feaa9666040518163ffffffff1660e01b815260040160206040518083038186803b1580156114e257600080fd5b505afa1580156114f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151a9190614329565b90508061155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155390614f92565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016115b99190614c40565b60206040518083038186803b1580156115d157600080fd5b505afa1580156115e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116099190614426565b9050600061161a33868660016123dc565b905061162a858360016000612993565b61163685856001612a7b565b60006116428783612ad8565b905061165333878360016000612cb8565b50505050505050565b600080600c600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fc90614f72565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561177f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177690614f52565b60405180910390fd5b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117d38334836001612993565b60005b818110156117fc576117e9858585610c22565b80806117f49061549d565b9150506117d6565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600a805461183b9061543a565b80601f01602080910402602001604051908101604052809291908181526020018280546118679061543a565b80156118b45780601f10611889576101008083540402835291602001916118b4565b820191906000526020600020905b81548152906001019060200180831161189757829003601f168201915b5050505050905090565b6118c661231b565b73ffffffffffffffffffffffffffffffffffffffff166118e4611803565b73ffffffffffffffffffffffffffffffffffffffff161461193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193190614ff2565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61198661231b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119eb90614eb2565b60405180910390fd5b80600f6000611a0161231b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611aae61231b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af39190614d75565b60405180910390a35050565b611b0761231b565b73ffffffffffffffffffffffffffffffffffffffff16611b25611803565b73ffffffffffffffffffffffffffffffffffffffff1614611b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7290614ff2565b60405180910390fd5b80600160008481526020019081526020016000206003019080519060200190611ba5929190613d8f565b505050565b611bbb611bb561231b565b83612f4d565b611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf1906150b2565b60405180910390fd5b611c0684848484613390565b50505050565b60008060028060008681526020019081526020016000206000015414611cdc57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8c6c1c8846040518263ffffffff1660e01b8152600401611c879190615132565b60206040518083038186803b158015611c9f57600080fd5b505afa158015611cb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd79190614426565b611cdf565b60015b90506003600085815260200190815260200160002060008481526020019081526020016000205481611d119190615346565b91505092915050565b81611d2361231b565b73ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbd90614db2565b60405180910390fd5b816001600085815260200190815260200160002060060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6060611e2b826122af565b611e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6190615032565b60405180910390fd5b6000600b8054611e799061543a565b905011611e955760405180602001604052806000815250611ec1565b600b611ea0836133ec565b604051602001611eb1929190614bce565b6040516020818303038152906040525b9050919050565b611ed061231b565b73ffffffffffffffffffffffffffffffffffffffff16611eee611803565b73ffffffffffffffffffffffffffffffffffffffff1614611f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3b90614ff2565b60405180910390fd5b6000611f50600661354d565b90506040518060e00160405280858152602001600081526020018681526020018481526020018381526020018781526020018873ffffffffffffffffffffffffffffffffffffffff16815250600160008381526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003019080519060200190611fe9929190613d8f565b506080820151816004019080519060200190612006929190613d8f565b5060a0820151816005015560c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600260008581526020019081526020016000206003018190806001815401808255809150506001900390600052602060002001600090919091909150556120a2600661355b565b50505050505050565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61214761231b565b73ffffffffffffffffffffffffffffffffffffffff16612165611803565b73ffffffffffffffffffffffffffffffffffffffff16146121bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b290614ff2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561222b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222290614e12565b60405180910390fd5b61223481613571565b50565b612710816000018190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16600c600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b81600e600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123968361165c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060600060026000868152602001908152602001600020600001541415612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f906150d2565b60405180910390fd5b600080600a67ffffffffffffffff81111561245657612455615630565b5b6040519080825280602002602001820160405280156124845781602001602082028036833780820191505090505b509050600080600090505b60026000898152602001908152602001600020600301805490508110156125dc57600060016000600260008c815260200190815260200160002060030184815481106124de576124dd615601565b5b906000526020600020015481526020019081526020016000206001015460016000600260008d8152602001908152602001600020600301858154811061252757612526615601565b5b906000526020600020015481526020019081526020016000206002015461254e9190615346565b905060008111156125ba57600260008a8152602001908152602001600020600301828154811061258157612580615601565b5b906000526020600020015484868151811061259f5761259e615601565b5b60200260200101818152505084806125b69061549d565b9550505b80836125c69190615265565b92505080806125d49061549d565b91505061248f565b5060008367ffffffffffffffff8111156125f9576125f8615630565b5b6040519080825280602002602001820160405280156126275781602001602082028036833780820191505090505b50905060005b81518110156126835783818151811061264957612648615601565b5b602002602001015182828151811061266457612663615601565b5b602002602001018181525050808061267b9061549d565b91505061262d565b50600083511180156126955750858210155b6126d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cb90615092565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e896040518263ffffffff1660e01b81526004016127319190615132565b60206040518083038186803b15801561274957600080fd5b505afa15801561275d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127819190613fe7565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e890614e52565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f4ed4d158a6040518263ffffffff1660e01b815260040161284e9190615132565b60206040518083038186803b15801561286657600080fd5b505afa15801561287a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289e9190614329565b90506000816128ae5760016128b1565b60025b60ff1690506003600260008d81526020019081526020016000206000015414806128f0575080600260008d815260200190815260200160002060000154145b61292f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292690615112565b60405180910390fd5b600061293b8c8c611c0c565b905089811015612980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297790614e72565b60405180910390fd5b8498505050505050505050949350505050565b8015612a0957826129c383600260008881526020019081526020016000206001015461363590919063ffffffff16565b1115612a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fb90614ef2565b60405180910390fd5b612a75565b82612a3383600260008881526020019081526020016000206002015461363590919063ffffffff16565b1115612a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6b90614f32565b60405180910390fd5b5b50505050565b8060036000858152602001908152602001600020600084815260200190815260200160002054612aab9190615265565b60036000858152602001908152602001600020600084815260200190815260200160002081905550505050565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c84d366846008546040518363ffffffff1660e01b8152600401612b3a929190614d45565b60206040518083038186803b158015612b5257600080fd5b505afa158015612b66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8a9190614426565b905060086000815480929190612b9f9061549d565b91905055506000600180600084815260200190815260200160002060010154612bc89190615265565b9050600081620186a084612bdc91906152ec565b612be69190615265565b9050816001600085815260200190815260200160002060010181905550600082434289604051602001612c1c9493929190614bf2565b604051602081830303815290604052805190602001209050806004600084815260200190815260200160002081905550836005600084815260200190815260200160002081905550612c6e878361364b565b7fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d87858484604051612ca39493929190614cde565b60405180910390a18394505050505092915050565b600081612ced57612ce883600260008881526020019081526020016000206002015461363590919063ffffffff16565b612d17565b612d1683600260008881526020019081526020016000206001015461363590919063ffffffff16565b5b90506000612d23611803565b905060006064600160008881526020019081526020016000206005015484612d4b91906152ec565b612d5591906152bb565b90508315612ddf576001600087815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612dd9573d6000803e3d6000fd5b50612f43565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd89848487612e2b9190615346565b6040518463ffffffff1660e01b8152600401612e4993929190614c5b565b600060405180830381600087803b158015612e6357600080fd5b505af1158015612e77573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd89600160008a815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401612f1093929190614c5b565b600060405180830381600087803b158015612f2a57600080fd5b505af1158015612f3e573d6000803e3d6000fd5b505050505b5050505050505050565b6000612f58826122af565b612f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8e90614ed2565b60405180910390fd5b6000612fa28361165c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061301157508373ffffffffffffffffffffffffffffffffffffffff16612ff9846109ce565b73ffffffffffffffffffffffffffffffffffffffff16145b80613022575061302181856120ab565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661304b8261165c565b73ffffffffffffffffffffffffffffffffffffffff16146130a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309890615012565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310890614e92565b60405180910390fd5b61311c838383613287565b613127600082612323565b6001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131779190615346565b925050819055506001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131ce9190615265565b9250508190555081600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132ca576132c581613669565b613309565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146133085761330783826136b2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561334c576133478161381f565b61338b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461338a5761338982826138f0565b5b5b505050565b61339b84848461302b565b6133a78484848461396f565b6133e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dd90614df2565b60405180910390fd5b50505050565b60606000821415613434576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613548565b600082905060005b6000821461346657808061344f9061549d565b915050600a8261345f91906152bb565b915061343c565b60008167ffffffffffffffff81111561348257613481615630565b5b6040519080825280601f01601f1916602001820160405280156134b45781602001600182028036833780820191505090505b5090505b60008514613541576001826134cd9190615346565b9150600a856134dc9190615514565b60306134e89190615265565b60f81b8183815181106134fe576134fd615601565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561353a91906152bb565b94506134b8565b8093505050505b919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361364391906152ec565b905092915050565b613665828260405180602001604052806000815250613b06565b5050565b6012805490506013600083815260200190815260200160002081905550601281908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136bf8461170e565b6136c99190615346565b90506000601160008481526020019081526020016000205490508181146137ae576000601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816011600083815260200190815260200160002081905550505b6011600084815260200190815260200160002060009055601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016012805490506138339190615346565b905060006013600084815260200190815260200160002054905060006012838154811061386357613862615601565b5b90600052602060002001549050806012838154811061388557613884615601565b5b9060005260206000200181905550816013600083815260200190815260200160002081905550601360008581526020019081526020016000206000905560128054806138d4576138d36155d2565b5b6001900381819060005260206000200160009055905550505050565b60006138fb8361170e565b905081601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806011600084815260200190815260200160002081905550505050565b60006139908473ffffffffffffffffffffffffffffffffffffffff16613b61565b15613af9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139b961231b565b8786866040518563ffffffff1660e01b81526004016139db9493929190614c92565b602060405180830381600087803b1580156139f557600080fd5b505af1925050508015613a2657506040513d601f19601f82011682018060405250810190613a239190614383565b60015b613aa9573d8060008114613a56576040519150601f19603f3d011682016040523d82523d6000602084013e613a5b565b606091505b50600081511415613aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a9890614df2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613afe565b600190505b949350505050565b613b108383613b74565b613b1d600084848461396f565b613b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5390614df2565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bdb90614fb2565b60405180910390fd5b613bed816122af565b15613c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c2490614e32565b60405180910390fd5b613c3960008383613287565b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c899190615265565b9250508190555081600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054828255906000526020600020908101928215613d7e579160200282015b82811115613d7d578251825591602001919060010190613d62565b5b509050613d8b9190613e15565b5090565b828054613d9b9061543a565b90600052602060002090601f016020900481019282613dbd5760008555613e04565b82601f10613dd657805160ff1916838001178555613e04565b82800160010185558215613e04579182015b82811115613e03578251825591602001919060010190613de8565b5b509050613e119190613e15565b5090565b5b80821115613e2e576000816000905550600101613e16565b5090565b6000613e45613e4084615172565b61514d565b905082815260208101848484011115613e6157613e60615664565b5b613e6c8482856153f8565b509392505050565b6000613e87613e82846151a3565b61514d565b905082815260208101848484011115613ea357613ea2615664565b5b613eae8482856153f8565b509392505050565b600081359050613ec581615e9d565b92915050565b600081519050613eda81615e9d565b92915050565b600081359050613eef81615eb4565b92915050565b600081519050613f0481615eb4565b92915050565b600081359050613f1981615ecb565b92915050565b600081519050613f2e81615ecb565b92915050565b600082601f830112613f4957613f4861565f565b5b8135613f59848260208601613e32565b91505092915050565b600082601f830112613f7757613f7661565f565b5b8135613f87848260208601613e74565b91505092915050565b600081359050613f9f81615ee2565b92915050565b600081519050613fb481615ee2565b92915050565b600060208284031215613fd057613fcf61566e565b5b6000613fde84828501613eb6565b91505092915050565b600060208284031215613ffd57613ffc61566e565b5b600061400b84828501613ecb565b91505092915050565b6000806040838503121561402b5761402a61566e565b5b600061403985828601613eb6565b925050602061404a85828601613eb6565b9150509250929050565b60008060006060848603121561406d5761406c61566e565b5b600061407b86828701613eb6565b935050602061408c86828701613eb6565b925050604061409d86828701613f90565b9150509250925092565b600080600080608085870312156140c1576140c061566e565b5b60006140cf87828801613eb6565b94505060206140e087828801613eb6565b93505060406140f187828801613f90565b925050606085013567ffffffffffffffff81111561411257614111615669565b5b61411e87828801613f34565b91505092959194509250565b600080604083850312156141415761414061566e565b5b600061414f85828601613eb6565b925050602061416085828601613ee0565b9150509250929050565b600080604083850312156141815761418061566e565b5b600061418f85828601613eb6565b92505060206141a085828601613f90565b9150509250929050565b6000806000606084860312156141c3576141c261566e565b5b60006141d186828701613eb6565b93505060206141e286828701613f90565b92505060406141f386828701613f90565b9150509250925092565b600080600080608085870312156142175761421661566e565b5b600061422587828801613eb6565b945050602061423687828801613f90565b935050604061424787828801613f90565b925050606061425887828801613f90565b91505092959194509250565b60008060008060008060c087890312156142815761428061566e565b5b600061428f89828a01613eb6565b96505060206142a089828a01613f90565b95505060406142b189828a01613f90565b94505060606142c289828a01613f90565b935050608087013567ffffffffffffffff8111156142e3576142e2615669565b5b6142ef89828a01613f62565b92505060a087013567ffffffffffffffff8111156143105761430f615669565b5b61431c89828a01613f62565b9150509295509295509295565b60006020828403121561433f5761433e61566e565b5b600061434d84828501613ef5565b91505092915050565b60006020828403121561436c5761436b61566e565b5b600061437a84828501613f0a565b91505092915050565b6000602082840312156143995761439861566e565b5b60006143a784828501613f1f565b91505092915050565b6000602082840312156143c6576143c561566e565b5b600082013567ffffffffffffffff8111156143e4576143e3615669565b5b6143f084828501613f62565b91505092915050565b60006020828403121561440f5761440e61566e565b5b600061441d84828501613f90565b91505092915050565b60006020828403121561443c5761443b61566e565b5b600061444a84828501613fa5565b91505092915050565b6000806040838503121561446a5761446961566e565b5b600061447885828601613f90565b925050602061448985828601613eb6565b9150509250929050565b600080604083850312156144aa576144a961566e565b5b60006144b885828601613f90565b925050602083013567ffffffffffffffff8111156144d9576144d8615669565b5b6144e585828601613f62565b9150509250929050565b600080604083850312156145065761450561566e565b5b600061451485828601613f90565b925050602061452585828601613f90565b9150509250929050565b6000806000606084860312156145485761454761566e565b5b600061455686828701613f90565b935050602061456786828701613f90565b925050604061457886828701613f90565b9150509250925092565b6000806000806080858703121561459c5761459b61566e565b5b60006145aa87828801613f90565b94505060206145bb87828801613f90565b93505060406145cc87828801613f90565b92505060606145dd87828801613f90565b91505092959194509250565b60006145f58383614b99565b60208301905092915050565b61460a8161537a565b82525050565b61462161461c8261537a565b6154e6565b82525050565b6000614632826151f9565b61463c8185615227565b9350614647836151d4565b8060005b8381101561467857815161465f88826145e9565b975061466a8361521a565b92505060018101905061464b565b5085935050505092915050565b61468e8161538c565b82525050565b61469d81615398565b82525050565b60006146ae82615204565b6146b88185615238565b93506146c8818560208601615407565b6146d181615673565b840191505092915050565b60006146e78261520f565b6146f18185615249565b9350614701818560208601615407565b61470a81615673565b840191505092915050565b60006147208261520f565b61472a818561525a565b935061473a818560208601615407565b80840191505092915050565b600081546147538161543a565b61475d818661525a565b945060018216600081146147785760018114614789576147bc565b60ff198316865281860193506147bc565b614792856151e4565b60005b838110156147b457815481890152600182019150602081019050614795565b838801955050505b50505092915050565b60006147d2603883615249565b91506147dd82615691565b604082019050919050565b60006147f5602b83615249565b9150614800826156e0565b604082019050919050565b6000614818603283615249565b91506148238261572f565b604082019050919050565b600061483b602683615249565b91506148468261577e565b604082019050919050565b600061485e601c83615249565b9150614869826157cd565b602082019050919050565b6000614881603583615249565b915061488c826157f6565b604082019050919050565b60006148a4602883615249565b91506148af82615845565b604082019050919050565b60006148c7602483615249565b91506148d282615894565b604082019050919050565b60006148ea601983615249565b91506148f5826158e3565b602082019050919050565b600061490d602c83615249565b91506149188261590c565b604082019050919050565b6000614930602b83615249565b915061493b8261595b565b604082019050919050565b6000614953603883615249565b915061495e826159aa565b604082019050919050565b6000614976602f83615249565b9150614981826159f9565b604082019050919050565b6000614999602a83615249565b91506149a482615a48565b604082019050919050565b60006149bc602983615249565b91506149c782615a97565b604082019050919050565b60006149df603383615249565b91506149ea82615ae6565b604082019050919050565b6000614a02602083615249565b9150614a0d82615b35565b602082019050919050565b6000614a25602c83615249565b9150614a3082615b5e565b604082019050919050565b6000614a48602083615249565b9150614a5382615bad565b602082019050919050565b6000614a6b602983615249565b9150614a7682615bd6565b604082019050919050565b6000614a8e602f83615249565b9150614a9982615c25565b604082019050919050565b6000614ab1602f83615249565b9150614abc82615c74565b604082019050919050565b6000614ad4602183615249565b9150614adf82615cc3565b604082019050919050565b6000614af7602d83615249565b9150614b0282615d12565b604082019050919050565b6000614b1a603183615249565b9150614b2582615d61565b604082019050919050565b6000614b3d602d83615249565b9150614b4882615db0565b604082019050919050565b6000614b60602c83615249565b9150614b6b82615dff565b604082019050919050565b6000614b83602983615249565b9150614b8e82615e4e565b604082019050919050565b614ba2816153ee565b82525050565b614bb1816153ee565b82525050565b614bc8614bc3826153ee565b61550a565b82525050565b6000614bda8285614746565b9150614be68284614715565b91508190509392505050565b6000614bfe8287614bb7565b602082019150614c0e8286614bb7565b602082019150614c1e8285614bb7565b602082019150614c2e8284614610565b60148201915081905095945050505050565b6000602082019050614c556000830184614601565b92915050565b6000606082019050614c706000830186614601565b614c7d6020830185614601565b614c8a6040830184614ba8565b949350505050565b6000608082019050614ca76000830187614601565b614cb46020830186614601565b614cc16040830185614ba8565b8181036060830152614cd381846146a3565b905095945050505050565b6000608082019050614cf36000830187614601565b614d006020830186614ba8565b614d0d6040830185614ba8565b614d1a6060830184614694565b95945050505050565b60006020820190508181036000830152614d3d8184614627565b905092915050565b60006040820190508181036000830152614d5f8185614627565b9050614d6e6020830184614ba8565b9392505050565b6000602082019050614d8a6000830184614685565b92915050565b60006020820190508181036000830152614daa81846146dc565b905092915050565b60006020820190508181036000830152614dcb816147c5565b9050919050565b60006020820190508181036000830152614deb816147e8565b9050919050565b60006020820190508181036000830152614e0b8161480b565b9050919050565b60006020820190508181036000830152614e2b8161482e565b9050919050565b60006020820190508181036000830152614e4b81614851565b9050919050565b60006020820190508181036000830152614e6b81614874565b9050919050565b60006020820190508181036000830152614e8b81614897565b9050919050565b60006020820190508181036000830152614eab816148ba565b9050919050565b60006020820190508181036000830152614ecb816148dd565b9050919050565b60006020820190508181036000830152614eeb81614900565b9050919050565b60006020820190508181036000830152614f0b81614923565b9050919050565b60006020820190508181036000830152614f2b81614946565b9050919050565b60006020820190508181036000830152614f4b81614969565b9050919050565b60006020820190508181036000830152614f6b8161498c565b9050919050565b60006020820190508181036000830152614f8b816149af565b9050919050565b60006020820190508181036000830152614fab816149d2565b9050919050565b60006020820190508181036000830152614fcb816149f5565b9050919050565b60006020820190508181036000830152614feb81614a18565b9050919050565b6000602082019050818103600083015261500b81614a3b565b9050919050565b6000602082019050818103600083015261502b81614a5e565b9050919050565b6000602082019050818103600083015261504b81614a81565b9050919050565b6000602082019050818103600083015261506b81614aa4565b9050919050565b6000602082019050818103600083015261508b81614ac7565b9050919050565b600060208201905081810360008301526150ab81614aea565b9050919050565b600060208201905081810360008301526150cb81614b0d565b9050919050565b600060208201905081810360008301526150eb81614b30565b9050919050565b6000602082019050818103600083015261510b81614b53565b9050919050565b6000602082019050818103600083015261512b81614b76565b9050919050565b60006020820190506151476000830184614ba8565b92915050565b6000615157615168565b9050615163828261546c565b919050565b6000604051905090565b600067ffffffffffffffff82111561518d5761518c615630565b5b61519682615673565b9050602081019050919050565b600067ffffffffffffffff8211156151be576151bd615630565b5b6151c782615673565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615270826153ee565b915061527b836153ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152b0576152af615545565b5b828201905092915050565b60006152c6826153ee565b91506152d1836153ee565b9250826152e1576152e0615574565b5b828204905092915050565b60006152f7826153ee565b9150615302836153ee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561533b5761533a615545565b5b828202905092915050565b6000615351826153ee565b915061535c836153ee565b92508282101561536f5761536e615545565b5b828203905092915050565b6000615385826153ce565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561542557808201518184015260208101905061540a565b83811115615434576000848401525b50505050565b6000600282049050600182168061545257607f821691505b60208210811415615466576154656155a3565b5b50919050565b61547582615673565b810181811067ffffffffffffffff8211171561549457615493615630565b5b80604052505050565b60006154a8826153ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154db576154da615545565b5b600182019050919050565b60006154f1826154f8565b9050919050565b600061550382615684565b9050919050565b6000819050919050565b600061551f826153ee565b915061552a836153ee565b92508261553a57615539615574565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f47656e417274436f6c6c656374696f6e44726f703a206f6e6c7920617274697360008201527f742063616e2063616c6c20746869732066756e6374696f6e0000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f47656e417274436f6c6c656374696f6e44726f703a2073656e646572206d757360008201527f74206265206d656d62657273686970206f776e65720000000000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a206e6f206d696e7473206160008201527f7661696c61626c65000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a20696e636f72726563742060008201527f616d6f756e742073656e74000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a20696e737566666963696560008201527f6e74202447454e2062616c616e63650000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a204d696e7420776974682060008201527f2447454e415254206e6f7420616c6c6f77656400000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a206f6e6c7920746f6b656e60008201527f206f776e65722063616e206275726e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a206d617820696e766f636160008201527f74696f6e73207265616368656400000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a20696e636f72726563742060008201527f636f6c6c656374696f6e20696400000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a206e6f2076616c6964206d60008201527f656d626572736869700000000000000000000000000000000000000000000000602082015250565b615ea68161537a565b8114615eb157600080fd5b50565b615ebd8161538c565b8114615ec857600080fd5b50565b615ed4816153a2565b8114615edf57600080fd5b50565b615eeb816153ee565b8114615ef657600080fd5b5056fea2646970667358221220a9e43c6f1794ca66e46c9bf129bdaa787f9f03a52fd6bccbc3e79c865a2f537d64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000f368f333fdbc6393e617eeb6adc421b5de352cc8000000000000000000000000000000000000000000000000000000000000000c47454e2e4152542044726f700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000647454e4152540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f6170692e67656e2e6172742f7075626c69632f617474726962757465732f0000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c806355f804b31161010d578063a22cb465116100a0578063c86e7a191161006f578063c86e7a19146106fd578063c87b56dd14610726578063e8d390de14610763578063e985e9c51461078c578063f2fde38b146107c9576101ee565b8063a22cb46514610645578063b155d57e1461066e578063b88d4fde14610697578063c65be562146106c0576101ee565b80637e3ca9ea116100dc5780637e3ca9ea146105aa5780638da5cb5b146105c657806395d89b41146105f1578063a1cf31381461061c576101ee565b806355f804b3146104de5780635845bfb1146105075780636352211e1461053057806370a082311461056d576101ee565b80632e1a7d4d1161018557806342842e0e1161015457806342842e0e1461042657806342966c681461044f5780634b411607146104785780634f6ccce7146104a1576101ee565b80632e1a7d4d1461035a5780632f745c59146103835780633efd9ae8146103c057806340398d67146103e9576101ee565b80630f436129116101c15780630f436129146102c1578063156e29f6146102ea57806318160ddd1461030657806323b872dd14610331576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190614356565b6107f2565b6040516102279190614d75565b60405180910390f35b34801561023c57600080fd5b5061024561093c565b6040516102529190614d90565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d91906143f9565b6109ce565b60405161028f9190614c40565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba919061416a565b610a53565b005b3480156102cd57600080fd5b506102e860048036038101906102e3919061452f565b610b6b565b005b61030460048036038101906102ff91906141aa565b610c22565b005b34801561031257600080fd5b5061031b610c6f565b6040516103289190615132565b60405180910390f35b34801561033d57600080fd5b5061035860048036038101906103539190614054565b610c7c565b005b34801561036657600080fd5b50610381600480360381019061037c91906143f9565b610cdc565b005b34801561038f57600080fd5b506103aa60048036038101906103a5919061416a565b610daf565b6040516103b79190615132565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e291906141fd565b610e54565b005b3480156103f557600080fd5b50610410600480360381019061040b9190613fba565b611026565b60405161041d9190614d23565b60405180910390f35b34801561043257600080fd5b5061044d60048036038101906104489190614054565b6110d4565b005b34801561045b57600080fd5b50610476600480360381019061047191906143f9565b6110f4565b005b34801561048457600080fd5b5061049f600480360381019061049a9190614582565b61127a565b005b3480156104ad57600080fd5b506104c860048036038101906104c391906143f9565b611371565b6040516104d59190615132565b60405180910390f35b3480156104ea57600080fd5b50610505600480360381019061050091906143b0565b6113e2565b005b34801561051357600080fd5b5061052e600480360381019061052991906141aa565b611478565b005b34801561053c57600080fd5b50610557600480360381019061055291906143f9565b61165c565b6040516105649190614c40565b60405180910390f35b34801561057957600080fd5b50610594600480360381019061058f9190613fba565b61170e565b6040516105a19190615132565b60405180910390f35b6105c460048036038101906105bf91906141fd565b6117c6565b005b3480156105d257600080fd5b506105db611803565b6040516105e89190614c40565b60405180910390f35b3480156105fd57600080fd5b5061060661182c565b6040516106139190614d90565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e9190613fba565b6118be565b005b34801561065157600080fd5b5061066c6004803603810190610667919061412a565b61197e565b005b34801561067a57600080fd5b5061069560048036038101906106909190614493565b611aff565b005b3480156106a357600080fd5b506106be60048036038101906106b991906140a7565b611baa565b005b3480156106cc57600080fd5b506106e760048036038101906106e291906144ef565b611c0c565b6040516106f49190615132565b60405180910390f35b34801561070957600080fd5b50610724600480360381019061071f9190614453565b611d1a565b005b34801561073257600080fd5b5061074d600480360381019061074891906143f9565b611e20565b60405161075a9190614d90565b60405180910390f35b34801561076f57600080fd5b5061078a60048036038101906107859190614264565b611ec8565b005b34801561079857600080fd5b506107b360048036038101906107ae9190614014565b6120ab565b6040516107c09190614d75565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb9190613fba565b61213f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108bd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061092557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610935575061093482612245565b5b9050919050565b60606009805461094b9061543a565b80601f01602080910402602001604051908101604052809291908181526020018280546109779061543a565b80156109c45780601f10610999576101008083540402835291602001916109c4565b820191906000526020600020905b8154815290600101906020018083116109a757829003601f168201915b5050505050905090565b60006109d9826122af565b610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f90614fd2565b60405180910390fd5b600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a5e8261165c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac690615072565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aee61231b565b73ffffffffffffffffffffffffffffffffffffffff161480610b1d5750610b1c81610b1761231b565b6120ab565b5b610b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5390614f12565b60405180910390fd5b610b668383612323565b505050565b610b7361231b565b73ffffffffffffffffffffffffffffffffffffffff16610b91611803565b73ffffffffffffffffffffffffffffffffffffffff1614610be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bde90614ff2565b60405180910390fd5b816002600085815260200190815260200160002060010181905550806002600085815260200190815260200160002060020181905550505050565b6000610c3133848460016123dc565b9050610c408334600180612993565b610c4c83836001612a7b565b6000610c588583612ad8565b9050610c68338583600180612cb8565b5050505050565b6000601280549050905090565b610c8d610c8761231b565b82612f4d565b610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc3906150b2565b60405180910390fd5b610cd783838361302b565b505050565b610ce461231b565b73ffffffffffffffffffffffffffffffffffffffff16610d02611803565b73ffffffffffffffffffffffffffffffffffffffff1614610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f90614ff2565b60405180910390fd5b6000610d62611803565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610daa573d6000803e3d6000fd5b505050565b6000610dba8361170e565b8210610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df290614dd2565b60405180910390fd5b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636feaa9666040518163ffffffff1660e01b815260040160206040518083038186803b158015610ebe57600080fd5b505afa158015610ed2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef69190614329565b905080610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90614f92565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610f959190614c40565b60206040518083038186803b158015610fad57600080fd5b505afa158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe59190614426565b9050610ff48582856000612993565b60005b8381101561101d5761100a878787611478565b80806110159061549d565b915050610ff7565b50505050505050565b606060006110338361170e565b905060008167ffffffffffffffff81111561105157611050615630565b5b60405190808252806020026020018201604052801561107f5781602001602082028036833780820191505090505b50905060005b828110156110c9576110978582610daf565b8282815181106110aa576110a9615601565b5b60200260200101818152505080806110c19061549d565b915050611085565b508092505050919050565b6110ef83838360405180602001604052806000815250611baa565b505050565b60006110ff8261165c565b90508073ffffffffffffffffffffffffffffffffffffffff1661112061231b565b73ffffffffffffffffffffffffffffffffffffffff1614611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d90615052565b60405180910390fd5b61118281600084613287565b61118d600083612323565b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111dd9190615346565b92505081905550600c600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61128261231b565b73ffffffffffffffffffffffffffffffffffffffff166112a0611803565b73ffffffffffffffffffffffffffffffffffffffff16146112f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ed90614ff2565b60405180910390fd5b6060604051806080016040528085815260200184815260200183815260200182815250600260008781526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003019080519060200190611366929190613d42565b509050505050505050565b600061137b610c6f565b82106113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b3906150f2565b60405180910390fd5b601282815481106113d0576113cf615601565b5b90600052602060002001549050919050565b6113ea61231b565b73ffffffffffffffffffffffffffffffffffffffff16611408611803565b73ffffffffffffffffffffffffffffffffffffffff161461145e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145590614ff2565b60405180910390fd5b80600b9080519060200190611474929190613d8f565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636feaa9666040518163ffffffff1660e01b815260040160206040518083038186803b1580156114e257600080fd5b505afa1580156114f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151a9190614329565b90508061155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155390614f92565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016115b99190614c40565b60206040518083038186803b1580156115d157600080fd5b505afa1580156115e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116099190614426565b9050600061161a33868660016123dc565b905061162a858360016000612993565b61163685856001612a7b565b60006116428783612ad8565b905061165333878360016000612cb8565b50505050505050565b600080600c600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fc90614f72565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561177f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177690614f52565b60405180910390fd5b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117d38334836001612993565b60005b818110156117fc576117e9858585610c22565b80806117f49061549d565b9150506117d6565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600a805461183b9061543a565b80601f01602080910402602001604051908101604052809291908181526020018280546118679061543a565b80156118b45780601f10611889576101008083540402835291602001916118b4565b820191906000526020600020905b81548152906001019060200180831161189757829003601f168201915b5050505050905090565b6118c661231b565b73ffffffffffffffffffffffffffffffffffffffff166118e4611803565b73ffffffffffffffffffffffffffffffffffffffff161461193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193190614ff2565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61198661231b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119eb90614eb2565b60405180910390fd5b80600f6000611a0161231b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611aae61231b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af39190614d75565b60405180910390a35050565b611b0761231b565b73ffffffffffffffffffffffffffffffffffffffff16611b25611803565b73ffffffffffffffffffffffffffffffffffffffff1614611b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7290614ff2565b60405180910390fd5b80600160008481526020019081526020016000206003019080519060200190611ba5929190613d8f565b505050565b611bbb611bb561231b565b83612f4d565b611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf1906150b2565b60405180910390fd5b611c0684848484613390565b50505050565b60008060028060008681526020019081526020016000206000015414611cdc57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8c6c1c8846040518263ffffffff1660e01b8152600401611c879190615132565b60206040518083038186803b158015611c9f57600080fd5b505afa158015611cb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd79190614426565b611cdf565b60015b90506003600085815260200190815260200160002060008481526020019081526020016000205481611d119190615346565b91505092915050565b81611d2361231b565b73ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbd90614db2565b60405180910390fd5b816001600085815260200190815260200160002060060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6060611e2b826122af565b611e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6190615032565b60405180910390fd5b6000600b8054611e799061543a565b905011611e955760405180602001604052806000815250611ec1565b600b611ea0836133ec565b604051602001611eb1929190614bce565b6040516020818303038152906040525b9050919050565b611ed061231b565b73ffffffffffffffffffffffffffffffffffffffff16611eee611803565b73ffffffffffffffffffffffffffffffffffffffff1614611f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3b90614ff2565b60405180910390fd5b6000611f50600661354d565b90506040518060e00160405280858152602001600081526020018681526020018481526020018381526020018781526020018873ffffffffffffffffffffffffffffffffffffffff16815250600160008381526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003019080519060200190611fe9929190613d8f565b506080820151816004019080519060200190612006929190613d8f565b5060a0820151816005015560c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600260008581526020019081526020016000206003018190806001815401808255809150506001900390600052602060002001600090919091909150556120a2600661355b565b50505050505050565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61214761231b565b73ffffffffffffffffffffffffffffffffffffffff16612165611803565b73ffffffffffffffffffffffffffffffffffffffff16146121bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b290614ff2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561222b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222290614e12565b60405180910390fd5b61223481613571565b50565b612710816000018190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16600c600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b81600e600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123968361165c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060600060026000868152602001908152602001600020600001541415612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f906150d2565b60405180910390fd5b600080600a67ffffffffffffffff81111561245657612455615630565b5b6040519080825280602002602001820160405280156124845781602001602082028036833780820191505090505b509050600080600090505b60026000898152602001908152602001600020600301805490508110156125dc57600060016000600260008c815260200190815260200160002060030184815481106124de576124dd615601565b5b906000526020600020015481526020019081526020016000206001015460016000600260008d8152602001908152602001600020600301858154811061252757612526615601565b5b906000526020600020015481526020019081526020016000206002015461254e9190615346565b905060008111156125ba57600260008a8152602001908152602001600020600301828154811061258157612580615601565b5b906000526020600020015484868151811061259f5761259e615601565b5b60200260200101818152505084806125b69061549d565b9550505b80836125c69190615265565b92505080806125d49061549d565b91505061248f565b5060008367ffffffffffffffff8111156125f9576125f8615630565b5b6040519080825280602002602001820160405280156126275781602001602082028036833780820191505090505b50905060005b81518110156126835783818151811061264957612648615601565b5b602002602001015182828151811061266457612663615601565b5b602002602001018181525050808061267b9061549d565b91505061262d565b50600083511180156126955750858210155b6126d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cb90615092565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e896040518263ffffffff1660e01b81526004016127319190615132565b60206040518083038186803b15801561274957600080fd5b505afa15801561275d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127819190613fe7565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e890614e52565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f4ed4d158a6040518263ffffffff1660e01b815260040161284e9190615132565b60206040518083038186803b15801561286657600080fd5b505afa15801561287a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289e9190614329565b90506000816128ae5760016128b1565b60025b60ff1690506003600260008d81526020019081526020016000206000015414806128f0575080600260008d815260200190815260200160002060000154145b61292f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292690615112565b60405180910390fd5b600061293b8c8c611c0c565b905089811015612980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297790614e72565b60405180910390fd5b8498505050505050505050949350505050565b8015612a0957826129c383600260008881526020019081526020016000206001015461363590919063ffffffff16565b1115612a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fb90614ef2565b60405180910390fd5b612a75565b82612a3383600260008881526020019081526020016000206002015461363590919063ffffffff16565b1115612a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6b90614f32565b60405180910390fd5b5b50505050565b8060036000858152602001908152602001600020600084815260200190815260200160002054612aab9190615265565b60036000858152602001908152602001600020600084815260200190815260200160002081905550505050565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c84d366846008546040518363ffffffff1660e01b8152600401612b3a929190614d45565b60206040518083038186803b158015612b5257600080fd5b505afa158015612b66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8a9190614426565b905060086000815480929190612b9f9061549d565b91905055506000600180600084815260200190815260200160002060010154612bc89190615265565b9050600081620186a084612bdc91906152ec565b612be69190615265565b9050816001600085815260200190815260200160002060010181905550600082434289604051602001612c1c9493929190614bf2565b604051602081830303815290604052805190602001209050806004600084815260200190815260200160002081905550836005600084815260200190815260200160002081905550612c6e878361364b565b7fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d87858484604051612ca39493929190614cde565b60405180910390a18394505050505092915050565b600081612ced57612ce883600260008881526020019081526020016000206002015461363590919063ffffffff16565b612d17565b612d1683600260008881526020019081526020016000206001015461363590919063ffffffff16565b5b90506000612d23611803565b905060006064600160008881526020019081526020016000206005015484612d4b91906152ec565b612d5591906152bb565b90508315612ddf576001600087815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612dd9573d6000803e3d6000fd5b50612f43565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd89848487612e2b9190615346565b6040518463ffffffff1660e01b8152600401612e4993929190614c5b565b600060405180830381600087803b158015612e6357600080fd5b505af1158015612e77573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd89600160008a815260200190815260200160002060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401612f1093929190614c5b565b600060405180830381600087803b158015612f2a57600080fd5b505af1158015612f3e573d6000803e3d6000fd5b505050505b5050505050505050565b6000612f58826122af565b612f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8e90614ed2565b60405180910390fd5b6000612fa28361165c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061301157508373ffffffffffffffffffffffffffffffffffffffff16612ff9846109ce565b73ffffffffffffffffffffffffffffffffffffffff16145b80613022575061302181856120ab565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661304b8261165c565b73ffffffffffffffffffffffffffffffffffffffff16146130a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309890615012565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310890614e92565b60405180910390fd5b61311c838383613287565b613127600082612323565b6001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131779190615346565b925050819055506001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131ce9190615265565b9250508190555081600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132ca576132c581613669565b613309565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146133085761330783826136b2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561334c576133478161381f565b61338b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461338a5761338982826138f0565b5b5b505050565b61339b84848461302b565b6133a78484848461396f565b6133e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dd90614df2565b60405180910390fd5b50505050565b60606000821415613434576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613548565b600082905060005b6000821461346657808061344f9061549d565b915050600a8261345f91906152bb565b915061343c565b60008167ffffffffffffffff81111561348257613481615630565b5b6040519080825280601f01601f1916602001820160405280156134b45781602001600182028036833780820191505090505b5090505b60008514613541576001826134cd9190615346565b9150600a856134dc9190615514565b60306134e89190615265565b60f81b8183815181106134fe576134fd615601565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561353a91906152bb565b94506134b8565b8093505050505b919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361364391906152ec565b905092915050565b613665828260405180602001604052806000815250613b06565b5050565b6012805490506013600083815260200190815260200160002081905550601281908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136bf8461170e565b6136c99190615346565b90506000601160008481526020019081526020016000205490508181146137ae576000601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816011600083815260200190815260200160002081905550505b6011600084815260200190815260200160002060009055601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016012805490506138339190615346565b905060006013600084815260200190815260200160002054905060006012838154811061386357613862615601565b5b90600052602060002001549050806012838154811061388557613884615601565b5b9060005260206000200181905550816013600083815260200190815260200160002081905550601360008581526020019081526020016000206000905560128054806138d4576138d36155d2565b5b6001900381819060005260206000200160009055905550505050565b60006138fb8361170e565b905081601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806011600084815260200190815260200160002081905550505050565b60006139908473ffffffffffffffffffffffffffffffffffffffff16613b61565b15613af9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139b961231b565b8786866040518563ffffffff1660e01b81526004016139db9493929190614c92565b602060405180830381600087803b1580156139f557600080fd5b505af1925050508015613a2657506040513d601f19601f82011682018060405250810190613a239190614383565b60015b613aa9573d8060008114613a56576040519150601f19603f3d011682016040523d82523d6000602084013e613a5b565b606091505b50600081511415613aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a9890614df2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613afe565b600190505b949350505050565b613b108383613b74565b613b1d600084848461396f565b613b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5390614df2565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bdb90614fb2565b60405180910390fd5b613bed816122af565b15613c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c2490614e32565b60405180910390fd5b613c3960008383613287565b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c899190615265565b9250508190555081600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054828255906000526020600020908101928215613d7e579160200282015b82811115613d7d578251825591602001919060010190613d62565b5b509050613d8b9190613e15565b5090565b828054613d9b9061543a565b90600052602060002090601f016020900481019282613dbd5760008555613e04565b82601f10613dd657805160ff1916838001178555613e04565b82800160010185558215613e04579182015b82811115613e03578251825591602001919060010190613de8565b5b509050613e119190613e15565b5090565b5b80821115613e2e576000816000905550600101613e16565b5090565b6000613e45613e4084615172565b61514d565b905082815260208101848484011115613e6157613e60615664565b5b613e6c8482856153f8565b509392505050565b6000613e87613e82846151a3565b61514d565b905082815260208101848484011115613ea357613ea2615664565b5b613eae8482856153f8565b509392505050565b600081359050613ec581615e9d565b92915050565b600081519050613eda81615e9d565b92915050565b600081359050613eef81615eb4565b92915050565b600081519050613f0481615eb4565b92915050565b600081359050613f1981615ecb565b92915050565b600081519050613f2e81615ecb565b92915050565b600082601f830112613f4957613f4861565f565b5b8135613f59848260208601613e32565b91505092915050565b600082601f830112613f7757613f7661565f565b5b8135613f87848260208601613e74565b91505092915050565b600081359050613f9f81615ee2565b92915050565b600081519050613fb481615ee2565b92915050565b600060208284031215613fd057613fcf61566e565b5b6000613fde84828501613eb6565b91505092915050565b600060208284031215613ffd57613ffc61566e565b5b600061400b84828501613ecb565b91505092915050565b6000806040838503121561402b5761402a61566e565b5b600061403985828601613eb6565b925050602061404a85828601613eb6565b9150509250929050565b60008060006060848603121561406d5761406c61566e565b5b600061407b86828701613eb6565b935050602061408c86828701613eb6565b925050604061409d86828701613f90565b9150509250925092565b600080600080608085870312156140c1576140c061566e565b5b60006140cf87828801613eb6565b94505060206140e087828801613eb6565b93505060406140f187828801613f90565b925050606085013567ffffffffffffffff81111561411257614111615669565b5b61411e87828801613f34565b91505092959194509250565b600080604083850312156141415761414061566e565b5b600061414f85828601613eb6565b925050602061416085828601613ee0565b9150509250929050565b600080604083850312156141815761418061566e565b5b600061418f85828601613eb6565b92505060206141a085828601613f90565b9150509250929050565b6000806000606084860312156141c3576141c261566e565b5b60006141d186828701613eb6565b93505060206141e286828701613f90565b92505060406141f386828701613f90565b9150509250925092565b600080600080608085870312156142175761421661566e565b5b600061422587828801613eb6565b945050602061423687828801613f90565b935050604061424787828801613f90565b925050606061425887828801613f90565b91505092959194509250565b60008060008060008060c087890312156142815761428061566e565b5b600061428f89828a01613eb6565b96505060206142a089828a01613f90565b95505060406142b189828a01613f90565b94505060606142c289828a01613f90565b935050608087013567ffffffffffffffff8111156142e3576142e2615669565b5b6142ef89828a01613f62565b92505060a087013567ffffffffffffffff8111156143105761430f615669565b5b61431c89828a01613f62565b9150509295509295509295565b60006020828403121561433f5761433e61566e565b5b600061434d84828501613ef5565b91505092915050565b60006020828403121561436c5761436b61566e565b5b600061437a84828501613f0a565b91505092915050565b6000602082840312156143995761439861566e565b5b60006143a784828501613f1f565b91505092915050565b6000602082840312156143c6576143c561566e565b5b600082013567ffffffffffffffff8111156143e4576143e3615669565b5b6143f084828501613f62565b91505092915050565b60006020828403121561440f5761440e61566e565b5b600061441d84828501613f90565b91505092915050565b60006020828403121561443c5761443b61566e565b5b600061444a84828501613fa5565b91505092915050565b6000806040838503121561446a5761446961566e565b5b600061447885828601613f90565b925050602061448985828601613eb6565b9150509250929050565b600080604083850312156144aa576144a961566e565b5b60006144b885828601613f90565b925050602083013567ffffffffffffffff8111156144d9576144d8615669565b5b6144e585828601613f62565b9150509250929050565b600080604083850312156145065761450561566e565b5b600061451485828601613f90565b925050602061452585828601613f90565b9150509250929050565b6000806000606084860312156145485761454761566e565b5b600061455686828701613f90565b935050602061456786828701613f90565b925050604061457886828701613f90565b9150509250925092565b6000806000806080858703121561459c5761459b61566e565b5b60006145aa87828801613f90565b94505060206145bb87828801613f90565b93505060406145cc87828801613f90565b92505060606145dd87828801613f90565b91505092959194509250565b60006145f58383614b99565b60208301905092915050565b61460a8161537a565b82525050565b61462161461c8261537a565b6154e6565b82525050565b6000614632826151f9565b61463c8185615227565b9350614647836151d4565b8060005b8381101561467857815161465f88826145e9565b975061466a8361521a565b92505060018101905061464b565b5085935050505092915050565b61468e8161538c565b82525050565b61469d81615398565b82525050565b60006146ae82615204565b6146b88185615238565b93506146c8818560208601615407565b6146d181615673565b840191505092915050565b60006146e78261520f565b6146f18185615249565b9350614701818560208601615407565b61470a81615673565b840191505092915050565b60006147208261520f565b61472a818561525a565b935061473a818560208601615407565b80840191505092915050565b600081546147538161543a565b61475d818661525a565b945060018216600081146147785760018114614789576147bc565b60ff198316865281860193506147bc565b614792856151e4565b60005b838110156147b457815481890152600182019150602081019050614795565b838801955050505b50505092915050565b60006147d2603883615249565b91506147dd82615691565b604082019050919050565b60006147f5602b83615249565b9150614800826156e0565b604082019050919050565b6000614818603283615249565b91506148238261572f565b604082019050919050565b600061483b602683615249565b91506148468261577e565b604082019050919050565b600061485e601c83615249565b9150614869826157cd565b602082019050919050565b6000614881603583615249565b915061488c826157f6565b604082019050919050565b60006148a4602883615249565b91506148af82615845565b604082019050919050565b60006148c7602483615249565b91506148d282615894565b604082019050919050565b60006148ea601983615249565b91506148f5826158e3565b602082019050919050565b600061490d602c83615249565b91506149188261590c565b604082019050919050565b6000614930602b83615249565b915061493b8261595b565b604082019050919050565b6000614953603883615249565b915061495e826159aa565b604082019050919050565b6000614976602f83615249565b9150614981826159f9565b604082019050919050565b6000614999602a83615249565b91506149a482615a48565b604082019050919050565b60006149bc602983615249565b91506149c782615a97565b604082019050919050565b60006149df603383615249565b91506149ea82615ae6565b604082019050919050565b6000614a02602083615249565b9150614a0d82615b35565b602082019050919050565b6000614a25602c83615249565b9150614a3082615b5e565b604082019050919050565b6000614a48602083615249565b9150614a5382615bad565b602082019050919050565b6000614a6b602983615249565b9150614a7682615bd6565b604082019050919050565b6000614a8e602f83615249565b9150614a9982615c25565b604082019050919050565b6000614ab1602f83615249565b9150614abc82615c74565b604082019050919050565b6000614ad4602183615249565b9150614adf82615cc3565b604082019050919050565b6000614af7602d83615249565b9150614b0282615d12565b604082019050919050565b6000614b1a603183615249565b9150614b2582615d61565b604082019050919050565b6000614b3d602d83615249565b9150614b4882615db0565b604082019050919050565b6000614b60602c83615249565b9150614b6b82615dff565b604082019050919050565b6000614b83602983615249565b9150614b8e82615e4e565b604082019050919050565b614ba2816153ee565b82525050565b614bb1816153ee565b82525050565b614bc8614bc3826153ee565b61550a565b82525050565b6000614bda8285614746565b9150614be68284614715565b91508190509392505050565b6000614bfe8287614bb7565b602082019150614c0e8286614bb7565b602082019150614c1e8285614bb7565b602082019150614c2e8284614610565b60148201915081905095945050505050565b6000602082019050614c556000830184614601565b92915050565b6000606082019050614c706000830186614601565b614c7d6020830185614601565b614c8a6040830184614ba8565b949350505050565b6000608082019050614ca76000830187614601565b614cb46020830186614601565b614cc16040830185614ba8565b8181036060830152614cd381846146a3565b905095945050505050565b6000608082019050614cf36000830187614601565b614d006020830186614ba8565b614d0d6040830185614ba8565b614d1a6060830184614694565b95945050505050565b60006020820190508181036000830152614d3d8184614627565b905092915050565b60006040820190508181036000830152614d5f8185614627565b9050614d6e6020830184614ba8565b9392505050565b6000602082019050614d8a6000830184614685565b92915050565b60006020820190508181036000830152614daa81846146dc565b905092915050565b60006020820190508181036000830152614dcb816147c5565b9050919050565b60006020820190508181036000830152614deb816147e8565b9050919050565b60006020820190508181036000830152614e0b8161480b565b9050919050565b60006020820190508181036000830152614e2b8161482e565b9050919050565b60006020820190508181036000830152614e4b81614851565b9050919050565b60006020820190508181036000830152614e6b81614874565b9050919050565b60006020820190508181036000830152614e8b81614897565b9050919050565b60006020820190508181036000830152614eab816148ba565b9050919050565b60006020820190508181036000830152614ecb816148dd565b9050919050565b60006020820190508181036000830152614eeb81614900565b9050919050565b60006020820190508181036000830152614f0b81614923565b9050919050565b60006020820190508181036000830152614f2b81614946565b9050919050565b60006020820190508181036000830152614f4b81614969565b9050919050565b60006020820190508181036000830152614f6b8161498c565b9050919050565b60006020820190508181036000830152614f8b816149af565b9050919050565b60006020820190508181036000830152614fab816149d2565b9050919050565b60006020820190508181036000830152614fcb816149f5565b9050919050565b60006020820190508181036000830152614feb81614a18565b9050919050565b6000602082019050818103600083015261500b81614a3b565b9050919050565b6000602082019050818103600083015261502b81614a5e565b9050919050565b6000602082019050818103600083015261504b81614a81565b9050919050565b6000602082019050818103600083015261506b81614aa4565b9050919050565b6000602082019050818103600083015261508b81614ac7565b9050919050565b600060208201905081810360008301526150ab81614aea565b9050919050565b600060208201905081810360008301526150cb81614b0d565b9050919050565b600060208201905081810360008301526150eb81614b30565b9050919050565b6000602082019050818103600083015261510b81614b53565b9050919050565b6000602082019050818103600083015261512b81614b76565b9050919050565b60006020820190506151476000830184614ba8565b92915050565b6000615157615168565b9050615163828261546c565b919050565b6000604051905090565b600067ffffffffffffffff82111561518d5761518c615630565b5b61519682615673565b9050602081019050919050565b600067ffffffffffffffff8211156151be576151bd615630565b5b6151c782615673565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615270826153ee565b915061527b836153ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152b0576152af615545565b5b828201905092915050565b60006152c6826153ee565b91506152d1836153ee565b9250826152e1576152e0615574565b5b828204905092915050565b60006152f7826153ee565b9150615302836153ee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561533b5761533a615545565b5b828202905092915050565b6000615351826153ee565b915061535c836153ee565b92508282101561536f5761536e615545565b5b828203905092915050565b6000615385826153ce565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561542557808201518184015260208101905061540a565b83811115615434576000848401525b50505050565b6000600282049050600182168061545257607f821691505b60208210811415615466576154656155a3565b5b50919050565b61547582615673565b810181811067ffffffffffffffff8211171561549457615493615630565b5b80604052505050565b60006154a8826153ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154db576154da615545565b5b600182019050919050565b60006154f1826154f8565b9050919050565b600061550382615684565b9050919050565b6000819050919050565b600061551f826153ee565b915061552a836153ee565b92508261553a57615539615574565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f47656e417274436f6c6c656374696f6e44726f703a206f6e6c7920617274697360008201527f742063616e2063616c6c20746869732066756e6374696f6e0000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f47656e417274436f6c6c656374696f6e44726f703a2073656e646572206d757360008201527f74206265206d656d62657273686970206f776e65720000000000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a206e6f206d696e7473206160008201527f7661696c61626c65000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a20696e636f72726563742060008201527f616d6f756e742073656e74000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a20696e737566666963696560008201527f6e74202447454e2062616c616e63650000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a204d696e7420776974682060008201527f2447454e415254206e6f7420616c6c6f77656400000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a206f6e6c7920746f6b656e60008201527f206f776e65722063616e206275726e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a206d617820696e766f636160008201527f74696f6e73207265616368656400000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a20696e636f72726563742060008201527f636f6c6c656374696f6e20696400000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f47656e417274436f6c6c656374696f6e44726f703a206e6f2076616c6964206d60008201527f656d626572736869700000000000000000000000000000000000000000000000602082015250565b615ea68161537a565b8114615eb157600080fd5b50565b615ebd8161538c565b8114615ec857600080fd5b50565b615ed4816153a2565b8114615edf57600080fd5b50565b615eeb816153ee565b8114615ef657600080fd5b5056fea2646970667358221220a9e43c6f1794ca66e46c9bf129bdaa787f9f03a52fd6bccbc3e79c865a2f537d64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000f368f333fdbc6393e617eeb6adc421b5de352cc8000000000000000000000000000000000000000000000000000000000000000c47454e2e4152542044726f700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000647454e4152540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f6170692e67656e2e6172742f7075626c69632f617474726962757465732f0000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): GEN.ART Drop
Arg [1] : symbol_ (string): GENART
Arg [2] : uri_ (string): https://api.gen.art/public/attributes/
Arg [3] : genArtInterfaceAddress_ (address): 0xF368f333FDBc6393E617EEB6ADC421b5De352cc8

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 000000000000000000000000f368f333fdbc6393e617eeb6adc421b5de352cc8
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 47454e2e4152542044726f700000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [7] : 47454e4152540000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000026
Arg [9] : 68747470733a2f2f6170692e67656e2e6172742f7075626c69632f6174747269
Arg [10] : 62757465732f0000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

26320:32355:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39620:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40856:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42902:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42411:425;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38900:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33580:516;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53105:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43961:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29375:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52672:357;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35201:569;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39159:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44408:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49283:488;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29518:410;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53295:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42250:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34104:760;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40463:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40106:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34872:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3002:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41025:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38698:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43282:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38516:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44664:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37656:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38317:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41200:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29936:758;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43680:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3457:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39620:422;39767:4;39824:25;39809:40;;;:11;:40;;;;:105;;;;39881:33;39866:48;;;:11;:48;;;;39809:105;:172;;;;39946:35;39931:50;;;:11;:50;;;;39809:172;:225;;;;39998:36;40022:11;39998:23;:36::i;:::-;39809:225;39789:245;;39620:422;;;:::o;40856:100::-;40910:13;40943:5;40936:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40856:100;:::o;42902:308::-;43023:7;43070:16;43078:7;43070;:16::i;:::-;43048:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;43178:15;:24;43194:7;43178:24;;;;;;;;;;;;;;;;;;;;;43171:31;;42902:308;;;:::o;42411:425::-;42492:13;42508:37;42537:7;42508:28;:37::i;:::-;42492:53;;42570:5;42564:11;;:2;:11;;;;42556:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42664:5;42648:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;42673:37;42690:5;42697:12;:10;:12::i;:::-;42673:16;:37::i;:::-;42648:62;42626:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;42807:21;42816:2;42820:7;42807:8;:21::i;:::-;42481:355;42411:425;;:::o;38900:251::-;3233:12;:10;:12::i;:::-;3222:23;;:7;:5;:7::i;:::-;:23;;;3214:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39075:6:::1;39036:20;:30;39057:8;39036:30;;;;;;;;;;;:36;;:45;;;;39134:9;39092:20;:30;39113:8;39092:30;;;;;;;;;;;:39;;:51;;;;38900:251:::0;;;:::o;33580:516::-;33708:30;33741:112;33765:10;33790:8;33813:13;33841:1;33741:9;:112::i;:::-;33708:145;;33864:40;33875:8;33885:9;33896:1;33899:4;33864:10;:40::i;:::-;33915:43;33931:8;33941:13;33956:1;33915:15;:43::i;:::-;33969:21;33993:28;34002:3;34007:13;33993:8;:28::i;:::-;33969:52;;34032:56;34043:10;34055:8;34065:13;34080:1;34083:4;34032:10;:56::i;:::-;33697:399;;33580:516;;;:::o;53105:113::-;53166:7;53193:10;:17;;;;53186:24;;53105:113;:::o;43961:376::-;44170:41;44189:12;:10;:12::i;:::-;44203:7;44170:18;:41::i;:::-;44148:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;44301:28;44311:4;44317:2;44321:7;44301:9;:28::i;:::-;43961:376;;;:::o;29375:135::-;3233:12;:10;:12::i;:::-;3222:23;;:7;:5;:7::i;:::-;:23;;;3214:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29436:14:::1;29453:7;:5;:7::i;:::-;29436:24;;29479:6;29471:24;;:31;29496:5;29471:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;29425:85;29375:135:::0;:::o;52672:357::-;52814:7;52869:37;52900:5;52869:30;:37::i;:::-;52861:5;:45;52839:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;52995:12;:19;53008:5;52995:19;;;;;;;;;;;;;;;:26;53015:5;52995:26;;;;;;;;;;;;52988:33;;52672:357;;;;:::o;35201:569::-;35354:16;35373;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35354:48;;35435:11;35413:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;35536:15;35554:16;;;;;;;;;;;:26;;;35581:10;35554:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35536:56;;35603:45;35614:8;35624:7;35633;35642:5;35603:10;:45::i;:::-;35666:9;35661:102;35685:7;35681:1;:11;35661:102;;;35714:37;35722:3;35727:8;35737:13;35714:7;:37::i;:::-;35694:3;;;;;:::i;:::-;;;;35661:102;;;;35343:427;;35201:569;;;;:::o;39159:380::-;39249:16;39283:18;39304:17;39314:6;39304:9;:17::i;:::-;39283:38;;39332:25;39374:10;39360:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39332:53;;39401:9;39396:108;39416:10;39412:1;:14;39396:108;;;39462:30;39482:6;39490:1;39462:19;:30::i;:::-;39448:8;39457:1;39448:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;39428:3;;;;;:::i;:::-;;;;39396:108;;;;39523:8;39516:15;;;;39159:380;;;:::o;44408:185::-;44546:39;44563:4;44569:2;44573:7;44546:39;;;;;;;;;;;;:16;:39::i;:::-;44408:185;;;:::o;49283:488::-;49332:13;49348:37;49377:7;49348:28;:37::i;:::-;49332:53;;49434:5;49418:21;;:12;:10;:12::i;:::-;:21;;;49396:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;49525:48;49546:5;49561:1;49565:7;49525:20;:48::i;:::-;49612:29;49629:1;49633:7;49612:8;:29::i;:::-;49674:1;49654:9;:16;49664:5;49654:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;49693:7;:16;49701:7;49693:16;;;;;;;;;;;;49686:23;;;;;;;;;;;49755:7;49751:1;49727:36;;49736:5;49727:36;;;;;;;;;;;;49321:450;49283:488;:::o;29518:410::-;3233:12;:10;:12::i;:::-;3222:23;;:7;:5;:7::i;:::-;:23;;;3214:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29691:29:::1;29764:156;;;;;;;;29801:5;29764:156;;;;29828:6;29764:156;;;;29859:9;29764:156;;;;29896:12;29764:156;;::::0;29731:20:::1;:30;29752:8;29731:30;;;;;;;;;;;:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;29680:248;29518:410:::0;;;;:::o;53295:324::-;53415:7;53470:34;:32;:34::i;:::-;53462:5;:42;53440:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;53594:10;53605:5;53594:17;;;;;;;;:::i;:::-;;;;;;;;;;53587:24;;53295:324;;;:::o;42250:99::-;3233:12;:10;:12::i;:::-;3222:23;;:7;:5;:7::i;:::-;:23;;;3214:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42333:8:::1;42322;:19;;;;;;;;;;;;:::i;:::-;;42250:99:::0;:::o;34104:760::-;34227:16;34246;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34227:48;;34308:11;34286:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;34409:15;34427:16;;;;;;;;;;;:26;;;34454:10;34427:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34409:56;;34476:30;34509:112;34533:10;34558:8;34581:13;34609:1;34509:9;:112::i;:::-;34476:145;;34632:39;34643:8;34653:7;34662:1;34665:5;34632:10;:39::i;:::-;34682:43;34698:8;34708:13;34723:1;34682:15;:43::i;:::-;34736:21;34760:28;34769:3;34774:13;34760:8;:28::i;:::-;34736:52;;34799:57;34810:10;34822:8;34832:13;34847:1;34850:5;34799:10;:57::i;:::-;34216:648;;;;34104:760;;;:::o;40463:326::-;40580:7;40605:13;40621:7;:16;40629:7;40621:16;;;;;;;;;;;;;;;;;;;;;40605:32;;40687:1;40670:19;;:5;:19;;;;40648:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;40776:5;40769:12;;;40463:326;;;:::o;40106:295::-;40223:7;40287:1;40270:19;;:5;:19;;;;40248:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;40377:9;:16;40387:5;40377:16;;;;;;;;;;;;;;;;40370:23;;40106:295;;;:::o;34872:321::-;35030:46;35041:8;35051:9;35062:7;35071:4;35030:10;:46::i;:::-;35092:9;35087:99;35111:7;35107:1;:11;35087:99;;;35140:34;35145:3;35150:8;35160:13;35140:4;:34::i;:::-;35120:3;;;;;:::i;:::-;;;;35087:99;;;;34872:321;;;;:::o;3002:87::-;3048:7;3075:6;;;;;;;;;;;3068:13;;3002:87;:::o;41025:104::-;41081:13;41114:7;41107:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41025:104;:::o;38698:194::-;3233:12;:10;:12::i;:::-;3222:23;;:7;:5;:7::i;:::-;:23;;;3214:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38860:23:::1;38822:16;;:62;;;;;;;;;;;;;;;;;;38698:194:::0;:::o;43282:327::-;43429:12;:10;:12::i;:::-;43417:24;;:8;:24;;;;43409:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;43529:8;43484:18;:32;43503:12;:10;:12::i;:::-;43484:32;;;;;;;;;;;;;;;:42;43517:8;43484:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;43582:8;43553:48;;43568:12;:10;:12::i;:::-;43553:48;;;43592:8;43553:48;;;;;;:::i;:::-;;;;;;;;43282:327;;:::o;38516:174::-;3233:12;:10;:12::i;:::-;3222:23;;:7;:5;:7::i;:::-;:23;;;3214:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38675:7:::1;38635:15;:30;38651:13;38635:30;;;;;;;;;;;:37;;:47;;;;;;;;;;;;:::i;:::-;;38516:174:::0;;:::o;44664:365::-;44853:41;44872:12;:10;:12::i;:::-;44886:7;44853:18;:41::i;:::-;44831:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;44982:39;44996:4;45002:2;45006:7;45015:5;44982:13;:39::i;:::-;44664:365;;;;:::o;37656:371::-;37780:7;37805:15;37860:1;37823:20;:28;37844:6;37823:28;;;;;;;;;;;:33;;;:38;:126;;37894:16;;;;;;;;;;;:40;;;37935:13;37894:55;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37823:126;;;37877:1;37823:126;37805:144;;37977:19;:27;37997:6;37977:27;;;;;;;;;;;:42;38005:13;37977:42;;;;;;;;;;;;37967:7;:52;;;;:::i;:::-;37960:59;;;37656:371;;;;:::o;38317:191::-;38422:13;29251:12;:10;:12::i;:::-;29210:53;;:15;:30;29226:13;29210:30;;;;;;;;;;;:37;;;;;;;;;;;;:53;;;29188:159;;;;;;;;;;;;:::i;:::-;;;;;;;;;38493:7:::1;38453:15;:30;38469:13;38453:30;;;;;;;;;;;:37;;;:47;;;;;;;;;;;;;;;;;;38317:191:::0;;;:::o;41200:473::-;41318:13;41371:16;41379:7;41371;:16::i;:::-;41349:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;41568:1;41549:8;41543:22;;;;;:::i;:::-;;;:26;:122;;;;;;;;;;;;;;;;;41613:8;41623:18;:7;:16;:18::i;:::-;41596:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41543:122;41523:142;;41200:473;;;:::o;29936:758::-;3233:12;:10;:12::i;:::-;3222:23;;:7;:5;:7::i;:::-;:23;;;3214:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30192:21:::1;30216:30;:20;:28;:30::i;:::-;30192:54;;30292:278;;;;;;;;30325:8;30292:278;;;;30361:1;30292:278;;;;30393:15;30292:278;;;;30431:7;30292:278;;;;30466:12;30292:278;;;;30511:17;30292:278;;;;30551:7;30292:278;;;;::::0;30259:15:::1;:30;30275:13;30259:30;;;;;;;;;;;:311;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30581:20;:30;30602:8;30581:30;;;;;;;;;;;:42;;30629:13;30581:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30654:32;:20;:30;:32::i;:::-;30181:513;29936:758:::0;;;;;;:::o;43680:214::-;43822:4;43851:18;:25;43870:5;43851:25;;;;;;;;;;;;;;;:35;43877:8;43851:35;;;;;;;;;;;;;;;;;;;;;;;;;43844:42;;43680:214;;;;:::o;3457:229::-;3233:12;:10;:12::i;:::-;3222:23;;:7;:5;:7::i;:::-;:23;;;3214:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3580:1:::1;3560:22;;:8;:22;;;;3538:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;3659:19;3669:8;3659:9;:19::i;:::-;3457:229:::0;:::o;5105:90::-;5182:5;5165:7;:14;;:22;;;;5105:90;:::o;19395:207::-;19525:4;19569:25;19554:40;;;:11;:40;;;;19547:47;;19395:207;;;:::o;46576:127::-;46641:4;46693:1;46665:30;;:7;:16;46673:7;46665:16;;;;;;;;;;;;;;;;;;;;;:30;;;;46658:37;;46576:127;;;:::o;1853:98::-;1906:7;1933:10;1926:17;;1853:98;:::o;50855:188::-;50957:2;50930:15;:24;50946:7;50930:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51027:7;51023:2;50975:60;;50984:37;51013:7;50984:28;:37::i;:::-;50975:60;;;;;;;;;;;;50855:188;;:::o;30702:2282::-;30862:16;30961:1;30922:20;:30;30943:8;30922:30;;;;;;;;;;;:35;;;:40;;30900:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;31046:15;31072:30;31119:2;31105:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31072:50;;31133:28;31191:9;31203:1;31191:13;;31172:644;31223:20;:30;31244:8;31223:30;;;;;;;;;;;:42;;:49;;;;31219:1;:53;31172:644;;;31317:19;31468:15;:62;31484:20;:30;31505:8;31484:30;;;;;;;;;;;:42;;31527:1;31484:45;;;;;;;;:::i;:::-;;;;;;;;;;31468:62;;;;;;;;;;;:96;;;31339:15;:94;31373:20;:30;31394:8;31373:30;;;;;;;;;;;:42;;31416:1;31373:45;;;;;;;;:::i;:::-;;;;;;;;;;31339:94;;;;;;;;;;;:109;;;:225;;;;:::i;:::-;31317:247;;31597:1;31583:11;:15;31579:176;;;31644:20;:30;31665:8;31644:30;;;;;;;;;;;:64;;31709:1;31644:67;;;;;;;;:::i;:::-;;;;;;;;;;31619:13;31633:7;31619:22;;;;;;;;:::i;:::-;;;;;;;:92;;;;;31730:9;;;;;:::i;:::-;;;;31579:176;31793:11;31769:35;;;;;:::i;:::-;;;31302:514;31287:3;;;;;:::i;:::-;;;;31172:644;;;;31826:36;31879:7;31865:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31826:61;;31903:9;31898:125;31922:19;:26;31918:1;:30;31898:125;;;31995:13;32009:1;31995:16;;;;;;;;:::i;:::-;;;;;;;;31970:19;31990:1;31970:22;;;;;;;;:::i;:::-;;;;;;;:41;;;;;31950:3;;;;;:::i;:::-;;;;31898:125;;;;32078:1;32055:13;:20;:24;:59;;;;;32107:7;32083:20;:31;;32055:59;32033:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32200:24;32227:16;;;;;;;;;;;:24;;;32252:13;32227:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32200:66;;32319:7;32299:27;;:16;:27;;;32277:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;32418:18;32439:16;;;;;;;;;;;:28;;;32468:13;32439:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32418:64;;32493:13;32509;:21;;32529:1;32509:21;;;32525:1;32509:21;32493:37;;;;32602:1;32563:20;:30;32584:8;32563:30;;;;;;;;;;;:35;;;:40;:105;;;;32663:5;32624:20;:30;32645:8;32624:30;;;;;;;;;;;:35;;;:44;32563:105;32541:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;32748:15;32766:52;32794:8;32804:13;32766:27;:52::i;:::-;32748:70;;32862:7;32851;:18;;32829:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;32957:19;32950:26;;;;;;;;;;30702:2282;;;;;;:::o;32992:580::-;33155:13;33151:414;;;33264:6;33211:49;33252:7;33211:20;:30;33232:8;33211:30;;;;;;;;;;;:36;;;:40;;:49;;;;:::i;:::-;:59;;33185:164;;;;;;;;;;;;:::i;:::-;;;;;;;;;33151:414;;;33464:6;33408:52;33452:7;33408:20;:30;33429:8;33408:30;;;;;;;;;;;:39;;;:43;;:52;;;;:::i;:::-;:62;;33382:171;;;;;;;;;;;;:::i;:::-;;;;;;;;;33151:414;32992:580;;;;:::o;38035:274::-;38294:7;38236:19;:27;38256:6;38236:27;;;;;;;;;;;:42;38264:13;38236:42;;;;;;;;;;;;:65;;;;:::i;:::-;38178:19;:27;38198:6;38178:27;;;;;;;;;;;:42;38206:13;38178:42;;;;;;;;;;;:123;;;;38035:274;;;:::o;35778:856::-;35895:7;35920:21;35944:16;;;;;;;;;;;:32;;;35991:14;36020:5;;35944:92;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35920:116;;36047:5;;:7;;;;;;;;;:::i;:::-;;;;;;36065:18;36131:1;36086:15;:30;36102:13;36086:30;;;;;;;;;;;:42;;;:46;;;;:::i;:::-;36065:67;;36143:16;36188:10;36178:7;36162:13;:23;;;;:::i;:::-;:36;;;;:::i;:::-;36143:55;;36254:10;36209:15;:30;36225:13;36209:30;;;;;;;;;;;:42;;:55;;;;36277:12;36333:10;36345:12;36359:15;36376:3;36316:64;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36292:99;;;;;;36277:114;;36432:4;36402:17;:27;36420:8;36402:27;;;;;;;;;;;:34;;;;36485:13;36447:25;:35;36473:8;36447:35;;;;;;;;;;;:51;;;;36511:24;36521:3;36526:8;36511:9;:24::i;:::-;36553:40;36558:3;36563:13;36578:8;36588:4;36553:40;;;;;;;;;:::i;:::-;;;;;;;;36613:13;36606:20;;;;;;35778:856;;;;:::o;36642:1006::-;36837:13;36853;:146;;36947:52;36991:7;36947:20;:30;36968:8;36947:30;;;;;;;;;;;:39;;;:43;;:52;;;;:::i;:::-;36853:146;;;36882:49;36923:7;36882:20;:30;36903:8;36882:30;;;;;;;;;;;:36;;;:40;;:49;;;;:::i;:::-;36853:146;36837:162;;37010:14;37027:7;:5;:7::i;:::-;37010:24;;37045:20;37141:3;37090:15;:30;37106:13;37090:30;;;;;;;;;;;:47;;;37069:5;:68;;;;:::i;:::-;37068:76;;;;:::i;:::-;37045:99;;37159:13;37155:486;;;37197:15;:30;37213:13;37197:30;;;;;;;;;;;:37;;;;;;;;;;;;37189:55;;:101;37263:12;37189:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37155:486;;;37323:16;;;;;;;;;;;:29;;;37371:7;37397:6;37430:12;37422:5;:20;;;;:::i;:::-;37323:134;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37472:16;;;;;;;;;;;:29;;;37520:7;37546:15;:30;37562:13;37546:30;;;;;;;;;;;:37;;;;;;;;;;;;37602:12;37472:157;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37155:486;36826:822;;;36642:1006;;;;;:::o;46870:466::-;46999:4;47043:16;47051:7;47043;:16::i;:::-;47021:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;47142:13;47158:37;47187:7;47158:28;:37::i;:::-;47142:53;;47225:5;47214:16;;:7;:16;;;:64;;;;47271:7;47247:31;;:20;47259:7;47247:11;:20::i;:::-;:31;;;47214:64;:113;;;;47295:32;47312:5;47319:7;47295:16;:32::i;:::-;47214:113;47206:122;;;46870:466;;;;:::o;50108:629::-;50295:4;50254:45;;:37;50283:7;50254:28;:37::i;:::-;:45;;;50232:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;50401:1;50387:16;;:2;:16;;;;50379:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50457:39;50478:4;50484:2;50488:7;50457:20;:39::i;:::-;50561:29;50578:1;50582:7;50561:8;:29::i;:::-;50622:1;50603:9;:15;50613:4;50603:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;50651:1;50634:9;:13;50644:2;50634:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;50682:2;50663:7;:16;50671:7;50663:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;50721:7;50717:2;50702:27;;50711:4;50702:27;;;;;;;;;;;;50108:629;;;:::o;54232:522::-;54387:1;54371:18;;:4;:18;;;54367:187;;;54406:40;54438:7;54406:31;:40::i;:::-;54367:187;;;54476:2;54468:10;;:4;:10;;;54464:90;;54495:47;54528:4;54534:7;54495:32;:47::i;:::-;54464:90;54367:187;54582:1;54568:16;;:2;:16;;;54564:183;;;54601:45;54638:7;54601:36;:45::i;:::-;54564:183;;;54674:4;54668:10;;:2;:10;;;54664:83;;54695:40;54723:2;54727:7;54695:27;:40::i;:::-;54664:83;54564:183;54232:522;;;:::o;45911:352::-;46068:28;46078:4;46084:2;46088:7;46068:9;:28::i;:::-;46129:48;46152:4;46158:2;46162:7;46171:5;46129:22;:48::i;:::-;46107:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;45911:352;;;;:::o;5428:723::-;5484:13;5714:1;5705:5;:10;5701:53;;;5732:10;;;;;;;;;;;;;;;;;;;;;5701:53;5764:12;5779:5;5764:20;;5795:14;5820:78;5835:1;5827:4;:9;5820:78;;5853:8;;;;;:::i;:::-;;;;5884:2;5876:10;;;;;:::i;:::-;;;5820:78;;;5908:19;5940:6;5930:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5908:39;;5958:154;5974:1;5965:5;:10;5958:154;;6002:1;5992:11;;;;;:::i;:::-;;;6069:2;6061:5;:10;;;;:::i;:::-;6048:2;:24;;;;:::i;:::-;6035:39;;6018:6;6025;6018:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6098:2;6089:11;;;;;:::i;:::-;;;5958:154;;;6136:6;6122:21;;;;;5428:723;;;;:::o;4605:114::-;4670:7;4697;:14;;;4690:21;;4605:114;;;:::o;4727:127::-;4834:1;4816:7;:14;;;:19;;;;;;;;;;;4727:127;:::o;3694:173::-;3750:16;3769:6;;;;;;;;;;;3750:25;;3795:8;3786:6;;:17;;;;;;;;;;;;;;;;;;3850:8;3819:40;;3840:8;3819:40;;;;;;;;;;;;3739:128;3694:173;:::o;10832:98::-;10890:7;10921:1;10917;:5;;;;:::i;:::-;10910:12;;10832:98;;;;:::o;47678:110::-;47754:26;47764:2;47768:7;47754:26;;;;;;;;;;;;:9;:26::i;:::-;47678:110;;:::o;55491:164::-;55595:10;:17;;;;55568:15;:24;55584:7;55568:24;;;;;;;;;;;:44;;;;55623:10;55639:7;55623:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55491:164;:::o;56282:1016::-;56562:22;56626:1;56587:36;56618:4;56587:30;:36::i;:::-;:40;;;;:::i;:::-;56562:65;;56638:18;56659:17;:26;56677:7;56659:26;;;;;;;;;;;;56638:47;;56806:14;56792:10;:28;56788:328;;56837:19;56859:12;:18;56872:4;56859:18;;;;;;;;;;;;;;;:34;56878:14;56859:34;;;;;;;;;;;;56837:56;;56943:11;56910:12;:18;56923:4;56910:18;;;;;;;;;;;;;;;:30;56929:10;56910:30;;;;;;;;;;;:44;;;;57060:10;57027:17;:30;57045:11;57027:30;;;;;;;;;;;:43;;;;56822:294;56788:328;57212:17;:26;57230:7;57212:26;;;;;;;;;;;57205:33;;;57256:12;:18;57269:4;57256:18;;;;;;;;;;;;;;;:34;57275:14;57256:34;;;;;;;;;;;57249:41;;;56377:921;;56282:1016;;:::o;57593:1079::-;57846:22;57891:1;57871:10;:17;;;;:21;;;;:::i;:::-;57846:46;;57903:18;57924:15;:24;57940:7;57924:24;;;;;;;;;;;;57903:45;;58275:19;58297:10;58308:14;58297:26;;;;;;;;:::i;:::-;;;;;;;;;;58275:48;;58361:11;58336:10;58347;58336:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;58472:10;58441:15;:28;58457:11;58441:28;;;;;;;;;;;:41;;;;58613:15;:24;58629:7;58613:24;;;;;;;;;;;58606:31;;;58648:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;57664:1008;;;57593:1079;:::o;55055:235::-;55140:14;55157:34;55188:2;55157:30;:34::i;:::-;55140:51;;55229:7;55202:12;:16;55215:2;55202:16;;;;;;;;;;;;;;;:24;55219:6;55202:24;;;;;;;;;;;:34;;;;55276:6;55247:17;:26;55265:7;55247:26;;;;;;;;;;;:35;;;;55129:161;55055:235;;:::o;51608:980::-;51763:4;51784:15;:2;:13;;;:15::i;:::-;51780:801;;;51853:2;51837:36;;;51896:12;:10;:12::i;:::-;51931:4;51958:7;51988:5;51837:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51816:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52212:1;52195:6;:13;:18;52191:320;;;52238:108;;;;;;;;;;:::i;:::-;;;;;;;;52191:320;52461:6;52455:13;52446:6;52442:2;52438:15;52431:38;51816:710;52086:41;;;52076:51;;;:6;:51;;;;52069:58;;;;;51780:801;52565:4;52558:11;;51608:980;;;;;;;:::o;48015:321::-;48145:18;48151:2;48155:7;48145:5;:18::i;:::-;48196:54;48227:1;48231:2;48235:7;48244:5;48196:22;:54::i;:::-;48174:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;48015:321;;;:::o;6839:387::-;6899:4;7107:12;7174:7;7162:20;7154:28;;7217:1;7210:4;:8;7203:15;;;6839:387;;;:::o;48672:382::-;48766:1;48752:16;;:2;:16;;;;48744:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48825:16;48833:7;48825;:16::i;:::-;48824:17;48816:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48887:45;48916:1;48920:2;48924:7;48887:20;:45::i;:::-;48962:1;48945:9;:13;48955:2;48945:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;48993:2;48974:7;:16;48982:7;48974:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49038:7;49034:2;49013:33;;49030:1;49013:33;;;;;;;;;;;;48672:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:143::-;1043:5;1074:6;1068:13;1059:22;;1090:33;1117:5;1090:33;:::i;:::-;986:143;;;;:::o;1135:133::-;1178:5;1216:6;1203:20;1194:29;;1232:30;1256:5;1232:30;:::i;:::-;1135:133;;;;:::o;1274:137::-;1328:5;1359:6;1353:13;1344:22;;1375:30;1399:5;1375:30;:::i;:::-;1274:137;;;;:::o;1417:::-;1462:5;1500:6;1487:20;1478:29;;1516:32;1542:5;1516:32;:::i;:::-;1417:137;;;;:::o;1560:141::-;1616:5;1647:6;1641:13;1632:22;;1663:32;1689:5;1663:32;:::i;:::-;1560:141;;;;:::o;1720:338::-;1775:5;1824:3;1817:4;1809:6;1805:17;1801:27;1791:122;;1832:79;;:::i;:::-;1791:122;1949:6;1936:20;1974:78;2048:3;2040:6;2033:4;2025:6;2021:17;1974:78;:::i;:::-;1965:87;;1781:277;1720:338;;;;:::o;2078:340::-;2134:5;2183:3;2176:4;2168:6;2164:17;2160:27;2150:122;;2191:79;;:::i;:::-;2150:122;2308:6;2295:20;2333:79;2408:3;2400:6;2393:4;2385:6;2381:17;2333:79;:::i;:::-;2324:88;;2140:278;2078:340;;;;:::o;2424:139::-;2470:5;2508:6;2495:20;2486:29;;2524:33;2551:5;2524:33;:::i;:::-;2424:139;;;;:::o;2569:143::-;2626:5;2657:6;2651:13;2642:22;;2673:33;2700:5;2673:33;:::i;:::-;2569:143;;;;:::o;2718:329::-;2777:6;2826:2;2814:9;2805:7;2801:23;2797:32;2794:119;;;2832:79;;:::i;:::-;2794:119;2952:1;2977:53;3022:7;3013:6;3002:9;2998:22;2977:53;:::i;:::-;2967:63;;2923:117;2718:329;;;;:::o;3053:351::-;3123:6;3172:2;3160:9;3151:7;3147:23;3143:32;3140:119;;;3178:79;;:::i;:::-;3140:119;3298:1;3323:64;3379:7;3370:6;3359:9;3355:22;3323:64;:::i;:::-;3313:74;;3269:128;3053:351;;;;:::o;3410:474::-;3478:6;3486;3535:2;3523:9;3514:7;3510:23;3506:32;3503:119;;;3541:79;;:::i;:::-;3503:119;3661:1;3686:53;3731:7;3722:6;3711:9;3707:22;3686:53;:::i;:::-;3676:63;;3632:117;3788:2;3814:53;3859:7;3850:6;3839:9;3835:22;3814:53;:::i;:::-;3804:63;;3759:118;3410:474;;;;;:::o;3890:619::-;3967:6;3975;3983;4032:2;4020:9;4011:7;4007:23;4003:32;4000:119;;;4038:79;;:::i;:::-;4000:119;4158:1;4183:53;4228:7;4219:6;4208:9;4204:22;4183:53;:::i;:::-;4173:63;;4129:117;4285:2;4311:53;4356:7;4347:6;4336:9;4332:22;4311:53;:::i;:::-;4301:63;;4256:118;4413:2;4439:53;4484:7;4475:6;4464:9;4460:22;4439:53;:::i;:::-;4429:63;;4384:118;3890:619;;;;;:::o;4515:943::-;4610:6;4618;4626;4634;4683:3;4671:9;4662:7;4658:23;4654:33;4651:120;;;4690:79;;:::i;:::-;4651:120;4810:1;4835:53;4880:7;4871:6;4860:9;4856:22;4835:53;:::i;:::-;4825:63;;4781:117;4937:2;4963:53;5008:7;4999:6;4988:9;4984:22;4963:53;:::i;:::-;4953:63;;4908:118;5065:2;5091:53;5136:7;5127:6;5116:9;5112:22;5091:53;:::i;:::-;5081:63;;5036:118;5221:2;5210:9;5206:18;5193:32;5252:18;5244:6;5241:30;5238:117;;;5274:79;;:::i;:::-;5238:117;5379:62;5433:7;5424:6;5413:9;5409:22;5379:62;:::i;:::-;5369:72;;5164:287;4515:943;;;;;;;:::o;5464:468::-;5529:6;5537;5586:2;5574:9;5565:7;5561:23;5557:32;5554:119;;;5592:79;;:::i;:::-;5554:119;5712:1;5737:53;5782:7;5773:6;5762:9;5758:22;5737:53;:::i;:::-;5727:63;;5683:117;5839:2;5865:50;5907:7;5898:6;5887:9;5883:22;5865:50;:::i;:::-;5855:60;;5810:115;5464:468;;;;;:::o;5938:474::-;6006:6;6014;6063:2;6051:9;6042:7;6038:23;6034:32;6031:119;;;6069:79;;:::i;:::-;6031:119;6189:1;6214:53;6259:7;6250:6;6239:9;6235:22;6214:53;:::i;:::-;6204:63;;6160:117;6316:2;6342:53;6387:7;6378:6;6367:9;6363:22;6342:53;:::i;:::-;6332:63;;6287:118;5938:474;;;;;:::o;6418:619::-;6495:6;6503;6511;6560:2;6548:9;6539:7;6535:23;6531:32;6528:119;;;6566:79;;:::i;:::-;6528:119;6686:1;6711:53;6756:7;6747:6;6736:9;6732:22;6711:53;:::i;:::-;6701:63;;6657:117;6813:2;6839:53;6884:7;6875:6;6864:9;6860:22;6839:53;:::i;:::-;6829:63;;6784:118;6941:2;6967:53;7012:7;7003:6;6992:9;6988:22;6967:53;:::i;:::-;6957:63;;6912:118;6418:619;;;;;:::o;7043:765::-;7129:6;7137;7145;7153;7202:3;7190:9;7181:7;7177:23;7173:33;7170:120;;;7209:79;;:::i;:::-;7170:120;7329:1;7354:53;7399:7;7390:6;7379:9;7375:22;7354:53;:::i;:::-;7344:63;;7300:117;7456:2;7482:53;7527:7;7518:6;7507:9;7503:22;7482:53;:::i;:::-;7472:63;;7427:118;7584:2;7610:53;7655:7;7646:6;7635:9;7631:22;7610:53;:::i;:::-;7600:63;;7555:118;7712:2;7738:53;7783:7;7774:6;7763:9;7759:22;7738:53;:::i;:::-;7728:63;;7683:118;7043:765;;;;;;;:::o;7814:1417::-;7938:6;7946;7954;7962;7970;7978;8027:3;8015:9;8006:7;8002:23;7998:33;7995:120;;;8034:79;;:::i;:::-;7995:120;8154:1;8179:53;8224:7;8215:6;8204:9;8200:22;8179:53;:::i;:::-;8169:63;;8125:117;8281:2;8307:53;8352:7;8343:6;8332:9;8328:22;8307:53;:::i;:::-;8297:63;;8252:118;8409:2;8435:53;8480:7;8471:6;8460:9;8456:22;8435:53;:::i;:::-;8425:63;;8380:118;8537:2;8563:53;8608:7;8599:6;8588:9;8584:22;8563:53;:::i;:::-;8553:63;;8508:118;8693:3;8682:9;8678:19;8665:33;8725:18;8717:6;8714:30;8711:117;;;8747:79;;:::i;:::-;8711:117;8852:63;8907:7;8898:6;8887:9;8883:22;8852:63;:::i;:::-;8842:73;;8636:289;8992:3;8981:9;8977:19;8964:33;9024:18;9016:6;9013:30;9010:117;;;9046:79;;:::i;:::-;9010:117;9151:63;9206:7;9197:6;9186:9;9182:22;9151:63;:::i;:::-;9141:73;;8935:289;7814:1417;;;;;;;;:::o;9237:345::-;9304:6;9353:2;9341:9;9332:7;9328:23;9324:32;9321:119;;;9359:79;;:::i;:::-;9321:119;9479:1;9504:61;9557:7;9548:6;9537:9;9533:22;9504:61;:::i;:::-;9494:71;;9450:125;9237:345;;;;:::o;9588:327::-;9646:6;9695:2;9683:9;9674:7;9670:23;9666:32;9663:119;;;9701:79;;:::i;:::-;9663:119;9821:1;9846:52;9890:7;9881:6;9870:9;9866:22;9846:52;:::i;:::-;9836:62;;9792:116;9588:327;;;;:::o;9921:349::-;9990:6;10039:2;10027:9;10018:7;10014:23;10010:32;10007:119;;;10045:79;;:::i;:::-;10007:119;10165:1;10190:63;10245:7;10236:6;10225:9;10221:22;10190:63;:::i;:::-;10180:73;;10136:127;9921:349;;;;:::o;10276:509::-;10345:6;10394:2;10382:9;10373:7;10369:23;10365:32;10362:119;;;10400:79;;:::i;:::-;10362:119;10548:1;10537:9;10533:17;10520:31;10578:18;10570:6;10567:30;10564:117;;;10600:79;;:::i;:::-;10564:117;10705:63;10760:7;10751:6;10740:9;10736:22;10705:63;:::i;:::-;10695:73;;10491:287;10276:509;;;;:::o;10791:329::-;10850:6;10899:2;10887:9;10878:7;10874:23;10870:32;10867:119;;;10905:79;;:::i;:::-;10867:119;11025:1;11050:53;11095:7;11086:6;11075:9;11071:22;11050:53;:::i;:::-;11040:63;;10996:117;10791:329;;;;:::o;11126:351::-;11196:6;11245:2;11233:9;11224:7;11220:23;11216:32;11213:119;;;11251:79;;:::i;:::-;11213:119;11371:1;11396:64;11452:7;11443:6;11432:9;11428:22;11396:64;:::i;:::-;11386:74;;11342:128;11126:351;;;;:::o;11483:474::-;11551:6;11559;11608:2;11596:9;11587:7;11583:23;11579:32;11576:119;;;11614:79;;:::i;:::-;11576:119;11734:1;11759:53;11804:7;11795:6;11784:9;11780:22;11759:53;:::i;:::-;11749:63;;11705:117;11861:2;11887:53;11932:7;11923:6;11912:9;11908:22;11887:53;:::i;:::-;11877:63;;11832:118;11483:474;;;;;:::o;11963:654::-;12041:6;12049;12098:2;12086:9;12077:7;12073:23;12069:32;12066:119;;;12104:79;;:::i;:::-;12066:119;12224:1;12249:53;12294:7;12285:6;12274:9;12270:22;12249:53;:::i;:::-;12239:63;;12195:117;12379:2;12368:9;12364:18;12351:32;12410:18;12402:6;12399:30;12396:117;;;12432:79;;:::i;:::-;12396:117;12537:63;12592:7;12583:6;12572:9;12568:22;12537:63;:::i;:::-;12527:73;;12322:288;11963:654;;;;;:::o;12623:474::-;12691:6;12699;12748:2;12736:9;12727:7;12723:23;12719:32;12716:119;;;12754:79;;:::i;:::-;12716:119;12874:1;12899:53;12944:7;12935:6;12924:9;12920:22;12899:53;:::i;:::-;12889:63;;12845:117;13001:2;13027:53;13072:7;13063:6;13052:9;13048:22;13027:53;:::i;:::-;13017:63;;12972:118;12623:474;;;;;:::o;13103:619::-;13180:6;13188;13196;13245:2;13233:9;13224:7;13220:23;13216:32;13213:119;;;13251:79;;:::i;:::-;13213:119;13371:1;13396:53;13441:7;13432:6;13421:9;13417:22;13396:53;:::i;:::-;13386:63;;13342:117;13498:2;13524:53;13569:7;13560:6;13549:9;13545:22;13524:53;:::i;:::-;13514:63;;13469:118;13626:2;13652:53;13697:7;13688:6;13677:9;13673:22;13652:53;:::i;:::-;13642:63;;13597:118;13103:619;;;;;:::o;13728:765::-;13814:6;13822;13830;13838;13887:3;13875:9;13866:7;13862:23;13858:33;13855:120;;;13894:79;;:::i;:::-;13855:120;14014:1;14039:53;14084:7;14075:6;14064:9;14060:22;14039:53;:::i;:::-;14029:63;;13985:117;14141:2;14167:53;14212:7;14203:6;14192:9;14188:22;14167:53;:::i;:::-;14157:63;;14112:118;14269:2;14295:53;14340:7;14331:6;14320:9;14316:22;14295:53;:::i;:::-;14285:63;;14240:118;14397:2;14423:53;14468:7;14459:6;14448:9;14444:22;14423:53;:::i;:::-;14413:63;;14368:118;13728:765;;;;;;;:::o;14499:179::-;14568:10;14589:46;14631:3;14623:6;14589:46;:::i;:::-;14667:4;14662:3;14658:14;14644:28;;14499:179;;;;:::o;14684:118::-;14771:24;14789:5;14771:24;:::i;:::-;14766:3;14759:37;14684:118;;:::o;14808:157::-;14913:45;14933:24;14951:5;14933:24;:::i;:::-;14913:45;:::i;:::-;14908:3;14901:58;14808:157;;:::o;15001:732::-;15120:3;15149:54;15197:5;15149:54;:::i;:::-;15219:86;15298:6;15293:3;15219:86;:::i;:::-;15212:93;;15329:56;15379:5;15329:56;:::i;:::-;15408:7;15439:1;15424:284;15449:6;15446:1;15443:13;15424:284;;;15525:6;15519:13;15552:63;15611:3;15596:13;15552:63;:::i;:::-;15545:70;;15638:60;15691:6;15638:60;:::i;:::-;15628:70;;15484:224;15471:1;15468;15464:9;15459:14;;15424:284;;;15428:14;15724:3;15717:10;;15125:608;;;15001:732;;;;:::o;15739:109::-;15820:21;15835:5;15820:21;:::i;:::-;15815:3;15808:34;15739:109;;:::o;15854:118::-;15941:24;15959:5;15941:24;:::i;:::-;15936:3;15929:37;15854:118;;:::o;15978:360::-;16064:3;16092:38;16124:5;16092:38;:::i;:::-;16146:70;16209:6;16204:3;16146:70;:::i;:::-;16139:77;;16225:52;16270:6;16265:3;16258:4;16251:5;16247:16;16225:52;:::i;:::-;16302:29;16324:6;16302:29;:::i;:::-;16297:3;16293:39;16286:46;;16068:270;15978:360;;;;:::o;16344:364::-;16432:3;16460:39;16493:5;16460:39;:::i;:::-;16515:71;16579:6;16574:3;16515:71;:::i;:::-;16508:78;;16595:52;16640:6;16635:3;16628:4;16621:5;16617:16;16595:52;:::i;:::-;16672:29;16694:6;16672:29;:::i;:::-;16667:3;16663:39;16656:46;;16436:272;16344:364;;;;:::o;16714:377::-;16820:3;16848:39;16881:5;16848:39;:::i;:::-;16903:89;16985:6;16980:3;16903:89;:::i;:::-;16896:96;;17001:52;17046:6;17041:3;17034:4;17027:5;17023:16;17001:52;:::i;:::-;17078:6;17073:3;17069:16;17062:23;;16824:267;16714:377;;;;:::o;17121:845::-;17224:3;17261:5;17255:12;17290:36;17316:9;17290:36;:::i;:::-;17342:89;17424:6;17419:3;17342:89;:::i;:::-;17335:96;;17462:1;17451:9;17447:17;17478:1;17473:137;;;;17624:1;17619:341;;;;17440:520;;17473:137;17557:4;17553:9;17542;17538:25;17533:3;17526:38;17593:6;17588:3;17584:16;17577:23;;17473:137;;17619:341;17686:38;17718:5;17686:38;:::i;:::-;17746:1;17760:154;17774:6;17771:1;17768:13;17760:154;;;17848:7;17842:14;17838:1;17833:3;17829:11;17822:35;17898:1;17889:7;17885:15;17874:26;;17796:4;17793:1;17789:12;17784:17;;17760:154;;;17943:6;17938:3;17934:16;17927:23;;17626:334;;17440:520;;17228:738;;17121:845;;;;:::o;17972:366::-;18114:3;18135:67;18199:2;18194:3;18135:67;:::i;:::-;18128:74;;18211:93;18300:3;18211:93;:::i;:::-;18329:2;18324:3;18320:12;18313:19;;17972:366;;;:::o;18344:::-;18486:3;18507:67;18571:2;18566:3;18507:67;:::i;:::-;18500:74;;18583:93;18672:3;18583:93;:::i;:::-;18701:2;18696:3;18692:12;18685:19;;18344:366;;;:::o;18716:::-;18858:3;18879:67;18943:2;18938:3;18879:67;:::i;:::-;18872:74;;18955:93;19044:3;18955:93;:::i;:::-;19073:2;19068:3;19064:12;19057:19;;18716:366;;;:::o;19088:::-;19230:3;19251:67;19315:2;19310:3;19251:67;:::i;:::-;19244:74;;19327:93;19416:3;19327:93;:::i;:::-;19445:2;19440:3;19436:12;19429:19;;19088:366;;;:::o;19460:::-;19602:3;19623:67;19687:2;19682:3;19623:67;:::i;:::-;19616:74;;19699:93;19788:3;19699:93;:::i;:::-;19817:2;19812:3;19808:12;19801:19;;19460:366;;;:::o;19832:::-;19974:3;19995:67;20059:2;20054:3;19995:67;:::i;:::-;19988:74;;20071:93;20160:3;20071:93;:::i;:::-;20189:2;20184:3;20180:12;20173:19;;19832:366;;;:::o;20204:::-;20346:3;20367:67;20431:2;20426:3;20367:67;:::i;:::-;20360:74;;20443:93;20532:3;20443:93;:::i;:::-;20561:2;20556:3;20552:12;20545:19;;20204:366;;;:::o;20576:::-;20718:3;20739:67;20803:2;20798:3;20739:67;:::i;:::-;20732:74;;20815:93;20904:3;20815:93;:::i;:::-;20933:2;20928:3;20924:12;20917:19;;20576:366;;;:::o;20948:::-;21090:3;21111:67;21175:2;21170:3;21111:67;:::i;:::-;21104:74;;21187:93;21276:3;21187:93;:::i;:::-;21305:2;21300:3;21296:12;21289:19;;20948:366;;;:::o;21320:::-;21462:3;21483:67;21547:2;21542:3;21483:67;:::i;:::-;21476:74;;21559:93;21648:3;21559:93;:::i;:::-;21677:2;21672:3;21668:12;21661:19;;21320:366;;;:::o;21692:::-;21834:3;21855:67;21919:2;21914:3;21855:67;:::i;:::-;21848:74;;21931:93;22020:3;21931:93;:::i;:::-;22049:2;22044:3;22040:12;22033:19;;21692:366;;;:::o;22064:::-;22206:3;22227:67;22291:2;22286:3;22227:67;:::i;:::-;22220:74;;22303:93;22392:3;22303:93;:::i;:::-;22421:2;22416:3;22412:12;22405:19;;22064:366;;;:::o;22436:::-;22578:3;22599:67;22663:2;22658:3;22599:67;:::i;:::-;22592:74;;22675:93;22764:3;22675:93;:::i;:::-;22793:2;22788:3;22784:12;22777:19;;22436:366;;;:::o;22808:::-;22950:3;22971:67;23035:2;23030:3;22971:67;:::i;:::-;22964:74;;23047:93;23136:3;23047:93;:::i;:::-;23165:2;23160:3;23156:12;23149:19;;22808:366;;;:::o;23180:::-;23322:3;23343:67;23407:2;23402:3;23343:67;:::i;:::-;23336:74;;23419:93;23508:3;23419:93;:::i;:::-;23537:2;23532:3;23528:12;23521:19;;23180:366;;;:::o;23552:::-;23694:3;23715:67;23779:2;23774:3;23715:67;:::i;:::-;23708:74;;23791:93;23880:3;23791:93;:::i;:::-;23909:2;23904:3;23900:12;23893:19;;23552:366;;;:::o;23924:::-;24066:3;24087:67;24151:2;24146:3;24087:67;:::i;:::-;24080:74;;24163:93;24252:3;24163:93;:::i;:::-;24281:2;24276:3;24272:12;24265:19;;23924:366;;;:::o;24296:::-;24438:3;24459:67;24523:2;24518:3;24459:67;:::i;:::-;24452:74;;24535:93;24624:3;24535:93;:::i;:::-;24653:2;24648:3;24644:12;24637:19;;24296:366;;;:::o;24668:::-;24810:3;24831:67;24895:2;24890:3;24831:67;:::i;:::-;24824:74;;24907:93;24996:3;24907:93;:::i;:::-;25025:2;25020:3;25016:12;25009:19;;24668:366;;;:::o;25040:::-;25182:3;25203:67;25267:2;25262:3;25203:67;:::i;:::-;25196:74;;25279:93;25368:3;25279:93;:::i;:::-;25397:2;25392:3;25388:12;25381:19;;25040:366;;;:::o;25412:::-;25554:3;25575:67;25639:2;25634:3;25575:67;:::i;:::-;25568:74;;25651:93;25740:3;25651:93;:::i;:::-;25769:2;25764:3;25760:12;25753:19;;25412:366;;;:::o;25784:::-;25926:3;25947:67;26011:2;26006:3;25947:67;:::i;:::-;25940:74;;26023:93;26112:3;26023:93;:::i;:::-;26141:2;26136:3;26132:12;26125:19;;25784:366;;;:::o;26156:::-;26298:3;26319:67;26383:2;26378:3;26319:67;:::i;:::-;26312:74;;26395:93;26484:3;26395:93;:::i;:::-;26513:2;26508:3;26504:12;26497:19;;26156:366;;;:::o;26528:::-;26670:3;26691:67;26755:2;26750:3;26691:67;:::i;:::-;26684:74;;26767:93;26856:3;26767:93;:::i;:::-;26885:2;26880:3;26876:12;26869:19;;26528:366;;;:::o;26900:::-;27042:3;27063:67;27127:2;27122:3;27063:67;:::i;:::-;27056:74;;27139:93;27228:3;27139:93;:::i;:::-;27257:2;27252:3;27248:12;27241:19;;26900:366;;;:::o;27272:::-;27414:3;27435:67;27499:2;27494:3;27435:67;:::i;:::-;27428:74;;27511:93;27600:3;27511:93;:::i;:::-;27629:2;27624:3;27620:12;27613:19;;27272:366;;;:::o;27644:::-;27786:3;27807:67;27871:2;27866:3;27807:67;:::i;:::-;27800:74;;27883:93;27972:3;27883:93;:::i;:::-;28001:2;27996:3;27992:12;27985:19;;27644:366;;;:::o;28016:::-;28158:3;28179:67;28243:2;28238:3;28179:67;:::i;:::-;28172:74;;28255:93;28344:3;28255:93;:::i;:::-;28373:2;28368:3;28364:12;28357:19;;28016:366;;;:::o;28388:108::-;28465:24;28483:5;28465:24;:::i;:::-;28460:3;28453:37;28388:108;;:::o;28502:118::-;28589:24;28607:5;28589:24;:::i;:::-;28584:3;28577:37;28502:118;;:::o;28626:157::-;28731:45;28751:24;28769:5;28751:24;:::i;:::-;28731:45;:::i;:::-;28726:3;28719:58;28626:157;;:::o;28789:429::-;28966:3;28988:92;29076:3;29067:6;28988:92;:::i;:::-;28981:99;;29097:95;29188:3;29179:6;29097:95;:::i;:::-;29090:102;;29209:3;29202:10;;28789:429;;;;;:::o;29224:679::-;29420:3;29435:75;29506:3;29497:6;29435:75;:::i;:::-;29535:2;29530:3;29526:12;29519:19;;29548:75;29619:3;29610:6;29548:75;:::i;:::-;29648:2;29643:3;29639:12;29632:19;;29661:75;29732:3;29723:6;29661:75;:::i;:::-;29761:2;29756:3;29752:12;29745:19;;29774:75;29845:3;29836:6;29774:75;:::i;:::-;29874:2;29869:3;29865:12;29858:19;;29894:3;29887:10;;29224:679;;;;;;;:::o;29909:222::-;30002:4;30040:2;30029:9;30025:18;30017:26;;30053:71;30121:1;30110:9;30106:17;30097:6;30053:71;:::i;:::-;29909:222;;;;:::o;30137:442::-;30286:4;30324:2;30313:9;30309:18;30301:26;;30337:71;30405:1;30394:9;30390:17;30381:6;30337:71;:::i;:::-;30418:72;30486:2;30475:9;30471:18;30462:6;30418:72;:::i;:::-;30500;30568:2;30557:9;30553:18;30544:6;30500:72;:::i;:::-;30137:442;;;;;;:::o;30585:640::-;30780:4;30818:3;30807:9;30803:19;30795:27;;30832:71;30900:1;30889:9;30885:17;30876:6;30832:71;:::i;:::-;30913:72;30981:2;30970:9;30966:18;30957:6;30913:72;:::i;:::-;30995;31063:2;31052:9;31048:18;31039:6;30995:72;:::i;:::-;31114:9;31108:4;31104:20;31099:2;31088:9;31084:18;31077:48;31142:76;31213:4;31204:6;31142:76;:::i;:::-;31134:84;;30585:640;;;;;;;:::o;31231:553::-;31408:4;31446:3;31435:9;31431:19;31423:27;;31460:71;31528:1;31517:9;31513:17;31504:6;31460:71;:::i;:::-;31541:72;31609:2;31598:9;31594:18;31585:6;31541:72;:::i;:::-;31623;31691:2;31680:9;31676:18;31667:6;31623:72;:::i;:::-;31705;31773:2;31762:9;31758:18;31749:6;31705:72;:::i;:::-;31231:553;;;;;;;:::o;31790:373::-;31933:4;31971:2;31960:9;31956:18;31948:26;;32020:9;32014:4;32010:20;32006:1;31995:9;31991:17;31984:47;32048:108;32151:4;32142:6;32048:108;:::i;:::-;32040:116;;31790:373;;;;:::o;32169:483::-;32340:4;32378:2;32367:9;32363:18;32355:26;;32427:9;32421:4;32417:20;32413:1;32402:9;32398:17;32391:47;32455:108;32558:4;32549:6;32455:108;:::i;:::-;32447:116;;32573:72;32641:2;32630:9;32626:18;32617:6;32573:72;:::i;:::-;32169:483;;;;;:::o;32658:210::-;32745:4;32783:2;32772:9;32768:18;32760:26;;32796:65;32858:1;32847:9;32843:17;32834:6;32796:65;:::i;:::-;32658:210;;;;:::o;32874:313::-;32987:4;33025:2;33014:9;33010:18;33002:26;;33074:9;33068:4;33064:20;33060:1;33049:9;33045:17;33038:47;33102:78;33175:4;33166:6;33102:78;:::i;:::-;33094:86;;32874:313;;;;:::o;33193:419::-;33359:4;33397:2;33386:9;33382:18;33374:26;;33446:9;33440:4;33436:20;33432:1;33421:9;33417:17;33410:47;33474:131;33600:4;33474:131;:::i;:::-;33466:139;;33193:419;;;:::o;33618:::-;33784:4;33822:2;33811:9;33807:18;33799:26;;33871:9;33865:4;33861:20;33857:1;33846:9;33842:17;33835:47;33899:131;34025:4;33899:131;:::i;:::-;33891:139;;33618:419;;;:::o;34043:::-;34209:4;34247:2;34236:9;34232:18;34224:26;;34296:9;34290:4;34286:20;34282:1;34271:9;34267:17;34260:47;34324:131;34450:4;34324:131;:::i;:::-;34316:139;;34043:419;;;:::o;34468:::-;34634:4;34672:2;34661:9;34657:18;34649:26;;34721:9;34715:4;34711:20;34707:1;34696:9;34692:17;34685:47;34749:131;34875:4;34749:131;:::i;:::-;34741:139;;34468:419;;;:::o;34893:::-;35059:4;35097:2;35086:9;35082:18;35074:26;;35146:9;35140:4;35136:20;35132:1;35121:9;35117:17;35110:47;35174:131;35300:4;35174:131;:::i;:::-;35166:139;;34893:419;;;:::o;35318:::-;35484:4;35522:2;35511:9;35507:18;35499:26;;35571:9;35565:4;35561:20;35557:1;35546:9;35542:17;35535:47;35599:131;35725:4;35599:131;:::i;:::-;35591:139;;35318:419;;;:::o;35743:::-;35909:4;35947:2;35936:9;35932:18;35924:26;;35996:9;35990:4;35986:20;35982:1;35971:9;35967:17;35960:47;36024:131;36150:4;36024:131;:::i;:::-;36016:139;;35743:419;;;:::o;36168:::-;36334:4;36372:2;36361:9;36357:18;36349:26;;36421:9;36415:4;36411:20;36407:1;36396:9;36392:17;36385:47;36449:131;36575:4;36449:131;:::i;:::-;36441:139;;36168:419;;;:::o;36593:::-;36759:4;36797:2;36786:9;36782:18;36774:26;;36846:9;36840:4;36836:20;36832:1;36821:9;36817:17;36810:47;36874:131;37000:4;36874:131;:::i;:::-;36866:139;;36593:419;;;:::o;37018:::-;37184:4;37222:2;37211:9;37207:18;37199:26;;37271:9;37265:4;37261:20;37257:1;37246:9;37242:17;37235:47;37299:131;37425:4;37299:131;:::i;:::-;37291:139;;37018:419;;;:::o;37443:::-;37609:4;37647:2;37636:9;37632:18;37624:26;;37696:9;37690:4;37686:20;37682:1;37671:9;37667:17;37660:47;37724:131;37850:4;37724:131;:::i;:::-;37716:139;;37443:419;;;:::o;37868:::-;38034:4;38072:2;38061:9;38057:18;38049:26;;38121:9;38115:4;38111:20;38107:1;38096:9;38092:17;38085:47;38149:131;38275:4;38149:131;:::i;:::-;38141:139;;37868:419;;;:::o;38293:::-;38459:4;38497:2;38486:9;38482:18;38474:26;;38546:9;38540:4;38536:20;38532:1;38521:9;38517:17;38510:47;38574:131;38700:4;38574:131;:::i;:::-;38566:139;;38293:419;;;:::o;38718:::-;38884:4;38922:2;38911:9;38907:18;38899:26;;38971:9;38965:4;38961:20;38957:1;38946:9;38942:17;38935:47;38999:131;39125:4;38999:131;:::i;:::-;38991:139;;38718:419;;;:::o;39143:::-;39309:4;39347:2;39336:9;39332:18;39324:26;;39396:9;39390:4;39386:20;39382:1;39371:9;39367:17;39360:47;39424:131;39550:4;39424:131;:::i;:::-;39416:139;;39143:419;;;:::o;39568:::-;39734:4;39772:2;39761:9;39757:18;39749:26;;39821:9;39815:4;39811:20;39807:1;39796:9;39792:17;39785:47;39849:131;39975:4;39849:131;:::i;:::-;39841:139;;39568:419;;;:::o;39993:::-;40159:4;40197:2;40186:9;40182:18;40174:26;;40246:9;40240:4;40236:20;40232:1;40221:9;40217:17;40210:47;40274:131;40400:4;40274:131;:::i;:::-;40266:139;;39993:419;;;:::o;40418:::-;40584:4;40622:2;40611:9;40607:18;40599:26;;40671:9;40665:4;40661:20;40657:1;40646:9;40642:17;40635:47;40699:131;40825:4;40699:131;:::i;:::-;40691:139;;40418:419;;;:::o;40843:::-;41009:4;41047:2;41036:9;41032:18;41024:26;;41096:9;41090:4;41086:20;41082:1;41071:9;41067:17;41060:47;41124:131;41250:4;41124:131;:::i;:::-;41116:139;;40843:419;;;:::o;41268:::-;41434:4;41472:2;41461:9;41457:18;41449:26;;41521:9;41515:4;41511:20;41507:1;41496:9;41492:17;41485:47;41549:131;41675:4;41549:131;:::i;:::-;41541:139;;41268:419;;;:::o;41693:::-;41859:4;41897:2;41886:9;41882:18;41874:26;;41946:9;41940:4;41936:20;41932:1;41921:9;41917:17;41910:47;41974:131;42100:4;41974:131;:::i;:::-;41966:139;;41693:419;;;:::o;42118:::-;42284:4;42322:2;42311:9;42307:18;42299:26;;42371:9;42365:4;42361:20;42357:1;42346:9;42342:17;42335:47;42399:131;42525:4;42399:131;:::i;:::-;42391:139;;42118:419;;;:::o;42543:::-;42709:4;42747:2;42736:9;42732:18;42724:26;;42796:9;42790:4;42786:20;42782:1;42771:9;42767:17;42760:47;42824:131;42950:4;42824:131;:::i;:::-;42816:139;;42543:419;;;:::o;42968:::-;43134:4;43172:2;43161:9;43157:18;43149:26;;43221:9;43215:4;43211:20;43207:1;43196:9;43192:17;43185:47;43249:131;43375:4;43249:131;:::i;:::-;43241:139;;42968:419;;;:::o;43393:::-;43559:4;43597:2;43586:9;43582:18;43574:26;;43646:9;43640:4;43636:20;43632:1;43621:9;43617:17;43610:47;43674:131;43800:4;43674:131;:::i;:::-;43666:139;;43393:419;;;:::o;43818:::-;43984:4;44022:2;44011:9;44007:18;43999:26;;44071:9;44065:4;44061:20;44057:1;44046:9;44042:17;44035:47;44099:131;44225:4;44099:131;:::i;:::-;44091:139;;43818:419;;;:::o;44243:::-;44409:4;44447:2;44436:9;44432:18;44424:26;;44496:9;44490:4;44486:20;44482:1;44471:9;44467:17;44460:47;44524:131;44650:4;44524:131;:::i;:::-;44516:139;;44243:419;;;:::o;44668:::-;44834:4;44872:2;44861:9;44857:18;44849:26;;44921:9;44915:4;44911:20;44907:1;44896:9;44892:17;44885:47;44949:131;45075:4;44949:131;:::i;:::-;44941:139;;44668:419;;;:::o;45093:222::-;45186:4;45224:2;45213:9;45209:18;45201:26;;45237:71;45305:1;45294:9;45290:17;45281:6;45237:71;:::i;:::-;45093:222;;;;:::o;45321:129::-;45355:6;45382:20;;:::i;:::-;45372:30;;45411:33;45439:4;45431:6;45411:33;:::i;:::-;45321:129;;;:::o;45456:75::-;45489:6;45522:2;45516:9;45506:19;;45456:75;:::o;45537:307::-;45598:4;45688:18;45680:6;45677:30;45674:56;;;45710:18;;:::i;:::-;45674:56;45748:29;45770:6;45748:29;:::i;:::-;45740:37;;45832:4;45826;45822:15;45814:23;;45537:307;;;:::o;45850:308::-;45912:4;46002:18;45994:6;45991:30;45988:56;;;46024:18;;:::i;:::-;45988:56;46062:29;46084:6;46062:29;:::i;:::-;46054:37;;46146:4;46140;46136:15;46128:23;;45850:308;;;:::o;46164:132::-;46231:4;46254:3;46246:11;;46284:4;46279:3;46275:14;46267:22;;46164:132;;;:::o;46302:141::-;46351:4;46374:3;46366:11;;46397:3;46394:1;46387:14;46431:4;46428:1;46418:18;46410:26;;46302:141;;;:::o;46449:114::-;46516:6;46550:5;46544:12;46534:22;;46449:114;;;:::o;46569:98::-;46620:6;46654:5;46648:12;46638:22;;46569:98;;;:::o;46673:99::-;46725:6;46759:5;46753:12;46743:22;;46673:99;;;:::o;46778:113::-;46848:4;46880;46875:3;46871:14;46863:22;;46778:113;;;:::o;46897:184::-;46996:11;47030:6;47025:3;47018:19;47070:4;47065:3;47061:14;47046:29;;46897:184;;;;:::o;47087:168::-;47170:11;47204:6;47199:3;47192:19;47244:4;47239:3;47235:14;47220:29;;47087:168;;;;:::o;47261:169::-;47345:11;47379:6;47374:3;47367:19;47419:4;47414:3;47410:14;47395:29;;47261:169;;;;:::o;47436:148::-;47538:11;47575:3;47560:18;;47436:148;;;;:::o;47590:305::-;47630:3;47649:20;47667:1;47649:20;:::i;:::-;47644:25;;47683:20;47701:1;47683:20;:::i;:::-;47678:25;;47837:1;47769:66;47765:74;47762:1;47759:81;47756:107;;;47843:18;;:::i;:::-;47756:107;47887:1;47884;47880:9;47873:16;;47590:305;;;;:::o;47901:185::-;47941:1;47958:20;47976:1;47958:20;:::i;:::-;47953:25;;47992:20;48010:1;47992:20;:::i;:::-;47987:25;;48031:1;48021:35;;48036:18;;:::i;:::-;48021:35;48078:1;48075;48071:9;48066:14;;47901:185;;;;:::o;48092:348::-;48132:7;48155:20;48173:1;48155:20;:::i;:::-;48150:25;;48189:20;48207:1;48189:20;:::i;:::-;48184:25;;48377:1;48309:66;48305:74;48302:1;48299:81;48294:1;48287:9;48280:17;48276:105;48273:131;;;48384:18;;:::i;:::-;48273:131;48432:1;48429;48425:9;48414:20;;48092:348;;;;:::o;48446:191::-;48486:4;48506:20;48524:1;48506:20;:::i;:::-;48501:25;;48540:20;48558:1;48540:20;:::i;:::-;48535:25;;48579:1;48576;48573:8;48570:34;;;48584:18;;:::i;:::-;48570:34;48629:1;48626;48622:9;48614:17;;48446:191;;;;:::o;48643:96::-;48680:7;48709:24;48727:5;48709:24;:::i;:::-;48698:35;;48643:96;;;:::o;48745:90::-;48779:7;48822:5;48815:13;48808:21;48797:32;;48745:90;;;:::o;48841:77::-;48878:7;48907:5;48896:16;;48841:77;;;:::o;48924:149::-;48960:7;49000:66;48993:5;48989:78;48978:89;;48924:149;;;:::o;49079:126::-;49116:7;49156:42;49149:5;49145:54;49134:65;;49079:126;;;:::o;49211:77::-;49248:7;49277:5;49266:16;;49211:77;;;:::o;49294:154::-;49378:6;49373:3;49368;49355:30;49440:1;49431:6;49426:3;49422:16;49415:27;49294:154;;;:::o;49454:307::-;49522:1;49532:113;49546:6;49543:1;49540:13;49532:113;;;49631:1;49626:3;49622:11;49616:18;49612:1;49607:3;49603:11;49596:39;49568:2;49565:1;49561:10;49556:15;;49532:113;;;49663:6;49660:1;49657:13;49654:101;;;49743:1;49734:6;49729:3;49725:16;49718:27;49654:101;49503:258;49454:307;;;:::o;49767:320::-;49811:6;49848:1;49842:4;49838:12;49828:22;;49895:1;49889:4;49885:12;49916:18;49906:81;;49972:4;49964:6;49960:17;49950:27;;49906:81;50034:2;50026:6;50023:14;50003:18;50000:38;49997:84;;;50053:18;;:::i;:::-;49997:84;49818:269;49767:320;;;:::o;50093:281::-;50176:27;50198:4;50176:27;:::i;:::-;50168:6;50164:40;50306:6;50294:10;50291:22;50270:18;50258:10;50255:34;50252:62;50249:88;;;50317:18;;:::i;:::-;50249:88;50357:10;50353:2;50346:22;50136:238;50093:281;;:::o;50380:233::-;50419:3;50442:24;50460:5;50442:24;:::i;:::-;50433:33;;50488:66;50481:5;50478:77;50475:103;;;50558:18;;:::i;:::-;50475:103;50605:1;50598:5;50594:13;50587:20;;50380:233;;;:::o;50619:100::-;50658:7;50687:26;50707:5;50687:26;:::i;:::-;50676:37;;50619:100;;;:::o;50725:94::-;50764:7;50793:20;50807:5;50793:20;:::i;:::-;50782:31;;50725:94;;;:::o;50825:79::-;50864:7;50893:5;50882:16;;50825:79;;;:::o;50910:176::-;50942:1;50959:20;50977:1;50959:20;:::i;:::-;50954:25;;50993:20;51011:1;50993:20;:::i;:::-;50988:25;;51032:1;51022:35;;51037:18;;:::i;:::-;51022:35;51078:1;51075;51071:9;51066:14;;50910:176;;;;:::o;51092:180::-;51140:77;51137:1;51130:88;51237:4;51234:1;51227:15;51261:4;51258:1;51251:15;51278:180;51326:77;51323:1;51316:88;51423:4;51420:1;51413:15;51447:4;51444:1;51437:15;51464:180;51512:77;51509:1;51502:88;51609:4;51606:1;51599:15;51633:4;51630:1;51623:15;51650:180;51698:77;51695:1;51688:88;51795:4;51792:1;51785:15;51819:4;51816:1;51809:15;51836:180;51884:77;51881:1;51874:88;51981:4;51978:1;51971:15;52005:4;52002:1;51995:15;52022:180;52070:77;52067:1;52060:88;52167:4;52164:1;52157:15;52191:4;52188:1;52181:15;52208:117;52317:1;52314;52307:12;52331:117;52440:1;52437;52430:12;52454:117;52563:1;52560;52553:12;52577:117;52686:1;52683;52676:12;52700:102;52741:6;52792:2;52788:7;52783:2;52776:5;52772:14;52768:28;52758:38;;52700:102;;;:::o;52808:94::-;52841:8;52889:5;52885:2;52881:14;52860:35;;52808:94;;;:::o;52908:243::-;53048:34;53044:1;53036:6;53032:14;53025:58;53117:26;53112:2;53104:6;53100:15;53093:51;52908:243;:::o;53157:230::-;53297:34;53293:1;53285:6;53281:14;53274:58;53366:13;53361:2;53353:6;53349:15;53342:38;53157:230;:::o;53393:237::-;53533:34;53529:1;53521:6;53517:14;53510:58;53602:20;53597:2;53589:6;53585:15;53578:45;53393:237;:::o;53636:225::-;53776:34;53772:1;53764:6;53760:14;53753:58;53845:8;53840:2;53832:6;53828:15;53821:33;53636:225;:::o;53867:178::-;54007:30;54003:1;53995:6;53991:14;53984:54;53867:178;:::o;54051:240::-;54191:34;54187:1;54179:6;54175:14;54168:58;54260:23;54255:2;54247:6;54243:15;54236:48;54051:240;:::o;54297:227::-;54437:34;54433:1;54425:6;54421:14;54414:58;54506:10;54501:2;54493:6;54489:15;54482:35;54297:227;:::o;54530:223::-;54670:34;54666:1;54658:6;54654:14;54647:58;54739:6;54734:2;54726:6;54722:15;54715:31;54530:223;:::o;54759:175::-;54899:27;54895:1;54887:6;54883:14;54876:51;54759:175;:::o;54940:231::-;55080:34;55076:1;55068:6;55064:14;55057:58;55149:14;55144:2;55136:6;55132:15;55125:39;54940:231;:::o;55177:230::-;55317:34;55313:1;55305:6;55301:14;55294:58;55386:13;55381:2;55373:6;55369:15;55362:38;55177:230;:::o;55413:243::-;55553:34;55549:1;55541:6;55537:14;55530:58;55622:26;55617:2;55609:6;55605:15;55598:51;55413:243;:::o;55662:234::-;55802:34;55798:1;55790:6;55786:14;55779:58;55871:17;55866:2;55858:6;55854:15;55847:42;55662:234;:::o;55902:229::-;56042:34;56038:1;56030:6;56026:14;56019:58;56111:12;56106:2;56098:6;56094:15;56087:37;55902:229;:::o;56137:228::-;56277:34;56273:1;56265:6;56261:14;56254:58;56346:11;56341:2;56333:6;56329:15;56322:36;56137:228;:::o;56371:238::-;56511:34;56507:1;56499:6;56495:14;56488:58;56580:21;56575:2;56567:6;56563:15;56556:46;56371:238;:::o;56615:182::-;56755:34;56751:1;56743:6;56739:14;56732:58;56615:182;:::o;56803:231::-;56943:34;56939:1;56931:6;56927:14;56920:58;57012:14;57007:2;56999:6;56995:15;56988:39;56803:231;:::o;57040:182::-;57180:34;57176:1;57168:6;57164:14;57157:58;57040:182;:::o;57228:228::-;57368:34;57364:1;57356:6;57352:14;57345:58;57437:11;57432:2;57424:6;57420:15;57413:36;57228:228;:::o;57462:234::-;57602:34;57598:1;57590:6;57586:14;57579:58;57671:17;57666:2;57658:6;57654:15;57647:42;57462:234;:::o;57702:::-;57842:34;57838:1;57830:6;57826:14;57819:58;57911:17;57906:2;57898:6;57894:15;57887:42;57702:234;:::o;57942:220::-;58082:34;58078:1;58070:6;58066:14;58059:58;58151:3;58146:2;58138:6;58134:15;58127:28;57942:220;:::o;58168:232::-;58308:34;58304:1;58296:6;58292:14;58285:58;58377:15;58372:2;58364:6;58360:15;58353:40;58168:232;:::o;58406:236::-;58546:34;58542:1;58534:6;58530:14;58523:58;58615:19;58610:2;58602:6;58598:15;58591:44;58406:236;:::o;58648:232::-;58788:34;58784:1;58776:6;58772:14;58765:58;58857:15;58852:2;58844:6;58840:15;58833:40;58648:232;:::o;58886:231::-;59026:34;59022:1;59014:6;59010:14;59003:58;59095:14;59090:2;59082:6;59078:15;59071:39;58886:231;:::o;59123:228::-;59263:34;59259:1;59251:6;59247:14;59240:58;59332:11;59327:2;59319:6;59315:15;59308:36;59123:228;:::o;59357:122::-;59430:24;59448:5;59430:24;:::i;:::-;59423:5;59420:35;59410:63;;59469:1;59466;59459:12;59410:63;59357:122;:::o;59485:116::-;59555:21;59570:5;59555:21;:::i;:::-;59548:5;59545:32;59535:60;;59591:1;59588;59581:12;59535:60;59485:116;:::o;59607:120::-;59679:23;59696:5;59679:23;:::i;:::-;59672:5;59669:34;59659:62;;59717:1;59714;59707:12;59659:62;59607:120;:::o;59733:122::-;59806:24;59824:5;59806:24;:::i;:::-;59799:5;59796:35;59786:63;;59845:1;59842;59835:12;59786:63;59733:122;:::o

Swarm Source

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