ETH Price: $3,353.96 (-2.78%)
Gas: 2 Gwei

Token

RagingRhinos (RR)
 

Overview

Max Total Supply

5,000 RR

Holders

1,620

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 RR
0xaef4d520430c4b8c343408f0dff4801915b8f8a4
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:
RagingRhinos

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-13
*/

/**
 *Submitted for verification at Etherscan.io on 2021-07-30
*/

// SPDX-License-Identifier: MIT

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

pragma solidity >=0.6.0 <0.8.0;

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

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

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



pragma solidity >=0.6.0 <0.8.0;

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

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



pragma solidity >=0.6.2 <0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity >=0.6.2 <0.8.0;


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

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

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

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

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



pragma solidity >=0.6.2 <0.8.0;


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

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

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

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

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



pragma solidity >=0.6.0 <0.8.0;

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

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



pragma solidity >=0.6.0 <0.8.0;


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

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

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

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

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

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



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity >=0.6.2 <0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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

            bytes32 lastvalue = set._values[lastIndex];

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

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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


    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

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



pragma solidity >=0.6.0 <0.8.0;

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

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

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

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

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

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

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

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

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

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

            MapEntry storage lastEntry = map._entries[lastIndex];

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

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

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

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

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

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

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

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

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

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

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

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

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

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



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}

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



pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) private _operatorApprovals;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Base URI
    string private _baseURI;

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

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

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

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

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

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

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

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

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

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

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

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

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

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

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

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

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(tokenId);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

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

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

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

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

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



pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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


pragma solidity ^0.7.0;
pragma abicoder v2;

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

    string public RHINO_PROVENANCE = ""; // IPFS URL WILL BE ADDED WHEN RHINOS 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 rhinoPrice = 20000000000000000; // 0.02 ETH

    uint public constant maxRhinoPurchase = 20;

    uint256 public constant MAX_RHINOS = 5000;

    bool public saleIsActive = false;
    
    mapping(uint => string) public rhinoNames;
    
    // Reserve 80 Rhinos for team - Giveaways/Prizes etc
    uint public rhinoReserve = 80;
    
    event rhinoNameChange(address _by, uint _tokenId, string _name);
    
    event licenseisLocked(string _licenseText);

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


    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        RHINO_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 RHINO 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 mintRhino(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint Rhino");
        require(numberOfTokens > 0 && numberOfTokens <= maxRhinoPurchase, "Can only mint 20 tokens at a time");
        require(totalSupply().add(numberOfTokens) <= MAX_RHINOS, "Purchase would exceed max supply of Rhinos");
        require(msg.value >= rhinoPrice.mul(numberOfTokens), "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_RHINOS) {
                _safeMint(msg.sender, mintIndex);
            }
        }

    }
    
    
    // GET ALL RHINOS OF A WALLET AS AN ARRAY OF STRINGS. WOULD BE BETTER MAYBE IF IT RETURNED A STRUCT WITH ID-NAME MATCH
    function rhinoNamesOfOwner(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] = rhinoNames[ tokenOfOwnerByIndex(_owner, index) ] ;
            }
            return result;
        }
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"rhinoNameChange","type":"event"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RHINOS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RHINO_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"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":"maxRhinoPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintRhino","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":"reserveRhinos","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rhinoNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"rhinoNamesOfOwner","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rhinoPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rhinoReserve","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":"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"}]

