ETH Price: $3,117.44 (+1.52%)
Gas: 5 Gwei

Token

Primate Republic - Arctic Troop (PRAT)
 

Overview

Max Total Supply

176 PRAT

Holders

62

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
403yyc.eth
Balance
1 PRAT
0x705b1ac7614c8b5f454ae3df200c028b3740a59f
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:
PrimateRepublicArctic

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-09
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^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 meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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");

        (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");

        (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");

        (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");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^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/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^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/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^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/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^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/ERC721.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

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

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @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 || 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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

        _balances[to] += 1;
        _owners[tokenId] = to;

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

        _afterTokenTransfer(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);

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

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

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

        _afterTokenTransfer(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 from incorrect 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);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

    /**
     * @dev 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` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/PrimateRepublicArctic.sol



pragma solidity >=0.7.0 <0.9.0;




contract PrimateRepublicArctic is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = "";
  string public uriSuffix = ".json";
  string public hiddenMetadataUri;
  
  uint256 public cost = 0.1 ether;
  uint256 public maxSupply = 2000;
  uint256 public maxMintAmountPerTx = 25;
  uint256 public maxMintAmountPerAddress = 25;
 

  bool public paused = true;
  bool public revealed = false;

  address[] private friendsFamilyAddresses;

  constructor() ERC721("Primate Republic - Arctic Troop", "PRAT") {
    setHiddenMetadataUri("ipfs://QmTXpv3ACvWTAq3C7eRR4W3cjuuVNBQ4PUsAYWmMSzAdKt/hidden.json");
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount! Try Again PRIMATE");
    require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded PRIMATE!");
    if (friendsFamilyAddresses.length > 0) {
        require(isAddressFriendsFamily(msg.sender), "Not on friends and family list!");
    }
    _;
  }

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused! We Will Be Back!");
    require(msg.value >= cost * _mintAmount, "Insufficient funds! Please try again PRIMATE!");
    require(balanceOf(msg.sender) + _mintAmount <= maxMintAmountPerAddress, "Max mint per address exceeded :( psssssst get another wallet! :p");

    _mintLoop(msg.sender, _mintAmount);
  }
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _mintLoop(_receiver, _mintAmount);
  }
  function isAddressFriendsFamily(address _user) private view returns (bool) {
      uint i = 0;
      while (i < friendsFamilyAddresses.length) {
          if(friendsFamilyAddresses[i] == _user) {
              return true;
          }
      i++;
      }
      return false;
  }


  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : "";
  }

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function withdraw() public onlyOwner {
    // This will pay CommunityWallet 20% of the initial sale.
    // =============================================================================
    (bool hs, ) = payable(0xf48B9E6fd267dBB0C0073528de049E5EbE8b8BEE).call{value: address(this).balance * 20 / 100}("");
    require(hs);

    // =============================================================================
    // This will transfer the remaining contract balance to the Charity, used for donations at 20%,
    // =============================================================================

    (bool hs2, ) = payable(0x80B10627EC600f51BEc0619EAf2e50A64524a479).call{value: address(this).balance * 20 / 100}("");
    require(hs2);

    // This will transfer the remaining contract balance to the ProjectTeam, to pay salaries
    // =============================================================================
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }

  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return uriPrefix;
  }
}

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"},{"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":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxMintAmountPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600890805190602001906200002b9291906200036d565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060099080519060200190620000799291906200036d565b5067016345785d8a0000600b556107d0600c556019600d556019600e556001600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff021916908315150217905550348015620000d957600080fd5b506040518060400160405280601f81526020017f5072696d6174652052657075626c6963202d204172637469632054726f6f70008152506040518060400160405280600481526020017f505241540000000000000000000000000000000000000000000000000000000081525081600090805190602001906200015e9291906200036d565b508060019080519060200190620001779291906200036d565b5050506200019a6200018e620001ca60201b60201c565b620001d260201b60201c565b620001c460405180608001604052806041815260200162004bb7604191396200029860201b60201c565b62000505565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002a8620001ca60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002ce6200034360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000327576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200031e9062000444565b60405180910390fd5b80600a90805190602001906200033f9291906200036d565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200037b9062000477565b90600052602060002090601f0160209004810192826200039f5760008555620003eb565b82601f10620003ba57805160ff1916838001178555620003eb565b82800160010185558215620003eb579182015b82811115620003ea578251825591602001919060010190620003cd565b5b509050620003fa9190620003fe565b5090565b5b8082111562000419576000816000905550600101620003ff565b5090565b60006200042c60208362000466565b91506200043982620004dc565b602082019050919050565b600060208201905081810360008301526200045f816200041d565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200049057607f821691505b60208210811415620004a757620004a6620004ad565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6146a280620005156000396000f3fe60806040526004361061021a5760003560e01c806362b99ad411610123578063a22cb465116100ab578063d5abeb011161006f578063d5abeb011461079e578063e0a80853146107c9578063e985e9c5146107f2578063efbd73f41461082f578063f2fde38b146108585761021a565b8063a22cb465146106bb578063a45ba8e7146106e4578063b071401b1461070f578063b88d4fde14610738578063c87b56dd146107615761021a565b80637ec4a659116100f25780637ec4a659146105f55780638da5cb5b1461061e57806394354fd01461064957806395d89b4114610674578063a0712d681461069f5761021a565b806362b99ad4146105395780636352211e1461056457806370a08231146105a1578063715018a6146105de5761021a565b80633ccfd60b116101a65780634fdd43cb116101755780634fdd43cb14610464578063518302271461048d5780635503a0e8146104b85780635c41d75e146104e35780635c975abb1461050e5761021a565b80633ccfd60b146103be57806342842e0e146103d5578063438b6300146103fe57806344a0d68a1461043b5761021a565b806313faede6116101ed57806313faede6146102ed57806316ba10e01461031857806316c38b3c1461034157806318160ddd1461036a57806323b872dd146103955761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b506102466004803603810190610241919061315c565b610881565b6040516102539190613834565b60405180910390f35b34801561026857600080fd5b50610271610963565b60405161027e919061384f565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a991906131ff565b6109f5565b6040516102bb91906137ab565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906130ef565b610a7a565b005b3480156102f957600080fd5b50610302610b92565b60405161030f9190613b31565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a91906131b6565b610b98565b005b34801561034d57600080fd5b506103686004803603810190610363919061312f565b610c2e565b005b34801561037657600080fd5b5061037f610cc7565b60405161038c9190613b31565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190612fd9565b610cd8565b005b3480156103ca57600080fd5b506103d3610d38565b005b3480156103e157600080fd5b506103fc60048036038101906103f79190612fd9565b610f7a565b005b34801561040a57600080fd5b5061042560048036038101906104209190612f6c565b610f9a565b6040516104329190613812565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d91906131ff565b6110a5565b005b34801561047057600080fd5b5061048b600480360381019061048691906131b6565b61112b565b005b34801561049957600080fd5b506104a26111c1565b6040516104af9190613834565b60405180910390f35b3480156104c457600080fd5b506104cd6111d4565b6040516104da919061384f565b60405180910390f35b3480156104ef57600080fd5b506104f8611262565b6040516105059190613b31565b60405180910390f35b34801561051a57600080fd5b50610523611268565b6040516105309190613834565b60405180910390f35b34801561054557600080fd5b5061054e61127b565b60405161055b919061384f565b60405180910390f35b34801561057057600080fd5b5061058b600480360381019061058691906131ff565b611309565b60405161059891906137ab565b60405180910390f35b3480156105ad57600080fd5b506105c860048036038101906105c39190612f6c565b6113bb565b6040516105d59190613b31565b60405180910390f35b3480156105ea57600080fd5b506105f3611473565b005b34801561060157600080fd5b5061061c600480360381019061061791906131b6565b6114fb565b005b34801561062a57600080fd5b50610633611591565b60405161064091906137ab565b60405180910390f35b34801561065557600080fd5b5061065e6115bb565b60405161066b9190613b31565b60405180910390f35b34801561068057600080fd5b506106896115c1565b604051610696919061384f565b60405180910390f35b6106b960048036038101906106b491906131ff565b611653565b005b3480156106c757600080fd5b506106e260048036038101906106dd91906130af565b61185b565b005b3480156106f057600080fd5b506106f9611871565b604051610706919061384f565b60405180910390f35b34801561071b57600080fd5b50610736600480360381019061073191906131ff565b6118ff565b005b34801561074457600080fd5b5061075f600480360381019061075a919061302c565b611985565b005b34801561076d57600080fd5b50610788600480360381019061078391906131ff565b6119e7565b604051610795919061384f565b60405180910390f35b3480156107aa57600080fd5b506107b3611b40565b6040516107c09190613b31565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb919061312f565b611b46565b005b3480156107fe57600080fd5b5061081960048036038101906108149190612f99565b611bdf565b6040516108269190613834565b60405180910390f35b34801561083b57600080fd5b506108566004803603810190610851919061322c565b611c73565b005b34801561086457600080fd5b5061087f600480360381019061087a9190612f6c565b611e00565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061095c575061095b82611ef8565b5b9050919050565b60606000805461097290613e3a565b80601f016020809104026020016040519081016040528092919081815260200182805461099e90613e3a565b80156109eb5780601f106109c0576101008083540402835291602001916109eb565b820191906000526020600020905b8154815290600101906020018083116109ce57829003601f168201915b5050505050905090565b6000610a0082611f62565b610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a36906139f1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a8582611309565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed90613a71565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b15611fce565b73ffffffffffffffffffffffffffffffffffffffff161480610b445750610b4381610b3e611fce565b611bdf565b5b610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90613971565b60405180910390fd5b610b8d8383611fd6565b505050565b600b5481565b610ba0611fce565b73ffffffffffffffffffffffffffffffffffffffff16610bbe611591565b73ffffffffffffffffffffffffffffffffffffffff1614610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b90613a11565b60405180910390fd5b8060099080519060200190610c2a929190612d80565b5050565b610c36611fce565b73ffffffffffffffffffffffffffffffffffffffff16610c54611591565b73ffffffffffffffffffffffffffffffffffffffff1614610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190613a11565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000610cd3600761208f565b905090565b610ce9610ce3611fce565b8261209d565b610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f90613a91565b60405180910390fd5b610d3383838361217b565b505050565b610d40611fce565b73ffffffffffffffffffffffffffffffffffffffff16610d5e611591565b73ffffffffffffffffffffffffffffffffffffffff1614610db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dab90613a11565b60405180910390fd5b600073f48b9e6fd267dbb0c0073528de049e5ebe8b8bee73ffffffffffffffffffffffffffffffffffffffff166064601447610df09190613cf6565b610dfa9190613cc5565b604051610e0690613796565b60006040518083038185875af1925050503d8060008114610e43576040519150601f19603f3d011682016040523d82523d6000602084013e610e48565b606091505b5050905080610e5657600080fd5b60007380b10627ec600f51bec0619eaf2e50a64524a47973ffffffffffffffffffffffffffffffffffffffff166064601447610e929190613cf6565b610e9c9190613cc5565b604051610ea890613796565b60006040518083038185875af1925050503d8060008114610ee5576040519150601f19603f3d011682016040523d82523d6000602084013e610eea565b606091505b5050905080610ef857600080fd5b6000610f02611591565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f2590613796565b60006040518083038185875af1925050503d8060008114610f62576040519150601f19603f3d011682016040523d82523d6000602084013e610f67565b606091505b5050905080610f7557600080fd5b505050565b610f9583838360405180602001604052806000815250611985565b505050565b60606000610fa7836113bb565b905060008167ffffffffffffffff811115610fc557610fc4613fd3565b5b604051908082528060200260200182016040528015610ff35781602001602082028036833780820191505090505b50905060006001905060005b83811080156110105750600c548211155b1561109957600061102083611309565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611085578284838151811061106a57611069613fa4565b5b602002602001018181525050818061108190613e9d565b9250505b828061109090613e9d565b93505050610fff565b82945050505050919050565b6110ad611fce565b73ffffffffffffffffffffffffffffffffffffffff166110cb611591565b73ffffffffffffffffffffffffffffffffffffffff1614611121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111890613a11565b60405180910390fd5b80600b8190555050565b611133611fce565b73ffffffffffffffffffffffffffffffffffffffff16611151611591565b73ffffffffffffffffffffffffffffffffffffffff16146111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e90613a11565b60405180910390fd5b80600a90805190602001906111bd929190612d80565b5050565b600f60019054906101000a900460ff1681565b600980546111e190613e3a565b80601f016020809104026020016040519081016040528092919081815260200182805461120d90613e3a565b801561125a5780601f1061122f5761010080835404028352916020019161125a565b820191906000526020600020905b81548152906001019060200180831161123d57829003601f168201915b505050505081565b600e5481565b600f60009054906101000a900460ff1681565b6008805461128890613e3a565b80601f01602080910402602001604051908101604052809291908181526020018280546112b490613e3a565b80156113015780601f106112d657610100808354040283529160200191611301565b820191906000526020600020905b8154815290600101906020018083116112e457829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a9906139b1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142390613991565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61147b611fce565b73ffffffffffffffffffffffffffffffffffffffff16611499611591565b73ffffffffffffffffffffffffffffffffffffffff16146114ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e690613a11565b60405180910390fd5b6114f960006123e2565b565b611503611fce565b73ffffffffffffffffffffffffffffffffffffffff16611521611591565b73ffffffffffffffffffffffffffffffffffffffff1614611577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156e90613a11565b60405180910390fd5b806008908051906020019061158d929190612d80565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b6060600180546115d090613e3a565b80601f01602080910402602001604051908101604052809291908181526020018280546115fc90613e3a565b80156116495780601f1061161e57610100808354040283529160200191611649565b820191906000526020600020905b81548152906001019060200180831161162c57829003601f168201915b5050505050905090565b806000811180156116665750600d548111155b6116a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169c90613ab1565b60405180910390fd5b600c54816116b3600761208f565b6116bd9190613c6f565b11156116fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f590613ad1565b60405180910390fd5b6000601080549050111561175557611715336124a8565b611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90613891565b60405180910390fd5b5b600f60009054906101000a900460ff16156117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90613b11565b60405180910390fd5b81600b546117b39190613cf6565b3410156117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec90613af1565b60405180910390fd5b600e5482611802336113bb565b61180c9190613c6f565b111561184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184490613a51565b60405180910390fd5b6118573383612557565b5050565b61186d611866611fce565b8383612597565b5050565b600a805461187e90613e3a565b80601f01602080910402602001604051908101604052809291908181526020018280546118aa90613e3a565b80156118f75780601f106118cc576101008083540402835291602001916118f7565b820191906000526020600020905b8154815290600101906020018083116118da57829003601f168201915b505050505081565b611907611fce565b73ffffffffffffffffffffffffffffffffffffffff16611925611591565b73ffffffffffffffffffffffffffffffffffffffff161461197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290613a11565b60405180910390fd5b80600d8190555050565b611996611990611fce565b8361209d565b6119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc90613a91565b60405180910390fd5b6119e184848484612704565b50505050565b60606119f282611f62565b611a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2890613a31565b60405180910390fd5b60001515600f60019054906101000a900460ff1615151415611adf57600a8054611a5a90613e3a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8690613e3a565b8015611ad35780601f10611aa857610100808354040283529160200191611ad3565b820191906000526020600020905b815481529060010190602001808311611ab657829003601f168201915b50505050509050611b3b565b6000611ae9612760565b90506000815111611b095760405180602001604052806000815250611b37565b80611b13846127f2565b6009604051602001611b2793929190613765565b6040516020818303038152906040525b9150505b919050565b600c5481565b611b4e611fce565b73ffffffffffffffffffffffffffffffffffffffff16611b6c611591565b73ffffffffffffffffffffffffffffffffffffffff1614611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb990613a11565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611c865750600d548111155b611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc90613ab1565b60405180910390fd5b600c5481611cd3600761208f565b611cdd9190613c6f565b1115611d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1590613ad1565b60405180910390fd5b60006010805490501115611d7557611d35336124a8565b611d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6b90613891565b60405180910390fd5b5b611d7d611fce565b73ffffffffffffffffffffffffffffffffffffffff16611d9b611591565b73ffffffffffffffffffffffffffffffffffffffff1614611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de890613a11565b60405180910390fd5b611dfb8284612557565b505050565b611e08611fce565b73ffffffffffffffffffffffffffffffffffffffff16611e26611591565b73ffffffffffffffffffffffffffffffffffffffff1614611e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7390613a11565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee3906138b1565b60405180910390fd5b611ef5816123e2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661204983611309565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006120a882611f62565b6120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120de90613951565b60405180910390fd5b60006120f283611309565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061216157508373ffffffffffffffffffffffffffffffffffffffff16612149846109f5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061217257506121718185611bdf565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661219b82611309565b73ffffffffffffffffffffffffffffffffffffffff16146121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e8906138d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225890613911565b60405180910390fd5b61226c838383612953565b612277600082611fd6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122c79190613d50565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461231e9190613c6f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123dd838383612958565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090505b60108054905081101561254c578273ffffffffffffffffffffffffffffffffffffffff16601082815481106124e8576124e7613fa4565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612539576001915050612552565b808061254490613e9d565b9150506124b0565b60009150505b919050565b60005b818110156125925761256c600761295d565b61257f8361257a600761208f565b612973565b808061258a90613e9d565b91505061255a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fd90613931565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126f79190613834565b60405180910390a3505050565b61270f84848461217b565b61271b84848484612991565b61275a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275190613871565b60405180910390fd5b50505050565b60606008805461276f90613e3a565b80601f016020809104026020016040519081016040528092919081815260200182805461279b90613e3a565b80156127e85780601f106127bd576101008083540402835291602001916127e8565b820191906000526020600020905b8154815290600101906020018083116127cb57829003601f168201915b5050505050905090565b6060600082141561283a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061294e565b600082905060005b6000821461286c57808061285590613e9d565b915050600a826128659190613cc5565b9150612842565b60008167ffffffffffffffff81111561288857612887613fd3565b5b6040519080825280601f01601f1916602001820160405280156128ba5781602001600182028036833780820191505090505b5090505b60008514612947576001826128d39190613d50565b9150600a856128e29190613ee6565b60306128ee9190613c6f565b60f81b81838151811061290457612903613fa4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129409190613cc5565b94506128be565b8093505050505b919050565b505050565b505050565b6001816000016000828254019250508190555050565b61298d828260405180602001604052806000815250612b28565b5050565b60006129b28473ffffffffffffffffffffffffffffffffffffffff16612b83565b15612b1b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129db611fce565b8786866040518563ffffffff1660e01b81526004016129fd94939291906137c6565b602060405180830381600087803b158015612a1757600080fd5b505af1925050508015612a4857506040513d601f19601f82011682018060405250810190612a459190613189565b60015b612acb573d8060008114612a78576040519150601f19603f3d011682016040523d82523d6000602084013e612a7d565b606091505b50600081511415612ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aba90613871565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b20565b600190505b949350505050565b612b328383612ba6565b612b3f6000848484612991565b612b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7590613871565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0d906139d1565b60405180910390fd5b612c1f81611f62565b15612c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c56906138f1565b60405180910390fd5b612c6b60008383612953565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cbb9190613c6f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d7c60008383612958565b5050565b828054612d8c90613e3a565b90600052602060002090601f016020900481019282612dae5760008555612df5565b82601f10612dc757805160ff1916838001178555612df5565b82800160010185558215612df5579182015b82811115612df4578251825591602001919060010190612dd9565b5b509050612e029190612e06565b5090565b5b80821115612e1f576000816000905550600101612e07565b5090565b6000612e36612e3184613b71565b613b4c565b905082815260208101848484011115612e5257612e51614007565b5b612e5d848285613df8565b509392505050565b6000612e78612e7384613ba2565b613b4c565b905082815260208101848484011115612e9457612e93614007565b5b612e9f848285613df8565b509392505050565b600081359050612eb681614610565b92915050565b600081359050612ecb81614627565b92915050565b600081359050612ee08161463e565b92915050565b600081519050612ef58161463e565b92915050565b600082601f830112612f1057612f0f614002565b5b8135612f20848260208601612e23565b91505092915050565b600082601f830112612f3e57612f3d614002565b5b8135612f4e848260208601612e65565b91505092915050565b600081359050612f6681614655565b92915050565b600060208284031215612f8257612f81614011565b5b6000612f9084828501612ea7565b91505092915050565b60008060408385031215612fb057612faf614011565b5b6000612fbe85828601612ea7565b9250506020612fcf85828601612ea7565b9150509250929050565b600080600060608486031215612ff257612ff1614011565b5b600061300086828701612ea7565b935050602061301186828701612ea7565b925050604061302286828701612f57565b9150509250925092565b6000806000806080858703121561304657613045614011565b5b600061305487828801612ea7565b945050602061306587828801612ea7565b935050604061307687828801612f57565b925050606085013567ffffffffffffffff8111156130975761309661400c565b5b6130a387828801612efb565b91505092959194509250565b600080604083850312156130c6576130c5614011565b5b60006130d485828601612ea7565b92505060206130e585828601612ebc565b9150509250929050565b6000806040838503121561310657613105614011565b5b600061311485828601612ea7565b925050602061312585828601612f57565b9150509250929050565b60006020828403121561314557613144614011565b5b600061315384828501612ebc565b91505092915050565b60006020828403121561317257613171614011565b5b600061318084828501612ed1565b91505092915050565b60006020828403121561319f5761319e614011565b5b60006131ad84828501612ee6565b91505092915050565b6000602082840312156131cc576131cb614011565b5b600082013567ffffffffffffffff8111156131ea576131e961400c565b5b6131f684828501612f29565b91505092915050565b60006020828403121561321557613214614011565b5b600061322384828501612f57565b91505092915050565b6000806040838503121561324357613242614011565b5b600061325185828601612f57565b925050602061326285828601612ea7565b9150509250929050565b60006132788383613747565b60208301905092915050565b61328d81613d84565b82525050565b600061329e82613bf8565b6132a88185613c26565b93506132b383613bd3565b8060005b838110156132e45781516132cb888261326c565b97506132d683613c19565b9250506001810190506132b7565b5085935050505092915050565b6132fa81613d96565b82525050565b600061330b82613c03565b6133158185613c37565b9350613325818560208601613e07565b61332e81614016565b840191505092915050565b600061334482613c0e565b61334e8185613c53565b935061335e818560208601613e07565b61336781614016565b840191505092915050565b600061337d82613c0e565b6133878185613c64565b9350613397818560208601613e07565b80840191505092915050565b600081546133b081613e3a565b6133ba8186613c64565b945060018216600081146133d557600181146133e657613419565b60ff19831686528186019350613419565b6133ef85613be3565b60005b83811015613411578154818901526001820191506020810190506133f2565b838801955050505b50505092915050565b600061342f603283613c53565b915061343a82614027565b604082019050919050565b6000613452601f83613c53565b915061345d82614076565b602082019050919050565b6000613475602683613c53565b91506134808261409f565b604082019050919050565b6000613498602583613c53565b91506134a3826140ee565b604082019050919050565b60006134bb601c83613c53565b91506134c68261413d565b602082019050919050565b60006134de602483613c53565b91506134e982614166565b604082019050919050565b6000613501601983613c53565b915061350c826141b5565b602082019050919050565b6000613524602c83613c53565b915061352f826141de565b604082019050919050565b6000613547603883613c53565b91506135528261422d565b604082019050919050565b600061356a602a83613c53565b91506135758261427c565b604082019050919050565b600061358d602983613c53565b9150613598826142cb565b604082019050919050565b60006135b0602083613c53565b91506135bb8261431a565b602082019050919050565b60006135d3602c83613c53565b91506135de82614343565b604082019050919050565b60006135f6602083613c53565b915061360182614392565b602082019050919050565b6000613619602f83613c53565b9150613624826143bb565b604082019050919050565b600061363c604083613c53565b91506136478261440a565b604082019050919050565b600061365f602183613c53565b915061366a82614459565b604082019050919050565b6000613682600083613c48565b915061368d826144a8565b600082019050919050565b60006136a5603183613c53565b91506136b0826144ab565b604082019050919050565b60006136c8602683613c53565b91506136d3826144fa565b604082019050919050565b60006136eb601c83613c53565b91506136f682614549565b602082019050919050565b600061370e602d83613c53565b915061371982614572565b604082019050919050565b6000613731602883613c53565b915061373c826145c1565b604082019050919050565b61375081613dee565b82525050565b61375f81613dee565b82525050565b60006137718286613372565b915061377d8285613372565b915061378982846133a3565b9150819050949350505050565b60006137a182613675565b9150819050919050565b60006020820190506137c06000830184613284565b92915050565b60006080820190506137db6000830187613284565b6137e86020830186613284565b6137f56040830185613756565b81810360608301526138078184613300565b905095945050505050565b6000602082019050818103600083015261382c8184613293565b905092915050565b600060208201905061384960008301846132f1565b92915050565b600060208201905081810360008301526138698184613339565b905092915050565b6000602082019050818103600083015261388a81613422565b9050919050565b600060208201905081810360008301526138aa81613445565b9050919050565b600060208201905081810360008301526138ca81613468565b9050919050565b600060208201905081810360008301526138ea8161348b565b9050919050565b6000602082019050818103600083015261390a816134ae565b9050919050565b6000602082019050818103600083015261392a816134d1565b9050919050565b6000602082019050818103600083015261394a816134f4565b9050919050565b6000602082019050818103600083015261396a81613517565b9050919050565b6000602082019050818103600083015261398a8161353a565b9050919050565b600060208201905081810360008301526139aa8161355d565b9050919050565b600060208201905081810360008301526139ca81613580565b9050919050565b600060208201905081810360008301526139ea816135a3565b9050919050565b60006020820190508181036000830152613a0a816135c6565b9050919050565b60006020820190508181036000830152613a2a816135e9565b9050919050565b60006020820190508181036000830152613a4a8161360c565b9050919050565b60006020820190508181036000830152613a6a8161362f565b9050919050565b60006020820190508181036000830152613a8a81613652565b9050919050565b60006020820190508181036000830152613aaa81613698565b9050919050565b60006020820190508181036000830152613aca816136bb565b9050919050565b60006020820190508181036000830152613aea816136de565b9050919050565b60006020820190508181036000830152613b0a81613701565b9050919050565b60006020820190508181036000830152613b2a81613724565b9050919050565b6000602082019050613b466000830184613756565b92915050565b6000613b56613b67565b9050613b628282613e6c565b919050565b6000604051905090565b600067ffffffffffffffff821115613b8c57613b8b613fd3565b5b613b9582614016565b9050602081019050919050565b600067ffffffffffffffff821115613bbd57613bbc613fd3565b5b613bc682614016565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c7a82613dee565b9150613c8583613dee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cba57613cb9613f17565b5b828201905092915050565b6000613cd082613dee565b9150613cdb83613dee565b925082613ceb57613cea613f46565b5b828204905092915050565b6000613d0182613dee565b9150613d0c83613dee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d4557613d44613f17565b5b828202905092915050565b6000613d5b82613dee565b9150613d6683613dee565b925082821015613d7957613d78613f17565b5b828203905092915050565b6000613d8f82613dce565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e25578082015181840152602081019050613e0a565b83811115613e34576000848401525b50505050565b60006002820490506001821680613e5257607f821691505b60208210811415613e6657613e65613f75565b5b50919050565b613e7582614016565b810181811067ffffffffffffffff82111715613e9457613e93613fd3565b5b80604052505050565b6000613ea882613dee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613edb57613eda613f17565b5b600182019050919050565b6000613ef182613dee565b9150613efc83613dee565b925082613f0c57613f0b613f46565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4e6f74206f6e20667269656e647320616e642066616d696c79206c6973742100600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d6178206d696e74207065722061646472657373206578636565646564203a2860008201527f2070737373737373742067657420616e6f746865722077616c6c657421203a70602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e74212054727920416761696e205060008201527f52494d4154450000000000000000000000000000000000000000000000000000602082015250565b7f4d617820737570706c79206578636565646564205052494d4154452100000000600082015250565b7f496e73756666696369656e742066756e64732120506c6561736520747279206160008201527f6761696e205052494d4154452100000000000000000000000000000000000000602082015250565b7f54686520636f6e747261637420697320706175736564212057652057696c6c2060008201527f4265204261636b21000000000000000000000000000000000000000000000000602082015250565b61461981613d84565b811461462457600080fd5b50565b61463081613d96565b811461463b57600080fd5b50565b61464781613da2565b811461465257600080fd5b50565b61465e81613dee565b811461466957600080fd5b5056fea26469706673582212200113022360a0ce69901d1bd91b4d67db6f27a9a639b6e76b6e6292522124b16d64736f6c63430008070033697066733a2f2f516d545870763341437657544171334337655252345733636a7575564e4251345055734159576d4d537a41644b742f68696464656e2e6a736f6e

Deployed Bytecode

0x60806040526004361061021a5760003560e01c806362b99ad411610123578063a22cb465116100ab578063d5abeb011161006f578063d5abeb011461079e578063e0a80853146107c9578063e985e9c5146107f2578063efbd73f41461082f578063f2fde38b146108585761021a565b8063a22cb465146106bb578063a45ba8e7146106e4578063b071401b1461070f578063b88d4fde14610738578063c87b56dd146107615761021a565b80637ec4a659116100f25780637ec4a659146105f55780638da5cb5b1461061e57806394354fd01461064957806395d89b4114610674578063a0712d681461069f5761021a565b806362b99ad4146105395780636352211e1461056457806370a08231146105a1578063715018a6146105de5761021a565b80633ccfd60b116101a65780634fdd43cb116101755780634fdd43cb14610464578063518302271461048d5780635503a0e8146104b85780635c41d75e146104e35780635c975abb1461050e5761021a565b80633ccfd60b146103be57806342842e0e146103d5578063438b6300146103fe57806344a0d68a1461043b5761021a565b806313faede6116101ed57806313faede6146102ed57806316ba10e01461031857806316c38b3c1461034157806318160ddd1461036a57806323b872dd146103955761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b506102466004803603810190610241919061315c565b610881565b6040516102539190613834565b60405180910390f35b34801561026857600080fd5b50610271610963565b60405161027e919061384f565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a991906131ff565b6109f5565b6040516102bb91906137ab565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906130ef565b610a7a565b005b3480156102f957600080fd5b50610302610b92565b60405161030f9190613b31565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a91906131b6565b610b98565b005b34801561034d57600080fd5b506103686004803603810190610363919061312f565b610c2e565b005b34801561037657600080fd5b5061037f610cc7565b60405161038c9190613b31565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190612fd9565b610cd8565b005b3480156103ca57600080fd5b506103d3610d38565b005b3480156103e157600080fd5b506103fc60048036038101906103f79190612fd9565b610f7a565b005b34801561040a57600080fd5b5061042560048036038101906104209190612f6c565b610f9a565b6040516104329190613812565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d91906131ff565b6110a5565b005b34801561047057600080fd5b5061048b600480360381019061048691906131b6565b61112b565b005b34801561049957600080fd5b506104a26111c1565b6040516104af9190613834565b60405180910390f35b3480156104c457600080fd5b506104cd6111d4565b6040516104da919061384f565b60405180910390f35b3480156104ef57600080fd5b506104f8611262565b6040516105059190613b31565b60405180910390f35b34801561051a57600080fd5b50610523611268565b6040516105309190613834565b60405180910390f35b34801561054557600080fd5b5061054e61127b565b60405161055b919061384f565b60405180910390f35b34801561057057600080fd5b5061058b600480360381019061058691906131ff565b611309565b60405161059891906137ab565b60405180910390f35b3480156105ad57600080fd5b506105c860048036038101906105c39190612f6c565b6113bb565b6040516105d59190613b31565b60405180910390f35b3480156105ea57600080fd5b506105f3611473565b005b34801561060157600080fd5b5061061c600480360381019061061791906131b6565b6114fb565b005b34801561062a57600080fd5b50610633611591565b60405161064091906137ab565b60405180910390f35b34801561065557600080fd5b5061065e6115bb565b60405161066b9190613b31565b60405180910390f35b34801561068057600080fd5b506106896115c1565b604051610696919061384f565b60405180910390f35b6106b960048036038101906106b491906131ff565b611653565b005b3480156106c757600080fd5b506106e260048036038101906106dd91906130af565b61185b565b005b3480156106f057600080fd5b506106f9611871565b604051610706919061384f565b60405180910390f35b34801561071b57600080fd5b50610736600480360381019061073191906131ff565b6118ff565b005b34801561074457600080fd5b5061075f600480360381019061075a919061302c565b611985565b005b34801561076d57600080fd5b50610788600480360381019061078391906131ff565b6119e7565b604051610795919061384f565b60405180910390f35b3480156107aa57600080fd5b506107b3611b40565b6040516107c09190613b31565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb919061312f565b611b46565b005b3480156107fe57600080fd5b5061081960048036038101906108149190612f99565b611bdf565b6040516108269190613834565b60405180910390f35b34801561083b57600080fd5b506108566004803603810190610851919061322c565b611c73565b005b34801561086457600080fd5b5061087f600480360381019061087a9190612f6c565b611e00565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061095c575061095b82611ef8565b5b9050919050565b60606000805461097290613e3a565b80601f016020809104026020016040519081016040528092919081815260200182805461099e90613e3a565b80156109eb5780601f106109c0576101008083540402835291602001916109eb565b820191906000526020600020905b8154815290600101906020018083116109ce57829003601f168201915b5050505050905090565b6000610a0082611f62565b610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a36906139f1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a8582611309565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed90613a71565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b15611fce565b73ffffffffffffffffffffffffffffffffffffffff161480610b445750610b4381610b3e611fce565b611bdf565b5b610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90613971565b60405180910390fd5b610b8d8383611fd6565b505050565b600b5481565b610ba0611fce565b73ffffffffffffffffffffffffffffffffffffffff16610bbe611591565b73ffffffffffffffffffffffffffffffffffffffff1614610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b90613a11565b60405180910390fd5b8060099080519060200190610c2a929190612d80565b5050565b610c36611fce565b73ffffffffffffffffffffffffffffffffffffffff16610c54611591565b73ffffffffffffffffffffffffffffffffffffffff1614610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190613a11565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000610cd3600761208f565b905090565b610ce9610ce3611fce565b8261209d565b610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f90613a91565b60405180910390fd5b610d3383838361217b565b505050565b610d40611fce565b73ffffffffffffffffffffffffffffffffffffffff16610d5e611591565b73ffffffffffffffffffffffffffffffffffffffff1614610db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dab90613a11565b60405180910390fd5b600073f48b9e6fd267dbb0c0073528de049e5ebe8b8bee73ffffffffffffffffffffffffffffffffffffffff166064601447610df09190613cf6565b610dfa9190613cc5565b604051610e0690613796565b60006040518083038185875af1925050503d8060008114610e43576040519150601f19603f3d011682016040523d82523d6000602084013e610e48565b606091505b5050905080610e5657600080fd5b60007380b10627ec600f51bec0619eaf2e50a64524a47973ffffffffffffffffffffffffffffffffffffffff166064601447610e929190613cf6565b610e9c9190613cc5565b604051610ea890613796565b60006040518083038185875af1925050503d8060008114610ee5576040519150601f19603f3d011682016040523d82523d6000602084013e610eea565b606091505b5050905080610ef857600080fd5b6000610f02611591565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f2590613796565b60006040518083038185875af1925050503d8060008114610f62576040519150601f19603f3d011682016040523d82523d6000602084013e610f67565b606091505b5050905080610f7557600080fd5b505050565b610f9583838360405180602001604052806000815250611985565b505050565b60606000610fa7836113bb565b905060008167ffffffffffffffff811115610fc557610fc4613fd3565b5b604051908082528060200260200182016040528015610ff35781602001602082028036833780820191505090505b50905060006001905060005b83811080156110105750600c548211155b1561109957600061102083611309565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611085578284838151811061106a57611069613fa4565b5b602002602001018181525050818061108190613e9d565b9250505b828061109090613e9d565b93505050610fff565b82945050505050919050565b6110ad611fce565b73ffffffffffffffffffffffffffffffffffffffff166110cb611591565b73ffffffffffffffffffffffffffffffffffffffff1614611121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111890613a11565b60405180910390fd5b80600b8190555050565b611133611fce565b73ffffffffffffffffffffffffffffffffffffffff16611151611591565b73ffffffffffffffffffffffffffffffffffffffff16146111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e90613a11565b60405180910390fd5b80600a90805190602001906111bd929190612d80565b5050565b600f60019054906101000a900460ff1681565b600980546111e190613e3a565b80601f016020809104026020016040519081016040528092919081815260200182805461120d90613e3a565b801561125a5780601f1061122f5761010080835404028352916020019161125a565b820191906000526020600020905b81548152906001019060200180831161123d57829003601f168201915b505050505081565b600e5481565b600f60009054906101000a900460ff1681565b6008805461128890613e3a565b80601f01602080910402602001604051908101604052809291908181526020018280546112b490613e3a565b80156113015780601f106112d657610100808354040283529160200191611301565b820191906000526020600020905b8154815290600101906020018083116112e457829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a9906139b1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142390613991565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61147b611fce565b73ffffffffffffffffffffffffffffffffffffffff16611499611591565b73ffffffffffffffffffffffffffffffffffffffff16146114ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e690613a11565b60405180910390fd5b6114f960006123e2565b565b611503611fce565b73ffffffffffffffffffffffffffffffffffffffff16611521611591565b73ffffffffffffffffffffffffffffffffffffffff1614611577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156e90613a11565b60405180910390fd5b806008908051906020019061158d929190612d80565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b6060600180546115d090613e3a565b80601f01602080910402602001604051908101604052809291908181526020018280546115fc90613e3a565b80156116495780601f1061161e57610100808354040283529160200191611649565b820191906000526020600020905b81548152906001019060200180831161162c57829003601f168201915b5050505050905090565b806000811180156116665750600d548111155b6116a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169c90613ab1565b60405180910390fd5b600c54816116b3600761208f565b6116bd9190613c6f565b11156116fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f590613ad1565b60405180910390fd5b6000601080549050111561175557611715336124a8565b611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90613891565b60405180910390fd5b5b600f60009054906101000a900460ff16156117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90613b11565b60405180910390fd5b81600b546117b39190613cf6565b3410156117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec90613af1565b60405180910390fd5b600e5482611802336113bb565b61180c9190613c6f565b111561184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184490613a51565b60405180910390fd5b6118573383612557565b5050565b61186d611866611fce565b8383612597565b5050565b600a805461187e90613e3a565b80601f01602080910402602001604051908101604052809291908181526020018280546118aa90613e3a565b80156118f75780601f106118cc576101008083540402835291602001916118f7565b820191906000526020600020905b8154815290600101906020018083116118da57829003601f168201915b505050505081565b611907611fce565b73ffffffffffffffffffffffffffffffffffffffff16611925611591565b73ffffffffffffffffffffffffffffffffffffffff161461197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290613a11565b60405180910390fd5b80600d8190555050565b611996611990611fce565b8361209d565b6119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc90613a91565b60405180910390fd5b6119e184848484612704565b50505050565b60606119f282611f62565b611a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2890613a31565b60405180910390fd5b60001515600f60019054906101000a900460ff1615151415611adf57600a8054611a5a90613e3a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8690613e3a565b8015611ad35780601f10611aa857610100808354040283529160200191611ad3565b820191906000526020600020905b815481529060010190602001808311611ab657829003601f168201915b50505050509050611b3b565b6000611ae9612760565b90506000815111611b095760405180602001604052806000815250611b37565b80611b13846127f2565b6009604051602001611b2793929190613765565b6040516020818303038152906040525b9150505b919050565b600c5481565b611b4e611fce565b73ffffffffffffffffffffffffffffffffffffffff16611b6c611591565b73ffffffffffffffffffffffffffffffffffffffff1614611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb990613a11565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611c865750600d548111155b611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc90613ab1565b60405180910390fd5b600c5481611cd3600761208f565b611cdd9190613c6f565b1115611d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1590613ad1565b60405180910390fd5b60006010805490501115611d7557611d35336124a8565b611d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6b90613891565b60405180910390fd5b5b611d7d611fce565b73ffffffffffffffffffffffffffffffffffffffff16611d9b611591565b73ffffffffffffffffffffffffffffffffffffffff1614611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de890613a11565b60405180910390fd5b611dfb8284612557565b505050565b611e08611fce565b73ffffffffffffffffffffffffffffffffffffffff16611e26611591565b73ffffffffffffffffffffffffffffffffffffffff1614611e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7390613a11565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee3906138b1565b60405180910390fd5b611ef5816123e2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661204983611309565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006120a882611f62565b6120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120de90613951565b60405180910390fd5b60006120f283611309565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061216157508373ffffffffffffffffffffffffffffffffffffffff16612149846109f5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061217257506121718185611bdf565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661219b82611309565b73ffffffffffffffffffffffffffffffffffffffff16146121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e8906138d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225890613911565b60405180910390fd5b61226c838383612953565b612277600082611fd6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122c79190613d50565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461231e9190613c6f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123dd838383612958565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090505b60108054905081101561254c578273ffffffffffffffffffffffffffffffffffffffff16601082815481106124e8576124e7613fa4565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612539576001915050612552565b808061254490613e9d565b9150506124b0565b60009150505b919050565b60005b818110156125925761256c600761295d565b61257f8361257a600761208f565b612973565b808061258a90613e9d565b91505061255a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fd90613931565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126f79190613834565b60405180910390a3505050565b61270f84848461217b565b61271b84848484612991565b61275a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275190613871565b60405180910390fd5b50505050565b60606008805461276f90613e3a565b80601f016020809104026020016040519081016040528092919081815260200182805461279b90613e3a565b80156127e85780601f106127bd576101008083540402835291602001916127e8565b820191906000526020600020905b8154815290600101906020018083116127cb57829003601f168201915b5050505050905090565b6060600082141561283a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061294e565b600082905060005b6000821461286c57808061285590613e9d565b915050600a826128659190613cc5565b9150612842565b60008167ffffffffffffffff81111561288857612887613fd3565b5b6040519080825280601f01601f1916602001820160405280156128ba5781602001600182028036833780820191505090505b5090505b60008514612947576001826128d39190613d50565b9150600a856128e29190613ee6565b60306128ee9190613c6f565b60f81b81838151811061290457612903613fa4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129409190613cc5565b94506128be565b8093505050505b919050565b505050565b505050565b6001816000016000828254019250508190555050565b61298d828260405180602001604052806000815250612b28565b5050565b60006129b28473ffffffffffffffffffffffffffffffffffffffff16612b83565b15612b1b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129db611fce565b8786866040518563ffffffff1660e01b81526004016129fd94939291906137c6565b602060405180830381600087803b158015612a1757600080fd5b505af1925050508015612a4857506040513d601f19601f82011682018060405250810190612a459190613189565b60015b612acb573d8060008114612a78576040519150601f19603f3d011682016040523d82523d6000602084013e612a7d565b606091505b50600081511415612ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aba90613871565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b20565b600190505b949350505050565b612b328383612ba6565b612b3f6000848484612991565b612b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7590613871565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0d906139d1565b60405180910390fd5b612c1f81611f62565b15612c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c56906138f1565b60405180910390fd5b612c6b60008383612953565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cbb9190613c6f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d7c60008383612958565b5050565b828054612d8c90613e3a565b90600052602060002090601f016020900481019282612dae5760008555612df5565b82601f10612dc757805160ff1916838001178555612df5565b82800160010185558215612df5579182015b82811115612df4578251825591602001919060010190612dd9565b5b509050612e029190612e06565b5090565b5b80821115612e1f576000816000905550600101612e07565b5090565b6000612e36612e3184613b71565b613b4c565b905082815260208101848484011115612e5257612e51614007565b5b612e5d848285613df8565b509392505050565b6000612e78612e7384613ba2565b613b4c565b905082815260208101848484011115612e9457612e93614007565b5b612e9f848285613df8565b509392505050565b600081359050612eb681614610565b92915050565b600081359050612ecb81614627565b92915050565b600081359050612ee08161463e565b92915050565b600081519050612ef58161463e565b92915050565b600082601f830112612f1057612f0f614002565b5b8135612f20848260208601612e23565b91505092915050565b600082601f830112612f3e57612f3d614002565b5b8135612f4e848260208601612e65565b91505092915050565b600081359050612f6681614655565b92915050565b600060208284031215612f8257612f81614011565b5b6000612f9084828501612ea7565b91505092915050565b60008060408385031215612fb057612faf614011565b5b6000612fbe85828601612ea7565b9250506020612fcf85828601612ea7565b9150509250929050565b600080600060608486031215612ff257612ff1614011565b5b600061300086828701612ea7565b935050602061301186828701612ea7565b925050604061302286828701612f57565b9150509250925092565b6000806000806080858703121561304657613045614011565b5b600061305487828801612ea7565b945050602061306587828801612ea7565b935050604061307687828801612f57565b925050606085013567ffffffffffffffff8111156130975761309661400c565b5b6130a387828801612efb565b91505092959194509250565b600080604083850312156130c6576130c5614011565b5b60006130d485828601612ea7565b92505060206130e585828601612ebc565b9150509250929050565b6000806040838503121561310657613105614011565b5b600061311485828601612ea7565b925050602061312585828601612f57565b9150509250929050565b60006020828403121561314557613144614011565b5b600061315384828501612ebc565b91505092915050565b60006020828403121561317257613171614011565b5b600061318084828501612ed1565b91505092915050565b60006020828403121561319f5761319e614011565b5b60006131ad84828501612ee6565b91505092915050565b6000602082840312156131cc576131cb614011565b5b600082013567ffffffffffffffff8111156131ea576131e961400c565b5b6131f684828501612f29565b91505092915050565b60006020828403121561321557613214614011565b5b600061322384828501612f57565b91505092915050565b6000806040838503121561324357613242614011565b5b600061325185828601612f57565b925050602061326285828601612ea7565b9150509250929050565b60006132788383613747565b60208301905092915050565b61328d81613d84565b82525050565b600061329e82613bf8565b6132a88185613c26565b93506132b383613bd3565b8060005b838110156132e45781516132cb888261326c565b97506132d683613c19565b9250506001810190506132b7565b5085935050505092915050565b6132fa81613d96565b82525050565b600061330b82613c03565b6133158185613c37565b9350613325818560208601613e07565b61332e81614016565b840191505092915050565b600061334482613c0e565b61334e8185613c53565b935061335e818560208601613e07565b61336781614016565b840191505092915050565b600061337d82613c0e565b6133878185613c64565b9350613397818560208601613e07565b80840191505092915050565b600081546133b081613e3a565b6133ba8186613c64565b945060018216600081146133d557600181146133e657613419565b60ff19831686528186019350613419565b6133ef85613be3565b60005b83811015613411578154818901526001820191506020810190506133f2565b838801955050505b50505092915050565b600061342f603283613c53565b915061343a82614027565b604082019050919050565b6000613452601f83613c53565b915061345d82614076565b602082019050919050565b6000613475602683613c53565b91506134808261409f565b604082019050919050565b6000613498602583613c53565b91506134a3826140ee565b604082019050919050565b60006134bb601c83613c53565b91506134c68261413d565b602082019050919050565b60006134de602483613c53565b91506134e982614166565b604082019050919050565b6000613501601983613c53565b915061350c826141b5565b602082019050919050565b6000613524602c83613c53565b915061352f826141de565b604082019050919050565b6000613547603883613c53565b91506135528261422d565b604082019050919050565b600061356a602a83613c53565b91506135758261427c565b604082019050919050565b600061358d602983613c53565b9150613598826142cb565b604082019050919050565b60006135b0602083613c53565b91506135bb8261431a565b602082019050919050565b60006135d3602c83613c53565b91506135de82614343565b604082019050919050565b60006135f6602083613c53565b915061360182614392565b602082019050919050565b6000613619602f83613c53565b9150613624826143bb565b604082019050919050565b600061363c604083613c53565b91506136478261440a565b604082019050919050565b600061365f602183613c53565b915061366a82614459565b604082019050919050565b6000613682600083613c48565b915061368d826144a8565b600082019050919050565b60006136a5603183613c53565b91506136b0826144ab565b604082019050919050565b60006136c8602683613c53565b91506136d3826144fa565b604082019050919050565b60006136eb601c83613c53565b91506136f682614549565b602082019050919050565b600061370e602d83613c53565b915061371982614572565b604082019050919050565b6000613731602883613c53565b915061373c826145c1565b604082019050919050565b61375081613dee565b82525050565b61375f81613dee565b82525050565b60006137718286613372565b915061377d8285613372565b915061378982846133a3565b9150819050949350505050565b60006137a182613675565b9150819050919050565b60006020820190506137c06000830184613284565b92915050565b60006080820190506137db6000830187613284565b6137e86020830186613284565b6137f56040830185613756565b81810360608301526138078184613300565b905095945050505050565b6000602082019050818103600083015261382c8184613293565b905092915050565b600060208201905061384960008301846132f1565b92915050565b600060208201905081810360008301526138698184613339565b905092915050565b6000602082019050818103600083015261388a81613422565b9050919050565b600060208201905081810360008301526138aa81613445565b9050919050565b600060208201905081810360008301526138ca81613468565b9050919050565b600060208201905081810360008301526138ea8161348b565b9050919050565b6000602082019050818103600083015261390a816134ae565b9050919050565b6000602082019050818103600083015261392a816134d1565b9050919050565b6000602082019050818103600083015261394a816134f4565b9050919050565b6000602082019050818103600083015261396a81613517565b9050919050565b6000602082019050818103600083015261398a8161353a565b9050919050565b600060208201905081810360008301526139aa8161355d565b9050919050565b600060208201905081810360008301526139ca81613580565b9050919050565b600060208201905081810360008301526139ea816135a3565b9050919050565b60006020820190508181036000830152613a0a816135c6565b9050919050565b60006020820190508181036000830152613a2a816135e9565b9050919050565b60006020820190508181036000830152613a4a8161360c565b9050919050565b60006020820190508181036000830152613a6a8161362f565b9050919050565b60006020820190508181036000830152613a8a81613652565b9050919050565b60006020820190508181036000830152613aaa81613698565b9050919050565b60006020820190508181036000830152613aca816136bb565b9050919050565b60006020820190508181036000830152613aea816136de565b9050919050565b60006020820190508181036000830152613b0a81613701565b9050919050565b60006020820190508181036000830152613b2a81613724565b9050919050565b6000602082019050613b466000830184613756565b92915050565b6000613b56613b67565b9050613b628282613e6c565b919050565b6000604051905090565b600067ffffffffffffffff821115613b8c57613b8b613fd3565b5b613b9582614016565b9050602081019050919050565b600067ffffffffffffffff821115613bbd57613bbc613fd3565b5b613bc682614016565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c7a82613dee565b9150613c8583613dee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cba57613cb9613f17565b5b828201905092915050565b6000613cd082613dee565b9150613cdb83613dee565b925082613ceb57613cea613f46565b5b828204905092915050565b6000613d0182613dee565b9150613d0c83613dee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d4557613d44613f17565b5b828202905092915050565b6000613d5b82613dee565b9150613d6683613dee565b925082821015613d7957613d78613f17565b5b828203905092915050565b6000613d8f82613dce565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e25578082015181840152602081019050613e0a565b83811115613e34576000848401525b50505050565b60006002820490506001821680613e5257607f821691505b60208210811415613e6657613e65613f75565b5b50919050565b613e7582614016565b810181811067ffffffffffffffff82111715613e9457613e93613fd3565b5b80604052505050565b6000613ea882613dee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613edb57613eda613f17565b5b600182019050919050565b6000613ef182613dee565b9150613efc83613dee565b925082613f0c57613f0b613f46565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4e6f74206f6e20667269656e647320616e642066616d696c79206c6973742100600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d6178206d696e74207065722061646472657373206578636565646564203a2860008201527f2070737373737373742067657420616e6f746865722077616c6c657421203a70602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e74212054727920416761696e205060008201527f52494d4154450000000000000000000000000000000000000000000000000000602082015250565b7f4d617820737570706c79206578636565646564205052494d4154452100000000600082015250565b7f496e73756666696369656e742066756e64732120506c6561736520747279206160008201527f6761696e205052494d4154452100000000000000000000000000000000000000602082015250565b7f54686520636f6e747261637420697320706175736564212057652057696c6c2060008201527f4265204261636b21000000000000000000000000000000000000000000000000602082015250565b61461981613d84565b811461462457600080fd5b50565b61463081613d96565b811461463b57600080fd5b50565b61464781613da2565b811461465257600080fd5b50565b61465e81613dee565b811461466957600080fd5b5056fea26469706673582212200113022360a0ce69901d1bd91b4d67db6f27a9a639b6e76b6e6292522124b16d64736f6c63430008070033

Deployed Bytecode Sourcemap

38814:5441:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25607:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26552:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28111:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27634:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39090:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42630:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42736:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39950:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28861:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42819:1113;;;;;;;;;;;;;:::i;:::-;;29271:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40942:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42170:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42386:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39288:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39012:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39205:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39258:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38979:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26246:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25976:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6228:103;;;;;;;;;;;;;:::i;:::-;;42524:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5577:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39162:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26721:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40045:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28404:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39050:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42250:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29527:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41583:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39126:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42083:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28630:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40489:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6486:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25607:305;25709:4;25761:25;25746:40;;;:11;:40;;;;:105;;;;25818:33;25803:48;;;:11;:48;;;;25746:105;:158;;;;25868:36;25892:11;25868:23;:36::i;:::-;25746:158;25726:178;;25607:305;;;:::o;26552:100::-;26606:13;26639:5;26632:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26552:100;:::o;28111:221::-;28187:7;28215:16;28223:7;28215;:16::i;:::-;28207:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28300:15;:24;28316:7;28300:24;;;;;;;;;;;;;;;;;;;;;28293:31;;28111:221;;;:::o;27634:411::-;27715:13;27731:23;27746:7;27731:14;:23::i;:::-;27715:39;;27779:5;27773:11;;:2;:11;;;;27765:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27873:5;27857:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27882:37;27899:5;27906:12;:10;:12::i;:::-;27882:16;:37::i;:::-;27857:62;27835:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28016:21;28025:2;28029:7;28016:8;:21::i;:::-;27704:341;27634:411;;:::o;39090:31::-;;;;:::o;42630:100::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42714:10:::1;42702:9;:22;;;;;;;;;;;;:::i;:::-;;42630:100:::0;:::o;42736:77::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42801:6:::1;42792;;:15;;;;;;;;;;;;;;;;;;42736:77:::0;:::o;39950:89::-;39994:7;40017:16;:6;:14;:16::i;:::-;40010:23;;39950:89;:::o;28861:339::-;29056:41;29075:12;:10;:12::i;:::-;29089:7;29056:18;:41::i;:::-;29048:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29164:28;29174:4;29180:2;29184:7;29164:9;:28::i;:::-;28861:339;;;:::o;42819:1113::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43013:7:::1;43034:42;43026:56;;43119:3;43114:2;43090:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;43026:101;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43012:115;;;43142:2;43134:11;;;::::0;::::1;;43430:8;43452:42;43444:56;;43537:3;43532:2;43508:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;43444:101;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43429:116;;;43560:3;43552:12;;;::::0;::::1;;43754:7;43775;:5;:7::i;:::-;43767:21;;43796;43767:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43753:69;;;43837:2;43829:11;;;::::0;::::1;;42856:1076;;;42819:1113::o:0;29271:185::-;29409:39;29426:4;29432:2;29436:7;29409:39;;;;;;;;;;;;:16;:39::i;:::-;29271:185;;;:::o;40942:635::-;41017:16;41045:23;41071:17;41081:6;41071:9;:17::i;:::-;41045:43;;41095:30;41142:15;41128:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41095:63;;41165:22;41190:1;41165:26;;41198:23;41234:309;41259:15;41241;:33;:64;;;;;41296:9;;41278:14;:27;;41241:64;41234:309;;;41316:25;41344:23;41352:14;41344:7;:23::i;:::-;41316:51;;41403:6;41382:27;;:17;:27;;;41378:131;;;41455:14;41422:13;41436:15;41422:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;41482:17;;;;;:::i;:::-;;;;41378:131;41519:16;;;;;:::i;:::-;;;;41307:236;41234:309;;;41558:13;41551:20;;;;;;40942:635;;;:::o;42170:74::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42233:5:::1;42226:4;:12;;;;42170:74:::0;:::o;42386:132::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42494:18:::1;42474:17;:38;;;;;;;;;;;;:::i;:::-;;42386:132:::0;:::o;39288:28::-;;;;;;;;;;;;;:::o;39012:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39205:43::-;;;;:::o;39258:25::-;;;;;;;;;;;;;:::o;38979:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26246:239::-;26318:7;26338:13;26354:7;:16;26362:7;26354:16;;;;;;;;;;;;;;;;;;;;;26338:32;;26406:1;26389:19;;:5;:19;;;;26381:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26472:5;26465:12;;;26246:239;;;:::o;25976:208::-;26048:7;26093:1;26076:19;;:5;:19;;;;26068:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26160:9;:16;26170:5;26160:16;;;;;;;;;;;;;;;;26153:23;;25976:208;;;:::o;6228:103::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6293:30:::1;6320:1;6293:18;:30::i;:::-;6228:103::o:0;42524:100::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42608:10:::1;42596:9;:22;;;;;;;;;;;;:::i;:::-;;42524:100:::0;:::o;5577:87::-;5623:7;5650:6;;;;;;;;;;;5643:13;;5577:87;:::o;39162:38::-;;;;:::o;26721:104::-;26777:13;26810:7;26803:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26721:104;:::o;40045:436::-;40110:11;39616:1;39602:11;:15;:52;;;;;39636:18;;39621:11;:33;;39602:52;39594:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39746:9;;39731:11;39712:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;39704:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;39831:1;39799:22;:29;;;;:33;39795:136;;;39853:34;39876:10;39853:22;:34::i;:::-;39845:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;39795:136;40139:6:::1;;;;;;;;;;;40138:7;40130:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;40225:11;40218:4;;:18;;;;:::i;:::-;40205:9;:31;;40197:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;40340:23;;40325:11;40301:21;40311:10;40301:9;:21::i;:::-;:35;;;;:::i;:::-;:62;;40293:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;40441:34;40451:10;40463:11;40441:9;:34::i;:::-;40045:436:::0;;:::o;28404:155::-;28499:52;28518:12;:10;:12::i;:::-;28532:8;28542;28499:18;:52::i;:::-;28404:155;;:::o;39050:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42250:130::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42355:19:::1;42334:18;:40;;;;42250:130:::0;:::o;29527:328::-;29702:41;29721:12;:10;:12::i;:::-;29735:7;29702:18;:41::i;:::-;29694:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29808:39;29822:4;29828:2;29832:7;29841:5;29808:13;:39::i;:::-;29527:328;;;;:::o;41583:494::-;41682:13;41723:17;41731:8;41723:7;:17::i;:::-;41707:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;41830:5;41818:17;;:8;;;;;;;;;;;:17;;;41814:64;;;41853:17;41846:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41814:64;41886:28;41917:10;:8;:10::i;:::-;41886:41;;41972:1;41947:14;41941:28;:32;:130;;;;;;;;;;;;;;;;;42009:14;42025:19;:8;:17;:19::i;:::-;42046:9;41992:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41941:130;41934:137;;;41583:494;;;;:::o;39126:31::-;;;;:::o;42083:81::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42152:6:::1;42141:8;;:17;;;;;;;;;;;;;;;;;;42083:81:::0;:::o;28630:164::-;28727:4;28751:18;:25;28770:5;28751:25;;;;;;;;;;;;;;;:35;28777:8;28751:35;;;;;;;;;;;;;;;;;;;;;;;;;28744:42;;28630:164;;;;:::o;40489:155::-;40575:11;39616:1;39602:11;:15;:52;;;;;39636:18;;39621:11;:33;;39602:52;39594:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39746:9;;39731:11;39712:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;39704:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;39831:1;39799:22;:29;;;;:33;39795:136;;;39853:34;39876:10;39853:22;:34::i;:::-;39845:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;39795:136;5808:12:::1;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40605:33:::2;40615:9;40626:11;40605:9;:33::i;:::-;40489:155:::0;;;:::o;6486:201::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6595:1:::1;6575:22;;:8;:22;;;;6567:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6651:28;6670:8;6651:18;:28::i;:::-;6486:201:::0;:::o;18361:157::-;18446:4;18485:25;18470:40;;;:11;:40;;;;18463:47;;18361:157;;;:::o;31365:127::-;31430:4;31482:1;31454:30;;:7;:16;31462:7;31454:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31447:37;;31365:127;;;:::o;4301:98::-;4354:7;4381:10;4374:17;;4301:98;:::o;35511:174::-;35613:2;35586:15;:24;35602:7;35586:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35669:7;35665:2;35631:46;;35640:23;35655:7;35640:14;:23::i;:::-;35631:46;;;;;;;;;;;;35511:174;;:::o;905:114::-;970:7;997;:14;;;990:21;;905:114;;;:::o;31659:348::-;31752:4;31777:16;31785:7;31777;:16::i;:::-;31769:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31853:13;31869:23;31884:7;31869:14;:23::i;:::-;31853:39;;31922:5;31911:16;;:7;:16;;;:51;;;;31955:7;31931:31;;:20;31943:7;31931:11;:20::i;:::-;:31;;;31911:51;:87;;;;31966:32;31983:5;31990:7;31966:16;:32::i;:::-;31911:87;31903:96;;;31659:348;;;;:::o;34768:625::-;34927:4;34900:31;;:23;34915:7;34900:14;:23::i;:::-;:31;;;34892:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35006:1;34992:16;;:2;:16;;;;34984:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35062:39;35083:4;35089:2;35093:7;35062:20;:39::i;:::-;35166:29;35183:1;35187:7;35166:8;:29::i;:::-;35227:1;35208:9;:15;35218:4;35208:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35256:1;35239:9;:13;35249:2;35239:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35287:2;35268:7;:16;35276:7;35268:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35326:7;35322:2;35307:27;;35316:4;35307:27;;;;;;;;;;;;35347:38;35367:4;35373:2;35377:7;35347:19;:38::i;:::-;34768:625;;;:::o;6847:191::-;6921:16;6940:6;;;;;;;;;;;6921:25;;6966:8;6957:6;;:17;;;;;;;;;;;;;;;;;;7021:8;6990:40;;7011:8;6990:40;;;;;;;;;;;;6910:128;6847:191;:::o;40648:286::-;40717:4;40732:6;40741:1;40732:10;;40751:157;40762:22;:29;;;;40758:1;:33;40751:157;;;40838:5;40809:34;;:22;40832:1;40809:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:34;;;40806:81;;;40869:4;40862:11;;;;;40806:81;40895:3;;;;;:::i;:::-;;;;40751:157;;;40923:5;40916:12;;;40648:286;;;;:::o;43938:204::-;44018:9;44013:124;44037:11;44033:1;:15;44013:124;;;44064:18;:6;:16;:18::i;:::-;44091:38;44101:9;44112:16;:6;:14;:16::i;:::-;44091:9;:38::i;:::-;44050:3;;;;;:::i;:::-;;;;44013:124;;;;43938:204;;:::o;35827:315::-;35982:8;35973:17;;:5;:17;;;;35965:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36069:8;36031:18;:25;36050:5;36031:25;;;;;;;;;;;;;;;:35;36057:8;36031:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36115:8;36093:41;;36108:5;36093:41;;;36125:8;36093:41;;;;;;:::i;:::-;;;;;;;;35827:315;;;:::o;30737:::-;30894:28;30904:4;30910:2;30914:7;30894:9;:28::i;:::-;30941:48;30964:4;30970:2;30974:7;30983:5;30941:22;:48::i;:::-;30933:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30737:315;;;;:::o;44148:104::-;44208:13;44237:9;44230:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44148:104;:::o;1863:723::-;1919:13;2149:1;2140:5;:10;2136:53;;;2167:10;;;;;;;;;;;;;;;;;;;;;2136:53;2199:12;2214:5;2199:20;;2230:14;2255:78;2270:1;2262:4;:9;2255:78;;2288:8;;;;;:::i;:::-;;;;2319:2;2311:10;;;;;:::i;:::-;;;2255:78;;;2343:19;2375:6;2365:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2343:39;;2393:154;2409:1;2400:5;:10;2393:154;;2437:1;2427:11;;;;;:::i;:::-;;;2504:2;2496:5;:10;;;;:::i;:::-;2483:2;:24;;;;:::i;:::-;2470:39;;2453:6;2460;2453:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2533:2;2524:11;;;;;:::i;:::-;;;2393:154;;;2571:6;2557:21;;;;;1863:723;;;;:::o;38078:126::-;;;;:::o;38589:125::-;;;;:::o;1027:127::-;1134:1;1116:7;:14;;;:19;;;;;;;;;;;1027:127;:::o;32349:110::-;32425:26;32435:2;32439:7;32425:26;;;;;;;;;;;;:9;:26::i;:::-;32349:110;;:::o;36707:799::-;36862:4;36883:15;:2;:13;;;:15::i;:::-;36879:620;;;36935:2;36919:36;;;36956:12;:10;:12::i;:::-;36970:4;36976:7;36985:5;36919:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36915:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37178:1;37161:6;:13;:18;37157:272;;;37204:60;;;;;;;;;;:::i;:::-;;;;;;;;37157:272;37379:6;37373:13;37364:6;37360:2;37356:15;37349:38;36915:529;37052:41;;;37042:51;;;:6;:51;;;;37035:58;;;;;36879:620;37483:4;37476:11;;36707:799;;;;;;;:::o;32686:321::-;32816:18;32822:2;32826:7;32816:5;:18::i;:::-;32867:54;32898:1;32902:2;32906:7;32915:5;32867:22;:54::i;:::-;32845:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32686:321;;;:::o;8278:326::-;8338:4;8595:1;8573:7;:19;;;:23;8566:30;;8278:326;;;:::o;33343:439::-;33437:1;33423:16;;:2;:16;;;;33415:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33496:16;33504:7;33496;:16::i;:::-;33495:17;33487:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33558:45;33587:1;33591:2;33595:7;33558:20;:45::i;:::-;33633:1;33616:9;:13;33626:2;33616:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33664:2;33645:7;:16;33653:7;33645:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33709:7;33705:2;33684:33;;33701:1;33684:33;;;;;;;;;;;;33730:44;33758:1;33762:2;33766:7;33730:19;:44::i;:::-;33343:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:474::-;7555:6;7563;7612:2;7600:9;7591:7;7587:23;7583:32;7580:119;;;7618:79;;:::i;:::-;7580:119;7738:1;7763:53;7808:7;7799:6;7788:9;7784:22;7763:53;:::i;:::-;7753:63;;7709:117;7865:2;7891:53;7936:7;7927:6;7916:9;7912:22;7891:53;:::i;:::-;7881:63;;7836:118;7487:474;;;;;:::o;7967:179::-;8036:10;8057:46;8099:3;8091:6;8057:46;:::i;:::-;8135:4;8130:3;8126:14;8112:28;;7967:179;;;;:::o;8152:118::-;8239:24;8257:5;8239:24;:::i;:::-;8234:3;8227:37;8152:118;;:::o;8306:732::-;8425:3;8454:54;8502:5;8454:54;:::i;:::-;8524:86;8603:6;8598:3;8524:86;:::i;:::-;8517:93;;8634:56;8684:5;8634:56;:::i;:::-;8713:7;8744:1;8729:284;8754:6;8751:1;8748:13;8729:284;;;8830:6;8824:13;8857:63;8916:3;8901:13;8857:63;:::i;:::-;8850:70;;8943:60;8996:6;8943:60;:::i;:::-;8933:70;;8789:224;8776:1;8773;8769:9;8764:14;;8729:284;;;8733:14;9029:3;9022:10;;8430:608;;;8306:732;;;;:::o;9044:109::-;9125:21;9140:5;9125:21;:::i;:::-;9120:3;9113:34;9044:109;;:::o;9159:360::-;9245:3;9273:38;9305:5;9273:38;:::i;:::-;9327:70;9390:6;9385:3;9327:70;:::i;:::-;9320:77;;9406:52;9451:6;9446:3;9439:4;9432:5;9428:16;9406:52;:::i;:::-;9483:29;9505:6;9483:29;:::i;:::-;9478:3;9474:39;9467:46;;9249:270;9159:360;;;;:::o;9525:364::-;9613:3;9641:39;9674:5;9641:39;:::i;:::-;9696:71;9760:6;9755:3;9696:71;:::i;:::-;9689:78;;9776:52;9821:6;9816:3;9809:4;9802:5;9798:16;9776:52;:::i;:::-;9853:29;9875:6;9853:29;:::i;:::-;9848:3;9844:39;9837:46;;9617:272;9525:364;;;;:::o;9895:377::-;10001:3;10029:39;10062:5;10029:39;:::i;:::-;10084:89;10166:6;10161:3;10084:89;:::i;:::-;10077:96;;10182:52;10227:6;10222:3;10215:4;10208:5;10204:16;10182:52;:::i;:::-;10259:6;10254:3;10250:16;10243:23;;10005:267;9895:377;;;;:::o;10302:845::-;10405:3;10442:5;10436:12;10471:36;10497:9;10471:36;:::i;:::-;10523:89;10605:6;10600:3;10523:89;:::i;:::-;10516:96;;10643:1;10632:9;10628:17;10659:1;10654:137;;;;10805:1;10800:341;;;;10621:520;;10654:137;10738:4;10734:9;10723;10719:25;10714:3;10707:38;10774:6;10769:3;10765:16;10758:23;;10654:137;;10800:341;10867:38;10899:5;10867:38;:::i;:::-;10927:1;10941:154;10955:6;10952:1;10949:13;10941:154;;;11029:7;11023:14;11019:1;11014:3;11010:11;11003:35;11079:1;11070:7;11066:15;11055:26;;10977:4;10974:1;10970:12;10965:17;;10941:154;;;11124:6;11119:3;11115:16;11108:23;;10807:334;;10621:520;;10409:738;;10302:845;;;;:::o;11153:366::-;11295:3;11316:67;11380:2;11375:3;11316:67;:::i;:::-;11309:74;;11392:93;11481:3;11392:93;:::i;:::-;11510:2;11505:3;11501:12;11494:19;;11153:366;;;:::o;11525:::-;11667:3;11688:67;11752:2;11747:3;11688:67;:::i;:::-;11681:74;;11764:93;11853:3;11764:93;:::i;:::-;11882:2;11877:3;11873:12;11866:19;;11525:366;;;:::o;11897:::-;12039:3;12060:67;12124:2;12119:3;12060:67;:::i;:::-;12053:74;;12136:93;12225:3;12136:93;:::i;:::-;12254:2;12249:3;12245:12;12238:19;;11897:366;;;:::o;12269:::-;12411:3;12432:67;12496:2;12491:3;12432:67;:::i;:::-;12425:74;;12508:93;12597:3;12508:93;:::i;:::-;12626:2;12621:3;12617:12;12610:19;;12269:366;;;:::o;12641:::-;12783:3;12804:67;12868:2;12863:3;12804:67;:::i;:::-;12797:74;;12880:93;12969:3;12880:93;:::i;:::-;12998:2;12993:3;12989:12;12982:19;;12641:366;;;:::o;13013:::-;13155:3;13176:67;13240:2;13235:3;13176:67;:::i;:::-;13169:74;;13252:93;13341:3;13252:93;:::i;:::-;13370:2;13365:3;13361:12;13354:19;;13013:366;;;:::o;13385:::-;13527:3;13548:67;13612:2;13607:3;13548:67;:::i;:::-;13541:74;;13624:93;13713:3;13624:93;:::i;:::-;13742:2;13737:3;13733:12;13726:19;;13385:366;;;:::o;13757:::-;13899:3;13920:67;13984:2;13979:3;13920:67;:::i;:::-;13913:74;;13996:93;14085:3;13996:93;:::i;:::-;14114:2;14109:3;14105:12;14098:19;;13757:366;;;:::o;14129:::-;14271:3;14292:67;14356:2;14351:3;14292:67;:::i;:::-;14285:74;;14368:93;14457:3;14368:93;:::i;:::-;14486:2;14481:3;14477:12;14470:19;;14129:366;;;:::o;14501:::-;14643:3;14664:67;14728:2;14723:3;14664:67;:::i;:::-;14657:74;;14740:93;14829:3;14740:93;:::i;:::-;14858:2;14853:3;14849:12;14842:19;;14501:366;;;:::o;14873:::-;15015:3;15036:67;15100:2;15095:3;15036:67;:::i;:::-;15029:74;;15112:93;15201:3;15112:93;:::i;:::-;15230:2;15225:3;15221:12;15214:19;;14873:366;;;:::o;15245:::-;15387:3;15408:67;15472:2;15467:3;15408:67;:::i;:::-;15401:74;;15484:93;15573:3;15484:93;:::i;:::-;15602:2;15597:3;15593:12;15586:19;;15245:366;;;:::o;15617:::-;15759:3;15780:67;15844:2;15839:3;15780:67;:::i;:::-;15773:74;;15856:93;15945:3;15856:93;:::i;:::-;15974:2;15969:3;15965:12;15958:19;;15617:366;;;:::o;15989:::-;16131:3;16152:67;16216:2;16211:3;16152:67;:::i;:::-;16145:74;;16228:93;16317:3;16228:93;:::i;:::-;16346:2;16341:3;16337:12;16330:19;;15989:366;;;:::o;16361:::-;16503:3;16524:67;16588:2;16583:3;16524:67;:::i;:::-;16517:74;;16600:93;16689:3;16600:93;:::i;:::-;16718:2;16713:3;16709:12;16702:19;;16361:366;;;:::o;16733:::-;16875:3;16896:67;16960:2;16955:3;16896:67;:::i;:::-;16889:74;;16972:93;17061:3;16972:93;:::i;:::-;17090:2;17085:3;17081:12;17074:19;;16733:366;;;:::o;17105:::-;17247:3;17268:67;17332:2;17327:3;17268:67;:::i;:::-;17261:74;;17344:93;17433:3;17344:93;:::i;:::-;17462:2;17457:3;17453:12;17446:19;;17105:366;;;:::o;17477:398::-;17636:3;17657:83;17738:1;17733:3;17657:83;:::i;:::-;17650:90;;17749:93;17838:3;17749:93;:::i;:::-;17867:1;17862:3;17858:11;17851:18;;17477:398;;;:::o;17881:366::-;18023:3;18044:67;18108:2;18103:3;18044:67;:::i;:::-;18037:74;;18120:93;18209:3;18120:93;:::i;:::-;18238:2;18233:3;18229:12;18222:19;;17881:366;;;:::o;18253:::-;18395:3;18416:67;18480:2;18475:3;18416:67;:::i;:::-;18409:74;;18492:93;18581:3;18492:93;:::i;:::-;18610:2;18605:3;18601:12;18594:19;;18253:366;;;:::o;18625:::-;18767:3;18788:67;18852:2;18847:3;18788:67;:::i;:::-;18781:74;;18864:93;18953:3;18864:93;:::i;:::-;18982:2;18977:3;18973:12;18966:19;;18625:366;;;:::o;18997:::-;19139:3;19160:67;19224:2;19219:3;19160:67;:::i;:::-;19153:74;;19236:93;19325:3;19236:93;:::i;:::-;19354:2;19349:3;19345:12;19338:19;;18997:366;;;:::o;19369:::-;19511:3;19532:67;19596:2;19591:3;19532:67;:::i;:::-;19525:74;;19608:93;19697:3;19608:93;:::i;:::-;19726:2;19721:3;19717:12;19710:19;;19369:366;;;:::o;19741:108::-;19818:24;19836:5;19818:24;:::i;:::-;19813:3;19806:37;19741:108;;:::o;19855:118::-;19942:24;19960:5;19942:24;:::i;:::-;19937:3;19930:37;19855:118;;:::o;19979:589::-;20204:3;20226:95;20317:3;20308:6;20226:95;:::i;:::-;20219:102;;20338:95;20429:3;20420:6;20338:95;:::i;:::-;20331:102;;20450:92;20538:3;20529:6;20450:92;:::i;:::-;20443:99;;20559:3;20552:10;;19979:589;;;;;;:::o;20574:379::-;20758:3;20780:147;20923:3;20780:147;:::i;:::-;20773:154;;20944:3;20937:10;;20574:379;;;:::o;20959:222::-;21052:4;21090:2;21079:9;21075:18;21067:26;;21103:71;21171:1;21160:9;21156:17;21147:6;21103:71;:::i;:::-;20959:222;;;;:::o;21187:640::-;21382:4;21420:3;21409:9;21405:19;21397:27;;21434:71;21502:1;21491:9;21487:17;21478:6;21434:71;:::i;:::-;21515:72;21583:2;21572:9;21568:18;21559:6;21515:72;:::i;:::-;21597;21665:2;21654:9;21650:18;21641:6;21597:72;:::i;:::-;21716:9;21710:4;21706:20;21701:2;21690:9;21686:18;21679:48;21744:76;21815:4;21806:6;21744:76;:::i;:::-;21736:84;;21187:640;;;;;;;:::o;21833:373::-;21976:4;22014:2;22003:9;21999:18;21991:26;;22063:9;22057:4;22053:20;22049:1;22038:9;22034:17;22027:47;22091:108;22194:4;22185:6;22091:108;:::i;:::-;22083:116;;21833:373;;;;:::o;22212:210::-;22299:4;22337:2;22326:9;22322:18;22314:26;;22350:65;22412:1;22401:9;22397:17;22388:6;22350:65;:::i;:::-;22212:210;;;;:::o;22428:313::-;22541:4;22579:2;22568:9;22564:18;22556:26;;22628:9;22622:4;22618:20;22614:1;22603:9;22599:17;22592:47;22656:78;22729:4;22720:6;22656:78;:::i;:::-;22648:86;;22428:313;;;;:::o;22747:419::-;22913:4;22951:2;22940:9;22936:18;22928:26;;23000:9;22994:4;22990:20;22986:1;22975:9;22971:17;22964:47;23028:131;23154:4;23028:131;:::i;:::-;23020:139;;22747:419;;;:::o;23172:::-;23338:4;23376:2;23365:9;23361:18;23353:26;;23425:9;23419:4;23415:20;23411:1;23400:9;23396:17;23389:47;23453:131;23579:4;23453:131;:::i;:::-;23445:139;;23172:419;;;:::o;23597:::-;23763:4;23801:2;23790:9;23786:18;23778:26;;23850:9;23844:4;23840:20;23836:1;23825:9;23821:17;23814:47;23878:131;24004:4;23878:131;:::i;:::-;23870:139;;23597:419;;;:::o;24022:::-;24188:4;24226:2;24215:9;24211:18;24203:26;;24275:9;24269:4;24265:20;24261:1;24250:9;24246:17;24239:47;24303:131;24429:4;24303:131;:::i;:::-;24295:139;;24022:419;;;:::o;24447:::-;24613:4;24651:2;24640:9;24636:18;24628:26;;24700:9;24694:4;24690:20;24686:1;24675:9;24671:17;24664:47;24728:131;24854:4;24728:131;:::i;:::-;24720:139;;24447:419;;;:::o;24872:::-;25038:4;25076:2;25065:9;25061:18;25053:26;;25125:9;25119:4;25115:20;25111:1;25100:9;25096:17;25089:47;25153:131;25279:4;25153:131;:::i;:::-;25145:139;;24872:419;;;:::o;25297:::-;25463:4;25501:2;25490:9;25486:18;25478:26;;25550:9;25544:4;25540:20;25536:1;25525:9;25521:17;25514:47;25578:131;25704:4;25578:131;:::i;:::-;25570:139;;25297:419;;;:::o;25722:::-;25888:4;25926:2;25915:9;25911:18;25903:26;;25975:9;25969:4;25965:20;25961:1;25950:9;25946:17;25939:47;26003:131;26129:4;26003:131;:::i;:::-;25995:139;;25722:419;;;:::o;26147:::-;26313:4;26351:2;26340:9;26336:18;26328:26;;26400:9;26394:4;26390:20;26386:1;26375:9;26371:17;26364:47;26428:131;26554:4;26428:131;:::i;:::-;26420:139;;26147:419;;;:::o;26572:::-;26738:4;26776:2;26765:9;26761:18;26753:26;;26825:9;26819:4;26815:20;26811:1;26800:9;26796:17;26789:47;26853:131;26979:4;26853:131;:::i;:::-;26845:139;;26572:419;;;:::o;26997:::-;27163:4;27201:2;27190:9;27186:18;27178:26;;27250:9;27244:4;27240:20;27236:1;27225:9;27221:17;27214:47;27278:131;27404:4;27278:131;:::i;:::-;27270:139;;26997:419;;;:::o;27422:::-;27588:4;27626:2;27615:9;27611:18;27603:26;;27675:9;27669:4;27665:20;27661:1;27650:9;27646:17;27639:47;27703:131;27829:4;27703:131;:::i;:::-;27695:139;;27422:419;;;:::o;27847:::-;28013:4;28051:2;28040:9;28036:18;28028:26;;28100:9;28094:4;28090:20;28086:1;28075:9;28071:17;28064:47;28128:131;28254:4;28128:131;:::i;:::-;28120:139;;27847:419;;;:::o;28272:::-;28438:4;28476:2;28465:9;28461:18;28453:26;;28525:9;28519:4;28515:20;28511:1;28500:9;28496:17;28489:47;28553:131;28679:4;28553:131;:::i;:::-;28545:139;;28272:419;;;:::o;28697:::-;28863:4;28901:2;28890:9;28886:18;28878:26;;28950:9;28944:4;28940:20;28936:1;28925:9;28921:17;28914:47;28978:131;29104:4;28978:131;:::i;:::-;28970:139;;28697:419;;;:::o;29122:::-;29288:4;29326:2;29315:9;29311:18;29303:26;;29375:9;29369:4;29365:20;29361:1;29350:9;29346:17;29339:47;29403:131;29529:4;29403:131;:::i;:::-;29395:139;;29122:419;;;:::o;29547:::-;29713:4;29751:2;29740:9;29736:18;29728:26;;29800:9;29794:4;29790:20;29786:1;29775:9;29771:17;29764:47;29828:131;29954:4;29828:131;:::i;:::-;29820:139;;29547:419;;;:::o;29972:::-;30138:4;30176:2;30165:9;30161:18;30153:26;;30225:9;30219:4;30215:20;30211:1;30200:9;30196:17;30189:47;30253:131;30379:4;30253:131;:::i;:::-;30245:139;;29972:419;;;:::o;30397:::-;30563:4;30601:2;30590:9;30586:18;30578:26;;30650:9;30644:4;30640:20;30636:1;30625:9;30621:17;30614:47;30678:131;30804:4;30678:131;:::i;:::-;30670:139;;30397:419;;;:::o;30822:::-;30988:4;31026:2;31015:9;31011:18;31003:26;;31075:9;31069:4;31065:20;31061:1;31050:9;31046:17;31039:47;31103:131;31229:4;31103:131;:::i;:::-;31095:139;;30822:419;;;:::o;31247:::-;31413:4;31451:2;31440:9;31436:18;31428:26;;31500:9;31494:4;31490:20;31486:1;31475:9;31471:17;31464:47;31528:131;31654:4;31528:131;:::i;:::-;31520:139;;31247:419;;;:::o;31672:::-;31838:4;31876:2;31865:9;31861:18;31853:26;;31925:9;31919:4;31915:20;31911:1;31900:9;31896:17;31889:47;31953:131;32079:4;31953:131;:::i;:::-;31945:139;;31672:419;;;:::o;32097:222::-;32190:4;32228:2;32217:9;32213:18;32205:26;;32241:71;32309:1;32298:9;32294:17;32285:6;32241:71;:::i;:::-;32097:222;;;;:::o;32325:129::-;32359:6;32386:20;;:::i;:::-;32376:30;;32415:33;32443:4;32435:6;32415:33;:::i;:::-;32325:129;;;:::o;32460:75::-;32493:6;32526:2;32520:9;32510:19;;32460:75;:::o;32541:307::-;32602:4;32692:18;32684:6;32681:30;32678:56;;;32714:18;;:::i;:::-;32678:56;32752:29;32774:6;32752:29;:::i;:::-;32744:37;;32836:4;32830;32826:15;32818:23;;32541:307;;;:::o;32854:308::-;32916:4;33006:18;32998:6;32995:30;32992:56;;;33028:18;;:::i;:::-;32992:56;33066:29;33088:6;33066:29;:::i;:::-;33058:37;;33150:4;33144;33140:15;33132:23;;32854:308;;;:::o;33168:132::-;33235:4;33258:3;33250:11;;33288:4;33283:3;33279:14;33271:22;;33168:132;;;:::o;33306:141::-;33355:4;33378:3;33370:11;;33401:3;33398:1;33391:14;33435:4;33432:1;33422:18;33414:26;;33306:141;;;:::o;33453:114::-;33520:6;33554:5;33548:12;33538:22;;33453:114;;;:::o;33573:98::-;33624:6;33658:5;33652:12;33642:22;;33573:98;;;:::o;33677:99::-;33729:6;33763:5;33757:12;33747:22;;33677:99;;;:::o;33782:113::-;33852:4;33884;33879:3;33875:14;33867:22;;33782:113;;;:::o;33901:184::-;34000:11;34034:6;34029:3;34022:19;34074:4;34069:3;34065:14;34050:29;;33901:184;;;;:::o;34091:168::-;34174:11;34208:6;34203:3;34196:19;34248:4;34243:3;34239:14;34224:29;;34091:168;;;;:::o;34265:147::-;34366:11;34403:3;34388:18;;34265:147;;;;:::o;34418:169::-;34502:11;34536:6;34531:3;34524:19;34576:4;34571:3;34567:14;34552:29;;34418:169;;;;:::o;34593:148::-;34695:11;34732:3;34717:18;;34593:148;;;;:::o;34747:305::-;34787:3;34806:20;34824:1;34806:20;:::i;:::-;34801:25;;34840:20;34858:1;34840:20;:::i;:::-;34835:25;;34994:1;34926:66;34922:74;34919:1;34916:81;34913:107;;;35000:18;;:::i;:::-;34913:107;35044:1;35041;35037:9;35030:16;;34747:305;;;;:::o;35058:185::-;35098:1;35115:20;35133:1;35115:20;:::i;:::-;35110:25;;35149:20;35167:1;35149:20;:::i;:::-;35144:25;;35188:1;35178:35;;35193:18;;:::i;:::-;35178:35;35235:1;35232;35228:9;35223:14;;35058:185;;;;:::o;35249:348::-;35289:7;35312:20;35330:1;35312:20;:::i;:::-;35307:25;;35346:20;35364:1;35346:20;:::i;:::-;35341:25;;35534:1;35466:66;35462:74;35459:1;35456:81;35451:1;35444:9;35437:17;35433:105;35430:131;;;35541:18;;:::i;:::-;35430:131;35589:1;35586;35582:9;35571:20;;35249:348;;;;:::o;35603:191::-;35643:4;35663:20;35681:1;35663:20;:::i;:::-;35658:25;;35697:20;35715:1;35697:20;:::i;:::-;35692:25;;35736:1;35733;35730:8;35727:34;;;35741:18;;:::i;:::-;35727:34;35786:1;35783;35779:9;35771:17;;35603:191;;;;:::o;35800:96::-;35837:7;35866:24;35884:5;35866:24;:::i;:::-;35855:35;;35800:96;;;:::o;35902:90::-;35936:7;35979:5;35972:13;35965:21;35954:32;;35902:90;;;:::o;35998:149::-;36034:7;36074:66;36067:5;36063:78;36052:89;;35998:149;;;:::o;36153:126::-;36190:7;36230:42;36223:5;36219:54;36208:65;;36153:126;;;:::o;36285:77::-;36322:7;36351:5;36340:16;;36285:77;;;:::o;36368:154::-;36452:6;36447:3;36442;36429:30;36514:1;36505:6;36500:3;36496:16;36489:27;36368:154;;;:::o;36528:307::-;36596:1;36606:113;36620:6;36617:1;36614:13;36606:113;;;36705:1;36700:3;36696:11;36690:18;36686:1;36681:3;36677:11;36670:39;36642:2;36639:1;36635:10;36630:15;;36606:113;;;36737:6;36734:1;36731:13;36728:101;;;36817:1;36808:6;36803:3;36799:16;36792:27;36728:101;36577:258;36528:307;;;:::o;36841:320::-;36885:6;36922:1;36916:4;36912:12;36902:22;;36969:1;36963:4;36959:12;36990:18;36980:81;;37046:4;37038:6;37034:17;37024:27;;36980:81;37108:2;37100:6;37097:14;37077:18;37074:38;37071:84;;;37127:18;;:::i;:::-;37071:84;36892:269;36841:320;;;:::o;37167:281::-;37250:27;37272:4;37250:27;:::i;:::-;37242:6;37238:40;37380:6;37368:10;37365:22;37344:18;37332:10;37329:34;37326:62;37323:88;;;37391:18;;:::i;:::-;37323:88;37431:10;37427:2;37420:22;37210:238;37167:281;;:::o;37454:233::-;37493:3;37516:24;37534:5;37516:24;:::i;:::-;37507:33;;37562:66;37555:5;37552:77;37549:103;;;37632:18;;:::i;:::-;37549:103;37679:1;37672:5;37668:13;37661:20;;37454:233;;;:::o;37693:176::-;37725:1;37742:20;37760:1;37742:20;:::i;:::-;37737:25;;37776:20;37794:1;37776:20;:::i;:::-;37771:25;;37815:1;37805:35;;37820:18;;:::i;:::-;37805:35;37861:1;37858;37854:9;37849:14;;37693:176;;;;:::o;37875:180::-;37923:77;37920:1;37913:88;38020:4;38017:1;38010:15;38044:4;38041:1;38034:15;38061:180;38109:77;38106:1;38099:88;38206:4;38203:1;38196:15;38230:4;38227:1;38220:15;38247:180;38295:77;38292:1;38285:88;38392:4;38389:1;38382:15;38416:4;38413:1;38406:15;38433:180;38481:77;38478:1;38471:88;38578:4;38575:1;38568:15;38602:4;38599:1;38592:15;38619:180;38667:77;38664:1;38657:88;38764:4;38761:1;38754:15;38788:4;38785:1;38778:15;38805:117;38914:1;38911;38904:12;38928:117;39037:1;39034;39027:12;39051:117;39160:1;39157;39150:12;39174:117;39283:1;39280;39273:12;39297:102;39338:6;39389:2;39385:7;39380:2;39373:5;39369:14;39365:28;39355:38;;39297:102;;;:::o;39405:237::-;39545:34;39541:1;39533:6;39529:14;39522:58;39614:20;39609:2;39601:6;39597:15;39590:45;39405:237;:::o;39648:181::-;39788:33;39784:1;39776:6;39772:14;39765:57;39648:181;:::o;39835:225::-;39975:34;39971:1;39963:6;39959:14;39952:58;40044:8;40039:2;40031:6;40027:15;40020:33;39835:225;:::o;40066:224::-;40206:34;40202:1;40194:6;40190:14;40183:58;40275:7;40270:2;40262:6;40258:15;40251:32;40066:224;:::o;40296:178::-;40436:30;40432:1;40424:6;40420:14;40413:54;40296:178;:::o;40480:223::-;40620:34;40616:1;40608:6;40604:14;40597:58;40689:6;40684:2;40676:6;40672:15;40665:31;40480:223;:::o;40709:175::-;40849:27;40845:1;40837:6;40833:14;40826:51;40709:175;:::o;40890:231::-;41030:34;41026:1;41018:6;41014:14;41007:58;41099:14;41094:2;41086:6;41082:15;41075:39;40890:231;:::o;41127:243::-;41267:34;41263:1;41255:6;41251:14;41244:58;41336:26;41331:2;41323:6;41319:15;41312:51;41127:243;:::o;41376:229::-;41516:34;41512:1;41504:6;41500:14;41493:58;41585:12;41580:2;41572:6;41568:15;41561:37;41376:229;:::o;41611:228::-;41751:34;41747:1;41739:6;41735:14;41728:58;41820:11;41815:2;41807:6;41803:15;41796:36;41611:228;:::o;41845:182::-;41985:34;41981:1;41973:6;41969:14;41962:58;41845:182;:::o;42033:231::-;42173:34;42169:1;42161:6;42157:14;42150:58;42242:14;42237:2;42229:6;42225:15;42218:39;42033:231;:::o;42270:182::-;42410:34;42406:1;42398:6;42394:14;42387:58;42270:182;:::o;42458:234::-;42598:34;42594:1;42586:6;42582:14;42575:58;42667:17;42662:2;42654:6;42650:15;42643:42;42458:234;:::o;42698:259::-;42838:34;42834:1;42826:6;42822:14;42815:58;42911:34;42906:2;42898:6;42894:15;42887:59;42698:259;:::o;42967:232::-;43111:34;43107:1;43099:6;43095:14;43088:58;43184:3;43179:2;43171:6;43167:15;43160:28;42967:232;:::o;43209:118::-;;:::o;43337:248::-;43481:34;43477:1;43469:6;43465:14;43458:58;43554:19;43549:2;43541:6;43537:15;43530:44;43337:248;:::o;43595:237::-;43739:34;43735:1;43727:6;43723:14;43716:58;43812:8;43807:2;43799:6;43795:15;43788:33;43595:237;:::o;43842:186::-;43986:30;43982:1;43974:6;43970:14;43963:54;43842:186;:::o;44038:244::-;44182:34;44178:1;44170:6;44166:14;44159:58;44255:15;44250:2;44242:6;44238:15;44231:40;44038:244;:::o;44292:239::-;44436:34;44432:1;44424:6;44420:14;44413:58;44509:10;44504:2;44496:6;44492:15;44485:35;44292:239;:::o;44541:130::-;44618:24;44636:5;44618:24;:::i;:::-;44611:5;44608:35;44598:63;;44657:1;44654;44647:12;44598:63;44541:130;:::o;44681:124::-;44755:21;44770:5;44755:21;:::i;:::-;44748:5;44745:32;44735:60;;44791:1;44788;44781:12;44735:60;44681:124;:::o;44815:128::-;44891:23;44908:5;44891:23;:::i;:::-;44884:5;44881:34;44871:62;;44929:1;44926;44919:12;44871:62;44815:128;:::o;44953:130::-;45030:24;45048:5;45030:24;:::i;:::-;45023:5;45020:35;45010:63;;45069:1;45066;45059:12;45010:63;44953:130;:::o

Swarm Source

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