ETH Price: $3,405.58 (+3.14%)

Token

JOYWORLD JOYtoys (JOYtoy)
 

Overview

Max Total Supply

4,288 JOYtoy

Holders

1,696

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 JOYtoy
0xa77c4fe17cfd86a499ade6ecc8b3bee2f698c8e0
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

JOYtoys are special, powerful objects from the [JOYs in JOYWORLD](https://opensea.io/collection/joyworld-s2). You can mint new [JOYtoys at JOY.WORLD](https://joy.world/joytoys) or get them here when sold out.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
JOYtoys

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-12-30
*/

pragma solidity >=0.6.0 <0.8.0;
pragma abicoder v2;

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

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

// SPDX-License-Identifier: MIT

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


/**
 * @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 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 Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

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

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

        return c;
    }

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

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


pragma solidity >=0.6.2 <0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint256(_at(set._inner, index)));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        return _get(map, key, "EnumerableMap: nonexistent key");
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(value)));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

   /**
    * @dev Returns the element stored at position `index` in the set. O(1).
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint256(value)));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint256(_get(map._inner, bytes32(key))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint256(_get(map._inner, bytes32(key), errorMessage)));
    }
}


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` 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);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = byte(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

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

        return _holderTokens[owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(_baseURI, tokenId.toString()));
    }
    
    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = 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 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 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 returns (bool) {
        return _tokenOwners.contains(tokenId);
    }

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

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

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

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

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

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(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(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);

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @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()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

    function _approve(address to, uint256 tokenId) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

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

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

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

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

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

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

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


/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

interface JOYContract {
    function ownerOf(uint256 tokenId) external view returns (address owner);
}
 
contract JOYtoys is ERC721, Ownable {
    using SafeMath for uint256;    

    string public joyGalleryLink;
    uint256 JOYtoyIndex;
    address payable public joyWallet;
    
    mapping(uint256 => string[30]) JOYtoyArtwork;
    mapping(uint256 => string[30]) artworkTypeMemory;    
    mapping(uint256 => bool[30]) artworkSlotFilled;    
    mapping(uint256 => address[5]) royaltyAddressMemory;
    mapping(uint256 => uint256[5]) royaltyPercentageMemory;    
    
    mapping(uint256 => string) toyNameMemory;
    mapping(uint256 => string) featuresMemory;
    mapping(uint256 => uint256) editionSizeMemory;
    mapping(uint256 => string) powerMemory;
    mapping(uint256 => uint256) editionNumberMemory;
    mapping(uint256 => uint256) totalCreated;
    mapping(uint256 => uint256) totalMinted;
    mapping(uint256 => bool) vendingMachineMode;
    mapping(uint256 => uint256) priceMemory;
    mapping(uint256 => uint256) royaltyLengthMemory;
    mapping(uint256 => uint256) royaltyMemory;
    mapping(uint256 => uint256) artworkJOYtoyReference;
    mapping (uint256 => bool) toyMintingActive;

    mapping(uint256 => uint256) joyCollabTokenId;    
    mapping(uint256 => address) joyHolderCollaborator;
    mapping(uint256 => bool) joyHolderCollabActive;
    mapping(uint256 => uint256) joyHolderCollabPercent;
    mapping(uint256 => string) collaboratorNamesMemory;

    string JOYtoyURI1;
    string JOYtoyURI2;
    
    address public joyContractAddress;
    JOYContract joyWorld;
    
    string public artist = "John Orion Young";
    string public artworkTypeList;
    
    constructor() ERC721("JOYWORLD JOYtoys", "JOYtoy") public {
    JOYtoyIndex = 1;
    updateURI("https://joyworld.azurewebsites.net/api/HttpTrigger?id=");
    updateJOYtoyURI("https://joyworldmulti.azurewebsites.net/api/HttpTrigger?id=", "&artworkIndex=");
    joyWallet = 0x9aE048c47aef066E03593D5Edb230E3fa80c3f17;
    joyContractAddress = 0x6c7B6cc55d4098400aC787C8793205D3E86C37C9;
    joyWorld = JOYContract(joyContractAddress);
    }  

    event NewJOYtoyCreated(string artworkHash, string artworkType, string power, string toyName, string feature, uint256 editionSize, bool vendingMachine, uint256 price, uint256 royalty, uint256 JOYtoyIndex);
    event AddJOYtoyRoyalties(uint256 JOYtoyId, uint256 count);
    event AddJOYCollector(uint256 JOYtoyId, uint256 joyTokenId, uint256 joyCollectorPercent, bool collectorActive);    
    event ClearRoyalties(uint256 JOYtoyId);
    event NewArtworkAdded(uint256 JOYtoyToUpdate, string artworkHash, string artworkType, uint256 artworkIndex);  
    event UpdateFeature(uint256 JOYtoyToUpdate, string newFeatures);
    event UpdatePrice(uint256 JOYtoyToUpdate, uint256 price);
    event CloseJOYtoyWindow(uint256 JOYtoyId);
    
    function createJOYtoy(string memory artworkHash, string memory artworkType, string memory power, string memory toyName, string memory feature, uint256 editionSize, bool vendingMachine, uint256 price, uint256 royalty) public onlyOwner {
        toyMintingActive[JOYtoyIndex] = true;
        
        JOYtoyArtwork[JOYtoyIndex][1] = artworkHash;
        artworkTypeMemory[JOYtoyIndex][1] = artworkType;
        powerMemory[JOYtoyIndex] = power;
        toyNameMemory[JOYtoyIndex] = toyName;
        featuresMemory[JOYtoyIndex] = feature;
        editionSizeMemory[JOYtoyIndex] = editionSize;
        totalCreated[JOYtoyIndex] = 0;
        totalMinted[JOYtoyIndex] = 0;
        artworkSlotFilled[JOYtoyIndex][1] = true;
        vendingMachineMode[JOYtoyIndex] = vendingMachine;
        priceMemory[JOYtoyIndex] = price;
        royaltyMemory[JOYtoyIndex] = royalty;
        
        emit NewJOYtoyCreated(artworkHash, artworkType, power, toyName, feature, editionSize, vendingMachine, price, royalty, JOYtoyIndex);
            
        JOYtoyIndex = JOYtoyIndex + 1;
    }
    
    function addJOYtoyRoyalties(uint256 JOYtoyId, address[] memory royaltyAddresses, uint256[] memory royaltyPercentage, string memory collaboratorNames) public onlyOwner {
        require(royaltyAddresses.length == royaltyPercentage.length);
        require(royaltyAddresses.length <= 5);
        
        uint256 totalCollaboratorRoyalties;
        collaboratorNamesMemory[JOYtoyId] = collaboratorNames;
        
        for(uint256 i=0; i<royaltyAddresses.length; i++){
            royaltyAddressMemory[JOYtoyId][i] = royaltyAddresses[i];
            royaltyPercentageMemory[JOYtoyId][i] = royaltyPercentage[i];
            totalCollaboratorRoyalties = totalCollaboratorRoyalties + royaltyPercentage[i];
        }
        
        royaltyLengthMemory[JOYtoyId] = royaltyAddresses.length;
        
        emit AddJOYtoyRoyalties(JOYtoyId, royaltyAddresses.length);
    }
    
    function getRoyalties(uint256 JOYtoyId) public view returns (address[5] memory addresses, uint256[5] memory percentages) {
        for(uint256 i=0; i<royaltyLengthMemory[JOYtoyId]; i++){
            addresses[i] = royaltyAddressMemory[JOYtoyId][i];
            percentages[i] = royaltyPercentageMemory[JOYtoyId][i];
        }    
    }
    
    function addJOYCollector(uint256 JOYtoyId, uint256 joyTokenId, uint256 joyCollectorPercent, bool collectorActive) public onlyOwner {
        joyCollabTokenId[JOYtoyId] = joyTokenId;
        joyHolderCollaborator[JOYtoyId] = originalJOYOwner(joyTokenId);
        joyHolderCollabPercent[JOYtoyId] = joyCollectorPercent;
        joyHolderCollabActive[JOYtoyId] = collectorActive;
        
        emit AddJOYCollector(JOYtoyId, joyTokenId, joyCollectorPercent, collectorActive);
    }
    
    function getJoyCollaborator(uint256 JOYtoyId) public view returns (uint256 joyTokenId, address joyTokenHolder, uint256 joyCollectorPercent, bool collectorActive) {
        joyTokenId = joyCollabTokenId[JOYtoyId];
        joyTokenHolder = joyHolderCollaborator[JOYtoyId];
        joyCollectorPercent = joyHolderCollabPercent[JOYtoyId];
        collectorActive = joyHolderCollabActive[JOYtoyId];
    }
    
    function clearRoyalties(uint256 JOYtoyId) public onlyOwner {
        for(uint256 i=0; i<royaltyLengthMemory[JOYtoyId]; i++){
            royaltyAddressMemory[JOYtoyId][i] = 0x0000000000000000000000000000000000000000;
            royaltyPercentageMemory[JOYtoyId][i] = 0;
        }
        
        collaboratorNamesMemory[JOYtoyId] = "";
        royaltyLengthMemory[JOYtoyId] = 0;
        
        emit ClearRoyalties(JOYtoyId);
    }
  
    function addJOYtoyArtwork(uint256 JOYtoyToUpdate, string memory artworkHash, string memory artworkType, uint256 artworkIndex) public onlyOwner{
        require(artworkSlotFilled[JOYtoyToUpdate][artworkIndex] == false);
        
        JOYtoyArtwork[JOYtoyToUpdate][artworkIndex] = artworkHash;
        artworkTypeMemory[JOYtoyToUpdate][artworkIndex] = artworkType;
            
        artworkSlotFilled[JOYtoyToUpdate][artworkIndex] = true;
        
        emit NewArtworkAdded(JOYtoyToUpdate, artworkHash, artworkType, artworkIndex);
    }

    function updateFeature(uint256 JOYtoyToUpdate, string memory newFeatures) public onlyOwner{
        featuresMemory[JOYtoyToUpdate] = newFeatures; 
        
        emit UpdateFeature(JOYtoyToUpdate, newFeatures);
    }
   
    function updatePrice(uint256 JOYtoyToUpdate, uint256 price) public onlyOwner{
        priceMemory[JOYtoyToUpdate] = price;
        
        emit UpdatePrice(JOYtoyToUpdate, price/10**18);
    }
    
    function mintJOYtoy(uint256 JOYtoyId, uint256 amountToMint) public onlyOwner {
        require(toyMintingActive[JOYtoyId] == true);
        require(totalMinted[JOYtoyId] + amountToMint <= editionSizeMemory[JOYtoyId]);
        
        for(uint256 i=totalMinted[JOYtoyId]; i<amountToMint + totalMinted[JOYtoyId]; i++) {
            uint256 tokenId = totalSupply() + 1;
            artworkJOYtoyReference[tokenId] = JOYtoyId;
            editionNumberMemory[tokenId] = i + 1;

            _safeMint(msg.sender, tokenId);
        }

        totalMinted[JOYtoyId] = totalMinted[JOYtoyId] + amountToMint;
        
        if (totalMinted[JOYtoyId] == editionSizeMemory[JOYtoyId]) {
            closeJOYtoyWindow(JOYtoyId);
        }
    }

    function JOYtoyMachine(uint256 JOYtoyId) public payable {
        require(toyMintingActive[JOYtoyId] == true);
        require(totalMinted[JOYtoyId] + 1 <= editionSizeMemory[JOYtoyId]);
        require(vendingMachineMode[JOYtoyId] == true);
        require(msg.value == priceMemory[JOYtoyId]);
        
        uint256 tokenId = totalSupply() + 1;
        artworkJOYtoyReference[tokenId] = JOYtoyId;
        editionNumberMemory[tokenId] = totalMinted[JOYtoyId] + 1;
        
        (address[5] memory royaltyAddress, uint256[5] memory percentage) = getRoyalties(JOYtoyId); 
        
        for(uint256 i=0; i<royaltyLengthMemory[JOYtoyId]; i++){
            address payable artistWallet = address(uint160(royaltyAddress[i]));
            artistWallet.transfer(msg.value/100*percentage[i]);   
        }
        
        if(joyHolderCollabActive[JOYtoyId] == true){
            address payable joyHolder = address(uint160(joyHolderCollaborator[JOYtoyId]));
            uint256 joyHolderPercentage = joyHolderCollabPercent[JOYtoyId];
            
            joyHolder.transfer(msg.value/100*joyHolderPercentage);
        }
        
        joyWallet.transfer(address(this).balance);

        _safeMint(msg.sender, tokenId);

        totalMinted[JOYtoyId] = totalMinted[JOYtoyId] + 1;
        
        if (totalMinted[JOYtoyId] == editionSizeMemory[JOYtoyId]) {
            closeJOYtoyWindow(JOYtoyId);
        }
    }

    function closeJOYtoyWindow(uint256 JOYtoyId) public onlyOwner {
        toyMintingActive[JOYtoyId] = false;
        editionSizeMemory[JOYtoyId] = totalMinted[JOYtoyId];
        
        emit CloseJOYtoyWindow(JOYtoyId); 
    }
    
    function withdrawFunds() public onlyOwner {
        msg.sender.transfer(address(this).balance);
    }

    function getJOYtoyArtworkData(uint256 JOYtoyId, uint256 index) public view returns (string memory artworkHash, string memory artworkType, uint256 unmintedEditions) {
        artworkHash = JOYtoyArtwork[JOYtoyId][index];
        artworkType = artworkTypeMemory[JOYtoyId][index];
        unmintedEditions = editionSizeMemory[JOYtoyId] - totalMinted[JOYtoyId];

    }
    
    function getMetadata(uint256 tokenId) public view returns (string memory toyName, string memory power, uint256 editionSize, uint256 editionNumber, bool vendingMachine, string memory feature, uint256 price, string memory collaborators, bool toyActive) {
        require(_exists(tokenId), "Token does not exist.");
        uint256 JOYtoyRef = artworkJOYtoyReference[tokenId];
        
        toyName = toyNameMemory[JOYtoyRef];
        power = powerMemory[JOYtoyRef];
        editionSize = editionSizeMemory[JOYtoyRef];
        editionNumber = editionNumberMemory[tokenId];
        vendingMachine = vendingMachineMode[JOYtoyRef];
        feature = featuresMemory[JOYtoyRef];
        price = priceMemory[JOYtoyRef];
        collaborators = collaboratorNamesMemory[JOYtoyRef];
        toyActive = toyMintingActive[JOYtoyRef];
    }
    
    function getRoyaltyData(uint256 tokenId) public view returns (address artistAddress, uint256 royaltyFeeById) {
        require(_exists(tokenId), "Token does not exist.");
        uint256 JOYtoyRef = artworkJOYtoyReference[tokenId];
        
        artistAddress = joyWallet;
        royaltyFeeById = royaltyMemory[JOYtoyRef];
    }
    
    function getArtworkData(uint256 tokenId, uint256 index) public view returns (string memory artworkHash, string memory artworkType) {
        require(_exists(tokenId), "Token does not exist.");
        uint256 JOYtoyRef = artworkJOYtoyReference[tokenId];
        
        artworkHash = JOYtoyArtwork[JOYtoyRef][index];
        artworkType = artworkTypeMemory[JOYtoyRef][index];        
    }
    
    function updateGalleryLink(string memory newURL) public onlyOwner {
        joyGalleryLink = newURL;
    }

    function updatePaymentWallet(address payable newWallet) public onlyOwner {
        joyWallet = newWallet;
    }
    
    function updateURI(string memory newURI) public onlyOwner {
        _setBaseURI(newURI);
    }
    
    function updateJOYtoyURI(string memory newURI1, string memory newURI2) public onlyOwner {
        JOYtoyURI1 = newURI1;
        JOYtoyURI2 = newURI2;
    }
    
    function JOYtoyURI(uint256 tokenId, uint256 artworkIndex) external view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(JOYtoyURI1, integerToString(tokenId), JOYtoyURI2, integerToString(artworkIndex)));
    }
    
    function originalJOYOwner(uint256 joyTokenId) public view returns (address ownerOfJOY) {
        ownerOfJOY = joyWorld.ownerOf(joyTokenId);        
    }
    
    function updateArtworkTypeList(string memory newArtworkTypeList) public onlyOwner {
        artworkTypeList = newArtworkTypeList; 
    }

    function updateJOYContractAddress(address newJOYaddress) public onlyOwner {
        joyContractAddress = newJOYaddress;
        joyWorld = JOYContract(joyContractAddress);
    }    
    
    function integerToString(uint _i) internal pure returns (string memory) {
        if (_i == 0) {
            return "0";
        }
        
        uint j = _i;
        uint len;
      
        while (j != 0) {
            len++;
            j /= 10;
        }
      
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
      
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        }
      return string(bstr);
    }    
       
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"JOYtoyId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"joyTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"joyCollectorPercent","type":"uint256"},{"indexed":false,"internalType":"bool","name":"collectorActive","type":"bool"}],"name":"AddJOYCollector","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"JOYtoyId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"AddJOYtoyRoyalties","type":"event"},{"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":"uint256","name":"JOYtoyId","type":"uint256"}],"name":"ClearRoyalties","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"JOYtoyId","type":"uint256"}],"name":"CloseJOYtoyWindow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"JOYtoyToUpdate","type":"uint256"},{"indexed":false,"internalType":"string","name":"artworkHash","type":"string"},{"indexed":false,"internalType":"string","name":"artworkType","type":"string"},{"indexed":false,"internalType":"uint256","name":"artworkIndex","type":"uint256"}],"name":"NewArtworkAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"artworkHash","type":"string"},{"indexed":false,"internalType":"string","name":"artworkType","type":"string"},{"indexed":false,"internalType":"string","name":"power","type":"string"},{"indexed":false,"internalType":"string","name":"toyName","type":"string"},{"indexed":false,"internalType":"string","name":"feature","type":"string"},{"indexed":false,"internalType":"uint256","name":"editionSize","type":"uint256"},{"indexed":false,"internalType":"bool","name":"vendingMachine","type":"bool"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"royalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"JOYtoyIndex","type":"uint256"}],"name":"NewJOYtoyCreated","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"JOYtoyToUpdate","type":"uint256"},{"indexed":false,"internalType":"string","name":"newFeatures","type":"string"}],"name":"UpdateFeature","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"JOYtoyToUpdate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"UpdatePrice","type":"event"},{"inputs":[{"internalType":"uint256","name":"JOYtoyId","type":"uint256"}],"name":"JOYtoyMachine","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"artworkIndex","type":"uint256"}],"name":"JOYtoyURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"JOYtoyId","type":"uint256"},{"internalType":"uint256","name":"joyTokenId","type":"uint256"},{"internalType":"uint256","name":"joyCollectorPercent","type":"uint256"},{"internalType":"bool","name":"collectorActive","type":"bool"}],"name":"addJOYCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"JOYtoyToUpdate","type":"uint256"},{"internalType":"string","name":"artworkHash","type":"string"},{"internalType":"string","name":"artworkType","type":"string"},{"internalType":"uint256","name":"artworkIndex","type":"uint256"}],"name":"addJOYtoyArtwork","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"JOYtoyId","type":"uint256"},{"internalType":"address[]","name":"royaltyAddresses","type":"address[]"},{"internalType":"uint256[]","name":"royaltyPercentage","type":"uint256[]"},{"internalType":"string","name":"collaboratorNames","type":"string"}],"name":"addJOYtoyRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artist","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artworkTypeList","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"JOYtoyId","type":"uint256"}],"name":"clearRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"JOYtoyId","type":"uint256"}],"name":"closeJOYtoyWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"artworkHash","type":"string"},{"internalType":"string","name":"artworkType","type":"string"},{"internalType":"string","name":"power","type":"string"},{"internalType":"string","name":"toyName","type":"string"},{"internalType":"string","name":"feature","type":"string"},{"internalType":"uint256","name":"editionSize","type":"uint256"},{"internalType":"bool","name":"vendingMachine","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"royalty","type":"uint256"}],"name":"createJOYtoy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getArtworkData","outputs":[{"internalType":"string","name":"artworkHash","type":"string"},{"internalType":"string","name":"artworkType","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"JOYtoyId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getJOYtoyArtworkData","outputs":[{"internalType":"string","name":"artworkHash","type":"string"},{"internalType":"string","name":"artworkType","type":"string"},{"internalType":"uint256","name":"unmintedEditions","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"JOYtoyId","type":"uint256"}],"name":"getJoyCollaborator","outputs":[{"internalType":"uint256","name":"joyTokenId","type":"uint256"},{"internalType":"address","name":"joyTokenHolder","type":"address"},{"internalType":"uint256","name":"joyCollectorPercent","type":"uint256"},{"internalType":"bool","name":"collectorActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMetadata","outputs":[{"internalType":"string","name":"toyName","type":"string"},{"internalType":"string","name":"power","type":"string"},{"internalType":"uint256","name":"editionSize","type":"uint256"},{"internalType":"uint256","name":"editionNumber","type":"uint256"},{"internalType":"bool","name":"vendingMachine","type":"bool"},{"internalType":"string","name":"feature","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"collaborators","type":"string"},{"internalType":"bool","name":"toyActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"JOYtoyId","type":"uint256"}],"name":"getRoyalties","outputs":[{"internalType":"address[5]","name":"addresses","type":"address[5]"},{"internalType":"uint256[5]","name":"percentages","type":"uint256[5]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRoyaltyData","outputs":[{"internalType":"address","name":"artistAddress","type":"address"},{"internalType":"uint256","name":"royaltyFeeById","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":[],"name":"joyContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"joyGalleryLink","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"joyWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"JOYtoyId","type":"uint256"},{"internalType":"uint256","name":"amountToMint","type":"uint256"}],"name":"mintJOYtoy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"joyTokenId","type":"uint256"}],"name":"originalJOYOwner","outputs":[{"internalType":"address","name":"ownerOfJOY","type":"address"}],"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":"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":"string","name":"newArtworkTypeList","type":"string"}],"name":"updateArtworkTypeList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"JOYtoyToUpdate","type":"uint256"},{"internalType":"string","name":"newFeatures","type":"string"}],"name":"updateFeature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURL","type":"string"}],"name":"updateGalleryLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newJOYaddress","type":"address"}],"name":"updateJOYContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI1","type":"string"},{"internalType":"string","name":"newURI2","type":"string"}],"name":"updateJOYtoyURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newWallet","type":"address"}],"name":"updatePaymentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"JOYtoyToUpdate","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052601060808190526f4a6f686e204f72696f6e20596f756e6760801b60a09081526200003391602991906200035c565b503480156200004157600080fd5b50604080518082018252601081526f4a4f59574f524c44204a4f59746f797360801b602080830191909152825180840190935260068352654a4f59746f7960d01b9083015290620000996301ffc9a760e01b62000232565b8151620000ae9060069060208501906200035c565b508051620000c49060079060208401906200035c565b50620000d76380ac58cd60e01b62000232565b620000e9635b5e139f60e01b62000232565b620000fb63780e9d6360e01b62000232565b50600090506200010a6200028d565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600c81905550620001846040518060600160405280603681526020016200468d6036913962000291565b620001cd6040518060600160405280603b8152602001620046c3603b913960408051808201909152600e81526d26617274776f726b496e6465783d60901b6020820152620002d9565b600d80546001600160a01b0319908116739ae048c47aef066e03593d5edb230e3fa80c3f1717909155602780548216736c7b6cc55d4098400ac787c8793205d3e86c37c91790819055602880549092166001600160a01b039190911617905562000474565b6001600160e01b03198082161415620002685760405162461bcd60e51b81526004016200025f9062000408565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b3390565b6200029b6200028d565b600a546001600160a01b03908116911614620002cb5760405162461bcd60e51b81526004016200025f906200043f565b620002d68162000343565b50565b620002e36200028d565b600a546001600160a01b03908116911614620003135760405162461bcd60e51b81526004016200025f906200043f565b8151620003289060259060208501906200035c565b5080516200033e9060269060208401906200035c565b505050565b8051620003589060099060208401906200035c565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620003945760008555620003df565b82601f10620003af57805160ff1916838001178555620003df565b82800160010185558215620003df579182015b82811115620003df578251825591602001919060010190620003c2565b50620003ed929150620003f1565b5090565b5b80821115620003ed5760008155600101620003f2565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b61420980620004846000396000f3fe6080604052600436106102ae5760003560e01c80636a5d507111610175578063a65ff74c116100dc578063c87b56dd11610095578063e985e9c51161006f578063e985e9c51461086a578063f1f5e3ae1461088a578063f2fde38b146108aa578063f90efd4a146108ca576102ae565b8063c87b56dd1461080a578063d1e47eac1461082a578063df5eb0e71461084a576102ae565b8063a65ff74c1461071e578063ac98b3a81461074c578063ae73ee301461077c578063b88d4fde1461079c578063bb3bafd6146107bc578063c30f4a5a146107ea576102ae565b806382367b2d1161012e57806382367b2d1461065f5780638da5cb5b1461067f5780638f2c8a711461069457806395d89b41146106b4578063a22cb465146106c9578063a574cea4146106e9576102ae565b80636a5d5071146105b75780636c0360eb146105d75780636c0601e6146105ec5780636c3465901461060c57806370a082311461061f578063747853a31461063f576102ae565b806323b872dd1161021957806342842e0e116101d257806342842e0e146104f357806343bc16121461051357806345142c3b146105285780634f6ccce7146105575780634ffd14cb146105775780636352211e14610597576102ae565b806323b872dd1461044957806324600fc3146104695780632f745c591461047e57806334645e0b1461049e5780633a964fc7146104be57806340f80644146104de576102ae565b80630d3b39371161026b5780630d3b3937146103a857806310d82287146103c857806313f263b6146103dd57806318160ddd146103fd57806319501a0d1461041f57806319588b5114610434576102ae565b806301ffc9a7146102b3578063067b5e2f146102e957806306fdde031461030b578063081812fc1461032d578063095ea7b31461035a5780630ceb40111461037a575b600080fd5b3480156102bf57600080fd5b506102d36102ce3660046133ce565b6108ea565b6040516102e0919061398e565b60405180910390f35b3480156102f557600080fd5b506103096103043660046135ac565b61090d565b005b34801561031757600080fd5b50610320610a9d565b6040516102e09190613999565b34801561033957600080fd5b5061034d610348366004613594565b610b33565b6040516102e091906138be565b34801561036657600080fd5b506103096103753660046133a3565b610b76565b34801561038657600080fd5b5061039a61039536600461373c565b610c0e565b6040516102e09291906139ac565b3480156103b457600080fd5b506103096103c336600461375d565b610d99565b3480156103d457600080fd5b5061034d610e76565b3480156103e957600080fd5b5061034d6103f8366004613594565b610e85565b34801561040957600080fd5b50610412610f0c565b6040516102e0919061402f565b34801561042b57600080fd5b50610320610f1d565b34801561044057600080fd5b50610320610fab565b34801561045557600080fd5b506103096104643660046132c5565b611006565b34801561047557600080fd5b5061030961103e565b34801561048a57600080fd5b506104126104993660046133a3565b6110a2565b3480156104aa57600080fd5b506103096104b9366004613439565b6110cb565b3480156104ca57600080fd5b506103096104d9366004613406565b611127565b3480156104ea57600080fd5b5061034d611173565b3480156104ff57600080fd5b5061030961050e3660046132c5565b611182565b34801561051f57600080fd5b5061032061119d565b34801561053457600080fd5b5061054861054336600461373c565b6111f8565b6040516102e093929190613a6e565b34801561056357600080fd5b50610412610572366004613594565b61136f565b34801561058357600080fd5b50610309610592366004613255565b611385565b3480156105a357600080fd5b5061034d6105b2366004613594565b6113e9565b3480156105c357600080fd5b506103096105d2366004613594565b611411565b3480156105e357600080fd5b50610320611530565b3480156105f857600080fd5b50610309610607366004613594565b611591565b61030961061a366004613594565b61161f565b34801561062b57600080fd5b5061041261063a366004613255565b61187f565b34801561064b57600080fd5b5061030961065a36600461373c565b6118c8565b34801561066b57600080fd5b5061030961067a36600461373c565b6119e5565b34801561068b57600080fd5b5061034d611a72565b3480156106a057600080fd5b506103206106af36600461373c565b611a81565b3480156106c057600080fd5b50610320611ae8565b3480156106d557600080fd5b506103096106e436600461336f565b611b49565b3480156106f557600080fd5b50610709610704366004613594565b611c17565b6040516102e099989796959493929190613aa4565b34801561072a57600080fd5b5061073e610739366004613594565b611f59565b6040516102e092919061390f565b34801561075857600080fd5b5061076c610767366004613594565b611fb2565b6040516102e09493929190614038565b34801561078857600080fd5b506103096107973660046136ca565b611ff0565b3480156107a857600080fd5b506103096107b7366004613305565b61212e565b3480156107c857600080fd5b506107dc6107d7366004613594565b612167565b6040516102e0929190613928565b3480156107f657600080fd5b50610309610805366004613406565b61220f565b34801561081657600080fd5b50610320610825366004613594565b61224d565b34801561083657600080fd5b5061030961084536600461368f565b6122a6565b34801561085657600080fd5b50610309610865366004613255565b61232c565b34801561087657600080fd5b506102d361088536600461328d565b612383565b34801561089657600080fd5b506103096108a5366004613406565b6123b1565b3480156108b657600080fd5b506103096108c5366004613255565b6123f9565b3480156108d657600080fd5b506103096108e536600461349a565b6124b0565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b610915612699565b600a546001600160a01b0390811691161461094b5760405162461bcd60e51b815260040161094290613e99565b60405180910390fd5b815183511461095957600080fd5b60058351111561096857600080fd5b600084815260246020908152604082208351610986928501906130b1565b5060005b8451811015610a455784818151811061099f57fe5b60200260200101516011600088815260200190815260200160002082600581106109c557fe5b0160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508381815181106109f657fe5b6020026020010151601260008881526020019081526020016000208260058110610a1c57fe5b01558351849082908110610a2c57fe5b602002602001015182019150808060010191505061098a565b5083516000868152601c60205260409081902091909155845190517fbfe2a08879d416ae190d608771615479fab1c4e850f3a754e6b1e531773f3c6991610a8e918891906140b4565b60405180910390a15050505050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b295780601f10610afe57610100808354040283529160200191610b29565b820191906000526020600020905b815481529060010190602001808311610b0c57829003601f168201915b5050505050905090565b6000610b3e8261269d565b610b5a5760405162461bcd60e51b815260040161094290613e4d565b506000908152600460205260409020546001600160a01b031690565b6000610b81826113e9565b9050806001600160a01b0316836001600160a01b03161415610bb55760405162461bcd60e51b815260040161094290613f66565b806001600160a01b0316610bc7612699565b6001600160a01b03161480610be35750610be381610885612699565b610bff5760405162461bcd60e51b815260040161094290613d00565b610c0983836126aa565b505050565b606080610c1a8461269d565b610c365760405162461bcd60e51b815260040161094290613e1e565b6000848152601e6020818152604080842054808552600e9092529092209085908110610c5e57fe5b01805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610ce35780601f10610cb857610100808354040283529160200191610ce3565b820191906000526020600020905b815481529060010190602001808311610cc657829003601f168201915b5050506000848152600f6020526040902092955086915050601e8110610d0557fe5b01805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610d8a5780601f10610d5f57610100808354040283529160200191610d8a565b820191906000526020600020905b815481529060010190602001808311610d6d57829003601f168201915b50505050509150509250929050565b610da1612699565b600a546001600160a01b03908116911614610dce5760405162461bcd60e51b815260040161094290613e99565b60008481526020805260409020839055610de783610e85565b600085815260216020908152604080832080546001600160a01b0319166001600160a01b0395909516949094179093556023815282822085905560229052819020805460ff1916831515179055517f9f72c9db3cb69160d1dc73df416fdb93cda104de31e17ddfc2121e9f5548379d90610e689086908690869086906140c2565b60405180910390a150505050565b6027546001600160a01b031681565b6028546040516331a9108f60e11b81526000916001600160a01b031690636352211e90610eb690859060040161402f565b60206040518083038186803b158015610ece57600080fd5b505afa158015610ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f069190613271565b92915050565b6000610f186002612718565b905090565b602a805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610fa35780601f10610f7857610100808354040283529160200191610fa3565b820191906000526020600020905b815481529060010190602001808311610f8657829003601f168201915b505050505081565b600b805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610fa35780601f10610f7857610100808354040283529160200191610fa3565b611017611011612699565b82612723565b6110335760405162461bcd60e51b815260040161094290613fa7565b610c098383836127a8565b611046612699565b600a546001600160a01b039081169116146110735760405162461bcd60e51b815260040161094290613e99565b60405133904780156108fc02916000818181858888f1935050505015801561109f573d6000803e3d6000fd5b50565b6001600160a01b03821660009081526001602052604081206110c490836128b6565b9392505050565b6110d3612699565b600a546001600160a01b039081169116146111005760405162461bcd60e51b815260040161094290613e99565b81516111139060259060208501906130b1565b508051610c099060269060208401906130b1565b61112f612699565b600a546001600160a01b0390811691161461115c5760405162461bcd60e51b815260040161094290613e99565b805161116f90600b9060208401906130b1565b5050565b600d546001600160a01b031681565b610c098383836040518060200160405280600081525061212e565b6029805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610fa35780601f10610f7857610100808354040283529160200191610fa3565b6000828152600e60205260408120606091829184601e811061121657fe5b01805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561129b5780601f106112705761010080835404028352916020019161129b565b820191906000526020600020905b81548152906001019060200180831161127e57829003601f168201915b5050506000888152600f6020526040902092955086915050601e81106112bd57fe5b01805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113425780601f1061131757610100808354040283529160200191611342565b820191906000526020600020905b81548152906001019060200180831161132557829003601f168201915b50505060009788525050601960209081526040808820546015909252909620549396909590930393505050565b60008061137d6002846128c2565b509392505050565b61138d612699565b600a546001600160a01b039081169116146113ba5760405162461bcd60e51b815260040161094290613e99565b602780546001600160a01b03199081166001600160a01b03938416179182905560288054929093169116179055565b6000610f06826040518060600160405280602981526020016141ab60299139600291906128de565b611419612699565b600a546001600160a01b039081169116146114465760405162461bcd60e51b815260040161094290613e99565b60005b6000828152601c60205260409020548110156114ba576000828152601160205260408120826005811061147857fe5b0180546001600160a01b0319166001600160a01b0392909216919091179055600082815260126020526040812082600581106114b057fe5b0155600101611449565b506040805160208082018084526000808452858152602490925292902090516114e392906130b1565b506000818152601c602052604080822091909155517f45c9eed8a1fb20a5cf57bdd41c3aa98ed2b5241feb195f86170423d5c3523a849061152590839061402f565b60405180910390a150565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b295780601f10610afe57610100808354040283529160200191610b29565b611599612699565b600a546001600160a01b039081169116146115c65760405162461bcd60e51b815260040161094290613e99565b6000818152601f60209081526040808320805460ff19169055601982528083205460159092529182902055517f2d5cf67e48dd88914d0e9d205df4ea89016054b9df06b790cf61214b2e56fc589061152590839061402f565b6000818152601f602052604090205460ff16151560011461163f57600080fd5b600081815260156020908152604080832054601990925290912054600101111561166857600080fd5b6000818152601a602052604090205460ff16151560011461168857600080fd5b6000818152601b602052604090205434146116a257600080fd5b60006116ac610f0c565b60019081016000818152601e6020908152604080832087905586835260198252808320548484526017909252909120920190915590506116ea61313d565b6116f261313d565b6116fb84612167565b9150915060005b6000858152601c602052604090205481101561178557600083826005811061172657fe5b60200201519050806001600160a01b03166108fc84846005811061174657fe5b602002015160643404029081150290604051600060405180830381858888f1935050505015801561177b573d6000803e3d6000fd5b5050600101611702565b5060008481526022602052604090205460ff16151560011415611802576000848152602160209081526040808320546023909252909120546001600160a01b0390911690816108fc8260643404029081150290604051600060405180830381858888f193505050501580156117fe573d6000803e3d6000fd5b5050505b600d546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561183b573d6000803e3d6000fd5b5061184633846128eb565b60008481526019602081815260408084208054600101908190556015835293205491905214156118795761187984611591565b50505050565b60006001600160a01b0382166118a75760405162461bcd60e51b815260040161094290613d5d565b6001600160a01b0382166000908152600160205260409020610f0690612718565b6118d0612699565b600a546001600160a01b039081169116146118fd5760405162461bcd60e51b815260040161094290613e99565b6000828152601f602052604090205460ff16151560011461191d57600080fd5b6000828152601560209081526040808320546019909252909120548201111561194557600080fd5b6000828152601960205260409020545b60008381526019602052604090205482018110156119b2576000611977610f0c565b60019081016000818152601e602090815260408083208990556017909152902091840190915590506119a933826128eb565b50600101611955565b506000828152601960208181526040808420805486019081905560158352932054919052141561116f5761116f82611591565b6119ed612699565b600a546001600160a01b03908116911614611a1a5760405162461bcd60e51b815260040161094290613e99565b6000828152601b602052604090208190557f8b49109cd5767f43f65aaaae99075135a684e87312ed89a5e0d69e96bed715cb82670de0b6b3a76400008304604051611a669291906140b4565b60405180910390a15050565b600a546001600160a01b031690565b6060611a8c8361269d565b611aa85760405162461bcd60e51b815260040161094290613f17565b6025611ab384612905565b6026611abe85612905565b604051602001611ad19493929190613878565b604051602081830303815290604052905092915050565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b295780601f10610afe57610100808354040283529160200191610b29565b611b51612699565b6001600160a01b0316826001600160a01b03161415611b825760405162461bcd60e51b815260040161094290613c7d565b8060056000611b8f612699565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611bd3612699565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c0b919061398e565b60405180910390a35050565b60608060008060006060600060606000611c308a61269d565b611c4c5760405162461bcd60e51b815260040161094290613e1e565b60008a8152601e602090815260408083205480845260138352928190208054825160026001831615610100026000190190921691909104601f810185900485028201850190935282815292909190830182828015611ceb5780601f10611cc057610100808354040283529160200191611ceb565b820191906000526020600020905b815481529060010190602001808311611cce57829003601f168201915b5050506000848152601660209081526040918290208054835160026001831615610100026000190190921691909104601f8101849004840282018401909452838152959f509350909150830182828015611d865780601f10611d5b57610100808354040283529160200191611d86565b820191906000526020600020905b815481529060010190602001808311611d6957829003601f168201915b5050505050985060156000828152602001908152602001600020549750601760008c8152602001908152602001600020549650601a600082815260200190815260200160002060009054906101000a900460ff169550601460008281526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e835780601f10611e5857610100808354040283529160200191611e83565b820191906000526020600020905b815481529060010190602001808311611e6657829003601f168201915b5050506000848152601b602090815260408083205460248352928190208054825160026001831615610100026000190190921691909104601f8101859004850282018501909352828152969b50929950919350909150830182828015611f2a5780601f10611eff57610100808354040283529160200191611f2a565b820191906000526020600020905b815481529060010190602001808311611f0d57829003601f168201915b50505060009384525050601f602052604090912054999b989a509698959794969395929460ff90931692915050565b600080611f658361269d565b611f815760405162461bcd60e51b815260040161094290613e1e565b50506000908152601e6020908152604080832054600d54908452601d909252909120546001600160a01b0390911691565b60009081526020808052604080832054602183528184205460238452828520546022909452919093205492936001600160a01b039091169260ff1690565b611ff8612699565b600a546001600160a01b039081169116146120255760405162461bcd60e51b815260040161094290613e99565b600084815260106020526040902081601e811061203e57fe5b602081049091015460ff601f9092166101000a9004161561205e57600080fd5b6000848152600e60205260409020839082601e811061207957fe5b01908051906020019061208d9291906130b1565b506000848152600f60205260409020829082601e81106120a957fe5b0190805190602001906120bd9291906130b1565b50600084815260106020526040902060019082601e81106120da57fe5b602091828204019190066101000a81548160ff0219169083151502179055507fdff4f7a043d457bb0000a6b86af816f91b9d5fd646a9c0e05f8beb8ebe5acd3684848484604051610e689493929190614077565b61213f612139612699565b83612723565b61215b5760405162461bcd60e51b815260040161094290613fa7565b611879848484846129dd565b61216f61313d565b61217761313d565b60005b6000848152601c602052604090205481101561220957600084815260116020526040902081600581106121a957fe5b01546001600160a01b03168382600581106121c057fe5b6001600160a01b0390921660209283029190910152600085815260129091526040902081600581106121ee57fe5b01548282600581106121fc57fe5b602002015260010161217a565b50915091565b612217612699565b600a546001600160a01b039081169116146122445760405162461bcd60e51b815260040161094290613e99565b61109f81612a10565b60606122588261269d565b6122745760405162461bcd60e51b815260040161094290613f17565b600961227f83612a23565b604051602001612290929190613853565b6040516020818303038152906040529050919050565b6122ae612699565b600a546001600160a01b039081169116146122db5760405162461bcd60e51b815260040161094290613e99565b600082815260146020908152604090912082516122fa928401906130b1565b507fe4f4915c8343b76a186dd702ddb447236facb07c5466d1b0e32d5e493144e0b18282604051611a6692919061405e565b612334612699565b600a546001600160a01b039081169116146123615760405162461bcd60e51b815260040161094290613e99565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6123b9612699565b600a546001600160a01b039081169116146123e65760405162461bcd60e51b815260040161094290613e99565b805161116f90602a9060208401906130b1565b612401612699565b600a546001600160a01b0390811691161461242e5760405162461bcd60e51b815260040161094290613e99565b6001600160a01b0381166124545760405162461bcd60e51b815260040161094290613bbc565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6124b8612699565b600a546001600160a01b039081169116146124e55760405162461bcd60e51b815260040161094290613e99565b600c80546000908152601f60209081526040808320805460ff1916600190811790915593548352600e82529091208b516125269391909101918c01906130b1565b50600c546000908152600f60205260409020889060010190805190602001906125509291906130b1565b50600c5460009081526016602090815260409091208851612573928a01906130b1565b50600c5460009081526013602090815260409091208751612596928901906130b1565b50600c54600090815260146020908152604090912086516125b9928801906130b1565b50600c80546000908152601560209081526040808320889055835483526018825280832083905583548352601982528083208390558354835260108252808320805461ff00191661010017905583548352601a8252808320805460ff191688151517905583548352601b825280832086905583548352601d90915290819020839055905490517fd1eba389febb75b1cb29bc39b4443947ef1b8ccb1ac23c9fc0592441e5e516ec9161267d918c918c918c918c918c918c918c918c918c91906139da565b60405180910390a15050600c8054600101905550505050505050565b3390565b6000610f06600283612af5565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906126df826113e9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610f0682612b01565b600061272e8261269d565b61274a5760405162461bcd60e51b815260040161094290613cb4565b6000612755836113e9565b9050806001600160a01b0316846001600160a01b031614806127905750836001600160a01b031661278584610b33565b6001600160a01b0316145b806127a057506127a08185612383565b949350505050565b826001600160a01b03166127bb826113e9565b6001600160a01b0316146127e15760405162461bcd60e51b815260040161094290613ece565b6001600160a01b0382166128075760405162461bcd60e51b815260040161094290613c39565b612812838383610c09565b61281d6000826126aa565b6001600160a01b038316600090815260016020526040902061283f9082612b05565b506001600160a01b03821660009081526001602052604090206128629082612b11565b5061286f60028284612b1d565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006110c48383612b33565b60008080806128d18686612b78565b9097909650945050505050565b60006127a0848484612bd4565b61116f828260405180602001604052806000815250612c33565b60608161292a57506040805180820190915260018152600360fc1b6020820152610908565b8160005b811561294257600101600a8204915061292e565b60608167ffffffffffffffff8111801561295b57600080fd5b506040519080825280601f01601f191660200182016040528015612986576020820181803683370190505b50905060001982015b85156129d457600a860660300160f81b828280600190039350815181106129b257fe5b60200101906001600160f81b031916908160001a905350600a8604955061298f565b50949350505050565b6129e88484846127a8565b6129f484848484612c66565b6118795760405162461bcd60e51b815260040161094290613b6a565b805161116f9060099060208401906130b1565b606081612a4857506040805180820190915260018152600360fc1b6020820152610908565b8160005b8115612a6057600101600a82049150612a4c565b60608167ffffffffffffffff81118015612a7957600080fd5b506040519080825280601f01601f191660200182016040528015612aa4576020820181803683370190505b50859350905060001982015b83156129d457600a840660300160f81b82828060019003935081518110612ad357fe5b60200101906001600160f81b031916908160001a905350600a84049350612ab0565b60006110c48383612d45565b5490565b60006110c48383612d5d565b60006110c48383612e23565b60006127a084846001600160a01b038516612e6d565b81546000908210612b565760405162461bcd60e51b815260040161094290613b28565b826000018281548110612b6557fe5b9060005260206000200154905092915050565b815460009081908310612b9d5760405162461bcd60e51b815260040161094290613da7565b6000846000018481548110612bae57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008281526001840160205260408120548281612c045760405162461bcd60e51b81526004016109429190613999565b50846000016001820381548110612c1757fe5b9060005260206000209060020201600101549150509392505050565b612c3d8383612f04565b612c4a6000848484612c66565b610c095760405162461bcd60e51b815260040161094290613b6a565b6000612c7a846001600160a01b0316612fc8565b612c86575060016127a0565b6060612d0e630a85bd0160e11b612c9b612699565b888787604051602401612cb194939291906138d2565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001614179603291396001600160a01b0388169190612fce565b9050600081806020019051810190612d2691906133ea565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015612e195783546000198083019190810190600090879083908110612d9057fe5b9060005260206000200154905080876000018481548110612dad57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080612ddd57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610f06565b6000915050610f06565b6000612e2f8383612d45565b612e6557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f06565b506000610f06565b600082815260018401602052604081205480612ed25750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556110c4565b82856000016001830381548110612ee557fe5b90600052602060002090600202016001018190555060009150506110c4565b6001600160a01b038216612f2a5760405162461bcd60e51b815260040161094290613de9565b612f338161269d565b15612f505760405162461bcd60e51b815260040161094290613c02565b612f5c60008383610c09565b6001600160a01b0382166000908152600160205260409020612f7e9082612b11565b50612f8b60028284612b1d565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b60606127a0848460008585612fe285612fc8565b612ffe5760405162461bcd60e51b815260040161094290613ff8565b60006060866001600160a01b0316858760405161301b9190613837565b60006040518083038185875af1925050503d8060008114613058576040519150601f19603f3d011682016040523d82523d6000602084013e61305d565b606091505b509150915061306d828286613078565b979650505050505050565b606083156130875750816110c4565b8251156130975782518084602001fd5b8160405162461bcd60e51b81526004016109429190613999565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826130e7576000855561312d565b82601f1061310057805160ff191683800117855561312d565b8280016001018555821561312d579182015b8281111561312d578251825591602001919060010190613112565b5061313992915061315b565b5090565b6040518060a001604052806005906020820280368337509192915050565b5b80821115613139576000815560010161315c565b600082601f830112613180578081fd5b813561319361318e82614103565b6140df565b8181529150602080830190848101818402860182018710156131b457600080fd5b60005b848110156131d3578135845292820192908201906001016131b7565b505050505092915050565b8035801515811461090857600080fd5b600082601f8301126131fe578081fd5b813567ffffffffffffffff81111561321257fe5b613225601f8201601f19166020016140df565b915080825283602082850101111561323c57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215613266578081fd5b81356110c48161414d565b600060208284031215613282578081fd5b81516110c48161414d565b6000806040838503121561329f578081fd5b82356132aa8161414d565b915060208301356132ba8161414d565b809150509250929050565b6000806000606084860312156132d9578081fd5b83356132e48161414d565b925060208401356132f48161414d565b929592945050506040919091013590565b6000806000806080858703121561331a578081fd5b84356133258161414d565b935060208501356133358161414d565b925060408501359150606085013567ffffffffffffffff811115613357578182fd5b613363878288016131ee565b91505092959194509250565b60008060408385031215613381578182fd5b823561338c8161414d565b915061339a602084016131de565b90509250929050565b600080604083850312156133b5578182fd5b82356133c08161414d565b946020939093013593505050565b6000602082840312156133df578081fd5b81356110c481614162565b6000602082840312156133fb578081fd5b81516110c481614162565b600060208284031215613417578081fd5b813567ffffffffffffffff81111561342d578182fd5b6127a0848285016131ee565b6000806040838503121561344b578182fd5b823567ffffffffffffffff80821115613462578384fd5b61346e868387016131ee565b93506020850135915080821115613483578283fd5b50613490858286016131ee565b9150509250929050565b60008060008060008060008060006101208a8c0312156134b8578687fd5b893567ffffffffffffffff808211156134cf578889fd5b6134db8d838e016131ee565b9a5060208c01359150808211156134f0578889fd5b6134fc8d838e016131ee565b995060408c0135915080821115613511578889fd5b61351d8d838e016131ee565b985060608c0135915080821115613532578687fd5b61353e8d838e016131ee565b975060808c0135915080821115613553578687fd5b506135608c828d016131ee565b95505060a08a0135935061357660c08b016131de565b925060e08a013591506101008a013590509295985092959850929598565b6000602082840312156135a5578081fd5b5035919050565b600080600080608085870312156135c1578182fd5b8435935060208086013567ffffffffffffffff808211156135e0578485fd5b818801915088601f8301126135f3578485fd5b813561360161318e82614103565b81815284810190848601868402860187018d101561361d578889fd5b8895505b838610156136485780356136348161414d565b835260019590950194918601918601613621565b50975050506040880135925080831115613660578485fd5b61366c89848a01613170565b94506060880135925080831115613681578384fd5b5050613363878288016131ee565b600080604083850312156136a1578182fd5b82359150602083013567ffffffffffffffff8111156136be578182fd5b613490858286016131ee565b600080600080608085870312156136df578182fd5b84359350602085013567ffffffffffffffff808211156136fd578384fd5b613709888389016131ee565b9450604087013591508082111561371e578384fd5b5061372b878288016131ee565b949793965093946060013593505050565b6000806040838503121561374e578182fd5b50508035926020909101359150565b60008060008060808587031215613772578182fd5b843593506020850135925060408501359150613790606086016131de565b905092959194509250565b600081518084526137b3816020860160208601614121565b601f01601f19169290920160200192915050565b600081546001808216600081146137e557600181146137fc5761382e565b60ff198316865260028304607f168601935061382e565b600283048560005260208060002060005b838110156138265781548a82015290850190820161380d565b505050860193505b50505092915050565b60008251613849818460208701614121565b9190910192915050565b600061385f82856137c7565b835161386f818360208801614121565b01949350505050565b600061388482876137c7565b8551613894818360208a01614121565b6138a0818301876137c7565b91505083516138b3818360208801614121565b019695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906139059083018461379b565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6101408101818460005b600581101561395a5781516001600160a01b0316835260209283019290910190600101613932565b50505060a082018360005b6005811015613984578151835260209283019290910190600101613965565b5050509392505050565b901515815260200190565b6000602082526110c4602083018461379b565b6000604082526139bf604083018561379b565b82810360208401526139d1818561379b565b95945050505050565b60006101408083526139ee8184018e61379b565b90508281036020840152613a02818d61379b565b90508281036040840152613a16818c61379b565b90508281036060840152613a2a818b61379b565b90508281036080840152613a3e818a61379b565b60a0840198909852505093151560c085015260e08401929092526101008301526101209091015295945050505050565b600060608252613a81606083018661379b565b8281036020840152613a93818661379b565b915050826040830152949350505050565b6000610120808352613ab88184018d61379b565b90508281036020840152613acc818c61379b565b9050896040840152886060840152871515608084015282810360a0840152613af4818861379b565b90508560c084015282810360e0840152613b0e818661379b565b9150508215156101008301529a9950505050505050505050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252601590820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b90815260200190565b9384526001600160a01b0392909216602084015260408301521515606082015260800190565b6000838252604060208301526127a0604083018461379b565b600085825260806020830152614090608083018661379b565b82810360408401526140a2818661379b565b91505082606083015295945050505050565b918252602082015260400190565b938452602084019290925260408301521515606082015260800190565b60405181810167ffffffffffffffff811182821017156140fb57fe5b604052919050565b600067ffffffffffffffff82111561411757fe5b5060209081020190565b60005b8381101561413c578181015183820152602001614124565b838111156118795750506000910152565b6001600160a01b038116811461109f57600080fd5b6001600160e01b03198116811461109f57600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122079363c7e61604b302a590dfd4f1bdaf36fd257444f8e293dafdcea957999f1f964736f6c6343000705003368747470733a2f2f6a6f79776f726c642e617a75726577656273697465732e6e65742f6170692f48747470547269676765723f69643d68747470733a2f2f6a6f79776f726c646d756c74692e617a75726577656273697465732e6e65742f6170692f48747470547269676765723f69643d

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c80636a5d507111610175578063a65ff74c116100dc578063c87b56dd11610095578063e985e9c51161006f578063e985e9c51461086a578063f1f5e3ae1461088a578063f2fde38b146108aa578063f90efd4a146108ca576102ae565b8063c87b56dd1461080a578063d1e47eac1461082a578063df5eb0e71461084a576102ae565b8063a65ff74c1461071e578063ac98b3a81461074c578063ae73ee301461077c578063b88d4fde1461079c578063bb3bafd6146107bc578063c30f4a5a146107ea576102ae565b806382367b2d1161012e57806382367b2d1461065f5780638da5cb5b1461067f5780638f2c8a711461069457806395d89b41146106b4578063a22cb465146106c9578063a574cea4146106e9576102ae565b80636a5d5071146105b75780636c0360eb146105d75780636c0601e6146105ec5780636c3465901461060c57806370a082311461061f578063747853a31461063f576102ae565b806323b872dd1161021957806342842e0e116101d257806342842e0e146104f357806343bc16121461051357806345142c3b146105285780634f6ccce7146105575780634ffd14cb146105775780636352211e14610597576102ae565b806323b872dd1461044957806324600fc3146104695780632f745c591461047e57806334645e0b1461049e5780633a964fc7146104be57806340f80644146104de576102ae565b80630d3b39371161026b5780630d3b3937146103a857806310d82287146103c857806313f263b6146103dd57806318160ddd146103fd57806319501a0d1461041f57806319588b5114610434576102ae565b806301ffc9a7146102b3578063067b5e2f146102e957806306fdde031461030b578063081812fc1461032d578063095ea7b31461035a5780630ceb40111461037a575b600080fd5b3480156102bf57600080fd5b506102d36102ce3660046133ce565b6108ea565b6040516102e0919061398e565b60405180910390f35b3480156102f557600080fd5b506103096103043660046135ac565b61090d565b005b34801561031757600080fd5b50610320610a9d565b6040516102e09190613999565b34801561033957600080fd5b5061034d610348366004613594565b610b33565b6040516102e091906138be565b34801561036657600080fd5b506103096103753660046133a3565b610b76565b34801561038657600080fd5b5061039a61039536600461373c565b610c0e565b6040516102e09291906139ac565b3480156103b457600080fd5b506103096103c336600461375d565b610d99565b3480156103d457600080fd5b5061034d610e76565b3480156103e957600080fd5b5061034d6103f8366004613594565b610e85565b34801561040957600080fd5b50610412610f0c565b6040516102e0919061402f565b34801561042b57600080fd5b50610320610f1d565b34801561044057600080fd5b50610320610fab565b34801561045557600080fd5b506103096104643660046132c5565b611006565b34801561047557600080fd5b5061030961103e565b34801561048a57600080fd5b506104126104993660046133a3565b6110a2565b3480156104aa57600080fd5b506103096104b9366004613439565b6110cb565b3480156104ca57600080fd5b506103096104d9366004613406565b611127565b3480156104ea57600080fd5b5061034d611173565b3480156104ff57600080fd5b5061030961050e3660046132c5565b611182565b34801561051f57600080fd5b5061032061119d565b34801561053457600080fd5b5061054861054336600461373c565b6111f8565b6040516102e093929190613a6e565b34801561056357600080fd5b50610412610572366004613594565b61136f565b34801561058357600080fd5b50610309610592366004613255565b611385565b3480156105a357600080fd5b5061034d6105b2366004613594565b6113e9565b3480156105c357600080fd5b506103096105d2366004613594565b611411565b3480156105e357600080fd5b50610320611530565b3480156105f857600080fd5b50610309610607366004613594565b611591565b61030961061a366004613594565b61161f565b34801561062b57600080fd5b5061041261063a366004613255565b61187f565b34801561064b57600080fd5b5061030961065a36600461373c565b6118c8565b34801561066b57600080fd5b5061030961067a36600461373c565b6119e5565b34801561068b57600080fd5b5061034d611a72565b3480156106a057600080fd5b506103206106af36600461373c565b611a81565b3480156106c057600080fd5b50610320611ae8565b3480156106d557600080fd5b506103096106e436600461336f565b611b49565b3480156106f557600080fd5b50610709610704366004613594565b611c17565b6040516102e099989796959493929190613aa4565b34801561072a57600080fd5b5061073e610739366004613594565b611f59565b6040516102e092919061390f565b34801561075857600080fd5b5061076c610767366004613594565b611fb2565b6040516102e09493929190614038565b34801561078857600080fd5b506103096107973660046136ca565b611ff0565b3480156107a857600080fd5b506103096107b7366004613305565b61212e565b3480156107c857600080fd5b506107dc6107d7366004613594565b612167565b6040516102e0929190613928565b3480156107f657600080fd5b50610309610805366004613406565b61220f565b34801561081657600080fd5b50610320610825366004613594565b61224d565b34801561083657600080fd5b5061030961084536600461368f565b6122a6565b34801561085657600080fd5b50610309610865366004613255565b61232c565b34801561087657600080fd5b506102d361088536600461328d565b612383565b34801561089657600080fd5b506103096108a5366004613406565b6123b1565b3480156108b657600080fd5b506103096108c5366004613255565b6123f9565b3480156108d657600080fd5b506103096108e536600461349a565b6124b0565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b610915612699565b600a546001600160a01b0390811691161461094b5760405162461bcd60e51b815260040161094290613e99565b60405180910390fd5b815183511461095957600080fd5b60058351111561096857600080fd5b600084815260246020908152604082208351610986928501906130b1565b5060005b8451811015610a455784818151811061099f57fe5b60200260200101516011600088815260200190815260200160002082600581106109c557fe5b0160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508381815181106109f657fe5b6020026020010151601260008881526020019081526020016000208260058110610a1c57fe5b01558351849082908110610a2c57fe5b602002602001015182019150808060010191505061098a565b5083516000868152601c60205260409081902091909155845190517fbfe2a08879d416ae190d608771615479fab1c4e850f3a754e6b1e531773f3c6991610a8e918891906140b4565b60405180910390a15050505050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b295780601f10610afe57610100808354040283529160200191610b29565b820191906000526020600020905b815481529060010190602001808311610b0c57829003601f168201915b5050505050905090565b6000610b3e8261269d565b610b5a5760405162461bcd60e51b815260040161094290613e4d565b506000908152600460205260409020546001600160a01b031690565b6000610b81826113e9565b9050806001600160a01b0316836001600160a01b03161415610bb55760405162461bcd60e51b815260040161094290613f66565b806001600160a01b0316610bc7612699565b6001600160a01b03161480610be35750610be381610885612699565b610bff5760405162461bcd60e51b815260040161094290613d00565b610c0983836126aa565b505050565b606080610c1a8461269d565b610c365760405162461bcd60e51b815260040161094290613e1e565b6000848152601e6020818152604080842054808552600e9092529092209085908110610c5e57fe5b01805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610ce35780601f10610cb857610100808354040283529160200191610ce3565b820191906000526020600020905b815481529060010190602001808311610cc657829003601f168201915b5050506000848152600f6020526040902092955086915050601e8110610d0557fe5b01805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610d8a5780601f10610d5f57610100808354040283529160200191610d8a565b820191906000526020600020905b815481529060010190602001808311610d6d57829003601f168201915b50505050509150509250929050565b610da1612699565b600a546001600160a01b03908116911614610dce5760405162461bcd60e51b815260040161094290613e99565b60008481526020805260409020839055610de783610e85565b600085815260216020908152604080832080546001600160a01b0319166001600160a01b0395909516949094179093556023815282822085905560229052819020805460ff1916831515179055517f9f72c9db3cb69160d1dc73df416fdb93cda104de31e17ddfc2121e9f5548379d90610e689086908690869086906140c2565b60405180910390a150505050565b6027546001600160a01b031681565b6028546040516331a9108f60e11b81526000916001600160a01b031690636352211e90610eb690859060040161402f565b60206040518083038186803b158015610ece57600080fd5b505afa158015610ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f069190613271565b92915050565b6000610f186002612718565b905090565b602a805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610fa35780601f10610f7857610100808354040283529160200191610fa3565b820191906000526020600020905b815481529060010190602001808311610f8657829003601f168201915b505050505081565b600b805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610fa35780601f10610f7857610100808354040283529160200191610fa3565b611017611011612699565b82612723565b6110335760405162461bcd60e51b815260040161094290613fa7565b610c098383836127a8565b611046612699565b600a546001600160a01b039081169116146110735760405162461bcd60e51b815260040161094290613e99565b60405133904780156108fc02916000818181858888f1935050505015801561109f573d6000803e3d6000fd5b50565b6001600160a01b03821660009081526001602052604081206110c490836128b6565b9392505050565b6110d3612699565b600a546001600160a01b039081169116146111005760405162461bcd60e51b815260040161094290613e99565b81516111139060259060208501906130b1565b508051610c099060269060208401906130b1565b61112f612699565b600a546001600160a01b0390811691161461115c5760405162461bcd60e51b815260040161094290613e99565b805161116f90600b9060208401906130b1565b5050565b600d546001600160a01b031681565b610c098383836040518060200160405280600081525061212e565b6029805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610fa35780601f10610f7857610100808354040283529160200191610fa3565b6000828152600e60205260408120606091829184601e811061121657fe5b01805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561129b5780601f106112705761010080835404028352916020019161129b565b820191906000526020600020905b81548152906001019060200180831161127e57829003601f168201915b5050506000888152600f6020526040902092955086915050601e81106112bd57fe5b01805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113425780601f1061131757610100808354040283529160200191611342565b820191906000526020600020905b81548152906001019060200180831161132557829003601f168201915b50505060009788525050601960209081526040808820546015909252909620549396909590930393505050565b60008061137d6002846128c2565b509392505050565b61138d612699565b600a546001600160a01b039081169116146113ba5760405162461bcd60e51b815260040161094290613e99565b602780546001600160a01b03199081166001600160a01b03938416179182905560288054929093169116179055565b6000610f06826040518060600160405280602981526020016141ab60299139600291906128de565b611419612699565b600a546001600160a01b039081169116146114465760405162461bcd60e51b815260040161094290613e99565b60005b6000828152601c60205260409020548110156114ba576000828152601160205260408120826005811061147857fe5b0180546001600160a01b0319166001600160a01b0392909216919091179055600082815260126020526040812082600581106114b057fe5b0155600101611449565b506040805160208082018084526000808452858152602490925292902090516114e392906130b1565b506000818152601c602052604080822091909155517f45c9eed8a1fb20a5cf57bdd41c3aa98ed2b5241feb195f86170423d5c3523a849061152590839061402f565b60405180910390a150565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b295780601f10610afe57610100808354040283529160200191610b29565b611599612699565b600a546001600160a01b039081169116146115c65760405162461bcd60e51b815260040161094290613e99565b6000818152601f60209081526040808320805460ff19169055601982528083205460159092529182902055517f2d5cf67e48dd88914d0e9d205df4ea89016054b9df06b790cf61214b2e56fc589061152590839061402f565b6000818152601f602052604090205460ff16151560011461163f57600080fd5b600081815260156020908152604080832054601990925290912054600101111561166857600080fd5b6000818152601a602052604090205460ff16151560011461168857600080fd5b6000818152601b602052604090205434146116a257600080fd5b60006116ac610f0c565b60019081016000818152601e6020908152604080832087905586835260198252808320548484526017909252909120920190915590506116ea61313d565b6116f261313d565b6116fb84612167565b9150915060005b6000858152601c602052604090205481101561178557600083826005811061172657fe5b60200201519050806001600160a01b03166108fc84846005811061174657fe5b602002015160643404029081150290604051600060405180830381858888f1935050505015801561177b573d6000803e3d6000fd5b5050600101611702565b5060008481526022602052604090205460ff16151560011415611802576000848152602160209081526040808320546023909252909120546001600160a01b0390911690816108fc8260643404029081150290604051600060405180830381858888f193505050501580156117fe573d6000803e3d6000fd5b5050505b600d546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561183b573d6000803e3d6000fd5b5061184633846128eb565b60008481526019602081815260408084208054600101908190556015835293205491905214156118795761187984611591565b50505050565b60006001600160a01b0382166118a75760405162461bcd60e51b815260040161094290613d5d565b6001600160a01b0382166000908152600160205260409020610f0690612718565b6118d0612699565b600a546001600160a01b039081169116146118fd5760405162461bcd60e51b815260040161094290613e99565b6000828152601f602052604090205460ff16151560011461191d57600080fd5b6000828152601560209081526040808320546019909252909120548201111561194557600080fd5b6000828152601960205260409020545b60008381526019602052604090205482018110156119b2576000611977610f0c565b60019081016000818152601e602090815260408083208990556017909152902091840190915590506119a933826128eb565b50600101611955565b506000828152601960208181526040808420805486019081905560158352932054919052141561116f5761116f82611591565b6119ed612699565b600a546001600160a01b03908116911614611a1a5760405162461bcd60e51b815260040161094290613e99565b6000828152601b602052604090208190557f8b49109cd5767f43f65aaaae99075135a684e87312ed89a5e0d69e96bed715cb82670de0b6b3a76400008304604051611a669291906140b4565b60405180910390a15050565b600a546001600160a01b031690565b6060611a8c8361269d565b611aa85760405162461bcd60e51b815260040161094290613f17565b6025611ab384612905565b6026611abe85612905565b604051602001611ad19493929190613878565b604051602081830303815290604052905092915050565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b295780601f10610afe57610100808354040283529160200191610b29565b611b51612699565b6001600160a01b0316826001600160a01b03161415611b825760405162461bcd60e51b815260040161094290613c7d565b8060056000611b8f612699565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611bd3612699565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c0b919061398e565b60405180910390a35050565b60608060008060006060600060606000611c308a61269d565b611c4c5760405162461bcd60e51b815260040161094290613e1e565b60008a8152601e602090815260408083205480845260138352928190208054825160026001831615610100026000190190921691909104601f810185900485028201850190935282815292909190830182828015611ceb5780601f10611cc057610100808354040283529160200191611ceb565b820191906000526020600020905b815481529060010190602001808311611cce57829003601f168201915b5050506000848152601660209081526040918290208054835160026001831615610100026000190190921691909104601f8101849004840282018401909452838152959f509350909150830182828015611d865780601f10611d5b57610100808354040283529160200191611d86565b820191906000526020600020905b815481529060010190602001808311611d6957829003601f168201915b5050505050985060156000828152602001908152602001600020549750601760008c8152602001908152602001600020549650601a600082815260200190815260200160002060009054906101000a900460ff169550601460008281526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e835780601f10611e5857610100808354040283529160200191611e83565b820191906000526020600020905b815481529060010190602001808311611e6657829003601f168201915b5050506000848152601b602090815260408083205460248352928190208054825160026001831615610100026000190190921691909104601f8101859004850282018501909352828152969b50929950919350909150830182828015611f2a5780601f10611eff57610100808354040283529160200191611f2a565b820191906000526020600020905b815481529060010190602001808311611f0d57829003601f168201915b50505060009384525050601f602052604090912054999b989a509698959794969395929460ff90931692915050565b600080611f658361269d565b611f815760405162461bcd60e51b815260040161094290613e1e565b50506000908152601e6020908152604080832054600d54908452601d909252909120546001600160a01b0390911691565b60009081526020808052604080832054602183528184205460238452828520546022909452919093205492936001600160a01b039091169260ff1690565b611ff8612699565b600a546001600160a01b039081169116146120255760405162461bcd60e51b815260040161094290613e99565b600084815260106020526040902081601e811061203e57fe5b602081049091015460ff601f9092166101000a9004161561205e57600080fd5b6000848152600e60205260409020839082601e811061207957fe5b01908051906020019061208d9291906130b1565b506000848152600f60205260409020829082601e81106120a957fe5b0190805190602001906120bd9291906130b1565b50600084815260106020526040902060019082601e81106120da57fe5b602091828204019190066101000a81548160ff0219169083151502179055507fdff4f7a043d457bb0000a6b86af816f91b9d5fd646a9c0e05f8beb8ebe5acd3684848484604051610e689493929190614077565b61213f612139612699565b83612723565b61215b5760405162461bcd60e51b815260040161094290613fa7565b611879848484846129dd565b61216f61313d565b61217761313d565b60005b6000848152601c602052604090205481101561220957600084815260116020526040902081600581106121a957fe5b01546001600160a01b03168382600581106121c057fe5b6001600160a01b0390921660209283029190910152600085815260129091526040902081600581106121ee57fe5b01548282600581106121fc57fe5b602002015260010161217a565b50915091565b612217612699565b600a546001600160a01b039081169116146122445760405162461bcd60e51b815260040161094290613e99565b61109f81612a10565b60606122588261269d565b6122745760405162461bcd60e51b815260040161094290613f17565b600961227f83612a23565b604051602001612290929190613853565b6040516020818303038152906040529050919050565b6122ae612699565b600a546001600160a01b039081169116146122db5760405162461bcd60e51b815260040161094290613e99565b600082815260146020908152604090912082516122fa928401906130b1565b507fe4f4915c8343b76a186dd702ddb447236facb07c5466d1b0e32d5e493144e0b18282604051611a6692919061405e565b612334612699565b600a546001600160a01b039081169116146123615760405162461bcd60e51b815260040161094290613e99565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6123b9612699565b600a546001600160a01b039081169116146123e65760405162461bcd60e51b815260040161094290613e99565b805161116f90602a9060208401906130b1565b612401612699565b600a546001600160a01b0390811691161461242e5760405162461bcd60e51b815260040161094290613e99565b6001600160a01b0381166124545760405162461bcd60e51b815260040161094290613bbc565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6124b8612699565b600a546001600160a01b039081169116146124e55760405162461bcd60e51b815260040161094290613e99565b600c80546000908152601f60209081526040808320805460ff1916600190811790915593548352600e82529091208b516125269391909101918c01906130b1565b50600c546000908152600f60205260409020889060010190805190602001906125509291906130b1565b50600c5460009081526016602090815260409091208851612573928a01906130b1565b50600c5460009081526013602090815260409091208751612596928901906130b1565b50600c54600090815260146020908152604090912086516125b9928801906130b1565b50600c80546000908152601560209081526040808320889055835483526018825280832083905583548352601982528083208390558354835260108252808320805461ff00191661010017905583548352601a8252808320805460ff191688151517905583548352601b825280832086905583548352601d90915290819020839055905490517fd1eba389febb75b1cb29bc39b4443947ef1b8ccb1ac23c9fc0592441e5e516ec9161267d918c918c918c918c918c918c918c918c918c91906139da565b60405180910390a15050600c8054600101905550505050505050565b3390565b6000610f06600283612af5565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906126df826113e9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610f0682612b01565b600061272e8261269d565b61274a5760405162461bcd60e51b815260040161094290613cb4565b6000612755836113e9565b9050806001600160a01b0316846001600160a01b031614806127905750836001600160a01b031661278584610b33565b6001600160a01b0316145b806127a057506127a08185612383565b949350505050565b826001600160a01b03166127bb826113e9565b6001600160a01b0316146127e15760405162461bcd60e51b815260040161094290613ece565b6001600160a01b0382166128075760405162461bcd60e51b815260040161094290613c39565b612812838383610c09565b61281d6000826126aa565b6001600160a01b038316600090815260016020526040902061283f9082612b05565b506001600160a01b03821660009081526001602052604090206128629082612b11565b5061286f60028284612b1d565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006110c48383612b33565b60008080806128d18686612b78565b9097909650945050505050565b60006127a0848484612bd4565b61116f828260405180602001604052806000815250612c33565b60608161292a57506040805180820190915260018152600360fc1b6020820152610908565b8160005b811561294257600101600a8204915061292e565b60608167ffffffffffffffff8111801561295b57600080fd5b506040519080825280601f01601f191660200182016040528015612986576020820181803683370190505b50905060001982015b85156129d457600a860660300160f81b828280600190039350815181106129b257fe5b60200101906001600160f81b031916908160001a905350600a8604955061298f565b50949350505050565b6129e88484846127a8565b6129f484848484612c66565b6118795760405162461bcd60e51b815260040161094290613b6a565b805161116f9060099060208401906130b1565b606081612a4857506040805180820190915260018152600360fc1b6020820152610908565b8160005b8115612a6057600101600a82049150612a4c565b60608167ffffffffffffffff81118015612a7957600080fd5b506040519080825280601f01601f191660200182016040528015612aa4576020820181803683370190505b50859350905060001982015b83156129d457600a840660300160f81b82828060019003935081518110612ad357fe5b60200101906001600160f81b031916908160001a905350600a84049350612ab0565b60006110c48383612d45565b5490565b60006110c48383612d5d565b60006110c48383612e23565b60006127a084846001600160a01b038516612e6d565b81546000908210612b565760405162461bcd60e51b815260040161094290613b28565b826000018281548110612b6557fe5b9060005260206000200154905092915050565b815460009081908310612b9d5760405162461bcd60e51b815260040161094290613da7565b6000846000018481548110612bae57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008281526001840160205260408120548281612c045760405162461bcd60e51b81526004016109429190613999565b50846000016001820381548110612c1757fe5b9060005260206000209060020201600101549150509392505050565b612c3d8383612f04565b612c4a6000848484612c66565b610c095760405162461bcd60e51b815260040161094290613b6a565b6000612c7a846001600160a01b0316612fc8565b612c86575060016127a0565b6060612d0e630a85bd0160e11b612c9b612699565b888787604051602401612cb194939291906138d2565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001614179603291396001600160a01b0388169190612fce565b9050600081806020019051810190612d2691906133ea565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015612e195783546000198083019190810190600090879083908110612d9057fe5b9060005260206000200154905080876000018481548110612dad57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080612ddd57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610f06565b6000915050610f06565b6000612e2f8383612d45565b612e6557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f06565b506000610f06565b600082815260018401602052604081205480612ed25750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556110c4565b82856000016001830381548110612ee557fe5b90600052602060002090600202016001018190555060009150506110c4565b6001600160a01b038216612f2a5760405162461bcd60e51b815260040161094290613de9565b612f338161269d565b15612f505760405162461bcd60e51b815260040161094290613c02565b612f5c60008383610c09565b6001600160a01b0382166000908152600160205260409020612f7e9082612b11565b50612f8b60028284612b1d565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b60606127a0848460008585612fe285612fc8565b612ffe5760405162461bcd60e51b815260040161094290613ff8565b60006060866001600160a01b0316858760405161301b9190613837565b60006040518083038185875af1925050503d8060008114613058576040519150601f19603f3d011682016040523d82523d6000602084013e61305d565b606091505b509150915061306d828286613078565b979650505050505050565b606083156130875750816110c4565b8251156130975782518084602001fd5b8160405162461bcd60e51b81526004016109429190613999565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826130e7576000855561312d565b82601f1061310057805160ff191683800117855561312d565b8280016001018555821561312d579182015b8281111561312d578251825591602001919060010190613112565b5061313992915061315b565b5090565b6040518060a001604052806005906020820280368337509192915050565b5b80821115613139576000815560010161315c565b600082601f830112613180578081fd5b813561319361318e82614103565b6140df565b8181529150602080830190848101818402860182018710156131b457600080fd5b60005b848110156131d3578135845292820192908201906001016131b7565b505050505092915050565b8035801515811461090857600080fd5b600082601f8301126131fe578081fd5b813567ffffffffffffffff81111561321257fe5b613225601f8201601f19166020016140df565b915080825283602082850101111561323c57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215613266578081fd5b81356110c48161414d565b600060208284031215613282578081fd5b81516110c48161414d565b6000806040838503121561329f578081fd5b82356132aa8161414d565b915060208301356132ba8161414d565b809150509250929050565b6000806000606084860312156132d9578081fd5b83356132e48161414d565b925060208401356132f48161414d565b929592945050506040919091013590565b6000806000806080858703121561331a578081fd5b84356133258161414d565b935060208501356133358161414d565b925060408501359150606085013567ffffffffffffffff811115613357578182fd5b613363878288016131ee565b91505092959194509250565b60008060408385031215613381578182fd5b823561338c8161414d565b915061339a602084016131de565b90509250929050565b600080604083850312156133b5578182fd5b82356133c08161414d565b946020939093013593505050565b6000602082840312156133df578081fd5b81356110c481614162565b6000602082840312156133fb578081fd5b81516110c481614162565b600060208284031215613417578081fd5b813567ffffffffffffffff81111561342d578182fd5b6127a0848285016131ee565b6000806040838503121561344b578182fd5b823567ffffffffffffffff80821115613462578384fd5b61346e868387016131ee565b93506020850135915080821115613483578283fd5b50613490858286016131ee565b9150509250929050565b60008060008060008060008060006101208a8c0312156134b8578687fd5b893567ffffffffffffffff808211156134cf578889fd5b6134db8d838e016131ee565b9a5060208c01359150808211156134f0578889fd5b6134fc8d838e016131ee565b995060408c0135915080821115613511578889fd5b61351d8d838e016131ee565b985060608c0135915080821115613532578687fd5b61353e8d838e016131ee565b975060808c0135915080821115613553578687fd5b506135608c828d016131ee565b95505060a08a0135935061357660c08b016131de565b925060e08a013591506101008a013590509295985092959850929598565b6000602082840312156135a5578081fd5b5035919050565b600080600080608085870312156135c1578182fd5b8435935060208086013567ffffffffffffffff808211156135e0578485fd5b818801915088601f8301126135f3578485fd5b813561360161318e82614103565b81815284810190848601868402860187018d101561361d578889fd5b8895505b838610156136485780356136348161414d565b835260019590950194918601918601613621565b50975050506040880135925080831115613660578485fd5b61366c89848a01613170565b94506060880135925080831115613681578384fd5b5050613363878288016131ee565b600080604083850312156136a1578182fd5b82359150602083013567ffffffffffffffff8111156136be578182fd5b613490858286016131ee565b600080600080608085870312156136df578182fd5b84359350602085013567ffffffffffffffff808211156136fd578384fd5b613709888389016131ee565b9450604087013591508082111561371e578384fd5b5061372b878288016131ee565b949793965093946060013593505050565b6000806040838503121561374e578182fd5b50508035926020909101359150565b60008060008060808587031215613772578182fd5b843593506020850135925060408501359150613790606086016131de565b905092959194509250565b600081518084526137b3816020860160208601614121565b601f01601f19169290920160200192915050565b600081546001808216600081146137e557600181146137fc5761382e565b60ff198316865260028304607f168601935061382e565b600283048560005260208060002060005b838110156138265781548a82015290850190820161380d565b505050860193505b50505092915050565b60008251613849818460208701614121565b9190910192915050565b600061385f82856137c7565b835161386f818360208801614121565b01949350505050565b600061388482876137c7565b8551613894818360208a01614121565b6138a0818301876137c7565b91505083516138b3818360208801614121565b019695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906139059083018461379b565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6101408101818460005b600581101561395a5781516001600160a01b0316835260209283019290910190600101613932565b50505060a082018360005b6005811015613984578151835260209283019290910190600101613965565b5050509392505050565b901515815260200190565b6000602082526110c4602083018461379b565b6000604082526139bf604083018561379b565b82810360208401526139d1818561379b565b95945050505050565b60006101408083526139ee8184018e61379b565b90508281036020840152613a02818d61379b565b90508281036040840152613a16818c61379b565b90508281036060840152613a2a818b61379b565b90508281036080840152613a3e818a61379b565b60a0840198909852505093151560c085015260e08401929092526101008301526101209091015295945050505050565b600060608252613a81606083018661379b565b8281036020840152613a93818661379b565b915050826040830152949350505050565b6000610120808352613ab88184018d61379b565b90508281036020840152613acc818c61379b565b9050896040840152886060840152871515608084015282810360a0840152613af4818861379b565b90508560c084015282810360e0840152613b0e818661379b565b9150508215156101008301529a9950505050505050505050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252601590820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b90815260200190565b9384526001600160a01b0392909216602084015260408301521515606082015260800190565b6000838252604060208301526127a0604083018461379b565b600085825260806020830152614090608083018661379b565b82810360408401526140a2818661379b565b91505082606083015295945050505050565b918252602082015260400190565b938452602084019290925260408301521515606082015260800190565b60405181810167ffffffffffffffff811182821017156140fb57fe5b604052919050565b600067ffffffffffffffff82111561411757fe5b5060209081020190565b60005b8381101561413c578181015183820152602001614124565b838111156118795750506000910152565b6001600160a01b038116811461109f57600080fd5b6001600160e01b03198116811461109f57600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122079363c7e61604b302a590dfd4f1bdaf36fd257444f8e293dafdcea957999f1f964736f6c63430007050033

Deployed Bytecode Sourcemap

61814:13985:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9569:142;;;;;;;;;;-1:-1:-1;9569:142:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65738:885;;;;;;;;;;-1:-1:-1;65738:885:0;;;;;:::i;:::-;;:::i;:::-;;46890:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49073:213::-;;;;;;;;;;-1:-1:-1;49073:213:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48617:390::-;;;;;;;;;;-1:-1:-1;48617:390:0;;;;;:::i;:::-;;:::i;73514:396::-;;;;;;;;;;-1:-1:-1;73514:396:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;66987:488::-;;;;;;;;;;-1:-1:-1;66987:488:0;;;;;:::i;:::-;;:::i;63277:33::-;;;;;;;;;;;;;:::i;74767:155::-;;;;;;;;;;-1:-1:-1;74767:155:0;;;;;:::i;:::-;;:::i;48111:203::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;63398:29::-;;;;;;;;;;;;;:::i;61896:28::-;;;;;;;;;;;;;:::i;49947:305::-;;;;;;;;;;-1:-1:-1;49947:305:0;;;;;:::i;:::-;;:::i;71819:103::-;;;;;;;;;;;;;:::i;47881:154::-;;;;;;;;;;-1:-1:-1;47881:154:0;;;;;:::i;:::-;;:::i;74271:158::-;;;;;;;;;;-1:-1:-1;74271:158:0;;;;;:::i;:::-;;:::i;73922:108::-;;;;;;;;;;-1:-1:-1;73922:108:0;;;;;:::i;:::-;;:::i;61957:32::-;;;;;;;;;;;;;:::i;50323:151::-;;;;;;;;;;-1:-1:-1;50323:151:0;;;;;:::i;:::-;;:::i;63350:41::-;;;;;;;;;;;;;:::i;71930:369::-;;;;;;;;;;-1:-1:-1;71930:369:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;48391:164::-;;;;;;;;;;-1:-1:-1;48391:164:0;;;;;:::i;:::-;;:::i;75080:180::-;;;;;;;;;;-1:-1:-1;75080:180:0;;;;;:::i;:::-;;:::i;46654:169::-;;;;;;;;;;-1:-1:-1;46654:169:0;;;;;:::i;:::-;;:::i;67903:444::-;;;;;;;;;;-1:-1:-1;67903:444:0;;;;;:::i;:::-;;:::i;47708:89::-;;;;;;;;;;;;;:::i;71576:231::-;;;;;;;;;;-1:-1:-1;71576:231:0;;;;;:::i;:::-;;:::i;70117:1451::-;;;;;;:::i;:::-;;:::i;46377:215::-;;;;;;;;;;-1:-1:-1;46377:215:0;;;;;:::i;:::-;;:::i;69359:750::-;;;;;;;;;;-1:-1:-1;69359:750:0;;;;;:::i;:::-;;:::i;69150:197::-;;;;;;;;;;-1:-1:-1;69150:197:0;;;;;:::i;:::-;;:::i;60012:79::-;;;;;;;;;;;;;:::i;74441:314::-;;;;;;;;;;-1:-1:-1;74441:314:0;;;;;:::i;:::-;;:::i;47051:96::-;;;;;;;;;;;;;:::i;49358:295::-;;;;;;;;;;-1:-1:-1;49358:295:0;;;;;:::i;:::-;;:::i;72311:841::-;;;;;;;;;;-1:-1:-1;72311:841:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;73164:338::-;;;;;;;;;;-1:-1:-1;73164:338:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;67487:404::-;;;;;;;;;;-1:-1:-1;67487:404:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;68357:552::-;;;;;;;;;;-1:-1:-1;68357:552:0;;;;;:::i;:::-;;:::i;50545:285::-;;;;;;;;;;-1:-1:-1;50545:285:0;;;;;:::i;:::-;;:::i;66635:340::-;;;;;;;;;;-1:-1:-1;66635:340:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;74163:96::-;;;;;;;;;;-1:-1:-1;74163:96:0;;;;;:::i;:::-;;:::i;47218:247::-;;;;;;;;;;-1:-1:-1;47218:247:0;;;;;:::i;:::-;;:::i;68917:222::-;;;;;;;;;;-1:-1:-1;68917:222:0;;;;;:::i;:::-;;:::i;74038:113::-;;;;;;;;;;-1:-1:-1;74038:113:0;;;;;:::i;:::-;;:::i;49724:156::-;;;;;;;;;;-1:-1:-1;49724:156:0;;;;;:::i;:::-;;:::i;74934:138::-;;;;;;;;;;-1:-1:-1;74934:138:0;;;;;:::i;:::-;;:::i;60458:244::-;;;;;;;;;;-1:-1:-1;60458:244:0;;;;;:::i;:::-;;:::i;64638:1088::-;;;;;;;;;;-1:-1:-1;64638:1088:0;;;;;:::i;:::-;;:::i;9569:142::-;-1:-1:-1;;;;;;9670:33:0;;9646:4;9670:33;;;;;;;;;;;;;9569:142;;;;:::o;65738:885::-;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;;;;;;;;;65951:17:::1;:24;65924:16;:23;:51;65916:60;;;::::0;::::1;;66022:1;65995:16;:23;:28;;65987:37;;;::::0;::::1;;66045:34;66090:33:::0;;;:23:::1;:33;::::0;;;;;;:53;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;66168:9;66164:297;66183:16;:23;66181:1;:25;66164:297;;;66263:16;66280:1;66263:19;;;;;;;;;;;;;;66227:20;:30;66248:8;66227:30;;;;;;;;;;;66258:1;66227:33;;;;;;;;;:55;;;;;-1:-1:-1::0;;;;;66227:55:0::1;;;;;-1:-1:-1::0;;;;;66227:55:0::1;;;;;;66336:17;66354:1;66336:20;;;;;;;;;;;;;;66297:23;:33;66321:8;66297:33;;;;;;;;;;;66331:1;66297:36;;;;;;;;:59:::0;66429:20;;:17;;66447:1;;66429:20;::::1;;;;;;;;;;;66400:26;:49;66371:78;;66208:3;;;;;;;66164:297;;;-1:-1:-1::0;66513:23:0;;66481:29:::1;::::0;;;:19:::1;:29;::::0;;;;;;:55;;;;66591:23;;66562:53;;::::1;::::0;::::1;::::0;66501:8;;66591:23;66562:53:::1;:::i;:::-;;;;;;;;60294:1;65738:885:::0;;;;:::o;46890:92::-;46969:5;46962:12;;;;;;;;-1:-1:-1;;46962:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46936:13;;46962:12;;46969:5;;46962:12;;46969:5;46962:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46890:92;:::o;49073:213::-;49141:7;49169:16;49177:7;49169;:16::i;:::-;49161:73;;;;-1:-1:-1;;;49161:73:0;;;;;;;:::i;:::-;-1:-1:-1;49254:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;49254:24:0;;49073:213::o;48617:390::-;48698:13;48714:16;48722:7;48714;:16::i;:::-;48698:32;;48755:5;-1:-1:-1;;;;;48749:11:0;:2;-1:-1:-1;;;;;48749:11:0;;;48741:57;;;;-1:-1:-1;;;48741:57:0;;;;;;;:::i;:::-;48835:5;-1:-1:-1;;;;;48819:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;48819:21:0;;:62;;;;48844:37;48861:5;48868:12;:10;:12::i;48844:37::-;48811:154;;;;-1:-1:-1;;;48811:154:0;;;;;;;:::i;:::-;48978:21;48987:2;48991:7;48978:8;:21::i;:::-;48617:390;;;:::o;73514:396::-;73591:25;73618;73664:16;73672:7;73664;:16::i;:::-;73656:50;;;;-1:-1:-1;;;73656:50:0;;;;;;;:::i;:::-;73717:17;73737:31;;;:22;:31;;;;;;;;;73803:24;;;:13;:24;;;;;;;73828:5;;73803:31;;;;;;;73789:45;;;;;;;;;;;;;-1:-1:-1;;73789:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;73803:31;73789:45;;73803:31;73789:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73859:28:0;;;;:17;:28;;;;;73789:45;;-1:-1:-1;73888:5:0;;-1:-1:-1;;73859:35:0;;;;;;;;73845:49;;;;;;;;;;;;;-1:-1:-1;;73845:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;73859:35;73845:49;;73859:35;73845:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73514:396;;;;;;:::o;66987:488::-;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;67129:26:::1;::::0;;;:16:::1;:26:::0;;;;;:39;;;67213:28:::1;67158:10:::0;67213:16:::1;:28::i;:::-;67179:31;::::0;;;:21:::1;:31;::::0;;;;;;;:62;;-1:-1:-1;;;;;;67179:62:0::1;-1:-1:-1::0;;;;;67179:62:0;;;::::1;::::0;;;::::1;::::0;;;67252:22:::1;:32:::0;;;;;:54;;;67317:21:::1;:31:::0;;;;;:49;;-1:-1:-1;;67317:49:0::1;::::0;::::1;;;::::0;;67392:75;::::1;::::0;::::1;::::0;67179:31;;67418:10;;67252:54;;67317:49;;67392:75:::1;:::i;:::-;;;;;;;;66987:488:::0;;;;:::o;63277:33::-;;;-1:-1:-1;;;;;63277:33:0;;:::o;74767:155::-;74878:8;;:28;;-1:-1:-1;;;74878:28:0;;74834:18;;-1:-1:-1;;;;;74878:8:0;;:16;;:28;;74895:10;;74878:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74865:41;74767:155;-1:-1:-1;;74767:155:0:o;48111:203::-;48164:7;48285:21;:12;:19;:21::i;:::-;48278:28;;48111:203;:::o;63398:29::-;;;;;;;;;;;;;;;-1:-1:-1;;63398:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61896:28::-;;;;;;;;;;;;;;;-1:-1:-1;;61896:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49947:305;50108:41;50127:12;:10;:12::i;:::-;50141:7;50108:18;:41::i;:::-;50100:103;;;;-1:-1:-1;;;50100:103:0;;;;;;;:::i;:::-;50216:28;50226:4;50232:2;50236:7;50216:9;:28::i;71819:103::-;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;71872:42:::1;::::0;:10:::1;::::0;71892:21:::1;71872:42:::0;::::1;;;::::0;::::1;::::0;;;71892:21;71872:10;:42;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;71819:103::o:0;47881:154::-;-1:-1:-1;;;;;47997:20:0;;47970:7;47997:20;;;:13;:20;;;;;:30;;48021:5;47997:23;:30::i;:::-;47990:37;47881:154;-1:-1:-1;;;47881:154:0:o;74271:158::-;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;74370:20;;::::1;::::0;:10:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;74401:20:0;;::::1;::::0;:10:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;73922:108::-:0;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;73999:23;;::::1;::::0;:14:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;:::-;;73922:108:::0;:::o;61957:32::-;;;-1:-1:-1;;;;;61957:32:0;;:::o;50323:151::-;50427:39;50444:4;50450:2;50454:7;50427:39;;;;;;;;;;;;:16;:39::i;63350:41::-;;;;;;;;;;;;;;;-1:-1:-1;;63350:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71930:369;72068:24;72119:23;;;:13;:23;;;;;72014:25;;;;72143:5;72119:30;;;;;;;;72105:44;;;;;;;;;;;;;-1:-1:-1;;72105:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;72119:30;72105:44;;72119:30;72105:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72174:27:0;;;;:17;:27;;;;;72105:44;;-1:-1:-1;72202:5:0;;-1:-1:-1;;72174:34:0;;;;;;;;72160:48;;;;;;;;;;;;;-1:-1:-1;;72160:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;72174:34;72160:48;;72174:34;72160:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72268:21:0;;;;-1:-1:-1;;72268:11:0;:21;;;;;;;;;72238:17;:27;;;;;;;71930:369;;72160:48;;72238:51;;;;-1:-1:-1;;;71930:369:0:o;48391:164::-;48458:7;;48500:22;:12;48516:5;48500:15;:22::i;:::-;-1:-1:-1;48478:44:0;48391:164;-1:-1:-1;;;48391:164:0:o;75080:180::-;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;75165:18:::1;:34:::0;;-1:-1:-1;;;;;;75165:34:0;;::::1;-1:-1:-1::0;;;;;75165:34:0;;::::1;;::::0;;;;75210:8:::1;:42:::0;;75233:18;;;::::1;75210:42:::0;::::1;;::::0;;75080:180::o;46654:169::-;46718:7;46745:70;46762:7;46745:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;67903:444::-;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;67977:9:::1;67973:214;67992:29;::::0;;;:19:::1;:29;::::0;;;;;67990:31;::::1;67973:214;;;68078:42;68042:30:::0;;;:20:::1;:30;::::0;;;;68073:1;68042:33:::1;::::0;::::1;;;;;;:78:::0;;-1:-1:-1;;;;;;68042:78:0::1;-1:-1:-1::0;;;;;68042:78:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;68135:33:0;;;:23:::1;:33;::::0;;;;68169:1;68135:36:::1;::::0;::::1;;;;;;:40:::0;68023:3:::1;;67973:214;;;-1:-1:-1::0;68207:38:0::1;::::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;68207:38:0;;;:33;;;:23:::1;:33:::0;;;;;;:38;;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;68288:1:0::1;68256:29:::0;;;:19:::1;:29;::::0;;;;;:33;;;;68315:24;::::1;::::0;::::1;::::0;68276:8;;68315:24:::1;:::i;:::-;;;;;;;;67903:444:::0;:::o;47708:89::-;47781:8;47774:15;;;;;;;;-1:-1:-1;;47774:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47748:13;;47774:15;;47781:8;;47774:15;;47781:8;47774:15;;;;;;;;;;;;;;;;;;;;;;;;71576:231;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;71678:5:::1;71649:26:::0;;;:16:::1;:26;::::0;;;;;;;:34;;-1:-1:-1;;71649:34:0::1;::::0;;71724:11:::1;:21:::0;;;;;;71694:17:::1;:27:::0;;;;;;;:51;71771:27;::::1;::::0;::::1;::::0;71666:8;;71771:27:::1;:::i;70117:1451::-:0;70192:26;;;;:16;:26;;;;;;;;:34;;:26;:34;70184:43;;;;;;70275:27;;;;:17;:27;;;;;;;;;70246:11;:21;;;;;;;70270:1;70246:25;:56;;70238:65;;;;;;70322:28;;;;:18;:28;;;;;;;;:36;;:28;:36;70314:45;;;;;;70391:21;;;;:11;:21;;;;;;70378:9;:34;70370:43;;;;;;70434:15;70452:13;:11;:13::i;:::-;70468:1;70452:17;;;70480:31;;;;:22;:31;;;;;;;;:42;;;70564:21;;;:11;:21;;;;;;70533:28;;;:19;:28;;;;;;70564:25;;70533:56;;;70452:17;-1:-1:-1;70611:32:0;;:::i;:::-;70645:28;;:::i;:::-;70677:22;70690:8;70677:12;:22::i;:::-;70610:89;;;;70725:9;70721:215;70740:29;;;;:19;:29;;;;;;70738:31;;70721:215;;;70790:28;70837:14;70852:1;70837:17;;;;;;;;;;;70790:66;;70871:12;-1:-1:-1;;;;;70871:21:0;:50;70907:10;70918:1;70907:13;;;;;;;;;;;70903:3;70893:9;:13;:27;70871:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70771:3:0;;70721:215;;;-1:-1:-1;70959:31:0;;;;:21;:31;;;;;;;;:39;;:31;:39;70956:306;;;71014:25;71058:31;;;:21;:31;;;;;;;;;71136:22;:32;;;;;;;-1:-1:-1;;;;;71058:31:0;;;;;71197:53;71136:32;71226:3;71216:9;:13;:33;71197:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70956:306;;;71282:9;;:41;;-1:-1:-1;;;;;71282:9:0;;;;71301:21;71282:41;;;;;:9;:41;:9;:41;71301:21;71282:9;:41;;;;;;;;;;;;;;;;;;;;;71336:30;71346:10;71358:7;71336:9;:30::i;:::-;71403:21;;;;:11;:21;;;;;;;;;;71427:1;71403:25;71379:49;;;;71478:17;:27;;;;;71453:21;;;:52;71449:112;;;71522:27;71540:8;71522:17;:27::i;:::-;70117:1451;;;;:::o;46377:215::-;46441:7;-1:-1:-1;;;;;46469:19:0;;46461:74;;;;-1:-1:-1;;;46461:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46555:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;69359:750::-;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;69455:26:::1;::::0;;;:16:::1;:26;::::0;;;;;::::1;;:34;;:26:::0;:34:::1;69447:43;;;::::0;::::1;;69549:27;::::0;;;:17:::1;:27;::::0;;;;;;;;69509:11:::1;:21:::0;;;;;;;:36;::::1;:67;;69501:76;;;::::0;::::1;;69602:9;69612:21:::0;;;:11:::1;:21;::::0;;;;;69598:299:::1;69652:21;::::0;;;:11:::1;:21;::::0;;;;;69637:36;::::1;69635:38:::0;::::1;69598:299;;;69695:15;69713:13;:11;:13::i;:::-;69729:1;69713:17:::0;;::::1;69745:31;::::0;;;:22:::1;:31;::::0;;;;;;;:42;;;69802:19:::1;:28:::0;;;;;69833:5;;::::1;69802:36:::0;;;69713:17;-1:-1:-1;69855:30:0::1;69865:10;69713:17:::0;69855:9:::1;:30::i;:::-;-1:-1:-1::0;69675:3:0::1;;69598:299;;;-1:-1:-1::0;69933:21:0::1;::::0;;;:11:::1;:21;::::0;;;;;;;;;:36;::::1;69909:60:::0;;;;70019:17:::1;:27:::0;;;;;69994:21;;;:52:::1;69990:112;;;70063:27;70081:8;70063:17;:27::i;69150:197::-:0;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;69237:27:::1;::::0;;;:11:::1;:27;::::0;;;;:35;;;69298:41:::1;69249:14:::0;69332:6:::1;69267:5:::0;69326:12:::1;69298:41;;;;;;;:::i;:::-;;;;;;;;69150:197:::0;;:::o;60012:79::-;60077:6;;-1:-1:-1;;;;;60077:6:0;60012:79;:::o;74441:314::-;74522:13;74556:16;74564:7;74556;:16::i;:::-;74548:76;;;;-1:-1:-1;;;74548:76:0;;;;;;;:::i;:::-;74666:10;74678:24;74694:7;74678:15;:24::i;:::-;74704:10;74716:29;74732:12;74716:15;:29::i;:::-;74649:97;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74635:112;;74441:314;;;;:::o;47051:96::-;47132:7;47125:14;;;;;;;;-1:-1:-1;;47125:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47099:13;;47125:14;;47132:7;;47125:14;;47132:7;47125:14;;;;;;;;;;;;;;;;;;;;;;;;49358:295;49473:12;:10;:12::i;:::-;-1:-1:-1;;;;;49461:24:0;:8;-1:-1:-1;;;;;49461:24:0;;;49453:62;;;;-1:-1:-1;;;49453:62:0;;;;;;;:::i;:::-;49573:8;49528:18;:32;49547:12;:10;:12::i;:::-;-1:-1:-1;;;;;49528:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;49528:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;49528:53:0;;;;;;;;;;;49612:12;:10;:12::i;:::-;-1:-1:-1;;;;;49597:48:0;;49636:8;49597:48;;;;;;:::i;:::-;;;;;;;;49358:295;;:::o;72311:841::-;72370:21;72393:19;72414;72435:21;72458:19;72479:21;72502:13;72517:27;72546:14;72581:16;72589:7;72581;:16::i;:::-;72573:50;;;;-1:-1:-1;;;72573:50:0;;;;;;;:::i;:::-;72634:17;72654:31;;;:22;:31;;;;;;;;;72716:24;;;:13;:24;;;;;;72706:34;;;;;;;;;;;-1:-1:-1;;72706:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;72716:24;;72706:34;;;72716:24;72706:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72759:22:0;;;;:11;:22;;;;;;;;;72751:30;;;;;;;;;;;-1:-1:-1;;72751:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;72706:34;;-1:-1:-1;72759:22:0;-1:-1:-1;72751:30:0;;-1:-1:-1;72751:30:0;;72759:22;72751:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72806:17;:28;72824:9;72806:28;;;;;;;;;;;;72792:42;;72861:19;:28;72881:7;72861:28;;;;;;;;;;;;72845:44;;72917:18;:29;72936:9;72917:29;;;;;;;;;;;;;;;;;;;;;72900:46;;72967:14;:25;72982:9;72967:25;;;;;;;;;;;72957:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73011:22:0;;;;:11;:22;;;;;;;;;73060:23;:34;;;;;;73044:50;;;;;;;;;;;-1:-1:-1;;73044:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;72957:35;;-1:-1:-1;73011:22:0;;-1:-1:-1;73060:34:0;;-1:-1:-1;73044:50:0;;-1:-1:-1;73044:50:0;;73060:34;73044:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73117:27:0;;;;-1:-1:-1;;73117:16:0;:27;;;;;;;72311:841;;;;-1:-1:-1;72311:841:0;;;;;;;;;;73117:27;;;;;72311:841;-1:-1:-1;;72311:841:0:o;73164:338::-;73226:21;73249:22;73292:16;73300:7;73292;:16::i;:::-;73284:50;;;;-1:-1:-1;;;73284:50:0;;;;;;;:::i;:::-;-1:-1:-1;;73345:17:0;73365:31;;;:22;:31;;;;;;;;;73433:9;;73470:24;;;:13;:24;;;;;;;-1:-1:-1;;;;;73433:9:0;;;;73164:338::o;67487:404::-;67554:18;67673:26;;;:16;:26;;;;;;;;67727:21;:31;;;;;;67791:22;:32;;;;;;67852:21;:31;;;;;;;;67673:26;;-1:-1:-1;;;;;67727:31:0;;;;67852;;;67487:404::o;68357:552::-;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;68518:33:::1;::::0;;;:17:::1;:33;::::0;;;;68552:12;68518:47:::1;::::0;::::1;;;;;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;::::1;;:56;68510:65;;;::::0;::::1;;68596:29;::::0;;;:13:::1;:29;::::0;;;;68642:11;;68626:12;68596:43:::1;::::0;::::1;;;;;;:57;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;68664:33:0::1;::::0;;;:17:::1;:33;::::0;;;;68714:11;;68698:12;68664:47:::1;::::0;::::1;;;;;;:61;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;68750:33:0::1;::::0;;;:17:::1;:33;::::0;;;;68800:4:::1;::::0;68784:12;68750:47:::1;::::0;::::1;;;;;;;;;;;;;;:54;;;;;;;;;;;;;;;;;;68830:71;68846:14;68862:11;68875;68888:12;68830:71;;;;;;;;;:::i;50545:285::-:0;50677:41;50696:12;:10;:12::i;:::-;50710:7;50677:18;:41::i;:::-;50669:103;;;;-1:-1:-1;;;50669:103:0;;;;;;;:::i;:::-;50783:39;50797:4;50803:2;50807:7;50816:5;50783:13;:39::i;66635:340::-;66696:27;;:::i;:::-;66725:29;;:::i;:::-;66771:9;66767:197;66786:29;;;;:19;:29;;;;;;66784:31;;66767:197;;;66851:30;;;;:20;:30;;;;;66882:1;66851:33;;;;;;;;;-1:-1:-1;;;;;66851:33:0;66836:9;66846:1;66836:12;;;;;;;-1:-1:-1;;;;;66836:48:0;;;:12;;;;;;;;:48;66916:33;;;;:23;:33;;;;;;66950:1;66916:36;;;;;;;;;66899:11;66911:1;66899:14;;;;;;;;;;:53;66817:3;;66767:197;;;;66635:340;;;:::o;74163:96::-;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;74232:19:::1;74244:6;74232:11;:19::i;47218:247::-:0;47283:13;47317:16;47325:7;47317;:16::i;:::-;47309:76;;;;-1:-1:-1;;;47309:76:0;;;;;;;:::i;:::-;47427:8;47437:18;:7;:16;:18::i;:::-;47410:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47396:61;;47218:247;;;:::o;68917:222::-;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;69018:30:::1;::::0;;;:14:::1;:30;::::0;;;;;;;:44;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;69089:42;69103:14;69119:11;69089:42;;;;;;;:::i;74038:113::-:0;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;74122:9:::1;:21:::0;;-1:-1:-1;;;;;;74122:21:0::1;-1:-1:-1::0;;;;;74122:21:0;;;::::1;::::0;;;::::1;::::0;;74038:113::o;49724:156::-;-1:-1:-1;;;;;49837:25:0;;;49813:4;49837:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;49724:156::o;74934:138::-;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;75027:36;;::::1;::::0;:15:::1;::::0;:36:::1;::::0;::::1;::::0;::::1;:::i;60458:244::-:0;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60547:22:0;::::1;60539:73;;;;-1:-1:-1::0;;;60539:73:0::1;;;;;;;:::i;:::-;60649:6;::::0;60628:38:::1;::::0;-1:-1:-1;;;;;60628:38:0;;::::1;::::0;60649:6:::1;::::0;60628:38:::1;::::0;60649:6:::1;::::0;60628:38:::1;60677:6;:17:::0;;-1:-1:-1;;;;;;60677:17:0::1;-1:-1:-1::0;;;;;60677:17:0;;;::::1;::::0;;;::::1;::::0;;60458:244::o;64638:1088::-;60234:12;:10;:12::i;:::-;60224:6;;-1:-1:-1;;;;;60224:6:0;;;:22;;;60216:67;;;;-1:-1:-1;;;60216:67:0;;;;;;;:::i;:::-;64900:11:::1;::::0;;64883:29:::1;::::0;;;:16:::1;:29;::::0;;;;;;;:36;;-1:-1:-1;;64883:36:0::1;64915:4;64883:36:::0;;::::1;::::0;;;64954:11;;64940:26;;:13:::1;:26:::0;;;;;:43;;::::1;::::0;:29;;;::::1;::::0;:43;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;65012:11:0::1;::::0;64994:30:::1;::::0;;;:17:::1;:30;::::0;;;;65030:11;;65025:1:::1;64994:33;:47;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;65064:11:0::1;::::0;65052:24:::1;::::0;;;:11:::1;:24;::::0;;;;;;;:32;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;65109:11:0::1;::::0;65095:26:::1;::::0;;;:13:::1;:26;::::0;;;;;;;:36;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;65157:11:0::1;::::0;65142:27:::1;::::0;;;:14:::1;:27;::::0;;;;;;;:37;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;65208:11:0::1;::::0;;65190:30:::1;::::0;;;:17:::1;:30;::::0;;;;;;;:44;;;65258:11;;65245:25;;:12:::1;:25:::0;;;;;:29;;;65297:11;;65285:24;;:11:::1;:24:::0;;;;;:28;;;65342:11;;65324:30;;:17:::1;:30:::0;;;;;:40;;-1:-1:-1;;65324:40:0::1;;;::::0;;65394:11;;65375:31;;:18:::1;:31:::0;;;;;:48;;-1:-1:-1;;65375:48:0::1;::::0;::::1;;;::::0;;65446:11;;65434:24;;:11:::1;:24:::0;;;;;:32;;;65491:11;;65477:26;;:13:::1;:26:::0;;;;;;;:36;;;65652:11;;65539:125;;::::1;::::0;::::1;::::0;65556:11;;65569;;65582:5;;65589:7;;65598;;65190:44;;65375:48;;65434:32;;65477:36;;65652:11;65539:125:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;65703:11:0::1;::::0;;65717:1:::1;65703:15;65689:29:::0;;-1:-1:-1;;;;;;;64638:1088:0:o;599:106::-;687:10;599:106;:::o;52297:119::-;52354:4;52378:30;:12;52400:7;52378:21;:30::i;58124:158::-;58190:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;58190:29:0;-1:-1:-1;;;;;58190:29:0;;;;;;;;:24;;58244:16;58190:24;58244:7;:16::i;:::-;-1:-1:-1;;;;;58235:39:0;;;;;;;;;;;58124:158;;:::o;40455:123::-;40524:7;40551:19;40559:3;40551:7;:19::i;52583:333::-;52668:4;52693:16;52701:7;52693;:16::i;:::-;52685:73;;;;-1:-1:-1;;;52685:73:0;;;;;;;:::i;:::-;52769:13;52785:16;52793:7;52785;:16::i;:::-;52769:32;;52831:5;-1:-1:-1;;;;;52820:16:0;:7;-1:-1:-1;;;;;52820:16:0;;:51;;;;52864:7;-1:-1:-1;;;;;52840:31:0;:20;52852:7;52840:11;:20::i;:::-;-1:-1:-1;;;;;52840:31:0;;52820:51;:87;;;;52875:32;52892:5;52899:7;52875:16;:32::i;:::-;52812:96;52583:333;-1:-1:-1;;;;52583:333:0:o;55672:574::-;55790:4;-1:-1:-1;;;;;55770:24:0;:16;55778:7;55770;:16::i;:::-;-1:-1:-1;;;;;55770:24:0;;55762:78;;;;-1:-1:-1;;;55762:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55859:16:0;;55851:65;;;;-1:-1:-1;;;55851:65:0;;;;;;;:::i;:::-;55929:39;55950:4;55956:2;55960:7;55929:20;:39::i;:::-;56033:29;56050:1;56054:7;56033:8;:29::i;:::-;-1:-1:-1;;;;;56075:19:0;;;;;;:13;:19;;;;;:35;;56102:7;56075:26;:35::i;:::-;-1:-1:-1;;;;;;56121:17:0;;;;;;:13;:17;;;;;:30;;56143:7;56121:21;:30::i;:::-;-1:-1:-1;56164:29:0;:12;56181:7;56190:2;56164:16;:29::i;:::-;;56230:7;56226:2;-1:-1:-1;;;;;56211:27:0;56220:4;-1:-1:-1;;;;;56211:27:0;;;;;;;;;;;55672:574;;;:::o;33114:137::-;33185:7;33220:22;33224:3;33236:5;33220:3;:22::i;40917:227::-;40997:7;;;;41057:22;41061:3;41073:5;41057:3;:22::i;:::-;41026:53;;;;-1:-1:-1;40917:227:0;-1:-1:-1;;;;;40917:227:0:o;41579:204::-;41686:7;41729:44;41734:3;41754;41760:12;41729:4;:44::i;53259:110::-;53335:26;53345:2;53349:7;53335:26;;;;;;;;;;;;:9;:26::i;75276:507::-;75333:13;75363:7;75359:50;;-1:-1:-1;75387:10:0;;;;;;;;;;;;-1:-1:-1;;;75387:10:0;;;;;;75359:50;75438:2;75429:6;75478:69;75485:6;;75478:69;;75508:5;;75533:2;75528:7;;;;75478:69;;;75565:17;75595:3;75585:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75585:14:0;-1:-1:-1;75565:34:0;-1:-1:-1;;;75619:7:0;;75645:103;75652:7;;75645:103;;75709:2;75704;:7;75699:2;:12;75688:25;;75676:4;75681:3;;;;;;;75676:9;;;;;;;;;;;:37;-1:-1:-1;;;;;75676:37:0;;;;;;;;-1:-1:-1;75734:2:0;75728:8;;;;75645:103;;;-1:-1:-1;75770:4:0;75276:507;-1:-1:-1;;;;75276:507:0:o;51712:272::-;51826:28;51836:4;51842:2;51846:7;51826:9;:28::i;:::-;51873:48;51896:4;51902:2;51906:7;51915:5;51873:22;:48::i;:::-;51865:111;;;;-1:-1:-1;;;51865:111:0;;;;;;;:::i;56847:100::-;56920:19;;;;:8;;:19;;;;;:::i;41978:744::-;42034:13;42255:10;42251:53;;-1:-1:-1;42282:10:0;;;;;;;;;;;;-1:-1:-1;;;42282:10:0;;;;;;42251:53;42329:5;42314:12;42370:78;42377:9;;42370:78;;42403:8;;42434:2;42426:10;;;;42370:78;;;42458:19;42490:6;42480:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42480:17:0;-1:-1:-1;42552:5:0;;-1:-1:-1;42458:39:0;-1:-1:-1;;;42524:10:0;;42568:115;42575:9;;42568:115;;42642:2;42635:4;:9;42630:2;:14;42619:27;;42601:6;42608:7;;;;;;;42601:15;;;;;;;;;;;:45;-1:-1:-1;;;;;42601:45:0;;;;;;;;-1:-1:-1;42669:2:0;42661:10;;;;42568:115;;40216:151;40300:4;40324:35;40334:3;40354;40324:9;:35::i;37838:110::-;37921:19;;37838:110::o;32201:137::-;32271:4;32295:35;32303:3;32323:5;32295:7;:35::i;31894:131::-;31961:4;31985:32;31990:3;32010:5;31985:4;:32::i;39648:176::-;39737:4;39761:55;39766:3;39786;-1:-1:-1;;;;;39800:14:0;;39761:4;:55::i;28188:204::-;28283:18;;28255:7;;28283:26;-1:-1:-1;28275:73:0;;;;-1:-1:-1;;;28275:73:0;;;;;;;:::i;:::-;28366:3;:11;;28378:5;28366:18;;;;;;;;;;;;;;;;28359:25;;28188:204;;;;:::o;38303:279::-;38407:19;;38370:7;;;;38407:27;-1:-1:-1;38399:74:0;;;;-1:-1:-1;;;38399:74:0;;;;;;;:::i;:::-;38486:22;38511:3;:12;;38524:5;38511:19;;;;;;;;;;;;;;;;;;38486:44;;38549:5;:10;;;38561:5;:12;;;38541:33;;;;;38303:279;;;;;:::o;39005:319::-;39099:7;39138:17;;;:12;;;:17;;;;;;39189:12;39174:13;39166:36;;;;-1:-1:-1;;;39166:36:0;;;;;;;;:::i;:::-;;39256:3;:12;;39280:1;39269:8;:12;39256:26;;;;;;;;;;;;;;;;;;:33;;;39249:40;;;39005:319;;;;;:::o;53596:250::-;53692:18;53698:2;53702:7;53692:5;:18::i;:::-;53729:54;53760:1;53764:2;53768:7;53777:5;53729:22;:54::i;:::-;53721:117;;;;-1:-1:-1;;;53721:117:0;;;;;;;:::i;57512:604::-;57633:4;57660:15;:2;-1:-1:-1;;;;;57660:13:0;;:15::i;:::-;57655:60;;-1:-1:-1;57699:4:0;57692:11;;57655:60;57725:23;57751:252;-1:-1:-1;;;57864:12:0;:10;:12::i;:::-;57891:4;57910:7;57932:5;57767:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;57767:181:0;;;;;;;-1:-1:-1;;;;;57767:181:0;;;;;;;;;;;57751:252;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57751:15:0;;;:252;:15;:252::i;:::-;57725:278;;58014:13;58041:10;58030:32;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;58081:26:0;-1:-1:-1;;;58081:26:0;;-1:-1:-1;;;57512:604:0;;;;;;:::o;37618:125::-;37689:4;37713:17;;;:12;;;;;:17;;;;;;:22;;;37618:125::o;25890:1544::-;25956:4;26095:19;;;:12;;;:19;;;;;;26131:15;;26127:1300;;26566:18;;-1:-1:-1;;26517:14:0;;;;26566:22;;;;26493:21;;26566:3;;:22;;26853;;;;;;;;;;;;;;26833:42;;26999:9;26970:3;:11;;26982:13;26970:26;;;;;;;;;;;;;;;;;;;:38;;;;27076:23;;;27118:1;27076:12;;;:23;;;;;;27102:17;;;27076:43;;27228:17;;27076:3;;27228:17;;;;;;;;;;;;;;;;;;;;;;27323:3;:12;;:19;27336:5;27323:19;;;;;;;;;;;27316:26;;;27366:4;27359:11;;;;;;;;26127:1300;27410:5;27403:12;;;;;25300:414;25363:4;25385:21;25395:3;25400:5;25385:9;:21::i;:::-;25380:327;;-1:-1:-1;25423:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;25606:18;;25584:19;;;:12;;;:19;;;;;;:40;;;;25639:11;;25380:327;-1:-1:-1;25690:5:0;25683:12;;35118:692;35194:4;35329:17;;;:12;;;:17;;;;;;35363:13;35359:444;;-1:-1:-1;;35448:38:0;;;;;;;;;;;;;;;;;;35430:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;35645:19;;35625:17;;;:12;;;:17;;;;;;;:39;35679:11;;35359:444;35759:5;35723:3;:12;;35747:1;35736:8;:12;35723:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;35786:5;35779:12;;;;;54182:404;-1:-1:-1;;;;;54262:16:0;;54254:61;;;;-1:-1:-1;;;54254:61:0;;;;;;;:::i;:::-;54335:16;54343:7;54335;:16::i;:::-;54334:17;54326:58;;;;-1:-1:-1;;;54326:58:0;;;;;;;:::i;:::-;54397:45;54426:1;54430:2;54434:7;54397:20;:45::i;:::-;-1:-1:-1;;;;;54455:17:0;;;;;;:13;:17;;;;;:30;;54477:7;54455:21;:30::i;:::-;-1:-1:-1;54498:29:0;:12;54515:7;54524:2;54498:16;:29::i;:::-;-1:-1:-1;54545:33:0;;54570:7;;-1:-1:-1;;;;;54545:33:0;;;54562:1;;54545:33;;54562:1;;54545:33;54182:404;;:::o;16381:422::-;16748:20;16787:8;;;16381:422::o;19299:195::-;19402:12;19434:52;19456:6;19464:4;19470:1;19473:12;19402;20603:18;20614:6;20603:10;:18::i;:::-;20595:60;;;;-1:-1:-1;;;20595:60:0;;;;;;;:::i;:::-;20729:12;20743:23;20770:6;-1:-1:-1;;;;;20770:11:0;20790:5;20798:4;20770:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20728:75;;;;20821:52;20839:7;20848:10;20860:12;20821:17;:52::i;:::-;20814:59;20351:530;-1:-1:-1;;;;;;;20351:530:0:o;22891:742::-;23006:12;23035:7;23031:595;;;-1:-1:-1;23066:10:0;23059:17;;23031:595;23180:17;;:21;23176:439;;23443:10;23437:17;23504:15;23491:10;23487:2;23483:19;23476:44;23391:148;23586:12;23579:20;;-1:-1:-1;;;23579:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:692:1;;127:3;120:4;112:6;108:17;104:27;94:2;;149:5;142;135:20;94:2;193:6;180:20;218:69;233:53;279:6;233:53;:::i;:::-;218:69;:::i;:::-;321:21;;;209:78;-1:-1:-1;361:4:1;381:14;;;;415:15;;;461;;;449:28;;445:37;;442:46;-1:-1:-1;439:2:1;;;501:1;498;491:12;439:2;523:1;533:167;547:6;544:1;541:13;533:167;;;608:17;;596:30;;646:12;;;;678;;;;569:1;562:9;533:167;;;537:3;;;;;84:622;;;;:::o;711:162::-;778:20;;834:13;;827:21;817:32;;807:2;;863:1;860;853:12;878:521;;975:3;968:4;960:6;956:17;952:27;942:2;;997:5;990;983:20;942:2;1041:6;1028:20;1071:18;1063:6;1060:30;1057:2;;;1093:9;1057:2;1122:58;1168:2;1145:17;;-1:-1:-1;;1141:31:1;1174:4;1137:42;1122:58;:::i;:::-;1113:67;;1203:6;1196:5;1189:21;1257:3;1250:4;1241:6;1233;1229:19;1225:30;1222:39;1219:2;;;1274:1;1271;1264:12;1219:2;1337:6;1330:4;1322:6;1318:17;1311:4;1304:5;1300:16;1287:57;1391:1;1364:18;;;1384:4;1360:29;1353:40;1368:5;932:467;-1:-1:-1;;932:467:1:o;1404:259::-;;1516:2;1504:9;1495:7;1491:23;1487:32;1484:2;;;1537:6;1529;1522:22;1484:2;1581:9;1568:23;1600:33;1627:5;1600:33;:::i;1668:263::-;;1791:2;1779:9;1770:7;1766:23;1762:32;1759:2;;;1812:6;1804;1797:22;1759:2;1849:9;1843:16;1868:33;1895:5;1868:33;:::i;2208:402::-;;;2337:2;2325:9;2316:7;2312:23;2308:32;2305:2;;;2358:6;2350;2343:22;2305:2;2402:9;2389:23;2421:33;2448:5;2421:33;:::i;:::-;2473:5;-1:-1:-1;2530:2:1;2515:18;;2502:32;2543:35;2502:32;2543:35;:::i;:::-;2597:7;2587:17;;;2295:315;;;;;:::o;2615:470::-;;;;2761:2;2749:9;2740:7;2736:23;2732:32;2729:2;;;2782:6;2774;2767:22;2729:2;2826:9;2813:23;2845:33;2872:5;2845:33;:::i;:::-;2897:5;-1:-1:-1;2954:2:1;2939:18;;2926:32;2967:35;2926:32;2967:35;:::i;:::-;2719:366;;3021:7;;-1:-1:-1;;;3075:2:1;3060:18;;;;3047:32;;2719:366::o;3090:691::-;;;;;3262:3;3250:9;3241:7;3237:23;3233:33;3230:2;;;3284:6;3276;3269:22;3230:2;3328:9;3315:23;3347:33;3374:5;3347:33;:::i;:::-;3399:5;-1:-1:-1;3456:2:1;3441:18;;3428:32;3469:35;3428:32;3469:35;:::i;:::-;3523:7;-1:-1:-1;3577:2:1;3562:18;;3549:32;;-1:-1:-1;3632:2:1;3617:18;;3604:32;3659:18;3648:30;;3645:2;;;3696:6;3688;3681:22;3645:2;3724:51;3767:7;3758:6;3747:9;3743:22;3724:51;:::i;:::-;3714:61;;;3220:561;;;;;;;:::o;3786:329::-;;;3912:2;3900:9;3891:7;3887:23;3883:32;3880:2;;;3933:6;3925;3918:22;3880:2;3977:9;3964:23;3996:33;4023:5;3996:33;:::i;:::-;4048:5;-1:-1:-1;4072:37:1;4105:2;4090:18;;4072:37;:::i;:::-;4062:47;;3870:245;;;;;:::o;4120:327::-;;;4249:2;4237:9;4228:7;4224:23;4220:32;4217:2;;;4270:6;4262;4255:22;4217:2;4314:9;4301:23;4333:33;4360:5;4333:33;:::i;:::-;4385:5;4437:2;4422:18;;;;4409:32;;-1:-1:-1;;;4207:240:1:o;4452:257::-;;4563:2;4551:9;4542:7;4538:23;4534:32;4531:2;;;4584:6;4576;4569:22;4531:2;4628:9;4615:23;4647:32;4673:5;4647:32;:::i;4714:261::-;;4836:2;4824:9;4815:7;4811:23;4807:32;4804:2;;;4857:6;4849;4842:22;4804:2;4894:9;4888:16;4913:32;4939:5;4913:32;:::i;4980:343::-;;5102:2;5090:9;5081:7;5077:23;5073:32;5070:2;;;5123:6;5115;5108:22;5070:2;5168:9;5155:23;5201:18;5193:6;5190:30;5187:2;;;5238:6;5230;5223:22;5187:2;5266:51;5309:7;5300:6;5289:9;5285:22;5266:51;:::i;5328:575::-;;;5477:2;5465:9;5456:7;5452:23;5448:32;5445:2;;;5498:6;5490;5483:22;5445:2;5543:9;5530:23;5572:18;5613:2;5605:6;5602:14;5599:2;;;5634:6;5626;5619:22;5599:2;5662:51;5705:7;5696:6;5685:9;5681:22;5662:51;:::i;:::-;5652:61;;5766:2;5755:9;5751:18;5738:32;5722:48;;5795:2;5785:8;5782:16;5779:2;;;5816:6;5808;5801:22;5779:2;;5844:53;5889:7;5878:8;5867:9;5863:24;5844:53;:::i;:::-;5834:63;;;5435:468;;;;;:::o;5908:1488::-;;;;;;;;;;6203:3;6191:9;6182:7;6178:23;6174:33;6171:2;;;6225:6;6217;6210:22;6171:2;6270:9;6257:23;6299:18;6340:2;6332:6;6329:14;6326:2;;;6361:6;6353;6346:22;6326:2;6389:51;6432:7;6423:6;6412:9;6408:22;6389:51;:::i;:::-;6379:61;;6493:2;6482:9;6478:18;6465:32;6449:48;;6522:2;6512:8;6509:16;6506:2;;;6543:6;6535;6528:22;6506:2;6571:53;6616:7;6605:8;6594:9;6590:24;6571:53;:::i;:::-;6561:63;;6677:2;6666:9;6662:18;6649:32;6633:48;;6706:2;6696:8;6693:16;6690:2;;;6727:6;6719;6712:22;6690:2;6755:53;6800:7;6789:8;6778:9;6774:24;6755:53;:::i;:::-;6745:63;;6861:2;6850:9;6846:18;6833:32;6817:48;;6890:2;6880:8;6877:16;6874:2;;;6911:6;6903;6896:22;6874:2;6939:53;6984:7;6973:8;6962:9;6958:24;6939:53;:::i;:::-;6929:63;;7045:3;7034:9;7030:19;7017:33;7001:49;;7075:2;7065:8;7062:16;7059:2;;;7096:6;7088;7081:22;7059:2;;7124:53;7169:7;7158:8;7147:9;7143:24;7124:53;:::i;:::-;7114:63;;;7224:3;7213:9;7209:19;7196:33;7186:43;;7248:38;7281:3;7270:9;7266:19;7248:38;:::i;:::-;7238:48;;7333:3;7322:9;7318:19;7305:33;7295:43;;7385:3;7374:9;7370:19;7357:33;7347:43;;6161:1235;;;;;;;;;;;:::o;7401:190::-;;7513:2;7501:9;7492:7;7488:23;7484:32;7481:2;;;7534:6;7526;7519:22;7481:2;-1:-1:-1;7562:23:1;;7471:120;-1:-1:-1;7471:120:1:o;7596:1593::-;;;;;7819:3;7807:9;7798:7;7794:23;7790:33;7787:2;;;7841:6;7833;7826:22;7787:2;7882:9;7869:23;7859:33;;7911:2;7964;7953:9;7949:18;7936:32;7987:18;8028:2;8020:6;8017:14;8014:2;;;8049:6;8041;8034:22;8014:2;8092:6;8081:9;8077:22;8067:32;;8137:7;8130:4;8126:2;8122:13;8118:27;8108:2;;8164:6;8156;8149:22;8108:2;8209;8196:16;8232:69;8247:53;8293:6;8247:53;:::i;8232:69::-;8335:19;;;8370:12;;;;8402:11;;;8440:15;;;8432:24;;8428:33;;8425:46;-1:-1:-1;8422:2:1;;;8489:6;8481;8474:22;8422:2;8516:6;8507:15;;8531:244;8545:6;8542:1;8539:13;8531:244;;;8620:3;8607:17;8637:33;8664:5;8637:33;:::i;:::-;8683:18;;8567:1;8560:9;;;;;8721:12;;;;8753;;8531:244;;;-1:-1:-1;8794:5:1;-1:-1:-1;;;8852:2:1;8837:18;;8824:32;;-1:-1:-1;8868:16:1;;;8865:2;;;8902:6;8894;8887:22;8865:2;8930:69;8991:7;8980:8;8969:9;8965:24;8930:69;:::i;:::-;8920:79;;9052:2;9041:9;9037:18;9024:32;9008:48;;9081:2;9071:8;9068:16;9065:2;;;9102:6;9094;9087:22;9065:2;;;9130:53;9175:7;9164:8;9153:9;9149:24;9130:53;:::i;9194:411::-;;;9333:2;9321:9;9312:7;9308:23;9304:32;9301:2;;;9354:6;9346;9339:22;9301:2;9395:9;9382:23;9372:33;;9456:2;9445:9;9441:18;9428:32;9483:18;9475:6;9472:30;9469:2;;;9520:6;9512;9505:22;9469:2;9548:51;9591:7;9582:6;9571:9;9567:22;9548:51;:::i;9610:712::-;;;;;9793:3;9781:9;9772:7;9768:23;9764:33;9761:2;;;9815:6;9807;9800:22;9761:2;9856:9;9843:23;9833:33;;9917:2;9906:9;9902:18;9889:32;9940:18;9981:2;9973:6;9970:14;9967:2;;;10002:6;9994;9987:22;9967:2;10030:51;10073:7;10064:6;10053:9;10049:22;10030:51;:::i;:::-;10020:61;;10134:2;10123:9;10119:18;10106:32;10090:48;;10163:2;10153:8;10150:16;10147:2;;;10184:6;10176;10169:22;10147:2;;10212:53;10257:7;10246:8;10235:9;10231:24;10212:53;:::i;:::-;9751:571;;;;-1:-1:-1;10202:63:1;;10312:2;10297:18;10284:32;;-1:-1:-1;;;9751:571:1:o;10327:258::-;;;10456:2;10444:9;10435:7;10431:23;10427:32;10424:2;;;10477:6;10469;10462:22;10424:2;-1:-1:-1;;10505:23:1;;;10575:2;10560:18;;;10547:32;;-1:-1:-1;10414:171:1:o;10590:397::-;;;;;10750:3;10738:9;10729:7;10725:23;10721:33;10718:2;;;10772:6;10764;10757:22;10718:2;10813:9;10800:23;10790:33;;10870:2;10859:9;10855:18;10842:32;10832:42;;10921:2;10910:9;10906:18;10893:32;10883:42;;10944:37;10977:2;10966:9;10962:18;10944:37;:::i;:::-;10934:47;;10708:279;;;;;;;:::o;10992:259::-;;11073:5;11067:12;11100:6;11095:3;11088:19;11116:63;11172:6;11165:4;11160:3;11156:14;11149:4;11142:5;11138:16;11116:63;:::i;:::-;11233:2;11212:15;-1:-1:-1;;11208:29:1;11199:39;;;;11240:4;11195:50;;11043:208;-1:-1:-1;;11043:208:1:o;11256:702::-;;11349:5;11343:12;11374:1;11406:2;11395:9;11391:18;11423:1;11418:126;;;;11558:1;11553:399;;;;11384:568;;11418:126;-1:-1:-1;;11451:24:1;;11439:37;;11524:1;11509:17;;11528:4;11505:28;11496:38;;;-1:-1:-1;11418:126:1;;11553:399;11603:1;11592:9;11588:17;11628:5;11625:1;11618:16;11657:4;11702:2;11699:1;11689:16;11727:1;11741:165;11755:6;11752:1;11749:13;11741:165;;;11833:14;;11820:11;;;11813:35;11876:16;;;;11770:10;;11741:165;;;-1:-1:-1;;;11926:16:1;;;-1:-1:-1;11384:568:1;;;;11316:642;;;;:::o;11963:274::-;;12130:6;12124:13;12146:53;12192:6;12187:3;12180:4;12172:6;12168:17;12146:53;:::i;:::-;12215:16;;;;;12100:137;-1:-1:-1;;12100:137:1:o;12242:378::-;;12446:40;12482:3;12474:6;12446:40;:::i;:::-;12515:6;12509:13;12531:52;12576:6;12572:2;12565:4;12557:6;12553:17;12531:52;:::i;:::-;12599:15;;12426:194;-1:-1:-1;;;;12426:194:1:o;12625:645::-;;12922:40;12958:3;12950:6;12922:40;:::i;:::-;12991:6;12985:13;13007:52;13052:6;13048:2;13041:4;13033:6;13029:17;13007:52;:::i;:::-;13078;13122:6;13118:2;13114:15;13106:6;13078:52;:::i;:::-;13068:62;;;13161:6;13155:13;13177:54;13222:8;13218:2;13211:4;13203:6;13199:17;13177:54;:::i;:::-;13247:17;;12902:368;-1:-1:-1;;;;;;12902:368:1:o;13275:203::-;-1:-1:-1;;;;;13439:32:1;;;;13421:51;;13409:2;13394:18;;13376:102::o;13707:506::-;-1:-1:-1;;;;;13992:15:1;;;13974:34;;14044:15;;14039:2;14024:18;;14017:43;14091:2;14076:18;;14069:34;;;14139:3;14134:2;14119:18;;14112:31;;;13707:506;;14160:47;;14187:19;;14179:6;14160:47;:::i;:::-;14152:55;13926:287;-1:-1:-1;;;;;;13926:287:1:o;14218:274::-;-1:-1:-1;;;;;14410:32:1;;;;14392:51;;14474:2;14459:18;;14452:34;14380:2;14365:18;;14347:145::o;14497:932::-;14751:3;14736:19;;14740:9;14832:6;14497:932;14866:220;14880:4;14877:1;14874:11;14866:220;;;14943:13;;-1:-1:-1;;;;;14939:39:1;14927:52;;15002:4;15026:12;;;;15061:15;;;;14975:1;14893:9;14866:220;;;14870:3;;;15123;15112:9;15108:19;15175:6;15201:1;15211:212;15227:4;15222:3;15219:13;15211:212;;;15292:15;;15278:30;;15331:4;15357:14;;;;15396:17;;;;15251:1;15242:11;15211:212;;;15215:3;;;14718:711;;;;;:::o;15434:187::-;15599:14;;15592:22;15574:41;;15562:2;15547:18;;15529:92::o;15626:221::-;;15775:2;15764:9;15757:21;15795:46;15837:2;15826:9;15822:18;15814:6;15795:46;:::i;15852:385::-;;16049:2;16038:9;16031:21;16075:46;16117:2;16106:9;16102:18;16094:6;16075:46;:::i;:::-;16169:9;16161:6;16157:22;16152:2;16141:9;16137:18;16130:50;16197:34;16224:6;16216;16197:34;:::i;:::-;16189:42;16021:216;-1:-1:-1;;;;;16021:216:1:o;16242:1270::-;;16709:3;16739:2;16728:9;16721:21;16765:46;16807:2;16796:9;16792:18;16784:6;16765:46;:::i;:::-;16751:60;;16859:9;16851:6;16847:22;16842:2;16831:9;16827:18;16820:50;16893:34;16920:6;16912;16893:34;:::i;:::-;16879:48;;16975:9;16967:6;16963:22;16958:2;16947:9;16943:18;16936:50;17009:34;17036:6;17028;17009:34;:::i;:::-;16995:48;;17091:9;17083:6;17079:22;17074:2;17063:9;17059:18;17052:50;17125:34;17152:6;17144;17125:34;:::i;:::-;17111:48;;17208:9;17200:6;17196:22;17190:3;17179:9;17175:19;17168:51;17236:34;17263:6;17255;17236:34;:::i;:::-;17301:3;17286:19;;17279:35;;;;-1:-1:-1;;17358:14:1;;17351:22;17345:3;17330:19;;17323:51;17405:3;17390:19;;17383:35;;;;17449:3;17434:19;;17427:35;17493:3;17478:19;;;17471:35;17228:42;16689:823;-1:-1:-1;;;;;16689:823:1:o;17517:456::-;;17742:2;17731:9;17724:21;17768:46;17810:2;17799:9;17795:18;17787:6;17768:46;:::i;:::-;17862:9;17854:6;17850:22;17845:2;17834:9;17830:18;17823:50;17890:34;17917:6;17909;17890:34;:::i;:::-;17882:42;;;17960:6;17955:2;17944:9;17940:18;17933:34;17714:259;;;;;;:::o;17978:1115::-;;18391:3;18421:2;18410:9;18403:21;18447:46;18489:2;18478:9;18474:18;18466:6;18447:46;:::i;:::-;18433:60;;18541:9;18533:6;18529:22;18524:2;18513:9;18509:18;18502:50;18575:34;18602:6;18594;18575:34;:::i;:::-;18561:48;;18645:6;18640:2;18629:9;18625:18;18618:34;18688:6;18683:2;18672:9;18668:18;18661:34;18746:6;18739:14;18732:22;18726:3;18715:9;18711:19;18704:51;18804:9;18796:6;18792:22;18786:3;18775:9;18771:19;18764:51;18838:34;18865:6;18857;18838:34;:::i;:::-;18824:48;;18909:6;18903:3;18892:9;18888:19;18881:35;18965:9;18957:6;18953:22;18947:3;18936:9;18932:19;18925:51;18993:34;19020:6;19012;18993:34;:::i;:::-;18985:42;;;19078:6;19071:14;19064:22;19058:3;19047:9;19043:19;19036:51;18371:722;;;;;;;;;;;;:::o;19098:398::-;19300:2;19282:21;;;19339:2;19319:18;;;19312:30;19378:34;19373:2;19358:18;;19351:62;-1:-1:-1;;;19444:2:1;19429:18;;19422:32;19486:3;19471:19;;19272:224::o;19501:414::-;19703:2;19685:21;;;19742:2;19722:18;;;19715:30;19781:34;19776:2;19761:18;;19754:62;-1:-1:-1;;;19847:2:1;19832:18;;19825:48;19905:3;19890:19;;19675:240::o;19920:402::-;20122:2;20104:21;;;20161:2;20141:18;;;20134:30;20200:34;20195:2;20180:18;;20173:62;-1:-1:-1;;;20266:2:1;20251:18;;20244:36;20312:3;20297:19;;20094:228::o;20327:352::-;20529:2;20511:21;;;20568:2;20548:18;;;20541:30;20607;20602:2;20587:18;;20580:58;20670:2;20655:18;;20501:178::o;20684:400::-;20886:2;20868:21;;;20925:2;20905:18;;;20898:30;20964:34;20959:2;20944:18;;20937:62;-1:-1:-1;;;21030:2:1;21015:18;;21008:34;21074:3;21059:19;;20858:226::o;21089:349::-;21291:2;21273:21;;;21330:2;21310:18;;;21303:30;21369:27;21364:2;21349:18;;21342:55;21429:2;21414:18;;21263:175::o;21850:408::-;22052:2;22034:21;;;22091:2;22071:18;;;22064:30;22130:34;22125:2;22110:18;;22103:62;-1:-1:-1;;;22196:2:1;22181:18;;22174:42;22248:3;22233:19;;22024:234::o;22263:420::-;22465:2;22447:21;;;22504:2;22484:18;;;22477:30;22543:34;22538:2;22523:18;;22516:62;22614:26;22609:2;22594:18;;22587:54;22673:3;22658:19;;22437:246::o;22688:406::-;22890:2;22872:21;;;22929:2;22909:18;;;22902:30;22968:34;22963:2;22948:18;;22941:62;-1:-1:-1;;;23034:2:1;23019:18;;23012:40;23084:3;23069:19;;22862:232::o;23099:398::-;23301:2;23283:21;;;23340:2;23320:18;;;23313:30;23379:34;23374:2;23359:18;;23352:62;-1:-1:-1;;;23445:2:1;23430:18;;23423:32;23487:3;23472:19;;23273:224::o;23502:356::-;23704:2;23686:21;;;23723:18;;;23716:30;23782:34;23777:2;23762:18;;23755:62;23849:2;23834:18;;23676:182::o;23863:345::-;24065:2;24047:21;;;24104:2;24084:18;;;24077:30;-1:-1:-1;;;24138:2:1;24123:18;;24116:51;24199:2;24184:18;;24037:171::o;24213:408::-;24415:2;24397:21;;;24454:2;24434:18;;;24427:30;24493:34;24488:2;24473:18;;24466:62;-1:-1:-1;;;24559:2:1;24544:18;;24537:42;24611:3;24596:19;;24387:234::o;24626:356::-;24828:2;24810:21;;;24847:18;;;24840:30;24906:34;24901:2;24886:18;;24879:62;24973:2;24958:18;;24800:182::o;24987:405::-;25189:2;25171:21;;;25228:2;25208:18;;;25201:30;25267:34;25262:2;25247:18;;25240:62;-1:-1:-1;;;25333:2:1;25318:18;;25311:39;25382:3;25367:19;;25161:231::o;25397:411::-;25599:2;25581:21;;;25638:2;25618:18;;;25611:30;25677:34;25672:2;25657:18;;25650:62;-1:-1:-1;;;25743:2:1;25728:18;;25721:45;25798:3;25783:19;;25571:237::o;25813:397::-;26015:2;25997:21;;;26054:2;26034:18;;;26027:30;26093:34;26088:2;26073:18;;26066:62;-1:-1:-1;;;26159:2:1;26144:18;;26137:31;26200:3;26185:19;;25987:223::o;26215:413::-;26417:2;26399:21;;;26456:2;26436:18;;;26429:30;26495:34;26490:2;26475:18;;26468:62;-1:-1:-1;;;26561:2:1;26546:18;;26539:47;26618:3;26603:19;;26389:239::o;26633:353::-;26835:2;26817:21;;;26874:2;26854:18;;;26847:30;26913:31;26908:2;26893:18;;26886:59;26977:2;26962:18;;26807:179::o;26991:177::-;27137:25;;;27125:2;27110:18;;27092:76::o;27173:427::-;27398:25;;;-1:-1:-1;;;;;27459:32:1;;;;27454:2;27439:18;;27432:60;27523:2;27508:18;;27501:34;27578:14;27571:22;27566:2;27551:18;;27544:50;27385:3;27370:19;;27352:248::o;27605:292::-;;27782:6;27771:9;27764:25;27825:2;27820;27809:9;27805:18;27798:30;27845:46;27887:2;27876:9;27872:18;27864:6;27845:46;:::i;27902:529::-;;28155:6;28144:9;28137:25;28198:3;28193:2;28182:9;28178:18;28171:31;28225:47;28267:3;28256:9;28252:19;28244:6;28225:47;:::i;:::-;28320:9;28312:6;28308:22;28303:2;28292:9;28288:18;28281:50;28348:34;28375:6;28367;28348:34;:::i;:::-;28340:42;;;28418:6;28413:2;28402:9;28398:18;28391:34;28127:304;;;;;;;:::o;28436:248::-;28610:25;;;28666:2;28651:18;;28644:34;28598:2;28583:18;;28565:119::o;28689:401::-;28914:25;;;28970:2;28955:18;;28948:34;;;;29013:2;28998:18;;28991:34;29068:14;29061:22;29056:2;29041:18;;29034:50;28901:3;28886:19;;28868:222::o;29095:242::-;29165:2;29159:9;29195:17;;;29242:18;29227:34;;29263:22;;;29224:62;29221:2;;;29289:9;29221:2;29316;29309:22;29139:198;;-1:-1:-1;29139:198:1:o;29342:183::-;;29441:18;29433:6;29430:30;29427:2;;;29463:9;29427:2;-1:-1:-1;29514:4:1;29495:17;;;29491:28;;29417:108::o;29530:258::-;29602:1;29612:113;29626:6;29623:1;29620:13;29612:113;;;29702:11;;;29696:18;29683:11;;;29676:39;29648:2;29641:10;29612:113;;;29743:6;29740:1;29737:13;29734:2;;;-1:-1:-1;;29778:1:1;29760:16;;29753:27;29583:205::o;29793:133::-;-1:-1:-1;;;;;29870:31:1;;29860:42;;29850:2;;29916:1;29913;29906:12;29931:133;-1:-1:-1;;;;;;30007:32:1;;29997:43;;29987:2;;30054:1;30051;30044:12

Swarm Source

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