608060405260405180602001604052806000815250600b90805190602001906200002b92919062000334565b5060405180602001604052806000815250600c90805190602001906200005392919062000334565b506000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506050600f553480156200009c57600080fd5b506040518060400160405280600c81526020017f526167696e675268696e6f7300000000000000000000000000000000000000008152506040518060400160405280600281526020017f5252000000000000000000000000000000000000000000000000000000000000815250620001216301ffc9a760e01b6200025460201b60201c565b81600690805190602001906200013992919062000334565b5080600790805190602001906200015292919062000334565b506200016b6380ac58cd60e01b6200025460201b60201c565b62000183635b5e139f60e01b6200025460201b60201c565b6200019b63780e9d6360e01b6200025460201b60201c565b50506000620001af6200032c60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200045f565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b7906200042c565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200036c5760008555620003b8565b82601f106200038757805160ff1916838001178555620003b8565b82800160010185558215620003b8579182015b82811115620003b75782518255916020019190600101906200039a565b5b509050620003c79190620003cb565b5090565b5b80821115620003e6576000816000905550600101620003cc565b5090565b6000620003f9601c836200044e565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600060208201905081810360008301526200044781620003ea565b9050919050565b600082825260208201905092915050565b614d1d806200046f6000396000f3fe6080604052600436106102305760003560e01c80638462151c1161012e578063c87b56dd116100ab578063e985e9c51161006f578063e985e9c51461082e578063eb8d24441461086b578063f230bd6e14610896578063f2fde38b146108c1578063f6b35cdc146108ea57610230565b8063c87b56dd14610735578063d9b137b214610772578063dc1827dc146107af578063dda48411146107da578063e070722a1461080557610230565b8063a22cb465116100f2578063a22cb46514610687578063b09904b5146106b0578063b88d4fde146106d9578063bf4702fc14610702578063c104d45f1461071957610230565b80638462151c1461059e5780638da5cb5b146105db57806391b2bfa41461060657806395d89b41146106315780639c3e72bd1461065c57610230565b806334918dfd116101bc5780635a4d6a68116101805780635a4d6a68146104a55780636352211e146104e25780636c0360eb1461051f57806370a082311461054a578063715018a61461058757610230565b806334918dfd146103e85780633ccfd60b146103ff57806342842e0e146104165780634f6ccce71461043f57806355f804b31461047c57610230565b80631096952311610203578063109695231461030357806318160ddd1461032c5780631d40fde41461035757806323b872dd146103825780632f745c59146103ab57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613750565b610927565b60405161026991906145c4565b60405180910390f35b34801561027e57600080fd5b5061028761098e565b60405161029491906145df565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906137e3565b610a30565b6040516102d19190614519565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190613714565b610ab5565b005b34801561030f57600080fd5b5061032a600480360381019061032591906137a2565b610bcd565b005b34801561033857600080fd5b50610341610c63565b60405161034e91906149c3565b60405180910390f35b34801561036357600080fd5b5061036c610c74565b60405161037991906145df565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a4919061360e565b610d12565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190613714565b610d72565b6040516103df91906149c3565b60405180910390f35b3480156103f457600080fd5b506103fd610dcd565b005b34801561040b57600080fd5b50610414610e75565b005b34801561042257600080fd5b5061043d6004803603810190610438919061360e565b610f40565b005b34801561044b57600080fd5b50610466600480360381019061046191906137e3565b610f60565b60405161047391906149c3565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e91906137a2565b610f83565b005b3480156104b157600080fd5b506104cc60048036038101906104c791906135a9565b61100b565b6040516104d99190614580565b60405180910390f35b3480156104ee57600080fd5b50610509600480360381019061050491906137e3565b6111b8565b6040516105169190614519565b60405180910390f35b34801561052b57600080fd5b506105346111ef565b60405161054191906145df565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c91906135a9565b611291565b60405161057e91906149c3565b60405180910390f35b34801561059357600080fd5b5061059c611350565b005b3480156105aa57600080fd5b506105c560048036038101906105c091906135a9565b61148d565b6040516105d291906145a2565b60405180910390f35b3480156105e757600080fd5b506105f0611586565b6040516105fd9190614519565b60405180910390f35b34801561061257600080fd5b5061061b6115b0565b60405161062891906149c3565b60405180910390f35b34801561063d57600080fd5b506106466115b6565b60405161065391906145df565b60405180910390f35b34801561066857600080fd5b50610671611658565b60405161067e91906145df565b60405180910390f35b34801561069357600080fd5b506106ae60048036038101906106a991906136d8565b6116f6565b005b3480156106bc57600080fd5b506106d760048036038101906106d291906137a2565b611877565b005b3480156106e557600080fd5b5061070060048036038101906106fb919061365d565b611963565b005b34801561070e57600080fd5b506107176119c5565b005b610733600480360381019061072e91906137e3565b611a96565b005b34801561074157600080fd5b5061075c600480360381019061075791906137e3565b611c34565b60405161076991906145df565b60405180910390f35b34801561077e57600080fd5b50610799600480360381019061079491906137e3565b611db7565b6040516107a691906145df565b60405180910390f35b3480156107bb57600080fd5b506107c4611ea4565b6040516107d191906149c3565b60405180910390f35b3480156107e657600080fd5b506107ef611eaf565b6040516107fc91906149c3565b60405180910390f35b34801561081157600080fd5b5061082c60048036038101906108279190613714565b611eb5565b005b34801561083a57600080fd5b50610855600480360381019061085091906135d2565b611fd3565b60405161086291906145c4565b60405180910390f35b34801561087757600080fd5b50610880612067565b60405161088d91906145c4565b60405180910390f35b3480156108a257600080fd5b506108ab61207a565b6040516108b891906149c3565b60405180910390f35b3480156108cd57600080fd5b506108e860048036038101906108e391906135a9565b61207f565b005b3480156108f657600080fd5b50610911600480360381019061090c91906137e3565b61222b565b60405161091e91906145df565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a265780601f106109fb57610100808354040283529160200191610a26565b820191906000526020600020905b815481529060010190602001808311610a0957829003601f168201915b5050505050905090565b6000610a3b826122db565b610a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7190614883565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac0826111b8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614903565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b506122f8565b73ffffffffffffffffffffffffffffffffffffffff161480610b7f5750610b7e81610b796122f8565b611fd3565b5b610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb5906147c3565b60405180910390fd5b610bc88383612300565b505050565b610bd56122f8565b73ffffffffffffffffffffffffffffffffffffffff16610bf3611586565b73ffffffffffffffffffffffffffffffffffffffff1614610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c40906148a3565b60405180910390fd5b80600b9080519060200190610c5f9291906133c5565b5050565b6000610c6f60026123b9565b905090565b600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d0a5780601f10610cdf57610100808354040283529160200191610d0a565b820191906000526020600020905b815481529060010190602001808311610ced57829003601f168201915b505050505081565b610d23610d1d6122f8565b826123ce565b610d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5990614963565b60405180910390fd5b610d6d8383836124ac565b505050565b6000610dc582600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206126c390919063ffffffff16565b905092915050565b610dd56122f8565b73ffffffffffffffffffffffffffffffffffffffff16610df3611586565b73ffffffffffffffffffffffffffffffffffffffff1614610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906148a3565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b610e7d6122f8565b73ffffffffffffffffffffffffffffffffffffffff16610e9b611586565b73ffffffffffffffffffffffffffffffffffffffff1614610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906148a3565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f3c573d6000803e3d6000fd5b5050565b610f5b83838360405180602001604052806000815250611963565b505050565b600080610f778360026126dd90919063ffffffff16565b50905080915050919050565b610f8b6122f8565b73ffffffffffffffffffffffffffffffffffffffff16610fa9611586565b73ffffffffffffffffffffffffffffffffffffffff1614610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff6906148a3565b60405180910390fd5b61100881612709565b50565b6060600061101883611291565b9050600081141561107857600067ffffffffffffffff8111801561103b57600080fd5b5060405190808252806020026020018201604052801561106f57816020015b606081526020019060019003908161105a5790505b509150506111b3565b60008167ffffffffffffffff8111801561109157600080fd5b506040519080825280602002602001820160405280156110c557816020015b60608152602001906001900390816110b05790505b50905060005b828110156111ac57600e60006110e18784610d72565b81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111835780601f1061115857610100808354040283529160200191611183565b820191906000526020600020905b81548152906001019060200180831161116657829003601f168201915b505050505082828151811061119457fe5b602002602001018190525080806001019150506110cb565b8193505050505b919050565b60006111e882604051806060016040528060298152602001614cbf6029913960026127239092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112875780601f1061125c57610100808354040283529160200191611287565b820191906000526020600020905b81548152906001019060200180831161126a57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f9906147e3565b60405180910390fd5b611349600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612742565b9050919050565b6113586122f8565b73ffffffffffffffffffffffffffffffffffffffff16611376611586565b73ffffffffffffffffffffffffffffffffffffffff16146113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c3906148a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6060600061149a83611291565b905060008114156114f557600067ffffffffffffffff811180156114bd57600080fd5b506040519080825280602002602001820160405280156114ec5781602001602082028036833780820191505090505b50915050611581565b60008167ffffffffffffffff8111801561150e57600080fd5b5060405190808252806020026020018201604052801561153d5781602001602082028036833780820191505090505b50905060005b8281101561157a576115558582610d72565b82828151811061156157fe5b6020026020010181815250508080600101915050611543565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f5481565b606060078054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561164e5780601f106116235761010080835404028352916020019161164e565b820191906000526020600020905b81548152906001019060200180831161163157829003601f168201915b5050505050905090565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ee5780601f106116c3576101008083540402835291602001916116ee565b820191906000526020600020905b8154815290600101906020018083116116d157829003601f168201915b505050505081565b6116fe6122f8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561176c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176390614703565b60405180910390fd5b80600560006117796122f8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118266122f8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161186b91906145c4565b60405180910390a35050565b61187f6122f8565b73ffffffffffffffffffffffffffffffffffffffff1661189d611586565b73ffffffffffffffffffffffffffffffffffffffff16146118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea906148a3565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514611949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194090614943565b60405180910390fd5b80600c908051906020019061195f9291906133c5565b5050565b61197461196e6122f8565b836123ce565b6119b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119aa90614963565b60405180910390fd5b6119bf84848484612757565b50505050565b6119cd6122f8565b73ffffffffffffffffffffffffffffffffffffffff166119eb611586565b73ffffffffffffffffffffffffffffffffffffffff1614611a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a38906148a3565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600c604051611a8c9190614601565b60405180910390a1565b600d60019054906101000a900460ff16611ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adc90614803565b60405180910390fd5b600081118015611af6575060148111155b611b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2c906147a3565b60405180910390fd5b611388611b5282611b44610c63565b6127b390919063ffffffff16565b1115611b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8a90614923565b60405180910390fd5b611bad8166470de4df82000061280890919063ffffffff16565b341015611bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be690614723565b60405180910390fd5b60005b81811015611c30576000611c04610c63565b9050611388611c11610c63565b1015611c2257611c213382612878565b5b508080600101915050611bf2565b5050565b6060611c3f826122db565b611c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c75906148e3565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d275780601f10611cfc57610100808354040283529160200191611d27565b820191906000526020600020905b815481529060010190602001808311611d0a57829003601f168201915b505050505090506000611d386111ef565b9050600081511415611d4e578192505050611db2565b600082511115611d83578082604051602001611d6b9291906144f5565b60405160208183030381529060405292505050611db2565b80611d8d85612896565b604051602001611d9e9291906144f5565b604051602081830303815290604052925050505b919050565b6060611dc1610c63565b8210611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df9906149a3565b60405180910390fd5b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e985780601f10611e6d57610100808354040283529160200191611e98565b820191906000526020600020905b815481529060010190602001808311611e7b57829003601f168201915b50505050509050919050565b66470de4df82000081565b61138881565b611ebd6122f8565b73ffffffffffffffffffffffffffffffffffffffff16611edb611586565b73ffffffffffffffffffffffffffffffffffffffff1614611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f28906148a3565b60405180910390fd5b6000611f3b610c63565b9050600082118015611f4f5750600f548211155b611f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f85906146c3565b60405180910390fd5b60005b82811015611fb257611fa584828401612878565b8080600101915050611f91565b50611fc882600f546129dd90919063ffffffff16565b600f81905550505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60019054906101000a900460ff1681565b601481565b6120876122f8565b73ffffffffffffffffffffffffffffffffffffffff166120a5611586565b73ffffffffffffffffffffffffffffffffffffffff16146120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f2906148a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561216b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216290614663565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122d35780601f106122a8576101008083540402835291602001916122d3565b820191906000526020600020905b8154815290600101906020018083116122b657829003601f168201915b505050505081565b60006122f1826002612a2d90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612373836111b8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123c782600001612a47565b9050919050565b60006123d9826122db565b612418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240f90614783565b60405180910390fd5b6000612423836111b8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061249257508373ffffffffffffffffffffffffffffffffffffffff1661247a84610a30565b73ffffffffffffffffffffffffffffffffffffffff16145b806124a357506124a28185611fd3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124cc826111b8565b73ffffffffffffffffffffffffffffffffffffffff1614612522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612519906148c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612592576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612589906146e3565b60405180910390fd5b61259d838383612a58565b6125a8600082612300565b6125f981600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a5d90919063ffffffff16565b5061264b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a7790919063ffffffff16565b5061266281836002612a919092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006126d28360000183612ac6565b60001c905092915050565b6000806000806126f08660000186612b33565b915091508160001c8160001c9350935050509250929050565b806009908051906020019061271f9291906133c5565b5050565b6000612736846000018460001b84612bb6565b60001c90509392505050565b600061275082600001612c47565b9050919050565b6127628484846124ac565b61276e84848484612c58565b6127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490614643565b60405180910390fd5b50505050565b6000808284019050838110156127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f5906146a3565b60405180910390fd5b8091505092915050565b60008083141561281b5760009050612872565b600082840290508284828161282c57fe5b041461286d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286490614863565b60405180910390fd5b809150505b92915050565b612892828260405180602001604052806000815250612dbc565b5050565b606060008214156128de576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129d8565b600082905060005b60008214612908578080600101915050600a828161290057fe5b0491506128e6565b60008167ffffffffffffffff8111801561292157600080fd5b506040519080825280601f01601f1916602001820160405280156129545781602001600182028036833780820191505090505b50905060006001830390508593505b600084146129d057600a848161297557fe5b0660300160f81b8282806001900393508151811061298f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816129c857fe5b049350612963565b819450505050505b919050565b600082821115612a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1990614743565b60405180910390fd5b818303905092915050565b6000612a3f836000018360001b612e17565b905092915050565b600081600001805490509050919050565b505050565b6000612a6f836000018360001b612e3a565b905092915050565b6000612a89836000018360001b612f22565b905092915050565b6000612abd846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b612f92565b90509392505050565b600081836000018054905011612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0890614623565b60405180910390fd5b826000018281548110612b2057fe5b9060005260206000200154905092915050565b60008082846000018054905011612b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7690614823565b60405180910390fd5b6000846000018481548110612b9057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0f91906145df565b60405180910390fd5b50846000016001820381548110612c2b57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612c798473ffffffffffffffffffffffffffffffffffffffff1661306e565b612c865760019050612db4565b6000612d4d63150b7a0260e01b612c9b6122f8565b888787604051602401612cb19493929190614534565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001614c8d603291398773ffffffffffffffffffffffffffffffffffffffff166130819092919063ffffffff16565b9050600081806020019051810190612d659190613779565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b612dc68383613099565b612dd36000848484612c58565b612e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0990614643565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114612f165760006001820390506000600186600001805490500390506000866000018281548110612e8557fe5b9060005260206000200154905080876000018481548110612ea257fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612eda57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612f1c565b60009150505b92915050565b6000612f2e8383613227565b612f87578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612f8c565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561303957846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613067565b8285600001600183038154811061304c57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b6060613090848460008561324a565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310090614843565b60405180910390fd5b613112816122db565b15613152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314990614683565b60405180910390fd5b61315e60008383612a58565b6131af81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a7790919063ffffffff16565b506131c681836002612a919092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561328f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328690614763565b60405180910390fd5b6132988561306e565b6132d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ce90614983565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161330091906144de565b60006040518083038185875af1925050503d806000811461333d576040519150601f19603f3d011682016040523d82523d6000602084013e613342565b606091505b509150915061335282828661335e565b92505050949350505050565b6060831561336e578290506133be565b6000835111156133815782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b591906145df565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826133fb5760008555613442565b82601f1061341457805160ff1916838001178555613442565b82800160010185558215613442579182015b82811115613441578251825591602001919060010190613426565b5b50905061344f9190613453565b5090565b5b8082111561346c576000816000905550600101613454565b5090565b600061348361347e84614a0f565b6149de565b90508281526020810184848401111561349b57600080fd5b6134a6848285614bdb565b509392505050565b60006134c16134bc84614a3f565b6149de565b9050828152602081018484840111156134d957600080fd5b6134e4848285614bdb565b509392505050565b6000813590506134fb81614c30565b92915050565b60008135905061351081614c47565b92915050565b60008135905061352581614c5e565b92915050565b60008151905061353a81614c5e565b92915050565b600082601f83011261355157600080fd5b8135613561848260208601613470565b91505092915050565b600082601f83011261357b57600080fd5b813561358b8482602086016134ae565b91505092915050565b6000813590506135a381614c75565b92915050565b6000602082840312156135bb57600080fd5b60006135c9848285016134ec565b91505092915050565b600080604083850312156135e557600080fd5b60006135f3858286016134ec565b9250506020613604858286016134ec565b9150509250929050565b60008060006060848603121561362357600080fd5b6000613631868287016134ec565b9350506020613642868287016134ec565b925050604061365386828701613594565b9150509250925092565b6000806000806080858703121561367357600080fd5b6000613681878288016134ec565b9450506020613692878288016134ec565b93505060406136a387828801613594565b925050606085013567ffffffffffffffff8111156136c057600080fd5b6136cc87828801613540565b91505092959194509250565b600080604083850312156136eb57600080fd5b60006136f9858286016134ec565b925050602061370a85828601613501565b9150509250929050565b6000806040838503121561372757600080fd5b6000613735858286016134ec565b925050602061374685828601613594565b9150509250929050565b60006020828403121561376257600080fd5b600061377084828501613516565b91505092915050565b60006020828403121561378b57600080fd5b60006137998482850161352b565b91505092915050565b6000602082840312156137b457600080fd5b600082013567ffffffffffffffff8111156137ce57600080fd5b6137da8482850161356a565b91505092915050565b6000602082840312156137f557600080fd5b600061380384828501613594565b91505092915050565b600061381883836139a2565b905092915050565b600061382c83836144c0565b60208301905092915050565b61384181614b67565b82525050565b61385081614b55565b82525050565b600061386182614aa4565b61386b8185614aea565b93508360208202850161387d85614a6f565b8060005b858110156138b9578484038952815161389a858261380c565b94506138a583614ad0565b925060208a01995050600181019050613881565b50829750879550505050505092915050565b60006138d682614aaf565b6138e08185614afb565b93506138eb83614a7f565b8060005b8381101561391c5781516139038882613820565b975061390e83614add565b9250506001810190506138ef565b5085935050505092915050565b61393281614b79565b82525050565b600061394382614aba565b61394d8185614b0c565b935061395d818560208601614bea565b61396681614c1f565b840191505092915050565b600061397c82614aba565b6139868185614b1d565b9350613996818560208601614bea565b80840191505092915050565b60006139ad82614ac5565b6139b78185614b28565b93506139c7818560208601614bea565b6139d081614c1f565b840191505092915050565b60006139e682614ac5565b6139f08185614b39565b9350613a00818560208601614bea565b613a0981614c1f565b840191505092915050565b6000613a1f82614ac5565b613a298185614b4a565b9350613a39818560208601614bea565b80840191505092915050565b600081546001811660008114613a625760018114613a8857613acc565b607f6002830416613a738187614b39565b955060ff198316865260208601935050613acc565b60028204613a968187614b39565b9550613aa185614a8f565b60005b82811015613ac357815481890152600182019150602081019050613aa4565b80880195505050505b505092915050565b6000613ae1602283614b39565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b47603283614b39565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613bad602683614b39565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c13601c83614b39565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613c53601b83614b39565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613c93602083614b39565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b6000613cd3602483614b39565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d39601983614b39565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613d79601f83614b39565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613db9601e83614b39565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b6000613df9602683614b39565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e5f602c83614b39565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ec5602183614b39565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f2b603883614b39565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613f91602a83614b39565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ff7602183614b39565b91507f53616c65206d7573742062652061637469766520746f206d696e74205268696e60008301527f6f000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061405d602283614b39565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140c3602083614b39565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614103602183614b39565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614169602c83614b39565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006141cf602083614b39565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061420f602983614b39565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614275602f83614b39565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006142db602183614b39565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614341602a83614b39565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66205268696e6f73000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a7601683614b39565b91507f4c6963656e736520616c7265616479206c6f636b6564000000000000000000006000830152602082019050919050565b60006143e7603183614b39565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061444d601d83614b39565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600061448d601b83614b39565b91507f43484f4f53452041205248494e4f2057495448494e2052414e474500000000006000830152602082019050919050565b6144c981614bd1565b82525050565b6144d881614bd1565b82525050565b60006144ea8284613971565b915081905092915050565b60006145018285613a14565b915061450d8284613a14565b91508190509392505050565b600060208201905061452e6000830184613847565b92915050565b60006080820190506145496000830187613838565b6145566020830186613847565b61456360408301856144cf565b81810360608301526145758184613938565b905095945050505050565b6000602082019050818103600083015261459a8184613856565b905092915050565b600060208201905081810360008301526145bc81846138cb565b905092915050565b60006020820190506145d96000830184613929565b92915050565b600060208201905081810360008301526145f981846139db565b905092915050565b6000602082019050818103600083015261461b8184613a45565b905092915050565b6000602082019050818103600083015261463c81613ad4565b9050919050565b6000602082019050818103600083015261465c81613b3a565b9050919050565b6000602082019050818103600083015261467c81613ba0565b9050919050565b6000602082019050818103600083015261469c81613c06565b9050919050565b600060208201905081810360008301526146bc81613c46565b9050919050565b600060208201905081810360008301526146dc81613c86565b9050919050565b600060208201905081810360008301526146fc81613cc6565b9050919050565b6000602082019050818103600083015261471c81613d2c565b9050919050565b6000602082019050818103600083015261473c81613d6c565b9050919050565b6000602082019050818103600083015261475c81613dac565b9050919050565b6000602082019050818103600083015261477c81613dec565b9050919050565b6000602082019050818103600083015261479c81613e52565b9050919050565b600060208201905081810360008301526147bc81613eb8565b9050919050565b600060208201905081810360008301526147dc81613f1e565b9050919050565b600060208201905081810360008301526147fc81613f84565b9050919050565b6000602082019050818103600083015261481c81613fea565b9050919050565b6000602082019050818103600083015261483c81614050565b9050919050565b6000602082019050818103600083015261485c816140b6565b9050919050565b6000602082019050818103600083015261487c816140f6565b9050919050565b6000602082019050818103600083015261489c8161415c565b9050919050565b600060208201905081810360008301526148bc816141c2565b9050919050565b600060208201905081810360008301526148dc81614202565b9050919050565b600060208201905081810360008301526148fc81614268565b9050919050565b6000602082019050818103600083015261491c816142ce565b9050919050565b6000602082019050818103600083015261493c81614334565b9050919050565b6000602082019050818103600083015261495c8161439a565b9050919050565b6000602082019050818103600083015261497c816143da565b9050919050565b6000602082019050818103600083015261499c81614440565b9050919050565b600060208201905081810360008301526149bc81614480565b9050919050565b60006020820190506149d860008301846144cf565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614a0557614a04614c1d565b5b8060405250919050565b600067ffffffffffffffff821115614a2a57614a29614c1d565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614a5a57614a59614c1d565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b6082614bb1565b9050919050565b6000614b7282614bb1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c08578082015181840152602081019050614bed565b83811115614c17576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b614c3981614b55565b8114614c4457600080fd5b50565b614c5081614b79565b8114614c5b57600080fd5b50565b614c6781614b85565b8114614c7257600080fd5b50565b614c7e81614bd1565b8114614c8957600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212209ddbb8b5e91ff72ce7c53260f366cfe065f51b708aceb1329403db1e2105a37c64736f6c63430007060033

