ETH Price: $3,404.18 (+2.78%)
Gas: 7.8 Gwei

Token

BIG BUCKS (BB)
 

Overview

Max Total Supply

888 BB

Holders

362

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
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:
BIGBUCKS

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// GO TO LINE 1904 TO SEE WHERE THE BIGBUCKS CONTRACT STARTS
 
// 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;
    }

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

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

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


// Deer Pixel Art.



pragma solidity ^0.7.0;
pragma abicoder v2;

contract BIGBUCKS is ERC721, Ownable {
    
    using SafeMath for uint256;

    string public DEER_PROVENANCE = "d452329c4c6b6d88dea3d273974331d22563d834a1c7fb85c1952878646abd3d"; // IPFS URL WILL BE ADDED WHEN BUCKS 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 deerPrice = 30000000000000000; // 0.03 ETH

    uint public constant maxDeerPurchase = 50;

    uint256 public constant MAX_DEER = 888;

    bool public saleIsActive = false;
    
    mapping(uint => string) public deerNames;
    
    // Reserve 20 BUCKS for team - Giveaways/Prizes etc
    uint public deerReserve = 20;
    
    
    
    event licenseisLocked(string _licenseText);

    constructor() ERC721("BIG BUCKS", "BB") { }
    
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        msg.sender.transfer(balance);
    }
    
    function reserveDeer(address _to, uint256 _reserveAmount) public onlyOwner {        
        uint supply = totalSupply();
        require(_reserveAmount > 0 && _reserveAmount <= deerReserve, "Not enough reserve left for team");
        for (uint i = 0; i < _reserveAmount; i++) {
            _safeMint(_to, supply + i);
        }
        deerReserve = deerReserve.sub(_reserveAmount);
    }


    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        DEER_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 BUCK WITHIN RANGE");
        return LICENSE_TEXT;
    }
    
    // Locks the license to prevent further changes 
    function lockLicense() public onlyOwner {
        licenseLocked =  true;
        emit licenseisLocked(LICENSE_TEXT);
    }
    
    // Change the license
    function changeLicense(string memory _license) public onlyOwner {
        require(licenseLocked == false, "License already locked");
        LICENSE_TEXT = _license;
    }
    
    
    function mintBigBucks(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint BIG BUCKS");
        require(numberOfTokens > 0 && numberOfTokens <= maxDeerPurchase, "Can only mint 50 tokens at a time");
        require(totalSupply().add(numberOfTokens) <= MAX_DEER, "Purchase would exceed max supply of BUCKS");
        require(msg.value >= deerPrice.mul(numberOfTokens), "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_DEER) {
                _safeMint(msg.sender, mintIndex);
            }
        }

    }
     
        
   
    
    
    // GET ALL DEER OF A WALLET AS AN ARRAY OF STRINGS. WOULD BE BETTER MAYBE IF IT RETURNED A STRUCT WITH ID-NAME MATCH
    function deerNamesOfOwner(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] = deerNames[ 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"},{"inputs":[],"name":"DEER_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_DEER","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":"","type":"uint256"}],"name":"deerNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"deerNamesOfOwner","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deerPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deerReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"maxDeerPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintBigBucks","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":"reserveDeer","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":"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060600160405280604081526020016200519660409139600b9080519060200190620000359291906200033e565b5060405180602001604052806000815250600c90805190602001906200005d9291906200033e565b506000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506014600f55348015620000a657600080fd5b506040518060400160405280600981526020017f424947204255434b5300000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f42420000000000000000000000000000000000000000000000000000000000008152506200012b6301ffc9a760e01b6200025e60201b60201c565b8160069080519060200190620001439291906200033e565b5080600790805190602001906200015c9291906200033e565b50620001756380ac58cd60e01b6200025e60201b60201c565b6200018d635b5e139f60e01b6200025e60201b60201c565b620001a563780e9d6360e01b6200025e60201b60201c565b50506000620001b96200033660201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000469565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002ca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002c19062000436565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620003765760008555620003c2565b82601f106200039157805160ff1916838001178555620003c2565b82800160010185558215620003c2579182015b82811115620003c1578251825591602001919060010190620003a4565b5b509050620003d19190620003d5565b5090565b5b80821115620003f0576000816000905550600101620003d6565b5090565b600062000403601c8362000458565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600060208201905081810360008301526200045181620003f4565b9050919050565b600082825260208201905092915050565b614d1d80620004796000396000f3fe6080604052600436106102305760003560e01c8063700dadf41161012e578063b7bc8ccc116100ab578063d9b137b21161006f578063d9b137b21461082e578063e985e9c51461086b578063eb8d2444146108a8578063f14bd3d4146108d3578063f2fde38b146108fe57610230565b8063b7bc8ccc1461075b578063b88d4fde14610786578063bf4702fc146107af578063c72fe995146107c6578063c87b56dd146107f157610230565b80638da5cb5b116100f25780638da5cb5b1461068857806395d89b41146106b35780639c3e72bd146106de578063a22cb46514610709578063b09904b51461073257610230565b8063700dadf41461058f57806370a08231146105ba578063715018a6146105f75780637741fd9f1461060e5780638462151c1461064b57610230565b8063264b204e116101bc57806342842e0e1161018057806342842e0e146104985780634f6ccce7146104c157806355f804b3146104fe5780636352211e146105275780636c0360eb1461056457610230565b8063264b204e146103d457806327582fe5146104115780632f745c591461042d57806334918dfd1461046a5780633ccfd60b1461048157610230565b80631096952311610203578063109695231461030357806315702f5f1461032c57806318160ddd1461035557806323b872dd1461038057806324ac0907146103a957610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613750565b610927565b60405161026991906145c4565b60405180910390f35b34801561027e57600080fd5b5061028761098e565b60405161029491906145df565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906137e3565b610a30565b6040516102d19190614519565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190613714565b610ab5565b005b34801561030f57600080fd5b5061032a600480360381019061032591906137a2565b610bcd565b005b34801561033857600080fd5b50610353600480360381019061034e9190613714565b610c63565b005b34801561036157600080fd5b5061036a610d81565b60405161037791906149c3565b60405180910390f35b34801561038c57600080fd5b506103a760048036038101906103a2919061360e565b610d92565b005b3480156103b557600080fd5b506103be610df2565b6040516103cb91906149c3565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f691906137e3565b610df8565b60405161040891906145df565b60405180910390f35b61042b600480360381019061042691906137e3565b610ea8565b005b34801561043957600080fd5b50610454600480360381019061044f9190613714565b611046565b60405161046191906149c3565b60405180910390f35b34801561047657600080fd5b5061047f6110a1565b005b34801561048d57600080fd5b50610496611149565b005b3480156104a457600080fd5b506104bf60048036038101906104ba919061360e565b611214565b005b3480156104cd57600080fd5b506104e860048036038101906104e391906137e3565b611234565b6040516104f591906149c3565b60405180910390f35b34801561050a57600080fd5b50610525600480360381019061052091906137a2565b611257565b005b34801561053357600080fd5b5061054e600480360381019061054991906137e3565b6112df565b60405161055b9190614519565b60405180910390f35b34801561057057600080fd5b50610579611316565b60405161058691906145df565b60405180910390f35b34801561059b57600080fd5b506105a46113b8565b6040516105b191906149c3565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc91906135a9565b6113be565b6040516105ee91906149c3565b60405180910390f35b34801561060357600080fd5b5061060c61147d565b005b34801561061a57600080fd5b50610635600480360381019061063091906135a9565b6115ba565b6040516106429190614580565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d91906135a9565b611767565b60405161067f91906145a2565b60405180910390f35b34801561069457600080fd5b5061069d611860565b6040516106aa9190614519565b60405180910390f35b3480156106bf57600080fd5b506106c861188a565b6040516106d591906145df565b60405180910390f35b3480156106ea57600080fd5b506106f361192c565b60405161070091906145df565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b91906136d8565b6119ca565b005b34801561073e57600080fd5b50610759600480360381019061075491906137a2565b611b4b565b005b34801561076757600080fd5b50610770611c37565b60405161077d91906149c3565b60405180910390f35b34801561079257600080fd5b506107ad60048036038101906107a8919061365d565b611c42565b005b3480156107bb57600080fd5b506107c4611ca4565b005b3480156107d257600080fd5b506107db611d75565b6040516107e891906145df565b60405180910390f35b3480156107fd57600080fd5b50610818600480360381019061081391906137e3565b611e13565b60405161082591906145df565b60405180910390f35b34801561083a57600080fd5b50610855600480360381019061085091906137e3565b611f96565b60405161086291906145df565b60405180910390f35b34801561087757600080fd5b50610892600480360381019061088d91906135d2565b612083565b60405161089f91906145c4565b60405180910390f35b3480156108b457600080fd5b506108bd612117565b6040516108ca91906145c4565b60405180910390f35b3480156108df57600080fd5b506108e861212a565b6040516108f591906149c3565b60405180910390f35b34801561090a57600080fd5b50610925600480360381019061092091906135a9565b61212f565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a265780601f106109fb57610100808354040283529160200191610a26565b820191906000526020600020905b815481529060010190602001808311610a0957829003601f168201915b5050505050905090565b6000610a3b826122db565b610a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7190614863565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac0826112df565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906148e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b506122f8565b73ffffffffffffffffffffffffffffffffffffffff161480610b7f5750610b7e81610b796122f8565b612083565b5b610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb5906147a3565b60405180910390fd5b610bc88383612300565b505050565b610bd56122f8565b73ffffffffffffffffffffffffffffffffffffffff16610bf3611860565b73ffffffffffffffffffffffffffffffffffffffff1614610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4090614883565b60405180910390fd5b80600b9080519060200190610c5f9291906133c5565b5050565b610c6b6122f8565b73ffffffffffffffffffffffffffffffffffffffff16610c89611860565b73ffffffffffffffffffffffffffffffffffffffff1614610cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd690614883565b60405180910390fd5b6000610ce9610d81565b9050600082118015610cfd5750600f548211155b610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d33906146c3565b60405180910390fd5b60005b82811015610d6057610d53848284016123b9565b8080600101915050610d3f565b50610d7682600f546123d790919063ffffffff16565b600f81905550505050565b6000610d8d6002612427565b905090565b610da3610d9d6122f8565b8261243c565b610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990614943565b60405180910390fd5b610ded83838361251a565b505050565b600f5481565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ea05780601f10610e7557610100808354040283529160200191610ea0565b820191906000526020600020905b815481529060010190602001808311610e8357829003601f168201915b505050505081565b600d60019054906101000a900460ff16610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90614903565b60405180910390fd5b600081118015610f08575060328111155b610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e906147c3565b60405180910390fd5b610378610f6482610f56610d81565b61273190919063ffffffff16565b1115610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c906149a3565b60405180910390fd5b610fbf81666a94d74f43000061278690919063ffffffff16565b341015611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff890614723565b60405180910390fd5b60005b81811015611042576000611016610d81565b9050610378611023610d81565b10156110345761103333826123b9565b5b508080600101915050611004565b5050565b600061109982600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206127f690919063ffffffff16565b905092915050565b6110a96122f8565b73ffffffffffffffffffffffffffffffffffffffff166110c7611860565b73ffffffffffffffffffffffffffffffffffffffff161461111d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111490614883565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b6111516122f8565b73ffffffffffffffffffffffffffffffffffffffff1661116f611860565b73ffffffffffffffffffffffffffffffffffffffff16146111c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bc90614883565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611210573d6000803e3d6000fd5b5050565b61122f83838360405180602001604052806000815250611c42565b505050565b60008061124b83600261281090919063ffffffff16565b50905080915050919050565b61125f6122f8565b73ffffffffffffffffffffffffffffffffffffffff1661127d611860565b73ffffffffffffffffffffffffffffffffffffffff16146112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90614883565b60405180910390fd5b6112dc8161283c565b50565b600061130f82604051806060016040528060298152602001614cbf6029913960026128569092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ae5780601f10611383576101008083540402835291602001916113ae565b820191906000526020600020905b81548152906001019060200180831161139157829003601f168201915b5050505050905090565b61037881565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561142f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611426906147e3565b60405180910390fd5b611476600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612875565b9050919050565b6114856122f8565b73ffffffffffffffffffffffffffffffffffffffff166114a3611860565b73ffffffffffffffffffffffffffffffffffffffff16146114f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f090614883565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b606060006115c7836113be565b9050600081141561162757600067ffffffffffffffff811180156115ea57600080fd5b5060405190808252806020026020018201604052801561161e57816020015b60608152602001906001900390816116095790505b50915050611762565b60008167ffffffffffffffff8111801561164057600080fd5b5060405190808252806020026020018201604052801561167457816020015b606081526020019060019003908161165f5790505b50905060005b8281101561175b57600e60006116908784611046565b81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117325780601f1061170757610100808354040283529160200191611732565b820191906000526020600020905b81548152906001019060200180831161171557829003601f168201915b505050505082828151811061174357fe5b6020026020010181905250808060010191505061167a565b8193505050505b919050565b60606000611774836113be565b905060008114156117cf57600067ffffffffffffffff8111801561179757600080fd5b506040519080825280602002602001820160405280156117c65781602001602082028036833780820191505090505b5091505061185b565b60008167ffffffffffffffff811180156117e857600080fd5b506040519080825280602002602001820160405280156118175781602001602082028036833780820191505090505b50905060005b828110156118545761182f8582611046565b82828151811061183b57fe5b602002602001018181525050808060010191505061181d565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119225780601f106118f757610100808354040283529160200191611922565b820191906000526020600020905b81548152906001019060200180831161190557829003601f168201915b5050505050905090565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119c25780601f10611997576101008083540402835291602001916119c2565b820191906000526020600020905b8154815290600101906020018083116119a557829003601f168201915b505050505081565b6119d26122f8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3790614703565b60405180910390fd5b8060056000611a4d6122f8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611afa6122f8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b3f91906145c4565b60405180910390a35050565b611b536122f8565b73ffffffffffffffffffffffffffffffffffffffff16611b71611860565b73ffffffffffffffffffffffffffffffffffffffff1614611bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbe90614883565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514611c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1490614923565b60405180910390fd5b80600c9080519060200190611c339291906133c5565b5050565b666a94d74f43000081565b611c53611c4d6122f8565b8361243c565b611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8990614943565b60405180910390fd5b611c9e8484848461288a565b50505050565b611cac6122f8565b73ffffffffffffffffffffffffffffffffffffffff16611cca611860565b73ffffffffffffffffffffffffffffffffffffffff1614611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1790614883565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600c604051611d6b9190614601565b60405180910390a1565b600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e0b5780601f10611de057610100808354040283529160200191611e0b565b820191906000526020600020905b815481529060010190602001808311611dee57829003601f168201915b505050505081565b6060611e1e826122db565b611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e54906148c3565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f065780601f10611edb57610100808354040283529160200191611f06565b820191906000526020600020905b815481529060010190602001808311611ee957829003601f168201915b505050505090506000611f17611316565b9050600081511415611f2d578192505050611f91565b600082511115611f62578082604051602001611f4a9291906144f5565b60405160208183030381529060405292505050611f91565b80611f6c856128e6565b604051602001611f7d9291906144f5565b604051602081830303815290604052925050505b919050565b6060611fa0610d81565b8210611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd890614983565b60405180910390fd5b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120775780601f1061204c57610100808354040283529160200191612077565b820191906000526020600020905b81548152906001019060200180831161205a57829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60019054906101000a900460ff1681565b603281565b6121376122f8565b73ffffffffffffffffffffffffffffffffffffffff16612155611860565b73ffffffffffffffffffffffffffffffffffffffff16146121ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a290614883565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561221b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221290614663565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006122f1826002612a2d90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612373836112df565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6123d3828260405180602001604052806000815250612a47565b5050565b60008282111561241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241390614743565b60405180910390fd5b818303905092915050565b600061243582600001612aa2565b9050919050565b6000612447826122db565b612486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247d90614783565b60405180910390fd5b6000612491836112df565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061250057508373ffffffffffffffffffffffffffffffffffffffff166124e884610a30565b73ffffffffffffffffffffffffffffffffffffffff16145b8061251157506125108185612083565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661253a826112df565b73ffffffffffffffffffffffffffffffffffffffff1614612590576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612587906148a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f7906146e3565b60405180910390fd5b61260b838383612ab3565b612616600082612300565b61266781600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ab890919063ffffffff16565b506126b981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ad290919063ffffffff16565b506126d081836002612aec9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008082840190508381101561277c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612773906146a3565b60405180910390fd5b8091505092915050565b60008083141561279957600090506127f0565b60008284029050828482816127aa57fe5b04146127eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e290614843565b60405180910390fd5b809150505b92915050565b60006128058360000183612b21565b60001c905092915050565b6000806000806128238660000186612b8e565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906128529291906133c5565b5050565b6000612869846000018460001b84612c11565b60001c90509392505050565b600061288382600001612ca2565b9050919050565b61289584848461251a565b6128a184848484612cb3565b6128e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d790614643565b60405180910390fd5b50505050565b6060600082141561292e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a28565b600082905060005b60008214612958578080600101915050600a828161295057fe5b049150612936565b60008167ffffffffffffffff8111801561297157600080fd5b506040519080825280601f01601f1916602001820160405280156129a45781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612a2057600a84816129c557fe5b0660300160f81b828280600190039350815181106129df57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612a1857fe5b0493506129b3565b819450505050505b919050565b6000612a3f836000018360001b612e17565b905092915050565b612a518383612e3a565b612a5e6000848484612cb3565b612a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9490614643565b60405180910390fd5b505050565b600081600001805490509050919050565b505050565b6000612aca836000018360001b612fc8565b905092915050565b6000612ae4836000018360001b6130b0565b905092915050565b6000612b18846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613120565b90509392505050565b600081836000018054905011612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6390614623565b60405180910390fd5b826000018281548110612b7b57fe5b9060005260206000200154905092915050565b60008082846000018054905011612bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd190614803565b60405180910390fd5b6000846000018481548110612beb57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6a91906145df565b60405180910390fd5b50846000016001820381548110612c8657fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612cd48473ffffffffffffffffffffffffffffffffffffffff166131fc565b612ce15760019050612e0f565b6000612da863150b7a0260e01b612cf66122f8565b888787604051602401612d0c9493929190614534565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001614c8d603291398773ffffffffffffffffffffffffffffffffffffffff1661320f9092919063ffffffff16565b9050600081806020019051810190612dc09190613779565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea190614823565b60405180910390fd5b612eb3816122db565b15612ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eea90614683565b60405180910390fd5b612eff60008383612ab3565b612f5081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ad290919063ffffffff16565b50612f6781836002612aec9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020549050600081146130a4576000600182039050600060018660000180549050039050600086600001828154811061301357fe5b906000526020600020015490508087600001848154811061303057fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061306857fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506130aa565b60009150505b92915050565b60006130bc8383613227565b61311557826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061311a565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156131c7578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506131f5565b828560000160018303815481106131da57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b606061321e848460008561324a565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561328f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328690614763565b60405180910390fd5b613298856131fc565b6132d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ce90614963565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161330091906144de565b60006040518083038185875af1925050503d806000811461333d576040519150601f19603f3d011682016040523d82523d6000602084013e613342565b606091505b509150915061335282828661335e565b92505050949350505050565b6060831561336e578290506133be565b6000835111156133815782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b591906145df565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826133fb5760008555613442565b82601f1061341457805160ff1916838001178555613442565b82800160010185558215613442579182015b82811115613441578251825591602001919060010190613426565b5b50905061344f9190613453565b5090565b5b8082111561346c576000816000905550600101613454565b5090565b600061348361347e84614a0f565b6149de565b90508281526020810184848401111561349b57600080fd5b6134a6848285614bdb565b509392505050565b60006134c16134bc84614a3f565b6149de565b9050828152602081018484840111156134d957600080fd5b6134e4848285614bdb565b509392505050565b6000813590506134fb81614c30565b92915050565b60008135905061351081614c47565b92915050565b60008135905061352581614c5e565b92915050565b60008151905061353a81614c5e565b92915050565b600082601f83011261355157600080fd5b8135613561848260208601613470565b91505092915050565b600082601f83011261357b57600080fd5b813561358b8482602086016134ae565b91505092915050565b6000813590506135a381614c75565b92915050565b6000602082840312156135bb57600080fd5b60006135c9848285016134ec565b91505092915050565b600080604083850312156135e557600080fd5b60006135f3858286016134ec565b9250506020613604858286016134ec565b9150509250929050565b60008060006060848603121561362357600080fd5b6000613631868287016134ec565b9350506020613642868287016134ec565b925050604061365386828701613594565b9150509250925092565b6000806000806080858703121561367357600080fd5b6000613681878288016134ec565b9450506020613692878288016134ec565b93505060406136a387828801613594565b925050606085013567ffffffffffffffff8111156136c057600080fd5b6136cc87828801613540565b91505092959194509250565b600080604083850312156136eb57600080fd5b60006136f9858286016134ec565b925050602061370a85828601613501565b9150509250929050565b6000806040838503121561372757600080fd5b6000613735858286016134ec565b925050602061374685828601613594565b9150509250929050565b60006020828403121561376257600080fd5b600061377084828501613516565b91505092915050565b60006020828403121561378b57600080fd5b60006137998482850161352b565b91505092915050565b6000602082840312156137b457600080fd5b600082013567ffffffffffffffff8111156137ce57600080fd5b6137da8482850161356a565b91505092915050565b6000602082840312156137f557600080fd5b600061380384828501613594565b91505092915050565b600061381883836139a2565b905092915050565b600061382c83836144c0565b60208301905092915050565b61384181614b67565b82525050565b61385081614b55565b82525050565b600061386182614aa4565b61386b8185614aea565b93508360208202850161387d85614a6f565b8060005b858110156138b9578484038952815161389a858261380c565b94506138a583614ad0565b925060208a01995050600181019050613881565b50829750879550505050505092915050565b60006138d682614aaf565b6138e08185614afb565b93506138eb83614a7f565b8060005b8381101561391c5781516139038882613820565b975061390e83614add565b9250506001810190506138ef565b5085935050505092915050565b61393281614b79565b82525050565b600061394382614aba565b61394d8185614b0c565b935061395d818560208601614bea565b61396681614c1f565b840191505092915050565b600061397c82614aba565b6139868185614b1d565b9350613996818560208601614bea565b80840191505092915050565b60006139ad82614ac5565b6139b78185614b28565b93506139c7818560208601614bea565b6139d081614c1f565b840191505092915050565b60006139e682614ac5565b6139f08185614b39565b9350613a00818560208601614bea565b613a0981614c1f565b840191505092915050565b6000613a1f82614ac5565b613a298185614b4a565b9350613a39818560208601614bea565b80840191505092915050565b600081546001811660008114613a625760018114613a8857613acc565b607f6002830416613a738187614b39565b955060ff198316865260208601935050613acc565b60028204613a968187614b39565b9550613aa185614a8f565b60005b82811015613ac357815481890152600182019150602081019050613aa4565b80880195505050505b505092915050565b6000613ae1602283614b39565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b47603283614b39565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613bad602683614b39565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c13601c83614b39565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613c53601b83614b39565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613c93602083614b39565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b6000613cd3602483614b39565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d39601983614b39565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613d79601f83614b39565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613db9601e83614b39565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b6000613df9602683614b39565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e5f602c83614b39565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ec5603883614b39565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613f2b602183614b39565b91507f43616e206f6e6c79206d696e7420353020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f91602a83614b39565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ff7602283614b39565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061405d602083614b39565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061409d602183614b39565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614103602c83614b39565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614169602083614b39565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006141a9602983614b39565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061420f602f83614b39565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614275602183614b39565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142db602583614b39565b91507f53616c65206d7573742062652061637469766520746f206d696e74204249472060008301527f4255434b530000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614341601683614b39565b91507f4c6963656e736520616c7265616479206c6f636b6564000000000000000000006000830152602082019050919050565b6000614381603183614b39565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006143e7601d83614b39565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614427601a83614b39565b91507f43484f4f53452041204255434b2057495448494e2052414e47450000000000006000830152602082019050919050565b6000614467602983614b39565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66204255434b5300000000000000000000000000000000000000000000006020830152604082019050919050565b6144c981614bd1565b82525050565b6144d881614bd1565b82525050565b60006144ea8284613971565b915081905092915050565b60006145018285613a14565b915061450d8284613a14565b91508190509392505050565b600060208201905061452e6000830184613847565b92915050565b60006080820190506145496000830187613838565b6145566020830186613847565b61456360408301856144cf565b81810360608301526145758184613938565b905095945050505050565b6000602082019050818103600083015261459a8184613856565b905092915050565b600060208201905081810360008301526145bc81846138cb565b905092915050565b60006020820190506145d96000830184613929565b92915050565b600060208201905081810360008301526145f981846139db565b905092915050565b6000602082019050818103600083015261461b8184613a45565b905092915050565b6000602082019050818103600083015261463c81613ad4565b9050919050565b6000602082019050818103600083015261465c81613b3a565b9050919050565b6000602082019050818103600083015261467c81613ba0565b9050919050565b6000602082019050818103600083015261469c81613c06565b9050919050565b600060208201905081810360008301526146bc81613c46565b9050919050565b600060208201905081810360008301526146dc81613c86565b9050919050565b600060208201905081810360008301526146fc81613cc6565b9050919050565b6000602082019050818103600083015261471c81613d2c565b9050919050565b6000602082019050818103600083015261473c81613d6c565b9050919050565b6000602082019050818103600083015261475c81613dac565b9050919050565b6000602082019050818103600083015261477c81613dec565b9050919050565b6000602082019050818103600083015261479c81613e52565b9050919050565b600060208201905081810360008301526147bc81613eb8565b9050919050565b600060208201905081810360008301526147dc81613f1e565b9050919050565b600060208201905081810360008301526147fc81613f84565b9050919050565b6000602082019050818103600083015261481c81613fea565b9050919050565b6000602082019050818103600083015261483c81614050565b9050919050565b6000602082019050818103600083015261485c81614090565b9050919050565b6000602082019050818103600083015261487c816140f6565b9050919050565b6000602082019050818103600083015261489c8161415c565b9050919050565b600060208201905081810360008301526148bc8161419c565b9050919050565b600060208201905081810360008301526148dc81614202565b9050919050565b600060208201905081810360008301526148fc81614268565b9050919050565b6000602082019050818103600083015261491c816142ce565b9050919050565b6000602082019050818103600083015261493c81614334565b9050919050565b6000602082019050818103600083015261495c81614374565b9050919050565b6000602082019050818103600083015261497c816143da565b9050919050565b6000602082019050818103600083015261499c8161441a565b9050919050565b600060208201905081810360008301526149bc8161445a565b9050919050565b60006020820190506149d860008301846144cf565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614a0557614a04614c1d565b5b8060405250919050565b600067ffffffffffffffff821115614a2a57614a29614c1d565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614a5a57614a59614c1d565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b6082614bb1565b9050919050565b6000614b7282614bb1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c08578082015181840152602081019050614bed565b83811115614c17576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b614c3981614b55565b8114614c4457600080fd5b50565b614c5081614b79565b8114614c5b57600080fd5b50565b614c6781614b85565b8114614c7257600080fd5b50565b614c7e81614bd1565b8114614c8957600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220f9fd5a80dfcab241dbc8e26bcdfb12f1963edd49aee2156859daf2d8ae384c0064736f6c6343000706003364343532333239633463366236643838646561336432373339373433333164323235363364383334613163376662383563313935323837383634366162643364

Deployed Bytecode

0x6080604052600436106102305760003560e01c8063700dadf41161012e578063b7bc8ccc116100ab578063d9b137b21161006f578063d9b137b21461082e578063e985e9c51461086b578063eb8d2444146108a8578063f14bd3d4146108d3578063f2fde38b146108fe57610230565b8063b7bc8ccc1461075b578063b88d4fde14610786578063bf4702fc146107af578063c72fe995146107c6578063c87b56dd146107f157610230565b80638da5cb5b116100f25780638da5cb5b1461068857806395d89b41146106b35780639c3e72bd146106de578063a22cb46514610709578063b09904b51461073257610230565b8063700dadf41461058f57806370a08231146105ba578063715018a6146105f75780637741fd9f1461060e5780638462151c1461064b57610230565b8063264b204e116101bc57806342842e0e1161018057806342842e0e146104985780634f6ccce7146104c157806355f804b3146104fe5780636352211e146105275780636c0360eb1461056457610230565b8063264b204e146103d457806327582fe5146104115780632f745c591461042d57806334918dfd1461046a5780633ccfd60b1461048157610230565b80631096952311610203578063109695231461030357806315702f5f1461032c57806318160ddd1461035557806323b872dd1461038057806324ac0907146103a957610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613750565b610927565b60405161026991906145c4565b60405180910390f35b34801561027e57600080fd5b5061028761098e565b60405161029491906145df565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906137e3565b610a30565b6040516102d19190614519565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190613714565b610ab5565b005b34801561030f57600080fd5b5061032a600480360381019061032591906137a2565b610bcd565b005b34801561033857600080fd5b50610353600480360381019061034e9190613714565b610c63565b005b34801561036157600080fd5b5061036a610d81565b60405161037791906149c3565b60405180910390f35b34801561038c57600080fd5b506103a760048036038101906103a2919061360e565b610d92565b005b3480156103b557600080fd5b506103be610df2565b6040516103cb91906149c3565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f691906137e3565b610df8565b60405161040891906145df565b60405180910390f35b61042b600480360381019061042691906137e3565b610ea8565b005b34801561043957600080fd5b50610454600480360381019061044f9190613714565b611046565b60405161046191906149c3565b60405180910390f35b34801561047657600080fd5b5061047f6110a1565b005b34801561048d57600080fd5b50610496611149565b005b3480156104a457600080fd5b506104bf60048036038101906104ba919061360e565b611214565b005b3480156104cd57600080fd5b506104e860048036038101906104e391906137e3565b611234565b6040516104f591906149c3565b60405180910390f35b34801561050a57600080fd5b50610525600480360381019061052091906137a2565b611257565b005b34801561053357600080fd5b5061054e600480360381019061054991906137e3565b6112df565b60405161055b9190614519565b60405180910390f35b34801561057057600080fd5b50610579611316565b60405161058691906145df565b60405180910390f35b34801561059b57600080fd5b506105a46113b8565b6040516105b191906149c3565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc91906135a9565b6113be565b6040516105ee91906149c3565b60405180910390f35b34801561060357600080fd5b5061060c61147d565b005b34801561061a57600080fd5b50610635600480360381019061063091906135a9565b6115ba565b6040516106429190614580565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d91906135a9565b611767565b60405161067f91906145a2565b60405180910390f35b34801561069457600080fd5b5061069d611860565b6040516106aa9190614519565b60405180910390f35b3480156106bf57600080fd5b506106c861188a565b6040516106d591906145df565b60405180910390f35b3480156106ea57600080fd5b506106f361192c565b60405161070091906145df565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b91906136d8565b6119ca565b005b34801561073e57600080fd5b50610759600480360381019061075491906137a2565b611b4b565b005b34801561076757600080fd5b50610770611c37565b60405161077d91906149c3565b60405180910390f35b34801561079257600080fd5b506107ad60048036038101906107a8919061365d565b611c42565b005b3480156107bb57600080fd5b506107c4611ca4565b005b3480156107d257600080fd5b506107db611d75565b6040516107e891906145df565b60405180910390f35b3480156107fd57600080fd5b50610818600480360381019061081391906137e3565b611e13565b60405161082591906145df565b60405180910390f35b34801561083a57600080fd5b50610855600480360381019061085091906137e3565b611f96565b60405161086291906145df565b60405180910390f35b34801561087757600080fd5b50610892600480360381019061088d91906135d2565b612083565b60405161089f91906145c4565b60405180910390f35b3480156108b457600080fd5b506108bd612117565b6040516108ca91906145c4565b60405180910390f35b3480156108df57600080fd5b506108e861212a565b6040516108f591906149c3565b60405180910390f35b34801561090a57600080fd5b50610925600480360381019061092091906135a9565b61212f565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a265780601f106109fb57610100808354040283529160200191610a26565b820191906000526020600020905b815481529060010190602001808311610a0957829003601f168201915b5050505050905090565b6000610a3b826122db565b610a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7190614863565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac0826112df565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906148e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b506122f8565b73ffffffffffffffffffffffffffffffffffffffff161480610b7f5750610b7e81610b796122f8565b612083565b5b610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb5906147a3565b60405180910390fd5b610bc88383612300565b505050565b610bd56122f8565b73ffffffffffffffffffffffffffffffffffffffff16610bf3611860565b73ffffffffffffffffffffffffffffffffffffffff1614610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4090614883565b60405180910390fd5b80600b9080519060200190610c5f9291906133c5565b5050565b610c6b6122f8565b73ffffffffffffffffffffffffffffffffffffffff16610c89611860565b73ffffffffffffffffffffffffffffffffffffffff1614610cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd690614883565b60405180910390fd5b6000610ce9610d81565b9050600082118015610cfd5750600f548211155b610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d33906146c3565b60405180910390fd5b60005b82811015610d6057610d53848284016123b9565b8080600101915050610d3f565b50610d7682600f546123d790919063ffffffff16565b600f81905550505050565b6000610d8d6002612427565b905090565b610da3610d9d6122f8565b8261243c565b610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990614943565b60405180910390fd5b610ded83838361251a565b505050565b600f5481565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ea05780601f10610e7557610100808354040283529160200191610ea0565b820191906000526020600020905b815481529060010190602001808311610e8357829003601f168201915b505050505081565b600d60019054906101000a900460ff16610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90614903565b60405180910390fd5b600081118015610f08575060328111155b610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e906147c3565b60405180910390fd5b610378610f6482610f56610d81565b61273190919063ffffffff16565b1115610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c906149a3565b60405180910390fd5b610fbf81666a94d74f43000061278690919063ffffffff16565b341015611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff890614723565b60405180910390fd5b60005b81811015611042576000611016610d81565b9050610378611023610d81565b10156110345761103333826123b9565b5b508080600101915050611004565b5050565b600061109982600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206127f690919063ffffffff16565b905092915050565b6110a96122f8565b73ffffffffffffffffffffffffffffffffffffffff166110c7611860565b73ffffffffffffffffffffffffffffffffffffffff161461111d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111490614883565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b6111516122f8565b73ffffffffffffffffffffffffffffffffffffffff1661116f611860565b73ffffffffffffffffffffffffffffffffffffffff16146111c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bc90614883565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611210573d6000803e3d6000fd5b5050565b61122f83838360405180602001604052806000815250611c42565b505050565b60008061124b83600261281090919063ffffffff16565b50905080915050919050565b61125f6122f8565b73ffffffffffffffffffffffffffffffffffffffff1661127d611860565b73ffffffffffffffffffffffffffffffffffffffff16146112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90614883565b60405180910390fd5b6112dc8161283c565b50565b600061130f82604051806060016040528060298152602001614cbf6029913960026128569092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ae5780601f10611383576101008083540402835291602001916113ae565b820191906000526020600020905b81548152906001019060200180831161139157829003601f168201915b5050505050905090565b61037881565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561142f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611426906147e3565b60405180910390fd5b611476600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612875565b9050919050565b6114856122f8565b73ffffffffffffffffffffffffffffffffffffffff166114a3611860565b73ffffffffffffffffffffffffffffffffffffffff16146114f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f090614883565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b606060006115c7836113be565b9050600081141561162757600067ffffffffffffffff811180156115ea57600080fd5b5060405190808252806020026020018201604052801561161e57816020015b60608152602001906001900390816116095790505b50915050611762565b60008167ffffffffffffffff8111801561164057600080fd5b5060405190808252806020026020018201604052801561167457816020015b606081526020019060019003908161165f5790505b50905060005b8281101561175b57600e60006116908784611046565b81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117325780601f1061170757610100808354040283529160200191611732565b820191906000526020600020905b81548152906001019060200180831161171557829003601f168201915b505050505082828151811061174357fe5b6020026020010181905250808060010191505061167a565b8193505050505b919050565b60606000611774836113be565b905060008114156117cf57600067ffffffffffffffff8111801561179757600080fd5b506040519080825280602002602001820160405280156117c65781602001602082028036833780820191505090505b5091505061185b565b60008167ffffffffffffffff811180156117e857600080fd5b506040519080825280602002602001820160405280156118175781602001602082028036833780820191505090505b50905060005b828110156118545761182f8582611046565b82828151811061183b57fe5b602002602001018181525050808060010191505061181d565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119225780601f106118f757610100808354040283529160200191611922565b820191906000526020600020905b81548152906001019060200180831161190557829003601f168201915b5050505050905090565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119c25780601f10611997576101008083540402835291602001916119c2565b820191906000526020600020905b8154815290600101906020018083116119a557829003601f168201915b505050505081565b6119d26122f8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3790614703565b60405180910390fd5b8060056000611a4d6122f8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611afa6122f8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b3f91906145c4565b60405180910390a35050565b611b536122f8565b73ffffffffffffffffffffffffffffffffffffffff16611b71611860565b73ffffffffffffffffffffffffffffffffffffffff1614611bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbe90614883565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514611c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1490614923565b60405180910390fd5b80600c9080519060200190611c339291906133c5565b5050565b666a94d74f43000081565b611c53611c4d6122f8565b8361243c565b611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8990614943565b60405180910390fd5b611c9e8484848461288a565b50505050565b611cac6122f8565b73ffffffffffffffffffffffffffffffffffffffff16611cca611860565b73ffffffffffffffffffffffffffffffffffffffff1614611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1790614883565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600c604051611d6b9190614601565b60405180910390a1565b600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e0b5780601f10611de057610100808354040283529160200191611e0b565b820191906000526020600020905b815481529060010190602001808311611dee57829003601f168201915b505050505081565b6060611e1e826122db565b611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e54906148c3565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f065780601f10611edb57610100808354040283529160200191611f06565b820191906000526020600020905b815481529060010190602001808311611ee957829003601f168201915b505050505090506000611f17611316565b9050600081511415611f2d578192505050611f91565b600082511115611f62578082604051602001611f4a9291906144f5565b60405160208183030381529060405292505050611f91565b80611f6c856128e6565b604051602001611f7d9291906144f5565b604051602081830303815290604052925050505b919050565b6060611fa0610d81565b8210611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd890614983565b60405180910390fd5b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120775780601f1061204c57610100808354040283529160200191612077565b820191906000526020600020905b81548152906001019060200180831161205a57829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60019054906101000a900460ff1681565b603281565b6121376122f8565b73ffffffffffffffffffffffffffffffffffffffff16612155611860565b73ffffffffffffffffffffffffffffffffffffffff16146121ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a290614883565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561221b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221290614663565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006122f1826002612a2d90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612373836112df565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6123d3828260405180602001604052806000815250612a47565b5050565b60008282111561241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241390614743565b60405180910390fd5b818303905092915050565b600061243582600001612aa2565b9050919050565b6000612447826122db565b612486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247d90614783565b60405180910390fd5b6000612491836112df565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061250057508373ffffffffffffffffffffffffffffffffffffffff166124e884610a30565b73ffffffffffffffffffffffffffffffffffffffff16145b8061251157506125108185612083565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661253a826112df565b73ffffffffffffffffffffffffffffffffffffffff1614612590576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612587906148a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f7906146e3565b60405180910390fd5b61260b838383612ab3565b612616600082612300565b61266781600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ab890919063ffffffff16565b506126b981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ad290919063ffffffff16565b506126d081836002612aec9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008082840190508381101561277c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612773906146a3565b60405180910390fd5b8091505092915050565b60008083141561279957600090506127f0565b60008284029050828482816127aa57fe5b04146127eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e290614843565b60405180910390fd5b809150505b92915050565b60006128058360000183612b21565b60001c905092915050565b6000806000806128238660000186612b8e565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906128529291906133c5565b5050565b6000612869846000018460001b84612c11565b60001c90509392505050565b600061288382600001612ca2565b9050919050565b61289584848461251a565b6128a184848484612cb3565b6128e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d790614643565b60405180910390fd5b50505050565b6060600082141561292e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a28565b600082905060005b60008214612958578080600101915050600a828161295057fe5b049150612936565b60008167ffffffffffffffff8111801561297157600080fd5b506040519080825280601f01601f1916602001820160405280156129a45781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612a2057600a84816129c557fe5b0660300160f81b828280600190039350815181106129df57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612a1857fe5b0493506129b3565b819450505050505b919050565b6000612a3f836000018360001b612e17565b905092915050565b612a518383612e3a565b612a5e6000848484612cb3565b612a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9490614643565b60405180910390fd5b505050565b600081600001805490509050919050565b505050565b6000612aca836000018360001b612fc8565b905092915050565b6000612ae4836000018360001b6130b0565b905092915050565b6000612b18846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613120565b90509392505050565b600081836000018054905011612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6390614623565b60405180910390fd5b826000018281548110612b7b57fe5b9060005260206000200154905092915050565b60008082846000018054905011612bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd190614803565b60405180910390fd5b6000846000018481548110612beb57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6a91906145df565b60405180910390fd5b50846000016001820381548110612c8657fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612cd48473ffffffffffffffffffffffffffffffffffffffff166131fc565b612ce15760019050612e0f565b6000612da863150b7a0260e01b612cf66122f8565b888787604051602401612d0c9493929190614534565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001614c8d603291398773ffffffffffffffffffffffffffffffffffffffff1661320f9092919063ffffffff16565b9050600081806020019051810190612dc09190613779565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea190614823565b60405180910390fd5b612eb3816122db565b15612ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eea90614683565b60405180910390fd5b612eff60008383612ab3565b612f5081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ad290919063ffffffff16565b50612f6781836002612aec9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020549050600081146130a4576000600182039050600060018660000180549050039050600086600001828154811061301357fe5b906000526020600020015490508087600001848154811061303057fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061306857fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506130aa565b60009150505b92915050565b60006130bc8383613227565b61311557826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061311a565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156131c7578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506131f5565b828560000160018303815481106131da57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b606061321e848460008561324a565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561328f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328690614763565b60405180910390fd5b613298856131fc565b6132d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ce90614963565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161330091906144de565b60006040518083038185875af1925050503d806000811461333d576040519150601f19603f3d011682016040523d82523d6000602084013e613342565b606091505b509150915061335282828661335e565b92505050949350505050565b6060831561336e578290506133be565b6000835111156133815782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b591906145df565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826133fb5760008555613442565b82601f1061341457805160ff1916838001178555613442565b82800160010185558215613442579182015b82811115613441578251825591602001919060010190613426565b5b50905061344f9190613453565b5090565b5b8082111561346c576000816000905550600101613454565b5090565b600061348361347e84614a0f565b6149de565b90508281526020810184848401111561349b57600080fd5b6134a6848285614bdb565b509392505050565b60006134c16134bc84614a3f565b6149de565b9050828152602081018484840111156134d957600080fd5b6134e4848285614bdb565b509392505050565b6000813590506134fb81614c30565b92915050565b60008135905061351081614c47565b92915050565b60008135905061352581614c5e565b92915050565b60008151905061353a81614c5e565b92915050565b600082601f83011261355157600080fd5b8135613561848260208601613470565b91505092915050565b600082601f83011261357b57600080fd5b813561358b8482602086016134ae565b91505092915050565b6000813590506135a381614c75565b92915050565b6000602082840312156135bb57600080fd5b60006135c9848285016134ec565b91505092915050565b600080604083850312156135e557600080fd5b60006135f3858286016134ec565b9250506020613604858286016134ec565b9150509250929050565b60008060006060848603121561362357600080fd5b6000613631868287016134ec565b9350506020613642868287016134ec565b925050604061365386828701613594565b9150509250925092565b6000806000806080858703121561367357600080fd5b6000613681878288016134ec565b9450506020613692878288016134ec565b93505060406136a387828801613594565b925050606085013567ffffffffffffffff8111156136c057600080fd5b6136cc87828801613540565b91505092959194509250565b600080604083850312156136eb57600080fd5b60006136f9858286016134ec565b925050602061370a85828601613501565b9150509250929050565b6000806040838503121561372757600080fd5b6000613735858286016134ec565b925050602061374685828601613594565b9150509250929050565b60006020828403121561376257600080fd5b600061377084828501613516565b91505092915050565b60006020828403121561378b57600080fd5b60006137998482850161352b565b91505092915050565b6000602082840312156137b457600080fd5b600082013567ffffffffffffffff8111156137ce57600080fd5b6137da8482850161356a565b91505092915050565b6000602082840312156137f557600080fd5b600061380384828501613594565b91505092915050565b600061381883836139a2565b905092915050565b600061382c83836144c0565b60208301905092915050565b61384181614b67565b82525050565b61385081614b55565b82525050565b600061386182614aa4565b61386b8185614aea565b93508360208202850161387d85614a6f565b8060005b858110156138b9578484038952815161389a858261380c565b94506138a583614ad0565b925060208a01995050600181019050613881565b50829750879550505050505092915050565b60006138d682614aaf565b6138e08185614afb565b93506138eb83614a7f565b8060005b8381101561391c5781516139038882613820565b975061390e83614add565b9250506001810190506138ef565b5085935050505092915050565b61393281614b79565b82525050565b600061394382614aba565b61394d8185614b0c565b935061395d818560208601614bea565b61396681614c1f565b840191505092915050565b600061397c82614aba565b6139868185614b1d565b9350613996818560208601614bea565b80840191505092915050565b60006139ad82614ac5565b6139b78185614b28565b93506139c7818560208601614bea565b6139d081614c1f565b840191505092915050565b60006139e682614ac5565b6139f08185614b39565b9350613a00818560208601614bea565b613a0981614c1f565b840191505092915050565b6000613a1f82614ac5565b613a298185614b4a565b9350613a39818560208601614bea565b80840191505092915050565b600081546001811660008114613a625760018114613a8857613acc565b607f6002830416613a738187614b39565b955060ff198316865260208601935050613acc565b60028204613a968187614b39565b9550613aa185614a8f565b60005b82811015613ac357815481890152600182019150602081019050613aa4565b80880195505050505b505092915050565b6000613ae1602283614b39565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b47603283614b39565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613bad602683614b39565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c13601c83614b39565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613c53601b83614b39565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613c93602083614b39565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b6000613cd3602483614b39565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d39601983614b39565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613d79601f83614b39565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613db9601e83614b39565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b6000613df9602683614b39565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e5f602c83614b39565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ec5603883614b39565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613f2b602183614b39565b91507f43616e206f6e6c79206d696e7420353020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f91602a83614b39565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ff7602283614b39565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061405d602083614b39565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061409d602183614b39565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614103602c83614b39565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614169602083614b39565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006141a9602983614b39565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061420f602f83614b39565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614275602183614b39565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142db602583614b39565b91507f53616c65206d7573742062652061637469766520746f206d696e74204249472060008301527f4255434b530000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614341601683614b39565b91507f4c6963656e736520616c7265616479206c6f636b6564000000000000000000006000830152602082019050919050565b6000614381603183614b39565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006143e7601d83614b39565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614427601a83614b39565b91507f43484f4f53452041204255434b2057495448494e2052414e47450000000000006000830152602082019050919050565b6000614467602983614b39565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66204255434b5300000000000000000000000000000000000000000000006020830152604082019050919050565b6144c981614bd1565b82525050565b6144d881614bd1565b82525050565b60006144ea8284613971565b915081905092915050565b60006145018285613a14565b915061450d8284613a14565b91508190509392505050565b600060208201905061452e6000830184613847565b92915050565b60006080820190506145496000830187613838565b6145566020830186613847565b61456360408301856144cf565b81810360608301526145758184613938565b905095945050505050565b6000602082019050818103600083015261459a8184613856565b905092915050565b600060208201905081810360008301526145bc81846138cb565b905092915050565b60006020820190506145d96000830184613929565b92915050565b600060208201905081810360008301526145f981846139db565b905092915050565b6000602082019050818103600083015261461b8184613a45565b905092915050565b6000602082019050818103600083015261463c81613ad4565b9050919050565b6000602082019050818103600083015261465c81613b3a565b9050919050565b6000602082019050818103600083015261467c81613ba0565b9050919050565b6000602082019050818103600083015261469c81613c06565b9050919050565b600060208201905081810360008301526146bc81613c46565b9050919050565b600060208201905081810360008301526146dc81613c86565b9050919050565b600060208201905081810360008301526146fc81613cc6565b9050919050565b6000602082019050818103600083015261471c81613d2c565b9050919050565b6000602082019050818103600083015261473c81613d6c565b9050919050565b6000602082019050818103600083015261475c81613dac565b9050919050565b6000602082019050818103600083015261477c81613dec565b9050919050565b6000602082019050818103600083015261479c81613e52565b9050919050565b600060208201905081810360008301526147bc81613eb8565b9050919050565b600060208201905081810360008301526147dc81613f1e565b9050919050565b600060208201905081810360008301526147fc81613f84565b9050919050565b6000602082019050818103600083015261481c81613fea565b9050919050565b6000602082019050818103600083015261483c81614050565b9050919050565b6000602082019050818103600083015261485c81614090565b9050919050565b6000602082019050818103600083015261487c816140f6565b9050919050565b6000602082019050818103600083015261489c8161415c565b9050919050565b600060208201905081810360008301526148bc8161419c565b9050919050565b600060208201905081810360008301526148dc81614202565b9050919050565b600060208201905081810360008301526148fc81614268565b9050919050565b6000602082019050818103600083015261491c816142ce565b9050919050565b6000602082019050818103600083015261493c81614334565b9050919050565b6000602082019050818103600083015261495c81614374565b9050919050565b6000602082019050818103600083015261497c816143da565b9050919050565b6000602082019050818103600083015261499c8161441a565b9050919050565b600060208201905081810360008301526149bc8161445a565b9050919050565b60006020820190506149d860008301846144cf565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614a0557614a04614c1d565b5b8060405250919050565b600067ffffffffffffffff821115614a2a57614a29614c1d565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614a5a57614a59614c1d565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b6082614bb1565b9050919050565b6000614b7282614bb1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c08578082015181840152602081019050614bed565b83811115614c17576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b614c3981614b55565b8114614c4457600080fd5b50565b614c5081614b79565b8114614c5b57600080fd5b50565b614c6781614b85565b8114614c7257600080fd5b50565b614c7e81614bd1565b8114614c8957600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220f9fd5a80dfcab241dbc8e26bcdfb12f1963edd49aee2156859daf2d8ae384c0064736f6c63430007060033

Deployed Bytecode Sourcemap

66926:4387:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10300:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51585:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54371:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53901:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68364:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67957:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53379:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55261:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67655:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67545:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69900:689;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53141:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68606:89;;;;;;;;;;;;;:::i;:::-;;67814:131;;;;;;;;;;;;;:::i;:::-;;55637:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53667:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68497:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51341:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52960:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67453:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51058:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66296:148;;;;;;;;;;;;;:::i;:::-;;70751:553;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68713:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65645:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51754:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67176:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54664:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69708:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67329:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55859:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69544:125;;;;;;;;;;;;;:::i;:::-;;67011:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51929:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69304:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55030:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67500:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67403:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66599:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10300:150;10385:4;10409:20;:33;10430:11;10409:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10402:40;;10300:150;;;:::o;51585:100::-;51639:13;51672:5;51665:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51585:100;:::o;54371:221::-;54447:7;54475:16;54483:7;54475;:16::i;:::-;54467:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54560:15;:24;54576:7;54560:24;;;;;;;;;;;;;;;;;;;;;54553:31;;54371:221;;;:::o;53901:404::-;53982:13;53998:23;54013:7;53998:14;:23::i;:::-;53982:39;;54046:5;54040:11;;:2;:11;;;;54032:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54126:5;54110:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;54135:44;54159:5;54166:12;:10;:12::i;:::-;54135:23;:44::i;:::-;54110:69;54102:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;54276:21;54285:2;54289:7;54276:8;:21::i;:::-;53901:404;;;:::o;68364:125::-;65876:12;:10;:12::i;:::-;65865:23;;:7;:5;:7::i;:::-;:23;;;65857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68467:14:::1;68449:15;:32;;;;;;;;;;;;:::i;:::-;;68364:125:::0;:::o;67957:397::-;65876:12;:10;:12::i;:::-;65865:23;;:7;:5;:7::i;:::-;:23;;;65857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68051:11:::1;68065:13;:11;:13::i;:::-;68051:27;;68114:1;68097:14;:18;:51;;;;;68137:11;;68119:14;:29;;68097:51;68089:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;68201:6;68196:95;68217:14;68213:1;:18;68196:95;;;68253:26;68263:3;68277:1;68268:6;:10;68253:9;:26::i;:::-;68233:3;;;;;;;68196:95;;;;68315:31;68331:14;68315:11;;:15;;:31;;;;:::i;:::-;68301:11;:45;;;;65936:1;67957:397:::0;;:::o;53379:211::-;53440:7;53561:21;:12;:19;:21::i;:::-;53554:28;;53379:211;:::o;55261:305::-;55422:41;55441:12;:10;:12::i;:::-;55455:7;55422:18;:41::i;:::-;55414:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;55530:28;55540:4;55546:2;55550:7;55530:9;:28::i;:::-;55261:305;;;:::o;67655:28::-;;;;:::o;67545:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69900:689::-;69977:12;;;;;;;;;;;69969:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;70067:1;70050:14;:18;:55;;;;;67442:2;70072:14;:33;;70050:55;70042:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;67488:3;70162:33;70180:14;70162:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:45;;70154:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;70285:29;70299:14;67365:17;70285:13;;:29;;;;:::i;:::-;70272:9;:42;;70264:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;70375:6;70371:209;70391:14;70387:1;:18;70371:209;;;70427:14;70444:13;:11;:13::i;:::-;70427:30;;67488:3;70476:13;:11;:13::i;:::-;:24;70472:97;;;70521:32;70531:10;70543:9;70521;:32::i;:::-;70472:97;70371:209;70407:3;;;;;;;70371:209;;;;69900:689;:::o;53141:162::-;53238:7;53265:30;53289:5;53265:13;:20;53279:5;53265:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;53258:37;;53141:162;;;;:::o;68606:89::-;65876:12;:10;:12::i;:::-;65865:23;;:7;:5;:7::i;:::-;:23;;;65857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68675:12:::1;;;;;;;;;;;68674:13;68659:12;;:28;;;;;;;;;;;;;;;;;;68606:89::o:0;67814:131::-;65876:12;:10;:12::i;:::-;65865:23;;:7;:5;:7::i;:::-;:23;;;65857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67862:12:::1;67877:21;67862:36;;67909:10;:19;;:28;67929:7;67909:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65936:1;67814:131::o:0;55637:151::-;55741:39;55758:4;55764:2;55768:7;55741:39;;;;;;;;;;;;:16;:39::i;:::-;55637:151;;;:::o;53667:172::-;53742:7;53763:15;53784:22;53800:5;53784:12;:15;;:22;;;;:::i;:::-;53762:44;;;53824:7;53817:14;;;53667:172;;;:::o;68497:99::-;65876:12;:10;:12::i;:::-;65865:23;;:7;:5;:7::i;:::-;:23;;;65857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68568:20:::1;68580:7;68568:11;:20::i;:::-;68497:99:::0;:::o;51341:177::-;51413:7;51440:70;51457:7;51440:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;51433:77;;51341:177;;;:::o;52960:97::-;53008:13;53041:8;53034:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52960:97;:::o;67453:38::-;67488:3;67453:38;:::o;51058:221::-;51130:7;51175:1;51158:19;;:5;:19;;;;51150:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51242:29;:13;:20;51256:5;51242:20;;;;;;;;;;;;;;;:27;:29::i;:::-;51235:36;;51058:221;;;:::o;66296:148::-;65876:12;:10;:12::i;:::-;65865:23;;:7;:5;:7::i;:::-;:23;;;65857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66403:1:::1;66366:40;;66387:6;;;;;;;;;;;66366:40;;;;;;;;;;;;66434:1;66417:6;;:19;;;;;;;;;;;;;;;;;;66296:148::o:0;70751:553::-;70815:15;70844:18;70865:17;70875:6;70865:9;:17::i;:::-;70844:38;;70911:1;70897:10;:15;70893:404;;;70987:1;70974:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70967:22;;;;;70893:404;71022:22;71060:10;71047:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71022:49;;71086:13;71114:144;71138:10;71130:5;:18;71114:144;;;71194:9;:47;71205:34;71225:6;71233:5;71205:19;:34::i;:::-;71194:47;;;;;;;;;;;71178:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;71185:5;71178:13;;;;;;;;;;;;;:63;;;;71150:7;;;;;;;71114:144;;;71279:6;71272:13;;;;;70751:553;;;;:::o;68713:540::-;68774:16;68804:18;68825:17;68835:6;68825:9;:17::i;:::-;68804:38;;68871:1;68857:10;:15;68853:393;;;68948:1;68934:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68927:23;;;;;68853:393;68983:23;69023:10;69009:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68983:51;;69049:13;69077:130;69101:10;69093:5;:18;69077:130;;;69157:34;69177:6;69185:5;69157:19;:34::i;:::-;69141:6;69148:5;69141:13;;;;;;;;;;;;;:50;;;;;69113:7;;;;;;;69077:130;;;69228:6;69221:13;;;;;68713:540;;;;:::o;65645:87::-;65691:7;65718:6;;;;;;;;;;;65711:13;;65645:87;:::o;51754:104::-;51810:13;51843:7;51836:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51754:104;:::o;67176:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54664:295::-;54779:12;:10;:12::i;:::-;54767:24;;:8;:24;;;;54759:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54879:8;54834:18;:32;54853:12;:10;:12::i;:::-;54834:32;;;;;;;;;;;;;;;:42;54867:8;54834:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;54932:8;54903:48;;54918:12;:10;:12::i;:::-;54903:48;;;54942:8;54903:48;;;;;;:::i;:::-;;;;;;;;54664:295;;:::o;69708:174::-;65876:12;:10;:12::i;:::-;65865:23;;:7;:5;:7::i;:::-;:23;;;65857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69808:5:::1;69791:22;;:13;;;;;;;;;;;:22;;;69783:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;69866:8;69851:12;:23;;;;;;;;;;;;:::i;:::-;;69708:174:::0;:::o;67329:53::-;67365:17;67329:53;:::o;55859:285::-;55991:41;56010:12;:10;:12::i;:::-;56024:7;55991:18;:41::i;:::-;55983:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56097:39;56111:4;56117:2;56121:7;56130:5;56097:13;:39::i;:::-;55859:285;;;;:::o;69544:125::-;65876:12;:10;:12::i;:::-;65865:23;;:7;:5;:7::i;:::-;:23;;;65857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69612:4:::1;69595:13;;:21;;;;;;;;;;;;;;;;;;69632:29;69648:12;69632:29;;;;;;:::i;:::-;;;;;;;;69544:125::o:0;67011:98::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51929:792::-;52002:13;52036:16;52044:7;52036;:16::i;:::-;52028:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52117:23;52143:10;:19;52154:7;52143:19;;;;;;;;;;;52117:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52173:18;52194:9;:7;:9::i;:::-;52173:30;;52301:1;52285:4;52279:18;:23;52275:72;;;52326:9;52319:16;;;;;;52275:72;52477:1;52457:9;52451:23;:27;52447:108;;;52526:4;52532:9;52509:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52495:48;;;;;;52447:108;52687:4;52693:18;:7;:16;:18::i;:::-;52670:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52656:57;;;;51929:792;;;;:::o;69304:174::-;69356:13;69396;:11;:13::i;:::-;69390:3;:19;69382:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;69458:12;69451:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69304:174;;;:::o;55030:164::-;55127:4;55151:18;:25;55170:5;55151:25;;;;;;;;;;;;;;;:35;55177:8;55151:35;;;;;;;;;;;;;;;;;;;;;;;;;55144:42;;55030:164;;;;:::o;67500:32::-;;;;;;;;;;;;;:::o;67403:41::-;67442:2;67403:41;:::o;66599:244::-;65876:12;:10;:12::i;:::-;65865:23;;:7;:5;:7::i;:::-;:23;;;65857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66708:1:::1;66688:22;;:8;:22;;;;66680:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;66798:8;66769:38;;66790:6;;;;;;;;;;;66769:38;;;;;;;;;;;;66827:8;66818:6;;:17;;;;;;;;;;;;;;;;;;66599:244:::0;:::o;57611:127::-;57676:4;57700:30;57722:7;57700:12;:21;;:30;;;;:::i;:::-;57693:37;;57611:127;;;:::o;732:106::-;785:15;820:10;813:17;;732:106;:::o;63629:192::-;63731:2;63704:15;:24;63720:7;63704:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;63787:7;63783:2;63749:46;;63758:23;63773:7;63758:14;:23::i;:::-;63749:46;;;;;;;;;;;;63629:192;;:::o;58603:110::-;58679:26;58689:2;58693:7;58679:26;;;;;;;;;;;;:9;:26::i;:::-;58603:110;;:::o;14324:158::-;14382:7;14415:1;14410;:6;;14402:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;14473:1;14469;:5;14462:12;;14324:158;;;;:::o;44343:123::-;44412:7;44439:19;44447:3;:10;;44439:7;:19::i;:::-;44432:26;;44343:123;;;:::o;57905:355::-;57998:4;58023:16;58031:7;58023;:16::i;:::-;58015:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58099:13;58115:23;58130:7;58115:14;:23::i;:::-;58099:39;;58168:5;58157:16;;:7;:16;;;:51;;;;58201:7;58177:31;;:20;58189:7;58177:11;:20::i;:::-;:31;;;58157:51;:94;;;;58212:39;58236:5;58243:7;58212:23;:39::i;:::-;58157:94;58149:103;;;57905:355;;;;:::o;61041:599::-;61166:4;61139:31;;:23;61154:7;61139:14;:23::i;:::-;:31;;;61131:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;61267:1;61253:16;;:2;:16;;;;61245:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61323:39;61344:4;61350:2;61354:7;61323:20;:39::i;:::-;61427:29;61444:1;61448:7;61427:8;:29::i;:::-;61469:35;61496:7;61469:13;:19;61483:4;61469:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;61515:30;61537:7;61515:13;:17;61529:2;61515:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;61558:29;61575:7;61584:2;61558:12;:16;;:29;;;;;:::i;:::-;;61624:7;61620:2;61605:27;;61614:4;61605:27;;;;;;;;;;;;61041:599;;;:::o;13862:179::-;13920:7;13940:9;13956:1;13952;:5;13940:17;;13981:1;13976;:6;;13968:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;14032:1;14025:8;;;13862:179;;;;:::o;14741:220::-;14799:7;14828:1;14823;:6;14819:20;;;14838:1;14831:8;;;;14819:20;14850:9;14866:1;14862;:5;14850:17;;14895:1;14890;14886;:5;;;;;;:10;14878:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;14952:1;14945:8;;;14741:220;;;;;:::o;36134:137::-;36205:7;36240:22;36244:3;:10;;36256:5;36240:3;:22::i;:::-;36232:31;;36225:38;;36134:137;;;;:::o;44805:236::-;44885:7;44894;44915:11;44928:13;44945:22;44949:3;:10;;44961:5;44945:3;:22::i;:::-;44914:53;;;;44994:3;44986:12;;45024:5;45016:14;;44978:55;;;;;;44805:236;;;;;:::o;62241:100::-;62325:8;62314;:19;;;;;;;;;;;;:::i;:::-;;62241:100;:::o;46091:213::-;46198:7;46249:44;46254:3;:10;;46274:3;46266:12;;46280;46249:4;:44::i;:::-;46241:53;;46218:78;;46091:213;;;;;:::o;35676:114::-;35736:7;35763:19;35771:3;:10;;35763:7;:19::i;:::-;35756:26;;35676:114;;;:::o;57026:272::-;57140:28;57150:4;57156:2;57160:7;57140:9;:28::i;:::-;57187:48;57210:4;57216:2;57220:7;57229:5;57187:22;:48::i;:::-;57179:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;57026:272;;;;:::o;46555:746::-;46611:13;46841:1;46832:5;:10;46828:53;;;46859:10;;;;;;;;;;;;;;;;;;;;;46828:53;46891:12;46906:5;46891:20;;46922:14;46947:78;46962:1;46954:4;:9;46947:78;;46980:8;;;;;;;47011:2;47003:10;;;;;;;;;46947:78;;;47035:19;47067:6;47057:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47035:39;;47085:13;47110:1;47101:6;:10;47085:26;;47129:5;47122:12;;47145:117;47160:1;47152:4;:9;47145:117;;47221:2;47214:4;:9;;;;;;47209:2;:14;47196:29;;47178:6;47185:7;;;;;;;47178:15;;;;;;;;;;;:47;;;;;;;;;;;47248:2;47240:10;;;;;;;;;47145:117;;;47286:6;47272:21;;;;;;46555:746;;;;:::o;44104:151::-;44188:4;44212:35;44222:3;:10;;44242:3;44234:12;;44212:9;:35::i;:::-;44205:42;;44104:151;;;;:::o;58940:250::-;59036:18;59042:2;59046:7;59036:5;:18::i;:::-;59073:54;59104:1;59108:2;59112:7;59121:5;59073:22;:54::i;:::-;59065:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;58940:250;;;:::o;40922:110::-;40978:7;41005:3;:12;;:19;;;;40998:26;;40922:110;;;:::o;64434:93::-;;;;:::o;35221:137::-;35291:4;35315:35;35323:3;:10;;35343:5;35335:14;;35315:7;:35::i;:::-;35308:42;;35221:137;;;;:::o;34914:131::-;34981:4;35005:32;35010:3;:10;;35030:5;35022:14;;35005:4;:32::i;:::-;34998:39;;34914:131;;;;:::o;43527:185::-;43616:4;43640:64;43645:3;:10;;43665:3;43657:12;;43695:5;43679:23;;43671:32;;43640:4;:64::i;:::-;43633:71;;43527:185;;;;;:::o;31172:204::-;31239:7;31288:5;31267:3;:11;;:18;;;;:26;31259:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31350:3;:11;;31362:5;31350:18;;;;;;;;;;;;;;;;31343:25;;31172:204;;;;:::o;41387:279::-;41454:7;41463;41513:5;41491:3;:12;;:19;;;;:27;41483:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41570:22;41595:3;:12;;41608:5;41595:19;;;;;;;;;;;;;;;;;;41570:44;;41633:5;:10;;;41645:5;:12;;;41625:33;;;;;41387:279;;;;;:::o;42884:319::-;42978:7;42998:16;43017:3;:12;;:17;43030:3;43017:17;;;;;;;;;;;;42998:36;;43065:1;43053:8;:13;;43068:12;43045:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43135:3;:12;;43159:1;43148:8;:12;43135:26;;;;;;;;;;;;;;;;;;:33;;;43128:40;;;42884:319;;;;;:::o;30719:109::-;30775:7;30802:3;:11;;:18;;;;30795:25;;30719:109;;;:::o;62906:604::-;63027:4;63054:15;:2;:13;;;:15::i;:::-;63049:60;;63093:4;63086:11;;;;63049:60;63119:23;63145:252;63198:45;;;63258:12;:10;:12::i;:::-;63285:4;63304:7;63326:5;63161:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63145:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;63119:278;;63408:13;63435:10;63424:32;;;;;;;;;;;;:::i;:::-;63408:48;;48055:10;63485:16;;63475:26;;;:6;:26;;;;63467:35;;;;62906:604;;;;;;;:::o;40702:125::-;40773:4;40818:1;40797:3;:12;;:17;40810:3;40797:17;;;;;;;;;;;;:22;;40790:29;;40702:125;;;;:::o;59526:404::-;59620:1;59606:16;;:2;:16;;;;59598:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;59679:16;59687:7;59679;:16::i;:::-;59678:17;59670:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59741:45;59770:1;59774:2;59778:7;59741:20;:45::i;:::-;59799:30;59821:7;59799:13;:17;59813:2;59799:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;59842:29;59859:7;59868:2;59842:12;:16;;:29;;;;;:::i;:::-;;59914:7;59910:2;59889:33;;59906:1;59889:33;;;;;;;;;;;;59526:404;;:::o;28874:1544::-;28940:4;29058:18;29079:3;:12;;:19;29092:5;29079:19;;;;;;;;;;;;29058:40;;29129:1;29115:10;:15;29111:1300;;29477:21;29514:1;29501:10;:14;29477:38;;29530:17;29571:1;29550:3;:11;;:18;;;;:22;29530:42;;29817:17;29837:3;:11;;29849:9;29837:22;;;;;;;;;;;;;;;;29817:42;;29983:9;29954:3;:11;;29966:13;29954:26;;;;;;;;;;;;;;;:38;;;;30102:1;30086:13;:17;30060:3;:12;;:23;30073:9;30060:23;;;;;;;;;;;:43;;;;30212:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30307:3;:12;;:19;30320:5;30307:19;;;;;;;;;;;30300:26;;;30350:4;30343:11;;;;;;;;29111:1300;30394:5;30387:12;;;28874:1544;;;;;:::o;28284:414::-;28347:4;28369:21;28379:3;28384:5;28369:9;:21::i;:::-;28364:327;;28407:3;:11;;28424:5;28407:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28590:3;:11;;:18;;;;28568:3;:12;;:19;28581:5;28568:19;;;;;;;;;;;:40;;;;28630:4;28623:11;;;;28364:327;28674:5;28667:12;;28284:414;;;;;:::o;38202:692::-;38278:4;38394:16;38413:3;:12;;:17;38426:3;38413:17;;;;;;;;;;;;38394:36;;38459:1;38447:8;:13;38443:444;;;38514:3;:12;;38532:38;;;;;;;;38549:3;38532:38;;;;38562:5;38532:38;;;38514:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38729:3;:12;;:19;;;;38709:3;:12;;:17;38722:3;38709:17;;;;;;;;;;;:39;;;;38770:4;38763:11;;;;;38443:444;38843:5;38807:3;:12;;38831:1;38820:8;:12;38807:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38870:5;38863:12;;;38202:692;;;;;;:::o;19303:422::-;19363:4;19571:12;19682:7;19670:20;19662:28;;19716:1;19709:4;:8;19702:15;;;19303:422;;;:::o;22221:195::-;22324:12;22356:52;22378:6;22386:4;22392:1;22395:12;22356:21;:52::i;:::-;22349:59;;22221:195;;;;;:::o;30504:129::-;30577:4;30624:1;30601:3;:12;;:19;30614:5;30601:19;;;;;;;;;;;;:24;;30594:31;;30504:129;;;;:::o;23273:530::-;23400:12;23458:5;23433:21;:30;;23425:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23525:18;23536:6;23525:10;:18::i;:::-;23517:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23651:12;23665:23;23692:6;:11;;23712:5;23720:4;23692:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23650:75;;;;23743:52;23761:7;23770:10;23782:12;23743:17;:52::i;:::-;23736:59;;;;23273:530;;;;;;:::o;25813:742::-;25928:12;25957:7;25953:595;;;25988:10;25981:17;;;;25953:595;26122:1;26102:10;:17;:21;26098:439;;;26365:10;26359:17;26426:15;26413:10;26409:2;26405:19;26398:44;26313:148;26508:12;26501:20;;;;;;;;;;;:::i;:::-;;;;;;;;25813: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:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:::-;;6208:66;6270:3;6262:6;6208:66;:::i;:::-;6194:80;;6184:96;;;;:::o;6286:179::-;;6376:46;6418:3;6410:6;6376:46;:::i;:::-;6454:4;6449:3;6445:14;6431:28;;6366:99;;;;:::o;6471:142::-;6574:32;6600:5;6574:32;:::i;:::-;6569:3;6562:45;6552:61;;:::o;6619:118::-;6706:24;6724:5;6706:24;:::i;:::-;6701:3;6694:37;6684:53;;:::o;6771:991::-;;6939:64;6997:5;6939:64;:::i;:::-;7019:96;7108:6;7103:3;7019:96;:::i;:::-;7012:103;;7141:3;7186:4;7178:6;7174:17;7169:3;7165:27;7216:66;7276:5;7216:66;:::i;:::-;7305:7;7336:1;7321:396;7346:6;7343:1;7340:13;7321:396;;;7417:9;7411:4;7407:20;7402:3;7395:33;7468:6;7462:13;7496:84;7575:4;7560:13;7496:84;:::i;:::-;7488:92;;7603:70;7666:6;7603:70;:::i;:::-;7593:80;;7702:4;7697:3;7693:14;7686:21;;7381:336;7368:1;7365;7361:9;7356:14;;7321:396;;;7325:14;7733:4;7726:11;;7753:3;7746:10;;6915:847;;;;;;;;;:::o;7798:732::-;;7946:54;7994:5;7946:54;:::i;:::-;8016:86;8095:6;8090:3;8016:86;:::i;:::-;8009:93;;8126:56;8176:5;8126:56;:::i;:::-;8205:7;8236:1;8221:284;8246:6;8243:1;8240:13;8221:284;;;8322:6;8316:13;8349:63;8408:3;8393:13;8349:63;:::i;:::-;8342:70;;8435:60;8488:6;8435:60;:::i;:::-;8425:70;;8281:224;8268:1;8265;8261:9;8256:14;;8221:284;;;8225:14;8521:3;8514:10;;7922:608;;;;;;;:::o;8536:109::-;8617:21;8632:5;8617:21;:::i;:::-;8612:3;8605:34;8595:50;;:::o;8651:360::-;;8765:38;8797:5;8765:38;:::i;:::-;8819:70;8882:6;8877:3;8819:70;:::i;:::-;8812:77;;8898:52;8943:6;8938:3;8931:4;8924:5;8920:16;8898:52;:::i;:::-;8975:29;8997:6;8975:29;:::i;:::-;8970:3;8966:39;8959:46;;8741:270;;;;;:::o;9017:373::-;;9149:38;9181:5;9149:38;:::i;:::-;9203:88;9284:6;9279:3;9203:88;:::i;:::-;9196:95;;9300:52;9345:6;9340:3;9333:4;9326:5;9322:16;9300:52;:::i;:::-;9377:6;9372:3;9368:16;9361:23;;9125:265;;;;;:::o;9396:344::-;;9502:39;9535:5;9502:39;:::i;:::-;9557:61;9611:6;9606:3;9557:61;:::i;:::-;9550:68;;9627:52;9672:6;9667:3;9660:4;9653:5;9649:16;9627:52;:::i;:::-;9704:29;9726:6;9704:29;:::i;:::-;9699:3;9695:39;9688:46;;9478:262;;;;;:::o;9746:364::-;;9862:39;9895:5;9862:39;:::i;:::-;9917:71;9981:6;9976:3;9917:71;:::i;:::-;9910:78;;9997:52;10042:6;10037:3;10030:4;10023:5;10019:16;9997:52;:::i;:::-;10074:29;10096:6;10074:29;:::i;:::-;10069:3;10065:39;10058:46;;9838:272;;;;;:::o;10116:377::-;;10250:39;10283:5;10250:39;:::i;:::-;10305:89;10387:6;10382:3;10305:89;:::i;:::-;10298:96;;10403:52;10448:6;10443:3;10436:4;10429:5;10425:16;10403:52;:::i;:::-;10480:6;10475:3;10471:16;10464:23;;10226:267;;;;;:::o;10523:937::-;;10645:5;10639:12;10682:1;10671:9;10667:17;10698:1;10693:281;;;;10988:1;10983:471;;;;10660:794;;10693:281;10783:4;10779:1;10768:9;10764:17;10760:28;10808:71;10872:6;10867:3;10808:71;:::i;:::-;10801:78;;10923:4;10919:9;10908;10904:25;10899:3;10892:38;10959:4;10954:3;10950:14;10943:21;;10700:274;10693:281;;10983:471;11064:1;11053:9;11049:17;11086:71;11150:6;11145:3;11086:71;:::i;:::-;11079:78;;11185:38;11217:5;11185:38;:::i;:::-;11245:1;11259:154;11273:6;11270:1;11267:13;11259:154;;;11347:7;11341:14;11337:1;11332:3;11328:11;11321:35;11397:1;11388:7;11384:15;11373:26;;11295:4;11292:1;11288:12;11283:17;;11259:154;;;11442:1;11437:3;11433:11;11426:18;;10990:464;;;10660:794;;10612:848;;;;;:::o;11466:366::-;;11629:67;11693:2;11688:3;11629:67;:::i;:::-;11622:74;;11726:34;11722:1;11717:3;11713:11;11706:55;11792:4;11787:2;11782:3;11778:12;11771:26;11823:2;11818:3;11814:12;11807:19;;11612:220;;;:::o;11838:382::-;;12001:67;12065:2;12060:3;12001:67;:::i;:::-;11994:74;;12098:34;12094:1;12089:3;12085:11;12078:55;12164:20;12159:2;12154:3;12150:12;12143:42;12211:2;12206:3;12202:12;12195:19;;11984:236;;;:::o;12226:370::-;;12389:67;12453:2;12448:3;12389:67;:::i;:::-;12382:74;;12486:34;12482:1;12477:3;12473:11;12466:55;12552:8;12547:2;12542:3;12538:12;12531:30;12587:2;12582:3;12578:12;12571:19;;12372:224;;;:::o;12602:326::-;;12765:67;12829:2;12824:3;12765:67;:::i;:::-;12758:74;;12862:30;12858:1;12853:3;12849:11;12842:51;12919:2;12914:3;12910:12;12903:19;;12748:180;;;:::o;12934:325::-;;13097:67;13161:2;13156:3;13097:67;:::i;:::-;13090:74;;13194:29;13190:1;13185:3;13181:11;13174:50;13250:2;13245:3;13241:12;13234:19;;13080:179;;;:::o;13265:330::-;;13428:67;13492:2;13487:3;13428:67;:::i;:::-;13421:74;;13525:34;13521:1;13516:3;13512:11;13505:55;13586:2;13581:3;13577:12;13570:19;;13411:184;;;:::o;13601:368::-;;13764:67;13828:2;13823:3;13764:67;:::i;:::-;13757:74;;13861:34;13857:1;13852:3;13848:11;13841:55;13927:6;13922:2;13917:3;13913:12;13906:28;13960:2;13955:3;13951:12;13944:19;;13747:222;;;:::o;13975:323::-;;14138:67;14202:2;14197:3;14138:67;:::i;:::-;14131:74;;14235:27;14231:1;14226:3;14222:11;14215:48;14289:2;14284:3;14280:12;14273:19;;14121:177;;;:::o;14304:329::-;;14467:67;14531:2;14526:3;14467:67;:::i;:::-;14460:74;;14564:33;14560:1;14555:3;14551:11;14544:54;14624:2;14619:3;14615:12;14608:19;;14450:183;;;:::o;14639:328::-;;14802:67;14866:2;14861:3;14802:67;:::i;:::-;14795:74;;14899:32;14895:1;14890:3;14886:11;14879:53;14958:2;14953:3;14949:12;14942:19;;14785:182;;;:::o;14973:370::-;;15136:67;15200:2;15195:3;15136:67;:::i;:::-;15129:74;;15233:34;15229:1;15224:3;15220:11;15213:55;15299:8;15294:2;15289:3;15285:12;15278:30;15334:2;15329:3;15325:12;15318:19;;15119:224;;;:::o;15349:376::-;;15512:67;15576:2;15571:3;15512:67;:::i;:::-;15505:74;;15609:34;15605:1;15600:3;15596:11;15589:55;15675:14;15670:2;15665:3;15661:12;15654:36;15716:2;15711:3;15707:12;15700:19;;15495:230;;;:::o;15731:388::-;;15894:67;15958:2;15953:3;15894:67;:::i;:::-;15887:74;;15991:34;15987:1;15982:3;15978:11;15971:55;16057:26;16052:2;16047:3;16043:12;16036:48;16110:2;16105:3;16101:12;16094:19;;15877:242;;;:::o;16125:365::-;;16288:67;16352:2;16347:3;16288:67;:::i;:::-;16281:74;;16385:34;16381:1;16376:3;16372:11;16365:55;16451:3;16446:2;16441:3;16437:12;16430:25;16481:2;16476:3;16472:12;16465:19;;16271:219;;;:::o;16496:374::-;;16659:67;16723:2;16718:3;16659:67;:::i;:::-;16652:74;;16756:34;16752:1;16747:3;16743:11;16736:55;16822:12;16817:2;16812:3;16808:12;16801:34;16861:2;16856:3;16852:12;16845:19;;16642:228;;;:::o;16876:366::-;;17039:67;17103:2;17098:3;17039:67;:::i;:::-;17032:74;;17136:34;17132:1;17127:3;17123:11;17116:55;17202:4;17197:2;17192:3;17188:12;17181:26;17233:2;17228:3;17224:12;17217:19;;17022:220;;;:::o;17248:330::-;;17411:67;17475:2;17470:3;17411:67;:::i;:::-;17404:74;;17508:34;17504:1;17499:3;17495:11;17488:55;17569:2;17564:3;17560:12;17553:19;;17394:184;;;:::o;17584:365::-;;17747:67;17811:2;17806:3;17747:67;:::i;:::-;17740:74;;17844:34;17840:1;17835:3;17831:11;17824:55;17910:3;17905:2;17900:3;17896:12;17889:25;17940:2;17935:3;17931:12;17924:19;;17730:219;;;:::o;17955:376::-;;18118:67;18182:2;18177:3;18118:67;:::i;:::-;18111:74;;18215:34;18211:1;18206:3;18202:11;18195:55;18281:14;18276:2;18271:3;18267:12;18260:36;18322:2;18317:3;18313:12;18306:19;;18101:230;;;:::o;18337:330::-;;18500:67;18564:2;18559:3;18500:67;:::i;:::-;18493:74;;18597:34;18593:1;18588:3;18584:11;18577:55;18658:2;18653:3;18649:12;18642:19;;18483:184;;;:::o;18673:373::-;;18836:67;18900:2;18895:3;18836:67;:::i;:::-;18829:74;;18933:34;18929:1;18924:3;18920:11;18913:55;18999:11;18994:2;18989:3;18985:12;18978:33;19037:2;19032:3;19028:12;19021:19;;18819:227;;;:::o;19052:379::-;;19215:67;19279:2;19274:3;19215:67;:::i;:::-;19208:74;;19312:34;19308:1;19303:3;19299:11;19292:55;19378:17;19373:2;19368:3;19364:12;19357:39;19422:2;19417:3;19413:12;19406:19;;19198:233;;;:::o;19437:365::-;;19600:67;19664:2;19659:3;19600:67;:::i;:::-;19593:74;;19697:34;19693:1;19688:3;19684:11;19677:55;19763:3;19758:2;19753:3;19749:12;19742:25;19793:2;19788:3;19784:12;19777:19;;19583:219;;;:::o;19808:369::-;;19971:67;20035:2;20030:3;19971:67;:::i;:::-;19964:74;;20068:34;20064:1;20059:3;20055:11;20048:55;20134:7;20129:2;20124:3;20120:12;20113:29;20168:2;20163:3;20159:12;20152:19;;19954:223;;;:::o;20183:320::-;;20346:67;20410:2;20405:3;20346:67;:::i;:::-;20339:74;;20443:24;20439:1;20434:3;20430:11;20423:45;20494:2;20489:3;20485:12;20478:19;;20329:174;;;:::o;20509:381::-;;20672:67;20736:2;20731:3;20672:67;:::i;:::-;20665:74;;20769:34;20765:1;20760:3;20756:11;20749:55;20835:19;20830:2;20825:3;20821:12;20814:41;20881:2;20876:3;20872:12;20865:19;;20655:235;;;:::o;20896:327::-;;21059:67;21123:2;21118:3;21059:67;:::i;:::-;21052:74;;21156:31;21152:1;21147:3;21143:11;21136:52;21214:2;21209:3;21205:12;21198:19;;21042:181;;;:::o;21229:324::-;;21392:67;21456:2;21451:3;21392:67;:::i;:::-;21385:74;;21489:28;21485:1;21480:3;21476:11;21469:49;21544:2;21539:3;21535:12;21528:19;;21375:178;;;:::o;21559:373::-;;21722:67;21786:2;21781:3;21722:67;:::i;:::-;21715:74;;21819:34;21815:1;21810:3;21806:11;21799:55;21885:11;21880:2;21875:3;21871:12;21864:33;21923:2;21918:3;21914:12;21907:19;;21705:227;;;:::o;21938:108::-;22015:24;22033:5;22015:24;:::i;:::-;22010:3;22003:37;21993:53;;:::o;22052:118::-;22139:24;22157:5;22139:24;:::i;:::-;22134:3;22127:37;22117:53;;:::o;22176:271::-;;22328:93;22417:3;22408:6;22328:93;:::i;:::-;22321:100;;22438:3;22431:10;;22310:137;;;;:::o;22453:435::-;;22655:95;22746:3;22737:6;22655:95;:::i;:::-;22648:102;;22767:95;22858:3;22849:6;22767:95;:::i;:::-;22760:102;;22879:3;22872:10;;22637:251;;;;;:::o;22894:222::-;;23025:2;23014:9;23010:18;23002:26;;23038:71;23106:1;23095:9;23091:17;23082:6;23038:71;:::i;:::-;22992:124;;;;:::o;23122:672::-;;23371:3;23360:9;23356:19;23348:27;;23385:87;23469:1;23458:9;23454:17;23445:6;23385:87;:::i;:::-;23482:72;23550:2;23539:9;23535:18;23526:6;23482:72;:::i;:::-;23564;23632:2;23621:9;23617:18;23608:6;23564:72;:::i;:::-;23683:9;23677:4;23673:20;23668:2;23657:9;23653:18;23646:48;23711:76;23782:4;23773:6;23711:76;:::i;:::-;23703:84;;23338:456;;;;;;;:::o;23800:413::-;;24001:2;23990:9;23986:18;23978:26;;24050:9;24044:4;24040:20;24036:1;24025:9;24021:17;24014:47;24078:128;24201:4;24192:6;24078:128;:::i;:::-;24070:136;;23968:245;;;;:::o;24219:373::-;;24400:2;24389:9;24385:18;24377:26;;24449:9;24443:4;24439:20;24435:1;24424:9;24420:17;24413:47;24477:108;24580:4;24571:6;24477:108;:::i;:::-;24469:116;;24367:225;;;;:::o;24598:210::-;;24723:2;24712:9;24708:18;24700:26;;24736:65;24798:1;24787:9;24783:17;24774:6;24736:65;:::i;:::-;24690:118;;;;:::o;24814:313::-;;24965:2;24954:9;24950:18;24942:26;;25014:9;25008:4;25004:20;25000:1;24989:9;24985:17;24978:47;25042:78;25115:4;25106:6;25042:78;:::i;:::-;25034:86;;24932:195;;;;:::o;25133:307::-;;25281:2;25270:9;25266:18;25258:26;;25330:9;25324:4;25320:20;25316:1;25305:9;25301:17;25294:47;25358:75;25428:4;25419:6;25358:75;:::i;:::-;25350:83;;25248:192;;;;:::o;25446:419::-;;25650:2;25639:9;25635:18;25627:26;;25699:9;25693:4;25689:20;25685:1;25674:9;25670:17;25663:47;25727:131;25853:4;25727:131;:::i;:::-;25719:139;;25617:248;;;:::o;25871:419::-;;26075:2;26064:9;26060:18;26052:26;;26124:9;26118:4;26114:20;26110:1;26099:9;26095:17;26088:47;26152:131;26278:4;26152:131;:::i;:::-;26144:139;;26042:248;;;:::o;26296:419::-;;26500:2;26489:9;26485:18;26477:26;;26549:9;26543:4;26539:20;26535:1;26524:9;26520:17;26513:47;26577:131;26703:4;26577:131;:::i;:::-;26569:139;;26467:248;;;:::o;26721:419::-;;26925:2;26914:9;26910:18;26902:26;;26974:9;26968:4;26964:20;26960:1;26949:9;26945:17;26938:47;27002:131;27128:4;27002:131;:::i;:::-;26994:139;;26892:248;;;:::o;27146:419::-;;27350:2;27339:9;27335:18;27327:26;;27399:9;27393:4;27389:20;27385:1;27374:9;27370:17;27363:47;27427:131;27553:4;27427:131;:::i;:::-;27419:139;;27317:248;;;:::o;27571:419::-;;27775:2;27764:9;27760:18;27752:26;;27824:9;27818:4;27814:20;27810:1;27799:9;27795:17;27788:47;27852:131;27978:4;27852:131;:::i;:::-;27844:139;;27742:248;;;:::o;27996:419::-;;28200:2;28189:9;28185:18;28177:26;;28249:9;28243:4;28239:20;28235:1;28224:9;28220:17;28213:47;28277:131;28403:4;28277:131;:::i;:::-;28269:139;;28167:248;;;:::o;28421:419::-;;28625:2;28614:9;28610:18;28602:26;;28674:9;28668:4;28664:20;28660:1;28649:9;28645:17;28638:47;28702:131;28828:4;28702:131;:::i;:::-;28694:139;;28592:248;;;:::o;28846:419::-;;29050:2;29039:9;29035:18;29027:26;;29099:9;29093:4;29089:20;29085:1;29074:9;29070:17;29063:47;29127:131;29253:4;29127:131;:::i;:::-;29119:139;;29017:248;;;:::o;29271:419::-;;29475:2;29464:9;29460:18;29452:26;;29524:9;29518:4;29514:20;29510:1;29499:9;29495:17;29488:47;29552:131;29678:4;29552:131;:::i;:::-;29544:139;;29442:248;;;:::o;29696:419::-;;29900:2;29889:9;29885:18;29877:26;;29949:9;29943:4;29939:20;29935:1;29924:9;29920:17;29913:47;29977:131;30103:4;29977:131;:::i;:::-;29969:139;;29867:248;;;:::o;30121:419::-;;30325:2;30314:9;30310:18;30302:26;;30374:9;30368:4;30364:20;30360:1;30349:9;30345:17;30338:47;30402:131;30528:4;30402:131;:::i;:::-;30394:139;;30292:248;;;:::o;30546:419::-;;30750:2;30739:9;30735:18;30727:26;;30799:9;30793:4;30789:20;30785:1;30774:9;30770:17;30763:47;30827:131;30953:4;30827:131;:::i;:::-;30819:139;;30717:248;;;:::o;30971:419::-;;31175:2;31164:9;31160:18;31152:26;;31224:9;31218:4;31214:20;31210:1;31199:9;31195:17;31188:47;31252:131;31378:4;31252:131;:::i;:::-;31244:139;;31142:248;;;:::o;31396:419::-;;31600:2;31589:9;31585:18;31577:26;;31649:9;31643:4;31639:20;31635:1;31624:9;31620:17;31613:47;31677:131;31803:4;31677:131;:::i;:::-;31669:139;;31567:248;;;:::o;31821:419::-;;32025:2;32014:9;32010:18;32002:26;;32074:9;32068:4;32064:20;32060:1;32049:9;32045:17;32038:47;32102:131;32228:4;32102:131;:::i;:::-;32094:139;;31992:248;;;:::o;32246:419::-;;32450:2;32439:9;32435:18;32427:26;;32499:9;32493:4;32489:20;32485:1;32474:9;32470:17;32463:47;32527:131;32653:4;32527:131;:::i;:::-;32519:139;;32417:248;;;:::o;32671:419::-;;32875:2;32864:9;32860:18;32852:26;;32924:9;32918:4;32914:20;32910:1;32899:9;32895:17;32888:47;32952:131;33078:4;32952:131;:::i;:::-;32944:139;;32842:248;;;:::o;33096:419::-;;33300:2;33289:9;33285:18;33277:26;;33349:9;33343:4;33339:20;33335:1;33324:9;33320:17;33313:47;33377:131;33503:4;33377:131;:::i;:::-;33369:139;;33267:248;;;:::o;33521:419::-;;33725:2;33714:9;33710:18;33702:26;;33774:9;33768:4;33764:20;33760:1;33749:9;33745:17;33738:47;33802:131;33928:4;33802:131;:::i;:::-;33794:139;;33692:248;;;:::o;33946:419::-;;34150:2;34139:9;34135:18;34127:26;;34199:9;34193:4;34189:20;34185:1;34174:9;34170:17;34163:47;34227:131;34353:4;34227:131;:::i;:::-;34219:139;;34117:248;;;:::o;34371:419::-;;34575:2;34564:9;34560:18;34552:26;;34624:9;34618:4;34614:20;34610:1;34599:9;34595:17;34588:47;34652:131;34778:4;34652:131;:::i;:::-;34644:139;;34542:248;;;:::o;34796:419::-;;35000:2;34989:9;34985:18;34977:26;;35049:9;35043:4;35039:20;35035:1;35024:9;35020:17;35013:47;35077:131;35203:4;35077:131;:::i;:::-;35069:139;;34967:248;;;:::o;35221:419::-;;35425:2;35414:9;35410:18;35402:26;;35474:9;35468:4;35464:20;35460:1;35449:9;35445:17;35438:47;35502:131;35628:4;35502:131;:::i;:::-;35494:139;;35392:248;;;:::o;35646:419::-;;35850:2;35839:9;35835:18;35827:26;;35899:9;35893:4;35889:20;35885:1;35874:9;35870:17;35863:47;35927:131;36053:4;35927:131;:::i;:::-;35919:139;;35817:248;;;:::o;36071:419::-;;36275:2;36264:9;36260:18;36252:26;;36324:9;36318:4;36314:20;36310:1;36299:9;36295:17;36288:47;36352:131;36478:4;36352:131;:::i;:::-;36344:139;;36242:248;;;:::o;36496:419::-;;36700:2;36689:9;36685:18;36677:26;;36749:9;36743:4;36739:20;36735:1;36724:9;36720:17;36713:47;36777:131;36903:4;36777:131;:::i;:::-;36769:139;;36667:248;;;:::o;36921:419::-;;37125:2;37114:9;37110:18;37102:26;;37174:9;37168:4;37164:20;37160:1;37149:9;37145:17;37138:47;37202:131;37328:4;37202:131;:::i;:::-;37194:139;;37092:248;;;:::o;37346:419::-;;37550:2;37539:9;37535:18;37527:26;;37599:9;37593:4;37589:20;37585:1;37574:9;37570:17;37563:47;37627:131;37753:4;37627:131;:::i;:::-;37619:139;;37517:248;;;:::o;37771:222::-;;37902:2;37891:9;37887:18;37879:26;;37915:71;37983:1;37972:9;37968:17;37959:6;37915:71;:::i;:::-;37869:124;;;;:::o;37999:278::-;;38065:2;38059:9;38049:19;;38107:4;38099:6;38095:17;38214:6;38202:10;38199:22;38178:18;38166:10;38163:34;38160:62;38157:2;;;38225:13;;:::i;:::-;38157:2;38260:10;38256:2;38249:22;38039:238;;;;:::o;38283:326::-;;38434:18;38426:6;38423:30;38420:2;;;38456:13;;:::i;:::-;38420:2;38536:4;38532:9;38525:4;38517:6;38513:17;38509:33;38501:41;;38597:4;38591;38587:15;38579:23;;38349:260;;;:::o;38615:327::-;;38767:18;38759:6;38756:30;38753:2;;;38789:13;;:::i;:::-;38753:2;38869:4;38865:9;38858:4;38850:6;38846:17;38842:33;38834:41;;38930:4;38924;38920:15;38912:23;;38682:260;;;:::o;38948:142::-;;39048:3;39040:11;;39078:4;39073:3;39069:14;39061:22;;39030:60;;;:::o;39096:132::-;;39186:3;39178:11;;39216:4;39211:3;39207:14;39199:22;;39168:60;;;:::o;39234:141::-;;39306:3;39298:11;;39329:3;39326:1;39319:14;39363:4;39360:1;39350:18;39342:26;;39288:87;;;:::o;39381:124::-;;39492:5;39486:12;39476:22;;39465:40;;;:::o;39511:114::-;;39612:5;39606:12;39596:22;;39585:40;;;:::o;39631:98::-;;39716:5;39710:12;39700:22;;39689:40;;;:::o;39735:99::-;;39821:5;39815:12;39805:22;;39794:40;;;:::o;39840:123::-;;39952:4;39947:3;39943:14;39935:22;;39925:38;;;:::o;39969:113::-;;40071:4;40066:3;40062:14;40054:22;;40044:38;;;:::o;40088:194::-;;40231:6;40226:3;40219:19;40271:4;40266:3;40262:14;40247:29;;40209:73;;;;:::o;40288:184::-;;40421:6;40416:3;40409:19;40461:4;40456:3;40452:14;40437:29;;40399:73;;;;:::o;40478:168::-;;40595:6;40590:3;40583:19;40635:4;40630:3;40626:14;40611:29;;40573:73;;;;:::o;40652:147::-;;40790:3;40775:18;;40765:34;;;;:::o;40805:159::-;;40913:6;40908:3;40901:19;40953:4;40948:3;40944:14;40929:29;;40891:73;;;;:::o;40970:169::-;;41088:6;41083:3;41076:19;41128:4;41123:3;41119:14;41104:29;;41066:73;;;;:::o;41145:148::-;;41284:3;41269:18;;41259:34;;;;:::o;41299:96::-;;41365:24;41383:5;41365:24;:::i;:::-;41354:35;;41344:51;;;:::o;41401:104::-;;41475:24;41493:5;41475:24;:::i;:::-;41464:35;;41454:51;;;:::o;41511:90::-;;41588:5;41581:13;41574:21;41563:32;;41553:48;;;:::o;41607:149::-;;41683:66;41676:5;41672:78;41661:89;;41651:105;;;:::o;41762:126::-;;41839:42;41832:5;41828:54;41817:65;;41807:81;;;:::o;41894:77::-;;41960:5;41949:16;;41939:32;;;:::o;41977:154::-;42061:6;42056:3;42051;42038:30;42123:1;42114:6;42109:3;42105:16;42098:27;42028:103;;;:::o;42137:307::-;42205:1;42215:113;42229:6;42226:1;42223:13;42215:113;;;42314:1;42309:3;42305:11;42299:18;42295:1;42290:3;42286:11;42279:39;42251:2;42248:1;42244:10;42239:15;;42215:113;;;42346:6;42343:1;42340:13;42337:2;;;42426:1;42417:6;42412:3;42408:16;42401:27;42337:2;42186:258;;;;:::o;42450:48::-;42483:9;42504:102;;42596:2;42592:7;42587:2;42580:5;42576:14;42572:28;42562:38;;42552:54;;;:::o;42612:122::-;42685:24;42703:5;42685:24;:::i;:::-;42678:5;42675:35;42665:2;;42724:1;42721;42714:12;42665:2;42655:79;:::o;42740:116::-;42810:21;42825:5;42810:21;:::i;:::-;42803:5;42800:32;42790:2;;42846:1;42843;42836:12;42790:2;42780:76;:::o;42862:120::-;42934:23;42951:5;42934:23;:::i;:::-;42927:5;42924:34;42914:2;;42972:1;42969;42962:12;42914:2;42904:78;:::o;42988:122::-;43061:24;43079:5;43061:24;:::i;:::-;43054:5;43051:35;43041:2;;43100:1;43097;43090:12;43041:2;43031:79;:::o

Swarm Source

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