ETH Price: $3,473.45 (+1.60%)
Gas: 10 Gwei

Token

BMF Skulls (BMF)
 

Overview

Max Total Supply

486 BMF

Holders

181

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 BMF
0xc761a7a1fe7bd916baa9e38e3a5a219bef93cb17
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BMFSkulls

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-12
*/

/**
 *Submitted for verification at Etherscan.io on 2021-08-10
*/

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

// SPDX-License-Identifier: MIT


// File: @openzeppelin/contracts/utils/Context.sol

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with 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;
    }
}

// File: @openzeppelin/contracts/introspection/IERC165.sol



pragma solidity >=0.6.0 <0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity >=0.6.2 <0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol



pragma solidity >=0.6.2 <0.8.0;


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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol



pragma solidity >=0.6.2 <0.8.0;


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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity >=0.6.0 <0.8.0;

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

// File: @openzeppelin/contracts/introspection/ERC165.sol



pragma solidity >=0.6.0 <0.8.0;


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

// File: @openzeppelin/contracts/math/SafeMath.sol



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, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

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

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

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

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

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        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) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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);
        return a / b;
    }

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

// File: @openzeppelin/contracts/utils/Address.sol



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.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

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

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

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

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

// File: @openzeppelin/contracts/utils/EnumerableSet.sol



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(uint160(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(uint160(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(uint160(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(uint160(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));
    }
}

// File: @openzeppelin/contracts/utils/EnumerableMap.sol



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 Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @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) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    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(uint160(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(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(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(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol



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--] = bytes1(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol



pragma solidity >=0.6.0 <0.8.0;

/**
 * @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 virtual 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 virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

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

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

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, 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 virtual returns (string memory) {
        return _baseURI;
    }

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual 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 virtual 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 = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

        _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(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner
        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);
    }

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

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

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity >=0.6.0 <0.8.0;

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


    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }


    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


pragma solidity ^0.7.0;
pragma abicoder v2;

contract BMFSkulls is ERC721, Ownable {

    using SafeMath for uint256;

    string public skull_PROVENANCE = ""; // IPFS URL WILL BE ADDED WHEN skullS ARE ALL SOLD OUT

    string public LICENSE_TEXT = ""; // IT IS WHAT IT SAYS

    bool licenseLocked = false; // TEAM CAN'T EDIT THE LICENSE AFTER THIS GETS TRUE

    uint256 public constant skullPrice = 30000000000000000; // 0.03 ETH

    uint public constant maxskullPurchase = 20;

    uint256 public constant MAX_skulls = 2000;

    bool public saleIsActive = false;

    mapping(uint => string) public skullNames;

    uint public skullReserve = 1050;

    event skullNameChange(address _by, uint _tokenId, string _name);

    event licenseisLocked(string _licenseText);

    constructor() ERC721("BMF Skulls", "BMF") { }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        msg.sender.transfer(balance);
    }

    function reserveskulls(address _to, uint256 _reserveAmount) public onlyOwner {
        uint supply = totalSupply();
        require(_reserveAmount > 0 && _reserveAmount <= skullReserve, "Not enough reserve left for team");
        for (uint i = 0; i < _reserveAmount; i++) {
            _safeMint(_to, supply + i);
        }
        skullReserve = skullReserve.sub(_reserveAmount);
    }


    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        skull_PROVENANCE = provenanceHash;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }


    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }


    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    // Returns the license for tokens
    function tokenLicense(uint _id) public view returns(string memory) {
        require(_id < totalSupply(), "CHOOSE A skull WITHIN RANGE");
        return LICENSE_TEXT;
    }

    // Locks the license to prevent further changes
    function lockLicense() public onlyOwner {
        licenseLocked =  true;
        emit licenseisLocked(LICENSE_TEXT);
    }

    function changeLicense(string memory _license) public onlyOwner {
        require(licenseLocked == false, "License already locked");
        LICENSE_TEXT = _license;
    }


    function mintBMFSkull(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint skull");
        require(numberOfTokens > 0 && numberOfTokens <= maxskullPurchase, "Can only mint 20 tokens at a time");
        require(totalSupply().add(numberOfTokens) <= MAX_skulls, "Purchase would exceed max supply of skulls");
        require(msg.value >= skullPrice.mul(numberOfTokens), "Ether value sent is not correct");

        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_skulls) {
                _safeMint(msg.sender, mintIndex);
            }
        }

    }

    function changeskullName(uint _tokenId, string memory _name) public {
        require(ownerOf(_tokenId) == msg.sender, "Hey, your wallet doesn't own this skull!");
        require(sha256(bytes(_name)) != sha256(bytes(skullNames[_tokenId])), "New name is same as the current one");
        skullNames[_tokenId] = _name;

        emit skullNameChange(msg.sender, _tokenId, _name);

    }

    function viewskullName(uint _tokenId) public view returns( string memory ){
        require( _tokenId < totalSupply(), "Choose a skull within range" );
        return skullNames[_tokenId];
    }


    function skullNamesOfOwner(address _owner) external view returns(string[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new string[](0);
        } else {
            string[] memory result = new string[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = skullNames[ tokenOfOwnerByIndex(_owner, index) ] ;
            }
            return result;
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"skullNameChange","type":"event"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_skulls","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"changeskullName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","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":"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":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxskullPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintBMFSkull","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveskulls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"skullNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"skullNamesOfOwner","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"skullPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"skullReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"skull_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewskullName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600b90805190602001906200002b92919062000335565b5060405180602001604052806000815250600c90805190602001906200005392919062000335565b506000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff02191690831515021790555061041a600f553480156200009d57600080fd5b506040518060400160405280600a81526020017f424d4620536b756c6c73000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f424d460000000000000000000000000000000000000000000000000000000000815250620001226301ffc9a760e01b6200025560201b60201c565b81600690805190602001906200013a92919062000335565b5080600790805190602001906200015392919062000335565b506200016c6380ac58cd60e01b6200025560201b60201c565b62000184635b5e139f60e01b6200025560201b60201c565b6200019c63780e9d6360e01b6200025560201b60201c565b50506000620001b06200032d60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000460565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b8906200042d565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200036d5760008555620003b9565b82601f106200038857805160ff1916838001178555620003b9565b82800160010185558215620003b9579182015b82811115620003b85782518255916020019190600101906200039b565b5b509050620003c89190620003cc565b5090565b5b80821115620003e7576000816000905550600101620003cd565b5090565b6000620003fa601c836200044f565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600060208201905081810360008301526200044881620003eb565b9050919050565b600082825260208201905092915050565b6153c380620004706000396000f3fe6080604052600436106102465760003560e01c8063715018a611610139578063b42f8e50116100b6578063d9b137b21161007a578063d9b137b21461086d578063e985e9c5146108aa578063eb8d2444146108e7578063f2fde38b14610912578063f8e19bc61461093b578063fc12dc361461097857610246565b8063b42f8e501461079a578063b88d4fde146107c5578063bf4702fc146107ee578063c87b56dd14610805578063c9c6bb9a1461084257610246565b80639c3e72bd116100fd5780639c3e72bd146106b7578063a22cb465146106e2578063aba8ef481461070b578063b03f4af814610734578063b09904b51461077157610246565b8063715018a6146105f15780638462151c146106085780638da5cb5b14610645578063940362961461067057806395d89b411461068c57610246565b80633edc1d88116101c757806355f804b31161018b57806355f804b3146104fa57806356933998146105235780636352211e1461054c5780636c0360eb1461058957806370a08231146105b457610246565b80633edc1d881461040157806342842e0e1461043e578063459b3300146104675780634a783b71146104925780634f6ccce7146104bd57610246565b806318160ddd1161020e57806318160ddd1461034257806323b872dd1461036d5780632f745c591461039657806334918dfd146103d35780633ccfd60b146103ea57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f05780631096952314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613ad8565b6109a3565b60405161027f9190614b9e565b60405180910390f35b34801561029457600080fd5b5061029d610a0a565b6040516102aa9190614bb9565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613b6b565b610aac565b6040516102e79190614ab5565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613a73565b610b31565b005b34801561032557600080fd5b50610340600480360381019061033b9190613b2a565b610c49565b005b34801561034e57600080fd5b50610357610cdf565b6040516103649190614ffd565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f919061396d565b610cf0565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190613a73565b610d50565b6040516103ca9190614ffd565b60405180910390f35b3480156103df57600080fd5b506103e8610dab565b005b3480156103f657600080fd5b506103ff610e53565b005b34801561040d57600080fd5b5061042860048036038101906104239190613908565b610f1e565b6040516104359190614b5a565b60405180910390f35b34801561044a57600080fd5b506104656004803603810190610460919061396d565b6110cb565b005b34801561047357600080fd5b5061047c6110eb565b6040516104899190614ffd565b60405180910390f35b34801561049e57600080fd5b506104a76110f1565b6040516104b49190614ffd565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df9190613b6b565b6110f7565b6040516104f19190614ffd565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c9190613b2a565b61111a565b005b34801561052f57600080fd5b5061054a60048036038101906105459190613a73565b6111a2565b005b34801561055857600080fd5b50610573600480360381019061056e9190613b6b565b6112c0565b6040516105809190614ab5565b60405180910390f35b34801561059557600080fd5b5061059e6112f7565b6040516105ab9190614bb9565b60405180910390f35b3480156105c057600080fd5b506105db60048036038101906105d69190613908565b611399565b6040516105e89190614ffd565b60405180910390f35b3480156105fd57600080fd5b50610606611458565b005b34801561061457600080fd5b5061062f600480360381019061062a9190613908565b611595565b60405161063c9190614b7c565b60405180910390f35b34801561065157600080fd5b5061065a61168e565b6040516106679190614ab5565b60405180910390f35b61068a60048036038101906106859190613b6b565b6116b8565b005b34801561069857600080fd5b506106a1611856565b6040516106ae9190614bb9565b60405180910390f35b3480156106c357600080fd5b506106cc6118f8565b6040516106d99190614bb9565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613a37565b611996565b005b34801561071757600080fd5b50610732600480360381019061072d9190613b94565b611b17565b005b34801561074057600080fd5b5061075b60048036038101906107569190613b6b565b611ce7565b6040516107689190614bb9565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190613b2a565b611de5565b005b3480156107a657600080fd5b506107af611ed1565b6040516107bc9190614ffd565b60405180910390f35b3480156107d157600080fd5b506107ec60048036038101906107e791906139bc565b611ed6565b005b3480156107fa57600080fd5b50610803611f38565b005b34801561081157600080fd5b5061082c60048036038101906108279190613b6b565b612009565b6040516108399190614bb9565b60405180910390f35b34801561084e57600080fd5b5061085761218c565b6040516108649190614bb9565b60405180910390f35b34801561087957600080fd5b50610894600480360381019061088f9190613b6b565b61222a565b6040516108a19190614bb9565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc9190613931565b612317565b6040516108de9190614b9e565b60405180910390f35b3480156108f357600080fd5b506108fc6123ab565b6040516109099190614b9e565b60405180910390f35b34801561091e57600080fd5b5061093960048036038101906109349190613908565b6123be565b005b34801561094757600080fd5b50610962600480360381019061095d9190613b6b565b61256a565b60405161096f9190614bb9565b60405180910390f35b34801561098457600080fd5b5061098d61261a565b60405161099a9190614ffd565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610aa25780601f10610a7757610100808354040283529160200191610aa2565b820191906000526020600020905b815481529060010190602001808311610a8557829003601f168201915b5050505050905090565b6000610ab782612625565b610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed90614edd565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3c826112c0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490614f7d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bcc612642565b73ffffffffffffffffffffffffffffffffffffffff161480610bfb5750610bfa81610bf5612642565b612317565b5b610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3190614ddd565b60405180910390fd5b610c44838361264a565b505050565b610c51612642565b73ffffffffffffffffffffffffffffffffffffffff16610c6f61168e565b73ffffffffffffffffffffffffffffffffffffffff1614610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc90614efd565b60405180910390fd5b80600b9080519060200190610cdb92919061370f565b5050565b6000610ceb6002612703565b905090565b610d01610cfb612642565b82612718565b610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3790614fbd565b60405180910390fd5b610d4b8383836127f6565b505050565b6000610da382600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a0d90919063ffffffff16565b905092915050565b610db3612642565b73ffffffffffffffffffffffffffffffffffffffff16610dd161168e565b73ffffffffffffffffffffffffffffffffffffffff1614610e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e90614efd565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b610e5b612642565b73ffffffffffffffffffffffffffffffffffffffff16610e7961168e565b73ffffffffffffffffffffffffffffffffffffffff1614610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec690614efd565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f1a573d6000803e3d6000fd5b5050565b60606000610f2b83611399565b90506000811415610f8b57600067ffffffffffffffff81118015610f4e57600080fd5b50604051908082528060200260200182016040528015610f8257816020015b6060815260200190600190039081610f6d5790505b509150506110c6565b60008167ffffffffffffffff81118015610fa457600080fd5b50604051908082528060200260200182016040528015610fd857816020015b6060815260200190600190039081610fc35790505b50905060005b828110156110bf57600e6000610ff48784610d50565b81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110965780601f1061106b57610100808354040283529160200191611096565b820191906000526020600020905b81548152906001019060200180831161107957829003601f168201915b50505050508282815181106110a757fe5b60200260200101819052508080600101915050610fde565b8193505050505b919050565b6110e683838360405180602001604052806000815250611ed6565b505050565b6107d081565b600f5481565b60008061110e836002612a2790919063ffffffff16565b50905080915050919050565b611122612642565b73ffffffffffffffffffffffffffffffffffffffff1661114061168e565b73ffffffffffffffffffffffffffffffffffffffff1614611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90614efd565b60405180910390fd5b61119f81612a53565b50565b6111aa612642565b73ffffffffffffffffffffffffffffffffffffffff166111c861168e565b73ffffffffffffffffffffffffffffffffffffffff161461121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590614efd565b60405180910390fd5b6000611228610cdf565b905060008211801561123c5750600f548211155b61127b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127290614cbd565b60405180910390fd5b60005b8281101561129f5761129284828401612a6d565b808060010191505061127e565b506112b582600f54612a8b90919063ffffffff16565b600f81905550505050565b60006112f082604051806060016040528060298152602001615365602991396002612adb9092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561138f5780601f106113645761010080835404028352916020019161138f565b820191906000526020600020905b81548152906001019060200180831161137257829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140190614dfd565b60405180910390fd5b611451600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612afa565b9050919050565b611460612642565b73ffffffffffffffffffffffffffffffffffffffff1661147e61168e565b73ffffffffffffffffffffffffffffffffffffffff16146114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb90614efd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b606060006115a283611399565b905060008114156115fd57600067ffffffffffffffff811180156115c557600080fd5b506040519080825280602002602001820160405280156115f45781602001602082028036833780820191505090505b50915050611689565b60008167ffffffffffffffff8111801561161657600080fd5b506040519080825280602002602001820160405280156116455781602001602082028036833780820191505090505b50905060005b828110156116825761165d8582610d50565b82828151811061166957fe5b602002602001018181525050808060010191505061164b565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60019054906101000a900460ff16611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90614dbd565b60405180910390fd5b600081118015611718575060148111155b611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e90614d9d565b60405180910390fd5b6107d061177482611766610cdf565b612b0f90919063ffffffff16565b11156117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac90614e3d565b60405180910390fd5b6117cf81666a94d74f430000612b6490919063ffffffff16565b341015611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890614d1d565b60405180910390fd5b60005b81811015611852576000611826610cdf565b90506107d0611833610cdf565b1015611844576118433382612a6d565b5b508080600101915050611814565b5050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118ee5780601f106118c3576101008083540402835291602001916118ee565b820191906000526020600020905b8154815290600101906020018083116118d157829003601f168201915b5050505050905090565b600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561198e5780601f106119635761010080835404028352916020019161198e565b820191906000526020600020905b81548152906001019060200180831161197157829003601f168201915b505050505081565b61199e612642565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0390614cfd565b60405180910390fd5b8060056000611a19612642565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ac6612642565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b0b9190614b9e565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16611b37836112c0565b73ffffffffffffffffffffffffffffffffffffffff1614611b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8490614c1d565b60405180910390fd5b6002600e6000848152602001908152602001600020604051611baf9190614a7a565b602060405180830381855afa158015611bcc573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611bef9190613aaf565b600282604051611bff9190614a63565b602060405180830381855afa158015611c1c573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611c3f9190613aaf565b1415611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7790614f5d565b60405180910390fd5b80600e60008481526020019081526020016000209080519060200190611ca792919061370f565b507f49a88ebf72dbd7afabd782da32f27d0caffe8b6b2bf27f3e2e32d7564e8e0f3e338383604051611cdb93929190614b1c565b60405180910390a15050565b6060611cf1610cdf565b8210611d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2990614e1d565b60405180910390fd5b600e60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611dd95780601f10611dae57610100808354040283529160200191611dd9565b820191906000526020600020905b815481529060010190602001808311611dbc57829003601f168201915b50505050509050919050565b611ded612642565b73ffffffffffffffffffffffffffffffffffffffff16611e0b61168e565b73ffffffffffffffffffffffffffffffffffffffff1614611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5890614efd565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514611eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eae90614f9d565b60405180910390fd5b80600c9080519060200190611ecd92919061370f565b5050565b601481565b611ee7611ee1612642565b83612718565b611f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1d90614fbd565b60405180910390fd5b611f3284848484612bd4565b50505050565b611f40612642565b73ffffffffffffffffffffffffffffffffffffffff16611f5e61168e565b73ffffffffffffffffffffffffffffffffffffffff1614611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab90614efd565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600c604051611fff9190614bdb565b60405180910390a1565b606061201482612625565b612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a90614f3d565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120fc5780601f106120d1576101008083540402835291602001916120fc565b820191906000526020600020905b8154815290600101906020018083116120df57829003601f168201915b50505050509050600061210d6112f7565b9050600081511415612123578192505050612187565b600082511115612158578082604051602001612140929190614a91565b60405160208183030381529060405292505050612187565b8061216285612c30565b604051602001612173929190614a91565b604051602081830303815290604052925050505b919050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122225780601f106121f757610100808354040283529160200191612222565b820191906000526020600020905b81548152906001019060200180831161220557829003601f168201915b505050505081565b6060612234610cdf565b8210612275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226c90614e9d565b60405180910390fd5b600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561230b5780601f106122e05761010080835404028352916020019161230b565b820191906000526020600020905b8154815290600101906020018083116122ee57829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60019054906101000a900460ff1681565b6123c6612642565b73ffffffffffffffffffffffffffffffffffffffff166123e461168e565b73ffffffffffffffffffffffffffffffffffffffff161461243a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243190614efd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a190614c5d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126125780601f106125e757610100808354040283529160200191612612565b820191906000526020600020905b8154815290600101906020018083116125f557829003601f168201915b505050505081565b666a94d74f43000081565b600061263b826002612d7790919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126bd836112c0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061271182600001612d91565b9050919050565b600061272382612625565b612762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275990614d7d565b60405180910390fd5b600061276d836112c0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127dc57508373ffffffffffffffffffffffffffffffffffffffff166127c484610aac565b73ffffffffffffffffffffffffffffffffffffffff16145b806127ed57506127ec8185612317565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612816826112c0565b73ffffffffffffffffffffffffffffffffffffffff161461286c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286390614f1d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d390614cdd565b60405180910390fd5b6128e7838383612da2565b6128f260008261264a565b61294381600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612da790919063ffffffff16565b5061299581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612dc190919063ffffffff16565b506129ac81836002612ddb9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612a1c8360000183612e10565b60001c905092915050565b600080600080612a3a8660000186612e7d565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612a6992919061370f565b5050565b612a87828260405180602001604052806000815250612f00565b5050565b600082821115612ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac790614d3d565b60405180910390fd5b818303905092915050565b6000612aee846000018460001b84612f5b565b60001c90509392505050565b6000612b0882600001612fec565b9050919050565b600080828401905083811015612b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5190614c9d565b60405180910390fd5b8091505092915050565b600080831415612b775760009050612bce565b6000828402905082848281612b8857fe5b0414612bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc090614ebd565b60405180910390fd5b809150505b92915050565b612bdf8484846127f6565b612beb84848484612ffd565b612c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2190614c3d565b60405180910390fd5b50505050565b60606000821415612c78576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d72565b600082905060005b60008214612ca2578080600101915050600a8281612c9a57fe5b049150612c80565b60008167ffffffffffffffff81118015612cbb57600080fd5b506040519080825280601f01601f191660200182016040528015612cee5781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612d6a57600a8481612d0f57fe5b0660300160f81b82828060019003935081518110612d2957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612d6257fe5b049350612cfd565b819450505050505b919050565b6000612d89836000018360001b613161565b905092915050565b600081600001805490509050919050565b505050565b6000612db9836000018360001b613184565b905092915050565b6000612dd3836000018360001b61326c565b905092915050565b6000612e07846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6132dc565b90509392505050565b600081836000018054905011612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5290614bfd565b60405180910390fd5b826000018281548110612e6a57fe5b9060005260206000200154905092915050565b60008082846000018054905011612ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec090614e5d565b60405180910390fd5b6000846000018481548110612eda57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b612f0a83836133b8565b612f176000848484612ffd565b612f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4d90614c3d565b60405180910390fd5b505050565b60008084600101600085815260200190815260200160002054905060008114158390612fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb49190614bb9565b60405180910390fd5b50846000016001820381548110612fd057fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b600061301e8473ffffffffffffffffffffffffffffffffffffffff16613546565b61302b5760019050613159565b60006130f263150b7a0260e01b613040612642565b8887876040516024016130569493929190614ad0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615333603291398773ffffffffffffffffffffffffffffffffffffffff166135599092919063ffffffff16565b905060008180602001905181019061310a9190613b01565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461326057600060018203905060006001866000018054905003905060008660000182815481106131cf57fe5b90600052602060002001549050808760000184815481106131ec57fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061322457fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613266565b60009150505b92915050565b60006132788383613571565b6132d15782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506132d6565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415613383578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506133b1565b8285600001600183038154811061339657fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341f90614e7d565b60405180910390fd5b61343181612625565b15613471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346890614c7d565b60405180910390fd5b61347d60008383612da2565b6134ce81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612dc190919063ffffffff16565b506134e581836002612ddb9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606135688484600085613594565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156135d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d090614d5d565b60405180910390fd5b6135e285613546565b613621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361890614fdd565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161364a9190614a63565b60006040518083038185875af1925050503d8060008114613687576040519150601f19603f3d011682016040523d82523d6000602084013e61368c565b606091505b509150915061369c8282866136a8565b92505050949350505050565b606083156136b857829050613708565b6000835111156136cb5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ff9190614bb9565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613745576000855561378c565b82601f1061375e57805160ff191683800117855561378c565b8280016001018555821561378c579182015b8281111561378b578251825591602001919060010190613770565b5b509050613799919061379d565b5090565b5b808211156137b657600081600090555060010161379e565b5090565b60006137cd6137c884615049565b615018565b9050828152602081018484840111156137e557600080fd5b6137f084828561526a565b509392505050565b600061380b61380684615079565b615018565b90508281526020810184848401111561382357600080fd5b61382e84828561526a565b509392505050565b600081359050613845816152bf565b92915050565b60008135905061385a816152d6565b92915050565b60008151905061386f816152ed565b92915050565b60008135905061388481615304565b92915050565b60008151905061389981615304565b92915050565b600082601f8301126138b057600080fd5b81356138c08482602086016137ba565b91505092915050565b600082601f8301126138da57600080fd5b81356138ea8482602086016137f8565b91505092915050565b6000813590506139028161531b565b92915050565b60006020828403121561391a57600080fd5b600061392884828501613836565b91505092915050565b6000806040838503121561394457600080fd5b600061395285828601613836565b925050602061396385828601613836565b9150509250929050565b60008060006060848603121561398257600080fd5b600061399086828701613836565b93505060206139a186828701613836565b92505060406139b2868287016138f3565b9150509250925092565b600080600080608085870312156139d257600080fd5b60006139e087828801613836565b94505060206139f187828801613836565b9350506040613a02878288016138f3565b925050606085013567ffffffffffffffff811115613a1f57600080fd5b613a2b8782880161389f565b91505092959194509250565b60008060408385031215613a4a57600080fd5b6000613a5885828601613836565b9250506020613a698582860161384b565b9150509250929050565b60008060408385031215613a8657600080fd5b6000613a9485828601613836565b9250506020613aa5858286016138f3565b9150509250929050565b600060208284031215613ac157600080fd5b6000613acf84828501613860565b91505092915050565b600060208284031215613aea57600080fd5b6000613af884828501613875565b91505092915050565b600060208284031215613b1357600080fd5b6000613b218482850161388a565b91505092915050565b600060208284031215613b3c57600080fd5b600082013567ffffffffffffffff811115613b5657600080fd5b613b62848285016138c9565b91505092915050565b600060208284031215613b7d57600080fd5b6000613b8b848285016138f3565b91505092915050565b60008060408385031215613ba757600080fd5b6000613bb5858286016138f3565b925050602083013567ffffffffffffffff811115613bd257600080fd5b613bde858286016138c9565b9150509250929050565b6000613bf48383613e1b565b905092915050565b6000613c088383614a45565b60208301905092915050565b613c1d81615234565b82525050565b613c2c816151b6565b82525050565b613c3b816151a4565b82525050565b6000613c4c826150f3565b613c568185615139565b935083602082028501613c68856150a9565b8060005b85811015613ca45784840389528151613c858582613be8565b9450613c908361511f565b925060208a01995050600181019050613c6c565b50829750879550505050505092915050565b6000613cc1826150fe565b613ccb818561514a565b9350613cd6836150b9565b8060005b83811015613d07578151613cee8882613bfc565b9750613cf98361512c565b925050600181019050613cda565b5085935050505092915050565b613d1d816151c8565b82525050565b6000613d2e82615109565b613d38818561515b565b9350613d48818560208601615279565b613d51816152ae565b840191505092915050565b6000613d6782615109565b613d71818561516c565b9350613d81818560208601615279565b80840191505092915050565b600081546001811660008114613daa5760018114613dcf57613e13565b607f6002830416613dbb818761516c565b955060ff1983168652808601935050613e13565b60028204613ddd818761516c565b9550613de8856150c9565b60005b82811015613e0a57815481890152600182019150602081019050613deb565b82880195505050505b505092915050565b6000613e2682615114565b613e308185615177565b9350613e40818560208601615279565b613e49816152ae565b840191505092915050565b6000613e5f82615114565b613e698185615188565b9350613e79818560208601615279565b613e82816152ae565b840191505092915050565b6000613e9882615114565b613ea28185615199565b9350613eb2818560208601615279565b80840191505092915050565b600081546001811660008114613edb5760018114613f0157613f45565b607f6002830416613eec8187615188565b955060ff198316865260208601935050613f45565b60028204613f0f8187615188565b9550613f1a856150de565b60005b82811015613f3c57815481890152600182019150602081019050613f1d565b80880195505050505b505092915050565b6000613f5a602283615188565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fc0602883615188565b91507f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008301527f7320736b756c6c210000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614026603283615188565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061408c602683615188565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140f2601c83615188565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614132601b83615188565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614172602083615188565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b60006141b2602483615188565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614218601983615188565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614258601f83615188565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614298601e83615188565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b60006142d8602683615188565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061433e602c83615188565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006143a4602183615188565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061440a602183615188565b91507f53616c65206d7573742062652061637469766520746f206d696e7420736b756c60008301527f6c000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614470603883615188565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006144d6602a83615188565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061453c601b83615188565b91507f43686f6f7365206120736b756c6c2077697468696e2072616e676500000000006000830152602082019050919050565b600061457c602a83615188565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620736b756c6c73000000000000000000000000000000000000000000006020830152604082019050919050565b60006145e2602283615188565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614648602083615188565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614688601b83615188565b91507f43484f4f5345204120736b756c6c2057495448494e2052414e474500000000006000830152602082019050919050565b60006146c8602183615188565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061472e602c83615188565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614794602083615188565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006147d4602983615188565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061483a602f83615188565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006148a0602383615188565b91507f4e6577206e616d652069732073616d65206173207468652063757272656e742060008301527f6f6e6500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614906602183615188565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061496c601683615188565b91507f4c6963656e736520616c7265616479206c6f636b6564000000000000000000006000830152602082019050919050565b60006149ac603183615188565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614a12601d83615188565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b614a4e8161522a565b82525050565b614a5d8161522a565b82525050565b6000614a6f8284613d5c565b915081905092915050565b6000614a868284613d8d565b915081905092915050565b6000614a9d8285613e8d565b9150614aa98284613e8d565b91508190509392505050565b6000602082019050614aca6000830184613c32565b92915050565b6000608082019050614ae56000830187613c23565b614af26020830186613c32565b614aff6040830185614a54565b8181036060830152614b118184613d23565b905095945050505050565b6000606082019050614b316000830186613c14565b614b3e6020830185614a54565b8181036040830152614b508184613e54565b9050949350505050565b60006020820190508181036000830152614b748184613c41565b905092915050565b60006020820190508181036000830152614b968184613cb6565b905092915050565b6000602082019050614bb36000830184613d14565b92915050565b60006020820190508181036000830152614bd38184613e54565b905092915050565b60006020820190508181036000830152614bf58184613ebe565b905092915050565b60006020820190508181036000830152614c1681613f4d565b9050919050565b60006020820190508181036000830152614c3681613fb3565b9050919050565b60006020820190508181036000830152614c5681614019565b9050919050565b60006020820190508181036000830152614c768161407f565b9050919050565b60006020820190508181036000830152614c96816140e5565b9050919050565b60006020820190508181036000830152614cb681614125565b9050919050565b60006020820190508181036000830152614cd681614165565b9050919050565b60006020820190508181036000830152614cf6816141a5565b9050919050565b60006020820190508181036000830152614d168161420b565b9050919050565b60006020820190508181036000830152614d368161424b565b9050919050565b60006020820190508181036000830152614d568161428b565b9050919050565b60006020820190508181036000830152614d76816142cb565b9050919050565b60006020820190508181036000830152614d9681614331565b9050919050565b60006020820190508181036000830152614db681614397565b9050919050565b60006020820190508181036000830152614dd6816143fd565b9050919050565b60006020820190508181036000830152614df681614463565b9050919050565b60006020820190508181036000830152614e16816144c9565b9050919050565b60006020820190508181036000830152614e368161452f565b9050919050565b60006020820190508181036000830152614e568161456f565b9050919050565b60006020820190508181036000830152614e76816145d5565b9050919050565b60006020820190508181036000830152614e968161463b565b9050919050565b60006020820190508181036000830152614eb68161467b565b9050919050565b60006020820190508181036000830152614ed6816146bb565b9050919050565b60006020820190508181036000830152614ef681614721565b9050919050565b60006020820190508181036000830152614f1681614787565b9050919050565b60006020820190508181036000830152614f36816147c7565b9050919050565b60006020820190508181036000830152614f568161482d565b9050919050565b60006020820190508181036000830152614f7681614893565b9050919050565b60006020820190508181036000830152614f96816148f9565b9050919050565b60006020820190508181036000830152614fb68161495f565b9050919050565b60006020820190508181036000830152614fd68161499f565b9050919050565b60006020820190508181036000830152614ff681614a05565b9050919050565b60006020820190506150126000830184614a54565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561503f5761503e6152ac565b5b8060405250919050565b600067ffffffffffffffff821115615064576150636152ac565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115615094576150936152ac565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006151af8261520a565b9050919050565b60006151c18261520a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061523f82615246565b9050919050565b600061525182615258565b9050919050565b60006152638261520a565b9050919050565b82818337600083830152505050565b60005b8381101561529757808201518184015260208101905061527c565b838111156152a6576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b6152c8816151a4565b81146152d357600080fd5b50565b6152df816151c8565b81146152ea57600080fd5b50565b6152f6816151d4565b811461530157600080fd5b50565b61530d816151de565b811461531857600080fd5b50565b6153248161522a565b811461532f57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122076c37de5db1b48505cd52ca0840605e3fa7e254170f03eba42bc377656e0485664736f6c63430007060033

Deployed Bytecode

0x6080604052600436106102465760003560e01c8063715018a611610139578063b42f8e50116100b6578063d9b137b21161007a578063d9b137b21461086d578063e985e9c5146108aa578063eb8d2444146108e7578063f2fde38b14610912578063f8e19bc61461093b578063fc12dc361461097857610246565b8063b42f8e501461079a578063b88d4fde146107c5578063bf4702fc146107ee578063c87b56dd14610805578063c9c6bb9a1461084257610246565b80639c3e72bd116100fd5780639c3e72bd146106b7578063a22cb465146106e2578063aba8ef481461070b578063b03f4af814610734578063b09904b51461077157610246565b8063715018a6146105f15780638462151c146106085780638da5cb5b14610645578063940362961461067057806395d89b411461068c57610246565b80633edc1d88116101c757806355f804b31161018b57806355f804b3146104fa57806356933998146105235780636352211e1461054c5780636c0360eb1461058957806370a08231146105b457610246565b80633edc1d881461040157806342842e0e1461043e578063459b3300146104675780634a783b71146104925780634f6ccce7146104bd57610246565b806318160ddd1161020e57806318160ddd1461034257806323b872dd1461036d5780632f745c591461039657806334918dfd146103d35780633ccfd60b146103ea57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f05780631096952314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613ad8565b6109a3565b60405161027f9190614b9e565b60405180910390f35b34801561029457600080fd5b5061029d610a0a565b6040516102aa9190614bb9565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613b6b565b610aac565b6040516102e79190614ab5565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613a73565b610b31565b005b34801561032557600080fd5b50610340600480360381019061033b9190613b2a565b610c49565b005b34801561034e57600080fd5b50610357610cdf565b6040516103649190614ffd565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f919061396d565b610cf0565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190613a73565b610d50565b6040516103ca9190614ffd565b60405180910390f35b3480156103df57600080fd5b506103e8610dab565b005b3480156103f657600080fd5b506103ff610e53565b005b34801561040d57600080fd5b5061042860048036038101906104239190613908565b610f1e565b6040516104359190614b5a565b60405180910390f35b34801561044a57600080fd5b506104656004803603810190610460919061396d565b6110cb565b005b34801561047357600080fd5b5061047c6110eb565b6040516104899190614ffd565b60405180910390f35b34801561049e57600080fd5b506104a76110f1565b6040516104b49190614ffd565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df9190613b6b565b6110f7565b6040516104f19190614ffd565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c9190613b2a565b61111a565b005b34801561052f57600080fd5b5061054a60048036038101906105459190613a73565b6111a2565b005b34801561055857600080fd5b50610573600480360381019061056e9190613b6b565b6112c0565b6040516105809190614ab5565b60405180910390f35b34801561059557600080fd5b5061059e6112f7565b6040516105ab9190614bb9565b60405180910390f35b3480156105c057600080fd5b506105db60048036038101906105d69190613908565b611399565b6040516105e89190614ffd565b60405180910390f35b3480156105fd57600080fd5b50610606611458565b005b34801561061457600080fd5b5061062f600480360381019061062a9190613908565b611595565b60405161063c9190614b7c565b60405180910390f35b34801561065157600080fd5b5061065a61168e565b6040516106679190614ab5565b60405180910390f35b61068a60048036038101906106859190613b6b565b6116b8565b005b34801561069857600080fd5b506106a1611856565b6040516106ae9190614bb9565b60405180910390f35b3480156106c357600080fd5b506106cc6118f8565b6040516106d99190614bb9565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613a37565b611996565b005b34801561071757600080fd5b50610732600480360381019061072d9190613b94565b611b17565b005b34801561074057600080fd5b5061075b60048036038101906107569190613b6b565b611ce7565b6040516107689190614bb9565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190613b2a565b611de5565b005b3480156107a657600080fd5b506107af611ed1565b6040516107bc9190614ffd565b60405180910390f35b3480156107d157600080fd5b506107ec60048036038101906107e791906139bc565b611ed6565b005b3480156107fa57600080fd5b50610803611f38565b005b34801561081157600080fd5b5061082c60048036038101906108279190613b6b565b612009565b6040516108399190614bb9565b60405180910390f35b34801561084e57600080fd5b5061085761218c565b6040516108649190614bb9565b60405180910390f35b34801561087957600080fd5b50610894600480360381019061088f9190613b6b565b61222a565b6040516108a19190614bb9565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc9190613931565b612317565b6040516108de9190614b9e565b60405180910390f35b3480156108f357600080fd5b506108fc6123ab565b6040516109099190614b9e565b60405180910390f35b34801561091e57600080fd5b5061093960048036038101906109349190613908565b6123be565b005b34801561094757600080fd5b50610962600480360381019061095d9190613b6b565b61256a565b60405161096f9190614bb9565b60405180910390f35b34801561098457600080fd5b5061098d61261a565b60405161099a9190614ffd565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610aa25780601f10610a7757610100808354040283529160200191610aa2565b820191906000526020600020905b815481529060010190602001808311610a8557829003601f168201915b5050505050905090565b6000610ab782612625565b610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed90614edd565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3c826112c0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490614f7d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bcc612642565b73ffffffffffffffffffffffffffffffffffffffff161480610bfb5750610bfa81610bf5612642565b612317565b5b610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3190614ddd565b60405180910390fd5b610c44838361264a565b505050565b610c51612642565b73ffffffffffffffffffffffffffffffffffffffff16610c6f61168e565b73ffffffffffffffffffffffffffffffffffffffff1614610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc90614efd565b60405180910390fd5b80600b9080519060200190610cdb92919061370f565b5050565b6000610ceb6002612703565b905090565b610d01610cfb612642565b82612718565b610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3790614fbd565b60405180910390fd5b610d4b8383836127f6565b505050565b6000610da382600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a0d90919063ffffffff16565b905092915050565b610db3612642565b73ffffffffffffffffffffffffffffffffffffffff16610dd161168e565b73ffffffffffffffffffffffffffffffffffffffff1614610e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e90614efd565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b610e5b612642565b73ffffffffffffffffffffffffffffffffffffffff16610e7961168e565b73ffffffffffffffffffffffffffffffffffffffff1614610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec690614efd565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f1a573d6000803e3d6000fd5b5050565b60606000610f2b83611399565b90506000811415610f8b57600067ffffffffffffffff81118015610f4e57600080fd5b50604051908082528060200260200182016040528015610f8257816020015b6060815260200190600190039081610f6d5790505b509150506110c6565b60008167ffffffffffffffff81118015610fa457600080fd5b50604051908082528060200260200182016040528015610fd857816020015b6060815260200190600190039081610fc35790505b50905060005b828110156110bf57600e6000610ff48784610d50565b81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110965780601f1061106b57610100808354040283529160200191611096565b820191906000526020600020905b81548152906001019060200180831161107957829003601f168201915b50505050508282815181106110a757fe5b60200260200101819052508080600101915050610fde565b8193505050505b919050565b6110e683838360405180602001604052806000815250611ed6565b505050565b6107d081565b600f5481565b60008061110e836002612a2790919063ffffffff16565b50905080915050919050565b611122612642565b73ffffffffffffffffffffffffffffffffffffffff1661114061168e565b73ffffffffffffffffffffffffffffffffffffffff1614611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90614efd565b60405180910390fd5b61119f81612a53565b50565b6111aa612642565b73ffffffffffffffffffffffffffffffffffffffff166111c861168e565b73ffffffffffffffffffffffffffffffffffffffff161461121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590614efd565b60405180910390fd5b6000611228610cdf565b905060008211801561123c5750600f548211155b61127b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127290614cbd565b60405180910390fd5b60005b8281101561129f5761129284828401612a6d565b808060010191505061127e565b506112b582600f54612a8b90919063ffffffff16565b600f81905550505050565b60006112f082604051806060016040528060298152602001615365602991396002612adb9092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561138f5780601f106113645761010080835404028352916020019161138f565b820191906000526020600020905b81548152906001019060200180831161137257829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140190614dfd565b60405180910390fd5b611451600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612afa565b9050919050565b611460612642565b73ffffffffffffffffffffffffffffffffffffffff1661147e61168e565b73ffffffffffffffffffffffffffffffffffffffff16146114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb90614efd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b606060006115a283611399565b905060008114156115fd57600067ffffffffffffffff811180156115c557600080fd5b506040519080825280602002602001820160405280156115f45781602001602082028036833780820191505090505b50915050611689565b60008167ffffffffffffffff8111801561161657600080fd5b506040519080825280602002602001820160405280156116455781602001602082028036833780820191505090505b50905060005b828110156116825761165d8582610d50565b82828151811061166957fe5b602002602001018181525050808060010191505061164b565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60019054906101000a900460ff16611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90614dbd565b60405180910390fd5b600081118015611718575060148111155b611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e90614d9d565b60405180910390fd5b6107d061177482611766610cdf565b612b0f90919063ffffffff16565b11156117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac90614e3d565b60405180910390fd5b6117cf81666a94d74f430000612b6490919063ffffffff16565b341015611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890614d1d565b60405180910390fd5b60005b81811015611852576000611826610cdf565b90506107d0611833610cdf565b1015611844576118433382612a6d565b5b508080600101915050611814565b5050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118ee5780601f106118c3576101008083540402835291602001916118ee565b820191906000526020600020905b8154815290600101906020018083116118d157829003601f168201915b5050505050905090565b600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561198e5780601f106119635761010080835404028352916020019161198e565b820191906000526020600020905b81548152906001019060200180831161197157829003601f168201915b505050505081565b61199e612642565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0390614cfd565b60405180910390fd5b8060056000611a19612642565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ac6612642565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b0b9190614b9e565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16611b37836112c0565b73ffffffffffffffffffffffffffffffffffffffff1614611b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8490614c1d565b60405180910390fd5b6002600e6000848152602001908152602001600020604051611baf9190614a7a565b602060405180830381855afa158015611bcc573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611bef9190613aaf565b600282604051611bff9190614a63565b602060405180830381855afa158015611c1c573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611c3f9190613aaf565b1415611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7790614f5d565b60405180910390fd5b80600e60008481526020019081526020016000209080519060200190611ca792919061370f565b507f49a88ebf72dbd7afabd782da32f27d0caffe8b6b2bf27f3e2e32d7564e8e0f3e338383604051611cdb93929190614b1c565b60405180910390a15050565b6060611cf1610cdf565b8210611d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2990614e1d565b60405180910390fd5b600e60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611dd95780601f10611dae57610100808354040283529160200191611dd9565b820191906000526020600020905b815481529060010190602001808311611dbc57829003601f168201915b50505050509050919050565b611ded612642565b73ffffffffffffffffffffffffffffffffffffffff16611e0b61168e565b73ffffffffffffffffffffffffffffffffffffffff1614611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5890614efd565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514611eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eae90614f9d565b60405180910390fd5b80600c9080519060200190611ecd92919061370f565b5050565b601481565b611ee7611ee1612642565b83612718565b611f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1d90614fbd565b60405180910390fd5b611f3284848484612bd4565b50505050565b611f40612642565b73ffffffffffffffffffffffffffffffffffffffff16611f5e61168e565b73ffffffffffffffffffffffffffffffffffffffff1614611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab90614efd565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600c604051611fff9190614bdb565b60405180910390a1565b606061201482612625565b612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a90614f3d565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120fc5780601f106120d1576101008083540402835291602001916120fc565b820191906000526020600020905b8154815290600101906020018083116120df57829003601f168201915b50505050509050600061210d6112f7565b9050600081511415612123578192505050612187565b600082511115612158578082604051602001612140929190614a91565b60405160208183030381529060405292505050612187565b8061216285612c30565b604051602001612173929190614a91565b604051602081830303815290604052925050505b919050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122225780601f106121f757610100808354040283529160200191612222565b820191906000526020600020905b81548152906001019060200180831161220557829003601f168201915b505050505081565b6060612234610cdf565b8210612275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226c90614e9d565b60405180910390fd5b600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561230b5780601f106122e05761010080835404028352916020019161230b565b820191906000526020600020905b8154815290600101906020018083116122ee57829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60019054906101000a900460ff1681565b6123c6612642565b73ffffffffffffffffffffffffffffffffffffffff166123e461168e565b73ffffffffffffffffffffffffffffffffffffffff161461243a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243190614efd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a190614c5d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126125780601f106125e757610100808354040283529160200191612612565b820191906000526020600020905b8154815290600101906020018083116125f557829003601f168201915b505050505081565b666a94d74f43000081565b600061263b826002612d7790919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126bd836112c0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061271182600001612d91565b9050919050565b600061272382612625565b612762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275990614d7d565b60405180910390fd5b600061276d836112c0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127dc57508373ffffffffffffffffffffffffffffffffffffffff166127c484610aac565b73ffffffffffffffffffffffffffffffffffffffff16145b806127ed57506127ec8185612317565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612816826112c0565b73ffffffffffffffffffffffffffffffffffffffff161461286c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286390614f1d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d390614cdd565b60405180910390fd5b6128e7838383612da2565b6128f260008261264a565b61294381600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612da790919063ffffffff16565b5061299581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612dc190919063ffffffff16565b506129ac81836002612ddb9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612a1c8360000183612e10565b60001c905092915050565b600080600080612a3a8660000186612e7d565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612a6992919061370f565b5050565b612a87828260405180602001604052806000815250612f00565b5050565b600082821115612ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac790614d3d565b60405180910390fd5b818303905092915050565b6000612aee846000018460001b84612f5b565b60001c90509392505050565b6000612b0882600001612fec565b9050919050565b600080828401905083811015612b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5190614c9d565b60405180910390fd5b8091505092915050565b600080831415612b775760009050612bce565b6000828402905082848281612b8857fe5b0414612bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc090614ebd565b60405180910390fd5b809150505b92915050565b612bdf8484846127f6565b612beb84848484612ffd565b612c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2190614c3d565b60405180910390fd5b50505050565b60606000821415612c78576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d72565b600082905060005b60008214612ca2578080600101915050600a8281612c9a57fe5b049150612c80565b60008167ffffffffffffffff81118015612cbb57600080fd5b506040519080825280601f01601f191660200182016040528015612cee5781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612d6a57600a8481612d0f57fe5b0660300160f81b82828060019003935081518110612d2957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612d6257fe5b049350612cfd565b819450505050505b919050565b6000612d89836000018360001b613161565b905092915050565b600081600001805490509050919050565b505050565b6000612db9836000018360001b613184565b905092915050565b6000612dd3836000018360001b61326c565b905092915050565b6000612e07846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6132dc565b90509392505050565b600081836000018054905011612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5290614bfd565b60405180910390fd5b826000018281548110612e6a57fe5b9060005260206000200154905092915050565b60008082846000018054905011612ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec090614e5d565b60405180910390fd5b6000846000018481548110612eda57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b612f0a83836133b8565b612f176000848484612ffd565b612f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4d90614c3d565b60405180910390fd5b505050565b60008084600101600085815260200190815260200160002054905060008114158390612fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb49190614bb9565b60405180910390fd5b50846000016001820381548110612fd057fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b600061301e8473ffffffffffffffffffffffffffffffffffffffff16613546565b61302b5760019050613159565b60006130f263150b7a0260e01b613040612642565b8887876040516024016130569493929190614ad0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615333603291398773ffffffffffffffffffffffffffffffffffffffff166135599092919063ffffffff16565b905060008180602001905181019061310a9190613b01565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461326057600060018203905060006001866000018054905003905060008660000182815481106131cf57fe5b90600052602060002001549050808760000184815481106131ec57fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061322457fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613266565b60009150505b92915050565b60006132788383613571565b6132d15782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506132d6565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415613383578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506133b1565b8285600001600183038154811061339657fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341f90614e7d565b60405180910390fd5b61343181612625565b15613471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346890614c7d565b60405180910390fd5b61347d60008383612da2565b6134ce81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612dc190919063ffffffff16565b506134e581836002612ddb9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606135688484600085613594565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156135d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d090614d5d565b60405180910390fd5b6135e285613546565b613621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361890614fdd565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161364a9190614a63565b60006040518083038185875af1925050503d8060008114613687576040519150601f19603f3d011682016040523d82523d6000602084013e61368c565b606091505b509150915061369c8282866136a8565b92505050949350505050565b606083156136b857829050613708565b6000835111156136cb5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ff9190614bb9565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613745576000855561378c565b82601f1061375e57805160ff191683800117855561378c565b8280016001018555821561378c579182015b8281111561378b578251825591602001919060010190613770565b5b509050613799919061379d565b5090565b5b808211156137b657600081600090555060010161379e565b5090565b60006137cd6137c884615049565b615018565b9050828152602081018484840111156137e557600080fd5b6137f084828561526a565b509392505050565b600061380b61380684615079565b615018565b90508281526020810184848401111561382357600080fd5b61382e84828561526a565b509392505050565b600081359050613845816152bf565b92915050565b60008135905061385a816152d6565b92915050565b60008151905061386f816152ed565b92915050565b60008135905061388481615304565b92915050565b60008151905061389981615304565b92915050565b600082601f8301126138b057600080fd5b81356138c08482602086016137ba565b91505092915050565b600082601f8301126138da57600080fd5b81356138ea8482602086016137f8565b91505092915050565b6000813590506139028161531b565b92915050565b60006020828403121561391a57600080fd5b600061392884828501613836565b91505092915050565b6000806040838503121561394457600080fd5b600061395285828601613836565b925050602061396385828601613836565b9150509250929050565b60008060006060848603121561398257600080fd5b600061399086828701613836565b93505060206139a186828701613836565b92505060406139b2868287016138f3565b9150509250925092565b600080600080608085870312156139d257600080fd5b60006139e087828801613836565b94505060206139f187828801613836565b9350506040613a02878288016138f3565b925050606085013567ffffffffffffffff811115613a1f57600080fd5b613a2b8782880161389f565b91505092959194509250565b60008060408385031215613a4a57600080fd5b6000613a5885828601613836565b9250506020613a698582860161384b565b9150509250929050565b60008060408385031215613a8657600080fd5b6000613a9485828601613836565b9250506020613aa5858286016138f3565b9150509250929050565b600060208284031215613ac157600080fd5b6000613acf84828501613860565b91505092915050565b600060208284031215613aea57600080fd5b6000613af884828501613875565b91505092915050565b600060208284031215613b1357600080fd5b6000613b218482850161388a565b91505092915050565b600060208284031215613b3c57600080fd5b600082013567ffffffffffffffff811115613b5657600080fd5b613b62848285016138c9565b91505092915050565b600060208284031215613b7d57600080fd5b6000613b8b848285016138f3565b91505092915050565b60008060408385031215613ba757600080fd5b6000613bb5858286016138f3565b925050602083013567ffffffffffffffff811115613bd257600080fd5b613bde858286016138c9565b9150509250929050565b6000613bf48383613e1b565b905092915050565b6000613c088383614a45565b60208301905092915050565b613c1d81615234565b82525050565b613c2c816151b6565b82525050565b613c3b816151a4565b82525050565b6000613c4c826150f3565b613c568185615139565b935083602082028501613c68856150a9565b8060005b85811015613ca45784840389528151613c858582613be8565b9450613c908361511f565b925060208a01995050600181019050613c6c565b50829750879550505050505092915050565b6000613cc1826150fe565b613ccb818561514a565b9350613cd6836150b9565b8060005b83811015613d07578151613cee8882613bfc565b9750613cf98361512c565b925050600181019050613cda565b5085935050505092915050565b613d1d816151c8565b82525050565b6000613d2e82615109565b613d38818561515b565b9350613d48818560208601615279565b613d51816152ae565b840191505092915050565b6000613d6782615109565b613d71818561516c565b9350613d81818560208601615279565b80840191505092915050565b600081546001811660008114613daa5760018114613dcf57613e13565b607f6002830416613dbb818761516c565b955060ff1983168652808601935050613e13565b60028204613ddd818761516c565b9550613de8856150c9565b60005b82811015613e0a57815481890152600182019150602081019050613deb565b82880195505050505b505092915050565b6000613e2682615114565b613e308185615177565b9350613e40818560208601615279565b613e49816152ae565b840191505092915050565b6000613e5f82615114565b613e698185615188565b9350613e79818560208601615279565b613e82816152ae565b840191505092915050565b6000613e9882615114565b613ea28185615199565b9350613eb2818560208601615279565b80840191505092915050565b600081546001811660008114613edb5760018114613f0157613f45565b607f6002830416613eec8187615188565b955060ff198316865260208601935050613f45565b60028204613f0f8187615188565b9550613f1a856150de565b60005b82811015613f3c57815481890152600182019150602081019050613f1d565b80880195505050505b505092915050565b6000613f5a602283615188565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fc0602883615188565b91507f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008301527f7320736b756c6c210000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614026603283615188565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061408c602683615188565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140f2601c83615188565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614132601b83615188565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614172602083615188565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b60006141b2602483615188565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614218601983615188565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614258601f83615188565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614298601e83615188565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b60006142d8602683615188565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061433e602c83615188565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006143a4602183615188565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061440a602183615188565b91507f53616c65206d7573742062652061637469766520746f206d696e7420736b756c60008301527f6c000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614470603883615188565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006144d6602a83615188565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061453c601b83615188565b91507f43686f6f7365206120736b756c6c2077697468696e2072616e676500000000006000830152602082019050919050565b600061457c602a83615188565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620736b756c6c73000000000000000000000000000000000000000000006020830152604082019050919050565b60006145e2602283615188565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614648602083615188565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614688601b83615188565b91507f43484f4f5345204120736b756c6c2057495448494e2052414e474500000000006000830152602082019050919050565b60006146c8602183615188565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061472e602c83615188565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614794602083615188565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006147d4602983615188565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061483a602f83615188565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006148a0602383615188565b91507f4e6577206e616d652069732073616d65206173207468652063757272656e742060008301527f6f6e6500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614906602183615188565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061496c601683615188565b91507f4c6963656e736520616c7265616479206c6f636b6564000000000000000000006000830152602082019050919050565b60006149ac603183615188565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614a12601d83615188565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b614a4e8161522a565b82525050565b614a5d8161522a565b82525050565b6000614a6f8284613d5c565b915081905092915050565b6000614a868284613d8d565b915081905092915050565b6000614a9d8285613e8d565b9150614aa98284613e8d565b91508190509392505050565b6000602082019050614aca6000830184613c32565b92915050565b6000608082019050614ae56000830187613c23565b614af26020830186613c32565b614aff6040830185614a54565b8181036060830152614b118184613d23565b905095945050505050565b6000606082019050614b316000830186613c14565b614b3e6020830185614a54565b8181036040830152614b508184613e54565b9050949350505050565b60006020820190508181036000830152614b748184613c41565b905092915050565b60006020820190508181036000830152614b968184613cb6565b905092915050565b6000602082019050614bb36000830184613d14565b92915050565b60006020820190508181036000830152614bd38184613e54565b905092915050565b60006020820190508181036000830152614bf58184613ebe565b905092915050565b60006020820190508181036000830152614c1681613f4d565b9050919050565b60006020820190508181036000830152614c3681613fb3565b9050919050565b60006020820190508181036000830152614c5681614019565b9050919050565b60006020820190508181036000830152614c768161407f565b9050919050565b60006020820190508181036000830152614c96816140e5565b9050919050565b60006020820190508181036000830152614cb681614125565b9050919050565b60006020820190508181036000830152614cd681614165565b9050919050565b60006020820190508181036000830152614cf6816141a5565b9050919050565b60006020820190508181036000830152614d168161420b565b9050919050565b60006020820190508181036000830152614d368161424b565b9050919050565b60006020820190508181036000830152614d568161428b565b9050919050565b60006020820190508181036000830152614d76816142cb565b9050919050565b60006020820190508181036000830152614d9681614331565b9050919050565b60006020820190508181036000830152614db681614397565b9050919050565b60006020820190508181036000830152614dd6816143fd565b9050919050565b60006020820190508181036000830152614df681614463565b9050919050565b60006020820190508181036000830152614e16816144c9565b9050919050565b60006020820190508181036000830152614e368161452f565b9050919050565b60006020820190508181036000830152614e568161456f565b9050919050565b60006020820190508181036000830152614e76816145d5565b9050919050565b60006020820190508181036000830152614e968161463b565b9050919050565b60006020820190508181036000830152614eb68161467b565b9050919050565b60006020820190508181036000830152614ed6816146bb565b9050919050565b60006020820190508181036000830152614ef681614721565b9050919050565b60006020820190508181036000830152614f1681614787565b9050919050565b60006020820190508181036000830152614f36816147c7565b9050919050565b60006020820190508181036000830152614f568161482d565b9050919050565b60006020820190508181036000830152614f7681614893565b9050919050565b60006020820190508181036000830152614f96816148f9565b9050919050565b60006020820190508181036000830152614fb68161495f565b9050919050565b60006020820190508181036000830152614fd68161499f565b9050919050565b60006020820190508181036000830152614ff681614a05565b9050919050565b60006020820190506150126000830184614a54565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561503f5761503e6152ac565b5b8060405250919050565b600067ffffffffffffffff821115615064576150636152ac565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115615094576150936152ac565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006151af8261520a565b9050919050565b60006151c18261520a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061523f82615246565b9050919050565b600061525182615258565b9050919050565b60006152638261520a565b9050919050565b82818337600083830152505050565b60005b8381101561529757808201518184015260208101905061527c565b838111156152a6576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b6152c8816151a4565b81146152d357600080fd5b50565b6152df816151c8565b81146152ea57600080fd5b50565b6152f6816151d4565b811461530157600080fd5b50565b61530d816151de565b811461531857600080fd5b50565b6153248161522a565b811461532f57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122076c37de5db1b48505cd52ca0840605e3fa7e254170f03eba42bc377656e0485664736f6c63430007060033

Deployed Bytecode Sourcemap

66488:4697:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10379:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51724:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54510:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54040:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67844:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53518:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55400:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53280:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68087:89;;;;;;;;;;;;;:::i;:::-;;67301:131;;;;;;;;;;;;;:::i;:::-;;70625:555;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55776:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66944:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67085:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53806:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67978:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67440:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51480:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53099:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51197:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66031:148;;;;;;;;;;;;;:::i;:::-;;68186:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65804:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69326:684;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51893:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66669:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54803:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70018:392;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70418:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69142:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66893:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55998:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69009:125;;;;;;;;;;;;;:::i;:::-;;52068:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66570:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68773:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55169:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66994:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66187:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67035:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66818:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10379:150;10464:4;10488:20;:33;10509:11;10488:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10481:40;;10379:150;;;:::o;51724:100::-;51778:13;51811:5;51804:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51724:100;:::o;54510:221::-;54586:7;54614:16;54622:7;54614;:16::i;:::-;54606:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54699:15;:24;54715:7;54699:24;;;;;;;;;;;;;;;;;;;;;54692:31;;54510:221;;;:::o;54040:404::-;54121:13;54137:23;54152:7;54137:14;:23::i;:::-;54121:39;;54185:5;54179:11;;:2;:11;;;;54171:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54265:5;54249:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;54274:44;54298:5;54305:12;:10;:12::i;:::-;54274:23;:44::i;:::-;54249:69;54241:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;54415:21;54424:2;54428:7;54415:8;:21::i;:::-;54040:404;;;:::o;67844:126::-;65952:12;:10;:12::i;:::-;65941:23;;:7;:5;:7::i;:::-;:23;;;65933:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67948:14:::1;67929:16;:33;;;;;;;;;;;;:::i;:::-;;67844:126:::0;:::o;53518:211::-;53579:7;53700:21;:12;:19;:21::i;:::-;53693:28;;53518:211;:::o;55400:305::-;55561:41;55580:12;:10;:12::i;:::-;55594:7;55561:18;:41::i;:::-;55553:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;55669:28;55679:4;55685:2;55689:7;55669:9;:28::i;:::-;55400:305;;;:::o;53280:162::-;53377:7;53404:30;53428:5;53404:13;:20;53418:5;53404:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;53397:37;;53280:162;;;;:::o;68087:89::-;65952:12;:10;:12::i;:::-;65941:23;;:7;:5;:7::i;:::-;:23;;;65933:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68156:12:::1;;;;;;;;;;;68155:13;68140:12;;:28;;;;;;;;;;;;;;;;;;68087:89::o:0;67301:131::-;65952:12;:10;:12::i;:::-;65941:23;;:7;:5;:7::i;:::-;:23;;;65933:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67349:12:::1;67364:21;67349:36;;67396:10;:19;;:28;67416:7;67396:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;66012:1;67301:131::o:0;70625:555::-;70690:15;70719:18;70740:17;70750:6;70740:9;:17::i;:::-;70719:38;;70786:1;70772:10;:15;70768:405;;;70862:1;70849:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70842:22;;;;;70768:405;70897:22;70935:10;70922:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70897:49;;70961:13;70989:145;71013:10;71005:5;:18;70989:145;;;71069:10;:48;71081:34;71101:6;71109:5;71081:19;:34::i;:::-;71069:48;;;;;;;;;;;71053:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;71060:5;71053:13;;;;;;;;;;;;;:64;;;;71025:7;;;;;;;70989:145;;;71155:6;71148:13;;;;;70625:555;;;;:::o;55776:151::-;55880:39;55897:4;55903:2;55907:7;55880:39;;;;;;;;;;;;:16;:39::i;:::-;55776:151;;;:::o;66944:41::-;66981:4;66944:41;:::o;67085:31::-;;;;:::o;53806:172::-;53881:7;53902:15;53923:22;53939:5;53923:12;:15;;:22;;;;:::i;:::-;53901:44;;;53963:7;53956:14;;;53806:172;;;:::o;67978:99::-;65952:12;:10;:12::i;:::-;65941:23;;:7;:5;:7::i;:::-;:23;;;65933:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68049:20:::1;68061:7;68049:11;:20::i;:::-;67978:99:::0;:::o;67440:394::-;65952:12;:10;:12::i;:::-;65941:23;;:7;:5;:7::i;:::-;:23;;;65933:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67528:11:::1;67542:13;:11;:13::i;:::-;67528:27;;67591:1;67574:14;:18;:52;;;;;67614:12;;67596:14;:30;;67574:52;67566:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;67679:6;67674:95;67695:14;67691:1;:18;67674:95;;;67731:26;67741:3;67755:1;67746:6;:10;67731:9;:26::i;:::-;67711:3;;;;;;;67674:95;;;;67794:32;67811:14;67794:12;;:16;;:32;;;;:::i;:::-;67779:12;:47;;;;66012:1;67440:394:::0;;:::o;51480:177::-;51552:7;51579:70;51596:7;51579:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;51572:77;;51480:177;;;:::o;53099:97::-;53147:13;53180:8;53173:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53099:97;:::o;51197:221::-;51269:7;51314:1;51297:19;;:5;:19;;;;51289:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51381:29;:13;:20;51395:5;51381:20;;;;;;;;;;;;;;;:27;:29::i;:::-;51374:36;;51197:221;;;:::o;66031:148::-;65952:12;:10;:12::i;:::-;65941:23;;:7;:5;:7::i;:::-;:23;;;65933:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66138:1:::1;66101:40;;66122:6;;;;;;;;;;;66101:40;;;;;;;;;;;;66169:1;66152:6;;:19;;;;;;;;;;;;;;;;;;66031:148::o:0;68186:540::-;68247:16;68277:18;68298:17;68308:6;68298:9;:17::i;:::-;68277:38;;68344:1;68330:10;:15;68326:393;;;68421:1;68407:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68400:23;;;;;68326:393;68456:23;68496:10;68482:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68456:51;;68522:13;68550:130;68574:10;68566:5;:18;68550:130;;;68630:34;68650:6;68658:5;68630:19;:34::i;:::-;68614:6;68621:5;68614:13;;;;;;;;;;;;;:50;;;;;68586:7;;;;;;;68550:130;;;68701:6;68694:13;;;;;68186:540;;;;:::o;65804:87::-;65850:7;65877:6;;;;;;;;;;;65870:13;;65804:87;:::o;69326:684::-;69403:12;;;;;;;;;;;69395:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;69489:1;69472:14;:18;:56;;;;;66933:2;69494:14;:34;;69472:56;69464:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;66981:4;69585:33;69603:14;69585:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;69577:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;69711:30;69726:14;66855:17;69711:14;;:30;;;;:::i;:::-;69698:9;:43;;69690:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;69794:6;69790:211;69810:14;69806:1;:18;69790:211;;;69846:14;69863:13;:11;:13::i;:::-;69846:30;;66981:4;69895:13;:11;:13::i;:::-;:26;69891:99;;;69942:32;69952:10;69964:9;69942;:32::i;:::-;69891:99;69790:211;69826:3;;;;;;;69790:211;;;;69326:684;:::o;51893:104::-;51949:13;51982:7;51975:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51893:104;:::o;66669:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54803:295::-;54918:12;:10;:12::i;:::-;54906:24;;:8;:24;;;;54898:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;55018:8;54973:18;:32;54992:12;:10;:12::i;:::-;54973:32;;;;;;;;;;;;;;;:42;55006:8;54973:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;55071:8;55042:48;;55057:12;:10;:12::i;:::-;55042:48;;;55081:8;55042:48;;;;;;:::i;:::-;;;;;;;;54803:295;;:::o;70018:392::-;70126:10;70105:31;;:17;70113:8;70105:7;:17::i;:::-;:31;;;70097:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;70224:35;70237:10;:20;70248:8;70237:20;;;;;;;;;;;70224:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70200:20;70213:5;70200:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;70192:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;70333:5;70310:10;:20;70321:8;70310:20;;;;;;;;;;;:28;;;;;;;;;;;;:::i;:::-;;70356:44;70372:10;70384:8;70394:5;70356:44;;;;;;;;:::i;:::-;;;;;;;;70018:392;;:::o;70418:197::-;70477:13;70523;:11;:13::i;:::-;70512:8;:24;70503:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;70587:10;:20;70598:8;70587:20;;;;;;;;;;;70580:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70418:197;;;:::o;69142:174::-;65952:12;:10;:12::i;:::-;65941:23;;:7;:5;:7::i;:::-;:23;;;65933:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69242:5:::1;69225:22;;:13;;;;;;;;;;;:22;;;69217:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;69300:8;69285:12;:23;;;;;;;;;;;;:::i;:::-;;69142:174:::0;:::o;66893:42::-;66933:2;66893:42;:::o;55998:285::-;56130:41;56149:12;:10;:12::i;:::-;56163:7;56130:18;:41::i;:::-;56122:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56236:39;56250:4;56256:2;56260:7;56269:5;56236:13;:39::i;:::-;55998:285;;;;:::o;69009:125::-;65952:12;:10;:12::i;:::-;65941:23;;:7;:5;:7::i;:::-;:23;;;65933:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69077:4:::1;69060:13;;:21;;;;;;;;;;;;;;;;;;69097:29;69113:12;69097:29;;;;;;:::i;:::-;;;;;;;;69009:125::o:0;52068:792::-;52141:13;52175:16;52183:7;52175;:16::i;:::-;52167:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52256:23;52282:10;:19;52293:7;52282:19;;;;;;;;;;;52256:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52312:18;52333:9;:7;:9::i;:::-;52312:30;;52440:1;52424:4;52418:18;:23;52414:72;;;52465:9;52458:16;;;;;;52414:72;52616:1;52596:9;52590:23;:27;52586:108;;;52665:4;52671:9;52648:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52634:48;;;;;;52586:108;52826:4;52832:18;:7;:16;:18::i;:::-;52809:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52795:57;;;;52068:792;;;;:::o;66570:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68773:175::-;68825:13;68865;:11;:13::i;:::-;68859:3;:19;68851:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;68928:12;68921:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68773:175;;;:::o;55169:164::-;55266:4;55290:18;:25;55309:5;55290:25;;;;;;;;;;;;;;;:35;55316:8;55290:35;;;;;;;;;;;;;;;;;;;;;;;;;55283:42;;55169:164;;;;:::o;66994:32::-;;;;;;;;;;;;;:::o;66187:244::-;65952:12;:10;:12::i;:::-;65941:23;;:7;:5;:7::i;:::-;:23;;;65933:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66296:1:::1;66276:22;;:8;:22;;;;66268:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;66386:8;66357:38;;66378:6;;;;;;;;;;;66357:38;;;;;;;;;;;;66415:8;66406:6;;:17;;;;;;;;;;;;;;;;;;66187:244:::0;:::o;67035:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66818:54::-;66855:17;66818:54;:::o;57750:127::-;57815:4;57839:30;57861:7;57839:12;:21;;:30;;;;:::i;:::-;57832:37;;57750:127;;;:::o;811:106::-;864:15;899:10;892:17;;811:106;:::o;63788:192::-;63890:2;63863:15;:24;63879:7;63863:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;63946:7;63942:2;63908:46;;63917:23;63932:7;63917:14;:23::i;:::-;63908:46;;;;;;;;;;;;63788:192;;:::o;44474:123::-;44543:7;44570:19;44578:3;:10;;44570:7;:19::i;:::-;44563:26;;44474:123;;;:::o;58044:355::-;58137:4;58162:16;58170:7;58162;:16::i;:::-;58154:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58238:13;58254:23;58269:7;58254:14;:23::i;:::-;58238:39;;58307:5;58296:16;;:7;:16;;;:51;;;;58340:7;58316:31;;:20;58328:7;58316:11;:20::i;:::-;:31;;;58296:51;:94;;;;58351:39;58375:5;58382:7;58351:23;:39::i;:::-;58296:94;58288:103;;;58044:355;;;;:::o;61180:599::-;61305:4;61278:31;;:23;61293:7;61278:14;:23::i;:::-;:31;;;61270:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;61406:1;61392:16;;:2;:16;;;;61384:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61462:39;61483:4;61489:2;61493:7;61462:20;:39::i;:::-;61566:29;61583:1;61587:7;61566:8;:29::i;:::-;61608:35;61635:7;61608:13;:19;61622:4;61608:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;61654:30;61676:7;61654:13;:17;61668:2;61654:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;61697:29;61714:7;61723:2;61697:12;:16;;:29;;;;;:::i;:::-;;61763:7;61759:2;61744:27;;61753:4;61744:27;;;;;;;;;;;;61180:599;;;:::o;36255:137::-;36326:7;36361:22;36365:3;:10;;36377:5;36361:3;:22::i;:::-;36353:31;;36346:38;;36255:137;;;;:::o;44945:236::-;45025:7;45034;45055:11;45068:13;45085:22;45089:3;:10;;45101:5;45085:3;:22::i;:::-;45054:53;;;;45134:3;45126:12;;45164:5;45156:14;;45118:55;;;;;;44945:236;;;;;:::o;62380:100::-;62464:8;62453;:19;;;;;;;;;;;;:::i;:::-;;62380:100;:::o;58742:110::-;58818:26;58828:2;58832:7;58818:26;;;;;;;;;;;;:9;:26::i;:::-;58742:110;;:::o;14403:158::-;14461:7;14494:1;14489;:6;;14481:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;14552:1;14548;:5;14541:12;;14403:158;;;;:::o;46231:213::-;46338:7;46389:44;46394:3;:10;;46414:3;46406:12;;46420;46389:4;:44::i;:::-;46381:53;;46358:78;;46231:213;;;;;:::o;35787:114::-;35847:7;35874:19;35882:3;:10;;35874:7;:19::i;:::-;35867:26;;35787:114;;;:::o;13941:179::-;13999:7;14019:9;14035:1;14031;:5;14019:17;;14060:1;14055;:6;;14047:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;14111:1;14104:8;;;13941:179;;;;:::o;14820:220::-;14878:7;14907:1;14902;:6;14898:20;;;14917:1;14910:8;;;;14898:20;14929:9;14945:1;14941;:5;14929:17;;14974:1;14969;14965;:5;;;;;;:10;14957:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;15031:1;15024:8;;;14820:220;;;;;:::o;57165:272::-;57279:28;57289:4;57295:2;57299:7;57279:9;:28::i;:::-;57326:48;57349:4;57355:2;57359:7;57368:5;57326:22;:48::i;:::-;57318:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;57165:272;;;;:::o;46695:746::-;46751:13;46981:1;46972:5;:10;46968:53;;;46999:10;;;;;;;;;;;;;;;;;;;;;46968:53;47031:12;47046:5;47031:20;;47062:14;47087:78;47102:1;47094:4;:9;47087:78;;47120:8;;;;;;;47151:2;47143:10;;;;;;;;;47087:78;;;47175:19;47207:6;47197:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47175:39;;47225:13;47250:1;47241:6;:10;47225:26;;47269:5;47262:12;;47285:117;47300:1;47292:4;:9;47285:117;;47361:2;47354:4;:9;;;;;;47349:2;:14;47336:29;;47318:6;47325:7;;;;;;;47318:15;;;;;;;;;;;:47;;;;;;;;;;;47388:2;47380:10;;;;;;;;;47285:117;;;47426:6;47412:21;;;;;;46695:746;;;;:::o;44235:151::-;44319:4;44343:35;44353:3;:10;;44373:3;44365:12;;44343:9;:35::i;:::-;44336:42;;44235:151;;;;:::o;41043:110::-;41099:7;41126:3;:12;;:19;;;;41119:26;;41043:110;;;:::o;64593:93::-;;;;:::o;35332:137::-;35402:4;35426:35;35434:3;:10;;35454:5;35446:14;;35426:7;:35::i;:::-;35419:42;;35332:137;;;;:::o;35025:131::-;35092:4;35116:32;35121:3;:10;;35141:5;35133:14;;35116:4;:32::i;:::-;35109:39;;35025:131;;;;:::o;43658:185::-;43747:4;43771:64;43776:3;:10;;43796:3;43788:12;;43826:5;43810:23;;43802:32;;43771:4;:64::i;:::-;43764:71;;43658:185;;;;;:::o;31263:204::-;31330:7;31379:5;31358:3;:11;;:18;;;;:26;31350:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31441:3;:11;;31453:5;31441:18;;;;;;;;;;;;;;;;31434:25;;31263:204;;;;:::o;41518:279::-;41585:7;41594;41644:5;41622:3;:12;;:19;;;;:27;41614:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41701:22;41726:3;:12;;41739:5;41726:19;;;;;;;;;;;;;;;;;;41701:44;;41764:5;:10;;;41776:5;:12;;;41756:33;;;;;41518:279;;;;;:::o;59079:250::-;59175:18;59181:2;59185:7;59175:5;:18::i;:::-;59212:54;59243:1;59247:2;59251:7;59260:5;59212:22;:54::i;:::-;59204:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;59079:250;;;:::o;43015:319::-;43109:7;43129:16;43148:3;:12;;:17;43161:3;43148:17;;;;;;;;;;;;43129:36;;43196:1;43184:8;:13;;43199:12;43176:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43266:3;:12;;43290:1;43279:8;:12;43266:26;;;;;;;;;;;;;;;;;;:33;;;43259:40;;;43015:319;;;;;:::o;30800:109::-;30856:7;30883:3;:11;;:18;;;;30876:25;;30800:109;;;:::o;63045:624::-;63162:4;63189:15;:2;:13;;;:15::i;:::-;63184:60;;63228:4;63221:11;;;;63184:60;63254:23;63280:276;63337:45;;;63401:12;:10;:12::i;:::-;63432:4;63455:7;63481:5;63296:205;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63280:276;;;;;;;;;;;;;;;;;:2;:15;;;;:276;;;;;:::i;:::-;63254:302;;63567:13;63594:10;63583:32;;;;;;;;;;;;:::i;:::-;63567:48;;48194:10;63644:16;;63634:26;;;:6;:26;;;;63626:35;;;;63045:624;;;;;;;:::o;40823:125::-;40894:4;40939:1;40918:3;:12;;:17;40931:3;40918:17;;;;;;;;;;;;:22;;40911:29;;40823:125;;;;:::o;28955:1544::-;29021:4;29139:18;29160:3;:12;;:19;29173:5;29160:19;;;;;;;;;;;;29139:40;;29210:1;29196:10;:15;29192:1300;;29558:21;29595:1;29582:10;:14;29558:38;;29611:17;29652:1;29631:3;:11;;:18;;;;:22;29611:42;;29898:17;29918:3;:11;;29930:9;29918:22;;;;;;;;;;;;;;;;29898:42;;30064:9;30035:3;:11;;30047:13;30035:26;;;;;;;;;;;;;;;:38;;;;30183:1;30167:13;:17;30141:3;:12;;:23;30154:9;30141:23;;;;;;;;;;;:43;;;;30293:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30388:3;:12;;:19;30401:5;30388:19;;;;;;;;;;;30381:26;;;30431:4;30424:11;;;;;;;;29192:1300;30475:5;30468:12;;;28955:1544;;;;;:::o;28365:414::-;28428:4;28450:21;28460:3;28465:5;28450:9;:21::i;:::-;28445:327;;28488:3;:11;;28505:5;28488:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28671:3;:11;;:18;;;;28649:3;:12;;:19;28662:5;28649:19;;;;;;;;;;;:40;;;;28711:4;28704:11;;;;28445:327;28755:5;28748:12;;28365:414;;;;;:::o;38323:692::-;38399:4;38515:16;38534:3;:12;;:17;38547:3;38534:17;;;;;;;;;;;;38515:36;;38580:1;38568:8;:13;38564:444;;;38635:3;:12;;38653:38;;;;;;;;38670:3;38653:38;;;;38683:5;38653:38;;;38635:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38850:3;:12;;:19;;;;38830:3;:12;;:17;38843:3;38830:17;;;;;;;;;;;:39;;;;38891:4;38884:11;;;;;38564:444;38964:5;38928:3;:12;;38952:1;38941:8;:12;38928:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38991:5;38984:12;;;38323:692;;;;;;:::o;59665:404::-;59759:1;59745:16;;:2;:16;;;;59737:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;59818:16;59826:7;59818;:16::i;:::-;59817:17;59809:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59880:45;59909:1;59913:2;59917:7;59880:20;:45::i;:::-;59938:30;59960:7;59938:13;:17;59952:2;59938:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;59981:29;59998:7;60007:2;59981:12;:16;;:29;;;;;:::i;:::-;;60053:7;60049:2;60028:33;;60045:1;60028:33;;;;;;;;;;;;59665:404;;:::o;19382:422::-;19442:4;19650:12;19761:7;19749:20;19741:28;;19795:1;19788:4;:8;19781:15;;;19382:422;;;:::o;22302:195::-;22405:12;22437:52;22459:6;22467:4;22473:1;22476:12;22437:21;:52::i;:::-;22430:59;;22302:195;;;;;:::o;30585:129::-;30658:4;30705:1;30682:3;:12;;:19;30695:5;30682:19;;;;;;;;;;;;:24;;30675:31;;30585:129;;;;:::o;23354:530::-;23481:12;23539:5;23514:21;:30;;23506:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23606:18;23617:6;23606:10;:18::i;:::-;23598:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23732:12;23746:23;23773:6;:11;;23793:5;23801:4;23773:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23731:75;;;;23824:52;23842:7;23851:10;23863:12;23824:17;:52::i;:::-;23817:59;;;;23354:530;;;;;;:::o;25894:742::-;26009:12;26038:7;26034:595;;;26069:10;26062:17;;;;26034:595;26203:1;26183:10;:17;:21;26179:439;;;26446:10;26440:17;26507:15;26494:10;26490:2;26486:19;26479:44;26394:148;26589:12;26582:20;;;;;;;;;;;:::i;:::-;;;;;;;;25894:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:143::-;;1077:6;1071:13;1062:22;;1093:33;1120:5;1093:33;:::i;:::-;1052:80;;;;:::o;1138:137::-;;1221:6;1208:20;1199:29;;1237:32;1263:5;1237:32;:::i;:::-;1189:86;;;;:::o;1281:141::-;;1368:6;1362:13;1353:22;;1384:32;1410:5;1384:32;:::i;:::-;1343:79;;;;:::o;1441:271::-;;1545:3;1538:4;1530:6;1526:17;1522:27;1512:2;;1563:1;1560;1553:12;1512:2;1603:6;1590:20;1628:78;1702:3;1694:6;1687:4;1679:6;1675:17;1628:78;:::i;:::-;1619:87;;1502:210;;;;;:::o;1732:273::-;;1837:3;1830:4;1822:6;1818:17;1814:27;1804:2;;1855:1;1852;1845:12;1804:2;1895:6;1882:20;1920:79;1995:3;1987:6;1980:4;1972:6;1968:17;1920:79;:::i;:::-;1911:88;;1794:211;;;;;:::o;2011:139::-;;2095:6;2082:20;2073:29;;2111:33;2138:5;2111:33;:::i;:::-;2063:87;;;;:::o;2156:262::-;;2264:2;2252:9;2243:7;2239:23;2235:32;2232:2;;;2280:1;2277;2270:12;2232:2;2323:1;2348:53;2393:7;2384:6;2373:9;2369:22;2348:53;:::i;:::-;2338:63;;2294:117;2222:196;;;;:::o;2424:407::-;;;2549:2;2537:9;2528:7;2524:23;2520:32;2517:2;;;2565:1;2562;2555:12;2517:2;2608:1;2633:53;2678:7;2669:6;2658:9;2654:22;2633:53;:::i;:::-;2623:63;;2579:117;2735:2;2761:53;2806:7;2797:6;2786:9;2782:22;2761:53;:::i;:::-;2751:63;;2706:118;2507:324;;;;;:::o;2837:552::-;;;;2979:2;2967:9;2958:7;2954:23;2950:32;2947:2;;;2995:1;2992;2985:12;2947:2;3038:1;3063:53;3108:7;3099:6;3088:9;3084:22;3063:53;:::i;:::-;3053:63;;3009:117;3165:2;3191:53;3236:7;3227:6;3216:9;3212:22;3191:53;:::i;:::-;3181:63;;3136:118;3293:2;3319:53;3364:7;3355:6;3344:9;3340:22;3319:53;:::i;:::-;3309:63;;3264:118;2937:452;;;;;:::o;3395:809::-;;;;;3563:3;3551:9;3542:7;3538:23;3534:33;3531:2;;;3580:1;3577;3570:12;3531:2;3623:1;3648:53;3693:7;3684:6;3673:9;3669:22;3648:53;:::i;:::-;3638:63;;3594:117;3750:2;3776:53;3821:7;3812:6;3801:9;3797:22;3776:53;:::i;:::-;3766:63;;3721:118;3878:2;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;:::i;:::-;3894:63;;3849:118;4034:2;4023:9;4019:18;4006:32;4065:18;4057:6;4054:30;4051:2;;;4097:1;4094;4087:12;4051:2;4125:62;4179:7;4170:6;4159:9;4155:22;4125:62;:::i;:::-;4115:72;;3977:220;3521:683;;;;;;;:::o;4210:401::-;;;4332:2;4320:9;4311:7;4307:23;4303:32;4300:2;;;4348:1;4345;4338:12;4300:2;4391:1;4416:53;4461:7;4452:6;4441:9;4437:22;4416:53;:::i;:::-;4406:63;;4362:117;4518:2;4544:50;4586:7;4577:6;4566:9;4562:22;4544:50;:::i;:::-;4534:60;;4489:115;4290:321;;;;;:::o;4617:407::-;;;4742:2;4730:9;4721:7;4717:23;4713:32;4710:2;;;4758:1;4755;4748:12;4710:2;4801:1;4826:53;4871:7;4862:6;4851:9;4847:22;4826:53;:::i;:::-;4816:63;;4772:117;4928:2;4954:53;4999:7;4990:6;4979:9;4975:22;4954:53;:::i;:::-;4944:63;;4899:118;4700:324;;;;;:::o;5030:284::-;;5149:2;5137:9;5128:7;5124:23;5120:32;5117:2;;;5165:1;5162;5155:12;5117:2;5208:1;5233:64;5289:7;5280:6;5269:9;5265:22;5233:64;:::i;:::-;5223:74;;5179:128;5107:207;;;;:::o;5320:260::-;;5427:2;5415:9;5406:7;5402:23;5398:32;5395:2;;;5443:1;5440;5433:12;5395:2;5486:1;5511:52;5555:7;5546:6;5535:9;5531:22;5511:52;:::i;:::-;5501:62;;5457:116;5385:195;;;;:::o;5586:282::-;;5704:2;5692:9;5683:7;5679:23;5675:32;5672:2;;;5720:1;5717;5710:12;5672:2;5763:1;5788:63;5843:7;5834:6;5823:9;5819:22;5788:63;:::i;:::-;5778:73;;5734:127;5662:206;;;;:::o;5874:375::-;;5992:2;5980:9;5971:7;5967:23;5963:32;5960:2;;;6008:1;6005;5998:12;5960:2;6079:1;6068:9;6064:17;6051:31;6109:18;6101:6;6098:30;6095:2;;;6141:1;6138;6131:12;6095:2;6169:63;6224:7;6215:6;6204:9;6200:22;6169:63;:::i;:::-;6159:73;;6022:220;5950:299;;;;:::o;6255:262::-;;6363:2;6351:9;6342:7;6338:23;6334:32;6331:2;;;6379:1;6376;6369:12;6331:2;6422:1;6447:53;6492:7;6483:6;6472:9;6468:22;6447:53;:::i;:::-;6437:63;;6393:117;6321:196;;;;:::o;6523:520::-;;;6658:2;6646:9;6637:7;6633:23;6629:32;6626:2;;;6674:1;6671;6664:12;6626:2;6717:1;6742:53;6787:7;6778:6;6767:9;6763:22;6742:53;:::i;:::-;6732:63;;6688:117;6872:2;6861:9;6857:18;6844:32;6903:18;6895:6;6892:30;6889:2;;;6935:1;6932;6925:12;6889:2;6963:63;7018:7;7009:6;6998:9;6994:22;6963:63;:::i;:::-;6953:73;;6815:221;6616:427;;;;;:::o;7049:196::-;;7173:66;7235:3;7227:6;7173:66;:::i;:::-;7159:80;;7149:96;;;;:::o;7251:179::-;;7341:46;7383:3;7375:6;7341:46;:::i;:::-;7419:4;7414:3;7410:14;7396:28;;7331:99;;;;:::o;7436:147::-;7531:45;7570:5;7531:45;:::i;:::-;7526:3;7519:58;7509:74;;:::o;7589:142::-;7692:32;7718:5;7692:32;:::i;:::-;7687:3;7680:45;7670:61;;:::o;7737:118::-;7824:24;7842:5;7824:24;:::i;:::-;7819:3;7812:37;7802:53;;:::o;7889:991::-;;8057:64;8115:5;8057:64;:::i;:::-;8137:96;8226:6;8221:3;8137:96;:::i;:::-;8130:103;;8259:3;8304:4;8296:6;8292:17;8287:3;8283:27;8334:66;8394:5;8334:66;:::i;:::-;8423:7;8454:1;8439:396;8464:6;8461:1;8458:13;8439:396;;;8535:9;8529:4;8525:20;8520:3;8513:33;8586:6;8580:13;8614:84;8693:4;8678:13;8614:84;:::i;:::-;8606:92;;8721:70;8784:6;8721:70;:::i;:::-;8711:80;;8820:4;8815:3;8811:14;8804:21;;8499:336;8486:1;8483;8479:9;8474:14;;8439:396;;;8443:14;8851:4;8844:11;;8871:3;8864:10;;8033:847;;;;;;;;;:::o;8916:732::-;;9064:54;9112:5;9064:54;:::i;:::-;9134:86;9213:6;9208:3;9134:86;:::i;:::-;9127:93;;9244:56;9294:5;9244:56;:::i;:::-;9323:7;9354:1;9339:284;9364:6;9361:1;9358:13;9339:284;;;9440:6;9434:13;9467:63;9526:3;9511:13;9467:63;:::i;:::-;9460:70;;9553:60;9606:6;9553:60;:::i;:::-;9543:70;;9399:224;9386:1;9383;9379:9;9374:14;;9339:284;;;9343:14;9639:3;9632:10;;9040:608;;;;;;;:::o;9654:109::-;9735:21;9750:5;9735:21;:::i;:::-;9730:3;9723:34;9713:50;;:::o;9769:360::-;;9883:38;9915:5;9883:38;:::i;:::-;9937:70;10000:6;9995:3;9937:70;:::i;:::-;9930:77;;10016:52;10061:6;10056:3;10049:4;10042:5;10038:16;10016:52;:::i;:::-;10093:29;10115:6;10093:29;:::i;:::-;10088:3;10084:39;10077:46;;9859:270;;;;;:::o;10135:373::-;;10267:38;10299:5;10267:38;:::i;:::-;10321:88;10402:6;10397:3;10321:88;:::i;:::-;10314:95;;10418:52;10463:6;10458:3;10451:4;10444:5;10440:16;10418:52;:::i;:::-;10495:6;10490:3;10486:16;10479:23;;10243:265;;;;;:::o;10536:1001::-;;10678:5;10672:12;10715:1;10704:9;10700:17;10731:1;10726:300;;;;11040:1;11035:496;;;;10693:838;;10726:300;10816:4;10812:1;10801:9;10797:17;10793:28;10841:88;10922:6;10917:3;10841:88;:::i;:::-;10834:95;;10973:4;10969:9;10958;10954:25;10949:3;10942:38;11009:6;11004:3;11000:16;10993:23;;10733:293;10726:300;;11035:496;11116:1;11105:9;11101:17;11138:88;11219:6;11214:3;11138:88;:::i;:::-;11131:95;;11254:41;11289:5;11254:41;:::i;:::-;11317:1;11331:154;11345:6;11342:1;11339:13;11331:154;;;11419:7;11413:14;11409:1;11404:3;11400:11;11393:35;11469:1;11460:7;11456:15;11445:26;;11367:4;11364:1;11360:12;11355:17;;11331:154;;;11514:6;11509:3;11505:16;11498:23;;11042:489;;;10693:838;;10645:892;;;;;:::o;11543:344::-;;11649:39;11682:5;11649:39;:::i;:::-;11704:61;11758:6;11753:3;11704:61;:::i;:::-;11697:68;;11774:52;11819:6;11814:3;11807:4;11800:5;11796:16;11774:52;:::i;:::-;11851:29;11873:6;11851:29;:::i;:::-;11846:3;11842:39;11835:46;;11625:262;;;;;:::o;11893:364::-;;12009:39;12042:5;12009:39;:::i;:::-;12064:71;12128:6;12123:3;12064:71;:::i;:::-;12057:78;;12144:52;12189:6;12184:3;12177:4;12170:5;12166:16;12144:52;:::i;:::-;12221:29;12243:6;12221:29;:::i;:::-;12216:3;12212:39;12205:46;;11985:272;;;;;:::o;12263:377::-;;12397:39;12430:5;12397:39;:::i;:::-;12452:89;12534:6;12529:3;12452:89;:::i;:::-;12445:96;;12550:52;12595:6;12590:3;12583:4;12576:5;12572:16;12550:52;:::i;:::-;12627:6;12622:3;12618:16;12611:23;;12373:267;;;;;:::o;12670:937::-;;12792:5;12786:12;12829:1;12818:9;12814:17;12845:1;12840:281;;;;13135:1;13130:471;;;;12807:794;;12840:281;12930:4;12926:1;12915:9;12911:17;12907:28;12955:71;13019:6;13014:3;12955:71;:::i;:::-;12948:78;;13070:4;13066:9;13055;13051:25;13046:3;13039:38;13106:4;13101:3;13097:14;13090:21;;12847:274;12840:281;;13130:471;13211:1;13200:9;13196:17;13233:71;13297:6;13292:3;13233:71;:::i;:::-;13226:78;;13332:38;13364:5;13332:38;:::i;:::-;13392:1;13406:154;13420:6;13417:1;13414:13;13406:154;;;13494:7;13488:14;13484:1;13479:3;13475:11;13468:35;13544:1;13535:7;13531:15;13520:26;;13442:4;13439:1;13435:12;13430:17;;13406:154;;;13589:1;13584:3;13580:11;13573:18;;13137:464;;;12807:794;;12759:848;;;;;:::o;13613:366::-;;13776:67;13840:2;13835:3;13776:67;:::i;:::-;13769:74;;13873:34;13869:1;13864:3;13860:11;13853:55;13939:4;13934:2;13929:3;13925:12;13918:26;13970:2;13965:3;13961:12;13954:19;;13759:220;;;:::o;13985:372::-;;14148:67;14212:2;14207:3;14148:67;:::i;:::-;14141:74;;14245:34;14241:1;14236:3;14232:11;14225:55;14311:10;14306:2;14301:3;14297:12;14290:32;14348:2;14343:3;14339:12;14332:19;;14131:226;;;:::o;14363:382::-;;14526:67;14590:2;14585:3;14526:67;:::i;:::-;14519:74;;14623:34;14619:1;14614:3;14610:11;14603:55;14689:20;14684:2;14679:3;14675:12;14668:42;14736:2;14731:3;14727:12;14720:19;;14509:236;;;:::o;14751:370::-;;14914:67;14978:2;14973:3;14914:67;:::i;:::-;14907:74;;15011:34;15007:1;15002:3;14998:11;14991:55;15077:8;15072:2;15067:3;15063:12;15056:30;15112:2;15107:3;15103:12;15096:19;;14897:224;;;:::o;15127:326::-;;15290:67;15354:2;15349:3;15290:67;:::i;:::-;15283:74;;15387:30;15383:1;15378:3;15374:11;15367:51;15444:2;15439:3;15435:12;15428:19;;15273:180;;;:::o;15459:325::-;;15622:67;15686:2;15681:3;15622:67;:::i;:::-;15615:74;;15719:29;15715:1;15710:3;15706:11;15699:50;15775:2;15770:3;15766:12;15759:19;;15605:179;;;:::o;15790:330::-;;15953:67;16017:2;16012:3;15953:67;:::i;:::-;15946:74;;16050:34;16046:1;16041:3;16037:11;16030:55;16111:2;16106:3;16102:12;16095:19;;15936:184;;;:::o;16126:368::-;;16289:67;16353:2;16348:3;16289:67;:::i;:::-;16282:74;;16386:34;16382:1;16377:3;16373:11;16366:55;16452:6;16447:2;16442:3;16438:12;16431:28;16485:2;16480:3;16476:12;16469:19;;16272:222;;;:::o;16500:323::-;;16663:67;16727:2;16722:3;16663:67;:::i;:::-;16656:74;;16760:27;16756:1;16751:3;16747:11;16740:48;16814:2;16809:3;16805:12;16798:19;;16646:177;;;:::o;16829:329::-;;16992:67;17056:2;17051:3;16992:67;:::i;:::-;16985:74;;17089:33;17085:1;17080:3;17076:11;17069:54;17149:2;17144:3;17140:12;17133:19;;16975:183;;;:::o;17164:328::-;;17327:67;17391:2;17386:3;17327:67;:::i;:::-;17320:74;;17424:32;17420:1;17415:3;17411:11;17404:53;17483:2;17478:3;17474:12;17467:19;;17310:182;;;:::o;17498:370::-;;17661:67;17725:2;17720:3;17661:67;:::i;:::-;17654:74;;17758:34;17754:1;17749:3;17745:11;17738:55;17824:8;17819:2;17814:3;17810:12;17803:30;17859:2;17854:3;17850:12;17843:19;;17644:224;;;:::o;17874:376::-;;18037:67;18101:2;18096:3;18037:67;:::i;:::-;18030:74;;18134:34;18130:1;18125:3;18121:11;18114:55;18200:14;18195:2;18190:3;18186:12;18179:36;18241:2;18236:3;18232:12;18225:19;;18020:230;;;:::o;18256:365::-;;18419:67;18483:2;18478:3;18419:67;:::i;:::-;18412:74;;18516:34;18512:1;18507:3;18503:11;18496:55;18582:3;18577:2;18572:3;18568:12;18561:25;18612:2;18607:3;18603:12;18596:19;;18402:219;;;:::o;18627:365::-;;18790:67;18854:2;18849:3;18790:67;:::i;:::-;18783:74;;18887:34;18883:1;18878:3;18874:11;18867:55;18953:3;18948:2;18943:3;18939:12;18932:25;18983:2;18978:3;18974:12;18967:19;;18773:219;;;:::o;18998:388::-;;19161:67;19225:2;19220:3;19161:67;:::i;:::-;19154:74;;19258:34;19254:1;19249:3;19245:11;19238:55;19324:26;19319:2;19314:3;19310:12;19303:48;19377:2;19372:3;19368:12;19361:19;;19144:242;;;:::o;19392:374::-;;19555:67;19619:2;19614:3;19555:67;:::i;:::-;19548:74;;19652:34;19648:1;19643:3;19639:11;19632:55;19718:12;19713:2;19708:3;19704:12;19697:34;19757:2;19752:3;19748:12;19741:19;;19538:228;;;:::o;19772:325::-;;19935:67;19999:2;19994:3;19935:67;:::i;:::-;19928:74;;20032:29;20028:1;20023:3;20019:11;20012:50;20088:2;20083:3;20079:12;20072:19;;19918:179;;;:::o;20103:374::-;;20266:67;20330:2;20325:3;20266:67;:::i;:::-;20259:74;;20363:34;20359:1;20354:3;20350:11;20343:55;20429:12;20424:2;20419:3;20415:12;20408:34;20468:2;20463:3;20459:12;20452:19;;20249:228;;;:::o;20483:366::-;;20646:67;20710:2;20705:3;20646:67;:::i;:::-;20639:74;;20743:34;20739:1;20734:3;20730:11;20723:55;20809:4;20804:2;20799:3;20795:12;20788:26;20840:2;20835:3;20831:12;20824:19;;20629:220;;;:::o;20855:330::-;;21018:67;21082:2;21077:3;21018:67;:::i;:::-;21011:74;;21115:34;21111:1;21106:3;21102:11;21095:55;21176:2;21171:3;21167:12;21160:19;;21001:184;;;:::o;21191:325::-;;21354:67;21418:2;21413:3;21354:67;:::i;:::-;21347:74;;21451:29;21447:1;21442:3;21438:11;21431:50;21507:2;21502:3;21498:12;21491:19;;21337:179;;;:::o;21522:365::-;;21685:67;21749:2;21744:3;21685:67;:::i;:::-;21678:74;;21782:34;21778:1;21773:3;21769:11;21762:55;21848:3;21843:2;21838:3;21834:12;21827:25;21878:2;21873:3;21869:12;21862:19;;21668:219;;;:::o;21893:376::-;;22056:67;22120:2;22115:3;22056:67;:::i;:::-;22049:74;;22153:34;22149:1;22144:3;22140:11;22133:55;22219:14;22214:2;22209:3;22205:12;22198:36;22260:2;22255:3;22251:12;22244:19;;22039:230;;;:::o;22275:330::-;;22438:67;22502:2;22497:3;22438:67;:::i;:::-;22431:74;;22535:34;22531:1;22526:3;22522:11;22515:55;22596:2;22591:3;22587:12;22580:19;;22421:184;;;:::o;22611:373::-;;22774:67;22838:2;22833:3;22774:67;:::i;:::-;22767:74;;22871:34;22867:1;22862:3;22858:11;22851:55;22937:11;22932:2;22927:3;22923:12;22916:33;22975:2;22970:3;22966:12;22959:19;;22757:227;;;:::o;22990:379::-;;23153:67;23217:2;23212:3;23153:67;:::i;:::-;23146:74;;23250:34;23246:1;23241:3;23237:11;23230:55;23316:17;23311:2;23306:3;23302:12;23295:39;23360:2;23355:3;23351:12;23344:19;;23136:233;;;:::o;23375:367::-;;23538:67;23602:2;23597:3;23538:67;:::i;:::-;23531:74;;23635:34;23631:1;23626:3;23622:11;23615:55;23701:5;23696:2;23691:3;23687:12;23680:27;23733:2;23728:3;23724:12;23717:19;;23521:221;;;:::o;23748:365::-;;23911:67;23975:2;23970:3;23911:67;:::i;:::-;23904:74;;24008:34;24004:1;23999:3;23995:11;23988:55;24074:3;24069:2;24064:3;24060:12;24053:25;24104:2;24099:3;24095:12;24088:19;;23894:219;;;:::o;24119:320::-;;24282:67;24346:2;24341:3;24282:67;:::i;:::-;24275:74;;24379:24;24375:1;24370:3;24366:11;24359:45;24430:2;24425:3;24421:12;24414:19;;24265:174;;;:::o;24445:381::-;;24608:67;24672:2;24667:3;24608:67;:::i;:::-;24601:74;;24705:34;24701:1;24696:3;24692:11;24685:55;24771:19;24766:2;24761:3;24757:12;24750:41;24817:2;24812:3;24808:12;24801:19;;24591:235;;;:::o;24832:327::-;;24995:67;25059:2;25054:3;24995:67;:::i;:::-;24988:74;;25092:31;25088:1;25083:3;25079:11;25072:52;25150:2;25145:3;25141:12;25134:19;;24978:181;;;:::o;25165:108::-;25242:24;25260:5;25242:24;:::i;:::-;25237:3;25230:37;25220:53;;:::o;25279:118::-;25366:24;25384:5;25366:24;:::i;:::-;25361:3;25354:37;25344:53;;:::o;25403:271::-;;25555:93;25644:3;25635:6;25555:93;:::i;:::-;25548:100;;25665:3;25658:10;;25537:137;;;;:::o;25680:273::-;;25833:94;25923:3;25914:6;25833:94;:::i;:::-;25826:101;;25944:3;25937:10;;25815:138;;;;:::o;25959:435::-;;26161:95;26252:3;26243:6;26161:95;:::i;:::-;26154:102;;26273:95;26364:3;26355:6;26273:95;:::i;:::-;26266:102;;26385:3;26378:10;;26143:251;;;;;:::o;26400:222::-;;26531:2;26520:9;26516:18;26508:26;;26544:71;26612:1;26601:9;26597:17;26588:6;26544:71;:::i;:::-;26498:124;;;;:::o;26628:672::-;;26877:3;26866:9;26862:19;26854:27;;26891:87;26975:1;26964:9;26960:17;26951:6;26891:87;:::i;:::-;26988:72;27056:2;27045:9;27041:18;27032:6;26988:72;:::i;:::-;27070;27138:2;27127:9;27123:18;27114:6;27070:72;:::i;:::-;27189:9;27183:4;27179:20;27174:2;27163:9;27159:18;27152:48;27217:76;27288:4;27279:6;27217:76;:::i;:::-;27209:84;;26844:456;;;;;;;:::o;27306:549::-;;27521:2;27510:9;27506:18;27498:26;;27534:79;27610:1;27599:9;27595:17;27586:6;27534:79;:::i;:::-;27623:72;27691:2;27680:9;27676:18;27667:6;27623:72;:::i;:::-;27742:9;27736:4;27732:20;27727:2;27716:9;27712:18;27705:48;27770:78;27843:4;27834:6;27770:78;:::i;:::-;27762:86;;27488:367;;;;;;:::o;27861:413::-;;28062:2;28051:9;28047:18;28039:26;;28111:9;28105:4;28101:20;28097:1;28086:9;28082:17;28075:47;28139:128;28262:4;28253:6;28139:128;:::i;:::-;28131:136;;28029:245;;;;:::o;28280:373::-;;28461:2;28450:9;28446:18;28438:26;;28510:9;28504:4;28500:20;28496:1;28485:9;28481:17;28474:47;28538:108;28641:4;28632:6;28538:108;:::i;:::-;28530:116;;28428:225;;;;:::o;28659:210::-;;28784:2;28773:9;28769:18;28761:26;;28797:65;28859:1;28848:9;28844:17;28835:6;28797:65;:::i;:::-;28751:118;;;;:::o;28875:313::-;;29026:2;29015:9;29011:18;29003:26;;29075:9;29069:4;29065:20;29061:1;29050:9;29046:17;29039:47;29103:78;29176:4;29167:6;29103:78;:::i;:::-;29095:86;;28993:195;;;;:::o;29194:307::-;;29342:2;29331:9;29327:18;29319:26;;29391:9;29385:4;29381:20;29377:1;29366:9;29362:17;29355:47;29419:75;29489:4;29480:6;29419:75;:::i;:::-;29411:83;;29309:192;;;;:::o;29507:419::-;;29711:2;29700:9;29696:18;29688:26;;29760:9;29754:4;29750:20;29746:1;29735:9;29731:17;29724:47;29788:131;29914:4;29788:131;:::i;:::-;29780:139;;29678:248;;;:::o;29932:419::-;;30136:2;30125:9;30121:18;30113:26;;30185:9;30179:4;30175:20;30171:1;30160:9;30156:17;30149:47;30213:131;30339:4;30213:131;:::i;:::-;30205:139;;30103:248;;;:::o;30357:419::-;;30561:2;30550:9;30546:18;30538:26;;30610:9;30604:4;30600:20;30596:1;30585:9;30581:17;30574:47;30638:131;30764:4;30638:131;:::i;:::-;30630:139;;30528:248;;;:::o;30782:419::-;;30986:2;30975:9;30971:18;30963:26;;31035:9;31029:4;31025:20;31021:1;31010:9;31006:17;30999:47;31063:131;31189:4;31063:131;:::i;:::-;31055:139;;30953:248;;;:::o;31207:419::-;;31411:2;31400:9;31396:18;31388:26;;31460:9;31454:4;31450:20;31446:1;31435:9;31431:17;31424:47;31488:131;31614:4;31488:131;:::i;:::-;31480:139;;31378:248;;;:::o;31632:419::-;;31836:2;31825:9;31821:18;31813:26;;31885:9;31879:4;31875:20;31871:1;31860:9;31856:17;31849:47;31913:131;32039:4;31913:131;:::i;:::-;31905:139;;31803:248;;;:::o;32057:419::-;;32261:2;32250:9;32246:18;32238:26;;32310:9;32304:4;32300:20;32296:1;32285:9;32281:17;32274:47;32338:131;32464:4;32338:131;:::i;:::-;32330:139;;32228:248;;;:::o;32482:419::-;;32686:2;32675:9;32671:18;32663:26;;32735:9;32729:4;32725:20;32721:1;32710:9;32706:17;32699:47;32763:131;32889:4;32763:131;:::i;:::-;32755:139;;32653:248;;;:::o;32907:419::-;;33111:2;33100:9;33096:18;33088:26;;33160:9;33154:4;33150:20;33146:1;33135:9;33131:17;33124:47;33188:131;33314:4;33188:131;:::i;:::-;33180:139;;33078:248;;;:::o;33332:419::-;;33536:2;33525:9;33521:18;33513:26;;33585:9;33579:4;33575:20;33571:1;33560:9;33556:17;33549:47;33613:131;33739:4;33613:131;:::i;:::-;33605:139;;33503:248;;;:::o;33757:419::-;;33961:2;33950:9;33946:18;33938:26;;34010:9;34004:4;34000:20;33996:1;33985:9;33981:17;33974:47;34038:131;34164:4;34038:131;:::i;:::-;34030:139;;33928:248;;;:::o;34182:419::-;;34386:2;34375:9;34371:18;34363:26;;34435:9;34429:4;34425:20;34421:1;34410:9;34406:17;34399:47;34463:131;34589:4;34463:131;:::i;:::-;34455:139;;34353:248;;;:::o;34607:419::-;;34811:2;34800:9;34796:18;34788:26;;34860:9;34854:4;34850:20;34846:1;34835:9;34831:17;34824:47;34888:131;35014:4;34888:131;:::i;:::-;34880:139;;34778:248;;;:::o;35032:419::-;;35236:2;35225:9;35221:18;35213:26;;35285:9;35279:4;35275:20;35271:1;35260:9;35256:17;35249:47;35313:131;35439:4;35313:131;:::i;:::-;35305:139;;35203:248;;;:::o;35457:419::-;;35661:2;35650:9;35646:18;35638:26;;35710:9;35704:4;35700:20;35696:1;35685:9;35681:17;35674:47;35738:131;35864:4;35738:131;:::i;:::-;35730:139;;35628:248;;;:::o;35882:419::-;;36086:2;36075:9;36071:18;36063:26;;36135:9;36129:4;36125:20;36121:1;36110:9;36106:17;36099:47;36163:131;36289:4;36163:131;:::i;:::-;36155:139;;36053:248;;;:::o;36307:419::-;;36511:2;36500:9;36496:18;36488:26;;36560:9;36554:4;36550:20;36546:1;36535:9;36531:17;36524:47;36588:131;36714:4;36588:131;:::i;:::-;36580:139;;36478:248;;;:::o;36732:419::-;;36936:2;36925:9;36921:18;36913:26;;36985:9;36979:4;36975:20;36971:1;36960:9;36956:17;36949:47;37013:131;37139:4;37013:131;:::i;:::-;37005:139;;36903:248;;;:::o;37157:419::-;;37361:2;37350:9;37346:18;37338:26;;37410:9;37404:4;37400:20;37396:1;37385:9;37381:17;37374:47;37438:131;37564:4;37438:131;:::i;:::-;37430:139;;37328:248;;;:::o;37582:419::-;;37786:2;37775:9;37771:18;37763:26;;37835:9;37829:4;37825:20;37821:1;37810:9;37806:17;37799:47;37863:131;37989:4;37863:131;:::i;:::-;37855:139;;37753:248;;;:::o;38007:419::-;;38211:2;38200:9;38196:18;38188:26;;38260:9;38254:4;38250:20;38246:1;38235:9;38231:17;38224:47;38288:131;38414:4;38288:131;:::i;:::-;38280:139;;38178:248;;;:::o;38432:419::-;;38636:2;38625:9;38621:18;38613:26;;38685:9;38679:4;38675:20;38671:1;38660:9;38656:17;38649:47;38713:131;38839:4;38713:131;:::i;:::-;38705:139;;38603:248;;;:::o;38857:419::-;;39061:2;39050:9;39046:18;39038:26;;39110:9;39104:4;39100:20;39096:1;39085:9;39081:17;39074:47;39138:131;39264:4;39138:131;:::i;:::-;39130:139;;39028:248;;;:::o;39282:419::-;;39486:2;39475:9;39471:18;39463:26;;39535:9;39529:4;39525:20;39521:1;39510:9;39506:17;39499:47;39563:131;39689:4;39563:131;:::i;:::-;39555:139;;39453:248;;;:::o;39707:419::-;;39911:2;39900:9;39896:18;39888:26;;39960:9;39954:4;39950:20;39946:1;39935:9;39931:17;39924:47;39988:131;40114:4;39988:131;:::i;:::-;39980:139;;39878:248;;;:::o;40132:419::-;;40336:2;40325:9;40321:18;40313:26;;40385:9;40379:4;40375:20;40371:1;40360:9;40356:17;40349:47;40413:131;40539:4;40413:131;:::i;:::-;40405:139;;40303:248;;;:::o;40557:419::-;;40761:2;40750:9;40746:18;40738:26;;40810:9;40804:4;40800:20;40796:1;40785:9;40781:17;40774:47;40838:131;40964:4;40838:131;:::i;:::-;40830:139;;40728:248;;;:::o;40982:419::-;;41186:2;41175:9;41171:18;41163:26;;41235:9;41229:4;41225:20;41221:1;41210:9;41206:17;41199:47;41263:131;41389:4;41263:131;:::i;:::-;41255:139;;41153:248;;;:::o;41407:419::-;;41611:2;41600:9;41596:18;41588:26;;41660:9;41654:4;41650:20;41646:1;41635:9;41631:17;41624:47;41688:131;41814:4;41688:131;:::i;:::-;41680:139;;41578:248;;;:::o;41832:419::-;;42036:2;42025:9;42021:18;42013:26;;42085:9;42079:4;42075:20;42071:1;42060:9;42056:17;42049:47;42113:131;42239:4;42113:131;:::i;:::-;42105:139;;42003:248;;;:::o;42257:419::-;;42461:2;42450:9;42446:18;42438:26;;42510:9;42504:4;42500:20;42496:1;42485:9;42481:17;42474:47;42538:131;42664:4;42538:131;:::i;:::-;42530:139;;42428:248;;;:::o;42682:419::-;;42886:2;42875:9;42871:18;42863:26;;42935:9;42929:4;42925:20;42921:1;42910:9;42906:17;42899:47;42963:131;43089:4;42963:131;:::i;:::-;42955:139;;42853:248;;;:::o;43107:222::-;;43238:2;43227:9;43223:18;43215:26;;43251:71;43319:1;43308:9;43304:17;43295:6;43251:71;:::i;:::-;43205:124;;;;:::o;43335:278::-;;43401:2;43395:9;43385:19;;43443:4;43435:6;43431:17;43550:6;43538:10;43535:22;43514:18;43502:10;43499:34;43496:62;43493:2;;;43561:13;;:::i;:::-;43493:2;43596:10;43592:2;43585:22;43375:238;;;;:::o;43619:326::-;;43770:18;43762:6;43759:30;43756:2;;;43792:13;;:::i;:::-;43756:2;43872:4;43868:9;43861:4;43853:6;43849:17;43845:33;43837:41;;43933:4;43927;43923:15;43915:23;;43685:260;;;:::o;43951:327::-;;44103:18;44095:6;44092:30;44089:2;;;44125:13;;:::i;:::-;44089:2;44205:4;44201:9;44194:4;44186:6;44182:17;44178:33;44170:41;;44266:4;44260;44256:15;44248:23;;44018:260;;;:::o;44284:142::-;;44384:3;44376:11;;44414:4;44409:3;44405:14;44397:22;;44366:60;;;:::o;44432:132::-;;44522:3;44514:11;;44552:4;44547:3;44543:14;44535:22;;44504:60;;;:::o;44570:144::-;;44645:3;44637:11;;44668:3;44665:1;44658:14;44702:4;44699:1;44689:18;44681:26;;44627:87;;;:::o;44720:141::-;;44792:3;44784:11;;44815:3;44812:1;44805:14;44849:4;44846:1;44836:18;44828:26;;44774:87;;;:::o;44867:124::-;;44978:5;44972:12;44962:22;;44951:40;;;:::o;44997:114::-;;45098:5;45092:12;45082:22;;45071:40;;;:::o;45117:98::-;;45202:5;45196:12;45186:22;;45175:40;;;:::o;45221:99::-;;45307:5;45301:12;45291:22;;45280:40;;;:::o;45326:123::-;;45438:4;45433:3;45429:14;45421:22;;45411:38;;;:::o;45455:113::-;;45557:4;45552:3;45548:14;45540:22;;45530:38;;;:::o;45574:194::-;;45717:6;45712:3;45705:19;45757:4;45752:3;45748:14;45733:29;;45695:73;;;;:::o;45774:184::-;;45907:6;45902:3;45895:19;45947:4;45942:3;45938:14;45923:29;;45885:73;;;;:::o;45964:168::-;;46081:6;46076:3;46069:19;46121:4;46116:3;46112:14;46097:29;;46059:73;;;;:::o;46138:147::-;;46276:3;46261:18;;46251:34;;;;:::o;46291:159::-;;46399:6;46394:3;46387:19;46439:4;46434:3;46430:14;46415:29;;46377:73;;;;:::o;46456:169::-;;46574:6;46569:3;46562:19;46614:4;46609:3;46605:14;46590:29;;46552:73;;;;:::o;46631:148::-;;46770:3;46755:18;;46745:34;;;;:::o;46785:96::-;;46851:24;46869:5;46851:24;:::i;:::-;46840:35;;46830:51;;;:::o;46887:104::-;;46961:24;46979:5;46961:24;:::i;:::-;46950:35;;46940:51;;;:::o;46997:90::-;;47074:5;47067:13;47060:21;47049:32;;47039:48;;;:::o;47093:77::-;;47159:5;47148:16;;47138:32;;;:::o;47176:149::-;;47252:66;47245:5;47241:78;47230:89;;47220:105;;;:::o;47331:126::-;;47408:42;47401:5;47397:54;47386:65;;47376:81;;;:::o;47463:77::-;;47529:5;47518:16;;47508:32;;;:::o;47546:134::-;;47637:37;47668:5;47637:37;:::i;:::-;47624:50;;47614:66;;;:::o;47686:126::-;;47769:37;47800:5;47769:37;:::i;:::-;47756:50;;47746:66;;;:::o;47818:113::-;;47901:24;47919:5;47901:24;:::i;:::-;47888:37;;47878:53;;;:::o;47937:154::-;48021:6;48016:3;48011;47998:30;48083:1;48074:6;48069:3;48065:16;48058:27;47988:103;;;:::o;48097:307::-;48165:1;48175:113;48189:6;48186:1;48183:13;48175:113;;;48274:1;48269:3;48265:11;48259:18;48255:1;48250:3;48246:11;48239:39;48211:2;48208:1;48204:10;48199:15;;48175:113;;;48306:6;48303:1;48300:13;48297:2;;;48386:1;48377:6;48372:3;48368:16;48361:27;48297:2;48146:258;;;;:::o;48410:48::-;48443:9;48464:102;;48556:2;48552:7;48547:2;48540:5;48536:14;48532:28;48522:38;;48512:54;;;:::o;48572:122::-;48645:24;48663:5;48645:24;:::i;:::-;48638:5;48635:35;48625:2;;48684:1;48681;48674:12;48625:2;48615:79;:::o;48700:116::-;48770:21;48785:5;48770:21;:::i;:::-;48763:5;48760:32;48750:2;;48806:1;48803;48796:12;48750:2;48740:76;:::o;48822:122::-;48895:24;48913:5;48895:24;:::i;:::-;48888:5;48885:35;48875:2;;48934:1;48931;48924:12;48875:2;48865:79;:::o;48950:120::-;49022:23;49039:5;49022:23;:::i;:::-;49015:5;49012:34;49002:2;;49060:1;49057;49050:12;49002:2;48992:78;:::o;49076:122::-;49149:24;49167:5;49149:24;:::i;:::-;49142:5;49139:35;49129:2;;49188:1;49185;49178:12;49129:2;49119:79;:::o

Swarm Source

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