Deployed Bytecode

0x6080604052600436106102305760003560e01c80638462151c1161012e578063c87b56dd116100ab578063e985e9c51161006f578063e985e9c51461082e578063eb8d24441461086b578063f230bd6e14610896578063f2fde38b146108c1578063f6b35cdc146108ea57610230565b8063c87b56dd14610735578063d9b137b214610772578063dc1827dc146107af578063dda48411146107da578063e070722a1461080557610230565b8063a22cb465116100f2578063a22cb46514610687578063b09904b5146106b0578063b88d4fde146106d9578063bf4702fc14610702578063c104d45f1461071957610230565b80638462151c1461059e5780638da5cb5b146105db57806391b2bfa41461060657806395d89b41146106315780639c3e72bd1461065c57610230565b806334918dfd116101bc5780635a4d6a68116101805780635a4d6a68146104a55780636352211e146104e25780636c0360eb1461051f57806370a082311461054a578063715018a61461058757610230565b806334918dfd146103e85780633ccfd60b146103ff57806342842e0e146104165780634f6ccce71461043f57806355f804b31461047c57610230565b80631096952311610203578063109695231461030357806318160ddd1461032c5780631d40fde41461035757806323b872dd146103825780632f745c59146103ab57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613750565b610927565b60405161026991906145c4565b60405180910390f35b34801561027e57600080fd5b5061028761098e565b60405161029491906145df565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906137e3565b610a30565b6040516102d19190614519565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190613714565b610ab5565b005b34801561030f57600080fd5b5061032a600480360381019061032591906137a2565b610bcd565b005b34801561033857600080fd5b50610341610c63565b60405161034e91906149c3565b60405180910390f35b34801561036357600080fd5b5061036c610c74565b60405161037991906145df565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a4919061360e565b610d12565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190613714565b610d72565b6040516103df91906149c3565b60405180910390f35b3480156103f457600080fd5b506103fd610dcd565b005b34801561040b57600080fd5b50610414610e75565b005b34801561042257600080fd5b5061043d6004803603810190610438919061360e565b610f40565b005b34801561044b57600080fd5b50610466600480360381019061046191906137e3565b610f60565b60405161047391906149c3565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e91906137a2565b610f83565b005b3480156104b157600080fd5b506104cc60048036038101906104c791906135a9565b61100b565b6040516104d99190614580565b60405180910390f35b3480156104ee57600080fd5b50610509600480360381019061050491906137e3565b6111b8565b6040516105169190614519565b60405180910390f35b34801561052b57600080fd5b506105346111ef565b60405161054191906145df565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c91906135a9565b611291565b60405161057e91906149c3565b60405180910390f35b34801561059357600080fd5b5061059c611350565b005b3480156105aa57600080fd5b506105c560048036038101906105c091906135a9565b61148d565b6040516105d291906145a2565b60405180910390f35b3480156105e757600080fd5b506105f0611586565b6040516105fd9190614519565b60405180910390f35b34801561061257600080fd5b5061061b6115b0565b60405161062891906149c3565b60405180910390f35b34801561063d57600080fd5b506106466115b6565b60405161065391906145df565b60405180910390f35b34801561066857600080fd5b50610671611658565b60405161067e91906145df565b60405180910390f35b34801561069357600080fd5b506106ae60048036038101906106a991906136d8565b6116f6565b005b3480156106bc57600080fd5b506106d760048036038101906106d291906137a2565b611877565b005b3480156106e557600080fd5b5061070060048036038101906106fb919061365d565b611963565b005b34801561070e57600080fd5b506107176119c5565b005b610733600480360381019061072e91906137e3565b611a96565b005b34801561074157600080fd5b5061075c600480360381019061075791906137e3565b611c34565b60405161076991906145df565b60405180910390f35b34801561077e57600080fd5b50610799600480360381019061079491906137e3565b611db7565b6040516107a691906145df565b60405180910390f35b3480156107bb57600080fd5b506107c4611ea4565b6040516107d191906149c3565b60405180910390f35b3480156107e657600080fd5b506107ef611eaf565b6040516107fc91906149c3565b60405180910390f35b34801561081157600080fd5b5061082c60048036038101906108279190613714565b611eb5565b005b34801561083a57600080fd5b50610855600480360381019061085091906135d2565b611fd3565b60405161086291906145c4565b60405180910390f35b34801561087757600080fd5b50610880612067565b60405161088d91906145c4565b60405180910390f35b3480156108a257600080fd5b506108ab61207a565b6040516108b891906149c3565b60405180910390f35b3480156108cd57600080fd5b506108e860048036038101906108e391906135a9565b61207f565b005b3480156108f657600080fd5b50610911600480360381019061090c91906137e3565b61222b565b60405161091e91906145df565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a265780601f106109fb57610100808354040283529160200191610a26565b820191906000526020600020905b815481529060010190602001808311610a0957829003601f168201915b5050505050905090565b6000610a3b826122db565b610a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7190614883565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac0826111b8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614903565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b506122f8565b73ffffffffffffffffffffffffffffffffffffffff161480610b7f5750610b7e81610b796122f8565b611fd3565b5b610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb5906147c3565b60405180910390fd5b610bc88383612300565b505050565b610bd56122f8565b73ffffffffffffffffffffffffffffffffffffffff16610bf3611586565b73ffffffffffffffffffffffffffffffffffffffff1614610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c40906148a3565b60405180910390fd5b80600b9080519060200190610c5f9291906133c5565b5050565b6000610c6f60026123b9565b905090565b600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d0a5780601f10610cdf57610100808354040283529160200191610d0a565b820191906000526020600020905b815481529060010190602001808311610ced57829003601f168201915b505050505081565b610d23610d1d6122f8565b826123ce565b610d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5990614963565b60405180910390fd5b610d6d8383836124ac565b505050565b6000610dc582600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206126c390919063ffffffff16565b905092915050565b610dd56122f8565b73ffffffffffffffffffffffffffffffffffffffff16610df3611586565b73ffffffffffffffffffffffffffffffffffffffff1614610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906148a3565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b610e7d6122f8565b73ffffffffffffffffffffffffffffffffffffffff16610e9b611586565b73ffffffffffffffffffffffffffffffffffffffff1614610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906148a3565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f3c573d6000803e3d6000fd5b5050565b610f5b83838360405180602001604052806000815250611963565b505050565b600080610f778360026126dd90919063ffffffff16565b50905080915050919050565b610f8b6122f8565b73ffffffffffffffffffffffffffffffffffffffff16610fa9611586565b73ffffffffffffffffffffffffffffffffffffffff1614610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff6906148a3565b60405180910390fd5b61100881612709565b50565b6060600061101883611291565b9050600081141561107857600067ffffffffffffffff8111801561103b57600080fd5b5060405190808252806020026020018201604052801561106f57816020015b606081526020019060019003908161105a5790505b509150506111b3565b60008167ffffffffffffffff8111801561109157600080fd5b506040519080825280602002602001820160405280156110c557816020015b60608152602001906001900390816110b05790505b50905060005b828110156111ac57600e60006110e18784610d72565b81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111835780601f1061115857610100808354040283529160200191611183565b820191906000526020600020905b81548152906001019060200180831161116657829003601f168201915b505050505082828151811061119457fe5b602002602001018190525080806001019150506110cb565b8193505050505b919050565b60006111e882604051806060016040528060298152602001614cbf6029913960026127239092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112875780601f1061125c57610100808354040283529160200191611287565b820191906000526020600020905b81548152906001019060200180831161126a57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f9906147e3565b60405180910390fd5b611349600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612742565b9050919050565b6113586122f8565b73ffffffffffffffffffffffffffffffffffffffff16611376611586565b73ffffffffffffffffffffffffffffffffffffffff16146113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c3906148a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6060600061149a83611291565b905060008114156114f557600067ffffffffffffffff811180156114bd57600080fd5b506040519080825280602002602001820160405280156114ec5781602001602082028036833780820191505090505b50915050611581565b60008167ffffffffffffffff8111801561150e57600080fd5b5060405190808252806020026020018201604052801561153d5781602001602082028036833780820191505090505b50905060005b8281101561157a576115558582610d72565b82828151811061156157fe5b6020026020010181815250508080600101915050611543565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f5481565b606060078054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561164e5780601f106116235761010080835404028352916020019161164e565b820191906000526020600020905b81548152906001019060200180831161163157829003601f168201915b5050505050905090565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ee5780601f106116c3576101008083540402835291602001916116ee565b820191906000526020600020905b8154815290600101906020018083116116d157829003601f168201915b505050505081565b6116fe6122f8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561176c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176390614703565b60405180910390fd5b80600560006117796122f8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118266122f8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161186b91906145c4565b60405180910390a35050565b61187f6122f8565b73ffffffffffffffffffffffffffffffffffffffff1661189d611586565b73ffffffffffffffffffffffffffffffffffffffff16146118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea906148a3565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514611949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194090614943565b60405180910390fd5b80600c908051906020019061195f9291906133c5565b5050565b61197461196e6122f8565b836123ce565b6119b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119aa90614963565b60405180910390fd5b6119bf84848484612757565b50505050565b6119cd6122f8565b73ffffffffffffffffffffffffffffffffffffffff166119eb611586565b73ffffffffffffffffffffffffffffffffffffffff1614611a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a38906148a3565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600c604051611a8c9190614601565b60405180910390a1565b600d60019054906101000a900460ff16611ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adc90614803565b60405180910390fd5b600081118015611af6575060148111155b611b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2c906147a3565b60405180910390fd5b611388611b5282611b44610c63565b6127b390919063ffffffff16565b1115611b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8a90614923565b60405180910390fd5b611bad8166470de4df82000061280890919063ffffffff16565b341015611bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be690614723565b60405180910390fd5b60005b81811015611c30576000611c04610c63565b9050611388611c11610c63565b1015611c2257611c213382612878565b5b508080600101915050611bf2565b5050565b6060611c3f826122db565b611c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c75906148e3565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d275780601f10611cfc57610100808354040283529160200191611d27565b820191906000526020600020905b815481529060010190602001808311611d0a57829003601f168201915b505050505090506000611d386111ef565b9050600081511415611d4e578192505050611db2565b600082511115611d83578082604051602001611d6b9291906144f5565b60405160208183030381529060405292505050611db2565b80611d8d85612896565b604051602001611d9e9291906144f5565b604051602081830303815290604052925050505b919050565b6060611dc1610c63565b8210611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df9906149a3565b60405180910390fd5b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e985780601f10611e6d57610100808354040283529160200191611e98565b820191906000526020600020905b815481529060010190602001808311611e7b57829003601f168201915b50505050509050919050565b66470de4df82000081565b61138881565b611ebd6122f8565b73ffffffffffffffffffffffffffffffffffffffff16611edb611586565b73ffffffffffffffffffffffffffffffffffffffff1614611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f28906148a3565b60405180910390fd5b6000611f3b610c63565b9050600082118015611f4f5750600f548211155b611f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f85906146c3565b60405180910390fd5b60005b82811015611fb257611fa584828401612878565b8080600101915050611f91565b50611fc882600f546129dd90919063ffffffff16565b600f81905550505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60019054906101000a900460ff1681565b601481565b6120876122f8565b73ffffffffffffffffffffffffffffffffffffffff166120a5611586565b73ffffffffffffffffffffffffffffffffffffffff16146120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f2906148a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561216b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216290614663565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122d35780601f106122a8576101008083540402835291602001916122d3565b820191906000526020600020905b8154815290600101906020018083116122b657829003601f168201915b505050505081565b60006122f1826002612a2d90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612373836111b8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123c782600001612a47565b9050919050565b60006123d9826122db565b612418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240f90614783565b60405180910390fd5b6000612423836111b8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061249257508373ffffffffffffffffffffffffffffffffffffffff1661247a84610a30565b73ffffffffffffffffffffffffffffffffffffffff16145b806124a357506124a28185611fd3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124cc826111b8565b73ffffffffffffffffffffffffffffffffffffffff1614612522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612519906148c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612592576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612589906146e3565b60405180910390fd5b61259d838383612a58565b6125a8600082612300565b6125f981600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a5d90919063ffffffff16565b5061264b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a7790919063ffffffff16565b5061266281836002612a919092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006126d28360000183612ac6565b60001c905092915050565b6000806000806126f08660000186612b33565b915091508160001c8160001c9350935050509250929050565b806009908051906020019061271f9291906133c5565b5050565b6000612736846000018460001b84612bb6565b60001c90509392505050565b600061275082600001612c47565b9050919050565b6127628484846124ac565b61276e84848484612c58565b6127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490614643565b60405180910390fd5b50505050565b6000808284019050838110156127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f5906146a3565b60405180910390fd5b8091505092915050565b60008083141561281b5760009050612872565b600082840290508284828161282c57fe5b041461286d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286490614863565b60405180910390fd5b809150505b92915050565b612892828260405180602001604052806000815250612dbc565b5050565b606060008214156128de576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129d8565b600082905060005b60008214612908578080600101915050600a828161290057fe5b0491506128e6565b60008167ffffffffffffffff8111801561292157600080fd5b506040519080825280601f01601f1916602001820160405280156129545781602001600182028036833780820191505090505b50905060006001830390508593505b600084146129d057600a848161297557fe5b0660300160f81b8282806001900393508151811061298f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816129c857fe5b049350612963565b819450505050505b919050565b600082821115612a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1990614743565b60405180910390fd5b818303905092915050565b6000612a3f836000018360001b612e17565b905092915050565b600081600001805490509050919050565b505050565b6000612a6f836000018360001b612e3a565b905092915050565b6000612a89836000018360001b612f22565b905092915050565b6000612abd846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b612f92565b90509392505050565b600081836000018054905011612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0890614623565b60405180910390fd5b826000018281548110612b2057fe5b9060005260206000200154905092915050565b60008082846000018054905011612b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7690614823565b60405180910390fd5b6000846000018481548110612b9057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0f91906145df565b60405180910390fd5b50846000016001820381548110612c2b57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612c798473ffffffffffffffffffffffffffffffffffffffff1661306e565b612c865760019050612db4565b6000612d4d63150b7a0260e01b612c9b6122f8565b888787604051602401612cb19493929190614534565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001614c8d603291398773ffffffffffffffffffffffffffffffffffffffff166130819092919063ffffffff16565b9050600081806020019051810190612d659190613779565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b612dc68383613099565b612dd36000848484612c58565b612e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0990614643565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114612f165760006001820390506000600186600001805490500390506000866000018281548110612e8557fe5b9060005260206000200154905080876000018481548110612ea257fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612eda57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612f1c565b60009150505b92915050565b6000612f2e8383613227565b612f87578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612f8c565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561303957846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613067565b8285600001600183038154811061304c57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b6060613090848460008561324a565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310090614843565b60405180910390fd5b613112816122db565b15613152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314990614683565b60405180910390fd5b61315e60008383612a58565b6131af81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a7790919063ffffffff16565b506131c681836002612a919092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561328f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328690614763565b60405180910390fd5b6132988561306e565b6132d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ce90614983565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161330091906144de565b60006040518083038185875af1925050503d806000811461333d576040519150601f19603f3d011682016040523d82523d6000602084013e613342565b606091505b509150915061335282828661335e565b92505050949350505050565b6060831561336e578290506133be565b6000835111156133815782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b591906145df565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826133fb5760008555613442565b82601f1061341457805160ff1916838001178555613442565b82800160010185558215613442579182015b82811115613441578251825591602001919060010190613426565b5b50905061344f9190613453565b5090565b5b8082111561346c576000816000905550600101613454565b5090565b600061348361347e84614a0f565b6149de565b90508281526020810184848401111561349b57600080fd5b6134a6848285614bdb565b509392505050565b60006134c16134bc84614a3f565b6149de565b9050828152602081018484840111156134d957600080fd5b6134e4848285614bdb565b509392505050565b6000813590506134fb81614c30565b92915050565b60008135905061351081614c47565b92915050565b60008135905061352581614c5e565b92915050565b60008151905061353a81614c5e565b92915050565b600082601f83011261355157600080fd5b8135613561848260208601613470565b91505092915050565b600082601f83011261357b57600080fd5b813561358b8482602086016134ae565b91505092915050565b6000813590506135a381614c75565b92915050565b6000602082840312156135bb57600080fd5b60006135c9848285016134ec565b91505092915050565b600080604083850312156135e557600080fd5b60006135f3858286016134ec565b9250506020613604858286016134ec565b9150509250929050565b60008060006060848603121561362357600080fd5b6000613631868287016134ec565b9350506020613642868287016134ec565b925050604061365386828701613594565b9150509250925092565b6000806000806080858703121561367357600080fd5b6000613681878288016134ec565b9450506020613692878288016134ec565b93505060406136a387828801613594565b925050606085013567ffffffffffffffff8111156136c057600080fd5b6136cc87828801613540565b91505092959194509250565b600080604083850312156136eb57600080fd5b60006136f9858286016134ec565b925050602061370a85828601613501565b9150509250929050565b6000806040838503121561372757600080fd5b6000613735858286016134ec565b925050602061374685828601613594565b9150509250929050565b60006020828403121561376257600080fd5b600061377084828501613516565b91505092915050565b60006020828403121561378b57600080fd5b60006137998482850161352b565b91505092915050565b6000602082840312156137b457600080fd5b600082013567ffffffffffffffff8111156137ce57600080fd5b6137da8482850161356a565b91505092915050565b6000602082840312156137f557600080fd5b600061380384828501613594565b91505092915050565b600061381883836139a2565b905092915050565b600061382c83836144c0565b60208301905092915050565b61384181614b67565b82525050565b61385081614b55565b82525050565b600061386182614aa4565b61386b8185614aea565b93508360208202850161387d85614a6f565b8060005b858110156138b9578484038952815161389a858261380c565b94506138a583614ad0565b925060208a01995050600181019050613881565b50829750879550505050505092915050565b60006138d682614aaf565b6138e08185614afb565b93506138eb83614a7f565b8060005b8381101561391c5781516139038882613820565b975061390e83614add565b9250506001810190506138ef565b5085935050505092915050565b61393281614b79565b82525050565b600061394382614aba565b61394d8185614b0c565b935061395d818560208601614bea565b61396681614c1f565b840191505092915050565b600061397c82614aba565b6139868185614b1d565b9350613996818560208601614bea565b80840191505092915050565b60006139ad82614ac5565b6139b78185614b28565b93506139c7818560208601614bea565b6139d081614c1f565b840191505092915050565b60006139e682614ac5565b6139f08185614b39565b9350613a00818560208601614bea565b613a0981614c1f565b840191505092915050565b6000613a1f82614ac5565b613a298185614b4a565b9350613a39818560208601614bea565b80840191505092915050565b600081546001811660008114613a625760018114613a8857613acc565b607f6002830416613a738187614b39565b955060ff198316865260208601935050613acc565b60028204613a968187614b39565b9550613aa185614a8f565b60005b82811015613ac357815481890152600182019150602081019050613aa4565b80880195505050505b505092915050565b6000613ae1602283614b39565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b47603283614b39565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613bad602683614b39565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c13601c83614b39565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613c53601b83614b39565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613c93602083614b39565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b6000613cd3602483614b39565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d39601983614b39565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613d79601f83614b39565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613db9601e83614b39565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b6000613df9602683614b39565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e5f602c83614b39565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ec5602183614b39565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f2b603883614b39565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613f91602a83614b39565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ff7602183614b39565b91507f53616c65206d7573742062652061637469766520746f206d696e74205268696e60008301527f6f000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061405d602283614b39565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140c3602083614b39565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614103602183614b39565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614169602c83614b39565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006141cf602083614b39565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061420f602983614b39565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614275602f83614b39565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006142db602183614b39565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614341602a83614b39565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66205268696e6f73000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a7601683614b39565b91507f4c6963656e736520616c7265616479206c6f636b6564000000000000000000006000830152602082019050919050565b60006143e7603183614b39565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061444d601d83614b39565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600061448d601b83614b39565b91507f43484f4f53452041205248494e4f2057495448494e2052414e474500000000006000830152602082019050919050565b6144c981614bd1565b82525050565b6144d881614bd1565b82525050565b60006144ea8284613971565b915081905092915050565b60006145018285613a14565b915061450d8284613a14565b91508190509392505050565b600060208201905061452e6000830184613847565b92915050565b60006080820190506145496000830187613838565b6145566020830186613847565b61456360408301856144cf565b81810360608301526145758184613938565b905095945050505050565b6000602082019050818103600083015261459a8184613856565b905092915050565b600060208201905081810360008301526145bc81846138cb565b905092915050565b60006020820190506145d96000830184613929565b92915050565b600060208201905081810360008301526145f981846139db565b905092915050565b6000602082019050818103600083015261461b8184613a45565b905092915050565b6000602082019050818103600083015261463c81613ad4565b9050919050565b6000602082019050818103600083015261465c81613b3a565b9050919050565b6000602082019050818103600083015261467c81613ba0565b9050919050565b6000602082019050818103600083015261469c81613c06565b9050919050565b600060208201905081810360008301526146bc81613c46565b9050919050565b600060208201905081810360008301526146dc81613c86565b9050919050565b600060208201905081810360008301526146fc81613cc6565b9050919050565b6000602082019050818103600083015261471c81613d2c565b9050919050565b6000602082019050818103600083015261473c81613d6c565b9050919050565b6000602082019050818103600083015261475c81613dac565b9050919050565b6000602082019050818103600083015261477c81613dec565b9050919050565b6000602082019050818103600083015261479c81613e52565b9050919050565b600060208201905081810360008301526147bc81613eb8565b9050919050565b600060208201905081810360008301526147dc81613f1e565b9050919050565b600060208201905081810360008301526147fc81613f84565b9050919050565b6000602082019050818103600083015261481c81613fea565b9050919050565b6000602082019050818103600083015261483c81614050565b9050919050565b6000602082019050818103600083015261485c816140b6565b9050919050565b6000602082019050818103600083015261487c816140f6565b9050919050565b6000602082019050818103600083015261489c8161415c565b9050919050565b600060208201905081810360008301526148bc816141c2565b9050919050565b600060208201905081810360008301526148dc81614202565b9050919050565b600060208201905081810360008301526148fc81614268565b9050919050565b6000602082019050818103600083015261491c816142ce565b9050919050565b6000602082019050818103600083015261493c81614334565b9050919050565b6000602082019050818103600083015261495c8161439a565b9050919050565b6000602082019050818103600083015261497c816143da565b9050919050565b6000602082019050818103600083015261499c81614440565b9050919050565b600060208201905081810360008301526149bc81614480565b9050919050565b60006020820190506149d860008301846144cf565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614a0557614a04614c1d565b5b8060405250919050565b600067ffffffffffffffff821115614a2a57614a29614c1d565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614a5a57614a59614c1d565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b6082614bb1565b9050919050565b6000614b7282614bb1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c08578082015181840152602081019050614bed565b83811115614c17576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b614c3981614b55565b8114614c4457600080fd5b50565b614c5081614b79565b8114614c5b57600080fd5b50565b614c6781614b85565b8114614c7257600080fd5b50565b614c7e81614bd1565b8114614c8957600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212209ddbb8b5e91ff72ce7c53260f366cfe065f51b708aceb1329403db1e2105a37c64736f6c63430007060033

