ERC-721
Overview
Max Total Supply
10,000 FHC
Holders
2,038
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 FHCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FiveHeadCircle
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-14 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) 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; 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"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @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); // 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 Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: contracts/FiveHeadCircle.sol pragma solidity >=0.7.0 <0.9.0; contract FiveHeadCircle is ERC721, Ownable { using Strings for uint256; using Counters for Counters.Counter; Counters.Counter private supply; // URI string public uriPrefix = ""; string public uriPrefixSinnera = ""; string public uriPrefixTabbatab = ""; string public uriPrefixRuppsten = ""; string public uriPrefixHonnedor = ""; string public uriSuffix = ".json"; string public fhc_provenance = ""; string public UNREVEALED_URI = "ipfs://QmUt6nQ13vQR6GginE3V2mn2XAsKpAA5YTeNVFF8DoBKfd/"; // Provenance uint256 public startingIndexBlock; uint256 public startingIndex; // Project uint256 public cost = 0.08 ether; uint256 public MAX_SUPPLY = 10000; uint256 public maxMintAmountPerTx = 5; // Config bool public paused = true; struct FiveHead { string faction; } mapping (uint256 => FiveHead) public fiveHeads; constructor() ERC721("Five Head Circle", "FHC") {} modifier mintCompliance(uint256 _mintAmount) { require(supply.current() + _mintAmount <= MAX_SUPPLY, "Max supply exceeded!"); _; } function totalSupply() public view returns (uint256) { return supply.current(); } function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) { require(!paused, "The contract is paused!"); require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!"); require(msg.value >= cost * _mintAmount, "Insufficient funds!"); _mintLoop(msg.sender, _mintAmount); // Sets the starting index block once when all FHC are minted if (startingIndexBlock == 0 && totalSupply() == MAX_SUPPLY) { startingIndexBlock = block.number; } } // Reserve FHC (Giveaways) function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner { require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx * 10, "Invalid mint amount!"); _mintLoop(_receiver, _mintAmount); if (startingIndexBlock == 0 && totalSupply() == MAX_SUPPLY) { startingIndexBlock = block.number; } } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = 1; uint256 ownedTokenIndex = 0; while (ownedTokenIndex < ownerTokenCount && currentTokenId <= MAX_SUPPLY) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI; string memory sequenceId; if(startingIndex > 0) { // Metadata is revealed thus the baseURI based on the faction is returned sequenceId = (((_tokenId + startingIndex - 2) % MAX_SUPPLY) + 1).toString(); FiveHead memory currentFiveHead = fiveHeads[_tokenId]; baseURI = _baseURI(bytes(currentFiveHead.faction)); } else { // Metadata is not revealed yet return UNREVEALED_URI; } return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, sequenceId, uriSuffix)) : ""; } function setFaction(uint256 _tokenId, string memory _newFaction) public { require(msg.sender == ownerOf(_tokenId), "You are not the owner of this NFT."); require(startingIndex != 0, "You can join a faction once the metadata have been revealed."); require(bytes(getFaction(_tokenId)).length == 0, "You can join a faction only once. Stay loyal."); bytes memory strBytes = bytes(_newFaction); bytes memory sinnera = bytes("Sinnera"); bytes memory tabbatab = bytes("Tabbatab"); bytes memory ruppsten = bytes("Ruppsten"); bytes memory honnedor = bytes("Honnedor"); require(_compareStrings(strBytes, sinnera) || _compareStrings(strBytes, tabbatab) || _compareStrings(strBytes, ruppsten) || _compareStrings(strBytes, honnedor), "Please enter a valid faction (Sinnera, Tabbatab, Ruppsten, Honnedor). Check first letter uppercase."); FiveHead storage currentFiveHead = fiveHeads[_tokenId]; currentFiveHead.faction = _newFaction; } function getFaction(uint256 _tokenId) public view returns (string memory faction) { FiveHead memory currentFiveHead = fiveHeads[_tokenId]; return currentFiveHead.faction; } function setStartingIndex() public onlyOwner { require(startingIndex == 0, "Starting index is already set"); require(startingIndexBlock != 0, "Starting index block must be set"); startingIndex = uint(blockhash(startingIndexBlock)) % MAX_SUPPLY + 1; // If function is called late if (block.number - startingIndexBlock > 255) { startingIndex = uint(blockhash(block.number - 1)) % MAX_SUPPLY + 1; } // Prevent default sequence starting from 1 if (startingIndex == 1) { startingIndex = startingIndex += 1; } } function emergencySetStartingIndexBlock() public onlyOwner { require(startingIndex == 0, "Starting index is already set"); startingIndexBlock = block.number; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx; } function setUriPrefix(string memory _uriPrefix, string memory faction) public onlyOwner { if(_compareStrings(bytes(faction), bytes("Base"))) { uriPrefix = _uriPrefix; } else if(_compareStrings(bytes(faction), bytes("Sinnera"))) { uriPrefixSinnera = _uriPrefix; } else if(_compareStrings(bytes(faction), bytes("Tabbatab"))) { uriPrefixTabbatab = _uriPrefix; } else if(_compareStrings(bytes(faction), bytes("Ruppsten"))) { uriPrefixRuppsten = _uriPrefix; } else if(_compareStrings(bytes(faction), bytes("Honnedor"))) { uriPrefixHonnedor = _uriPrefix; } } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setProvenanceHash(string memory provenanceHash) public onlyOwner { require(bytes(fhc_provenance).length == 0, "Provenance hash can only be set once!"); fhc_provenance = provenanceHash; } function withdraw() public onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } function _mintLoop(address _receiver, uint256 _mintAmount) internal { for (uint256 i = 0; i < _mintAmount; i++) { supply.increment(); FiveHead memory newFiveHead = FiveHead(""); fiveHeads[supply.current()] = newFiveHead; _safeMint(_receiver, supply.current()); } } function _baseURI(bytes memory faction) internal view virtual returns (string memory) { if(faction.length == 0) { return uriPrefix; } else if(_compareStrings(faction, bytes("Sinnera"))) { return uriPrefixSinnera; } else if (_compareStrings(faction, bytes("Tabbatab"))) { return uriPrefixTabbatab; } else if (_compareStrings(faction, bytes("Ruppsten"))) { return uriPrefixRuppsten; } else { return uriPrefixHonnedor; } } function _compareStrings (bytes memory a, bytes memory b) private pure returns (bool) { if(a.length != b.length) { return false; } else { return keccak256(a) == keccak256(b); } } }
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":[],"name":"UNREVEALED_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fhc_provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"fiveHeads","outputs":[{"internalType":"string","name":"faction","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFaction","outputs":[{"internalType":"string","name":"faction","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_newFaction","type":"string"}],"name":"setFaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"},{"internalType":"string","name":"faction","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriPrefixHonnedor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriPrefixRuppsten","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriPrefixSinnera","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriPrefixTabbatab","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600890805190602001906200002b92919062000348565b5060405180602001604052806000815250600990805190602001906200005392919062000348565b5060405180602001604052806000815250600a90805190602001906200007b92919062000348565b5060405180602001604052806000815250600b9080519060200190620000a392919062000348565b5060405180602001604052806000815250600c9080519060200190620000cb92919062000348565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90805190602001906200011992919062000348565b5060405180602001604052806000815250600e90805190602001906200014192919062000348565b5060405180606001604052806036815260200162005cd660369139600f90805190602001906200017392919062000348565b5067011c37937e08000060125561271060135560056014556001601560006101000a81548160ff021916908315150217905550348015620001b357600080fd5b506040518060400160405280601081526020017f46697665204865616420436972636c65000000000000000000000000000000008152506040518060400160405280600381526020017f464843000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200023892919062000348565b5080600190805190602001906200025192919062000348565b50505062000274620002686200027a60201b60201c565b6200028260201b60201c565b6200045d565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200035690620003f8565b90600052602060002090601f0160209004810192826200037a5760008555620003c6565b82601f106200039557805160ff1916838001178555620003c6565b82800160010185558215620003c6579182015b82811115620003c5578251825591602001919060010190620003a8565b5b509050620003d59190620003d9565b5090565b5b80821115620003f4576000816000905550600101620003da565b5090565b600060028204905060018216806200041157607f821691505b602082108114156200042857620004276200042e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615869806200046d6000396000f3fe60806040526004361061027d5760003560e01c8063715018a61161014f578063b071401b116100c1578063e36d64981161007a578063e36d649814610967578063e77f647914610992578063e985e9c5146109bd578063e9866550146109fa578063efbd73f414610a11578063f2fde38b14610a3a5761027d565b8063b071401b14610847578063b88d4fde14610870578063c577b91f14610899578063c87b56dd146108d6578063cb774d4714610913578063ddcee2531461093e5761027d565b806394354fd01161011357806394354fd01461074657806395d89b4114610771578063a0291d0f1461079c578063a0712d68146107c5578063a22cb465146107e1578063a8a150b81461080a5761027d565b8063715018a6146106975780637d17fcbe146106ae5780637f2ae587146106c55780638205d99f146106f05780638da5cb5b1461071b5761027d565b806332cb6b0c116101f3578063507862d1116101ac578063507862d1146105715780635503a0e81461059c5780635c975abb146105c757806362b99ad4146105f25780636352211e1461061d57806370a082311461065a5761027d565b806332cb6b0c146104755780633ccfd60b146104a057806342842e0e146104b7578063438b6300146104e057806344a0d68a1461051d57806347da37bc146105465761027d565b806313faede61161024557806313faede61461037957806316ba10e0146103a457806316c38b3c146103cd57806318160ddd146103f657806323b872dd1461042157806329703edf1461044a5761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780631096952314610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613fc1565b610a63565b6040516102b6919061481c565b60405180910390f35b3480156102cb57600080fd5b506102d4610b45565b6040516102e19190614837565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c91906140dc565b610bd7565b60405161031e9190614793565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613f54565b610c5c565b005b34801561035c57600080fd5b506103776004803603810190610372919061401b565b610d74565b005b34801561038557600080fd5b5061038e610e5b565b60405161039b9190614bb9565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c6919061401b565b610e61565b005b3480156103d957600080fd5b506103f460048036038101906103ef9190613f94565b610ef7565b005b34801561040257600080fd5b5061040b610f90565b6040516104189190614bb9565b60405180910390f35b34801561042d57600080fd5b5061044860048036038101906104439190613e3e565b610fa1565b005b34801561045657600080fd5b5061045f611001565b60405161046c9190614837565b60405180910390f35b34801561048157600080fd5b5061048a61108f565b6040516104979190614bb9565b60405180910390f35b3480156104ac57600080fd5b506104b5611095565b005b3480156104c357600080fd5b506104de60048036038101906104d99190613e3e565b611191565b005b3480156104ec57600080fd5b5061050760048036038101906105029190613dd1565b6111b1565b60405161051491906147fa565b60405180910390f35b34801561052957600080fd5b50610544600480360381019061053f91906140dc565b6112bc565b005b34801561055257600080fd5b5061055b611342565b6040516105689190614837565b60405180910390f35b34801561057d57600080fd5b506105866113d0565b6040516105939190614837565b60405180910390f35b3480156105a857600080fd5b506105b161145e565b6040516105be9190614837565b60405180910390f35b3480156105d357600080fd5b506105dc6114ec565b6040516105e9919061481c565b60405180910390f35b3480156105fe57600080fd5b506106076114ff565b6040516106149190614837565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f91906140dc565b61158d565b6040516106519190614793565b60405180910390f35b34801561066657600080fd5b50610681600480360381019061067c9190613dd1565b61163f565b60405161068e9190614bb9565b60405180910390f35b3480156106a357600080fd5b506106ac6116f7565b005b3480156106ba57600080fd5b506106c361177f565b005b3480156106d157600080fd5b506106da611849565b6040516106e79190614837565b60405180910390f35b3480156106fc57600080fd5b506107056118d7565b6040516107129190614837565b60405180910390f35b34801561072757600080fd5b50610730611965565b60405161073d9190614793565b60405180910390f35b34801561075257600080fd5b5061075b61198f565b6040516107689190614bb9565b60405180910390f35b34801561077d57600080fd5b50610786611995565b6040516107939190614837565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190614149565b611a27565b005b6107df60048036038101906107da91906140dc565b611cd2565b005b3480156107ed57600080fd5b5061080860048036038101906108039190613f14565b611e52565b005b34801561081657600080fd5b50610831600480360381019061082c91906140dc565b611e68565b60405161083e9190614837565b60405180910390f35b34801561085357600080fd5b5061086e600480360381019061086991906140dc565b611f2b565b005b34801561087c57600080fd5b5061089760048036038101906108929190613e91565b611fb1565b005b3480156108a557600080fd5b506108c060048036038101906108bb91906140dc565b612013565b6040516108cd9190614837565b60405180910390f35b3480156108e257600080fd5b506108fd60048036038101906108f891906140dc565b6120b9565b60405161090a9190614837565b60405180910390f35b34801561091f57600080fd5b506109286122f9565b6040516109359190614bb9565b60405180910390f35b34801561094a57600080fd5b5061096560048036038101906109609190614064565b6122ff565b005b34801561097357600080fd5b5061097c61255f565b6040516109899190614bb9565b60405180910390f35b34801561099e57600080fd5b506109a7612565565b6040516109b49190614837565b60405180910390f35b3480156109c957600080fd5b506109e460048036038101906109df9190613dfe565b6125f3565b6040516109f1919061481c565b60405180910390f35b348015610a0657600080fd5b50610a0f612687565b005b348015610a1d57600080fd5b50610a386004803603810190610a339190614109565b612828565b005b348015610a4657600080fd5b50610a616004803603810190610a5c9190613dd1565b612991565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b3e5750610b3d82612a89565b5b9050919050565b606060008054610b5490614ec2565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8090614ec2565b8015610bcd5780601f10610ba257610100808354040283529160200191610bcd565b820191906000526020600020905b815481529060010190602001808311610bb057829003601f168201915b5050505050905090565b6000610be282612af3565b610c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1890614a19565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c678261158d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf90614ad9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cf7612b5f565b73ffffffffffffffffffffffffffffffffffffffff161480610d265750610d2581610d20612b5f565b6125f3565b5b610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c90614959565b60405180910390fd5b610d6f8383612b67565b505050565b610d7c612b5f565b73ffffffffffffffffffffffffffffffffffffffff16610d9a611965565b73ffffffffffffffffffffffffffffffffffffffff1614610df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de790614a39565b60405180910390fd5b6000600e8054610dff90614ec2565b905014610e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3890614b59565b60405180910390fd5b80600e9080519060200190610e57929190613be5565b5050565b60125481565b610e69612b5f565b73ffffffffffffffffffffffffffffffffffffffff16610e87611965565b73ffffffffffffffffffffffffffffffffffffffff1614610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed490614a39565b60405180910390fd5b80600d9080519060200190610ef3929190613be5565b5050565b610eff612b5f565b73ffffffffffffffffffffffffffffffffffffffff16610f1d611965565b73ffffffffffffffffffffffffffffffffffffffff1614610f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6a90614a39565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b6000610f9c6007612c20565b905090565b610fb2610fac612b5f565b82612c2e565b610ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe890614b79565b60405180910390fd5b610ffc838383612d0c565b505050565b600e805461100e90614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461103a90614ec2565b80156110875780601f1061105c57610100808354040283529160200191611087565b820191906000526020600020905b81548152906001019060200180831161106a57829003601f168201915b505050505081565b60135481565b61109d612b5f565b73ffffffffffffffffffffffffffffffffffffffff166110bb611965565b73ffffffffffffffffffffffffffffffffffffffff1614611111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110890614a39565b60405180910390fd5b600061111b611965565b73ffffffffffffffffffffffffffffffffffffffff164760405161113e9061477e565b60006040518083038185875af1925050503d806000811461117b576040519150601f19603f3d011682016040523d82523d6000602084013e611180565b606091505b505090508061118e57600080fd5b50565b6111ac83838360405180602001604052806000815250611fb1565b505050565b606060006111be8361163f565b905060008167ffffffffffffffff8111156111dc576111db61505b565b5b60405190808252806020026020018201604052801561120a5781602001602082028036833780820191505090505b50905060006001905060005b838110801561122757506013548211155b156112b05760006112378361158d565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561129c57828483815181106112815761128061502c565b5b602002602001018181525050818061129890614f25565b9250505b82806112a790614f25565b93505050611216565b82945050505050919050565b6112c4612b5f565b73ffffffffffffffffffffffffffffffffffffffff166112e2611965565b73ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90614a39565b60405180910390fd5b8060128190555050565b600b805461134f90614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461137b90614ec2565b80156113c85780601f1061139d576101008083540402835291602001916113c8565b820191906000526020600020905b8154815290600101906020018083116113ab57829003601f168201915b505050505081565b600f80546113dd90614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461140990614ec2565b80156114565780601f1061142b57610100808354040283529160200191611456565b820191906000526020600020905b81548152906001019060200180831161143957829003601f168201915b505050505081565b600d805461146b90614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461149790614ec2565b80156114e45780601f106114b9576101008083540402835291602001916114e4565b820191906000526020600020905b8154815290600101906020018083116114c757829003601f168201915b505050505081565b601560009054906101000a900460ff1681565b6008805461150c90614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461153890614ec2565b80156115855780601f1061155a57610100808354040283529160200191611585565b820191906000526020600020905b81548152906001019060200180831161156857829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906149b9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a790614999565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116ff612b5f565b73ffffffffffffffffffffffffffffffffffffffff1661171d611965565b73ffffffffffffffffffffffffffffffffffffffff1614611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a90614a39565b60405180910390fd5b61177d6000612f68565b565b611787612b5f565b73ffffffffffffffffffffffffffffffffffffffff166117a5611965565b73ffffffffffffffffffffffffffffffffffffffff16146117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f290614a39565b60405180910390fd5b600060115414611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790614939565b60405180910390fd5b43601081905550565b600c805461185690614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461188290614ec2565b80156118cf5780601f106118a4576101008083540402835291602001916118cf565b820191906000526020600020905b8154815290600101906020018083116118b257829003601f168201915b505050505081565b600a80546118e490614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461191090614ec2565b801561195d5780601f106119325761010080835404028352916020019161195d565b820191906000526020600020905b81548152906001019060200180831161194057829003601f168201915b505050505081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60145481565b6060600180546119a490614ec2565b80601f01602080910402602001604051908101604052809291908181526020018280546119d090614ec2565b8015611a1d5780601f106119f257610100808354040283529160200191611a1d565b820191906000526020600020905b815481529060010190602001808311611a0057829003601f168201915b5050505050905090565b611a308261158d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9490614ab9565b60405180910390fd5b60006011541415611ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ada906149d9565b60405180910390fd5b6000611aee83611e68565b5114611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2690614979565b60405180910390fd5b600081905060006040518060400160405280600781526020017f53696e6e65726100000000000000000000000000000000000000000000000000815250905060006040518060400160405280600881526020017f5461626261746162000000000000000000000000000000000000000000000000815250905060006040518060400160405280600881526020017f527570707374656e000000000000000000000000000000000000000000000000815250905060006040518060400160405280600881526020017f486f6e6e65646f720000000000000000000000000000000000000000000000008152509050611c26858561302e565b80611c375750611c36858461302e565b5b80611c485750611c47858361302e565b5b80611c595750611c58858261302e565b5b611c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8f90614af9565b60405180910390fd5b600060166000898152602001908152602001600020905086816000019080519060200190611cc7929190613be5565b505050505050505050565b8060135481611ce16007612c20565b611ceb9190614cf7565b1115611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390614b39565b60405180910390fd5b601560009054906101000a900460ff1615611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390614a59565b60405180910390fd5b600082118015611d8e57506014548211155b611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc4906148b9565b60405180910390fd5b81601254611ddb9190614d7e565b341015611e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1490614b99565b60405180910390fd5b611e27338361305c565b6000601054148015611e415750601354611e3f610f90565b145b15611e4e57436010819055505b5050565b611e64611e5d612b5f565b83836130fc565b5050565b6060600060166000848152602001908152602001600020604051806020016040529081600082018054611e9a90614ec2565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec690614ec2565b8015611f135780601f10611ee857610100808354040283529160200191611f13565b820191906000526020600020905b815481529060010190602001808311611ef657829003601f168201915b50505050508152505090508060000151915050919050565b611f33612b5f565b73ffffffffffffffffffffffffffffffffffffffff16611f51611965565b73ffffffffffffffffffffffffffffffffffffffff1614611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e90614a39565b60405180910390fd5b8060148190555050565b611fc2611fbc612b5f565b83612c2e565b612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff890614b79565b60405180910390fd5b61200d84848484613269565b50505050565b601660205280600052604060002060009150905080600001805461203690614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461206290614ec2565b80156120af5780601f10612084576101008083540402835291602001916120af565b820191906000526020600020905b81548152906001019060200180831161209257829003601f168201915b5050505050905081565b60606120c482612af3565b612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa90614a99565b60405180910390fd5b606080600060115411156122175761214c60016013546002601154886121299190614cf7565b6121339190614dd8565b61213d9190614f6e565b6121479190614cf7565b6132c5565b905060006016600086815260200190815260200160002060405180602001604052908160008201805461217e90614ec2565b80601f01602080910402602001604051908101604052809291908181526020018280546121aa90614ec2565b80156121f75780601f106121cc576101008083540402835291602001916121f7565b820191906000526020600020905b8154815290600101906020018083116121da57829003601f168201915b505050505081525050905061220f8160000151613426565b9250506122ab565b600f805461222490614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461225090614ec2565b801561229d5780601f106122725761010080835404028352916020019161229d565b820191906000526020600020905b81548152906001019060200180831161228057829003601f168201915b5050505050925050506122f4565b60008251116122c957604051806020016040528060008152506122ef565b8181600d6040516020016122df9392919061474d565b6040516020818303038152906040525b925050505b919050565b60115481565b612307612b5f565b73ffffffffffffffffffffffffffffffffffffffff16612325611965565b73ffffffffffffffffffffffffffffffffffffffff161461237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614a39565b60405180910390fd5b6123ba816040518060400160405280600481526020017f426173650000000000000000000000000000000000000000000000000000000081525061302e565b156123db5781600890805190602001906123d5929190613be5565b5061255b565b61241a816040518060400160405280600781526020017f53696e6e6572610000000000000000000000000000000000000000000000000081525061302e565b1561243b578160099080519060200190612435929190613be5565b5061255a565b61247a816040518060400160405280600881526020017f546162626174616200000000000000000000000000000000000000000000000081525061302e565b1561249b5781600a9080519060200190612495929190613be5565b50612559565b6124da816040518060400160405280600881526020017f527570707374656e00000000000000000000000000000000000000000000000081525061302e565b156124fb5781600b90805190602001906124f5929190613be5565b50612558565b61253a816040518060400160405280600881526020017f486f6e6e65646f7200000000000000000000000000000000000000000000000081525061302e565b156125575781600c9080519060200190612555929190613be5565b505b5b5b5b5b5050565b60105481565b6009805461257290614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461259e90614ec2565b80156125eb5780601f106125c0576101008083540402835291602001916125eb565b820191906000526020600020905b8154815290600101906020018083116125ce57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61268f612b5f565b73ffffffffffffffffffffffffffffffffffffffff166126ad611965565b73ffffffffffffffffffffffffffffffffffffffff1614612703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fa90614a39565b60405180910390fd5b600060115414612748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273f90614939565b60405180910390fd5b6000601054141561278e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278590614b19565b60405180910390fd5b60016013546010544060001c6127a49190614f6e565b6127ae9190614cf7565b60118190555060ff601054436127c49190614dd8565b11156127fb5760016013546001436127dc9190614dd8565b4060001c6127ea9190614f6e565b6127f49190614cf7565b6011819055505b60016011541415612826576001601160008282546128199190614cf7565b9250508190556011819055505b565b81601354816128376007612c20565b6128419190614cf7565b1115612882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287990614b39565b60405180910390fd5b61288a612b5f565b73ffffffffffffffffffffffffffffffffffffffff166128a8611965565b73ffffffffffffffffffffffffffffffffffffffff16146128fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f590614a39565b60405180910390fd5b60008311801561291c5750600a6014546129189190614d7e565b8311155b61295b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612952906148b9565b60405180910390fd5b612965828461305c565b600060105414801561297f575060135461297d610f90565b145b1561298c57436010819055505b505050565b612999612b5f565b73ffffffffffffffffffffffffffffffffffffffff166129b7611965565b73ffffffffffffffffffffffffffffffffffffffff1614612a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0490614a39565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7490614879565b60405180910390fd5b612a8681612f68565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612bda8361158d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000612c3982612af3565b612c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6f90614919565b60405180910390fd5b6000612c838361158d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612cf257508373ffffffffffffffffffffffffffffffffffffffff16612cda84610bd7565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d035750612d0281856125f3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d2c8261158d565b73ffffffffffffffffffffffffffffffffffffffff1614612d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7990614a79565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de9906148d9565b60405180910390fd5b612dfd8383836137d9565b612e08600082612b67565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e589190614dd8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eaf9190614cf7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081518351146130425760009050613056565b818051906020012083805190602001201490505b92915050565b60005b818110156130f75761307160076137de565b6000604051806020016040528060405180602001604052806000815250815250905080601660006130a26007612c20565b815260200190815260200160002060008201518160000190805190602001906130cc929190613be5565b509050506130e3846130de6007612c20565b6137f4565b5080806130ef90614f25565b91505061305f565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561316b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613162906148f9565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161325c919061481c565b60405180910390a3505050565b613274848484612d0c565b61328084848484613812565b6132bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b690614859565b60405180910390fd5b50505050565b6060600082141561330d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613421565b600082905060005b6000821461333f57808061332890614f25565b915050600a826133389190614d4d565b9150613315565b60008167ffffffffffffffff81111561335b5761335a61505b565b5b6040519080825280601f01601f19166020018201604052801561338d5781602001600182028036833780820191505090505b5090505b6000851461341a576001826133a69190614dd8565b9150600a856133b59190614f6e565b60306133c19190614cf7565b60f81b8183815181106133d7576133d661502c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134139190614d4d565b9450613391565b8093505050505b919050565b60606000825114156134c4576008805461343f90614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461346b90614ec2565b80156134b85780601f1061348d576101008083540402835291602001916134b8565b820191906000526020600020905b81548152906001019060200180831161349b57829003601f168201915b505050505090506137d4565b613503826040518060400160405280600781526020017f53696e6e6572610000000000000000000000000000000000000000000000000081525061302e565b1561359a576009805461351590614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461354190614ec2565b801561358e5780601f106135635761010080835404028352916020019161358e565b820191906000526020600020905b81548152906001019060200180831161357157829003601f168201915b505050505090506137d4565b6135d9826040518060400160405280600881526020017f546162626174616200000000000000000000000000000000000000000000000081525061302e565b1561367057600a80546135eb90614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461361790614ec2565b80156136645780601f1061363957610100808354040283529160200191613664565b820191906000526020600020905b81548152906001019060200180831161364757829003601f168201915b505050505090506137d4565b6136af826040518060400160405280600881526020017f527570707374656e00000000000000000000000000000000000000000000000081525061302e565b1561374657600b80546136c190614ec2565b80601f01602080910402602001604051908101604052809291908181526020018280546136ed90614ec2565b801561373a5780601f1061370f5761010080835404028352916020019161373a565b820191906000526020600020905b81548152906001019060200180831161371d57829003601f168201915b505050505090506137d4565b600c805461375390614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461377f90614ec2565b80156137cc5780601f106137a1576101008083540402835291602001916137cc565b820191906000526020600020905b8154815290600101906020018083116137af57829003601f168201915b505050505090505b919050565b505050565b6001816000016000828254019250508190555050565b61380e8282604051806020016040528060008152506139a9565b5050565b60006138338473ffffffffffffffffffffffffffffffffffffffff16613a04565b1561399c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261385c612b5f565b8786866040518563ffffffff1660e01b815260040161387e94939291906147ae565b602060405180830381600087803b15801561389857600080fd5b505af19250505080156138c957506040513d601f19601f820116820180604052508101906138c69190613fee565b60015b61394c573d80600081146138f9576040519150601f19603f3d011682016040523d82523d6000602084013e6138fe565b606091505b50600081511415613944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393b90614859565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506139a1565b600190505b949350505050565b6139b38383613a17565b6139c06000848484613812565b6139ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f690614859565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7e906149f9565b60405180910390fd5b613a9081612af3565b15613ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac790614899565b60405180910390fd5b613adc600083836137d9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b2c9190614cf7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613bf190614ec2565b90600052602060002090601f016020900481019282613c135760008555613c5a565b82601f10613c2c57805160ff1916838001178555613c5a565b82800160010185558215613c5a579182015b82811115613c59578251825591602001919060010190613c3e565b5b509050613c679190613c6b565b5090565b5b80821115613c84576000816000905550600101613c6c565b5090565b6000613c9b613c9684614bf9565b614bd4565b905082815260208101848484011115613cb757613cb661508f565b5b613cc2848285614e80565b509392505050565b6000613cdd613cd884614c2a565b614bd4565b905082815260208101848484011115613cf957613cf861508f565b5b613d04848285614e80565b509392505050565b600081359050613d1b816157d7565b92915050565b600081359050613d30816157ee565b92915050565b600081359050613d4581615805565b92915050565b600081519050613d5a81615805565b92915050565b600082601f830112613d7557613d7461508a565b5b8135613d85848260208601613c88565b91505092915050565b600082601f830112613da357613da261508a565b5b8135613db3848260208601613cca565b91505092915050565b600081359050613dcb8161581c565b92915050565b600060208284031215613de757613de6615099565b5b6000613df584828501613d0c565b91505092915050565b60008060408385031215613e1557613e14615099565b5b6000613e2385828601613d0c565b9250506020613e3485828601613d0c565b9150509250929050565b600080600060608486031215613e5757613e56615099565b5b6000613e6586828701613d0c565b9350506020613e7686828701613d0c565b9250506040613e8786828701613dbc565b9150509250925092565b60008060008060808587031215613eab57613eaa615099565b5b6000613eb987828801613d0c565b9450506020613eca87828801613d0c565b9350506040613edb87828801613dbc565b925050606085013567ffffffffffffffff811115613efc57613efb615094565b5b613f0887828801613d60565b91505092959194509250565b60008060408385031215613f2b57613f2a615099565b5b6000613f3985828601613d0c565b9250506020613f4a85828601613d21565b9150509250929050565b60008060408385031215613f6b57613f6a615099565b5b6000613f7985828601613d0c565b9250506020613f8a85828601613dbc565b9150509250929050565b600060208284031215613faa57613fa9615099565b5b6000613fb884828501613d21565b91505092915050565b600060208284031215613fd757613fd6615099565b5b6000613fe584828501613d36565b91505092915050565b60006020828403121561400457614003615099565b5b600061401284828501613d4b565b91505092915050565b60006020828403121561403157614030615099565b5b600082013567ffffffffffffffff81111561404f5761404e615094565b5b61405b84828501613d8e565b91505092915050565b6000806040838503121561407b5761407a615099565b5b600083013567ffffffffffffffff81111561409957614098615094565b5b6140a585828601613d8e565b925050602083013567ffffffffffffffff8111156140c6576140c5615094565b5b6140d285828601613d8e565b9150509250929050565b6000602082840312156140f2576140f1615099565b5b600061410084828501613dbc565b91505092915050565b600080604083850312156141205761411f615099565b5b600061412e85828601613dbc565b925050602061413f85828601613d0c565b9150509250929050565b600080604083850312156141605761415f615099565b5b600061416e85828601613dbc565b925050602083013567ffffffffffffffff81111561418f5761418e615094565b5b61419b85828601613d8e565b9150509250929050565b60006141b1838361472f565b60208301905092915050565b6141c681614e0c565b82525050565b60006141d782614c80565b6141e18185614cae565b93506141ec83614c5b565b8060005b8381101561421d57815161420488826141a5565b975061420f83614ca1565b9250506001810190506141f0565b5085935050505092915050565b61423381614e1e565b82525050565b600061424482614c8b565b61424e8185614cbf565b935061425e818560208601614e8f565b6142678161509e565b840191505092915050565b600061427d82614c96565b6142878185614cdb565b9350614297818560208601614e8f565b6142a08161509e565b840191505092915050565b60006142b682614c96565b6142c08185614cec565b93506142d0818560208601614e8f565b80840191505092915050565b600081546142e981614ec2565b6142f38186614cec565b9450600182166000811461430e576001811461431f57614352565b60ff19831686528186019350614352565b61432885614c6b565b60005b8381101561434a5781548189015260018201915060208101905061432b565b838801955050505b50505092915050565b6000614368603283614cdb565b9150614373826150af565b604082019050919050565b600061438b602683614cdb565b9150614396826150fe565b604082019050919050565b60006143ae601c83614cdb565b91506143b98261514d565b602082019050919050565b60006143d1601483614cdb565b91506143dc82615176565b602082019050919050565b60006143f4602483614cdb565b91506143ff8261519f565b604082019050919050565b6000614417601983614cdb565b9150614422826151ee565b602082019050919050565b600061443a602c83614cdb565b915061444582615217565b604082019050919050565b600061445d601d83614cdb565b915061446882615266565b602082019050919050565b6000614480603883614cdb565b915061448b8261528f565b604082019050919050565b60006144a3602d83614cdb565b91506144ae826152de565b604082019050919050565b60006144c6602a83614cdb565b91506144d18261532d565b604082019050919050565b60006144e9602983614cdb565b91506144f48261537c565b604082019050919050565b600061450c603c83614cdb565b9150614517826153cb565b604082019050919050565b600061452f602083614cdb565b915061453a8261541a565b602082019050919050565b6000614552602c83614cdb565b915061455d82615443565b604082019050919050565b6000614575602083614cdb565b915061458082615492565b602082019050919050565b6000614598601783614cdb565b91506145a3826154bb565b602082019050919050565b60006145bb602983614cdb565b91506145c6826154e4565b604082019050919050565b60006145de602f83614cdb565b91506145e982615533565b604082019050919050565b6000614601602283614cdb565b915061460c82615582565b604082019050919050565b6000614624602183614cdb565b915061462f826155d1565b604082019050919050565b6000614647606383614cdb565b915061465282615620565b608082019050919050565b600061466a602083614cdb565b9150614675826156bb565b602082019050919050565b600061468d600083614cd0565b9150614698826156e4565b600082019050919050565b60006146b0601483614cdb565b91506146bb826156e7565b602082019050919050565b60006146d3602583614cdb565b91506146de82615710565b604082019050919050565b60006146f6603183614cdb565b91506147018261575f565b604082019050919050565b6000614719601383614cdb565b9150614724826157ae565b602082019050919050565b61473881614e76565b82525050565b61474781614e76565b82525050565b600061475982866142ab565b915061476582856142ab565b915061477182846142dc565b9150819050949350505050565b600061478982614680565b9150819050919050565b60006020820190506147a860008301846141bd565b92915050565b60006080820190506147c360008301876141bd565b6147d060208301866141bd565b6147dd604083018561473e565b81810360608301526147ef8184614239565b905095945050505050565b6000602082019050818103600083015261481481846141cc565b905092915050565b6000602082019050614831600083018461422a565b92915050565b600060208201905081810360008301526148518184614272565b905092915050565b600060208201905081810360008301526148728161435b565b9050919050565b600060208201905081810360008301526148928161437e565b9050919050565b600060208201905081810360008301526148b2816143a1565b9050919050565b600060208201905081810360008301526148d2816143c4565b9050919050565b600060208201905081810360008301526148f2816143e7565b9050919050565b600060208201905081810360008301526149128161440a565b9050919050565b600060208201905081810360008301526149328161442d565b9050919050565b6000602082019050818103600083015261495281614450565b9050919050565b6000602082019050818103600083015261497281614473565b9050919050565b6000602082019050818103600083015261499281614496565b9050919050565b600060208201905081810360008301526149b2816144b9565b9050919050565b600060208201905081810360008301526149d2816144dc565b9050919050565b600060208201905081810360008301526149f2816144ff565b9050919050565b60006020820190508181036000830152614a1281614522565b9050919050565b60006020820190508181036000830152614a3281614545565b9050919050565b60006020820190508181036000830152614a5281614568565b9050919050565b60006020820190508181036000830152614a728161458b565b9050919050565b60006020820190508181036000830152614a92816145ae565b9050919050565b60006020820190508181036000830152614ab2816145d1565b9050919050565b60006020820190508181036000830152614ad2816145f4565b9050919050565b60006020820190508181036000830152614af281614617565b9050919050565b60006020820190508181036000830152614b128161463a565b9050919050565b60006020820190508181036000830152614b328161465d565b9050919050565b60006020820190508181036000830152614b52816146a3565b9050919050565b60006020820190508181036000830152614b72816146c6565b9050919050565b60006020820190508181036000830152614b92816146e9565b9050919050565b60006020820190508181036000830152614bb28161470c565b9050919050565b6000602082019050614bce600083018461473e565b92915050565b6000614bde614bef565b9050614bea8282614ef4565b919050565b6000604051905090565b600067ffffffffffffffff821115614c1457614c1361505b565b5b614c1d8261509e565b9050602081019050919050565b600067ffffffffffffffff821115614c4557614c4461505b565b5b614c4e8261509e565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d0282614e76565b9150614d0d83614e76565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d4257614d41614f9f565b5b828201905092915050565b6000614d5882614e76565b9150614d6383614e76565b925082614d7357614d72614fce565b5b828204905092915050565b6000614d8982614e76565b9150614d9483614e76565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dcd57614dcc614f9f565b5b828202905092915050565b6000614de382614e76565b9150614dee83614e76565b925082821015614e0157614e00614f9f565b5b828203905092915050565b6000614e1782614e56565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614ead578082015181840152602081019050614e92565b83811115614ebc576000848401525b50505050565b60006002820490506001821680614eda57607f821691505b60208210811415614eee57614eed614ffd565b5b50919050565b614efd8261509e565b810181811067ffffffffffffffff82111715614f1c57614f1b61505b565b5b80604052505050565b6000614f3082614e76565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f6357614f62614f9f565b5b600182019050919050565b6000614f7982614e76565b9150614f8483614e76565b925082614f9457614f93614fce565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f596f752063616e206a6f696e20612066616374696f6e206f6e6c79206f6e636560008201527f2e2053746179206c6f79616c2e00000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f596f752063616e206a6f696e20612066616374696f6e206f6e6365207468652060008201527f6d657461646174612068617665206265656e2072657665616c65642e00000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420746865206f776e6572206f662074686973204e4660008201527f542e000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f506c6561736520656e74657220612076616c69642066616374696f6e2028536960008201527f6e6e6572612c2054616262617461622c20527570707374656e2c20486f6e6e6560208201527f646f72292e20436865636b206669727374206c6574746572207570706572636160408201527f73652e0000000000000000000000000000000000000000000000000000000000606082015250565b7f5374617274696e6720696e64657820626c6f636b206d75737420626520736574600082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f50726f76656e616e636520686173682063616e206f6e6c79206265207365742060008201527f6f6e636521000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6157e081614e0c565b81146157eb57600080fd5b50565b6157f781614e1e565b811461580257600080fd5b50565b61580e81614e2a565b811461581957600080fd5b50565b61582581614e76565b811461583057600080fd5b5056fea26469706673582212205d9bd6f0d8c4acb23415a792d685d041a383e1764debe4ea8b79c73848cfc92f64736f6c63430008070033697066733a2f2f516d5574366e513133765152364767696e453356326d6e325841734b704141355954654e56464638446f424b66642f
Deployed Bytecode
0x60806040526004361061027d5760003560e01c8063715018a61161014f578063b071401b116100c1578063e36d64981161007a578063e36d649814610967578063e77f647914610992578063e985e9c5146109bd578063e9866550146109fa578063efbd73f414610a11578063f2fde38b14610a3a5761027d565b8063b071401b14610847578063b88d4fde14610870578063c577b91f14610899578063c87b56dd146108d6578063cb774d4714610913578063ddcee2531461093e5761027d565b806394354fd01161011357806394354fd01461074657806395d89b4114610771578063a0291d0f1461079c578063a0712d68146107c5578063a22cb465146107e1578063a8a150b81461080a5761027d565b8063715018a6146106975780637d17fcbe146106ae5780637f2ae587146106c55780638205d99f146106f05780638da5cb5b1461071b5761027d565b806332cb6b0c116101f3578063507862d1116101ac578063507862d1146105715780635503a0e81461059c5780635c975abb146105c757806362b99ad4146105f25780636352211e1461061d57806370a082311461065a5761027d565b806332cb6b0c146104755780633ccfd60b146104a057806342842e0e146104b7578063438b6300146104e057806344a0d68a1461051d57806347da37bc146105465761027d565b806313faede61161024557806313faede61461037957806316ba10e0146103a457806316c38b3c146103cd57806318160ddd146103f657806323b872dd1461042157806329703edf1461044a5761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780631096952314610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613fc1565b610a63565b6040516102b6919061481c565b60405180910390f35b3480156102cb57600080fd5b506102d4610b45565b6040516102e19190614837565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c91906140dc565b610bd7565b60405161031e9190614793565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613f54565b610c5c565b005b34801561035c57600080fd5b506103776004803603810190610372919061401b565b610d74565b005b34801561038557600080fd5b5061038e610e5b565b60405161039b9190614bb9565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c6919061401b565b610e61565b005b3480156103d957600080fd5b506103f460048036038101906103ef9190613f94565b610ef7565b005b34801561040257600080fd5b5061040b610f90565b6040516104189190614bb9565b60405180910390f35b34801561042d57600080fd5b5061044860048036038101906104439190613e3e565b610fa1565b005b34801561045657600080fd5b5061045f611001565b60405161046c9190614837565b60405180910390f35b34801561048157600080fd5b5061048a61108f565b6040516104979190614bb9565b60405180910390f35b3480156104ac57600080fd5b506104b5611095565b005b3480156104c357600080fd5b506104de60048036038101906104d99190613e3e565b611191565b005b3480156104ec57600080fd5b5061050760048036038101906105029190613dd1565b6111b1565b60405161051491906147fa565b60405180910390f35b34801561052957600080fd5b50610544600480360381019061053f91906140dc565b6112bc565b005b34801561055257600080fd5b5061055b611342565b6040516105689190614837565b60405180910390f35b34801561057d57600080fd5b506105866113d0565b6040516105939190614837565b60405180910390f35b3480156105a857600080fd5b506105b161145e565b6040516105be9190614837565b60405180910390f35b3480156105d357600080fd5b506105dc6114ec565b6040516105e9919061481c565b60405180910390f35b3480156105fe57600080fd5b506106076114ff565b6040516106149190614837565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f91906140dc565b61158d565b6040516106519190614793565b60405180910390f35b34801561066657600080fd5b50610681600480360381019061067c9190613dd1565b61163f565b60405161068e9190614bb9565b60405180910390f35b3480156106a357600080fd5b506106ac6116f7565b005b3480156106ba57600080fd5b506106c361177f565b005b3480156106d157600080fd5b506106da611849565b6040516106e79190614837565b60405180910390f35b3480156106fc57600080fd5b506107056118d7565b6040516107129190614837565b60405180910390f35b34801561072757600080fd5b50610730611965565b60405161073d9190614793565b60405180910390f35b34801561075257600080fd5b5061075b61198f565b6040516107689190614bb9565b60405180910390f35b34801561077d57600080fd5b50610786611995565b6040516107939190614837565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190614149565b611a27565b005b6107df60048036038101906107da91906140dc565b611cd2565b005b3480156107ed57600080fd5b5061080860048036038101906108039190613f14565b611e52565b005b34801561081657600080fd5b50610831600480360381019061082c91906140dc565b611e68565b60405161083e9190614837565b60405180910390f35b34801561085357600080fd5b5061086e600480360381019061086991906140dc565b611f2b565b005b34801561087c57600080fd5b5061089760048036038101906108929190613e91565b611fb1565b005b3480156108a557600080fd5b506108c060048036038101906108bb91906140dc565b612013565b6040516108cd9190614837565b60405180910390f35b3480156108e257600080fd5b506108fd60048036038101906108f891906140dc565b6120b9565b60405161090a9190614837565b60405180910390f35b34801561091f57600080fd5b506109286122f9565b6040516109359190614bb9565b60405180910390f35b34801561094a57600080fd5b5061096560048036038101906109609190614064565b6122ff565b005b34801561097357600080fd5b5061097c61255f565b6040516109899190614bb9565b60405180910390f35b34801561099e57600080fd5b506109a7612565565b6040516109b49190614837565b60405180910390f35b3480156109c957600080fd5b506109e460048036038101906109df9190613dfe565b6125f3565b6040516109f1919061481c565b60405180910390f35b348015610a0657600080fd5b50610a0f612687565b005b348015610a1d57600080fd5b50610a386004803603810190610a339190614109565b612828565b005b348015610a4657600080fd5b50610a616004803603810190610a5c9190613dd1565b612991565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b3e5750610b3d82612a89565b5b9050919050565b606060008054610b5490614ec2565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8090614ec2565b8015610bcd5780601f10610ba257610100808354040283529160200191610bcd565b820191906000526020600020905b815481529060010190602001808311610bb057829003601f168201915b5050505050905090565b6000610be282612af3565b610c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1890614a19565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c678261158d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf90614ad9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cf7612b5f565b73ffffffffffffffffffffffffffffffffffffffff161480610d265750610d2581610d20612b5f565b6125f3565b5b610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c90614959565b60405180910390fd5b610d6f8383612b67565b505050565b610d7c612b5f565b73ffffffffffffffffffffffffffffffffffffffff16610d9a611965565b73ffffffffffffffffffffffffffffffffffffffff1614610df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de790614a39565b60405180910390fd5b6000600e8054610dff90614ec2565b905014610e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3890614b59565b60405180910390fd5b80600e9080519060200190610e57929190613be5565b5050565b60125481565b610e69612b5f565b73ffffffffffffffffffffffffffffffffffffffff16610e87611965565b73ffffffffffffffffffffffffffffffffffffffff1614610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed490614a39565b60405180910390fd5b80600d9080519060200190610ef3929190613be5565b5050565b610eff612b5f565b73ffffffffffffffffffffffffffffffffffffffff16610f1d611965565b73ffffffffffffffffffffffffffffffffffffffff1614610f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6a90614a39565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b6000610f9c6007612c20565b905090565b610fb2610fac612b5f565b82612c2e565b610ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe890614b79565b60405180910390fd5b610ffc838383612d0c565b505050565b600e805461100e90614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461103a90614ec2565b80156110875780601f1061105c57610100808354040283529160200191611087565b820191906000526020600020905b81548152906001019060200180831161106a57829003601f168201915b505050505081565b60135481565b61109d612b5f565b73ffffffffffffffffffffffffffffffffffffffff166110bb611965565b73ffffffffffffffffffffffffffffffffffffffff1614611111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110890614a39565b60405180910390fd5b600061111b611965565b73ffffffffffffffffffffffffffffffffffffffff164760405161113e9061477e565b60006040518083038185875af1925050503d806000811461117b576040519150601f19603f3d011682016040523d82523d6000602084013e611180565b606091505b505090508061118e57600080fd5b50565b6111ac83838360405180602001604052806000815250611fb1565b505050565b606060006111be8361163f565b905060008167ffffffffffffffff8111156111dc576111db61505b565b5b60405190808252806020026020018201604052801561120a5781602001602082028036833780820191505090505b50905060006001905060005b838110801561122757506013548211155b156112b05760006112378361158d565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561129c57828483815181106112815761128061502c565b5b602002602001018181525050818061129890614f25565b9250505b82806112a790614f25565b93505050611216565b82945050505050919050565b6112c4612b5f565b73ffffffffffffffffffffffffffffffffffffffff166112e2611965565b73ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90614a39565b60405180910390fd5b8060128190555050565b600b805461134f90614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461137b90614ec2565b80156113c85780601f1061139d576101008083540402835291602001916113c8565b820191906000526020600020905b8154815290600101906020018083116113ab57829003601f168201915b505050505081565b600f80546113dd90614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461140990614ec2565b80156114565780601f1061142b57610100808354040283529160200191611456565b820191906000526020600020905b81548152906001019060200180831161143957829003601f168201915b505050505081565b600d805461146b90614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461149790614ec2565b80156114e45780601f106114b9576101008083540402835291602001916114e4565b820191906000526020600020905b8154815290600101906020018083116114c757829003601f168201915b505050505081565b601560009054906101000a900460ff1681565b6008805461150c90614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461153890614ec2565b80156115855780601f1061155a57610100808354040283529160200191611585565b820191906000526020600020905b81548152906001019060200180831161156857829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906149b9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a790614999565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116ff612b5f565b73ffffffffffffffffffffffffffffffffffffffff1661171d611965565b73ffffffffffffffffffffffffffffffffffffffff1614611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a90614a39565b60405180910390fd5b61177d6000612f68565b565b611787612b5f565b73ffffffffffffffffffffffffffffffffffffffff166117a5611965565b73ffffffffffffffffffffffffffffffffffffffff16146117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f290614a39565b60405180910390fd5b600060115414611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790614939565b60405180910390fd5b43601081905550565b600c805461185690614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461188290614ec2565b80156118cf5780601f106118a4576101008083540402835291602001916118cf565b820191906000526020600020905b8154815290600101906020018083116118b257829003601f168201915b505050505081565b600a80546118e490614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461191090614ec2565b801561195d5780601f106119325761010080835404028352916020019161195d565b820191906000526020600020905b81548152906001019060200180831161194057829003601f168201915b505050505081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60145481565b6060600180546119a490614ec2565b80601f01602080910402602001604051908101604052809291908181526020018280546119d090614ec2565b8015611a1d5780601f106119f257610100808354040283529160200191611a1d565b820191906000526020600020905b815481529060010190602001808311611a0057829003601f168201915b5050505050905090565b611a308261158d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9490614ab9565b60405180910390fd5b60006011541415611ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ada906149d9565b60405180910390fd5b6000611aee83611e68565b5114611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2690614979565b60405180910390fd5b600081905060006040518060400160405280600781526020017f53696e6e65726100000000000000000000000000000000000000000000000000815250905060006040518060400160405280600881526020017f5461626261746162000000000000000000000000000000000000000000000000815250905060006040518060400160405280600881526020017f527570707374656e000000000000000000000000000000000000000000000000815250905060006040518060400160405280600881526020017f486f6e6e65646f720000000000000000000000000000000000000000000000008152509050611c26858561302e565b80611c375750611c36858461302e565b5b80611c485750611c47858361302e565b5b80611c595750611c58858261302e565b5b611c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8f90614af9565b60405180910390fd5b600060166000898152602001908152602001600020905086816000019080519060200190611cc7929190613be5565b505050505050505050565b8060135481611ce16007612c20565b611ceb9190614cf7565b1115611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390614b39565b60405180910390fd5b601560009054906101000a900460ff1615611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390614a59565b60405180910390fd5b600082118015611d8e57506014548211155b611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc4906148b9565b60405180910390fd5b81601254611ddb9190614d7e565b341015611e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1490614b99565b60405180910390fd5b611e27338361305c565b6000601054148015611e415750601354611e3f610f90565b145b15611e4e57436010819055505b5050565b611e64611e5d612b5f565b83836130fc565b5050565b6060600060166000848152602001908152602001600020604051806020016040529081600082018054611e9a90614ec2565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec690614ec2565b8015611f135780601f10611ee857610100808354040283529160200191611f13565b820191906000526020600020905b815481529060010190602001808311611ef657829003601f168201915b50505050508152505090508060000151915050919050565b611f33612b5f565b73ffffffffffffffffffffffffffffffffffffffff16611f51611965565b73ffffffffffffffffffffffffffffffffffffffff1614611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e90614a39565b60405180910390fd5b8060148190555050565b611fc2611fbc612b5f565b83612c2e565b612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff890614b79565b60405180910390fd5b61200d84848484613269565b50505050565b601660205280600052604060002060009150905080600001805461203690614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461206290614ec2565b80156120af5780601f10612084576101008083540402835291602001916120af565b820191906000526020600020905b81548152906001019060200180831161209257829003601f168201915b5050505050905081565b60606120c482612af3565b612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa90614a99565b60405180910390fd5b606080600060115411156122175761214c60016013546002601154886121299190614cf7565b6121339190614dd8565b61213d9190614f6e565b6121479190614cf7565b6132c5565b905060006016600086815260200190815260200160002060405180602001604052908160008201805461217e90614ec2565b80601f01602080910402602001604051908101604052809291908181526020018280546121aa90614ec2565b80156121f75780601f106121cc576101008083540402835291602001916121f7565b820191906000526020600020905b8154815290600101906020018083116121da57829003601f168201915b505050505081525050905061220f8160000151613426565b9250506122ab565b600f805461222490614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461225090614ec2565b801561229d5780601f106122725761010080835404028352916020019161229d565b820191906000526020600020905b81548152906001019060200180831161228057829003601f168201915b5050505050925050506122f4565b60008251116122c957604051806020016040528060008152506122ef565b8181600d6040516020016122df9392919061474d565b6040516020818303038152906040525b925050505b919050565b60115481565b612307612b5f565b73ffffffffffffffffffffffffffffffffffffffff16612325611965565b73ffffffffffffffffffffffffffffffffffffffff161461237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614a39565b60405180910390fd5b6123ba816040518060400160405280600481526020017f426173650000000000000000000000000000000000000000000000000000000081525061302e565b156123db5781600890805190602001906123d5929190613be5565b5061255b565b61241a816040518060400160405280600781526020017f53696e6e6572610000000000000000000000000000000000000000000000000081525061302e565b1561243b578160099080519060200190612435929190613be5565b5061255a565b61247a816040518060400160405280600881526020017f546162626174616200000000000000000000000000000000000000000000000081525061302e565b1561249b5781600a9080519060200190612495929190613be5565b50612559565b6124da816040518060400160405280600881526020017f527570707374656e00000000000000000000000000000000000000000000000081525061302e565b156124fb5781600b90805190602001906124f5929190613be5565b50612558565b61253a816040518060400160405280600881526020017f486f6e6e65646f7200000000000000000000000000000000000000000000000081525061302e565b156125575781600c9080519060200190612555929190613be5565b505b5b5b5b5b5050565b60105481565b6009805461257290614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461259e90614ec2565b80156125eb5780601f106125c0576101008083540402835291602001916125eb565b820191906000526020600020905b8154815290600101906020018083116125ce57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61268f612b5f565b73ffffffffffffffffffffffffffffffffffffffff166126ad611965565b73ffffffffffffffffffffffffffffffffffffffff1614612703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fa90614a39565b60405180910390fd5b600060115414612748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273f90614939565b60405180910390fd5b6000601054141561278e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278590614b19565b60405180910390fd5b60016013546010544060001c6127a49190614f6e565b6127ae9190614cf7565b60118190555060ff601054436127c49190614dd8565b11156127fb5760016013546001436127dc9190614dd8565b4060001c6127ea9190614f6e565b6127f49190614cf7565b6011819055505b60016011541415612826576001601160008282546128199190614cf7565b9250508190556011819055505b565b81601354816128376007612c20565b6128419190614cf7565b1115612882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287990614b39565b60405180910390fd5b61288a612b5f565b73ffffffffffffffffffffffffffffffffffffffff166128a8611965565b73ffffffffffffffffffffffffffffffffffffffff16146128fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f590614a39565b60405180910390fd5b60008311801561291c5750600a6014546129189190614d7e565b8311155b61295b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612952906148b9565b60405180910390fd5b612965828461305c565b600060105414801561297f575060135461297d610f90565b145b1561298c57436010819055505b505050565b612999612b5f565b73ffffffffffffffffffffffffffffffffffffffff166129b7611965565b73ffffffffffffffffffffffffffffffffffffffff1614612a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0490614a39565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7490614879565b60405180910390fd5b612a8681612f68565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612bda8361158d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000612c3982612af3565b612c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6f90614919565b60405180910390fd5b6000612c838361158d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612cf257508373ffffffffffffffffffffffffffffffffffffffff16612cda84610bd7565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d035750612d0281856125f3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d2c8261158d565b73ffffffffffffffffffffffffffffffffffffffff1614612d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7990614a79565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de9906148d9565b60405180910390fd5b612dfd8383836137d9565b612e08600082612b67565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e589190614dd8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eaf9190614cf7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081518351146130425760009050613056565b818051906020012083805190602001201490505b92915050565b60005b818110156130f75761307160076137de565b6000604051806020016040528060405180602001604052806000815250815250905080601660006130a26007612c20565b815260200190815260200160002060008201518160000190805190602001906130cc929190613be5565b509050506130e3846130de6007612c20565b6137f4565b5080806130ef90614f25565b91505061305f565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561316b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613162906148f9565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161325c919061481c565b60405180910390a3505050565b613274848484612d0c565b61328084848484613812565b6132bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b690614859565b60405180910390fd5b50505050565b6060600082141561330d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613421565b600082905060005b6000821461333f57808061332890614f25565b915050600a826133389190614d4d565b9150613315565b60008167ffffffffffffffff81111561335b5761335a61505b565b5b6040519080825280601f01601f19166020018201604052801561338d5781602001600182028036833780820191505090505b5090505b6000851461341a576001826133a69190614dd8565b9150600a856133b59190614f6e565b60306133c19190614cf7565b60f81b8183815181106133d7576133d661502c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134139190614d4d565b9450613391565b8093505050505b919050565b60606000825114156134c4576008805461343f90614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461346b90614ec2565b80156134b85780601f1061348d576101008083540402835291602001916134b8565b820191906000526020600020905b81548152906001019060200180831161349b57829003601f168201915b505050505090506137d4565b613503826040518060400160405280600781526020017f53696e6e6572610000000000000000000000000000000000000000000000000081525061302e565b1561359a576009805461351590614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461354190614ec2565b801561358e5780601f106135635761010080835404028352916020019161358e565b820191906000526020600020905b81548152906001019060200180831161357157829003601f168201915b505050505090506137d4565b6135d9826040518060400160405280600881526020017f546162626174616200000000000000000000000000000000000000000000000081525061302e565b1561367057600a80546135eb90614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461361790614ec2565b80156136645780601f1061363957610100808354040283529160200191613664565b820191906000526020600020905b81548152906001019060200180831161364757829003601f168201915b505050505090506137d4565b6136af826040518060400160405280600881526020017f527570707374656e00000000000000000000000000000000000000000000000081525061302e565b1561374657600b80546136c190614ec2565b80601f01602080910402602001604051908101604052809291908181526020018280546136ed90614ec2565b801561373a5780601f1061370f5761010080835404028352916020019161373a565b820191906000526020600020905b81548152906001019060200180831161371d57829003601f168201915b505050505090506137d4565b600c805461375390614ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461377f90614ec2565b80156137cc5780601f106137a1576101008083540402835291602001916137cc565b820191906000526020600020905b8154815290600101906020018083116137af57829003601f168201915b505050505090505b919050565b505050565b6001816000016000828254019250508190555050565b61380e8282604051806020016040528060008152506139a9565b5050565b60006138338473ffffffffffffffffffffffffffffffffffffffff16613a04565b1561399c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261385c612b5f565b8786866040518563ffffffff1660e01b815260040161387e94939291906147ae565b602060405180830381600087803b15801561389857600080fd5b505af19250505080156138c957506040513d601f19601f820116820180604052508101906138c69190613fee565b60015b61394c573d80600081146138f9576040519150601f19603f3d011682016040523d82523d6000602084013e6138fe565b606091505b50600081511415613944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393b90614859565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506139a1565b600190505b949350505050565b6139b38383613a17565b6139c06000848484613812565b6139ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f690614859565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7e906149f9565b60405180910390fd5b613a9081612af3565b15613ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac790614899565b60405180910390fd5b613adc600083836137d9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b2c9190614cf7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613bf190614ec2565b90600052602060002090601f016020900481019282613c135760008555613c5a565b82601f10613c2c57805160ff1916838001178555613c5a565b82800160010185558215613c5a579182015b82811115613c59578251825591602001919060010190613c3e565b5b509050613c679190613c6b565b5090565b5b80821115613c84576000816000905550600101613c6c565b5090565b6000613c9b613c9684614bf9565b614bd4565b905082815260208101848484011115613cb757613cb661508f565b5b613cc2848285614e80565b509392505050565b6000613cdd613cd884614c2a565b614bd4565b905082815260208101848484011115613cf957613cf861508f565b5b613d04848285614e80565b509392505050565b600081359050613d1b816157d7565b92915050565b600081359050613d30816157ee565b92915050565b600081359050613d4581615805565b92915050565b600081519050613d5a81615805565b92915050565b600082601f830112613d7557613d7461508a565b5b8135613d85848260208601613c88565b91505092915050565b600082601f830112613da357613da261508a565b5b8135613db3848260208601613cca565b91505092915050565b600081359050613dcb8161581c565b92915050565b600060208284031215613de757613de6615099565b5b6000613df584828501613d0c565b91505092915050565b60008060408385031215613e1557613e14615099565b5b6000613e2385828601613d0c565b9250506020613e3485828601613d0c565b9150509250929050565b600080600060608486031215613e5757613e56615099565b5b6000613e6586828701613d0c565b9350506020613e7686828701613d0c565b9250506040613e8786828701613dbc565b9150509250925092565b60008060008060808587031215613eab57613eaa615099565b5b6000613eb987828801613d0c565b9450506020613eca87828801613d0c565b9350506040613edb87828801613dbc565b925050606085013567ffffffffffffffff811115613efc57613efb615094565b5b613f0887828801613d60565b91505092959194509250565b60008060408385031215613f2b57613f2a615099565b5b6000613f3985828601613d0c565b9250506020613f4a85828601613d21565b9150509250929050565b60008060408385031215613f6b57613f6a615099565b5b6000613f7985828601613d0c565b9250506020613f8a85828601613dbc565b9150509250929050565b600060208284031215613faa57613fa9615099565b5b6000613fb884828501613d21565b91505092915050565b600060208284031215613fd757613fd6615099565b5b6000613fe584828501613d36565b91505092915050565b60006020828403121561400457614003615099565b5b600061401284828501613d4b565b91505092915050565b60006020828403121561403157614030615099565b5b600082013567ffffffffffffffff81111561404f5761404e615094565b5b61405b84828501613d8e565b91505092915050565b6000806040838503121561407b5761407a615099565b5b600083013567ffffffffffffffff81111561409957614098615094565b5b6140a585828601613d8e565b925050602083013567ffffffffffffffff8111156140c6576140c5615094565b5b6140d285828601613d8e565b9150509250929050565b6000602082840312156140f2576140f1615099565b5b600061410084828501613dbc565b91505092915050565b600080604083850312156141205761411f615099565b5b600061412e85828601613dbc565b925050602061413f85828601613d0c565b9150509250929050565b600080604083850312156141605761415f615099565b5b600061416e85828601613dbc565b925050602083013567ffffffffffffffff81111561418f5761418e615094565b5b61419b85828601613d8e565b9150509250929050565b60006141b1838361472f565b60208301905092915050565b6141c681614e0c565b82525050565b60006141d782614c80565b6141e18185614cae565b93506141ec83614c5b565b8060005b8381101561421d57815161420488826141a5565b975061420f83614ca1565b9250506001810190506141f0565b5085935050505092915050565b61423381614e1e565b82525050565b600061424482614c8b565b61424e8185614cbf565b935061425e818560208601614e8f565b6142678161509e565b840191505092915050565b600061427d82614c96565b6142878185614cdb565b9350614297818560208601614e8f565b6142a08161509e565b840191505092915050565b60006142b682614c96565b6142c08185614cec565b93506142d0818560208601614e8f565b80840191505092915050565b600081546142e981614ec2565b6142f38186614cec565b9450600182166000811461430e576001811461431f57614352565b60ff19831686528186019350614352565b61432885614c6b565b60005b8381101561434a5781548189015260018201915060208101905061432b565b838801955050505b50505092915050565b6000614368603283614cdb565b9150614373826150af565b604082019050919050565b600061438b602683614cdb565b9150614396826150fe565b604082019050919050565b60006143ae601c83614cdb565b91506143b98261514d565b602082019050919050565b60006143d1601483614cdb565b91506143dc82615176565b602082019050919050565b60006143f4602483614cdb565b91506143ff8261519f565b604082019050919050565b6000614417601983614cdb565b9150614422826151ee565b602082019050919050565b600061443a602c83614cdb565b915061444582615217565b604082019050919050565b600061445d601d83614cdb565b915061446882615266565b602082019050919050565b6000614480603883614cdb565b915061448b8261528f565b604082019050919050565b60006144a3602d83614cdb565b91506144ae826152de565b604082019050919050565b60006144c6602a83614cdb565b91506144d18261532d565b604082019050919050565b60006144e9602983614cdb565b91506144f48261537c565b604082019050919050565b600061450c603c83614cdb565b9150614517826153cb565b604082019050919050565b600061452f602083614cdb565b915061453a8261541a565b602082019050919050565b6000614552602c83614cdb565b915061455d82615443565b604082019050919050565b6000614575602083614cdb565b915061458082615492565b602082019050919050565b6000614598601783614cdb565b91506145a3826154bb565b602082019050919050565b60006145bb602983614cdb565b91506145c6826154e4565b604082019050919050565b60006145de602f83614cdb565b91506145e982615533565b604082019050919050565b6000614601602283614cdb565b915061460c82615582565b604082019050919050565b6000614624602183614cdb565b915061462f826155d1565b604082019050919050565b6000614647606383614cdb565b915061465282615620565b608082019050919050565b600061466a602083614cdb565b9150614675826156bb565b602082019050919050565b600061468d600083614cd0565b9150614698826156e4565b600082019050919050565b60006146b0601483614cdb565b91506146bb826156e7565b602082019050919050565b60006146d3602583614cdb565b91506146de82615710565b604082019050919050565b60006146f6603183614cdb565b91506147018261575f565b604082019050919050565b6000614719601383614cdb565b9150614724826157ae565b602082019050919050565b61473881614e76565b82525050565b61474781614e76565b82525050565b600061475982866142ab565b915061476582856142ab565b915061477182846142dc565b9150819050949350505050565b600061478982614680565b9150819050919050565b60006020820190506147a860008301846141bd565b92915050565b60006080820190506147c360008301876141bd565b6147d060208301866141bd565b6147dd604083018561473e565b81810360608301526147ef8184614239565b905095945050505050565b6000602082019050818103600083015261481481846141cc565b905092915050565b6000602082019050614831600083018461422a565b92915050565b600060208201905081810360008301526148518184614272565b905092915050565b600060208201905081810360008301526148728161435b565b9050919050565b600060208201905081810360008301526148928161437e565b9050919050565b600060208201905081810360008301526148b2816143a1565b9050919050565b600060208201905081810360008301526148d2816143c4565b9050919050565b600060208201905081810360008301526148f2816143e7565b9050919050565b600060208201905081810360008301526149128161440a565b9050919050565b600060208201905081810360008301526149328161442d565b9050919050565b6000602082019050818103600083015261495281614450565b9050919050565b6000602082019050818103600083015261497281614473565b9050919050565b6000602082019050818103600083015261499281614496565b9050919050565b600060208201905081810360008301526149b2816144b9565b9050919050565b600060208201905081810360008301526149d2816144dc565b9050919050565b600060208201905081810360008301526149f2816144ff565b9050919050565b60006020820190508181036000830152614a1281614522565b9050919050565b60006020820190508181036000830152614a3281614545565b9050919050565b60006020820190508181036000830152614a5281614568565b9050919050565b60006020820190508181036000830152614a728161458b565b9050919050565b60006020820190508181036000830152614a92816145ae565b9050919050565b60006020820190508181036000830152614ab2816145d1565b9050919050565b60006020820190508181036000830152614ad2816145f4565b9050919050565b60006020820190508181036000830152614af281614617565b9050919050565b60006020820190508181036000830152614b128161463a565b9050919050565b60006020820190508181036000830152614b328161465d565b9050919050565b60006020820190508181036000830152614b52816146a3565b9050919050565b60006020820190508181036000830152614b72816146c6565b9050919050565b60006020820190508181036000830152614b92816146e9565b9050919050565b60006020820190508181036000830152614bb28161470c565b9050919050565b6000602082019050614bce600083018461473e565b92915050565b6000614bde614bef565b9050614bea8282614ef4565b919050565b6000604051905090565b600067ffffffffffffffff821115614c1457614c1361505b565b5b614c1d8261509e565b9050602081019050919050565b600067ffffffffffffffff821115614c4557614c4461505b565b5b614c4e8261509e565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d0282614e76565b9150614d0d83614e76565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d4257614d41614f9f565b5b828201905092915050565b6000614d5882614e76565b9150614d6383614e76565b925082614d7357614d72614fce565b5b828204905092915050565b6000614d8982614e76565b9150614d9483614e76565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dcd57614dcc614f9f565b5b828202905092915050565b6000614de382614e76565b9150614dee83614e76565b925082821015614e0157614e00614f9f565b5b828203905092915050565b6000614e1782614e56565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614ead578082015181840152602081019050614e92565b83811115614ebc576000848401525b50505050565b60006002820490506001821680614eda57607f821691505b60208210811415614eee57614eed614ffd565b5b50919050565b614efd8261509e565b810181811067ffffffffffffffff82111715614f1c57614f1b61505b565b5b80604052505050565b6000614f3082614e76565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f6357614f62614f9f565b5b600182019050919050565b6000614f7982614e76565b9150614f8483614e76565b925082614f9457614f93614fce565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f596f752063616e206a6f696e20612066616374696f6e206f6e6c79206f6e636560008201527f2e2053746179206c6f79616c2e00000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f596f752063616e206a6f696e20612066616374696f6e206f6e6365207468652060008201527f6d657461646174612068617665206265656e2072657665616c65642e00000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420746865206f776e6572206f662074686973204e4660008201527f542e000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f506c6561736520656e74657220612076616c69642066616374696f6e2028536960008201527f6e6e6572612c2054616262617461622c20527570707374656e2c20486f6e6e6560208201527f646f72292e20436865636b206669727374206c6574746572207570706572636160408201527f73652e0000000000000000000000000000000000000000000000000000000000606082015250565b7f5374617274696e6720696e64657820626c6f636b206d75737420626520736574600082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f50726f76656e616e636520686173682063616e206f6e6c79206265207365742060008201527f6f6e636521000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6157e081614e0c565b81146157eb57600080fd5b50565b6157f781614e1e565b811461580257600080fd5b50565b61580e81614e2a565b811461581957600080fd5b50565b61582581614e76565b811461583057600080fd5b5056fea26469706673582212205d9bd6f0d8c4acb23415a792d685d041a383e1764debe4ea8b79c73848cfc92f64736f6c63430008070033
Deployed Bytecode Sourcemap
37768:7990:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25242:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26187:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27746:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27269:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44379:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38410:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44190:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44296:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38883:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28496:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38170:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38447;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44593:137;;;;;;;;;;;;;:::i;:::-;;28906:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39920:636;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43350:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38050:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38208:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38132:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38542:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37936:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25881:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25611:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6230:103;;;;;;;;;;;;;:::i;:::-;;43162:182;;;;;;;;;;;;;:::i;:::-;;38091:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38009;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5579:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38485:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26356:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41399:979;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38978:527;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28039:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42384:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43430:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29162:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38623:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40562:831;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38359:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43566:618;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38321:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37969:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28265:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42575:581;;;;;;;;;;;;;:::i;:::-;;39543:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6488:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25242:305;25344:4;25396:25;25381:40;;;:11;:40;;;;:105;;;;25453:33;25438:48;;;:11;:48;;;;25381:105;:158;;;;25503:36;25527:11;25503:23;:36::i;:::-;25381:158;25361:178;;25242:305;;;:::o;26187:100::-;26241:13;26274:5;26267:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26187:100;:::o;27746:221::-;27822:7;27850:16;27858:7;27850;:16::i;:::-;27842:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27935:15;:24;27951:7;27935:24;;;;;;;;;;;;;;;;;;;;;27928:31;;27746:221;;;:::o;27269:411::-;27350:13;27366:23;27381:7;27366:14;:23::i;:::-;27350:39;;27414:5;27408:11;;:2;:11;;;;27400:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27508:5;27492:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27517:37;27534:5;27541:12;:10;:12::i;:::-;27517:16;:37::i;:::-;27492:62;27470:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27651:21;27660:2;27664:7;27651:8;:21::i;:::-;27339:341;27269:411;;:::o;44379:208::-;5810:12;:10;:12::i;:::-;5799:23;;:7;:5;:7::i;:::-;:23;;;5791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44500:1:::1;44474:14;44468:28;;;;;:::i;:::-;;;:33;44460:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;44567:14;44550;:31;;;;;;;;;;;;:::i;:::-;;44379:208:::0;:::o;38410:32::-;;;;:::o;44190:100::-;5810:12;:10;:12::i;:::-;5799:23;;:7;:5;:7::i;:::-;:23;;;5791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44274:10:::1;44262:9;:22;;;;;;;;;;;;:::i;:::-;;44190:100:::0;:::o;44296:77::-;5810:12;:10;:12::i;:::-;5799:23;;:7;:5;:7::i;:::-;:23;;;5791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44361:6:::1;44352;;:15;;;;;;;;;;;;;;;;;;44296:77:::0;:::o;38883:89::-;38927:7;38950:16;:6;:14;:16::i;:::-;38943:23;;38883:89;:::o;28496:339::-;28691:41;28710:12;:10;:12::i;:::-;28724:7;28691:18;:41::i;:::-;28683:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28799:28;28809:4;28815:2;28819:7;28799:9;:28::i;:::-;28496:339;;;:::o;38170:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38447:::-;;;;:::o;44593:137::-;5810:12;:10;:12::i;:::-;5799:23;;:7;:5;:7::i;:::-;:23;;;5791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44638:7:::1;44659;:5;:7::i;:::-;44651:21;;44680;44651:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44637:69;;;44721:2;44713:11;;;::::0;::::1;;44630:100;44593:137::o:0;28906:185::-;29044:39;29061:4;29067:2;29071:7;29044:39;;;;;;;;;;;;:16;:39::i;:::-;28906:185;;;:::o;39920:636::-;39995:16;40023:23;40049:17;40059:6;40049:9;:17::i;:::-;40023:43;;40073:30;40120:15;40106:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40073:63;;40143:22;40168:1;40143:26;;40176:23;40212:310;40237:15;40219;:33;:65;;;;;40274:10;;40256:14;:28;;40219:65;40212:310;;;40295:25;40323:23;40331:14;40323:7;:23::i;:::-;40295:51;;40382:6;40361:27;;:17;:27;;;40357:131;;;40434:14;40401:13;40415:15;40401:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;40461:17;;;;;:::i;:::-;;;;40357:131;40498:16;;;;;:::i;:::-;;;;40286:236;40212:310;;;40537:13;40530:20;;;;;;39920:636;;;:::o;43350:74::-;5810:12;:10;:12::i;:::-;5799:23;;:7;:5;:7::i;:::-;:23;;;5791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43413:5:::1;43406:4;:12;;;;43350:74:::0;:::o;38050:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38208:87::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38132:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38542:25::-;;;;;;;;;;;;;:::o;37936:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25881:239::-;25953:7;25973:13;25989:7;:16;25997:7;25989:16;;;;;;;;;;;;;;;;;;;;;25973:32;;26041:1;26024:19;;:5;:19;;;;26016:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26107:5;26100:12;;;25881:239;;;:::o;25611:208::-;25683:7;25728:1;25711:19;;:5;:19;;;;25703:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25795:9;:16;25805:5;25795:16;;;;;;;;;;;;;;;;25788:23;;25611:208;;;:::o;6230:103::-;5810:12;:10;:12::i;:::-;5799:23;;:7;:5;:7::i;:::-;:23;;;5791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6295:30:::1;6322:1;6295:18;:30::i;:::-;6230:103::o:0;43162:182::-;5810:12;:10;:12::i;:::-;5799:23;;:7;:5;:7::i;:::-;:23;;;5791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43253:1:::1;43236:13;;:18;43228:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;43326:12;43305:18;:33;;;;43162:182::o:0;38091:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38009:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5579:87::-;5625:7;5652:6;;;;;;;;;;;5645:13;;5579:87;:::o;38485:37::-;;;;:::o;26356:104::-;26412:13;26445:7;26438:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26356:104;:::o;41399:979::-;41500:17;41508:8;41500:7;:17::i;:::-;41486:31;;:10;:31;;;41478:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;41588:1;41571:13;;:18;;41563:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;41707:1;41675:20;41686:8;41675:10;:20::i;:::-;41669:34;:39;41661:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;41765:21;41795:11;41765:42;;41814:20;41837:16;;;;;;;;;;;;;;;;;41814:39;;41860:21;41884:17;;;;;;;;;;;;;;;;;41860:41;;41908:21;41932:17;;;;;;;;;;;;;;;;;41908:41;;41956:21;41980:17;;;;;;;;;;;;;;;;;41956:41;;42012:34;42028:8;42038:7;42012:15;:34::i;:::-;:73;;;;42050:35;42066:8;42076;42050:15;:35::i;:::-;42012:73;:112;;;;42089:35;42105:8;42115;42089:15;:35::i;:::-;42012:112;:151;;;;42128:35;42144:8;42154;42128:15;:35::i;:::-;42012:151;42004:263;;;;;;;;;;;;:::i;:::-;;;;;;;;;42274:32;42309:9;:19;42319:8;42309:19;;;;;;;;;;;42274:54;;42361:11;42335:15;:23;;:37;;;;;;;;;;;;:::i;:::-;;41471:907;;;;;;41399:979;;:::o;38978:527::-;39043:11;38828:10;;38813:11;38794:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:44;;38786:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;39072:6:::1;;;;;;;;;;;39071:7;39063:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;39135:1;39121:11;:15;:52;;;;;39155:18;;39140:11;:33;;39121:52;39113:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39233:11;39226:4;;:18;;;;:::i;:::-;39213:9;:31;;39205:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;39277:34;39287:10;39299:11;39277:9;:34::i;:::-;39413:1;39391:18;;:23;:54;;;;;39435:10;;39418:13;:11;:13::i;:::-;:27;39391:54;39387:112;;;39479:12;39458:18;:33;;;;39387:112;38978:527:::0;;:::o;28039:155::-;28134:52;28153:12;:10;:12::i;:::-;28167:8;28177;28134:18;:52::i;:::-;28039:155;;:::o;42384:185::-;42443:21;42473:31;42507:9;:19;42517:8;42507:19;;;;;;;;;;;42473:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42540:15;:23;;;42533:30;;;42384:185;;;:::o;43430:130::-;5810:12;:10;:12::i;:::-;5799:23;;:7;:5;:7::i;:::-;:23;;;5791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43535:19:::1;43514:18;:40;;;;43430:130:::0;:::o;29162:328::-;29337:41;29356:12;:10;:12::i;:::-;29370:7;29337:18;:41::i;:::-;29329:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29443:39;29457:4;29463:2;29467:7;29476:5;29443:13;:39::i;:::-;29162:328;;;;:::o;38623:46::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40562:831::-;40661:13;40702:17;40710:8;40702:7;:17::i;:::-;40686:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;40793:21;40821:24;40873:1;40857:13;;:17;40854:411;;;40983:62;41032:1;41018:10;;41013:1;40997:13;;40986:8;:24;;;;:::i;:::-;:28;;;;:::i;:::-;40985:43;;;;:::i;:::-;40984:49;;;;:::i;:::-;40983:60;:62::i;:::-;40970:75;;41056:31;41090:9;:19;41100:8;41090:19;;;;;;;;;;;41056:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41130:40;41145:15;:23;;;41130:8;:40::i;:::-;41120:50;;40876:302;40854:411;;;41243:14;41236:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40854:411;41304:1;41286:7;41280:21;:25;:107;;;;;;;;;;;;;;;;;41341:7;41350:10;41362:9;41324:48;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41280:107;41273:114;;;;40562:831;;;;:::o;38359:28::-;;;;:::o;43566:618::-;5810:12;:10;:12::i;:::-;5799:23;;:7;:5;:7::i;:::-;:23;;;5791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43664:46:::1;43686:7;43696:13;;;;;;;;;;;;;;;;::::0;43664:15:::1;:46::i;:::-;43661:518;;;43731:10;43719:9;:22;;;;;;;;;;;;:::i;:::-;;43661:518;;;43758:49;43780:7;43790:16;;;;;;;;;;;;;;;;::::0;43758:15:::1;:49::i;:::-;43755:424;;;43837:10;43818:16;:29;;;;;;;;;;;;:::i;:::-;;43755:424;;;43864:50;43886:7;43896:17;;;;;;;;;;;;;;;;::::0;43864:15:::1;:50::i;:::-;43861:318;;;43945:10;43925:17;:30;;;;;;;;;;;;:::i;:::-;;43861:318;;;43972:50;43994:7;44004:17;;;;;;;;;;;;;;;;::::0;43972:15:::1;:50::i;:::-;43969:210;;;44053:10;44033:17;:30;;;;;;;;;;;;:::i;:::-;;43969:210;;;44080:50;44102:7;44112:17;;;;;;;;;;;;;;;;::::0;44080:15:::1;:50::i;:::-;44077:102;;;44161:10;44141:17;:30;;;;;;;;;;;;:::i;:::-;;44077:102;43969:210;43861:318;43755:424;43661:518;43566:618:::0;;:::o;38321:33::-;;;;:::o;37969:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28265:164::-;28362:4;28386:18;:25;28405:5;28386:25;;;;;;;;;;;;;;;:35;28412:8;28386:35;;;;;;;;;;;;;;;;;;;;;;;;;28379:42;;28265:164;;;;:::o;42575:581::-;5810:12;:10;:12::i;:::-;5799:23;;:7;:5;:7::i;:::-;:23;;;5791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42652:1:::1;42635:13;;:18;42627:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;42724:1;42702:18;;:23;;42694:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42846:1;42833:10;;42810:18;;42800:29;42795:35;;:48;;;;:::i;:::-;:52;;;;:::i;:::-;42779:13;:68;;;;42929:3;42908:18;;42893:12;:33;;;;:::i;:::-;:39;42889:130;;;43010:1;42997:10;;42991:1;42976:12;:16;;;;:::i;:::-;42966:27;42961:33;;:46;;;;:::i;:::-;:50;;;;:::i;:::-;42945:13;:66;;;;42889:130;43095:1;43078:13;;:18;43074:77;;;43142:1;43125:13;;:18;;;;;;;:::i;:::-;;;;;;;43109:13;:34;;;;43074:77;42575:581::o:0;39543:371::-;39629:11;38828:10;;38813:11;38794:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:44;;38786:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;5810:12:::1;:10;:12::i;:::-;5799:23;;:7;:5;:7::i;:::-;:23;;;5791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39681:1:::2;39667:11;:15;:57;;;;;39722:2;39701:18;;:23;;;;:::i;:::-;39686:11;:38;;39667:57;39659:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;39756:33;39766:9;39777:11;39756:9;:33::i;:::-;39822:1;39800:18;;:23;:54;;;;;39844:10;;39827:13;:11;:13::i;:::-;:27;39800:54;39796:112;;;39888:12;39867:18;:33;;;;39796:112;39543:371:::0;;;:::o;6488:201::-;5810:12;:10;:12::i;:::-;5799:23;;:7;:5;:7::i;:::-;:23;;;5791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6597:1:::1;6577:22;;:8;:22;;;;6569:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6653:28;6672:8;6653:18;:28::i;:::-;6488:201:::0;:::o;18011:157::-;18096:4;18135:25;18120:40;;;:11;:40;;;;18113:47;;18011:157;;;:::o;31000:127::-;31065:4;31117:1;31089:30;;:7;:16;31097:7;31089:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31082:37;;31000:127;;;:::o;4303:98::-;4356:7;4383:10;4376:17;;4303:98;:::o;34982:174::-;35084:2;35057:15;:24;35073:7;35057:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35140:7;35136:2;35102:46;;35111:23;35126:7;35111:14;:23::i;:::-;35102:46;;;;;;;;;;;;34982:174;;:::o;907:114::-;972:7;999;:14;;;992:21;;907:114;;;:::o;31294:348::-;31387:4;31412:16;31420:7;31412;:16::i;:::-;31404:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31488:13;31504:23;31519:7;31504:14;:23::i;:::-;31488:39;;31557:5;31546:16;;:7;:16;;;:51;;;;31590:7;31566:31;;:20;31578:7;31566:11;:20::i;:::-;:31;;;31546:51;:87;;;;31601:32;31618:5;31625:7;31601:16;:32::i;:::-;31546:87;31538:96;;;31294:348;;;;:::o;34286:578::-;34445:4;34418:31;;:23;34433:7;34418:14;:23::i;:::-;:31;;;34410:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34528:1;34514:16;;:2;:16;;;;34506:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34584:39;34605:4;34611:2;34615:7;34584:20;:39::i;:::-;34688:29;34705:1;34709:7;34688:8;:29::i;:::-;34749:1;34730:9;:15;34740:4;34730:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34778:1;34761:9;:13;34771:2;34761:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34809:2;34790:7;:16;34798:7;34790:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34848:7;34844:2;34829:27;;34838:4;34829:27;;;;;;;;;;;;34286:578;;;:::o;6849:191::-;6923:16;6942:6;;;;;;;;;;;6923:25;;6968:8;6959:6;;:17;;;;;;;;;;;;;;;;;;7023:8;6992:40;;7013:8;6992:40;;;;;;;;;;;;6912:128;6849:191;:::o;45545:210::-;45625:4;45653:1;:8;45641:1;:8;:20;45638:112;;45679:5;45672:12;;;;45638:112;45740:1;45730:12;;;;;;45724:1;45714:12;;;;;;:28;45707:35;;45545:210;;;;;:::o;44736:305::-;44816:9;44811:225;44835:11;44831:1;:15;44811:225;;;44862:18;:6;:16;:18::i;:::-;44889:27;44919:12;;;;;;;;;;;;;;;;;;;;;;;44889:42;;44970:11;44940:9;:27;44950:16;:6;:14;:16::i;:::-;44940:27;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;44990:38;45000:9;45011:16;:6;:14;:16::i;:::-;44990:9;:38::i;:::-;44853:183;44848:3;;;;;:::i;:::-;;;;44811:225;;;;44736:305;;:::o;35298:315::-;35453:8;35444:17;;:5;:17;;;;35436:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35540:8;35502:18;:25;35521:5;35502:25;;;;;;;;;;;;;;;:35;35528:8;35502:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35586:8;35564:41;;35579:5;35564:41;;;35596:8;35564:41;;;;;;:::i;:::-;;;;;;;;35298:315;;;:::o;30372:::-;30529:28;30539:4;30545:2;30549:7;30529:9;:28::i;:::-;30576:48;30599:4;30605:2;30609:7;30618:5;30576:22;:48::i;:::-;30568:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30372:315;;;;:::o;1865:723::-;1921:13;2151:1;2142:5;:10;2138:53;;;2169:10;;;;;;;;;;;;;;;;;;;;;2138:53;2201:12;2216:5;2201:20;;2232:14;2257:78;2272:1;2264:4;:9;2257:78;;2290:8;;;;;:::i;:::-;;;;2321:2;2313:10;;;;;:::i;:::-;;;2257:78;;;2345:19;2377:6;2367:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2345:39;;2395:154;2411:1;2402:5;:10;2395:154;;2439:1;2429:11;;;;;:::i;:::-;;;2506:2;2498:5;:10;;;;:::i;:::-;2485:2;:24;;;;:::i;:::-;2472:39;;2455:6;2462;2455:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2535:2;2526:11;;;;;:::i;:::-;;;2395:154;;;2573:6;2559:21;;;;;1865:723;;;;:::o;45047:492::-;45118:13;45161:1;45143:7;:14;:19;45140:394;;;45180:9;45173:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45140:394;45211:42;45227:7;45236:16;;;;;;;;;;;;;;;;;45211:15;:42::i;:::-;45208:326;;;45271:16;45264:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45208:326;45305:43;45321:7;45330:17;;;;;;;;;;;;;;;;;45305:15;:43::i;:::-;45301:233;;;45366:17;45359:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45301:233;45401:43;45417:7;45426:17;;;;;;;;;;;;;;;;;45401:15;:43::i;:::-;45397:137;;;45462:17;45455:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45397:137;45509:17;45502:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45047:492;;;;:::o;37549:126::-;;;;:::o;1029:127::-;1136:1;1118:7;:14;;;:19;;;;;;;;;;;1029:127;:::o;31984:110::-;32060:26;32070:2;32074:7;32060:26;;;;;;;;;;;;:9;:26::i;:::-;31984:110;;:::o;36178:799::-;36333:4;36354:15;:2;:13;;;:15::i;:::-;36350:620;;;36406:2;36390:36;;;36427:12;:10;:12::i;:::-;36441:4;36447:7;36456:5;36390:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36386:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36649:1;36632:6;:13;:18;36628:272;;;36675:60;;;;;;;;;;:::i;:::-;;;;;;;;36628:272;36850:6;36844:13;36835:6;36831:2;36827:15;36820:38;36386:529;36523:41;;;36513:51;;;:6;:51;;;;36506:58;;;;;36350:620;36954:4;36947:11;;36178:799;;;;;;;:::o;32321:321::-;32451:18;32457:2;32461:7;32451:5;:18::i;:::-;32502:54;32533:1;32537:2;32541:7;32550:5;32502:22;:54::i;:::-;32480:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32321:321;;;:::o;7867:387::-;7927:4;8135:12;8202:7;8190:20;8182:28;;8245:1;8238:4;:8;8231:15;;;7867:387;;;:::o;32978:382::-;33072:1;33058:16;;:2;:16;;;;33050:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33131:16;33139:7;33131;:16::i;:::-;33130:17;33122:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33193:45;33222:1;33226:2;33230:7;33193:20;:45::i;:::-;33268:1;33251:9;:13;33261:2;33251:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33299:2;33280:7;:16;33288:7;33280:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33344:7;33340:2;33319:33;;33336:1;33319:33;;;;;;;;;;;;32978:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:834::-;7240:6;7248;7297:2;7285:9;7276:7;7272:23;7268:32;7265:119;;;7303:79;;:::i;:::-;7265:119;7451:1;7440:9;7436:17;7423:31;7481:18;7473:6;7470:30;7467:117;;;7503:79;;:::i;:::-;7467:117;7608:63;7663:7;7654:6;7643:9;7639:22;7608:63;:::i;:::-;7598:73;;7394:287;7748:2;7737:9;7733:18;7720:32;7779:18;7771:6;7768:30;7765:117;;;7801:79;;:::i;:::-;7765:117;7906:63;7961:7;7952:6;7941:9;7937:22;7906:63;:::i;:::-;7896:73;;7691:288;7152:834;;;;;:::o;7992:329::-;8051:6;8100:2;8088:9;8079:7;8075:23;8071:32;8068:119;;;8106:79;;:::i;:::-;8068:119;8226:1;8251:53;8296:7;8287:6;8276:9;8272:22;8251:53;:::i;:::-;8241:63;;8197:117;7992:329;;;;:::o;8327:474::-;8395:6;8403;8452:2;8440:9;8431:7;8427:23;8423:32;8420:119;;;8458:79;;:::i;:::-;8420:119;8578:1;8603:53;8648:7;8639:6;8628:9;8624:22;8603:53;:::i;:::-;8593:63;;8549:117;8705:2;8731:53;8776:7;8767:6;8756:9;8752:22;8731:53;:::i;:::-;8721:63;;8676:118;8327:474;;;;;:::o;8807:654::-;8885:6;8893;8942:2;8930:9;8921:7;8917:23;8913:32;8910:119;;;8948:79;;:::i;:::-;8910:119;9068:1;9093:53;9138:7;9129:6;9118:9;9114:22;9093:53;:::i;:::-;9083:63;;9039:117;9223:2;9212:9;9208:18;9195:32;9254:18;9246:6;9243:30;9240:117;;;9276:79;;:::i;:::-;9240:117;9381:63;9436:7;9427:6;9416:9;9412:22;9381:63;:::i;:::-;9371:73;;9166:288;8807:654;;;;;:::o;9467:179::-;9536:10;9557:46;9599:3;9591:6;9557:46;:::i;:::-;9635:4;9630:3;9626:14;9612:28;;9467:179;;;;:::o;9652:118::-;9739:24;9757:5;9739:24;:::i;:::-;9734:3;9727:37;9652:118;;:::o;9806:732::-;9925:3;9954:54;10002:5;9954:54;:::i;:::-;10024:86;10103:6;10098:3;10024:86;:::i;:::-;10017:93;;10134:56;10184:5;10134:56;:::i;:::-;10213:7;10244:1;10229:284;10254:6;10251:1;10248:13;10229:284;;;10330:6;10324:13;10357:63;10416:3;10401:13;10357:63;:::i;:::-;10350:70;;10443:60;10496:6;10443:60;:::i;:::-;10433:70;;10289:224;10276:1;10273;10269:9;10264:14;;10229:284;;;10233:14;10529:3;10522:10;;9930:608;;;9806:732;;;;:::o;10544:109::-;10625:21;10640:5;10625:21;:::i;:::-;10620:3;10613:34;10544:109;;:::o;10659:360::-;10745:3;10773:38;10805:5;10773:38;:::i;:::-;10827:70;10890:6;10885:3;10827:70;:::i;:::-;10820:77;;10906:52;10951:6;10946:3;10939:4;10932:5;10928:16;10906:52;:::i;:::-;10983:29;11005:6;10983:29;:::i;:::-;10978:3;10974:39;10967:46;;10749:270;10659:360;;;;:::o;11025:364::-;11113:3;11141:39;11174:5;11141:39;:::i;:::-;11196:71;11260:6;11255:3;11196:71;:::i;:::-;11189:78;;11276:52;11321:6;11316:3;11309:4;11302:5;11298:16;11276:52;:::i;:::-;11353:29;11375:6;11353:29;:::i;:::-;11348:3;11344:39;11337:46;;11117:272;11025:364;;;;:::o;11395:377::-;11501:3;11529:39;11562:5;11529:39;:::i;:::-;11584:89;11666:6;11661:3;11584:89;:::i;:::-;11577:96;;11682:52;11727:6;11722:3;11715:4;11708:5;11704:16;11682:52;:::i;:::-;11759:6;11754:3;11750:16;11743:23;;11505:267;11395:377;;;;:::o;11802:845::-;11905:3;11942:5;11936:12;11971:36;11997:9;11971:36;:::i;:::-;12023:89;12105:6;12100:3;12023:89;:::i;:::-;12016:96;;12143:1;12132:9;12128:17;12159:1;12154:137;;;;12305:1;12300:341;;;;12121:520;;12154:137;12238:4;12234:9;12223;12219:25;12214:3;12207:38;12274:6;12269:3;12265:16;12258:23;;12154:137;;12300:341;12367:38;12399:5;12367:38;:::i;:::-;12427:1;12441:154;12455:6;12452:1;12449:13;12441:154;;;12529:7;12523:14;12519:1;12514:3;12510:11;12503:35;12579:1;12570:7;12566:15;12555:26;;12477:4;12474:1;12470:12;12465:17;;12441:154;;;12624:6;12619:3;12615:16;12608:23;;12307:334;;12121:520;;11909:738;;11802:845;;;;:::o;12653:366::-;12795:3;12816:67;12880:2;12875:3;12816:67;:::i;:::-;12809:74;;12892:93;12981:3;12892:93;:::i;:::-;13010:2;13005:3;13001:12;12994:19;;12653:366;;;:::o;13025:::-;13167:3;13188:67;13252:2;13247:3;13188:67;:::i;:::-;13181:74;;13264:93;13353:3;13264:93;:::i;:::-;13382:2;13377:3;13373:12;13366:19;;13025:366;;;:::o;13397:::-;13539:3;13560:67;13624:2;13619:3;13560:67;:::i;:::-;13553:74;;13636:93;13725:3;13636:93;:::i;:::-;13754:2;13749:3;13745:12;13738:19;;13397:366;;;:::o;13769:::-;13911:3;13932:67;13996:2;13991:3;13932:67;:::i;:::-;13925:74;;14008:93;14097:3;14008:93;:::i;:::-;14126:2;14121:3;14117:12;14110:19;;13769:366;;;:::o;14141:::-;14283:3;14304:67;14368:2;14363:3;14304:67;:::i;:::-;14297:74;;14380:93;14469:3;14380:93;:::i;:::-;14498:2;14493:3;14489:12;14482:19;;14141:366;;;:::o;14513:::-;14655:3;14676:67;14740:2;14735:3;14676:67;:::i;:::-;14669:74;;14752:93;14841:3;14752:93;:::i;:::-;14870:2;14865:3;14861:12;14854:19;;14513:366;;;:::o;14885:::-;15027:3;15048:67;15112:2;15107:3;15048:67;:::i;:::-;15041:74;;15124:93;15213:3;15124:93;:::i;:::-;15242:2;15237:3;15233:12;15226:19;;14885:366;;;:::o;15257:::-;15399:3;15420:67;15484:2;15479:3;15420:67;:::i;:::-;15413:74;;15496:93;15585:3;15496:93;:::i;:::-;15614:2;15609:3;15605:12;15598:19;;15257:366;;;:::o;15629:::-;15771:3;15792:67;15856:2;15851:3;15792:67;:::i;:::-;15785:74;;15868:93;15957:3;15868:93;:::i;:::-;15986:2;15981:3;15977:12;15970:19;;15629:366;;;:::o;16001:::-;16143:3;16164:67;16228:2;16223:3;16164:67;:::i;:::-;16157:74;;16240:93;16329:3;16240:93;:::i;:::-;16358:2;16353:3;16349:12;16342:19;;16001:366;;;:::o;16373:::-;16515:3;16536:67;16600:2;16595:3;16536:67;:::i;:::-;16529:74;;16612:93;16701:3;16612:93;:::i;:::-;16730:2;16725:3;16721:12;16714:19;;16373:366;;;:::o;16745:::-;16887:3;16908:67;16972:2;16967:3;16908:67;:::i;:::-;16901:74;;16984:93;17073:3;16984:93;:::i;:::-;17102:2;17097:3;17093:12;17086:19;;16745:366;;;:::o;17117:::-;17259:3;17280:67;17344:2;17339:3;17280:67;:::i;:::-;17273:74;;17356:93;17445:3;17356:93;:::i;:::-;17474:2;17469:3;17465:12;17458:19;;17117:366;;;:::o;17489:::-;17631:3;17652:67;17716:2;17711:3;17652:67;:::i;:::-;17645:74;;17728:93;17817:3;17728:93;:::i;:::-;17846:2;17841:3;17837:12;17830:19;;17489:366;;;:::o;17861:::-;18003:3;18024:67;18088:2;18083:3;18024:67;:::i;:::-;18017:74;;18100:93;18189:3;18100:93;:::i;:::-;18218:2;18213:3;18209:12;18202:19;;17861:366;;;:::o;18233:::-;18375:3;18396:67;18460:2;18455:3;18396:67;:::i;:::-;18389:74;;18472:93;18561:3;18472:93;:::i;:::-;18590:2;18585:3;18581:12;18574:19;;18233:366;;;:::o;18605:::-;18747:3;18768:67;18832:2;18827:3;18768:67;:::i;:::-;18761:74;;18844:93;18933:3;18844:93;:::i;:::-;18962:2;18957:3;18953:12;18946:19;;18605:366;;;:::o;18977:::-;19119:3;19140:67;19204:2;19199:3;19140:67;:::i;:::-;19133:74;;19216:93;19305:3;19216:93;:::i;:::-;19334:2;19329:3;19325:12;19318:19;;18977:366;;;:::o;19349:::-;19491:3;19512:67;19576:2;19571:3;19512:67;:::i;:::-;19505:74;;19588:93;19677:3;19588:93;:::i;:::-;19706:2;19701:3;19697:12;19690:19;;19349:366;;;:::o;19721:::-;19863:3;19884:67;19948:2;19943:3;19884:67;:::i;:::-;19877:74;;19960:93;20049:3;19960:93;:::i;:::-;20078:2;20073:3;20069:12;20062:19;;19721:366;;;:::o;20093:::-;20235:3;20256:67;20320:2;20315:3;20256:67;:::i;:::-;20249:74;;20332:93;20421:3;20332:93;:::i;:::-;20450:2;20445:3;20441:12;20434:19;;20093:366;;;:::o;20465:367::-;20607:3;20628:67;20692:2;20687:3;20628:67;:::i;:::-;20621:74;;20704:93;20793:3;20704:93;:::i;:::-;20822:3;20817;20813:13;20806:20;;20465:367;;;:::o;20838:366::-;20980:3;21001:67;21065:2;21060:3;21001:67;:::i;:::-;20994:74;;21077:93;21166:3;21077:93;:::i;:::-;21195:2;21190:3;21186:12;21179:19;;20838:366;;;:::o;21210:398::-;21369:3;21390:83;21471:1;21466:3;21390:83;:::i;:::-;21383:90;;21482:93;21571:3;21482:93;:::i;:::-;21600:1;21595:3;21591:11;21584:18;;21210:398;;;:::o;21614:366::-;21756:3;21777:67;21841:2;21836:3;21777:67;:::i;:::-;21770:74;;21853:93;21942:3;21853:93;:::i;:::-;21971:2;21966:3;21962:12;21955:19;;21614:366;;;:::o;21986:::-;22128:3;22149:67;22213:2;22208:3;22149:67;:::i;:::-;22142:74;;22225:93;22314:3;22225:93;:::i;:::-;22343:2;22338:3;22334:12;22327:19;;21986:366;;;:::o;22358:::-;22500:3;22521:67;22585:2;22580:3;22521:67;:::i;:::-;22514:74;;22597:93;22686:3;22597:93;:::i;:::-;22715:2;22710:3;22706:12;22699:19;;22358:366;;;:::o;22730:::-;22872:3;22893:67;22957:2;22952:3;22893:67;:::i;:::-;22886:74;;22969:93;23058:3;22969:93;:::i;:::-;23087:2;23082:3;23078:12;23071:19;;22730:366;;;:::o;23102:108::-;23179:24;23197:5;23179:24;:::i;:::-;23174:3;23167:37;23102:108;;:::o;23216:118::-;23303:24;23321:5;23303:24;:::i;:::-;23298:3;23291:37;23216:118;;:::o;23340:589::-;23565:3;23587:95;23678:3;23669:6;23587:95;:::i;:::-;23580:102;;23699:95;23790:3;23781:6;23699:95;:::i;:::-;23692:102;;23811:92;23899:3;23890:6;23811:92;:::i;:::-;23804:99;;23920:3;23913:10;;23340:589;;;;;;:::o;23935:379::-;24119:3;24141:147;24284:3;24141:147;:::i;:::-;24134:154;;24305:3;24298:10;;23935:379;;;:::o;24320:222::-;24413:4;24451:2;24440:9;24436:18;24428:26;;24464:71;24532:1;24521:9;24517:17;24508:6;24464:71;:::i;:::-;24320:222;;;;:::o;24548:640::-;24743:4;24781:3;24770:9;24766:19;24758:27;;24795:71;24863:1;24852:9;24848:17;24839:6;24795:71;:::i;:::-;24876:72;24944:2;24933:9;24929:18;24920:6;24876:72;:::i;:::-;24958;25026:2;25015:9;25011:18;25002:6;24958:72;:::i;:::-;25077:9;25071:4;25067:20;25062:2;25051:9;25047:18;25040:48;25105:76;25176:4;25167:6;25105:76;:::i;:::-;25097:84;;24548:640;;;;;;;:::o;25194:373::-;25337:4;25375:2;25364:9;25360:18;25352:26;;25424:9;25418:4;25414:20;25410:1;25399:9;25395:17;25388:47;25452:108;25555:4;25546:6;25452:108;:::i;:::-;25444:116;;25194:373;;;;:::o;25573:210::-;25660:4;25698:2;25687:9;25683:18;25675:26;;25711:65;25773:1;25762:9;25758:17;25749:6;25711:65;:::i;:::-;25573:210;;;;:::o;25789:313::-;25902:4;25940:2;25929:9;25925:18;25917:26;;25989:9;25983:4;25979:20;25975:1;25964:9;25960:17;25953:47;26017:78;26090:4;26081:6;26017:78;:::i;:::-;26009:86;;25789:313;;;;:::o;26108:419::-;26274:4;26312:2;26301:9;26297:18;26289:26;;26361:9;26355:4;26351:20;26347:1;26336:9;26332:17;26325:47;26389:131;26515:4;26389:131;:::i;:::-;26381:139;;26108:419;;;:::o;26533:::-;26699:4;26737:2;26726:9;26722:18;26714:26;;26786:9;26780:4;26776:20;26772:1;26761:9;26757:17;26750:47;26814:131;26940:4;26814:131;:::i;:::-;26806:139;;26533:419;;;:::o;26958:::-;27124:4;27162:2;27151:9;27147:18;27139:26;;27211:9;27205:4;27201:20;27197:1;27186:9;27182:17;27175:47;27239:131;27365:4;27239:131;:::i;:::-;27231:139;;26958:419;;;:::o;27383:::-;27549:4;27587:2;27576:9;27572:18;27564:26;;27636:9;27630:4;27626:20;27622:1;27611:9;27607:17;27600:47;27664:131;27790:4;27664:131;:::i;:::-;27656:139;;27383:419;;;:::o;27808:::-;27974:4;28012:2;28001:9;27997:18;27989:26;;28061:9;28055:4;28051:20;28047:1;28036:9;28032:17;28025:47;28089:131;28215:4;28089:131;:::i;:::-;28081:139;;27808:419;;;:::o;28233:::-;28399:4;28437:2;28426:9;28422:18;28414:26;;28486:9;28480:4;28476:20;28472:1;28461:9;28457:17;28450:47;28514:131;28640:4;28514:131;:::i;:::-;28506:139;;28233:419;;;:::o;28658:::-;28824:4;28862:2;28851:9;28847:18;28839:26;;28911:9;28905:4;28901:20;28897:1;28886:9;28882:17;28875:47;28939:131;29065:4;28939:131;:::i;:::-;28931:139;;28658:419;;;:::o;29083:::-;29249:4;29287:2;29276:9;29272:18;29264:26;;29336:9;29330:4;29326:20;29322:1;29311:9;29307:17;29300:47;29364:131;29490:4;29364:131;:::i;:::-;29356:139;;29083:419;;;:::o;29508:::-;29674:4;29712:2;29701:9;29697:18;29689:26;;29761:9;29755:4;29751:20;29747:1;29736:9;29732:17;29725:47;29789:131;29915:4;29789:131;:::i;:::-;29781:139;;29508:419;;;:::o;29933:::-;30099:4;30137:2;30126:9;30122:18;30114:26;;30186:9;30180:4;30176:20;30172:1;30161:9;30157:17;30150:47;30214:131;30340:4;30214:131;:::i;:::-;30206:139;;29933:419;;;:::o;30358:::-;30524:4;30562:2;30551:9;30547:18;30539:26;;30611:9;30605:4;30601:20;30597:1;30586:9;30582:17;30575:47;30639:131;30765:4;30639:131;:::i;:::-;30631:139;;30358:419;;;:::o;30783:::-;30949:4;30987:2;30976:9;30972:18;30964:26;;31036:9;31030:4;31026:20;31022:1;31011:9;31007:17;31000:47;31064:131;31190:4;31064:131;:::i;:::-;31056:139;;30783:419;;;:::o;31208:::-;31374:4;31412:2;31401:9;31397:18;31389:26;;31461:9;31455:4;31451:20;31447:1;31436:9;31432:17;31425:47;31489:131;31615:4;31489:131;:::i;:::-;31481:139;;31208:419;;;:::o;31633:::-;31799:4;31837:2;31826:9;31822:18;31814:26;;31886:9;31880:4;31876:20;31872:1;31861:9;31857:17;31850:47;31914:131;32040:4;31914:131;:::i;:::-;31906:139;;31633:419;;;:::o;32058:::-;32224:4;32262:2;32251:9;32247:18;32239:26;;32311:9;32305:4;32301:20;32297:1;32286:9;32282:17;32275:47;32339:131;32465:4;32339:131;:::i;:::-;32331:139;;32058:419;;;:::o;32483:::-;32649:4;32687:2;32676:9;32672:18;32664:26;;32736:9;32730:4;32726:20;32722:1;32711:9;32707:17;32700:47;32764:131;32890:4;32764:131;:::i;:::-;32756:139;;32483:419;;;:::o;32908:::-;33074:4;33112:2;33101:9;33097:18;33089:26;;33161:9;33155:4;33151:20;33147:1;33136:9;33132:17;33125:47;33189:131;33315:4;33189:131;:::i;:::-;33181:139;;32908:419;;;:::o;33333:::-;33499:4;33537:2;33526:9;33522:18;33514:26;;33586:9;33580:4;33576:20;33572:1;33561:9;33557:17;33550:47;33614:131;33740:4;33614:131;:::i;:::-;33606:139;;33333:419;;;:::o;33758:::-;33924:4;33962:2;33951:9;33947:18;33939:26;;34011:9;34005:4;34001:20;33997:1;33986:9;33982:17;33975:47;34039:131;34165:4;34039:131;:::i;:::-;34031:139;;33758:419;;;:::o;34183:::-;34349:4;34387:2;34376:9;34372:18;34364:26;;34436:9;34430:4;34426:20;34422:1;34411:9;34407:17;34400:47;34464:131;34590:4;34464:131;:::i;:::-;34456:139;;34183:419;;;:::o;34608:::-;34774:4;34812:2;34801:9;34797:18;34789:26;;34861:9;34855:4;34851:20;34847:1;34836:9;34832:17;34825:47;34889:131;35015:4;34889:131;:::i;:::-;34881:139;;34608:419;;;:::o;35033:::-;35199:4;35237:2;35226:9;35222:18;35214:26;;35286:9;35280:4;35276:20;35272:1;35261:9;35257:17;35250:47;35314:131;35440:4;35314:131;:::i;:::-;35306:139;;35033:419;;;:::o;35458:::-;35624:4;35662:2;35651:9;35647:18;35639:26;;35711:9;35705:4;35701:20;35697:1;35686:9;35682:17;35675:47;35739:131;35865:4;35739:131;:::i;:::-;35731:139;;35458:419;;;:::o;35883:::-;36049:4;36087:2;36076:9;36072:18;36064:26;;36136:9;36130:4;36126:20;36122:1;36111:9;36107:17;36100:47;36164:131;36290:4;36164:131;:::i;:::-;36156:139;;35883:419;;;:::o;36308:::-;36474:4;36512:2;36501:9;36497:18;36489:26;;36561:9;36555:4;36551:20;36547:1;36536:9;36532:17;36525:47;36589:131;36715:4;36589:131;:::i;:::-;36581:139;;36308:419;;;:::o;36733:::-;36899:4;36937:2;36926:9;36922:18;36914:26;;36986:9;36980:4;36976:20;36972:1;36961:9;36957:17;36950:47;37014:131;37140:4;37014:131;:::i;:::-;37006:139;;36733:419;;;:::o;37158:::-;37324:4;37362:2;37351:9;37347:18;37339:26;;37411:9;37405:4;37401:20;37397:1;37386:9;37382:17;37375:47;37439:131;37565:4;37439:131;:::i;:::-;37431:139;;37158:419;;;:::o;37583:222::-;37676:4;37714:2;37703:9;37699:18;37691:26;;37727:71;37795:1;37784:9;37780:17;37771:6;37727:71;:::i;:::-;37583:222;;;;:::o;37811:129::-;37845:6;37872:20;;:::i;:::-;37862:30;;37901:33;37929:4;37921:6;37901:33;:::i;:::-;37811:129;;;:::o;37946:75::-;37979:6;38012:2;38006:9;37996:19;;37946:75;:::o;38027:307::-;38088:4;38178:18;38170:6;38167:30;38164:56;;;38200:18;;:::i;:::-;38164:56;38238:29;38260:6;38238:29;:::i;:::-;38230:37;;38322:4;38316;38312:15;38304:23;;38027:307;;;:::o;38340:308::-;38402:4;38492:18;38484:6;38481:30;38478:56;;;38514:18;;:::i;:::-;38478:56;38552:29;38574:6;38552:29;:::i;:::-;38544:37;;38636:4;38630;38626:15;38618:23;;38340:308;;;:::o;38654:132::-;38721:4;38744:3;38736:11;;38774:4;38769:3;38765:14;38757:22;;38654:132;;;:::o;38792:141::-;38841:4;38864:3;38856:11;;38887:3;38884:1;38877:14;38921:4;38918:1;38908:18;38900:26;;38792:141;;;:::o;38939:114::-;39006:6;39040:5;39034:12;39024:22;;38939:114;;;:::o;39059:98::-;39110:6;39144:5;39138:12;39128:22;;39059:98;;;:::o;39163:99::-;39215:6;39249:5;39243:12;39233:22;;39163:99;;;:::o;39268:113::-;39338:4;39370;39365:3;39361:14;39353:22;;39268:113;;;:::o;39387:184::-;39486:11;39520:6;39515:3;39508:19;39560:4;39555:3;39551:14;39536:29;;39387:184;;;;:::o;39577:168::-;39660:11;39694:6;39689:3;39682:19;39734:4;39729:3;39725:14;39710:29;;39577:168;;;;:::o;39751:147::-;39852:11;39889:3;39874:18;;39751:147;;;;:::o;39904:169::-;39988:11;40022:6;40017:3;40010:19;40062:4;40057:3;40053:14;40038:29;;39904:169;;;;:::o;40079:148::-;40181:11;40218:3;40203:18;;40079:148;;;;:::o;40233:305::-;40273:3;40292:20;40310:1;40292:20;:::i;:::-;40287:25;;40326:20;40344:1;40326:20;:::i;:::-;40321:25;;40480:1;40412:66;40408:74;40405:1;40402:81;40399:107;;;40486:18;;:::i;:::-;40399:107;40530:1;40527;40523:9;40516:16;;40233:305;;;;:::o;40544:185::-;40584:1;40601:20;40619:1;40601:20;:::i;:::-;40596:25;;40635:20;40653:1;40635:20;:::i;:::-;40630:25;;40674:1;40664:35;;40679:18;;:::i;:::-;40664:35;40721:1;40718;40714:9;40709:14;;40544:185;;;;:::o;40735:348::-;40775:7;40798:20;40816:1;40798:20;:::i;:::-;40793:25;;40832:20;40850:1;40832:20;:::i;:::-;40827:25;;41020:1;40952:66;40948:74;40945:1;40942:81;40937:1;40930:9;40923:17;40919:105;40916:131;;;41027:18;;:::i;:::-;40916:131;41075:1;41072;41068:9;41057:20;;40735:348;;;;:::o;41089:191::-;41129:4;41149:20;41167:1;41149:20;:::i;:::-;41144:25;;41183:20;41201:1;41183:20;:::i;:::-;41178:25;;41222:1;41219;41216:8;41213:34;;;41227:18;;:::i;:::-;41213:34;41272:1;41269;41265:9;41257:17;;41089:191;;;;:::o;41286:96::-;41323:7;41352:24;41370:5;41352:24;:::i;:::-;41341:35;;41286:96;;;:::o;41388:90::-;41422:7;41465:5;41458:13;41451:21;41440:32;;41388:90;;;:::o;41484:149::-;41520:7;41560:66;41553:5;41549:78;41538:89;;41484:149;;;:::o;41639:126::-;41676:7;41716:42;41709:5;41705:54;41694:65;;41639:126;;;:::o;41771:77::-;41808:7;41837:5;41826:16;;41771:77;;;:::o;41854:154::-;41938:6;41933:3;41928;41915:30;42000:1;41991:6;41986:3;41982:16;41975:27;41854:154;;;:::o;42014:307::-;42082:1;42092:113;42106:6;42103:1;42100:13;42092:113;;;42191:1;42186:3;42182:11;42176:18;42172:1;42167:3;42163:11;42156:39;42128:2;42125:1;42121:10;42116:15;;42092:113;;;42223:6;42220:1;42217:13;42214:101;;;42303:1;42294:6;42289:3;42285:16;42278:27;42214:101;42063:258;42014:307;;;:::o;42327:320::-;42371:6;42408:1;42402:4;42398:12;42388:22;;42455:1;42449:4;42445:12;42476:18;42466:81;;42532:4;42524:6;42520:17;42510:27;;42466:81;42594:2;42586:6;42583:14;42563:18;42560:38;42557:84;;;42613:18;;:::i;:::-;42557:84;42378:269;42327:320;;;:::o;42653:281::-;42736:27;42758:4;42736:27;:::i;:::-;42728:6;42724:40;42866:6;42854:10;42851:22;42830:18;42818:10;42815:34;42812:62;42809:88;;;42877:18;;:::i;:::-;42809:88;42917:10;42913:2;42906:22;42696:238;42653:281;;:::o;42940:233::-;42979:3;43002:24;43020:5;43002:24;:::i;:::-;42993:33;;43048:66;43041:5;43038:77;43035:103;;;43118:18;;:::i;:::-;43035:103;43165:1;43158:5;43154:13;43147:20;;42940:233;;;:::o;43179:176::-;43211:1;43228:20;43246:1;43228:20;:::i;:::-;43223:25;;43262:20;43280:1;43262:20;:::i;:::-;43257:25;;43301:1;43291:35;;43306:18;;:::i;:::-;43291:35;43347:1;43344;43340:9;43335:14;;43179:176;;;;:::o;43361:180::-;43409:77;43406:1;43399:88;43506:4;43503:1;43496:15;43530:4;43527:1;43520:15;43547:180;43595:77;43592:1;43585:88;43692:4;43689:1;43682:15;43716:4;43713:1;43706:15;43733:180;43781:77;43778:1;43771:88;43878:4;43875:1;43868:15;43902:4;43899:1;43892:15;43919:180;43967:77;43964:1;43957:88;44064:4;44061:1;44054:15;44088:4;44085:1;44078:15;44105:180;44153:77;44150:1;44143:88;44250:4;44247:1;44240:15;44274:4;44271:1;44264:15;44291:117;44400:1;44397;44390:12;44414:117;44523:1;44520;44513:12;44537:117;44646:1;44643;44636:12;44660:117;44769:1;44766;44759:12;44783:102;44824:6;44875:2;44871:7;44866:2;44859:5;44855:14;44851:28;44841:38;;44783:102;;;:::o;44891:237::-;45031:34;45027:1;45019:6;45015:14;45008:58;45100:20;45095:2;45087:6;45083:15;45076:45;44891:237;:::o;45134:225::-;45274:34;45270:1;45262:6;45258:14;45251:58;45343:8;45338:2;45330:6;45326:15;45319:33;45134:225;:::o;45365:178::-;45505:30;45501:1;45493:6;45489:14;45482:54;45365:178;:::o;45549:170::-;45689:22;45685:1;45677:6;45673:14;45666:46;45549:170;:::o;45725:223::-;45865:34;45861:1;45853:6;45849:14;45842:58;45934:6;45929:2;45921:6;45917:15;45910:31;45725:223;:::o;45954:175::-;46094:27;46090:1;46082:6;46078:14;46071:51;45954:175;:::o;46135:231::-;46275:34;46271:1;46263:6;46259:14;46252:58;46344:14;46339:2;46331:6;46327:15;46320:39;46135:231;:::o;46372:179::-;46512:31;46508:1;46500:6;46496:14;46489:55;46372:179;:::o;46557:243::-;46697:34;46693:1;46685:6;46681:14;46674:58;46766:26;46761:2;46753:6;46749:15;46742:51;46557:243;:::o;46806:232::-;46946:34;46942:1;46934:6;46930:14;46923:58;47015:15;47010:2;47002:6;46998:15;46991:40;46806:232;:::o;47044:229::-;47184:34;47180:1;47172:6;47168:14;47161:58;47253:12;47248:2;47240:6;47236:15;47229:37;47044:229;:::o;47279:228::-;47419:34;47415:1;47407:6;47403:14;47396:58;47488:11;47483:2;47475:6;47471:15;47464:36;47279:228;:::o;47513:247::-;47653:34;47649:1;47641:6;47637:14;47630:58;47722:30;47717:2;47709:6;47705:15;47698:55;47513:247;:::o;47766:182::-;47906:34;47902:1;47894:6;47890:14;47883:58;47766:182;:::o;47954:231::-;48094:34;48090:1;48082:6;48078:14;48071:58;48163:14;48158:2;48150:6;48146:15;48139:39;47954:231;:::o;48191:182::-;48331:34;48327:1;48319:6;48315:14;48308:58;48191:182;:::o;48379:173::-;48519:25;48515:1;48507:6;48503:14;48496:49;48379:173;:::o;48558:228::-;48698:34;48694:1;48686:6;48682:14;48675:58;48767:11;48762:2;48754:6;48750:15;48743:36;48558:228;:::o;48792:234::-;48932:34;48928:1;48920:6;48916:14;48909:58;49001:17;48996:2;48988:6;48984:15;48977:42;48792:234;:::o;49032:221::-;49172:34;49168:1;49160:6;49156:14;49149:58;49241:4;49236:2;49228:6;49224:15;49217:29;49032:221;:::o;49259:220::-;49399:34;49395:1;49387:6;49383:14;49376:58;49468:3;49463:2;49455:6;49451:15;49444:28;49259:220;:::o;49485:364::-;49625:34;49621:1;49613:6;49609:14;49602:58;49698:34;49693:2;49685:6;49681:15;49674:59;49767:34;49762:2;49754:6;49750:15;49743:59;49836:5;49831:2;49823:6;49819:15;49812:30;49485:364;:::o;49855:182::-;49995:34;49991:1;49983:6;49979:14;49972:58;49855:182;:::o;50043:114::-;;:::o;50163:170::-;50303:22;50299:1;50291:6;50287:14;50280:46;50163:170;:::o;50339:224::-;50479:34;50475:1;50467:6;50463:14;50456:58;50548:7;50543:2;50535:6;50531:15;50524:32;50339:224;:::o;50569:236::-;50709:34;50705:1;50697:6;50693:14;50686:58;50778:19;50773:2;50765:6;50761:15;50754:44;50569:236;:::o;50811:169::-;50951:21;50947:1;50939:6;50935:14;50928:45;50811:169;:::o;50986:122::-;51059:24;51077:5;51059:24;:::i;:::-;51052:5;51049:35;51039:63;;51098:1;51095;51088:12;51039:63;50986:122;:::o;51114:116::-;51184:21;51199:5;51184:21;:::i;:::-;51177:5;51174:32;51164:60;;51220:1;51217;51210:12;51164:60;51114:116;:::o;51236:120::-;51308:23;51325:5;51308:23;:::i;:::-;51301:5;51298:34;51288:62;;51346:1;51343;51336:12;51288:62;51236:120;:::o;51362:122::-;51435:24;51453:5;51435:24;:::i;:::-;51428:5;51425:35;51415:63;;51474:1;51471;51464:12;51415:63;51362:122;:::o
Swarm Source
ipfs://5d9bd6f0d8c4acb23415a792d685d041a383e1764debe4ea8b79c73848cfc92f
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.