ERC-721
Overview
Max Total Supply
1,000 MAZE
Holders
273
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 MAZELoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CryptoMaze
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-21 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } 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); } 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); } 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; } } 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; } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } 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); } 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } pragma solidity ^0.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}. 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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _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, true); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, true); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } function _burnSave(address owner, uint256 tokenId) internal virtual { _beforeTokenTransfer(owner, address(0), tokenId, false); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, true); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(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 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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly 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` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId, bool isDelete) internal virtual { } } pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId, bool isDelete) internal virtual override { super._beforeTokenTransfer(from, to, tokenId, isDelete); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0) && isDelete) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from && isDelete) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } pragma solidity ^0.8.0; contract CryptoMaze is ERC721Enumerable, Ownable{ using SafeMath for uint256; using Address for address; using Strings for uint256; uint256 public MAX_SUPPLY = 1000; bool public saleIsActive = false; uint256 public startingIndex; uint256 public startingIndexBlock; string private _baseURIExtended; mapping (uint256 => string) _tokenURIs; constructor() ERC721("0xAI CryptoMaze","MAZE"){ } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } function reserveTokens(uint256 num) public onlyOwner { uint supply = totalSupply(); uint i; for (i = 0; i < num; i++) { _safeMint(msg.sender, supply + i); } if (startingIndexBlock == 0) { startingIndexBlock = block.number; } } function setMaxTokenSupply(uint256 maxSupply) public onlyOwner { MAX_SUPPLY = maxSupply; } function mint() public { require(saleIsActive, "Sale is not active at the moment"); require((totalSupply() + 1) <= MAX_SUPPLY, "Purchase would exceed max supply"); if ((totalSupply() + 1) <= MAX_SUPPLY) { _safeMint(msg.sender, totalSupply()); } } function calcStartingIndex() public onlyOwner { require(startingIndex == 0, "Starting index has already been set"); require(startingIndexBlock != 0, "Starting index has not been set yet"); startingIndex = uint(blockhash(startingIndexBlock)) % MAX_SUPPLY; // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes) if(block.number.sub(startingIndexBlock) > 255) { startingIndex = uint(blockhash(block.number - 1)) % MAX_SUPPLY; } // To prevent original sequence if (startingIndex == 0) { startingIndex = startingIndex.add(1); } } function emergencySetStartingIndexBlock() public onlyOwner { require(startingIndex == 0, "Starting index is already set"); startingIndexBlock = block.number; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIExtended; } // Sets base URI for all tokens, only able to be called by contract owner function setBaseURI(string memory baseURI_) external onlyOwner { _baseURIExtended = baseURI_; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calcStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMaxTokenSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526103e8600b556000600c60006101000a81548160ff0219169083151502179055503480156200003257600080fd5b506040518060400160405280600f81526020017f307841492043727970746f4d617a6500000000000000000000000000000000008152506040518060400160405280600481526020017f4d415a45000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b792919062000192565b508060019080519060200190620000d092919062000192565b5050506000620000e56200018a60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002a7565b600033905090565b828054620001a09062000242565b90600052602060002090601f016020900481019282620001c4576000855562000210565b82601f10620001df57805160ff191683800117855562000210565b8280016001018555821562000210579182015b828111156200020f578251825591602001919060010190620001f2565b5b5090506200021f919062000223565b5090565b5b808211156200023e57600081600090555060010162000224565b5090565b600060028204905060018216806200025b57607f821691505b6020821081141562000272576200027162000278565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61411480620002b76000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063c87b56dd116100a2578063e36d649811610071578063e36d64981461050a578063e985e9c514610528578063eb8d244414610558578063f2fde38b14610576576101e5565b8063c87b56dd14610496578063cb774d47146104c6578063d031370b146104e4578063e13f351a14610500576101e5565b806395d89b41116100de57806395d89b4114610424578063a22cb46514610442578063b07ed9821461045e578063b88d4fde1461047a576101e5565b806370a08231146103c2578063715018a6146103f25780637d17fcbe146103fc5780638da5cb5b14610406576101e5565b80632f745c591161018757806342842e0e1161015657806342842e0e1461032a5780634f6ccce71461034657806355f804b3146103765780636352211e14610392576101e5565b80632f745c59146102c857806332cb6b0c146102f857806334918dfd146103165780633ccfd60b14610320576101e5565b8063095ea7b3116101c3578063095ea7b3146102685780631249c58b1461028457806318160ddd1461028e57806323b872dd146102ac576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff9190612d94565b610592565b60405161021191906132e4565b60405180910390f35b61022261060c565b60405161022f91906132ff565b60405180910390f35b610252600480360381019061024d9190612e37565b61069e565b60405161025f919061327d565b60405180910390f35b610282600480360381019061027d9190612d54565b610723565b005b61028c61083b565b005b610296610912565b6040516102a39190613601565b60405180910390f35b6102c660048036038101906102c19190612c3e565b61091f565b005b6102e260048036038101906102dd9190612d54565b61097f565b6040516102ef9190613601565b60405180910390f35b610300610a24565b60405161030d9190613601565b60405180910390f35b61031e610a2a565b005b610328610ad2565b005b610344600480360381019061033f9190612c3e565b610b9d565b005b610360600480360381019061035b9190612e37565b610bbd565b60405161036d9190613601565b60405180910390f35b610390600480360381019061038b9190612dee565b610c2e565b005b6103ac60048036038101906103a79190612e37565b610cc4565b6040516103b9919061327d565b60405180910390f35b6103dc60048036038101906103d79190612bd1565b610d76565b6040516103e99190613601565b60405180910390f35b6103fa610e2e565b005b610404610f6b565b005b61040e611035565b60405161041b919061327d565b60405180910390f35b61042c61105f565b60405161043991906132ff565b60405180910390f35b61045c60048036038101906104579190612d14565b6110f1565b005b61047860048036038101906104739190612e37565b611272565b005b610494600480360381019061048f9190612c91565b6112f8565b005b6104b060048036038101906104ab9190612e37565b61135a565b6040516104bd91906132ff565b60405180910390f35b6104ce6114cd565b6040516104db9190613601565b60405180910390f35b6104fe60048036038101906104f99190612e37565b6114d3565b005b6105086115a6565b005b610512611733565b60405161051f9190613601565b60405180910390f35b610542600480360381019061053d9190612bfe565b611739565b60405161054f91906132e4565b60405180910390f35b6105606117cd565b60405161056d91906132e4565b60405180910390f35b610590600480360381019061058b9190612bd1565b6117e0565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061060557506106048261198c565b5b9050919050565b60606000805461061b90613857565b80601f016020809104026020016040519081016040528092919081815260200182805461064790613857565b80156106945780601f1061066957610100808354040283529160200191610694565b820191906000526020600020905b81548152906001019060200180831161067757829003601f168201915b5050505050905090565b60006106a982611a6e565b6106e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106df906134e1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061072e82610cc4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079690613561565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107be611ada565b73ffffffffffffffffffffffffffffffffffffffff1614806107ed57506107ec816107e7611ada565b611739565b5b61082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082390613441565b60405180910390fd5b6108368383611ae2565b505050565b600c60009054906101000a900460ff1661088a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610881906135e1565b60405180910390fd5b600b546001610897610912565b6108a191906136e6565b11156108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d9906134a1565b60405180910390fd5b600b5460016108ef610912565b6108f991906136e6565b116109105761090f3361090a610912565b611b9b565b5b565b6000600880549050905090565b61093061092a611ada565b82611bb9565b61096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690613581565b60405180910390fd5b61097a838383611c97565b505050565b600061098a83610d76565b82106109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290613341565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b610a32611ada565b73ffffffffffffffffffffffffffffffffffffffff16610a50611035565b73ffffffffffffffffffffffffffffffffffffffff1614610aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9d90613501565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b610ada611ada565b73ffffffffffffffffffffffffffffffffffffffff16610af8611035565b73ffffffffffffffffffffffffffffffffffffffff1614610b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4590613501565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b99573d6000803e3d6000fd5b5050565b610bb8838383604051806020016040528060008152506112f8565b505050565b6000610bc7610912565b8210610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff906135a1565b60405180910390fd5b60088281548110610c1c57610c1b6139f0565b5b90600052602060002001549050919050565b610c36611ada565b73ffffffffffffffffffffffffffffffffffffffff16610c54611035565b73ffffffffffffffffffffffffffffffffffffffff1614610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190613501565b60405180910390fd5b80600f9080519060200190610cc09291906129e5565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6490613481565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde90613461565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e36611ada565b73ffffffffffffffffffffffffffffffffffffffff16610e54611035565b73ffffffffffffffffffffffffffffffffffffffff1614610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190613501565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610f73611ada565b73ffffffffffffffffffffffffffffffffffffffff16610f91611035565b73ffffffffffffffffffffffffffffffffffffffff1614610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde90613501565b60405180910390fd5b6000600d541461102c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102390613421565b60405180910390fd5b43600e81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461106e90613857565b80601f016020809104026020016040519081016040528092919081815260200182805461109a90613857565b80156110e75780601f106110bc576101008083540402835291602001916110e7565b820191906000526020600020905b8154815290600101906020018083116110ca57829003601f168201915b5050505050905090565b6110f9611ada565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e906133e1565b60405180910390fd5b8060056000611174611ada565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611221611ada565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161126691906132e4565b60405180910390a35050565b61127a611ada565b73ffffffffffffffffffffffffffffffffffffffff16611298611035565b73ffffffffffffffffffffffffffffffffffffffff16146112ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e590613501565b60405180910390fd5b80600b8190555050565b611309611303611ada565b83611bb9565b611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90613581565b60405180910390fd5b61135484848484611ef5565b50505050565b606061136582611a6e565b6113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90613541565b60405180910390fd5b60006010600084815260200190815260200160002080546113c490613857565b80601f01602080910402602001604051908101604052809291908181526020018280546113f090613857565b801561143d5780601f106114125761010080835404028352916020019161143d565b820191906000526020600020905b81548152906001019060200180831161142057829003601f168201915b50505050509050600061144e611f51565b90506000815114156114645781925050506114c8565b600082511115611499578082604051602001611481929190613259565b604051602081830303815290604052925050506114c8565b806114a385611fe3565b6040516020016114b4929190613259565b604051602081830303815290604052925050505b919050565b600d5481565b6114db611ada565b73ffffffffffffffffffffffffffffffffffffffff166114f9611035565b73ffffffffffffffffffffffffffffffffffffffff161461154f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154690613501565b60405180910390fd5b6000611559610912565b905060005b8281101561158e5761157b33828461157691906136e6565b611b9b565b8080611586906138ba565b91505061155e565b6000600e5414156115a15743600e819055505b505050565b6115ae611ada565b73ffffffffffffffffffffffffffffffffffffffff166115cc611035565b73ffffffffffffffffffffffffffffffffffffffff1614611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990613501565b60405180910390fd5b6000600d5414611667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165e906135c1565b60405180910390fd5b6000600e5414156116ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a490613321565b60405180910390fd5b600b54600e544060001c6116c19190613903565b600d8190555060ff6116de600e544361214490919063ffffffff16565b111561170957600b546001436116f4919061376d565b4060001c6117029190613903565b600d819055505b6000600d5414156117315761172a6001600d5461215a90919063ffffffff16565b600d819055505b565b600e5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b6117e8611ada565b73ffffffffffffffffffffffffffffffffffffffff16611806611035565b73ffffffffffffffffffffffffffffffffffffffff161461185c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185390613501565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c390613381565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a5757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a675750611a6682612170565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b5583610cc4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611bb58282604051806020016040528060008152506121da565b5050565b6000611bc482611a6e565b611c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfa90613401565b60405180910390fd5b6000611c0e83610cc4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c7d57508373ffffffffffffffffffffffffffffffffffffffff16611c658461069e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c8e5750611c8d8185611739565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cb782610cc4565b73ffffffffffffffffffffffffffffffffffffffff1614611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490613521565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d74906133c1565b60405180910390fd5b611d8a8383836001612235565b611d95600082611ae2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611de5919061376d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e3c91906136e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611f00848484611c97565b611f0c8484848461235f565b611f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4290613361565b60405180910390fd5b50505050565b6060600f8054611f6090613857565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8c90613857565b8015611fd95780601f10611fae57610100808354040283529160200191611fd9565b820191906000526020600020905b815481529060010190602001808311611fbc57829003601f168201915b5050505050905090565b6060600082141561202b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061213f565b600082905060005b6000821461205d578080612046906138ba565b915050600a82612056919061373c565b9150612033565b60008167ffffffffffffffff81111561207957612078613a1f565b5b6040519080825280601f01601f1916602001820160405280156120ab5781602001600182028036833780820191505090505b5090505b60008514612138576001826120c4919061376d565b9150600a856120d39190613903565b60306120df91906136e6565b60f81b8183815181106120f5576120f46139f0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612131919061373c565b94506120af565b8093505050505b919050565b60008183612152919061376d565b905092915050565b6000818361216891906136e6565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121e483836124f6565b6121f1600084848461235f565b612230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222790613361565b60405180910390fd5b505050565b612241848484846126c6565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122845761227f826126cc565b6122c3565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146122c2576122c18483612715565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156122fc5750805b1561230f5761230a82612882565b612359565b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156123485750805b15612358576123578383612953565b5b5b50505050565b60006123808473ffffffffffffffffffffffffffffffffffffffff166129d2565b156124e9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123a9611ada565b8786866040518563ffffffff1660e01b81526004016123cb9493929190613298565b602060405180830381600087803b1580156123e557600080fd5b505af192505050801561241657506040513d601f19601f820116820180604052508101906124139190612dc1565b60015b612499573d8060008114612446576040519150601f19603f3d011682016040523d82523d6000602084013e61244b565b606091505b50600081511415612491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248890613361565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124ee565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255d906134c1565b60405180910390fd5b61256f81611a6e565b156125af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a6906133a1565b60405180910390fd5b6125bd600083836001612235565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461260d91906136e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161272284610d76565b61272c919061376d565b9050600060076000848152602001908152602001600020549050818114612811576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612896919061376d565b90506000600960008481526020019081526020016000205490506000600883815481106128c6576128c56139f0565b5b9060005260206000200154905080600883815481106128e8576128e76139f0565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612937576129366139c1565b5b6001900381819060005260206000200160009055905550505050565b600061295e83610d76565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546129f190613857565b90600052602060002090601f016020900481019282612a135760008555612a5a565b82601f10612a2c57805160ff1916838001178555612a5a565b82800160010185558215612a5a579182015b82811115612a59578251825591602001919060010190612a3e565b5b509050612a679190612a6b565b5090565b5b80821115612a84576000816000905550600101612a6c565b5090565b6000612a9b612a9684613641565b61361c565b905082815260208101848484011115612ab757612ab6613a53565b5b612ac2848285613815565b509392505050565b6000612add612ad884613672565b61361c565b905082815260208101848484011115612af957612af8613a53565b5b612b04848285613815565b509392505050565b600081359050612b1b81614082565b92915050565b600081359050612b3081614099565b92915050565b600081359050612b45816140b0565b92915050565b600081519050612b5a816140b0565b92915050565b600082601f830112612b7557612b74613a4e565b5b8135612b85848260208601612a88565b91505092915050565b600082601f830112612ba357612ba2613a4e565b5b8135612bb3848260208601612aca565b91505092915050565b600081359050612bcb816140c7565b92915050565b600060208284031215612be757612be6613a5d565b5b6000612bf584828501612b0c565b91505092915050565b60008060408385031215612c1557612c14613a5d565b5b6000612c2385828601612b0c565b9250506020612c3485828601612b0c565b9150509250929050565b600080600060608486031215612c5757612c56613a5d565b5b6000612c6586828701612b0c565b9350506020612c7686828701612b0c565b9250506040612c8786828701612bbc565b9150509250925092565b60008060008060808587031215612cab57612caa613a5d565b5b6000612cb987828801612b0c565b9450506020612cca87828801612b0c565b9350506040612cdb87828801612bbc565b925050606085013567ffffffffffffffff811115612cfc57612cfb613a58565b5b612d0887828801612b60565b91505092959194509250565b60008060408385031215612d2b57612d2a613a5d565b5b6000612d3985828601612b0c565b9250506020612d4a85828601612b21565b9150509250929050565b60008060408385031215612d6b57612d6a613a5d565b5b6000612d7985828601612b0c565b9250506020612d8a85828601612bbc565b9150509250929050565b600060208284031215612daa57612da9613a5d565b5b6000612db884828501612b36565b91505092915050565b600060208284031215612dd757612dd6613a5d565b5b6000612de584828501612b4b565b91505092915050565b600060208284031215612e0457612e03613a5d565b5b600082013567ffffffffffffffff811115612e2257612e21613a58565b5b612e2e84828501612b8e565b91505092915050565b600060208284031215612e4d57612e4c613a5d565b5b6000612e5b84828501612bbc565b91505092915050565b612e6d816137a1565b82525050565b612e7c816137b3565b82525050565b6000612e8d826136a3565b612e9781856136b9565b9350612ea7818560208601613824565b612eb081613a62565b840191505092915050565b6000612ec6826136ae565b612ed081856136ca565b9350612ee0818560208601613824565b612ee981613a62565b840191505092915050565b6000612eff826136ae565b612f0981856136db565b9350612f19818560208601613824565b80840191505092915050565b6000612f326023836136ca565b9150612f3d82613a73565b604082019050919050565b6000612f55602b836136ca565b9150612f6082613ac2565b604082019050919050565b6000612f786032836136ca565b9150612f8382613b11565b604082019050919050565b6000612f9b6026836136ca565b9150612fa682613b60565b604082019050919050565b6000612fbe601c836136ca565b9150612fc982613baf565b602082019050919050565b6000612fe16024836136ca565b9150612fec82613bd8565b604082019050919050565b60006130046019836136ca565b915061300f82613c27565b602082019050919050565b6000613027602c836136ca565b915061303282613c50565b604082019050919050565b600061304a601d836136ca565b915061305582613c9f565b602082019050919050565b600061306d6038836136ca565b915061307882613cc8565b604082019050919050565b6000613090602a836136ca565b915061309b82613d17565b604082019050919050565b60006130b36029836136ca565b91506130be82613d66565b604082019050919050565b60006130d66020836136ca565b91506130e182613db5565b602082019050919050565b60006130f96020836136ca565b915061310482613dde565b602082019050919050565b600061311c602c836136ca565b915061312782613e07565b604082019050919050565b600061313f6020836136ca565b915061314a82613e56565b602082019050919050565b60006131626029836136ca565b915061316d82613e7f565b604082019050919050565b6000613185602f836136ca565b915061319082613ece565b604082019050919050565b60006131a86021836136ca565b91506131b382613f1d565b604082019050919050565b60006131cb6031836136ca565b91506131d682613f6c565b604082019050919050565b60006131ee602c836136ca565b91506131f982613fbb565b604082019050919050565b60006132116023836136ca565b915061321c8261400a565b604082019050919050565b60006132346020836136ca565b915061323f82614059565b602082019050919050565b6132538161380b565b82525050565b60006132658285612ef4565b91506132718284612ef4565b91508190509392505050565b60006020820190506132926000830184612e64565b92915050565b60006080820190506132ad6000830187612e64565b6132ba6020830186612e64565b6132c7604083018561324a565b81810360608301526132d98184612e82565b905095945050505050565b60006020820190506132f96000830184612e73565b92915050565b600060208201905081810360008301526133198184612ebb565b905092915050565b6000602082019050818103600083015261333a81612f25565b9050919050565b6000602082019050818103600083015261335a81612f48565b9050919050565b6000602082019050818103600083015261337a81612f6b565b9050919050565b6000602082019050818103600083015261339a81612f8e565b9050919050565b600060208201905081810360008301526133ba81612fb1565b9050919050565b600060208201905081810360008301526133da81612fd4565b9050919050565b600060208201905081810360008301526133fa81612ff7565b9050919050565b6000602082019050818103600083015261341a8161301a565b9050919050565b6000602082019050818103600083015261343a8161303d565b9050919050565b6000602082019050818103600083015261345a81613060565b9050919050565b6000602082019050818103600083015261347a81613083565b9050919050565b6000602082019050818103600083015261349a816130a6565b9050919050565b600060208201905081810360008301526134ba816130c9565b9050919050565b600060208201905081810360008301526134da816130ec565b9050919050565b600060208201905081810360008301526134fa8161310f565b9050919050565b6000602082019050818103600083015261351a81613132565b9050919050565b6000602082019050818103600083015261353a81613155565b9050919050565b6000602082019050818103600083015261355a81613178565b9050919050565b6000602082019050818103600083015261357a8161319b565b9050919050565b6000602082019050818103600083015261359a816131be565b9050919050565b600060208201905081810360008301526135ba816131e1565b9050919050565b600060208201905081810360008301526135da81613204565b9050919050565b600060208201905081810360008301526135fa81613227565b9050919050565b6000602082019050613616600083018461324a565b92915050565b6000613626613637565b90506136328282613889565b919050565b6000604051905090565b600067ffffffffffffffff82111561365c5761365b613a1f565b5b61366582613a62565b9050602081019050919050565b600067ffffffffffffffff82111561368d5761368c613a1f565b5b61369682613a62565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006136f18261380b565b91506136fc8361380b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561373157613730613934565b5b828201905092915050565b60006137478261380b565b91506137528361380b565b92508261376257613761613963565b5b828204905092915050565b60006137788261380b565b91506137838361380b565b92508282101561379657613795613934565b5b828203905092915050565b60006137ac826137eb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613842578082015181840152602081019050613827565b83811115613851576000848401525b50505050565b6000600282049050600182168061386f57607f821691505b6020821081141561388357613882613992565b5b50919050565b61389282613a62565b810181811067ffffffffffffffff821117156138b1576138b0613a1f565b5b80604052505050565b60006138c58261380b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138f8576138f7613934565b5b600182019050919050565b600061390e8261380b565b91506139198361380b565b92508261392957613928613963565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008201527f7965740000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b61408b816137a1565b811461409657600080fd5b50565b6140a2816137b3565b81146140ad57600080fd5b50565b6140b9816137bf565b81146140c457600080fd5b50565b6140d08161380b565b81146140db57600080fd5b5056fea2646970667358221220fc8d513571cac83ec91c59fc536ec8d60f6758236972ddb5c1b917ecfc9812db64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063c87b56dd116100a2578063e36d649811610071578063e36d64981461050a578063e985e9c514610528578063eb8d244414610558578063f2fde38b14610576576101e5565b8063c87b56dd14610496578063cb774d47146104c6578063d031370b146104e4578063e13f351a14610500576101e5565b806395d89b41116100de57806395d89b4114610424578063a22cb46514610442578063b07ed9821461045e578063b88d4fde1461047a576101e5565b806370a08231146103c2578063715018a6146103f25780637d17fcbe146103fc5780638da5cb5b14610406576101e5565b80632f745c591161018757806342842e0e1161015657806342842e0e1461032a5780634f6ccce71461034657806355f804b3146103765780636352211e14610392576101e5565b80632f745c59146102c857806332cb6b0c146102f857806334918dfd146103165780633ccfd60b14610320576101e5565b8063095ea7b3116101c3578063095ea7b3146102685780631249c58b1461028457806318160ddd1461028e57806323b872dd146102ac576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff9190612d94565b610592565b60405161021191906132e4565b60405180910390f35b61022261060c565b60405161022f91906132ff565b60405180910390f35b610252600480360381019061024d9190612e37565b61069e565b60405161025f919061327d565b60405180910390f35b610282600480360381019061027d9190612d54565b610723565b005b61028c61083b565b005b610296610912565b6040516102a39190613601565b60405180910390f35b6102c660048036038101906102c19190612c3e565b61091f565b005b6102e260048036038101906102dd9190612d54565b61097f565b6040516102ef9190613601565b60405180910390f35b610300610a24565b60405161030d9190613601565b60405180910390f35b61031e610a2a565b005b610328610ad2565b005b610344600480360381019061033f9190612c3e565b610b9d565b005b610360600480360381019061035b9190612e37565b610bbd565b60405161036d9190613601565b60405180910390f35b610390600480360381019061038b9190612dee565b610c2e565b005b6103ac60048036038101906103a79190612e37565b610cc4565b6040516103b9919061327d565b60405180910390f35b6103dc60048036038101906103d79190612bd1565b610d76565b6040516103e99190613601565b60405180910390f35b6103fa610e2e565b005b610404610f6b565b005b61040e611035565b60405161041b919061327d565b60405180910390f35b61042c61105f565b60405161043991906132ff565b60405180910390f35b61045c60048036038101906104579190612d14565b6110f1565b005b61047860048036038101906104739190612e37565b611272565b005b610494600480360381019061048f9190612c91565b6112f8565b005b6104b060048036038101906104ab9190612e37565b61135a565b6040516104bd91906132ff565b60405180910390f35b6104ce6114cd565b6040516104db9190613601565b60405180910390f35b6104fe60048036038101906104f99190612e37565b6114d3565b005b6105086115a6565b005b610512611733565b60405161051f9190613601565b60405180910390f35b610542600480360381019061053d9190612bfe565b611739565b60405161054f91906132e4565b60405180910390f35b6105606117cd565b60405161056d91906132e4565b60405180910390f35b610590600480360381019061058b9190612bd1565b6117e0565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061060557506106048261198c565b5b9050919050565b60606000805461061b90613857565b80601f016020809104026020016040519081016040528092919081815260200182805461064790613857565b80156106945780601f1061066957610100808354040283529160200191610694565b820191906000526020600020905b81548152906001019060200180831161067757829003601f168201915b5050505050905090565b60006106a982611a6e565b6106e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106df906134e1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061072e82610cc4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079690613561565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107be611ada565b73ffffffffffffffffffffffffffffffffffffffff1614806107ed57506107ec816107e7611ada565b611739565b5b61082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082390613441565b60405180910390fd5b6108368383611ae2565b505050565b600c60009054906101000a900460ff1661088a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610881906135e1565b60405180910390fd5b600b546001610897610912565b6108a191906136e6565b11156108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d9906134a1565b60405180910390fd5b600b5460016108ef610912565b6108f991906136e6565b116109105761090f3361090a610912565b611b9b565b5b565b6000600880549050905090565b61093061092a611ada565b82611bb9565b61096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690613581565b60405180910390fd5b61097a838383611c97565b505050565b600061098a83610d76565b82106109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290613341565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b610a32611ada565b73ffffffffffffffffffffffffffffffffffffffff16610a50611035565b73ffffffffffffffffffffffffffffffffffffffff1614610aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9d90613501565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b610ada611ada565b73ffffffffffffffffffffffffffffffffffffffff16610af8611035565b73ffffffffffffffffffffffffffffffffffffffff1614610b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4590613501565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b99573d6000803e3d6000fd5b5050565b610bb8838383604051806020016040528060008152506112f8565b505050565b6000610bc7610912565b8210610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff906135a1565b60405180910390fd5b60088281548110610c1c57610c1b6139f0565b5b90600052602060002001549050919050565b610c36611ada565b73ffffffffffffffffffffffffffffffffffffffff16610c54611035565b73ffffffffffffffffffffffffffffffffffffffff1614610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190613501565b60405180910390fd5b80600f9080519060200190610cc09291906129e5565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6490613481565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde90613461565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e36611ada565b73ffffffffffffffffffffffffffffffffffffffff16610e54611035565b73ffffffffffffffffffffffffffffffffffffffff1614610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190613501565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610f73611ada565b73ffffffffffffffffffffffffffffffffffffffff16610f91611035565b73ffffffffffffffffffffffffffffffffffffffff1614610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde90613501565b60405180910390fd5b6000600d541461102c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102390613421565b60405180910390fd5b43600e81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461106e90613857565b80601f016020809104026020016040519081016040528092919081815260200182805461109a90613857565b80156110e75780601f106110bc576101008083540402835291602001916110e7565b820191906000526020600020905b8154815290600101906020018083116110ca57829003601f168201915b5050505050905090565b6110f9611ada565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e906133e1565b60405180910390fd5b8060056000611174611ada565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611221611ada565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161126691906132e4565b60405180910390a35050565b61127a611ada565b73ffffffffffffffffffffffffffffffffffffffff16611298611035565b73ffffffffffffffffffffffffffffffffffffffff16146112ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e590613501565b60405180910390fd5b80600b8190555050565b611309611303611ada565b83611bb9565b611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90613581565b60405180910390fd5b61135484848484611ef5565b50505050565b606061136582611a6e565b6113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90613541565b60405180910390fd5b60006010600084815260200190815260200160002080546113c490613857565b80601f01602080910402602001604051908101604052809291908181526020018280546113f090613857565b801561143d5780601f106114125761010080835404028352916020019161143d565b820191906000526020600020905b81548152906001019060200180831161142057829003601f168201915b50505050509050600061144e611f51565b90506000815114156114645781925050506114c8565b600082511115611499578082604051602001611481929190613259565b604051602081830303815290604052925050506114c8565b806114a385611fe3565b6040516020016114b4929190613259565b604051602081830303815290604052925050505b919050565b600d5481565b6114db611ada565b73ffffffffffffffffffffffffffffffffffffffff166114f9611035565b73ffffffffffffffffffffffffffffffffffffffff161461154f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154690613501565b60405180910390fd5b6000611559610912565b905060005b8281101561158e5761157b33828461157691906136e6565b611b9b565b8080611586906138ba565b91505061155e565b6000600e5414156115a15743600e819055505b505050565b6115ae611ada565b73ffffffffffffffffffffffffffffffffffffffff166115cc611035565b73ffffffffffffffffffffffffffffffffffffffff1614611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990613501565b60405180910390fd5b6000600d5414611667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165e906135c1565b60405180910390fd5b6000600e5414156116ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a490613321565b60405180910390fd5b600b54600e544060001c6116c19190613903565b600d8190555060ff6116de600e544361214490919063ffffffff16565b111561170957600b546001436116f4919061376d565b4060001c6117029190613903565b600d819055505b6000600d5414156117315761172a6001600d5461215a90919063ffffffff16565b600d819055505b565b600e5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b6117e8611ada565b73ffffffffffffffffffffffffffffffffffffffff16611806611035565b73ffffffffffffffffffffffffffffffffffffffff161461185c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185390613501565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c390613381565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a5757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a675750611a6682612170565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b5583610cc4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611bb58282604051806020016040528060008152506121da565b5050565b6000611bc482611a6e565b611c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfa90613401565b60405180910390fd5b6000611c0e83610cc4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c7d57508373ffffffffffffffffffffffffffffffffffffffff16611c658461069e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c8e5750611c8d8185611739565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cb782610cc4565b73ffffffffffffffffffffffffffffffffffffffff1614611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490613521565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d74906133c1565b60405180910390fd5b611d8a8383836001612235565b611d95600082611ae2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611de5919061376d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e3c91906136e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611f00848484611c97565b611f0c8484848461235f565b611f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4290613361565b60405180910390fd5b50505050565b6060600f8054611f6090613857565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8c90613857565b8015611fd95780601f10611fae57610100808354040283529160200191611fd9565b820191906000526020600020905b815481529060010190602001808311611fbc57829003601f168201915b5050505050905090565b6060600082141561202b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061213f565b600082905060005b6000821461205d578080612046906138ba565b915050600a82612056919061373c565b9150612033565b60008167ffffffffffffffff81111561207957612078613a1f565b5b6040519080825280601f01601f1916602001820160405280156120ab5781602001600182028036833780820191505090505b5090505b60008514612138576001826120c4919061376d565b9150600a856120d39190613903565b60306120df91906136e6565b60f81b8183815181106120f5576120f46139f0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612131919061373c565b94506120af565b8093505050505b919050565b60008183612152919061376d565b905092915050565b6000818361216891906136e6565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121e483836124f6565b6121f1600084848461235f565b612230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222790613361565b60405180910390fd5b505050565b612241848484846126c6565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122845761227f826126cc565b6122c3565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146122c2576122c18483612715565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156122fc5750805b1561230f5761230a82612882565b612359565b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156123485750805b15612358576123578383612953565b5b5b50505050565b60006123808473ffffffffffffffffffffffffffffffffffffffff166129d2565b156124e9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123a9611ada565b8786866040518563ffffffff1660e01b81526004016123cb9493929190613298565b602060405180830381600087803b1580156123e557600080fd5b505af192505050801561241657506040513d601f19601f820116820180604052508101906124139190612dc1565b60015b612499573d8060008114612446576040519150601f19603f3d011682016040523d82523d6000602084013e61244b565b606091505b50600081511415612491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248890613361565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124ee565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255d906134c1565b60405180910390fd5b61256f81611a6e565b156125af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a6906133a1565b60405180910390fd5b6125bd600083836001612235565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461260d91906136e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161272284610d76565b61272c919061376d565b9050600060076000848152602001908152602001600020549050818114612811576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612896919061376d565b90506000600960008481526020019081526020016000205490506000600883815481106128c6576128c56139f0565b5b9060005260206000200154905080600883815481106128e8576128e76139f0565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612937576129366139c1565b5b6001900381819060005260206000200160009055905550505050565b600061295e83610d76565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546129f190613857565b90600052602060002090601f016020900481019282612a135760008555612a5a565b82601f10612a2c57805160ff1916838001178555612a5a565b82800160010185558215612a5a579182015b82811115612a59578251825591602001919060010190612a3e565b5b509050612a679190612a6b565b5090565b5b80821115612a84576000816000905550600101612a6c565b5090565b6000612a9b612a9684613641565b61361c565b905082815260208101848484011115612ab757612ab6613a53565b5b612ac2848285613815565b509392505050565b6000612add612ad884613672565b61361c565b905082815260208101848484011115612af957612af8613a53565b5b612b04848285613815565b509392505050565b600081359050612b1b81614082565b92915050565b600081359050612b3081614099565b92915050565b600081359050612b45816140b0565b92915050565b600081519050612b5a816140b0565b92915050565b600082601f830112612b7557612b74613a4e565b5b8135612b85848260208601612a88565b91505092915050565b600082601f830112612ba357612ba2613a4e565b5b8135612bb3848260208601612aca565b91505092915050565b600081359050612bcb816140c7565b92915050565b600060208284031215612be757612be6613a5d565b5b6000612bf584828501612b0c565b91505092915050565b60008060408385031215612c1557612c14613a5d565b5b6000612c2385828601612b0c565b9250506020612c3485828601612b0c565b9150509250929050565b600080600060608486031215612c5757612c56613a5d565b5b6000612c6586828701612b0c565b9350506020612c7686828701612b0c565b9250506040612c8786828701612bbc565b9150509250925092565b60008060008060808587031215612cab57612caa613a5d565b5b6000612cb987828801612b0c565b9450506020612cca87828801612b0c565b9350506040612cdb87828801612bbc565b925050606085013567ffffffffffffffff811115612cfc57612cfb613a58565b5b612d0887828801612b60565b91505092959194509250565b60008060408385031215612d2b57612d2a613a5d565b5b6000612d3985828601612b0c565b9250506020612d4a85828601612b21565b9150509250929050565b60008060408385031215612d6b57612d6a613a5d565b5b6000612d7985828601612b0c565b9250506020612d8a85828601612bbc565b9150509250929050565b600060208284031215612daa57612da9613a5d565b5b6000612db884828501612b36565b91505092915050565b600060208284031215612dd757612dd6613a5d565b5b6000612de584828501612b4b565b91505092915050565b600060208284031215612e0457612e03613a5d565b5b600082013567ffffffffffffffff811115612e2257612e21613a58565b5b612e2e84828501612b8e565b91505092915050565b600060208284031215612e4d57612e4c613a5d565b5b6000612e5b84828501612bbc565b91505092915050565b612e6d816137a1565b82525050565b612e7c816137b3565b82525050565b6000612e8d826136a3565b612e9781856136b9565b9350612ea7818560208601613824565b612eb081613a62565b840191505092915050565b6000612ec6826136ae565b612ed081856136ca565b9350612ee0818560208601613824565b612ee981613a62565b840191505092915050565b6000612eff826136ae565b612f0981856136db565b9350612f19818560208601613824565b80840191505092915050565b6000612f326023836136ca565b9150612f3d82613a73565b604082019050919050565b6000612f55602b836136ca565b9150612f6082613ac2565b604082019050919050565b6000612f786032836136ca565b9150612f8382613b11565b604082019050919050565b6000612f9b6026836136ca565b9150612fa682613b60565b604082019050919050565b6000612fbe601c836136ca565b9150612fc982613baf565b602082019050919050565b6000612fe16024836136ca565b9150612fec82613bd8565b604082019050919050565b60006130046019836136ca565b915061300f82613c27565b602082019050919050565b6000613027602c836136ca565b915061303282613c50565b604082019050919050565b600061304a601d836136ca565b915061305582613c9f565b602082019050919050565b600061306d6038836136ca565b915061307882613cc8565b604082019050919050565b6000613090602a836136ca565b915061309b82613d17565b604082019050919050565b60006130b36029836136ca565b91506130be82613d66565b604082019050919050565b60006130d66020836136ca565b91506130e182613db5565b602082019050919050565b60006130f96020836136ca565b915061310482613dde565b602082019050919050565b600061311c602c836136ca565b915061312782613e07565b604082019050919050565b600061313f6020836136ca565b915061314a82613e56565b602082019050919050565b60006131626029836136ca565b915061316d82613e7f565b604082019050919050565b6000613185602f836136ca565b915061319082613ece565b604082019050919050565b60006131a86021836136ca565b91506131b382613f1d565b604082019050919050565b60006131cb6031836136ca565b91506131d682613f6c565b604082019050919050565b60006131ee602c836136ca565b91506131f982613fbb565b604082019050919050565b60006132116023836136ca565b915061321c8261400a565b604082019050919050565b60006132346020836136ca565b915061323f82614059565b602082019050919050565b6132538161380b565b82525050565b60006132658285612ef4565b91506132718284612ef4565b91508190509392505050565b60006020820190506132926000830184612e64565b92915050565b60006080820190506132ad6000830187612e64565b6132ba6020830186612e64565b6132c7604083018561324a565b81810360608301526132d98184612e82565b905095945050505050565b60006020820190506132f96000830184612e73565b92915050565b600060208201905081810360008301526133198184612ebb565b905092915050565b6000602082019050818103600083015261333a81612f25565b9050919050565b6000602082019050818103600083015261335a81612f48565b9050919050565b6000602082019050818103600083015261337a81612f6b565b9050919050565b6000602082019050818103600083015261339a81612f8e565b9050919050565b600060208201905081810360008301526133ba81612fb1565b9050919050565b600060208201905081810360008301526133da81612fd4565b9050919050565b600060208201905081810360008301526133fa81612ff7565b9050919050565b6000602082019050818103600083015261341a8161301a565b9050919050565b6000602082019050818103600083015261343a8161303d565b9050919050565b6000602082019050818103600083015261345a81613060565b9050919050565b6000602082019050818103600083015261347a81613083565b9050919050565b6000602082019050818103600083015261349a816130a6565b9050919050565b600060208201905081810360008301526134ba816130c9565b9050919050565b600060208201905081810360008301526134da816130ec565b9050919050565b600060208201905081810360008301526134fa8161310f565b9050919050565b6000602082019050818103600083015261351a81613132565b9050919050565b6000602082019050818103600083015261353a81613155565b9050919050565b6000602082019050818103600083015261355a81613178565b9050919050565b6000602082019050818103600083015261357a8161319b565b9050919050565b6000602082019050818103600083015261359a816131be565b9050919050565b600060208201905081810360008301526135ba816131e1565b9050919050565b600060208201905081810360008301526135da81613204565b9050919050565b600060208201905081810360008301526135fa81613227565b9050919050565b6000602082019050613616600083018461324a565b92915050565b6000613626613637565b90506136328282613889565b919050565b6000604051905090565b600067ffffffffffffffff82111561365c5761365b613a1f565b5b61366582613a62565b9050602081019050919050565b600067ffffffffffffffff82111561368d5761368c613a1f565b5b61369682613a62565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006136f18261380b565b91506136fc8361380b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561373157613730613934565b5b828201905092915050565b60006137478261380b565b91506137528361380b565b92508261376257613761613963565b5b828204905092915050565b60006137788261380b565b91506137838361380b565b92508282101561379657613795613934565b5b828203905092915050565b60006137ac826137eb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613842578082015181840152602081019050613827565b83811115613851576000848401525b50505050565b6000600282049050600182168061386f57607f821691505b6020821081141561388357613882613992565b5b50919050565b61389282613a62565b810181811067ffffffffffffffff821117156138b1576138b0613a1f565b5b80604052505050565b60006138c58261380b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138f8576138f7613934565b5b600182019050919050565b600061390e8261380b565b91506139198361380b565b92508261392957613928613963565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008201527f7965740000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b61408b816137a1565b811461409657600080fd5b50565b6140a2816137b3565b81146140ad57600080fd5b50565b6140b9816137bf565b81146140c457600080fd5b50565b6140d08161380b565b81146140db57600080fd5b5056fea2646970667358221220fc8d513571cac83ec91c59fc536ec8d60f6758236972ddb5c1b917ecfc9812db64736f6c63430008070033
Deployed Bytecode Sourcemap
49208:3493:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43007:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30929:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32381:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31918:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50352:321;;;:::i;:::-;;43656:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33271:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43324:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49364:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49670:89;;;:::i;:::-;;49767:140;;;:::i;:::-;;33647:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43846:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51782:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30623:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30353:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28189:148;;;:::i;:::-;;51388:182;;;:::i;:::-;;27538:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31098:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32674:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50236:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33869:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51905:793;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49444:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49915:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50683:697;;;:::i;:::-;;49479:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33040:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49403:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28492:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43007:233;43109:4;43148:35;43133:50;;;:11;:50;;;;:99;;;;43196:36;43220:11;43196:23;:36::i;:::-;43133:99;43126:106;;43007:233;;;:::o;30929:100::-;30983:13;31016:5;31009:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30929:100;:::o;32381:221::-;32457:7;32485:16;32493:7;32485;:16::i;:::-;32477:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32570:15;:24;32586:7;32570:24;;;;;;;;;;;;;;;;;;;;;32563:31;;32381:221;;;:::o;31918:397::-;31999:13;32015:23;32030:7;32015:14;:23::i;:::-;31999:39;;32063:5;32057:11;;:2;:11;;;;32049:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32143:5;32127:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32152:37;32169:5;32176:12;:10;:12::i;:::-;32152:16;:37::i;:::-;32127:62;32119:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32286:21;32295:2;32299:7;32286:8;:21::i;:::-;31988:327;31918:397;;:::o;50352:321::-;50395:12;;;;;;;;;;;50387:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50486:10;;50480:1;50464:13;:11;:13::i;:::-;:17;;;;:::i;:::-;50463:33;;50455:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;50581:10;;50575:1;50559:13;:11;:13::i;:::-;:17;;;;:::i;:::-;50558:33;50554:102;;50608:36;50618:10;50630:13;:11;:13::i;:::-;50608:9;:36::i;:::-;50554:102;50352:321::o;43656:113::-;43717:7;43744:10;:17;;;;43737:24;;43656:113;:::o;33271:305::-;33432:41;33451:12;:10;:12::i;:::-;33465:7;33432:18;:41::i;:::-;33424:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33540:28;33550:4;33556:2;33560:7;33540:9;:28::i;:::-;33271:305;;;:::o;43324:256::-;43421:7;43457:23;43474:5;43457:16;:23::i;:::-;43449:5;:31;43441:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43546:12;:19;43559:5;43546:19;;;;;;;;;;;;;;;:26;43566:5;43546:26;;;;;;;;;;;;43539:33;;43324:256;;;;:::o;49364:32::-;;;;:::o;49670:89::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49739:12:::1;;;;;;;;;;;49738:13;49723:12;;:28;;;;;;;;;;;;;;;;;;49670:89::o:0;49767:140::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49815:12:::1;49830:21;49815:36;;49870:10;49862:28;;:37;49891:7;49862:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49804:103;49767:140::o:0;33647:151::-;33751:39;33768:4;33774:2;33778:7;33751:39;;;;;;;;;;;;:16;:39::i;:::-;33647:151;;;:::o;43846:233::-;43921:7;43957:30;:28;:30::i;:::-;43949:5;:38;43941:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44054:10;44065:5;44054:17;;;;;;;;:::i;:::-;;;;;;;;;;44047:24;;43846:233;;;:::o;51782:109::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51875:8:::1;51856:16;:27;;;;;;;;;;;;:::i;:::-;;51782:109:::0;:::o;30623:239::-;30695:7;30715:13;30731:7;:16;30739:7;30731:16;;;;;;;;;;;;;;;;;;;;;30715:32;;30783:1;30766:19;;:5;:19;;;;30758:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30849:5;30842:12;;;30623:239;;;:::o;30353:208::-;30425:7;30470:1;30453:19;;:5;:19;;;;30445:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30537:9;:16;30547:5;30537:16;;;;;;;;;;;;;;;;30530:23;;30353:208;;;:::o;28189:148::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28296:1:::1;28259:40;;28280:6;;;;;;;;;;;28259:40;;;;;;;;;;;;28327:1;28310:6;;:19;;;;;;;;;;;;;;;;;;28189:148::o:0;51388:182::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51483:1:::1;51466:13;;:18;51458:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;51550:12;51529:18;:33;;;;51388:182::o:0;27538:87::-;27584:7;27611:6;;;;;;;;;;;27604:13;;27538:87;:::o;31098:104::-;31154:13;31187:7;31180:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31098:104;:::o;32674:295::-;32789:12;:10;:12::i;:::-;32777:24;;:8;:24;;;;32769:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32889:8;32844:18;:32;32863:12;:10;:12::i;:::-;32844:32;;;;;;;;;;;;;;;:42;32877:8;32844:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32942:8;32913:48;;32928:12;:10;:12::i;:::-;32913:48;;;32952:8;32913:48;;;;;;:::i;:::-;;;;;;;;32674:295;;:::o;50236:104::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50323:9:::1;50310:10;:22;;;;50236:104:::0;:::o;33869:285::-;34001:41;34020:12;:10;:12::i;:::-;34034:7;34001:18;:41::i;:::-;33993:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34107:39;34121:4;34127:2;34131:7;34140:5;34107:13;:39::i;:::-;33869:285;;;;:::o;51905:793::-;51978:13;52012:16;52020:7;52012;:16::i;:::-;52004:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52093:23;52119:10;:19;52130:7;52119:19;;;;;;;;;;;52093:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52149:18;52170:10;:8;:10::i;:::-;52149:31;;52278:1;52262:4;52256:18;:23;52252:72;;;52303:9;52296:16;;;;;;52252:72;52454:1;52434:9;52428:23;:27;52424:108;;;52503:4;52509:9;52486:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52472:48;;;;;;52424:108;52664:4;52670:18;:7;:16;:18::i;:::-;52647:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52633:57;;;;51905:793;;;;:::o;49444:28::-;;;;:::o;49915:313::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49979:11:::1;49993:13;:11;:13::i;:::-;49979:27;;50017:6;50034:86;50050:3;50046:1;:7;50034:86;;;50075:33;50085:10;50106:1;50097:6;:10;;;;:::i;:::-;50075:9;:33::i;:::-;50055:3;;;;;:::i;:::-;;;;50034:86;;;50158:1;50136:18;;:23;50132:89;;;50197:12;50176:18;:33;;;;50132:89;49968:260;;49915:313:::0;:::o;50683:697::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50765:1:::1;50748:13;;:18;50740:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50847:1;50825:18;;:23;;50817:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;50955:10;;50932:18;;50922:29;50917:35;;:48;;;;:::i;:::-;50901:13;:64;;;;51139:3;51100:36;51117:18;;51100:12;:16;;:36;;;;:::i;:::-;:42;51097:136;;;51211:10;;51205:1;51190:12;:16;;;;:::i;:::-;51180:27;51175:33;;:46;;;;:::i;:::-;51159:13;:62;;;;51097:136;51307:1;51290:13;;:18;51286:87;;;51341:20;51359:1;51341:13;;:17;;:20;;;;:::i;:::-;51325:13;:36;;;;51286:87;50683:697::o:0;49479:33::-;;;;:::o;33040:164::-;33137:4;33161:18;:25;33180:5;33161:25;;;;;;;;;;;;;;;:35;33187:8;33161:35;;;;;;;;;;;;;;;;;;;;;;;;;33154:42;;33040:164;;;;:::o;49403:32::-;;;;;;;;;;;;;:::o;28492:244::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28601:1:::1;28581:22;;:8;:22;;;;28573:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28691:8;28662:38;;28683:6;;;;;;;;;;;28662:38;;;;;;;;;;;;28720:8;28711:6;;:17;;;;;;;;;;;;;;;;;;28492:244:::0;:::o;30005:284::-;30107:4;30146:25;30131:40;;;:11;:40;;;;:101;;;;30199:33;30184:48;;;:11;:48;;;;30131:101;:150;;;;30245:36;30269:11;30245:23;:36::i;:::-;30131:150;30124:157;;30005:284;;;:::o;35621:127::-;35686:4;35738:1;35710:30;;:7;:16;35718:7;35710:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35703:37;;35621:127;;;:::o;26155:98::-;26208:7;26235:10;26228:17;;26155:98;:::o;39860:174::-;39962:2;39935:15;:24;39951:7;39935:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40018:7;40014:2;39980:46;;39989:23;40004:7;39989:14;:23::i;:::-;39980:46;;;;;;;;;;;;39860:174;;:::o;36605:110::-;36681:26;36691:2;36695:7;36681:26;;;;;;;;;;;;:9;:26::i;:::-;36605:110;;:::o;35915:348::-;36008:4;36033:16;36041:7;36033;:16::i;:::-;36025:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36109:13;36125:23;36140:7;36125:14;:23::i;:::-;36109:39;;36178:5;36167:16;;:7;:16;;;:51;;;;36211:7;36187:31;;:20;36199:7;36187:11;:20::i;:::-;:31;;;36167:51;:87;;;;36222:32;36239:5;36246:7;36222:16;:32::i;:::-;36167:87;36159:96;;;35915:348;;;;:::o;39192:550::-;39317:4;39290:31;;:23;39305:7;39290:14;:23::i;:::-;:31;;;39282:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39400:1;39386:16;;:2;:16;;;;39378:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39456:45;39477:4;39483:2;39487:7;39496:4;39456:20;:45::i;:::-;39566:29;39583:1;39587:7;39566:8;:29::i;:::-;39627:1;39608:9;:15;39618:4;39608:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39656:1;39639:9;:13;39649:2;39639:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39687:2;39668:7;:16;39676:7;39668:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39726:7;39722:2;39707:27;;39716:4;39707:27;;;;;;;;;;;;39192:550;;;:::o;35036:272::-;35150:28;35160:4;35166:2;35170:7;35150:9;:28::i;:::-;35197:48;35220:4;35226:2;35230:7;35239:5;35197:22;:48::i;:::-;35189:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35036:272;;;;:::o;51578:117::-;51638:13;51671:16;51664:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51578:117;:::o;7152:723::-;7208:13;7438:1;7429:5;:10;7425:53;;;7456:10;;;;;;;;;;;;;;;;;;;;;7425:53;7488:12;7503:5;7488:20;;7519:14;7544:78;7559:1;7551:4;:9;7544:78;;7577:8;;;;;:::i;:::-;;;;7608:2;7600:10;;;;;:::i;:::-;;;7544:78;;;7632:19;7664:6;7654:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7632:39;;7682:154;7698:1;7689:5;:10;7682:154;;7726:1;7716:11;;;;;:::i;:::-;;;7793:2;7785:5;:10;;;;:::i;:::-;7772:2;:24;;;;:::i;:::-;7759:39;;7742:6;7749;7742:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7822:2;7813:11;;;;;:::i;:::-;;;7682:154;;;7860:6;7846:21;;;;;7152:723;;;;:::o;3040:98::-;3098:7;3129:1;3125;:5;;;;:::i;:::-;3118:12;;3040:98;;;;:::o;2659:::-;2717:7;2748:1;2744;:5;;;;:::i;:::-;2737:12;;2659:98;;;;:::o;19228:157::-;19313:4;19352:25;19337:40;;;:11;:40;;;;19330:47;;19228:157;;;:::o;36942:250::-;37038:18;37044:2;37048:7;37038:5;:18::i;:::-;37075:54;37106:1;37110:2;37114:7;37123:5;37075:22;:54::i;:::-;37067:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;36942:250;;;:::o;44692:604::-;44817:55;44844:4;44850:2;44854:7;44863:8;44817:26;:55::i;:::-;44905:1;44889:18;;:4;:18;;;44885:187;;;44924:40;44956:7;44924:31;:40::i;:::-;44885:187;;;44994:2;44986:10;;:4;:10;;;44982:90;;45013:47;45046:4;45052:7;45013:32;:47::i;:::-;44982:90;44885:187;45100:1;45086:16;;:2;:16;;;:28;;;;;45106:8;45086:28;45082:207;;;45131:45;45168:7;45131:36;:45::i;:::-;45082:207;;;45204:4;45198:10;;:2;:10;;;;:22;;;;;45212:8;45198:22;45194:95;;;45237:40;45265:2;45269:7;45237:27;:40::i;:::-;45194:95;45082:207;44692:604;;;;:::o;40599:839::-;40716:4;40742:15;:2;:13;;;:15::i;:::-;40738:693;;;40794:2;40778:36;;;40815:12;:10;:12::i;:::-;40829:4;40835:7;40844:5;40778:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40774:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41041:1;41024:6;:13;:18;41020:341;;;41067:60;;;;;;;;;;:::i;:::-;;;;;;;;41020:341;41311:6;41305:13;41296:6;41292:2;41288:15;41281:38;40774:602;40911:45;;;40901:55;;;:6;:55;;;;40894:62;;;;;40738:693;41415:4;41408:11;;40599:839;;;;;;;:::o;37528:388::-;37622:1;37608:16;;:2;:16;;;;37600:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37681:16;37689:7;37681;:16::i;:::-;37680:17;37672:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37743:51;37772:1;37776:2;37780:7;37789:4;37743:20;:51::i;:::-;37824:1;37807:9;:13;37817:2;37807:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37855:2;37836:7;:16;37844:7;37836:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37900:7;37896:2;37875:33;;37892:1;37875:33;;;;;;;;;;;;37528:388;;:::o;42051:108::-;;;;;:::o;46019:164::-;46123:10;:17;;;;46096:15;:24;46112:7;46096:24;;;;;;;;;;;:44;;;;46151:10;46167:7;46151:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46019:164;:::o;46810:988::-;47076:22;47126:1;47101:22;47118:4;47101:16;:22::i;:::-;:26;;;;:::i;:::-;47076:51;;47138:18;47159:17;:26;47177:7;47159:26;;;;;;;;;;;;47138:47;;47306:14;47292:10;:28;47288:328;;47337:19;47359:12;:18;47372:4;47359:18;;;;;;;;;;;;;;;:34;47378:14;47359:34;;;;;;;;;;;;47337:56;;47443:11;47410:12;:18;47423:4;47410:18;;;;;;;;;;;;;;;:30;47429:10;47410:30;;;;;;;;;;;:44;;;;47560:10;47527:17;:30;47545:11;47527:30;;;;;;;;;;;:43;;;;47322:294;47288:328;47712:17;:26;47730:7;47712:26;;;;;;;;;;;47705:33;;;47756:12;:18;47769:4;47756:18;;;;;;;;;;;;;;;:34;47775:14;47756:34;;;;;;;;;;;47749:41;;;46891:907;;46810:988;;:::o;48093:1079::-;48346:22;48391:1;48371:10;:17;;;;:21;;;;:::i;:::-;48346:46;;48403:18;48424:15;:24;48440:7;48424:24;;;;;;;;;;;;48403:45;;48775:19;48797:10;48808:14;48797:26;;;;;;;;:::i;:::-;;;;;;;;;;48775:48;;48861:11;48836:10;48847;48836:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48972:10;48941:15;:28;48957:11;48941:28;;;;;;;;;;;:41;;;;49113:15;:24;49129:7;49113:24;;;;;;;;;;;49106:31;;;49148:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48164:1008;;;48093:1079;:::o;45597:221::-;45682:14;45699:20;45716:2;45699:16;:20::i;:::-;45682:37;;45757:7;45730:12;:16;45743:2;45730:16;;;;;;;;;;;;;;;:24;45747:6;45730:24;;;;;;;;;;;:34;;;;45804:6;45775:17;:26;45793:7;45775:26;;;;;;;;;;;:35;;;;45671:147;45597:221;;:::o;9617:422::-;9677:4;9885:12;9996:7;9984:20;9976:28;;10030:1;10023:4;:8;10016:15;;;9617:422;;;:::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:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:::-;10146:3;10167:67;10231:2;10226:3;10167:67;:::i;:::-;10160:74;;10243:93;10332:3;10243:93;:::i;:::-;10361:2;10356:3;10352:12;10345:19;;10004:366;;;:::o;10376:::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10376:366;;;:::o;10748:::-;10890:3;10911:67;10975:2;10970:3;10911:67;:::i;:::-;10904:74;;10987:93;11076:3;10987:93;:::i;:::-;11105:2;11100:3;11096:12;11089:19;;10748:366;;;:::o;11120:::-;11262:3;11283:67;11347:2;11342:3;11283:67;:::i;:::-;11276:74;;11359:93;11448:3;11359:93;:::i;:::-;11477:2;11472:3;11468:12;11461:19;;11120:366;;;:::o;11492:::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11492:366;;;:::o;11864:::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;11864:366;;;:::o;12236:::-;12378:3;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12475:93;12564:3;12475:93;:::i;:::-;12593:2;12588:3;12584:12;12577:19;;12236:366;;;:::o;12608:::-;12750:3;12771:67;12835:2;12830:3;12771:67;:::i;:::-;12764:74;;12847:93;12936:3;12847:93;:::i;:::-;12965:2;12960:3;12956:12;12949:19;;12608:366;;;:::o;12980:::-;13122:3;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13219:93;13308:3;13219:93;:::i;:::-;13337:2;13332:3;13328:12;13321:19;;12980:366;;;:::o;13352:::-;13494:3;13515:67;13579:2;13574:3;13515:67;:::i;:::-;13508:74;;13591:93;13680:3;13591:93;:::i;:::-;13709:2;13704:3;13700:12;13693:19;;13352:366;;;:::o;13724:::-;13866:3;13887:67;13951:2;13946:3;13887:67;:::i;:::-;13880:74;;13963:93;14052:3;13963:93;:::i;:::-;14081:2;14076:3;14072:12;14065:19;;13724:366;;;:::o;14096:::-;14238:3;14259:67;14323:2;14318:3;14259:67;:::i;:::-;14252:74;;14335:93;14424:3;14335:93;:::i;:::-;14453:2;14448:3;14444:12;14437:19;;14096:366;;;:::o;14468:::-;14610:3;14631:67;14695:2;14690:3;14631:67;:::i;:::-;14624:74;;14707:93;14796:3;14707:93;:::i;:::-;14825:2;14820:3;14816:12;14809:19;;14468:366;;;:::o;14840:::-;14982:3;15003:67;15067:2;15062:3;15003:67;:::i;:::-;14996:74;;15079:93;15168:3;15079:93;:::i;:::-;15197:2;15192:3;15188:12;15181:19;;14840:366;;;:::o;15212:::-;15354:3;15375:67;15439:2;15434:3;15375:67;:::i;:::-;15368:74;;15451:93;15540:3;15451:93;:::i;:::-;15569:2;15564:3;15560:12;15553:19;;15212:366;;;:::o;15584:::-;15726:3;15747:67;15811:2;15806:3;15747:67;:::i;:::-;15740:74;;15823:93;15912:3;15823:93;:::i;:::-;15941:2;15936:3;15932:12;15925:19;;15584:366;;;:::o;15956:::-;16098:3;16119:67;16183:2;16178:3;16119:67;:::i;:::-;16112:74;;16195:93;16284:3;16195:93;:::i;:::-;16313:2;16308:3;16304:12;16297:19;;15956:366;;;:::o;16328:::-;16470:3;16491:67;16555:2;16550:3;16491:67;:::i;:::-;16484:74;;16567:93;16656:3;16567:93;:::i;:::-;16685:2;16680:3;16676:12;16669:19;;16328:366;;;:::o;16700:::-;16842:3;16863:67;16927:2;16922:3;16863:67;:::i;:::-;16856:74;;16939:93;17028:3;16939:93;:::i;:::-;17057:2;17052:3;17048:12;17041:19;;16700:366;;;:::o;17072:118::-;17159:24;17177:5;17159:24;:::i;:::-;17154:3;17147:37;17072:118;;:::o;17196:435::-;17376:3;17398:95;17489:3;17480:6;17398:95;:::i;:::-;17391:102;;17510:95;17601:3;17592:6;17510:95;:::i;:::-;17503:102;;17622:3;17615:10;;17196:435;;;;;:::o;17637:222::-;17730:4;17768:2;17757:9;17753:18;17745:26;;17781:71;17849:1;17838:9;17834:17;17825:6;17781:71;:::i;:::-;17637:222;;;;:::o;17865:640::-;18060:4;18098:3;18087:9;18083:19;18075:27;;18112:71;18180:1;18169:9;18165:17;18156:6;18112:71;:::i;:::-;18193:72;18261:2;18250:9;18246:18;18237:6;18193:72;:::i;:::-;18275;18343:2;18332:9;18328:18;18319:6;18275:72;:::i;:::-;18394:9;18388:4;18384:20;18379:2;18368:9;18364:18;18357:48;18422:76;18493:4;18484:6;18422:76;:::i;:::-;18414:84;;17865:640;;;;;;;:::o;18511:210::-;18598:4;18636:2;18625:9;18621:18;18613:26;;18649:65;18711:1;18700:9;18696:17;18687:6;18649:65;:::i;:::-;18511:210;;;;:::o;18727:313::-;18840:4;18878:2;18867:9;18863:18;18855:26;;18927:9;18921:4;18917:20;18913:1;18902:9;18898:17;18891:47;18955:78;19028:4;19019:6;18955:78;:::i;:::-;18947:86;;18727:313;;;;:::o;19046:419::-;19212:4;19250:2;19239:9;19235:18;19227:26;;19299:9;19293:4;19289:20;19285:1;19274:9;19270:17;19263:47;19327:131;19453:4;19327:131;:::i;:::-;19319:139;;19046:419;;;:::o;19471:::-;19637:4;19675:2;19664:9;19660:18;19652:26;;19724:9;19718:4;19714:20;19710:1;19699:9;19695:17;19688:47;19752:131;19878:4;19752:131;:::i;:::-;19744:139;;19471:419;;;:::o;19896:::-;20062:4;20100:2;20089:9;20085:18;20077:26;;20149:9;20143:4;20139:20;20135:1;20124:9;20120:17;20113:47;20177:131;20303:4;20177:131;:::i;:::-;20169:139;;19896:419;;;:::o;20321:::-;20487:4;20525:2;20514:9;20510:18;20502:26;;20574:9;20568:4;20564:20;20560:1;20549:9;20545:17;20538:47;20602:131;20728:4;20602:131;:::i;:::-;20594:139;;20321:419;;;:::o;20746:::-;20912:4;20950:2;20939:9;20935:18;20927:26;;20999:9;20993:4;20989:20;20985:1;20974:9;20970:17;20963:47;21027:131;21153:4;21027:131;:::i;:::-;21019:139;;20746:419;;;:::o;21171:::-;21337:4;21375:2;21364:9;21360:18;21352:26;;21424:9;21418:4;21414:20;21410:1;21399:9;21395:17;21388:47;21452:131;21578:4;21452:131;:::i;:::-;21444:139;;21171:419;;;:::o;21596:::-;21762:4;21800:2;21789:9;21785:18;21777:26;;21849:9;21843:4;21839:20;21835:1;21824:9;21820:17;21813:47;21877:131;22003:4;21877:131;:::i;:::-;21869:139;;21596:419;;;:::o;22021:::-;22187:4;22225:2;22214:9;22210:18;22202:26;;22274:9;22268:4;22264:20;22260:1;22249:9;22245:17;22238:47;22302:131;22428:4;22302:131;:::i;:::-;22294:139;;22021:419;;;:::o;22446:::-;22612:4;22650:2;22639:9;22635:18;22627:26;;22699:9;22693:4;22689:20;22685:1;22674:9;22670:17;22663:47;22727:131;22853:4;22727:131;:::i;:::-;22719:139;;22446:419;;;:::o;22871:::-;23037:4;23075:2;23064:9;23060:18;23052:26;;23124:9;23118:4;23114:20;23110:1;23099:9;23095:17;23088:47;23152:131;23278:4;23152:131;:::i;:::-;23144:139;;22871:419;;;:::o;23296:::-;23462:4;23500:2;23489:9;23485:18;23477:26;;23549:9;23543:4;23539:20;23535:1;23524:9;23520:17;23513:47;23577:131;23703:4;23577:131;:::i;:::-;23569:139;;23296:419;;;:::o;23721:::-;23887:4;23925:2;23914:9;23910:18;23902:26;;23974:9;23968:4;23964:20;23960:1;23949:9;23945:17;23938:47;24002:131;24128:4;24002:131;:::i;:::-;23994:139;;23721:419;;;:::o;24146:::-;24312:4;24350:2;24339:9;24335:18;24327:26;;24399:9;24393:4;24389:20;24385:1;24374:9;24370:17;24363:47;24427:131;24553:4;24427:131;:::i;:::-;24419:139;;24146:419;;;:::o;24571:::-;24737:4;24775:2;24764:9;24760:18;24752:26;;24824:9;24818:4;24814:20;24810:1;24799:9;24795:17;24788:47;24852:131;24978:4;24852:131;:::i;:::-;24844:139;;24571:419;;;:::o;24996:::-;25162:4;25200:2;25189:9;25185:18;25177:26;;25249:9;25243:4;25239:20;25235:1;25224:9;25220:17;25213:47;25277:131;25403:4;25277:131;:::i;:::-;25269:139;;24996:419;;;:::o;25421:::-;25587:4;25625:2;25614:9;25610:18;25602:26;;25674:9;25668:4;25664:20;25660:1;25649:9;25645:17;25638:47;25702:131;25828:4;25702:131;:::i;:::-;25694:139;;25421:419;;;:::o;25846:::-;26012:4;26050:2;26039:9;26035:18;26027:26;;26099:9;26093:4;26089:20;26085:1;26074:9;26070:17;26063:47;26127:131;26253:4;26127:131;:::i;:::-;26119:139;;25846:419;;;:::o;26271:::-;26437:4;26475:2;26464:9;26460:18;26452:26;;26524:9;26518:4;26514:20;26510:1;26499:9;26495:17;26488:47;26552:131;26678:4;26552:131;:::i;:::-;26544:139;;26271:419;;;:::o;26696:::-;26862:4;26900:2;26889:9;26885:18;26877:26;;26949:9;26943:4;26939:20;26935:1;26924:9;26920:17;26913:47;26977:131;27103:4;26977:131;:::i;:::-;26969:139;;26696:419;;;:::o;27121:::-;27287:4;27325:2;27314:9;27310:18;27302:26;;27374:9;27368:4;27364:20;27360:1;27349:9;27345:17;27338:47;27402:131;27528:4;27402:131;:::i;:::-;27394:139;;27121:419;;;:::o;27546:::-;27712:4;27750:2;27739:9;27735:18;27727:26;;27799:9;27793:4;27789:20;27785:1;27774:9;27770:17;27763:47;27827:131;27953:4;27827:131;:::i;:::-;27819:139;;27546:419;;;:::o;27971:::-;28137:4;28175:2;28164:9;28160:18;28152:26;;28224:9;28218:4;28214:20;28210:1;28199:9;28195:17;28188:47;28252:131;28378:4;28252:131;:::i;:::-;28244:139;;27971:419;;;:::o;28396:::-;28562:4;28600:2;28589:9;28585:18;28577:26;;28649:9;28643:4;28639:20;28635:1;28624:9;28620:17;28613:47;28677:131;28803:4;28677:131;:::i;:::-;28669:139;;28396:419;;;:::o;28821:222::-;28914:4;28952:2;28941:9;28937:18;28929:26;;28965:71;29033:1;29022:9;29018:17;29009:6;28965:71;:::i;:::-;28821:222;;;;:::o;29049:129::-;29083:6;29110:20;;:::i;:::-;29100:30;;29139:33;29167:4;29159:6;29139:33;:::i;:::-;29049:129;;;:::o;29184:75::-;29217:6;29250:2;29244:9;29234:19;;29184:75;:::o;29265:307::-;29326:4;29416:18;29408:6;29405:30;29402:56;;;29438:18;;:::i;:::-;29402:56;29476:29;29498:6;29476:29;:::i;:::-;29468:37;;29560:4;29554;29550:15;29542:23;;29265:307;;;:::o;29578:308::-;29640:4;29730:18;29722:6;29719:30;29716:56;;;29752:18;;:::i;:::-;29716:56;29790:29;29812:6;29790:29;:::i;:::-;29782:37;;29874:4;29868;29864:15;29856:23;;29578:308;;;:::o;29892:98::-;29943:6;29977:5;29971:12;29961:22;;29892:98;;;:::o;29996:99::-;30048:6;30082:5;30076:12;30066:22;;29996:99;;;:::o;30101:168::-;30184:11;30218:6;30213:3;30206:19;30258:4;30253:3;30249:14;30234:29;;30101:168;;;;:::o;30275:169::-;30359:11;30393:6;30388:3;30381:19;30433:4;30428:3;30424:14;30409:29;;30275:169;;;;:::o;30450:148::-;30552:11;30589:3;30574:18;;30450:148;;;;:::o;30604:305::-;30644:3;30663:20;30681:1;30663:20;:::i;:::-;30658:25;;30697:20;30715:1;30697:20;:::i;:::-;30692:25;;30851:1;30783:66;30779:74;30776:1;30773:81;30770:107;;;30857:18;;:::i;:::-;30770:107;30901:1;30898;30894:9;30887:16;;30604:305;;;;:::o;30915:185::-;30955:1;30972:20;30990:1;30972:20;:::i;:::-;30967:25;;31006:20;31024:1;31006:20;:::i;:::-;31001:25;;31045:1;31035:35;;31050:18;;:::i;:::-;31035:35;31092:1;31089;31085:9;31080:14;;30915:185;;;;:::o;31106:191::-;31146:4;31166:20;31184:1;31166:20;:::i;:::-;31161:25;;31200:20;31218:1;31200:20;:::i;:::-;31195:25;;31239:1;31236;31233:8;31230:34;;;31244:18;;:::i;:::-;31230:34;31289:1;31286;31282:9;31274:17;;31106:191;;;;:::o;31303:96::-;31340:7;31369:24;31387:5;31369:24;:::i;:::-;31358:35;;31303:96;;;:::o;31405:90::-;31439:7;31482:5;31475:13;31468:21;31457:32;;31405:90;;;:::o;31501:149::-;31537:7;31577:66;31570:5;31566:78;31555:89;;31501:149;;;:::o;31656:126::-;31693:7;31733:42;31726:5;31722:54;31711:65;;31656:126;;;:::o;31788:77::-;31825:7;31854:5;31843:16;;31788:77;;;:::o;31871:154::-;31955:6;31950:3;31945;31932:30;32017:1;32008:6;32003:3;31999:16;31992:27;31871:154;;;:::o;32031:307::-;32099:1;32109:113;32123:6;32120:1;32117:13;32109:113;;;32208:1;32203:3;32199:11;32193:18;32189:1;32184:3;32180:11;32173:39;32145:2;32142:1;32138:10;32133:15;;32109:113;;;32240:6;32237:1;32234:13;32231:101;;;32320:1;32311:6;32306:3;32302:16;32295:27;32231:101;32080:258;32031:307;;;:::o;32344:320::-;32388:6;32425:1;32419:4;32415:12;32405:22;;32472:1;32466:4;32462:12;32493:18;32483:81;;32549:4;32541:6;32537:17;32527:27;;32483:81;32611:2;32603:6;32600:14;32580:18;32577:38;32574:84;;;32630:18;;:::i;:::-;32574:84;32395:269;32344:320;;;:::o;32670:281::-;32753:27;32775:4;32753:27;:::i;:::-;32745:6;32741:40;32883:6;32871:10;32868:22;32847:18;32835:10;32832:34;32829:62;32826:88;;;32894:18;;:::i;:::-;32826:88;32934:10;32930:2;32923:22;32713:238;32670:281;;:::o;32957:233::-;32996:3;33019:24;33037:5;33019:24;:::i;:::-;33010:33;;33065:66;33058:5;33055:77;33052:103;;;33135:18;;:::i;:::-;33052:103;33182:1;33175:5;33171:13;33164:20;;32957:233;;;:::o;33196:176::-;33228:1;33245:20;33263:1;33245:20;:::i;:::-;33240:25;;33279:20;33297:1;33279:20;:::i;:::-;33274:25;;33318:1;33308:35;;33323:18;;:::i;:::-;33308:35;33364:1;33361;33357:9;33352:14;;33196:176;;;;:::o;33378:180::-;33426:77;33423:1;33416:88;33523:4;33520:1;33513:15;33547:4;33544:1;33537:15;33564:180;33612:77;33609:1;33602:88;33709:4;33706:1;33699:15;33733:4;33730:1;33723:15;33750:180;33798:77;33795:1;33788:88;33895:4;33892:1;33885:15;33919:4;33916:1;33909:15;33936:180;33984:77;33981:1;33974:88;34081:4;34078:1;34071:15;34105:4;34102:1;34095:15;34122:180;34170:77;34167:1;34160:88;34267:4;34264:1;34257:15;34291:4;34288:1;34281:15;34308:180;34356:77;34353:1;34346:88;34453:4;34450:1;34443:15;34477:4;34474:1;34467:15;34494:117;34603:1;34600;34593:12;34617:117;34726:1;34723;34716:12;34740:117;34849:1;34846;34839:12;34863:117;34972:1;34969;34962:12;34986:102;35027:6;35078:2;35074:7;35069:2;35062:5;35058:14;35054:28;35044:38;;34986:102;;;:::o;35094:222::-;35234:34;35230:1;35222:6;35218:14;35211:58;35303:5;35298:2;35290:6;35286:15;35279:30;35094:222;:::o;35322:230::-;35462:34;35458:1;35450:6;35446:14;35439:58;35531:13;35526:2;35518:6;35514:15;35507:38;35322:230;:::o;35558:237::-;35698:34;35694:1;35686:6;35682:14;35675:58;35767:20;35762:2;35754:6;35750:15;35743:45;35558:237;:::o;35801:225::-;35941:34;35937:1;35929:6;35925:14;35918:58;36010:8;36005:2;35997:6;35993:15;35986:33;35801:225;:::o;36032:178::-;36172:30;36168:1;36160:6;36156:14;36149:54;36032:178;:::o;36216:223::-;36356:34;36352:1;36344:6;36340:14;36333:58;36425:6;36420:2;36412:6;36408:15;36401:31;36216:223;:::o;36445:175::-;36585:27;36581:1;36573:6;36569:14;36562:51;36445:175;:::o;36626:231::-;36766:34;36762:1;36754:6;36750:14;36743:58;36835:14;36830:2;36822:6;36818:15;36811:39;36626:231;:::o;36863:179::-;37003:31;36999:1;36991:6;36987:14;36980:55;36863:179;:::o;37048:243::-;37188:34;37184:1;37176:6;37172:14;37165:58;37257:26;37252:2;37244:6;37240:15;37233:51;37048:243;:::o;37297:229::-;37437:34;37433:1;37425:6;37421:14;37414:58;37506:12;37501:2;37493:6;37489:15;37482:37;37297:229;:::o;37532:228::-;37672:34;37668:1;37660:6;37656:14;37649:58;37741:11;37736:2;37728:6;37724:15;37717:36;37532:228;:::o;37766:182::-;37906:34;37902:1;37894:6;37890:14;37883:58;37766:182;:::o;37954:::-;38094:34;38090:1;38082:6;38078:14;38071:58;37954:182;:::o;38142:231::-;38282:34;38278:1;38270:6;38266:14;38259:58;38351:14;38346:2;38338:6;38334:15;38327:39;38142:231;:::o;38379:182::-;38519:34;38515:1;38507:6;38503:14;38496:58;38379:182;:::o;38567:228::-;38707:34;38703:1;38695:6;38691:14;38684:58;38776:11;38771:2;38763:6;38759:15;38752:36;38567:228;:::o;38801:234::-;38941:34;38937:1;38929:6;38925:14;38918:58;39010:17;39005:2;38997:6;38993:15;38986:42;38801:234;:::o;39041:220::-;39181:34;39177:1;39169:6;39165:14;39158:58;39250:3;39245:2;39237:6;39233:15;39226:28;39041:220;:::o;39267:236::-;39407:34;39403:1;39395:6;39391:14;39384:58;39476:19;39471:2;39463:6;39459:15;39452:44;39267:236;:::o;39509:231::-;39649:34;39645:1;39637:6;39633:14;39626:58;39718:14;39713:2;39705:6;39701:15;39694:39;39509:231;:::o;39746:222::-;39886:34;39882:1;39874:6;39870:14;39863:58;39955:5;39950:2;39942:6;39938:15;39931:30;39746:222;:::o;39974:182::-;40114:34;40110:1;40102:6;40098:14;40091:58;39974:182;:::o;40162:122::-;40235:24;40253:5;40235:24;:::i;:::-;40228:5;40225:35;40215:63;;40274:1;40271;40264:12;40215:63;40162:122;:::o;40290:116::-;40360:21;40375:5;40360:21;:::i;:::-;40353:5;40350:32;40340:60;;40396:1;40393;40386:12;40340:60;40290:116;:::o;40412:120::-;40484:23;40501:5;40484:23;:::i;:::-;40477:5;40474:34;40464:62;;40522:1;40519;40512:12;40464:62;40412:120;:::o;40538:122::-;40611:24;40629:5;40611:24;:::i;:::-;40604:5;40601:35;40591:63;;40650:1;40647;40640:12;40591:63;40538:122;:::o
Swarm Source
ipfs://fc8d513571cac83ec91c59fc536ec8d60f6758236972ddb5c1b917ecfc9812db
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.