Deployed Bytecode Sourcemap

66909:4393:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10309:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51594:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54380:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53910:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68369:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53388:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66998:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55270:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53150:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68612:89;;;;;;;;;;;;;:::i;:::-;;67814:131;;;;;;;;;;;;;:::i;:::-;;55646:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53676:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68503:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70738:555;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51350:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52969:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51067:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66305:148;;;;;;;;;;;;;:::i;:::-;;68719:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65654:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67587:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51763:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67101:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54673:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69715:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55868:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69551:125;;;;;;;;;;;;;:::i;:::-;;69907:689;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51938:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69310:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67254:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67380:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67957:402;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55039:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67430:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67329:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66608:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67475:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10309:150;10394:4;10418:20;:33;10439:11;10418:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10411:40;;10309:150;;;:::o;51594:100::-;51648:13;51681:5;51674:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51594:100;:::o;54380:221::-;54456:7;54484:16;54492:7;54484;:16::i;:::-;54476:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54569:15;:24;54585:7;54569:24;;;;;;;;;;;;;;;;;;;;;54562:31;;54380:221;;;:::o;53910:404::-;53991:13;54007:23;54022:7;54007:14;:23::i;:::-;53991:39;;54055:5;54049:11;;:2;:11;;;;54041:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54135:5;54119:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;54144:44;54168:5;54175:12;:10;:12::i;:::-;54144:23;:44::i;:::-;54119:69;54111:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;54285:21;54294:2;54298:7;54285:8;:21::i;:::-;53910:404;;;:::o;68369:126::-;65885:12;:10;:12::i;:::-;65874:23;;:7;:5;:7::i;:::-;:23;;;65866:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68473:14:::1;68454:16;:33;;;;;;;;;;;;:::i;:::-;;68369:126:::0;:::o;53388:211::-;53449:7;53570:21;:12;:19;:21::i;:::-;53563:28;;53388:211;:::o;66998:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55270:305::-;55431:41;55450:12;:10;:12::i;:::-;55464:7;55431:18;:41::i;:::-;55423:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;55539:28;55549:4;55555:2;55559:7;55539:9;:28::i;:::-;55270:305;;;:::o;53150:162::-;53247:7;53274:30;53298:5;53274:13;:20;53288:5;53274:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;53267:37;;53150:162;;;;:::o;68612:89::-;65885:12;:10;:12::i;:::-;65874:23;;:7;:5;:7::i;:::-;:23;;;65866:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68681:12:::1;;;;;;;;;;;68680:13;68665:12;;:28;;;;;;;;;;;;;;;;;;68612:89::o:0;67814:131::-;65885:12;:10;:12::i;:::-;65874:23;;:7;:5;:7::i;:::-;:23;;;65866:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67862:12:::1;67877:21;67862:36;;67909:10;:19;;:28;67929:7;67909:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65945:1;67814:131::o:0;55646:151::-;55750:39;55767:4;55773:2;55777:7;55750:39;;;;;;;;;;;;:16;:39::i;:::-;55646:151;;;:::o;53676:172::-;53751:7;53772:15;53793:22;53809:5;53793:12;:15;;:22;;;;:::i;:::-;53771:44;;;53833:7;53826:14;;;53676:172;;;:::o;68503:99::-;65885:12;:10;:12::i;:::-;65874:23;;:7;:5;:7::i;:::-;:23;;;65866:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68574:20:::1;68586:7;68574:11;:20::i;:::-;68503:99:::0;:::o;70738:555::-;70803:15;70832:18;70853:17;70863:6;70853:9;:17::i;:::-;70832:38;;70899:1;70885:10;:15;70881:405;;;70975:1;70962:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70955:22;;;;;70881:405;71010:22;71048:10;71035:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71010:49;;71074:13;71102:145;71126:10;71118:5;:18;71102:145;;;71182:10;:48;71194:34;71214:6;71222:5;71194:19;:34::i;:::-;71182:48;;;;;;;;;;;71166:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;71173:5;71166:13;;;;;;;;;;;;;:64;;;;71138:7;;;;;;;71102:145;;;71268:6;71261:13;;;;;70738:555;;;;:::o;51350:177::-;51422:7;51449:70;51466:7;51449:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;51442:77;;51350:177;;;:::o;52969:97::-;53017:13;53050:8;53043:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52969:97;:::o;51067:221::-;51139:7;51184:1;51167:19;;:5;:19;;;;51159:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51251:29;:13;:20;51265:5;51251:20;;;;;;;;;;;;;;;:27;:29::i;:::-;51244:36;;51067:221;;;:::o;66305:148::-;65885:12;:10;:12::i;:::-;65874:23;;:7;:5;:7::i;:::-;:23;;;65866:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66412:1:::1;66375:40;;66396:6;;;;;;;;;;;66375:40;;;;;;;;;;;;66443:1;66426:6;;:19;;;;;;;;;;;;;;;;;;66305:148::o:0;68719:540::-;68780:16;68810:18;68831:17;68841:6;68831:9;:17::i;:::-;68810:38;;68877:1;68863:10;:15;68859:393;;;68954:1;68940:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68933:23;;;;;68859:393;68989:23;69029:10;69015:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68989:51;;69055:13;69083:130;69107:10;69099:5;:18;69083:130;;;69163:34;69183:6;69191:5;69163:19;:34::i;:::-;69147:6;69154:5;69147:13;;;;;;;;;;;;;:50;;;;;69119:7;;;;;;;69083:130;;;69234:6;69227:13;;;;;68719:540;;;;:::o;65654:87::-;65700:7;65727:6;;;;;;;;;;;65720:13;;65654:87;:::o;67587:29::-;;;;:::o;51763:104::-;51819:13;51852:7;51845:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51763:104;:::o;67101:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54673:295::-;54788:12;:10;:12::i;:::-;54776:24;;:8;:24;;;;54768:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54888:8;54843:18;:32;54862:12;:10;:12::i;:::-;54843:32;;;;;;;;;;;;;;;:42;54876:8;54843:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;54941:8;54912:48;;54927:12;:10;:12::i;:::-;54912:48;;;54951:8;54912:48;;;;;;:::i;:::-;;;;;;;;54673:295;;:::o;69715:174::-;65885:12;:10;:12::i;:::-;65874:23;;:7;:5;:7::i;:::-;:23;;;65866:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69815:5:::1;69798:22;;:13;;;;;;;;;;;:22;;;69790:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;69873:8;69858:12;:23;;;;;;;;;;;;:::i;:::-;;69715:174:::0;:::o;55868:285::-;56000:41;56019:12;:10;:12::i;:::-;56033:7;56000:18;:41::i;:::-;55992:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56106:39;56120:4;56126:2;56130:7;56139:5;56106:13;:39::i;:::-;55868:285;;;;:::o;69551:125::-;65885:12;:10;:12::i;:::-;65874:23;;:7;:5;:7::i;:::-;:23;;;65866:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69619:4:::1;69602:13;;:21;;;;;;;;;;;;;;;;;;69639:29;69655:12;69639:29;;;;;;:::i;:::-;;;;;;;;69551:125::o:0;69907:689::-;69981:12;;;;;;;;;;;69973:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;70067:1;70050:14;:18;:56;;;;;67369:2;70072:14;:34;;70050:56;70042:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;67417:4;70163:33;70181:14;70163:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;70155:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;70289:30;70304:14;67291:17;70289:14;;:30;;;;:::i;:::-;70276:9;:43;;70268:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;70380:6;70376:211;70396:14;70392:1;:18;70376:211;;;70432:14;70449:13;:11;:13::i;:::-;70432:30;;67417:4;70481:13;:11;:13::i;:::-;:26;70477:99;;;70528:32;70538:10;70550:9;70528;:32::i;:::-;70477:99;70376:211;70412:3;;;;;;;70376:211;;;;69907:689;:::o;51938:792::-;52011:13;52045:16;52053:7;52045;:16::i;:::-;52037:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52126:23;52152:10;:19;52163:7;52152:19;;;;;;;;;;;52126:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52182:18;52203:9;:7;:9::i;:::-;52182:30;;52310:1;52294:4;52288:18;:23;52284:72;;;52335:9;52328:16;;;;;;52284:72;52486:1;52466:9;52460:23;:27;52456:108;;;52535:4;52541:9;52518:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52504:48;;;;;;52456:108;52696:4;52702:18;:7;:16;:18::i;:::-;52679:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52665:57;;;;51938:792;;;;:::o;69310:175::-;69362:13;69402;:11;:13::i;:::-;69396:3;:19;69388:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;69465:12;69458:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69310:175;;;:::o;67254:54::-;67291:17;67254:54;:::o;67380:41::-;67417:4;67380:41;:::o;67957:402::-;65885:12;:10;:12::i;:::-;65874:23;;:7;:5;:7::i;:::-;:23;;;65866:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68053:11:::1;68067:13;:11;:13::i;:::-;68053:27;;68116:1;68099:14;:18;:52;;;;;68139:12;;68121:14;:30;;68099:52;68091:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;68204:6;68199:95;68220:14;68216:1;:18;68199:95;;;68256:26;68266:3;68280:1;68271:6;:10;68256:9;:26::i;:::-;68236:3;;;;;;;68199:95;;;;68319:32;68336:14;68319:12;;:16;;:32;;;;:::i;:::-;68304:12;:47;;;;65945:1;67957:402:::0;;:::o;55039:164::-;55136:4;55160:18;:25;55179:5;55160:25;;;;;;;;;;;;;;;:35;55186:8;55160:35;;;;;;;;;;;;;;;;;;;;;;;;;55153:42;;55039:164;;;;:::o;67430:32::-;;;;;;;;;;;;;:::o;67329:42::-;67369:2;67329:42;:::o;66608:244::-;65885:12;:10;:12::i;:::-;65874:23;;:7;:5;:7::i;:::-;:23;;;65866:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66717:1:::1;66697:22;;:8;:22;;;;66689:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;66807:8;66778:38;;66799:6;;;;;;;;;;;66778:38;;;;;;;;;;;;66836:8;66827:6;;:17;;;;;;;;;;;;;;;;;;66608:244:::0;:::o;67475:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57620:127::-;57685:4;57709:30;57731:7;57709:12;:21;;:30;;;;:::i;:::-;57702:37;;57620:127;;;:::o;741:106::-;794:15;829:10;822:17;;741:106;:::o;63638:192::-;63740:2;63713:15;:24;63729:7;63713:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;63796:7;63792:2;63758:46;;63767:23;63782:7;63767:14;:23::i;:::-;63758:46;;;;;;;;;;;;63638:192;;:::o;44352:123::-;44421:7;44448:19;44456:3;:10;;44448:7;:19::i;:::-;44441:26;;44352:123;;;:::o;57914:355::-;58007:4;58032:16;58040:7;58032;:16::i;:::-;58024:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58108:13;58124:23;58139:7;58124:14;:23::i;:::-;58108:39;;58177:5;58166:16;;:7;:16;;;:51;;;;58210:7;58186:31;;:20;58198:7;58186:11;:20::i;:::-;:31;;;58166:51;:94;;;;58221:39;58245:5;58252:7;58221:23;:39::i;:::-;58166:94;58158:103;;;57914:355;;;;:::o;61050:599::-;61175:4;61148:31;;:23;61163:7;61148:14;:23::i;:::-;:31;;;61140:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;61276:1;61262:16;;:2;:16;;;;61254:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61332:39;61353:4;61359:2;61363:7;61332:20;:39::i;:::-;61436:29;61453:1;61457:7;61436:8;:29::i;:::-;61478:35;61505:7;61478:13;:19;61492:4;61478:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;61524:30;61546:7;61524:13;:17;61538:2;61524:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;61567:29;61584:7;61593:2;61567:12;:16;;:29;;;;;:::i;:::-;;61633:7;61629:2;61614:27;;61623:4;61614:27;;;;;;;;;;;;61050:599;;;:::o;36143:137::-;36214:7;36249:22;36253:3;:10;;36265:5;36249:3;:22::i;:::-;36241:31;;36234:38;;36143:137;;;;:::o;44814:236::-;44894:7;44903;44924:11;44937:13;44954:22;44958:3;:10;;44970:5;44954:3;:22::i;:::-;44923:53;;;;45003:3;44995:12;;45033:5;45025:14;;44987:55;;;;;;44814:236;;;;;:::o;62250:100::-;62334:8;62323;:19;;;;;;;;;;;;:::i;:::-;;62250:100;:::o;46100:213::-;46207:7;46258:44;46263:3;:10;;46283:3;46275:12;;46289;46258:4;:44::i;:::-;46250:53;;46227:78;;46100:213;;;;;:::o;35685:114::-;35745:7;35772:19;35780:3;:10;;35772:7;:19::i;:::-;35765:26;;35685:114;;;:::o;57035:272::-;57149:28;57159:4;57165:2;57169:7;57149:9;:28::i;:::-;57196:48;57219:4;57225:2;57229:7;57238:5;57196:22;:48::i;:::-;57188:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;57035:272;;;;:::o;13871:179::-;13929:7;13949:9;13965:1;13961;:5;13949:17;;13990:1;13985;:6;;13977:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;14041:1;14034:8;;;13871:179;;;;:::o;14750:220::-;14808:7;14837:1;14832;:6;14828:20;;;14847:1;14840:8;;;;14828:20;14859:9;14875:1;14871;:5;14859:17;;14904:1;14899;14895;:5;;;;;;:10;14887:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;14961:1;14954:8;;;14750:220;;;;;:::o;58612:110::-;58688:26;58698:2;58702:7;58688:26;;;;;;;;;;;;:9;:26::i;:::-;58612:110;;:::o;46564:746::-;46620:13;46850:1;46841:5;:10;46837:53;;;46868:10;;;;;;;;;;;;;;;;;;;;;46837:53;46900:12;46915:5;46900:20;;46931:14;46956:78;46971:1;46963:4;:9;46956:78;;46989:8;;;;;;;47020:2;47012:10;;;;;;;;;46956:78;;;47044:19;47076:6;47066:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47044:39;;47094:13;47119:1;47110:6;:10;47094:26;;47138:5;47131:12;;47154:117;47169:1;47161:4;:9;47154:117;;47230:2;47223:4;:9;;;;;;47218:2;:14;47205:29;;47187:6;47194:7;;;;;;;47187:15;;;;;;;;;;;:47;;;;;;;;;;;47257:2;47249:10;;;;;;;;;47154:117;;;47295:6;47281:21;;;;;;46564:746;;;;:::o;14333:158::-;14391:7;14424:1;14419;:6;;14411:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;14482:1;14478;:5;14471:12;;14333:158;;;;:::o;44113:151::-;44197:4;44221:35;44231:3;:10;;44251:3;44243:12;;44221:9;:35::i;:::-;44214:42;;44113:151;;;;:::o;40931:110::-;40987:7;41014:3;:12;;:19;;;;41007:26;;40931:110;;;:::o;64443:93::-;;;;:::o;35230:137::-;35300:4;35324:35;35332:3;:10;;35352:5;35344:14;;35324:7;:35::i;:::-;35317:42;;35230:137;;;;:::o;34923:131::-;34990:4;35014:32;35019:3;:10;;35039:5;35031:14;;35014:4;:32::i;:::-;35007:39;;34923:131;;;;:::o;43536:185::-;43625:4;43649:64;43654:3;:10;;43674:3;43666:12;;43704:5;43688:23;;43680:32;;43649:4;:64::i;:::-;43642:71;;43536:185;;;;;:::o;31181:204::-;31248:7;31297:5;31276:3;:11;;:18;;;;:26;31268:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31359:3;:11;;31371:5;31359:18;;;;;;;;;;;;;;;;31352:25;;31181:204;;;;:::o;41396:279::-;41463:7;41472;41522:5;41500:3;:12;;:19;;;;:27;41492:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41579:22;41604:3;:12;;41617:5;41604:19;;;;;;;;;;;;;;;;;;41579:44;;41642:5;:10;;;41654:5;:12;;;41634:33;;;;;41396:279;;;;;:::o;42893:319::-;42987:7;43007:16;43026:3;:12;;:17;43039:3;43026:17;;;;;;;;;;;;43007:36;;43074:1;43062:8;:13;;43077:12;43054:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43144:3;:12;;43168:1;43157:8;:12;43144:26;;;;;;;;;;;;;;;;;;:33;;;43137:40;;;42893:319;;;;;:::o;30728:109::-;30784:7;30811:3;:11;;:18;;;;30804:25;;30728:109;;;:::o;62915:604::-;63036:4;63063:15;:2;:13;;;:15::i;:::-;63058:60;;63102:4;63095:11;;;;63058:60;63128:23;63154:252;63207:45;;;63267:12;:10;:12::i;:::-;63294:4;63313:7;63335:5;63170:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63154:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;63128:278;;63417:13;63444:10;63433:32;;;;;;;;;;;;:::i;:::-;63417:48;;48064:10;63494:16;;63484:26;;;:6;:26;;;;63476:35;;;;62915:604;;;;;;;:::o;58949:250::-;59045:18;59051:2;59055:7;59045:5;:18::i;:::-;59082:54;59113:1;59117:2;59121:7;59130:5;59082:22;:54::i;:::-;59074:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;58949:250;;;:::o;40711:125::-;40782:4;40827:1;40806:3;:12;;:17;40819:3;40806:17;;;;;;;;;;;;:22;;40799:29;;40711:125;;;;:::o;28883:1544::-;28949:4;29067:18;29088:3;:12;;:19;29101:5;29088:19;;;;;;;;;;;;29067:40;;29138:1;29124:10;:15;29120:1300;;29486:21;29523:1;29510:10;:14;29486:38;;29539:17;29580:1;29559:3;:11;;:18;;;;:22;29539:42;;29826:17;29846:3;:11;;29858:9;29846:22;;;;;;;;;;;;;;;;29826:42;;29992:9;29963:3;:11;;29975:13;29963:26;;;;;;;;;;;;;;;:38;;;;30111:1;30095:13;:17;30069:3;:12;;:23;30082:9;30069:23;;;;;;;;;;;:43;;;;30221:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30316:3;:12;;:19;30329:5;30316:19;;;;;;;;;;;30309:26;;;30359:4;30352:11;;;;;;;;29120:1300;30403:5;30396:12;;;28883:1544;;;;;:::o;28293:414::-;28356:4;28378:21;28388:3;28393:5;28378:9;:21::i;:::-;28373:327;;28416:3;:11;;28433:5;28416:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28599:3;:11;;:18;;;;28577:3;:12;;:19;28590:5;28577:19;;;;;;;;;;;:40;;;;28639:4;28632:11;;;;28373:327;28683:5;28676:12;;28293:414;;;;;:::o;38211:692::-;38287:4;38403:16;38422:3;:12;;:17;38435:3;38422:17;;;;;;;;;;;;38403:36;;38468:1;38456:8;:13;38452:444;;;38523:3;:12;;38541:38;;;;;;;;38558:3;38541:38;;;;38571:5;38541:38;;;38523:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38738:3;:12;;:19;;;;38718:3;:12;;:17;38731:3;38718:17;;;;;;;;;;;:39;;;;38779:4;38772:11;;;;;38452:444;38852:5;38816:3;:12;;38840:1;38829:8;:12;38816:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38879:5;38872:12;;;38211:692;;;;;;:::o;19312:422::-;19372:4;19580:12;19691:7;19679:20;19671:28;;19725:1;19718:4;:8;19711:15;;;19312:422;;;:::o;22230:195::-;22333:12;22365:52;22387:6;22395:4;22401:1;22404:12;22365:21;:52::i;:::-;22358:59;;22230:195;;;;;:::o;59535:404::-;59629:1;59615:16;;:2;:16;;;;59607:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;59688:16;59696:7;59688;:16::i;:::-;59687:17;59679:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59750:45;59779:1;59783:2;59787:7;59750:20;:45::i;:::-;59808:30;59830:7;59808:13;:17;59822:2;59808:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;59851:29;59868:7;59877:2;59851:12;:16;;:29;;;;;:::i;:::-;;59923:7;59919:2;59898:33;;59915:1;59898:33;;;;;;;;;;;;59535:404;;:::o;30513:129::-;30586:4;30633:1;30610:3;:12;;:19;30623:5;30610:19;;;;;;;;;;;;:24;;30603:31;;30513:129;;;;:::o;23282:530::-;23409:12;23467:5;23442:21;:30;;23434:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23534:18;23545:6;23534:10;:18::i;:::-;23526:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23660:12;23674:23;23701:6;:11;;23721:5;23729:4;23701:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23659:75;;;;23752:52;23770:7;23779:10;23791:12;23752:17;:52::i;:::-;23745:59;;;;23282:530;;;;;;:::o;25822:742::-;25937:12;25966:7;25962:595;;;25997:10;25990:17;;;;25962:595;26131:1;26111:10;:17;:21;26107:439;;;26374:10;26368:17;26435:15;26422:10;26418:2;26414:19;26407:44;26322:148;26517:12;26510:20;;;;;;;;;;;:::i;:::-;;;;;;;;25822: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:365::-;;15894:67;15958:2;15953:3;15894:67;:::i;:::-;15887:74;;15991:34;15987:1;15982:3;15978:11;15971:55;16057:3;16052:2;16047:3;16043:12;16036:25;16087:2;16082:3;16078:12;16071:19;;15877:219;;;:::o;16102:388::-;;16265:67;16329:2;16324:3;16265:67;:::i;:::-;16258:74;;16362:34;16358:1;16353:3;16349:11;16342:55;16428:26;16423:2;16418:3;16414:12;16407:48;16481:2;16476:3;16472:12;16465:19;;16248:242;;;:::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:365::-;;17039:67;17103:2;17098:3;17039:67;:::i;:::-;17032:74;;17136:34;17132:1;17127:3;17123:11;17116:55;17202:3;17197:2;17192:3;17188:12;17181:25;17232:2;17227:3;17223:12;17216:19;;17022:219;;;:::o;17247:366::-;;17410:67;17474:2;17469:3;17410:67;:::i;:::-;17403:74;;17507:34;17503:1;17498:3;17494:11;17487:55;17573:4;17568:2;17563:3;17559:12;17552:26;17604:2;17599:3;17595:12;17588:19;;17393:220;;;:::o;17619:330::-;;17782:67;17846:2;17841:3;17782:67;:::i;:::-;17775:74;;17879:34;17875:1;17870:3;17866:11;17859:55;17940:2;17935:3;17931:12;17924:19;;17765:184;;;:::o;17955:365::-;;18118:67;18182:2;18177:3;18118:67;:::i;:::-;18111:74;;18215:34;18211:1;18206:3;18202:11;18195:55;18281:3;18276:2;18271:3;18267:12;18260:25;18311:2;18306:3;18302:12;18295:19;;18101:219;;;:::o;18326:376::-;;18489:67;18553:2;18548:3;18489:67;:::i;:::-;18482:74;;18586:34;18582:1;18577:3;18573:11;18566:55;18652:14;18647:2;18642:3;18638:12;18631:36;18693:2;18688:3;18684:12;18677:19;;18472:230;;;:::o;18708:330::-;;18871:67;18935:2;18930:3;18871:67;:::i;:::-;18864:74;;18968:34;18964:1;18959:3;18955:11;18948:55;19029:2;19024:3;19020:12;19013:19;;18854:184;;;:::o;19044:373::-;;19207:67;19271:2;19266:3;19207:67;:::i;:::-;19200:74;;19304:34;19300:1;19295:3;19291:11;19284:55;19370:11;19365:2;19360:3;19356:12;19349:33;19408:2;19403:3;19399:12;19392:19;;19190:227;;;:::o;19423:379::-;;19586:67;19650:2;19645:3;19586:67;:::i;:::-;19579:74;;19683:34;19679:1;19674:3;19670:11;19663:55;19749:17;19744:2;19739:3;19735:12;19728:39;19793:2;19788:3;19784:12;19777:19;;19569:233;;;:::o;19808:365::-;;19971:67;20035:2;20030:3;19971:67;:::i;:::-;19964:74;;20068:34;20064:1;20059:3;20055:11;20048:55;20134:3;20129:2;20124:3;20120:12;20113:25;20164:2;20159:3;20155:12;20148:19;;19954:219;;;:::o;20179:374::-;;20342:67;20406:2;20401:3;20342:67;:::i;:::-;20335:74;;20439:34;20435:1;20430:3;20426:11;20419:55;20505:12;20500:2;20495:3;20491:12;20484:34;20544:2;20539:3;20535:12;20528:19;;20325:228;;;:::o;20559:320::-;;20722:67;20786:2;20781:3;20722:67;:::i;:::-;20715:74;;20819:24;20815:1;20810:3;20806:11;20799:45;20870:2;20865:3;20861:12;20854:19;;20705:174;;;:::o;20885:381::-;;21048:67;21112:2;21107:3;21048:67;:::i;:::-;21041:74;;21145:34;21141:1;21136:3;21132:11;21125:55;21211:19;21206:2;21201:3;21197:12;21190:41;21257:2;21252:3;21248:12;21241:19;;21031:235;;;:::o;21272:327::-;;21435:67;21499:2;21494:3;21435:67;:::i;:::-;21428:74;;21532:31;21528:1;21523:3;21519:11;21512:52;21590:2;21585:3;21581:12;21574:19;;21418:181;;;:::o;21605:325::-;;21768:67;21832:2;21827:3;21768:67;:::i;:::-;21761:74;;21865:29;21861:1;21856:3;21852:11;21845:50;21921:2;21916:3;21912:12;21905:19;;21751:179;;;:::o;21936:108::-;22013:24;22031:5;22013:24;:::i;:::-;22008:3;22001:37;21991:53;;:::o;22050:118::-;22137:24;22155:5;22137:24;:::i;:::-;22132:3;22125:37;22115:53;;:::o;22174:271::-;;22326:93;22415:3;22406:6;22326:93;:::i;:::-;22319:100;;22436:3;22429:10;;22308:137;;;;:::o;22451:435::-;;22653:95;22744:3;22735:6;22653:95;:::i;:::-;22646:102;;22765:95;22856:3;22847:6;22765:95;:::i;:::-;22758:102;;22877:3;22870:10;;22635:251;;;;;:::o;22892:222::-;;23023:2;23012:9;23008:18;23000:26;;23036:71;23104:1;23093:9;23089:17;23080:6;23036:71;:::i;:::-;22990:124;;;;:::o;23120:672::-;;23369:3;23358:9;23354:19;23346:27;;23383:87;23467:1;23456:9;23452:17;23443:6;23383:87;:::i;:::-;23480:72;23548:2;23537:9;23533:18;23524:6;23480:72;:::i;:::-;23562;23630:2;23619:9;23615:18;23606:6;23562:72;:::i;:::-;23681:9;23675:4;23671:20;23666:2;23655:9;23651:18;23644:48;23709:76;23780:4;23771:6;23709:76;:::i;:::-;23701:84;;23336:456;;;;;;;:::o;23798:413::-;;23999:2;23988:9;23984:18;23976:26;;24048:9;24042:4;24038:20;24034:1;24023:9;24019:17;24012:47;24076:128;24199:4;24190:6;24076:128;:::i;:::-;24068:136;;23966:245;;;;:::o;24217:373::-;;24398:2;24387:9;24383:18;24375:26;;24447:9;24441:4;24437:20;24433:1;24422:9;24418:17;24411:47;24475:108;24578:4;24569:6;24475:108;:::i;:::-;24467:116;;24365:225;;;;:::o;24596:210::-;;24721:2;24710:9;24706:18;24698:26;;24734:65;24796:1;24785:9;24781:17;24772:6;24734:65;:::i;:::-;24688:118;;;;:::o;24812:313::-;;24963:2;24952:9;24948:18;24940:26;;25012:9;25006:4;25002:20;24998:1;24987:9;24983:17;24976:47;25040:78;25113:4;25104:6;25040:78;:::i;:::-;25032:86;;24930:195;;;;:::o;25131:307::-;;25279:2;25268:9;25264:18;25256:26;;25328:9;25322:4;25318:20;25314:1;25303:9;25299:17;25292:47;25356:75;25426:4;25417:6;25356:75;:::i;:::-;25348:83;;25246:192;;;;:::o;25444:419::-;;25648:2;25637:9;25633:18;25625:26;;25697:9;25691:4;25687:20;25683:1;25672:9;25668:17;25661:47;25725:131;25851:4;25725:131;:::i;:::-;25717:139;;25615:248;;;:::o;25869:419::-;;26073:2;26062:9;26058:18;26050:26;;26122:9;26116:4;26112:20;26108:1;26097:9;26093:17;26086:47;26150:131;26276:4;26150:131;:::i;:::-;26142:139;;26040:248;;;:::o;26294:419::-;;26498:2;26487:9;26483:18;26475:26;;26547:9;26541:4;26537:20;26533:1;26522:9;26518:17;26511:47;26575:131;26701:4;26575:131;:::i;:::-;26567:139;;26465:248;;;:::o;26719:419::-;;26923:2;26912:9;26908:18;26900:26;;26972:9;26966:4;26962:20;26958:1;26947:9;26943:17;26936:47;27000:131;27126:4;27000:131;:::i;:::-;26992:139;;26890:248;;;:::o;27144:419::-;;27348:2;27337:9;27333:18;27325:26;;27397:9;27391:4;27387:20;27383:1;27372:9;27368:17;27361:47;27425:131;27551:4;27425:131;:::i;:::-;27417:139;;27315:248;;;:::o;27569:419::-;;27773:2;27762:9;27758:18;27750:26;;27822:9;27816:4;27812:20;27808:1;27797:9;27793:17;27786:47;27850:131;27976:4;27850:131;:::i;:::-;27842:139;;27740:248;;;:::o;27994:419::-;;28198:2;28187:9;28183:18;28175:26;;28247:9;28241:4;28237:20;28233:1;28222:9;28218:17;28211:47;28275:131;28401:4;28275:131;:::i;:::-;28267:139;;28165:248;;;:::o;28419:419::-;;28623:2;28612:9;28608:18;28600:26;;28672:9;28666:4;28662:20;28658:1;28647:9;28643:17;28636:47;28700:131;28826:4;28700:131;:::i;:::-;28692:139;;28590:248;;;:::o;28844:419::-;;29048:2;29037:9;29033:18;29025:26;;29097:9;29091:4;29087:20;29083:1;29072:9;29068:17;29061:47;29125:131;29251:4;29125:131;:::i;:::-;29117:139;;29015:248;;;:::o;29269:419::-;;29473:2;29462:9;29458:18;29450:26;;29522:9;29516:4;29512:20;29508:1;29497:9;29493:17;29486:47;29550:131;29676:4;29550:131;:::i;:::-;29542:139;;29440:248;;;:::o;29694:419::-;;29898:2;29887:9;29883:18;29875:26;;29947:9;29941:4;29937:20;29933:1;29922:9;29918:17;29911:47;29975:131;30101:4;29975:131;:::i;:::-;29967:139;;29865:248;;;:::o;30119:419::-;;30323:2;30312:9;30308:18;30300:26;;30372:9;30366:4;30362:20;30358:1;30347:9;30343:17;30336:47;30400:131;30526:4;30400:131;:::i;:::-;30392:139;;30290:248;;;:::o;30544:419::-;;30748:2;30737:9;30733:18;30725:26;;30797:9;30791:4;30787:20;30783:1;30772:9;30768:17;30761:47;30825:131;30951:4;30825:131;:::i;:::-;30817:139;;30715:248;;;:::o;30969:419::-;;31173:2;31162:9;31158:18;31150:26;;31222:9;31216:4;31212:20;31208:1;31197:9;31193:17;31186:47;31250:131;31376:4;31250:131;:::i;:::-;31242:139;;31140:248;;;:::o;31394:419::-;;31598:2;31587:9;31583:18;31575:26;;31647:9;31641:4;31637:20;31633:1;31622:9;31618:17;31611:47;31675:131;31801:4;31675:131;:::i;:::-;31667:139;;31565:248;;;:::o;31819:419::-;;32023:2;32012:9;32008:18;32000:26;;32072:9;32066:4;32062:20;32058:1;32047:9;32043:17;32036:47;32100:131;32226:4;32100:131;:::i;:::-;32092:139;;31990:248;;;:::o;32244:419::-;;32448:2;32437:9;32433:18;32425:26;;32497:9;32491:4;32487:20;32483:1;32472:9;32468:17;32461:47;32525:131;32651:4;32525:131;:::i;:::-;32517:139;;32415:248;;;:::o;32669:419::-;;32873:2;32862:9;32858:18;32850:26;;32922:9;32916:4;32912:20;32908:1;32897:9;32893:17;32886:47;32950:131;33076:4;32950:131;:::i;:::-;32942:139;;32840:248;;;:::o;33094:419::-;;33298:2;33287:9;33283:18;33275:26;;33347:9;33341:4;33337:20;33333:1;33322:9;33318:17;33311:47;33375:131;33501:4;33375:131;:::i;:::-;33367:139;;33265:248;;;:::o;33519:419::-;;33723:2;33712:9;33708:18;33700:26;;33772:9;33766:4;33762:20;33758:1;33747:9;33743:17;33736:47;33800:131;33926:4;33800:131;:::i;:::-;33792:139;;33690:248;;;:::o;33944:419::-;;34148:2;34137:9;34133:18;34125:26;;34197:9;34191:4;34187:20;34183:1;34172:9;34168:17;34161:47;34225:131;34351:4;34225:131;:::i;:::-;34217:139;;34115:248;;;:::o;34369:419::-;;34573:2;34562:9;34558:18;34550:26;;34622:9;34616:4;34612:20;34608:1;34597:9;34593:17;34586:47;34650:131;34776:4;34650:131;:::i;:::-;34642:139;;34540:248;;;:::o;34794:419::-;;34998:2;34987:9;34983:18;34975:26;;35047:9;35041:4;35037:20;35033:1;35022:9;35018:17;35011:47;35075:131;35201:4;35075:131;:::i;:::-;35067:139;;34965:248;;;:::o;35219:419::-;;35423:2;35412:9;35408:18;35400:26;;35472:9;35466:4;35462:20;35458:1;35447:9;35443:17;35436:47;35500:131;35626:4;35500:131;:::i;:::-;35492:139;;35390:248;;;:::o;35644:419::-;;35848:2;35837:9;35833:18;35825:26;;35897:9;35891:4;35887:20;35883:1;35872:9;35868:17;35861:47;35925:131;36051:4;35925:131;:::i;:::-;35917:139;;35815:248;;;:::o;36069:419::-;;36273:2;36262:9;36258:18;36250:26;;36322:9;36316:4;36312:20;36308:1;36297:9;36293:17;36286:47;36350:131;36476:4;36350:131;:::i;:::-;36342:139;;36240:248;;;:::o;36494:419::-;;36698:2;36687:9;36683:18;36675:26;;36747:9;36741:4;36737:20;36733:1;36722:9;36718:17;36711:47;36775:131;36901:4;36775:131;:::i;:::-;36767:139;;36665:248;;;:::o;36919:419::-;;37123:2;37112:9;37108:18;37100:26;;37172:9;37166:4;37162:20;37158:1;37147:9;37143:17;37136:47;37200:131;37326:4;37200:131;:::i;:::-;37192:139;;37090:248;;;:::o;37344:419::-;;37548:2;37537:9;37533:18;37525:26;;37597:9;37591:4;37587:20;37583:1;37572:9;37568:17;37561:47;37625:131;37751:4;37625:131;:::i;:::-;37617:139;;37515:248;;;:::o;37769:222::-;;37900:2;37889:9;37885:18;37877:26;;37913:71;37981:1;37970:9;37966:17;37957:6;37913:71;:::i;:::-;37867:124;;;;:::o;37997:278::-;;38063:2;38057:9;38047:19;;38105:4;38097:6;38093:17;38212:6;38200:10;38197:22;38176:18;38164:10;38161:34;38158:62;38155:2;;;38223:13;;:::i;:::-;38155:2;38258:10;38254:2;38247:22;38037:238;;;;:::o;38281:326::-;;38432:18;38424:6;38421:30;38418:2;;;38454:13;;:::i;:::-;38418:2;38534:4;38530:9;38523:4;38515:6;38511:17;38507:33;38499:41;;38595:4;38589;38585:15;38577:23;;38347:260;;;:::o;38613:327::-;;38765:18;38757:6;38754:30;38751:2;;;38787:13;;:::i;:::-;38751:2;38867:4;38863:9;38856:4;38848:6;38844:17;38840:33;38832:41;;38928:4;38922;38918:15;38910:23;;38680:260;;;:::o;38946:142::-;;39046:3;39038:11;;39076:4;39071:3;39067:14;39059:22;;39028:60;;;:::o;39094:132::-;;39184:3;39176:11;;39214:4;39209:3;39205:14;39197:22;;39166:60;;;:::o;39232:141::-;;39304:3;39296:11;;39327:3;39324:1;39317:14;39361:4;39358:1;39348:18;39340:26;;39286:87;;;:::o;39379:124::-;;39490:5;39484:12;39474:22;;39463:40;;;:::o;39509:114::-;;39610:5;39604:12;39594:22;;39583:40;;;:::o;39629:98::-;;39714:5;39708:12;39698:22;;39687:40;;;:::o;39733:99::-;;39819:5;39813:12;39803:22;;39792:40;;;:::o;39838:123::-;;39950:4;39945:3;39941:14;39933:22;;39923:38;;;:::o;39967:113::-;;40069:4;40064:3;40060:14;40052:22;;40042:38;;;:::o;40086:194::-;;40229:6;40224:3;40217:19;40269:4;40264:3;40260:14;40245:29;;40207:73;;;;:::o;40286:184::-;;40419:6;40414:3;40407:19;40459:4;40454:3;40450:14;40435:29;;40397:73;;;;:::o;40476:168::-;;40593:6;40588:3;40581:19;40633:4;40628:3;40624:14;40609:29;;40571:73;;;;:::o;40650:147::-;;40788:3;40773:18;;40763:34;;;;:::o;40803:159::-;;40911:6;40906:3;40899:19;40951:4;40946:3;40942:14;40927:29;;40889:73;;;;:::o;40968:169::-;;41086:6;41081:3;41074:19;41126:4;41121:3;41117:14;41102:29;;41064:73;;;;:::o;41143:148::-;;41282:3;41267:18;;41257:34;;;;:::o;41297:96::-;;41363:24;41381:5;41363:24;:::i;:::-;41352:35;;41342:51;;;:::o;41399:104::-;;41473:24;41491:5;41473:24;:::i;:::-;41462:35;;41452:51;;;:::o;41509:90::-;;41586:5;41579:13;41572:21;41561:32;;41551:48;;;:::o;41605:149::-;;41681:66;41674:5;41670:78;41659:89;;41649:105;;;:::o;41760:126::-;;41837:42;41830:5;41826:54;41815:65;;41805:81;;;:::o;41892:77::-;;41958:5;41947:16;;41937:32;;;:::o;41975:154::-;42059:6;42054:3;42049;42036:30;42121:1;42112:6;42107:3;42103:16;42096:27;42026:103;;;:::o;42135:307::-;42203:1;42213:113;42227:6;42224:1;42221:13;42213:113;;;42312:1;42307:3;42303:11;42297:18;42293:1;42288:3;42284:11;42277:39;42249:2;42246:1;42242:10;42237:15;;42213:113;;;42344:6;42341:1;42338:13;42335:2;;;42424:1;42415:6;42410:3;42406:16;42399:27;42335:2;42184:258;;;;:::o;42448:48::-;42481:9;42502:102;;42594:2;42590:7;42585:2;42578:5;42574:14;42570:28;42560:38;;42550:54;;;:::o;42610:122::-;42683:24;42701:5;42683:24;:::i;:::-;42676:5;42673:35;42663:2;;42722:1;42719;42712:12;42663:2;42653:79;:::o;42738:116::-;42808:21;42823:5;42808:21;:::i;:::-;42801:5;42798:32;42788:2;;42844:1;42841;42834:12;42788:2;42778:76;:::o;42860:120::-;42932:23;42949:5;42932:23;:::i;:::-;42925:5;42922:34;42912:2;;42970:1;42967;42960:12;42912:2;42902:78;:::o;42986:122::-;43059:24;43077:5;43059:24;:::i;:::-;43052:5;43049:35;43039:2;;43098:1;43095;43088:12;43039:2;43029:79;:::o

Swarm Source

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