ERC-721
Overview
Max Total Supply
0 MOONDID
Holders
24
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
0 MOONDIDLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
Web3Domains
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at moonbeam.moonscan.io on 2022-09-26 */ // SPDX-License-Identifier: MIT 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; } } pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.0; /** * @dev 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); } } 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); } } } } 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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } pragma solidity ^0.8.0; /** * @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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _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 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 {} } pragma solidity ^0.8.0; abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } pragma solidity ^0.8.0; /** * @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); } library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } contract AdminControl is Ownable { using Roles for Roles.Role; Roles.Role private _controllerRoles; modifier onlyMinterController() { require ( hasRole(msg.sender), "AdminControl: sender must has minting role" ); _; } modifier onlyMinter() { require ( hasRole(msg.sender), "AdminControl: sender must has minting role" ); _; } constructor() { _grantRole(msg.sender); } function grantMinterRole (address account) public onlyOwner { _grantRole(account); } function revokeMinterRole (address account) public onlyOwner { _revokeRole(account); } function hasRole(address account) public view returns (bool) { return _controllerRoles.has(account); } function _grantRole (address account) internal { _controllerRoles.add(account); } function _revokeRole (address account) internal { _controllerRoles.remove(account); } } library StringUtil { /** * @dev Return the count of the dot "." in a string */ function dotCount(string memory s) internal pure returns (uint) { s; // Don't warn about unused variables // Starting here means the LSB will be the byte we care about uint ptr; uint end; assembly { ptr := add(s, 1) end := add(mload(s), ptr) } uint num = 0; uint len = 0; for (len; ptr < end; len++) { uint8 b; assembly { b := and(mload(ptr), 0xFF) } if (b == 0x2e) { num += 1; } ptr += 1; } return num; } function toLower(string memory str) internal pure returns (string memory) { bytes memory bStr = bytes(str); bytes memory bLower = new bytes(bStr.length); for (uint i = 0; i < bStr.length; i++) { // Uppercase character... if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) { // So we add 32 to make it lowercase bLower[i] = bytes1(uint8(bStr[i]) + 32); } else { bLower[i] = bStr[i]; } } return string(bLower); } function toHash(string memory _s) internal pure returns (bytes32) { return keccak256(abi.encode(_s)); } function isEmpty(string memory _s) internal pure returns (bool) { return bytes(_s).length == 0; } function hasWhiteSpace(string memory str) internal pure returns (bool){ bytes memory bStr = bytes(str); for(uint i = 0; i < bStr.length; i++){ bytes1 char = bStr[i]; if(char == 0x20) { return true; } } return false; } function compare(string memory _a, string memory _b) internal pure returns (int) { bytes memory a = bytes(_a); bytes memory b = bytes(_b); uint minLength = a.length; if (b.length < minLength) minLength = b.length; //@todo unroll the loop into increments of 32 and do full 32 byte comparisons for (uint i = 0; i < minLength; i ++) if (a[i] < b[i]) return -1; else if (a[i] > b[i]) return 1; if (a.length < b.length) return -1; else if (a.length > b.length) return 1; else return 0; } /// @dev Compares two strings and returns true iff they are equal. function equal(string memory _a, string memory _b) internal pure returns (bool) { return compare(_a, _b) == 0; } /// @dev Finds the index of the first occurrence of _needle in _haystack function indexOf(string memory _haystack, string memory _needle) internal pure returns (int) { bytes memory h = bytes(_haystack); bytes memory n = bytes(_needle); if(h.length < 1 || n.length < 1 || (n.length > h.length)) return -1; else if(h.length > (2**128 -1)) // since we have to be able to return -1 (if the char isn't found or input error), this function must return an "int" type with a max length of (2^128 - 1) return -1; else { uint subindex = 0; for (uint i = 0; i < h.length; i ++) { if (h[i] == n[0]) // found the first char of b { subindex = 1; while(subindex < n.length && (i + subindex) < h.length && h[i + subindex] == n[subindex]) // search until the chars don't match or until we reach the end of a or b { subindex++; } if(subindex == n.length) return int(i); } } return -1; } } } library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } pragma solidity ^0.8.0; abstract contract KeyStorage { mapping(uint256 => string) private _keys; function getKey(uint256 keyHash) public view returns (string memory) { return _keys[keyHash]; } function getKeys(uint256[] calldata hashes) public view returns (string[] memory values) { values = new string[](hashes.length); for (uint256 i = 0; i < hashes.length; i++) { values[i] = getKey(hashes[i]); } } function addKey(string memory key) external { _addKey(uint256(keccak256(abi.encodePacked(key))), key); } function _existsKey(uint256 keyHash) internal view returns (bool) { return bytes(_keys[keyHash]).length > 0; } function _addKey(uint256 keyHash, string memory key) internal { if (!_existsKey(keyHash)) { _keys[keyHash] = key; } } } pragma solidity ^0.8.0; interface IRecordReader { /** * @dev Function to get record. * @param key The key to query the value of. * @param tokenId The token id to fetch. * @return The value string. */ function get(string calldata key, uint256 tokenId) external view returns (string memory); /** * @dev Function to get multiple record. * @param keys The keys to query the value of. * @param tokenId The token id to fetch. * @return The values. */ function getMany(string[] calldata keys, uint256 tokenId) external view returns (string[] memory); /** * @dev Function get value by provied key hash. * @param keyHash The key to query the value of. * @param tokenId The token id to set. */ function getByHash(uint256 keyHash, uint256 tokenId) external view returns (string memory key, string memory value); /** * @dev Function get values by provied key hashes. * @param keyHashes The key to query the value of. * @param tokenId The token id to set. */ function getManyByHash(uint256[] calldata keyHashes, uint256 tokenId) external view returns (string[] memory keys, string[] memory values); } pragma solidity ^0.8.0; interface IRecordStorage is IRecordReader { event Set(uint256 indexed tokenId, string indexed keyIndex, string indexed valueIndex, string key, string value); event NewKey(uint256 indexed tokenId, string indexed keyIndex, string key); event ResetRecords(uint256 indexed tokenId); /** * @dev Set record by key * @param key The key set the value of * @param value The value to set key to * @param tokenId ERC-721 token id to set */ function set( string calldata key, string calldata value, uint256 tokenId ) external; /** * @dev Set records by keys * @param keys The keys set the values of * @param values Records values * @param tokenId ERC-721 token id of the domain */ function setMany( string[] memory keys, string[] memory values, uint256 tokenId ) external; /** * @dev Set record by key hash * @param keyHash The key hash set the value of * @param value The value to set key to * @param tokenId ERC-721 token id to set */ function setByHash( uint256 keyHash, string calldata value, uint256 tokenId ) external; /** * @dev Set records by key hashes * @param keyHashes The key hashes set the values of * @param values Records values * @param tokenId ERC-721 token id of the domain */ function setManyByHash( uint256[] calldata keyHashes, string[] calldata values, uint256 tokenId ) external; /** * @dev Reset all domain records and set new ones * @param keys New record keys * @param values New record values * @param tokenId ERC-721 token id of the domain */ function reconfigure( string[] memory keys, string[] memory values, uint256 tokenId ) external; /** * @dev Function to reset all existing records on a domain. * @param tokenId ERC-721 token id to set. */ function reset(uint256 tokenId) external; } pragma solidity ^0.8.0; abstract contract RecordStorage is KeyStorage, IRecordStorage { /// @dev mapping of presetIds to keyIds to values mapping(uint256 => mapping(uint256 => string)) internal _records; /// @dev mapping of tokenIds to presetIds mapping(uint256 => uint256) internal _tokenPresets; function get(string calldata key, uint256 tokenId) external view override returns (string memory value) { value = _get(key, tokenId); } function getMany(string[] calldata keys, uint256 tokenId) external view override returns (string[] memory values) { values = new string[](keys.length); for (uint256 i = 0; i < keys.length; i++) { values[i] = _get(keys[i], tokenId); } } function getByHash(uint256 keyHash, uint256 tokenId) external view override returns (string memory key, string memory value) { (key, value) = _getByHash(keyHash, tokenId); } function getManyByHash(uint256[] calldata keyHashes, uint256 tokenId) external view override returns (string[] memory keys, string[] memory values) { keys = new string[](keyHashes.length); values = new string[](keyHashes.length); for (uint256 i = 0; i < keyHashes.length; i++) { (keys[i], values[i]) = _getByHash(keyHashes[i], tokenId); } } function _presetOf(uint256 tokenId) internal view virtual returns (uint256) { return _tokenPresets[tokenId] == 0 ? tokenId : _tokenPresets[tokenId]; } function _set( string calldata key, string calldata value, uint256 tokenId ) internal { uint256 keyHash = uint256(keccak256(abi.encodePacked(key))); _addKey(keyHash, key); _set(keyHash, key, value, tokenId); } function _setMany( string[] calldata keys, string[] calldata values, uint256 tokenId ) internal { for (uint256 i = 0; i < keys.length; i++) { _set(keys[i], values[i], tokenId); } } function _setByHash( uint256 keyHash, string calldata value, uint256 tokenId ) internal { require(_existsKey(keyHash), 'RecordStorage: KEY_NOT_FOUND'); _set(keyHash, getKey(keyHash), value, tokenId); } function _setManyByHash( uint256[] calldata keyHashes, string[] calldata values, uint256 tokenId ) internal { for (uint256 i = 0; i < keyHashes.length; i++) { _setByHash(keyHashes[i], values[i], tokenId); } } function _reconfigure( string[] calldata keys, string[] calldata values, uint256 tokenId ) internal { _reset(tokenId); _setMany(keys, values, tokenId); } function _reset(uint256 tokenId) internal { _tokenPresets[tokenId] = uint256(keccak256(abi.encodePacked(_presetOf(tokenId)))); emit ResetRecords(tokenId); } function _get(string memory key, uint256 tokenId) private view returns (string memory) { return _get(uint256(keccak256(abi.encodePacked(key))), tokenId); } function _getByHash(uint256 keyHash, uint256 tokenId) private view returns (string memory key, string memory value) { key = getKey(keyHash); value = _get(keyHash, tokenId); } function _get(uint256 keyHash, uint256 tokenId) private view returns (string memory) { return _records[_presetOf(tokenId)][keyHash]; } function _set( uint256 keyHash, string memory key, string memory value, uint256 tokenId ) private { if (bytes(_records[_presetOf(tokenId)][keyHash]).length == 0) { emit NewKey(tokenId, key, key); } _records[_presetOf(tokenId)][keyHash] = value; emit Set(tokenId, key, value, key, value); } } abstract contract BookingList is AdminControl { mapping(bytes => string) public _bookingList; bool public _isBookingListActive = false; function setBookingListActive() external onlyOwner { _isBookingListActive = !_isBookingListActive; } function addBookingLists(string[] calldata names) external onlyMinterController { for (uint256 i = 0; i < names.length; i++) { _bookingList[bytes(names[i])] = names[i]; } } function addBookingList(string calldata name) external onlyMinterController { _bookingList[bytes(name)] = name; } function removeBookingList(string calldata name) external onlyMinterController { delete _bookingList[bytes(name)]; } function chkInBookingList(string calldata name) external view returns (bool) { string memory _name = _bookingList[bytes(name)]; return bytes(_name).length > 0; } } pragma solidity ^0.8.0; interface IRegisterController { function getOwner(string memory domain) external view returns (address); function exists(uint256 tokenId) external view returns (bool); } pragma solidity ^0.8.0; contract Web3Domains is ERC721, ERC721Enumerable, AdminControl, RecordStorage, BookingList { using SafeMath for uint256; using EnumerableSet for EnumerableSet.UintSet; event NewURI(uint256 indexed tokenId, string tokenUri); mapping (uint256 => EnumerableSet.UintSet) private _subTokens; mapping (uint256 => string) public _tokenURIs; mapping(uint256 => bytes) public _nativeAddress; mapping (uint256 => address) internal _tokenResolvers; mapping(address => uint256) private _tokenReverses; mapping(uint256 => string) private _tlds; string private _nftBaseURI = ""; bool public _saleIsActive = true; bool public _saleTwoCharIsActive = false; bool public _saleOneCharIsActive = false; uint256 private _price = 1; uint256 private _1chartimes = 1000; uint256 private _2chartimes = 100; uint256 private _3chartimes = 20; uint256 private _4chartimes = 5; uint256 private _5chartimes = 1; address private contractV1 = address(0); modifier onlyApprovedOrOwner(uint256 tokenId) { require( _isApprovedOrOwner(_msgSender(), tokenId) ); _; } constructor() ERC721("Moon Web3 Identity", "MOONDID") { } function isApprovedOrOwner(address account, uint256 tokenId) external view returns(bool) { return _isApprovedOrOwner(account, tokenId); } function getOwner(string memory domain) external view returns (address) { string memory _domain = StringUtil.toLower(domain); uint256 tokenId = uint256(keccak256(abi.encodePacked(_domain))); return ownerOf(tokenId); } function getOwnerV1(string memory domain) external view returns (address){ try IRegisterController(contractV1).getOwner(domain) returns (address result) { return result; } catch { return address(0); } } function getDomainbyAddress(address account) external view returns (uint256[] memory tokenIds, string[] memory domains) { uint256 _balance = balanceOf(account); require(_balance > 0, ""); uint256[] memory _tokenIds = new uint256[](_balance); string[] memory _domains = new string[](_balance); for (uint256 i = 0; i < _balance; i++) { uint256 tokenId = tokenOfOwnerByIndex(account, i); string memory domain = _tokenURIs[tokenId]; _tokenIds[i] = tokenId; _domains[i] = domain; } tokenIds = _tokenIds; domains = _domains; } function exists(uint256 tokenId) external view returns (bool) { return _exists(tokenId); } function getPrice() public view returns (uint256) { return _price; } function getPrice2Char() public view returns (uint256) { return getPrice().mul(_2chartimes); } function getPrice3Char() public view returns (uint256) { return getPrice().mul(_3chartimes); } function getPrice4Char() public view returns (uint256) { return getPrice().mul(_4chartimes); } function get2charTimes() public view returns (uint256) { return _2chartimes; } function get3charTimes() public view returns (uint256) { return _3chartimes; } function get4charTimes() public view returns (uint256) { return _4chartimes; } function setTimes(uint256 _1chartimenew, uint256 _2chartimenew, uint256 _3chartimenew, uint256 _4chartimenew) public onlyOwner { _1chartimes = _1chartimenew; _2chartimes = _2chartimenew; _3chartimes = _3chartimenew; _4chartimes = _4chartimenew; } function setPrice(uint256 price) public onlyOwner { _price = price; } function setSaleStateTwoChar() public onlyOwner { _saleTwoCharIsActive = !_saleTwoCharIsActive; } function setSaleStateOneChar() public onlyOwner { _saleOneCharIsActive = !_saleOneCharIsActive; } function setTLD(string memory _tld) public onlyOwner { uint256 tokenId = genTokenId(_tld); _tlds[tokenId] = _tld; } function setContractV1(address _address) public onlyOwner { contractV1 = _address; } function isTLD(string memory _tld) public view returns (bool) { bool isExist = false; uint256 tokenId = genTokenId(_tld); if (bytes(_tlds[tokenId]).length != 0){ isExist = true; } return isExist; } function setSaleState() public onlyOwner { _saleIsActive = !_saleIsActive; } function _baseURI() internal view override returns (string memory) { return _nftBaseURI; } function setBaseURI(string memory _uri) external onlyOwner { _nftBaseURI = _uri; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; // If there is no base URI, return the token URI. string memory baseURI = _baseURI(); if (bytes(baseURI).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(baseURI, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(baseURI, tokenId)); } function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } function buyDomain(address to, string memory domain, string memory tld) external payable { require(_saleIsActive, "Sale must be active to buy"); require(to != address(0), "To address is null"); require(bytes(tld).length != 0, "TLD must be non-empty"); require(isTLD(tld) == true, "TLD not exist"); uint256 _length = bytes(domain).length; require(_length != 0, "Must be non-empty"); require(StringUtil.hasWhiteSpace(domain) == false, "Cannot contain whitespace"); require(StringUtil.dotCount(domain) == 0, "Cannot contain dot"); // Check BookingList if (_isBookingListActive == true){ string memory name = _bookingList[bytes(domain)]; require(bytes(name).length == 0, "This name is already reserved"); } string memory _domain = StringUtil.toLower(domain); string memory _tld = StringUtil.toLower(tld); _domain = string(abi.encodePacked(_domain, ".", _tld)); uint256 tokenId = genTokenId(_domain); // Check Contract V1 if (contractV1 != address(0)) { require(!IRegisterController(contractV1).exists(tokenId), "V1 Already exists"); } require (!_exists(tokenId), "Already exists"); if (_length == 1) { require(_saleOneCharIsActive == true, "One character need to be allowed to buy"); uint256 __price1 = getPrice().mul(_1chartimes); require(msg.value >= __price1, "Insufficient or Token value sent is not correct"); } if (_length == 2) { require(_saleTwoCharIsActive == true, "Two characters need to be allowed to buy"); uint256 __price2 = getPrice().mul(_2chartimes); require(msg.value >= __price2, "Insufficient or Token value sent is not correct"); } if (_length == 3) { uint256 __price3 = getPrice().mul(_3chartimes); require(msg.value >= __price3, "Insufficient or Token value sent is not correct"); } if (_length == 4) { uint256 __price4 = getPrice().mul(_4chartimes); require(msg.value >= __price4, "Insufficient or Token value sent is not correct"); } if (_length >= 5) { uint256 __price5 = getPrice(); require(msg.value >= __price5, "Insufficient or Token value sent is not correct"); } _safeMint(to, tokenId); _setTokenURI(tokenId, _domain); emit NewURI(tokenId, _domain); } function registerDomainBatch(address[] calldata owners, string[] memory domains, string memory tld) external onlyMinterController { for (uint256 i = 0; i < owners.length; i++) { string memory domain = StringUtil.toLower(domains[i]); address owner = owners[i]; if (bytes(domain).length > 0 && owner != address(0)) { uint256 tokenId = genTokenId(domain); if (!_exists(tokenId)) { _registerDomain(owner, domain, tld); } } } } function registerDomain(address to, string memory domain, string memory tld) external onlyMinterController { _registerDomain(to, domain, tld); } function _registerDomain(address to, string memory domain, string memory tld) internal { require(to != address(0), "To address is null"); require(bytes(tld).length != 0, "TLD must be non-empty"); require(isTLD(tld) == true, "TLD not exist"); require(bytes(domain).length != 0, "Must be non-empty"); require(StringUtil.hasWhiteSpace(domain) == false, "Cannot contain whitespace"); require(StringUtil.dotCount(domain) == 0, "Cannot contain dot"); string memory _domain = StringUtil.toLower(domain); string memory _tld = StringUtil.toLower(tld); _domain = string(abi.encodePacked(_domain, ".", _tld)); uint256 tokenId = genTokenId(_domain); if (contractV1 != address(0)) { require(!IRegisterController(contractV1).exists(tokenId), "V1 Already exists"); } require (!_exists(tokenId), "Already exists"); _safeMint(to, tokenId); _setTokenURI(tokenId, _domain); emit NewURI(tokenId, _domain); } function transferFrom( address from, address to, uint256 tokenId ) public virtual override(IERC721, ERC721) { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: not owner nor approved"); _reset(tokenId); _transfer(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override(IERC721, ERC721) { safeTransferFrom(from, to, tokenId, ""); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override(IERC721, ERC721) { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: not owner nor approved"); _reset(tokenId); _safeTransfer(from, to, tokenId, _data); } function burn(uint256 tokenId) public virtual { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: not owner nor approved"); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } if (_tokenReverses[_msgSender()] != 0) { delete _tokenReverses[_msgSender()]; } if (_tokenResolvers[tokenId] != address(0)) { delete _tokenResolvers[tokenId]; } _reset(tokenId); _burn(tokenId); } /** * Begin: set and get Reverses */ function reverseOf(address account) public view returns (string memory){ uint256 tokenId = _tokenReverses[account]; require(tokenId != 0, "ReverseResolver: REVERSE_RECORD_IS_EMPTY"); require(_isApprovedOrOwner(account, tokenId), "ReverseResolver: not owner nor approved"); return _tokenURIs[tokenId]; } function setReverse(uint256 tokenId) public { address _sender = _msgSender(); require(_isApprovedOrOwner(_sender, tokenId), "ReverseResolver: not owner nor approved"); _tokenReverses[_sender] = tokenId; } function removeReverse() public { address _sender = _msgSender(); uint256 tokenId = _tokenReverses[_sender]; require(tokenId != 0, "ReverseResolver: not owner nor approved"); delete _tokenReverses[_sender]; } /** * End: set and get Reverses */ /** * Begin: Subdomain */ function registerSubDomain(address to, uint256 tokenId, string memory sub) external onlyApprovedOrOwner(tokenId) { _safeMintSubDomain(to, tokenId, sub, ""); } function registerSubDomainOwner(address to, uint256 tokenId, string memory sub) external onlyMinterController { _safeMintSubDomain(to, tokenId, sub, ""); } function burnSubDomain(uint256 tokenId, string memory sub) external onlyApprovedOrOwner(tokenId) { _burnSubDomain(tokenId, sub); } function _safeMintSubDomain(address to, uint256 tokenId, string memory sub, bytes memory _data) internal { require(to != address(0)); require(bytes(sub).length != 0); require(StringUtil.hasWhiteSpace(sub) == false); require(StringUtil.dotCount(sub) == 0); require(_exists(tokenId)); string memory _sub = StringUtil.toLower(sub); bytes memory _newUri = abi.encodePacked(_sub, ".", _tokenURIs[tokenId]); uint256 _newTokenId = genTokenId(string(_newUri)); require (!_exists(_newTokenId), "Already exists"); uint256 count = StringUtil.dotCount(_tokenURIs[tokenId]); if (count == 1) { _subTokens[tokenId].add(_newTokenId); } if (bytes(_data).length != 0) { _safeMint(to, _newTokenId, _data); } else { _safeMint(to, _newTokenId); } _setTokenURI(_newTokenId, string(_newUri)); emit NewURI(_newTokenId, string(_newUri)); } function _burnSubDomain(uint256 tokenId, string memory sub) internal { string memory _sub = StringUtil.toLower(sub); bytes memory _newUri = abi.encodePacked(_sub, ".", _tokenURIs[tokenId]); uint256 _newTokenId = genTokenId(string(_newUri)); // remove sub tokenIds itself _subTokens[tokenId].remove(_newTokenId); if (bytes(_tokenURIs[_newTokenId]).length != 0) { delete _tokenURIs[_newTokenId]; } super._burn(_newTokenId); } function subTokenIdCount(uint256 tokenId) public view returns (uint256) { require (_exists(tokenId)); return _subTokens[tokenId].length(); } function subTokenIdByIndex(uint256 tokenId, uint256 index) public view returns (uint256) { require (subTokenIdCount(tokenId) > index); return _subTokens[tokenId].at(index); } /** * End:Subdomain */ /** * Begin: System */ function genTokenId(string memory label) public pure returns(uint256) { require (bytes(label).length != 0); return uint256(keccak256(abi.encodePacked(label))); } function withdraw() external payable onlyOwner { require(payable(msg.sender).send(address(this).balance)); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } /** * End: System */ /** * Begin: working with metadata */ function setManyMinter( string[] calldata keys, string[] calldata values, uint256 tokenId ) external onlyMinterController { _setMany(keys, values, tokenId); } function set( string calldata key, string calldata value, uint256 tokenId ) external onlyApprovedOrOwner(tokenId) { _set(key, value, tokenId); } function setMany( string[] calldata keys, string[] calldata values, uint256 tokenId ) external onlyApprovedOrOwner(tokenId) { _setMany(keys, values, tokenId); } function setByHash( uint256 keyHash, string calldata value, uint256 tokenId ) external override onlyApprovedOrOwner(tokenId) { _setByHash(keyHash, value, tokenId); } function setManyByHash( uint256[] calldata keyHashes, string[] calldata values, uint256 tokenId ) external override onlyApprovedOrOwner(tokenId) { _setManyByHash(keyHashes, values, tokenId); } function reconfigure( string[] calldata keys, string[] calldata values, uint256 tokenId ) external override onlyApprovedOrOwner(tokenId) { _reconfigure(keys, values, tokenId); } function reset(uint256 tokenId) external override onlyApprovedOrOwner(tokenId) { _reset(tokenId); } /** * End: metadata */ }
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":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"string","name":"keyIndex","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"NewKey","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenUri","type":"string"}],"name":"NewURI","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":"uint256","name":"tokenId","type":"uint256"}],"name":"ResetRecords","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"string","name":"keyIndex","type":"string"},{"indexed":true,"internalType":"string","name":"valueIndex","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"Set","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"_bookingList","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isBookingListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_nativeAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saleOneCharIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saleTwoCharIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenURIs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"addBookingList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"names","type":"string[]"}],"name":"addBookingLists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"}],"name":"addKey","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"sub","type":"string"}],"name":"burnSubDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"domain","type":"string"},{"internalType":"string","name":"tld","type":"string"}],"name":"buyDomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"chkInBookingList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"label","type":"string"}],"name":"genTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"get","outputs":[{"internalType":"string","name":"value","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get2charTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get3charTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get4charTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"keyHash","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getByHash","outputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDomainbyAddress","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"domains","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"keyHash","type":"uint256"}],"name":"getKey","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"hashes","type":"uint256[]"}],"name":"getKeys","outputs":[{"internalType":"string[]","name":"values","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMany","outputs":[{"internalType":"string[]","name":"values","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"keyHashes","type":"uint256[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getManyByHash","outputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"domain","type":"string"}],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"domain","type":"string"}],"name":"getOwnerV1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice2Char","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice3Char","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice4Char","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"grantMinterRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isApprovedOrOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tld","type":"string"}],"name":"isTLD","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"reconfigure","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"domain","type":"string"},{"internalType":"string","name":"tld","type":"string"}],"name":"registerDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"string[]","name":"domains","type":"string[]"},{"internalType":"string","name":"tld","type":"string"}],"name":"registerDomainBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"sub","type":"string"}],"name":"registerSubDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"sub","type":"string"}],"name":"registerSubDomainOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"removeBookingList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeReverse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"reset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"reverseOf","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"revokeMinterRole","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":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"set","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":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setBookingListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"keyHash","type":"uint256"},{"internalType":"string","name":"value","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setByHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setContractV1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"keyHashes","type":"uint256[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setManyByHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setManyMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setReverse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleStateOneChar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleStateTwoChar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tld","type":"string"}],"name":"setTLD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_1chartimenew","type":"uint256"},{"internalType":"uint256","name":"_2chartimenew","type":"uint256"},{"internalType":"uint256","name":"_3chartimenew","type":"uint256"},{"internalType":"uint256","name":"_4chartimenew","type":"uint256"}],"name":"setTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"subTokenIdByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"subTokenIdCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6010805460ff1916905560a0604052600060809081526017906200002490826200032d565b506018805462ffffff1916600190811790915560198190556103e8601a556064601b556014601c556005601d55601e55601f80546001600160a01b03191690553480156200007157600080fd5b50604051806040016040528060128152602001714d6f6f6e2057656233204964656e7469747960701b815250604051806040016040528060078152602001661353d3d391125160ca1b8152508160009081620000ce91906200032d565b506001620000dd82826200032d565b505050620000fa620000f46200010b60201b60201c565b6200010f565b620001053362000161565b620003f9565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200017c81600c6200017f60201b6200310d1790919060201c565b50565b6200018b828262000203565b15620001de5760405162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650060448201526064015b60405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620002685760405162461bcd60e51b815260206004820152602260248201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604482015261737360f01b6064820152608401620001d5565b506001600160a01b03166000908152602091909152604090205460ff1690565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002b357607f821691505b602082108103620002d457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200032857600081815260208120601f850160051c81016020861015620003035750805b601f850160051c820191505b8181101562000324578281556001016200030f565b5050505b505050565b81516001600160401b0381111562000349576200034962000288565b62000361816200035a84546200029e565b84620002da565b602080601f831160018114620003995760008415620003805750858301515b600019600386901b1c1916600185901b17855562000324565b600085815260208120601f198616915b82811015620003ca57888601518255948401946001909101908401620003a9565b5085821015620003e95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b615c3380620004096000396000f3fe6080604052600436106104945760003560e01c8063672b9f8111610260578063bc7c8ceb11610144578063d2315630116100c1578063ec129eea11610085578063ec129eea14610e0a578063f25eb5c114610e2a578063f2fde38b14610e3f578063f5c1f76e14610e5f578063f6283ad414610e7f578063f8f7065814610e9f57600080fd5b8063d231563014610d57578063e5f9da8814610d6c578063e985e9c514610d8c578063ea51819b14610dd5578063ea7b25be14610df557600080fd5b8063c87b56dd11610108578063c87b56dd14610cc2578063c8b1df2a14610ce2578063cc82d4f714610cf7578063ce92b33e14610d17578063d19f919d14610d3757600080fd5b8063bc7c8ceb14610c25578063bcba4c1b14610c53578063c479a80414610c73578063c6438cb814610c93578063c7bc6d6814610ca857600080fd5b80638c1e3744116101dd57806398d5fdca116101a157806398d5fdca14610b62578063a22cb46514610b77578063ad59e22614610b97578063b85afd2814610bb7578063b88d4fde14610be5578063bb5b27e114610c0557600080fd5b80638c1e374414610acf5780638da5cb5b14610aef57806391b7f5ed14610b0d57806395d89b4114610b2d57806398a6024314610b4257600080fd5b806376f909ae1161022457806376f909ae14610a2f57806377e9d00b14610a4f5780637ce4538314610a6f5780637e37479e14610a8f5780637ef09bca14610aaf57600080fd5b8063672b9f811461099757806369e2f0fb146109c55780636bc2290f146109e557806370a08231146109fa578063715018a614610a1a57600080fd5b80633ccfd60b116103875780634cd637b511610304578063559f7414116102c8578063559f7414146108ea57806355f804b31461090a5780635a4dacb01461092a5780635d893ba01461093d5780636352211e14610957578063668cf4d81461097757600080fd5b80634cd637b5146108555780634f558e791461086a5780634f6ccce71461088a57806350382c1a146108aa57806350b3a144146108ca57600080fd5b8063434d8aca1161034b578063434d8aca146107c05780634500d449146107e057806347c81699146107f55780634a72584d146108155780634aaf4a121461083557600080fd5b80633ccfd60b146107385780633dd1eb611461074057806342842e0e1461076057806342966c6814610780578063430c2081146107a057600080fd5b80631be5e7ed116104155780632dc50d9a116103d95780632dc50d9a146106a35780632f745c59146106c3578063310bd74b146106e3578063358deb1c14610703578063384e9a551461071857600080fd5b80631be5e7ed1461060e5780631ed405591461062e5780632319afde1461064357806323b872dd1461066357806327f189751461068357600080fd5b80630bb78ec11161045c5780630bb78ec1146105695780630ea2f89e14610589578063157c6138146105a957806318160ddd146105cc5780631bd8cc1a146105e157600080fd5b806301ffc9a7146104995780630302e953146104ce57806306fdde03146104ed578063081812fc1461050f578063095ea7b314610547575b600080fd5b3480156104a557600080fd5b506104b96104b4366004614c73565b610ebf565b60405190151581526020015b60405180910390f35b3480156104da57600080fd5b506018546104b990610100900460ff1681565b3480156104f957600080fd5b50610502610ed0565b6040516104c59190614ce0565b34801561051b57600080fd5b5061052f61052a366004614cf3565b610f62565b6040516001600160a01b0390911681526020016104c5565b34801561055357600080fd5b50610567610562366004614d21565b610fef565b005b34801561057557600080fd5b50610502610584366004614cf3565b611104565b34801561059557600080fd5b506018546104b99062010000900460ff1681565b3480156105b557600080fd5b506105be61119e565b6040519081526020016104c5565b3480156105d857600080fd5b506008546105be565b3480156105ed57600080fd5b506106016105fc366004614d98565b6111ba565b6040516104c59190614e3b565b34801561061a57600080fd5b50610502610629366004614e8f565b6112b0565b34801561063a57600080fd5b506105676112fb565b34801561064f57600080fd5b5061056761065e366004614ec6565b611339565b34801561066f57600080fd5b5061056761067e366004614f07565b6113ef565b34801561068f57600080fd5b5061056761069e366004614f48565b61145a565b3480156106af57600080fd5b506105be6106be366004614fbb565b611482565b3480156106cf57600080fd5b506105be6106de366004614d21565b6114b7565b3480156106ef57600080fd5b506105676106fe366004614cf3565b61154d565b34801561070f57600080fd5b50601c546105be565b34801561072457600080fd5b50610567610733366004614cf3565b61156d565b6105676115ae565b34801561074c57600080fd5b5061056761075b366004614fdd565b6115fe565b34801561076c57600080fd5b5061056761077b366004614f07565b611634565b34801561078c57600080fd5b5061056761079b366004614cf3565b61164f565b3480156107ac57600080fd5b506104b96107bb366004614d21565b61175c565b3480156107cc57600080fd5b506105026107db3660046150af565b611768565b3480156107ec57600080fd5b5061056761178c565b34801561080157600080fd5b506105676108103660046150e3565b6117d3565b34801561082157600080fd5b50610567610830366004615144565b6117f3565b34801561084157600080fd5b5061052f6108503660046150af565b611819565b34801561086157600080fd5b506105be61185e565b34801561087657600080fd5b506104b9610885366004614cf3565b61186f565b34801561089657600080fd5b506105be6108a5366004614cf3565b61187a565b3480156108b657600080fd5b506105676108c53660046150af565b61190d565b3480156108d657600080fd5b506105be6108e53660046150af565b611940565b3480156108f657600080fd5b50610567610905366004615196565b61197f565b34801561091657600080fd5b506105676109253660046150af565b6119d3565b6105676109383660046151cb565b611a09565b34801561094957600080fd5b506018546104b99060ff1681565b34801561096357600080fd5b5061052f610972366004614cf3565b6120b6565b34801561098357600080fd5b50610567610992366004614f48565b61212d565b3480156109a357600080fd5b506109b76109b2366004614fbb565b61215f565b6040516104c5929190615240565b3480156109d157600080fd5b506105676109e0366004614fdd565b612177565b3480156109f157600080fd5b50601b546105be565b348015610a0657600080fd5b506105be610a15366004614fdd565b6121aa565b348015610a2657600080fd5b50610567612231565b348015610a3b57600080fd5b506105be610a4a366004614cf3565b612265565b348015610a5b57600080fd5b50610567610a6a3660046151cb565b612290565b348015610a7b57600080fd5b50610567610a8a366004615196565b6122c0565b348015610a9b57600080fd5b50610502610aaa366004614fdd565b612311565b348015610abb57600080fd5b506104b9610aca366004614fdd565b612452565b348015610adb57600080fd5b50610567610aea36600461526e565b61245f565b348015610afb57600080fd5b50600b546001600160a01b031661052f565b348015610b1957600080fd5b50610567610b28366004614cf3565b61253a565b348015610b3957600080fd5b50610502612569565b348015610b4e57600080fd5b50610567610b5d36600461537c565b612578565b348015610b6e57600080fd5b506019546105be565b348015610b8357600080fd5b50610567610b923660046153d8565b6125ac565b348015610ba357600080fd5b50610567610bb23660046150af565b612670565b348015610bc357600080fd5b50610bd7610bd2366004614d98565b6126c0565b6040516104c5929190615411565b348015610bf157600080fd5b50610567610c00366004615436565b6127e2565b348015610c1157600080fd5b50610502610c20366004614cf3565b61284d565b348015610c3157600080fd5b50610c45610c40366004614fdd565b6128ef565b6040516104c5929190615495565b348015610c5f57600080fd5b50610502610c6e366004614cf3565b612ad2565b348015610c7f57600080fd5b50610567610c8e3660046154ec565b612aeb565b348015610c9f57600080fd5b506105be612b08565b348015610cb457600080fd5b506010546104b99060ff1681565b348015610cce57600080fd5b50610502610cdd366004614cf3565b612b19565b348015610cee57600080fd5b50610567612c82565b348015610d0357600080fd5b50610567610d1236600461537c565b612ccb565b348015610d2357600080fd5b50610567610d32366004614f48565b612d0b565b348015610d4357600080fd5b5061052f610d523660046150af565b612d2b565b348015610d6357600080fd5b50601d546105be565b348015610d7857600080fd5b506104b9610d873660046150af565b612da1565b348015610d9857600080fd5b506104b9610da7366004615532565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610de157600080fd5b50610567610df0366004615560565b612dde565b348015610e0157600080fd5b50610567612e1c565b348015610e1657600080fd5b50610567610e25366004614f48565b612e5a565b348015610e3657600080fd5b50610567612e7a565b348015610e4b57600080fd5b50610567610e5a366004614fdd565b612ec5565b348015610e6b57600080fd5b50610601610e7a366004614ec6565b612f5d565b348015610e8b57600080fd5b506104b9610e9a366004615196565b613009565b348015610eab57600080fd5b50610567610eba366004614fdd565b6130c1565b6000610eca82613189565b92915050565b606060008054610edf90615592565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0b90615592565b8015610f585780601f10610f2d57610100808354040283529160200191610f58565b820191906000526020600020905b815481529060010190602001808311610f3b57829003601f168201915b5050505050905090565b6000610f6d826131ae565b610fd35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ffa826120b6565b9050806001600160a01b0316836001600160a01b0316036110675760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610fca565b336001600160a01b038216148061108357506110838133610da7565b6110f55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610fca565b6110ff83836131cb565b505050565b6012602052600090815260409020805461111d90615592565b80601f016020809104026020016040519081016040528092919081815260200182805461114990615592565b80156111965780601f1061116b57610100808354040283529160200191611196565b820191906000526020600020905b81548152906001019060200180831161117957829003601f168201915b505050505081565b60006111b5601b546111af60195490565b90613239565b905090565b6060826001600160401b038111156111d4576111d4614ffa565b60405190808252806020026020018201604052801561120757816020015b60608152602001906001900390816111f25790505b50905060005b838110156112a85761127885858381811061122a5761122a6155cc565b905060200281019061123c91906155e2565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250613245915050565b82828151811061128a5761128a6155cc565b602002602001018190525080806112a09061563e565b91505061120d565b509392505050565b60606112f384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250613245915050565b949350505050565b600b546001600160a01b031633146113255760405162461bcd60e51b8152600401610fca90615657565b6018805460ff19811660ff90911615179055565b61134233612452565b61135e5760405162461bcd60e51b8152600401610fca9061568c565b60005b818110156110ff5782828281811061137b5761137b6155cc565b905060200281019061138d91906155e2565b600f8585858181106113a1576113a16155cc565b90506020028101906113b391906155e2565b6040516113c19291906156d6565b908152602001604051809103902091826113dc92919061572c565b50806113e78161563e565b915050611361565b6113fa335b8261327a565b6114465760405162461bcd60e51b815260206004820152601e60248201527f4552433732313a206e6f74206f776e6572206e6f7220617070726f76656400006044820152606401610fca565b61144f81613360565b6110ff8383836133cd565b80611464336113f4565b61146d57600080fd5b61147a8686868686613578565b505050505050565b60008161148e84612265565b1161149857600080fd5b60008381526011602052604090206114b090836135db565b9392505050565b60006114c2836121aa565b82106115245760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610fca565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b80611557336113f4565b61156057600080fd5b61156982613360565b5050565b33611578818361327a565b6115945760405162461bcd60e51b8152600401610fca906157eb565b6001600160a01b0316600090815260156020526040902055565b600b546001600160a01b031633146115d85760405162461bcd60e51b8152600401610fca90615657565b60405133904780156108fc02916000818181858888f193505050506115fc57600080fd5b565b600b546001600160a01b031633146116285760405162461bcd60e51b8152600401610fca90615657565b611631816135e7565b50565b6110ff838383604051806020016040528060008152506127e2565b611658336113f4565b6116b35760405162461bcd60e51b815260206004820152602660248201527f4552433732314275726e61626c653a206e6f74206f776e6572206e6f722061706044820152651c1c9bdd995960d21b6064820152608401610fca565b600081815260126020526040902080546116cc90615592565b1590506116ea5760008181526012602052604081206116ea91614c13565b336000908152601560205260409020541561171057336000908152601560205260408120555b6000818152601460205260409020546001600160a01b03161561174a57600081815260146020526040902080546001600160a01b03191690555b61175381613360565b611631816135f2565b60006114b0838361327a565b8051602081830181018051600f825292820191909301209152805461111d90615592565b600b546001600160a01b031633146117b65760405162461bcd60e51b8152600401610fca90615657565b6018805461ff001981166101009182900460ff1615909102179055565b806117dd336113f4565b6117e657600080fd5b61147a8686868686613699565b806117fd336113f4565b61180657600080fd5b61181285858585613778565b5050505050565b60008061182583613818565b905060008160405160200161183a9190615832565b6040516020818303038152906040528051906020012060001c90506112f3816120b6565b60006111b5601d546111af60195490565b6000610eca826131ae565b600061188560085490565b82106118e85760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610fca565b600882815481106118fb576118fb6155cc565b90600052602060002001549050919050565b611631816040516020016119219190615832565b6040516020818303038152906040528051906020012060001c82613972565b6000815160000361195057600080fd5b816040516020016119619190615832565b60408051601f19818403018152919052805160209091012092915050565b61198833612452565b6119a45760405162461bcd60e51b8152600401610fca9061568c565b8181600f84846040516119b89291906156d6565b908152602001604051809103902091826110ff92919061572c565b600b546001600160a01b031633146119fd5760405162461bcd60e51b8152600401610fca90615657565b6017611569828261584e565b60185460ff16611a5b5760405162461bcd60e51b815260206004820152601a60248201527f53616c65206d7573742062652061637469766520746f206275790000000000006044820152606401610fca565b6001600160a01b038316611aa65760405162461bcd60e51b8152602060048201526012602482015271151bc81859191c995cdcc81a5cc81b9d5b1b60721b6044820152606401610fca565b8051600003611aef5760405162461bcd60e51b8152602060048201526015602482015274544c44206d757374206265206e6f6e2d656d70747960581b6044820152606401610fca565b611af881612da1565b1515600114611b395760405162461bcd60e51b815260206004820152600d60248201526c151311081b9bdd08195e1a5cdd609a1b6044820152606401610fca565b81516000819003611b805760405162461bcd60e51b81526020600482015260116024820152704d757374206265206e6f6e2d656d70747960781b6044820152606401610fca565b611b8983613997565b15611bd25760405162461bcd60e51b815260206004820152601960248201527843616e6e6f7420636f6e7461696e207768697465737061636560381b6044820152606401610fca565b611bdb836139fe565b15611c1d5760405162461bcd60e51b815260206004820152601260248201527110d85b9b9bdd0818dbdb9d185a5b88191bdd60721b6044820152606401610fca565b60105460ff161515600103611d2a576000600f84604051611c3e9190615832565b90815260200160405180910390208054611c5790615592565b80601f0160208091040260200160405190810160405280929190818152602001828054611c8390615592565b8015611cd05780601f10611ca557610100808354040283529160200191611cd0565b820191906000526020600020905b815481529060010190602001808311611cb357829003601f168201915b505050505090508051600014611d285760405162461bcd60e51b815260206004820152601d60248201527f54686973206e616d6520697320616c72656164792072657365727665640000006044820152606401610fca565b505b6000611d3584613818565b90506000611d4284613818565b90508181604051602001611d5792919061590d565b60405160208183030381529060405291506000611d7383611940565b601f549091506001600160a01b031615611e3557601f54604051634f558e7960e01b8152600481018390526001600160a01b0390911690634f558e7990602401602060405180830381865afa158015611dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df49190615949565b15611e355760405162461bcd60e51b8152602060048201526011602482015270563120416c72656164792065786973747360781b6044820152606401610fca565b611e3e816131ae565b15611e5b5760405162461bcd60e51b8152600401610fca90615966565b83600103611f055760185462010000900460ff161515600114611ed05760405162461bcd60e51b815260206004820152602760248201527f4f6e6520636861726163746572206e65656420746f20626520616c6c6f77656460448201526620746f2062757960c81b6064820152608401610fca565b6000611ee1601a546111af60195490565b905080341015611f035760405162461bcd60e51b8152600401610fca9061598e565b505b83600203611fb05760185460ff610100909104161515600114611f7b5760405162461bcd60e51b815260206004820152602860248201527f54776f2063686172616374657273206e65656420746f20626520616c6c6f77656044820152676420746f2062757960c01b6064820152608401610fca565b6000611f8c601b546111af60195490565b905080341015611fae5760405162461bcd60e51b8152600401610fca9061598e565b505b83600303611fed576000611fc9601c546111af60195490565b905080341015611feb5760405162461bcd60e51b8152600401610fca9061598e565b505b8360040361202a576000612006601d546111af60195490565b9050803410156120285760405162461bcd60e51b8152600401610fca9061598e565b505b6005841061206157600061203d60195490565b90508034101561205f5760405162461bcd60e51b8152600401610fca9061598e565b505b61206b8782613a5d565b6120758184613a77565b807fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c3952846040516120a59190614ce0565b60405180910390a250505050505050565b6000818152600260205260408120546001600160a01b031680610eca5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610fca565b61213633612452565b6121525760405162461bcd60e51b8152600401610fca9061568c565b6118128585858585613af9565b60608061216c8484613b67565b909590945092505050565b600b546001600160a01b031633146121a15760405162461bcd60e51b8152600401610fca90615657565b61163181613b88565b60006001600160a01b0382166122155760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610fca565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b0316331461225b5760405162461bcd60e51b8152600401610fca90615657565b6115fc6000613b93565b6000612270826131ae565b61227957600080fd5b6000828152601160205260409020610eca90613be5565b61229933612452565b6122b55760405162461bcd60e51b8152600401610fca9061568c565b6110ff838383613bef565b6122c933612452565b6122e55760405162461bcd60e51b8152600401610fca9061568c565b600f82826040516122f79291906156d6565b908152602001604051809103902060006115699190614c13565b6001600160a01b03811660009081526015602052604081205460609181900361238d5760405162461bcd60e51b815260206004820152602860248201527f526576657273655265736f6c7665723a20524556455253455f5245434f52445f60448201526749535f454d50545960c01b6064820152608401610fca565b612397838261327a565b6123b35760405162461bcd60e51b8152600401610fca906157eb565b600081815260126020526040902080546123cc90615592565b80601f01602080910402602001604051908101604052809291908181526020018280546123f890615592565b80156124455780601f1061241a57610100808354040283529160200191612445565b820191906000526020600020905b81548152906001019060200180831161242857829003601f168201915b5050505050915050919050565b6000610eca600c83613f34565b61246833612452565b6124845760405162461bcd60e51b8152600401610fca9061568c565b60005b838110156118125760006124b38483815181106124a6576124a66155cc565b6020026020010151613818565b905060008686848181106124c9576124c96155cc565b90506020020160208101906124de9190614fdd565b9050600082511180156124f957506001600160a01b03811615155b1561252557600061250983611940565b9050612514816131ae565b61252357612523828487613bef565b505b505080806125329061563e565b915050612487565b600b546001600160a01b031633146125645760405162461bcd60e51b8152600401610fca90615657565b601955565b606060018054610edf90615592565b81612582336113f4565b61258b57600080fd5b6125a684848460405180602001604052806000815250613fb7565b50505050565b336001600160a01b038316036126045760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610fca565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b546001600160a01b0316331461269a5760405162461bcd60e51b8152600401610fca90615657565b60006126a582611940565b60008181526016602052604090209091506110ff838261584e565b606080836001600160401b038111156126db576126db614ffa565b60405190808252806020026020018201604052801561270e57816020015b60608152602001906001900390816126f95790505b509150836001600160401b0381111561272957612729614ffa565b60405190808252806020026020018201604052801561275c57816020015b60608152602001906001900390816127475790505b50905060005b848110156127d95761278c86868381811061277f5761277f6155cc565b9050602002013585613b67565b84838151811061279e5761279e6155cc565b602002602001018484815181106127b7576127b76155cc565b60200260200101829052829052505080806127d19061563e565b915050612762565b50935093915050565b6127ec338361327a565b6128385760405162461bcd60e51b815260206004820152601e60248201527f4552433732313a206e6f74206f776e6572206e6f7220617070726f76656400006044820152606401610fca565b61284182613360565b6125a6848484846141ba565b6000818152600a6020526040902080546060919061286a90615592565b80601f016020809104026020016040519081016040528092919081815260200182805461289690615592565b80156128e35780601f106128b8576101008083540402835291602001916128e3565b820191906000526020600020905b8154815290600101906020018083116128c657829003601f168201915b50505050509050919050565b60608060006128fd846121aa565b9050600081116129295760405162461bcd60e51b81526020600482015260006024820152604401610fca565b6000816001600160401b0381111561294357612943614ffa565b60405190808252806020026020018201604052801561296c578160200160208202803683370190505b5090506000826001600160401b0381111561298957612989614ffa565b6040519080825280602002602001820160405280156129bc57816020015b60608152602001906001900390816129a75790505b50905060005b83811015612ac65760006129d688836114b7565b6000818152601260205260408120805492935090916129f490615592565b80601f0160208091040260200160405190810160405280929190818152602001828054612a2090615592565b8015612a6d5780601f10612a4257610100808354040283529160200191612a6d565b820191906000526020600020905b815481529060010190602001808311612a5057829003601f168201915b5050505050905081858481518110612a8757612a876155cc565b60200260200101818152505080848481518110612aa657612aa66155cc565b602002602001018190525050508080612abe9061563e565b9150506129c2565b50909590945092505050565b6013602052600090815260409020805461111d90615592565b81612af5336113f4565b612afe57600080fd5b6110ff83836141ed565b60006111b5601c546111af60195490565b6060612b24826131ae565b612b885760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610fca565b60008281526012602052604081208054612ba190615592565b80601f0160208091040260200160405190810160405280929190818152602001828054612bcd90615592565b8015612c1a5780601f10612bef57610100808354040283529160200191612c1a565b820191906000526020600020905b815481529060010190602001808311612bfd57829003601f168201915b505050505090506000612c2b614299565b90508051600003612c3d575092915050565b815115612c6f578082604051602001612c579291906159dd565b60405160208183030381529060405292505050919050565b8084604051602001612c57929190615a0c565b600b546001600160a01b03163314612cac5760405162461bcd60e51b8152600401610fca90615657565b6018805462ff0000198116620100009182900460ff1615909102179055565b612cd433612452565b612cf05760405162461bcd60e51b8152600401610fca9061568c565b6110ff83838360405180602001604052806000815250613fb7565b80612d15336113f4565b612d1e57600080fd5b61147a8686868686613af9565b601f54604051632557a50960e11b81526000916001600160a01b031690634aaf4a1290612d5c908590600401614ce0565b602060405180830381865afa925050508015612d95575060408051601f3d908101601f19168201909252612d9291810190615a2e565b60015b610eca57506000919050565b60008080612dae84611940565b6000818152601660205260409020805491925090612dcb90615592565b159050612dd757600191505b5092915050565b600b546001600160a01b03163314612e085760405162461bcd60e51b8152600401610fca90615657565b601a93909355601b91909155601c55601d55565b600b546001600160a01b03163314612e465760405162461bcd60e51b8152600401610fca90615657565b6010805460ff19811660ff90911615179055565b80612e64336113f4565b612e6d57600080fd5b61147a86868686866142a8565b3360008181526015602052604081205490819003612eaa5760405162461bcd60e51b8152600401610fca906157eb565b506001600160a01b0316600090815260156020526040812055565b600b546001600160a01b03163314612eef5760405162461bcd60e51b8152600401610fca90615657565b6001600160a01b038116612f545760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fca565b61163181613b93565b6060816001600160401b03811115612f7757612f77614ffa565b604051908082528060200260200182016040528015612faa57816020015b6060815260200190600190039081612f955790505b50905060005b82811015612dd757612fd9848483818110612fcd57612fcd6155cc565b9050602002013561284d565b828281518110612feb57612feb6155cc565b602002602001018190525080806130019061563e565b915050612fb0565b600080600f848460405161301e9291906156d6565b9081526020016040518091039020805461303790615592565b80601f016020809104026020016040519081016040528092919081815260200182805461306390615592565b80156130b05780601f10613085576101008083540402835291602001916130b0565b820191906000526020600020905b81548152906001019060200180831161309357829003601f168201915b505092511515979650505050505050565b600b546001600160a01b031633146130eb5760405162461bcd60e51b8152600401610fca90615657565b601f80546001600160a01b0319166001600160a01b0392909216919091179055565b6131178282613f34565b156131645760405162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c65006044820152606401610fca565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160e01b0319821663780e9d6360e01b1480610eca5750610eca826142b1565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613200826120b6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006114b08284615a4b565b60606114b08360405160200161325b9190615832565b6040516020818303038152906040528051906020012060001c83614301565b6000613285826131ae565b6132e65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610fca565b60006132f1836120b6565b9050806001600160a01b0316846001600160a01b0316148061332c5750836001600160a01b031661332184610f62565b6001600160a01b0316145b806112f357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166112f3565b613369816143c0565b60405160200161337b91815260200190565b60408051601f1981840301815282825280516020918201206000858152600e9092529181209190915582917f185c30856dadb58bf097c1f665a52ada7029752dbcad008ea3fefc73bee8c9fe9190a250565b826001600160a01b03166133e0826120b6565b6001600160a01b0316146134485760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610fca565b6001600160a01b0382166134aa5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610fca565b6134b58383836143ec565b6134c06000826131cb565b6001600160a01b03831660009081526003602052604081208054600192906134e9908490615a6a565b90915550506001600160a01b0382166000908152600360205260408120805460019290613517908490615a7d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b8481101561147a576135c9868683818110613598576135986155cc565b905060200201358585848181106135b1576135b16155cc565b90506020028101906135c391906155e2565b85613778565b806135d38161563e565b91505061357b565b60006114b083836143f7565b611631600c8261310d565b60006135fd826120b6565b905061360b816000846143ec565b6136166000836131cb565b6001600160a01b038116600090815260036020526040812080546001929061363f908490615a6a565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600085856040516020016136ae9291906156d6565b60408051601f198184030181528282528051602091820120601f8901829004820284018201909252878352909250613702918391899089908190840183828082843760009201919091525061397292505050565b61147a8187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250889250614421915050565b61378184614556565b6137cd5760405162461bcd60e51b815260206004820152601c60248201527f5265636f726453746f726167653a204b45595f4e4f545f464f554e44000000006044820152606401610fca565b6125a6846137da8661284d565b85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250614421915050565b60606000829050600081516001600160401b0381111561383a5761383a614ffa565b6040519080825280601f01601f191660200182016040528015613864576020820181803683370190505b50905060005b82518110156112a8576041838281518110613887576138876155cc565b016020015160f81c108015906138b75750605a8382815181106138ac576138ac6155cc565b016020015160f81c11155b15613919578281815181106138ce576138ce6155cc565b602001015160f81c60f81b60f81c60206138e89190615a90565b60f81b8282815181106138fd576138fd6155cc565b60200101906001600160f81b031916908160001a905350613960565b82818151811061392b5761392b6155cc565b602001015160f81c60f81b828281518110613948576139486155cc565b60200101906001600160f81b031916908160001a9053505b8061396a8161563e565b91505061386a565b61397b82614556565b611569576000828152600a602052604090206110ff828261584e565b600081815b81518110156139f45760008282815181106139b9576139b96155cc565b01602001516001600160f81b0319169050600160fd1b8190036139e157506001949350505050565b50806139ec8161563e565b91505061399c565b5060009392505050565b805160009060018381019184010182805b82841015613a5457835160ff16602e819003613a3357613a30600184615a7d565b92505b613a3e600186615a7d565b9450508080613a4c9061563e565b915050613a0f565b50949350505050565b61156982826040518060200160405280600081525061457c565b613a80826131ae565b613ae15760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610fca565b60008281526012602052604090206110ff828261584e565b60005b8481101561147a57613b55868683818110613b1957613b196155cc565b9050602002810190613b2b91906155e2565b868685818110613b3d57613b3d6155cc565b9050602002810190613b4f91906155e2565b86613699565b80613b5f8161563e565b915050613afc565b606080613b738461284d565b9150613b7f8484614301565b90509250929050565b611631600c826145af565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000610eca825490565b6001600160a01b038316613c3a5760405162461bcd60e51b8152602060048201526012602482015271151bc81859191c995cdcc81a5cc81b9d5b1b60721b6044820152606401610fca565b8051600003613c835760405162461bcd60e51b8152602060048201526015602482015274544c44206d757374206265206e6f6e2d656d70747960581b6044820152606401610fca565b613c8c81612da1565b1515600114613ccd5760405162461bcd60e51b815260206004820152600d60248201526c151311081b9bdd08195e1a5cdd609a1b6044820152606401610fca565b8151600003613d125760405162461bcd60e51b81526020600482015260116024820152704d757374206265206e6f6e2d656d70747960781b6044820152606401610fca565b613d1b82613997565b15613d645760405162461bcd60e51b815260206004820152601960248201527843616e6e6f7420636f6e7461696e207768697465737061636560381b6044820152606401610fca565b613d6d826139fe565b15613daf5760405162461bcd60e51b815260206004820152601260248201527110d85b9b9bdd0818dbdb9d185a5b88191bdd60721b6044820152606401610fca565b6000613dba83613818565b90506000613dc783613818565b90508181604051602001613ddc92919061590d565b60405160208183030381529060405291506000613df883611940565b601f549091506001600160a01b031615613eba57601f54604051634f558e7960e01b8152600481018390526001600160a01b0390911690634f558e7990602401602060405180830381865afa158015613e55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e799190615949565b15613eba5760405162461bcd60e51b8152602060048201526011602482015270563120416c72656164792065786973747360781b6044820152606401610fca565b613ec3816131ae565b15613ee05760405162461bcd60e51b8152600401610fca90615966565b613eea8682613a5d565b613ef48184613a77565b807fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c395284604051613f249190614ce0565b60405180910390a2505050505050565b60006001600160a01b038216613f975760405162461bcd60e51b815260206004820152602260248201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604482015261737360f01b6064820152608401610fca565b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b038416613fca57600080fd5b8151600003613fd857600080fd5b613fe182613997565b15613feb57600080fd5b613ff4826139fe565b15613ffe57600080fd5b614007836131ae565b61401057600080fd5b600061401b83613818565b905060008160126000878152602001908152602001600020604051602001614044929190615aa9565b6040516020818303038152906040529050600061406082611940565b905061406b816131ae565b156140885760405162461bcd60e51b8152600401610fca90615966565b6000868152601260205260408120805461412991906140a690615592565b80601f01602080910402602001604051908101604052809291908181526020018280546140d290615592565b801561411f5780601f106140f45761010080835404028352916020019161411f565b820191906000526020600020905b81548152906001019060200180831161410257829003601f168201915b50505050506139fe565b90508060010361414d57600087815260116020526040902061414b9083614631565b505b8451156141645761415f88838761457c565b61416e565b61416e8883613a5d565b6141788284613a77565b817fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c3952846040516141a89190614ce0565b60405180910390a25050505050505050565b6141c58484846133cd565b6141d18484848461463d565b6125a65760405162461bcd60e51b8152600401610fca90615b45565b60006141f882613818565b905060008160126000868152602001908152602001600020604051602001614221929190615aa9565b6040516020818303038152906040529050600061423d82611940565b6000868152601160205260409020909150614258908261473e565b506000818152601260205260409020805461427290615592565b15905061429057600081815260126020526040812061429091614c13565b611812816135f2565b606060178054610edf90615592565b61215281613360565b60006001600160e01b031982166380ac58cd60e01b14806142e257506001600160e01b03198216635b5e139f60e01b145b80610eca57506301ffc9a760e01b6001600160e01b0319831614610eca565b6060600d6000614310846143c0565b81526020019081526020016000206000848152602001908152602001600020805461433a90615592565b80601f016020809104026020016040519081016040528092919081815260200182805461436690615592565b80156143b35780601f10614388576101008083540402835291602001916143b3565b820191906000526020600020905b81548152906001019060200180831161439657829003601f168201915b5050505050905092915050565b6000818152600e6020526040812054156143e8576000828152600e6020526040902054610eca565b5090565b6110ff83838361474a565b600082600001828154811061440e5761440e6155cc565b9060005260206000200154905092915050565b600d600061442e836143c0565b81526020019081526020016000206000858152602001908152602001600020805461445890615592565b90506000036144b0578260405161446f9190615832565b6040518091039020817f7ae4f661958fbecc2f77be6b0eb280d2a6f604b29e1e7221c82b9da0c4af7f86856040516144a79190614ce0565b60405180910390a35b81600d60006144be846143c0565b8152602001908152602001600020600086815260200190815260200160002090816144e9919061584e565b50816040516144f89190615832565b60405180910390208360405161450e9190615832565b6040518091039020827f851ffe8e74d5015261dba0a1f9e1b0e5d42c5af5d2ad1908fee897c7d80a0d928686604051614548929190615240565b60405180910390a450505050565b6000818152600a60205260408120805482919061457290615592565b9050119050919050565b6145868383614802565b614593600084848461463d565b6110ff5760405162461bcd60e51b8152600401610fca90615b45565b6145b98282613f34565b61460f5760405162461bcd60e51b815260206004820152602160248201527f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6044820152606560f81b6064820152608401610fca565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60006114b08383614941565b60006001600160a01b0384163b1561473357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614681903390899088908890600401615b97565b6020604051808303816000875af19250505080156146bc575060408051601f3d908101601f191682019092526146b991810190615bca565b60015b614719573d8080156146ea576040519150601f19603f3d011682016040523d82523d6000602084013e6146ef565b606091505b5080516000036147115760405162461bcd60e51b8152600401610fca90615b45565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506112f3565b506001949350505050565b60006114b08383614990565b6001600160a01b0383166147a5576147a081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6147c8565b816001600160a01b0316836001600160a01b0316146147c8576147c88382614a83565b6001600160a01b0382166147df576110ff81614b20565b826001600160a01b0316826001600160a01b0316146110ff576110ff8282614bcf565b6001600160a01b0382166148585760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610fca565b614861816131ae565b156148ae5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610fca565b6148ba600083836143ec565b6001600160a01b03821660009081526003602052604081208054600192906148e3908490615a7d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260018301602052604081205461498857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610eca565b506000610eca565b60008181526001830160205260408120548015614a795760006149b4600183615a6a565b85549091506000906149c890600190615a6a565b9050818114614a2d5760008660000182815481106149e8576149e86155cc565b9060005260206000200154905080876000018481548110614a0b57614a0b6155cc565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080614a3e57614a3e615be7565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610eca565b6000915050610eca565b60006001614a90846121aa565b614a9a9190615a6a565b600083815260076020526040902054909150808214614aed576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614b3290600190615a6a565b60008381526009602052604081205460088054939450909284908110614b5a57614b5a6155cc565b906000526020600020015490508060088381548110614b7b57614b7b6155cc565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614bb357614bb3615be7565b6001900381819060005260206000200160009055905550505050565b6000614bda836121aa565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b508054614c1f90615592565b6000825580601f10614c2f575050565b601f01602090049060005260206000209081019061163191905b808211156143e85760008155600101614c49565b6001600160e01b03198116811461163157600080fd5b600060208284031215614c8557600080fd5b81356114b081614c5d565b60005b83811015614cab578181015183820152602001614c93565b50506000910152565b60008151808452614ccc816020860160208601614c90565b601f01601f19169290920160200192915050565b6020815260006114b06020830184614cb4565b600060208284031215614d0557600080fd5b5035919050565b6001600160a01b038116811461163157600080fd5b60008060408385031215614d3457600080fd5b8235614d3f81614d0c565b946020939093013593505050565b60008083601f840112614d5f57600080fd5b5081356001600160401b03811115614d7657600080fd5b6020830191508360208260051b8501011115614d9157600080fd5b9250929050565b600080600060408486031215614dad57600080fd5b83356001600160401b03811115614dc357600080fd5b614dcf86828701614d4d565b909790965060209590950135949350505050565b600082825180855260208086019550808260051b84010181860160005b84811015614e2e57601f19868403018952614e1c838351614cb4565b98840198925090830190600101614e00565b5090979650505050505050565b6020815260006114b06020830184614de3565b60008083601f840112614e6057600080fd5b5081356001600160401b03811115614e7757600080fd5b602083019150836020828501011115614d9157600080fd5b600080600060408486031215614ea457600080fd5b83356001600160401b03811115614eba57600080fd5b614dcf86828701614e4e565b60008060208385031215614ed957600080fd5b82356001600160401b03811115614eef57600080fd5b614efb85828601614d4d565b90969095509350505050565b600080600060608486031215614f1c57600080fd5b8335614f2781614d0c565b92506020840135614f3781614d0c565b929592945050506040919091013590565b600080600080600060608688031215614f6057600080fd5b85356001600160401b0380821115614f7757600080fd5b614f8389838a01614d4d565b90975095506020880135915080821115614f9c57600080fd5b50614fa988828901614d4d565b96999598509660400135949350505050565b60008060408385031215614fce57600080fd5b50508035926020909101359150565b600060208284031215614fef57600080fd5b81356114b081614d0c565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561503857615038614ffa565b604052919050565b600082601f83011261505157600080fd5b81356001600160401b0381111561506a5761506a614ffa565b61507d601f8201601f1916602001615010565b81815284602083860101111561509257600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156150c157600080fd5b81356001600160401b038111156150d757600080fd5b6112f384828501615040565b6000806000806000606086880312156150fb57600080fd5b85356001600160401b038082111561511257600080fd5b61511e89838a01614e4e565b9097509550602088013591508082111561513757600080fd5b50614fa988828901614e4e565b6000806000806060858703121561515a57600080fd5b8435935060208501356001600160401b0381111561517757600080fd5b61518387828801614e4e565b9598909750949560400135949350505050565b600080602083850312156151a957600080fd5b82356001600160401b038111156151bf57600080fd5b614efb85828601614e4e565b6000806000606084860312156151e057600080fd5b83356151eb81614d0c565b925060208401356001600160401b038082111561520757600080fd5b61521387838801615040565b9350604086013591508082111561522957600080fd5b5061523686828701615040565b9150509250925092565b6040815260006152536040830185614cb4565b82810360208401526152658185614cb4565b95945050505050565b6000806000806060858703121561528457600080fd5b84356001600160401b038082111561529b57600080fd5b6152a788838901614d4d565b90965094506020915086820135818111156152c157600080fd5b8701601f810189136152d257600080fd5b8035828111156152e4576152e4614ffa565b8060051b6152f3858201615010565b918252828101850191858101908c84111561530d57600080fd5b86850192505b838310156153495782358681111561532b5760008081fd5b6153398e8983890101615040565b8352509186019190860190615313565b975050505060408801359250508082111561536357600080fd5b5061537087828801615040565b91505092959194509250565b60008060006060848603121561539157600080fd5b833561539c81614d0c565b92506020840135915060408401356001600160401b038111156153be57600080fd5b61523686828701615040565b801515811461163157600080fd5b600080604083850312156153eb57600080fd5b82356153f681614d0c565b91506020830135615406816153ca565b809150509250929050565b6040815260006154246040830185614de3565b82810360208401526152658185614de3565b6000806000806080858703121561544c57600080fd5b843561545781614d0c565b9350602085013561546781614d0c565b92506040850135915060608501356001600160401b0381111561548957600080fd5b61537087828801615040565b604080825283519082018190526000906020906060840190828701845b828110156154ce578151845292840192908401906001016154b2565b505050838103828501526154e28186614de3565b9695505050505050565b600080604083850312156154ff57600080fd5b8235915060208301356001600160401b0381111561551c57600080fd5b61552885828601615040565b9150509250929050565b6000806040838503121561554557600080fd5b823561555081614d0c565b9150602083013561540681614d0c565b6000806000806080858703121561557657600080fd5b5050823594602084013594506040840135936060013592509050565b600181811c908216806155a657607f821691505b6020821081036155c657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126155f957600080fd5b8301803591506001600160401b0382111561561357600080fd5b602001915036819003821315614d9157600080fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161565057615650615628565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602a908201527f41646d696e436f6e74726f6c3a2073656e646572206d75737420686173206d696040820152696e74696e6720726f6c6560b01b606082015260800190565b8183823760009101908152919050565b601f8211156110ff57600081815260208120601f850160051c8101602086101561570d5750805b601f850160051c820191505b8181101561147a57828155600101615719565b6001600160401b0383111561574357615743614ffa565b615757836157518354615592565b836156e6565b6000601f84116001811461578b57600085156157735750838201355b600019600387901b1c1916600186901b178355611812565b600083815260209020601f19861690835b828110156157bc578685013582556020948501946001909201910161579c565b50868210156157d95760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526027908201527f526576657273655265736f6c7665723a206e6f74206f776e6572206e6f7220616040820152661c1c1c9bdd995960ca1b606082015260800190565b60008251615844818460208701614c90565b9190910192915050565b81516001600160401b0381111561586757615867614ffa565b61587b816158758454615592565b846156e6565b602080601f8311600181146158b057600084156158985750858301515b600019600386901b1c1916600185901b17855561147a565b600085815260208120601f198616915b828110156158df578886015182559484019460019091019084016158c0565b50858210156158fd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000835161591f818460208801614c90565b601760f91b908301908152835161593d816001840160208801614c90565b01600101949350505050565b60006020828403121561595b57600080fd5b81516114b0816153ca565b6020808252600e908201526d416c72656164792065786973747360901b604082015260600190565b6020808252602f908201527f496e73756666696369656e74206f7220546f6b656e2076616c75652073656e7460408201526e081a5cc81b9bdd0818dbdc9c9958dd608a1b606082015260800190565b600083516159ef818460208801614c90565b835190830190615a03818360208801614c90565b01949350505050565b60008351615a1e818460208801614c90565b9190910191825250602001919050565b600060208284031215615a4057600080fd5b81516114b081614d0c565b6000816000190483118215151615615a6557615a65615628565b500290565b81810381811115610eca57610eca615628565b80820180821115610eca57610eca615628565b60ff8181168382160190811115610eca57610eca615628565b600083516020615abc8285838901614c90565b8184019150601760f91b8252600160008654615ad781615592565b8184168015615aed5760018114615b0657615b36565b60ff198316878601528115158202870185019350615b36565b896000528560002060005b83811015615b2c578154898201880152908601908701615b11565b5050848288010193505b50919998505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906154e290830184614cb4565b600060208284031215615bdc57600080fd5b81516114b081614c5d565b634e487b7160e01b600052603160045260246000fdfea26469706673582212200a72935c5446d923cf064ce1bf5a9ddfe653ec93bb3255f36c947b8ac7b564f964736f6c63430008100033
Deployed Bytecode
0x6080604052600436106104945760003560e01c8063672b9f8111610260578063bc7c8ceb11610144578063d2315630116100c1578063ec129eea11610085578063ec129eea14610e0a578063f25eb5c114610e2a578063f2fde38b14610e3f578063f5c1f76e14610e5f578063f6283ad414610e7f578063f8f7065814610e9f57600080fd5b8063d231563014610d57578063e5f9da8814610d6c578063e985e9c514610d8c578063ea51819b14610dd5578063ea7b25be14610df557600080fd5b8063c87b56dd11610108578063c87b56dd14610cc2578063c8b1df2a14610ce2578063cc82d4f714610cf7578063ce92b33e14610d17578063d19f919d14610d3757600080fd5b8063bc7c8ceb14610c25578063bcba4c1b14610c53578063c479a80414610c73578063c6438cb814610c93578063c7bc6d6814610ca857600080fd5b80638c1e3744116101dd57806398d5fdca116101a157806398d5fdca14610b62578063a22cb46514610b77578063ad59e22614610b97578063b85afd2814610bb7578063b88d4fde14610be5578063bb5b27e114610c0557600080fd5b80638c1e374414610acf5780638da5cb5b14610aef57806391b7f5ed14610b0d57806395d89b4114610b2d57806398a6024314610b4257600080fd5b806376f909ae1161022457806376f909ae14610a2f57806377e9d00b14610a4f5780637ce4538314610a6f5780637e37479e14610a8f5780637ef09bca14610aaf57600080fd5b8063672b9f811461099757806369e2f0fb146109c55780636bc2290f146109e557806370a08231146109fa578063715018a614610a1a57600080fd5b80633ccfd60b116103875780634cd637b511610304578063559f7414116102c8578063559f7414146108ea57806355f804b31461090a5780635a4dacb01461092a5780635d893ba01461093d5780636352211e14610957578063668cf4d81461097757600080fd5b80634cd637b5146108555780634f558e791461086a5780634f6ccce71461088a57806350382c1a146108aa57806350b3a144146108ca57600080fd5b8063434d8aca1161034b578063434d8aca146107c05780634500d449146107e057806347c81699146107f55780634a72584d146108155780634aaf4a121461083557600080fd5b80633ccfd60b146107385780633dd1eb611461074057806342842e0e1461076057806342966c6814610780578063430c2081146107a057600080fd5b80631be5e7ed116104155780632dc50d9a116103d95780632dc50d9a146106a35780632f745c59146106c3578063310bd74b146106e3578063358deb1c14610703578063384e9a551461071857600080fd5b80631be5e7ed1461060e5780631ed405591461062e5780632319afde1461064357806323b872dd1461066357806327f189751461068357600080fd5b80630bb78ec11161045c5780630bb78ec1146105695780630ea2f89e14610589578063157c6138146105a957806318160ddd146105cc5780631bd8cc1a146105e157600080fd5b806301ffc9a7146104995780630302e953146104ce57806306fdde03146104ed578063081812fc1461050f578063095ea7b314610547575b600080fd5b3480156104a557600080fd5b506104b96104b4366004614c73565b610ebf565b60405190151581526020015b60405180910390f35b3480156104da57600080fd5b506018546104b990610100900460ff1681565b3480156104f957600080fd5b50610502610ed0565b6040516104c59190614ce0565b34801561051b57600080fd5b5061052f61052a366004614cf3565b610f62565b6040516001600160a01b0390911681526020016104c5565b34801561055357600080fd5b50610567610562366004614d21565b610fef565b005b34801561057557600080fd5b50610502610584366004614cf3565b611104565b34801561059557600080fd5b506018546104b99062010000900460ff1681565b3480156105b557600080fd5b506105be61119e565b6040519081526020016104c5565b3480156105d857600080fd5b506008546105be565b3480156105ed57600080fd5b506106016105fc366004614d98565b6111ba565b6040516104c59190614e3b565b34801561061a57600080fd5b50610502610629366004614e8f565b6112b0565b34801561063a57600080fd5b506105676112fb565b34801561064f57600080fd5b5061056761065e366004614ec6565b611339565b34801561066f57600080fd5b5061056761067e366004614f07565b6113ef565b34801561068f57600080fd5b5061056761069e366004614f48565b61145a565b3480156106af57600080fd5b506105be6106be366004614fbb565b611482565b3480156106cf57600080fd5b506105be6106de366004614d21565b6114b7565b3480156106ef57600080fd5b506105676106fe366004614cf3565b61154d565b34801561070f57600080fd5b50601c546105be565b34801561072457600080fd5b50610567610733366004614cf3565b61156d565b6105676115ae565b34801561074c57600080fd5b5061056761075b366004614fdd565b6115fe565b34801561076c57600080fd5b5061056761077b366004614f07565b611634565b34801561078c57600080fd5b5061056761079b366004614cf3565b61164f565b3480156107ac57600080fd5b506104b96107bb366004614d21565b61175c565b3480156107cc57600080fd5b506105026107db3660046150af565b611768565b3480156107ec57600080fd5b5061056761178c565b34801561080157600080fd5b506105676108103660046150e3565b6117d3565b34801561082157600080fd5b50610567610830366004615144565b6117f3565b34801561084157600080fd5b5061052f6108503660046150af565b611819565b34801561086157600080fd5b506105be61185e565b34801561087657600080fd5b506104b9610885366004614cf3565b61186f565b34801561089657600080fd5b506105be6108a5366004614cf3565b61187a565b3480156108b657600080fd5b506105676108c53660046150af565b61190d565b3480156108d657600080fd5b506105be6108e53660046150af565b611940565b3480156108f657600080fd5b50610567610905366004615196565b61197f565b34801561091657600080fd5b506105676109253660046150af565b6119d3565b6105676109383660046151cb565b611a09565b34801561094957600080fd5b506018546104b99060ff1681565b34801561096357600080fd5b5061052f610972366004614cf3565b6120b6565b34801561098357600080fd5b50610567610992366004614f48565b61212d565b3480156109a357600080fd5b506109b76109b2366004614fbb565b61215f565b6040516104c5929190615240565b3480156109d157600080fd5b506105676109e0366004614fdd565b612177565b3480156109f157600080fd5b50601b546105be565b348015610a0657600080fd5b506105be610a15366004614fdd565b6121aa565b348015610a2657600080fd5b50610567612231565b348015610a3b57600080fd5b506105be610a4a366004614cf3565b612265565b348015610a5b57600080fd5b50610567610a6a3660046151cb565b612290565b348015610a7b57600080fd5b50610567610a8a366004615196565b6122c0565b348015610a9b57600080fd5b50610502610aaa366004614fdd565b612311565b348015610abb57600080fd5b506104b9610aca366004614fdd565b612452565b348015610adb57600080fd5b50610567610aea36600461526e565b61245f565b348015610afb57600080fd5b50600b546001600160a01b031661052f565b348015610b1957600080fd5b50610567610b28366004614cf3565b61253a565b348015610b3957600080fd5b50610502612569565b348015610b4e57600080fd5b50610567610b5d36600461537c565b612578565b348015610b6e57600080fd5b506019546105be565b348015610b8357600080fd5b50610567610b923660046153d8565b6125ac565b348015610ba357600080fd5b50610567610bb23660046150af565b612670565b348015610bc357600080fd5b50610bd7610bd2366004614d98565b6126c0565b6040516104c5929190615411565b348015610bf157600080fd5b50610567610c00366004615436565b6127e2565b348015610c1157600080fd5b50610502610c20366004614cf3565b61284d565b348015610c3157600080fd5b50610c45610c40366004614fdd565b6128ef565b6040516104c5929190615495565b348015610c5f57600080fd5b50610502610c6e366004614cf3565b612ad2565b348015610c7f57600080fd5b50610567610c8e3660046154ec565b612aeb565b348015610c9f57600080fd5b506105be612b08565b348015610cb457600080fd5b506010546104b99060ff1681565b348015610cce57600080fd5b50610502610cdd366004614cf3565b612b19565b348015610cee57600080fd5b50610567612c82565b348015610d0357600080fd5b50610567610d1236600461537c565b612ccb565b348015610d2357600080fd5b50610567610d32366004614f48565b612d0b565b348015610d4357600080fd5b5061052f610d523660046150af565b612d2b565b348015610d6357600080fd5b50601d546105be565b348015610d7857600080fd5b506104b9610d873660046150af565b612da1565b348015610d9857600080fd5b506104b9610da7366004615532565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610de157600080fd5b50610567610df0366004615560565b612dde565b348015610e0157600080fd5b50610567612e1c565b348015610e1657600080fd5b50610567610e25366004614f48565b612e5a565b348015610e3657600080fd5b50610567612e7a565b348015610e4b57600080fd5b50610567610e5a366004614fdd565b612ec5565b348015610e6b57600080fd5b50610601610e7a366004614ec6565b612f5d565b348015610e8b57600080fd5b506104b9610e9a366004615196565b613009565b348015610eab57600080fd5b50610567610eba366004614fdd565b6130c1565b6000610eca82613189565b92915050565b606060008054610edf90615592565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0b90615592565b8015610f585780601f10610f2d57610100808354040283529160200191610f58565b820191906000526020600020905b815481529060010190602001808311610f3b57829003601f168201915b5050505050905090565b6000610f6d826131ae565b610fd35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ffa826120b6565b9050806001600160a01b0316836001600160a01b0316036110675760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610fca565b336001600160a01b038216148061108357506110838133610da7565b6110f55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610fca565b6110ff83836131cb565b505050565b6012602052600090815260409020805461111d90615592565b80601f016020809104026020016040519081016040528092919081815260200182805461114990615592565b80156111965780601f1061116b57610100808354040283529160200191611196565b820191906000526020600020905b81548152906001019060200180831161117957829003601f168201915b505050505081565b60006111b5601b546111af60195490565b90613239565b905090565b6060826001600160401b038111156111d4576111d4614ffa565b60405190808252806020026020018201604052801561120757816020015b60608152602001906001900390816111f25790505b50905060005b838110156112a85761127885858381811061122a5761122a6155cc565b905060200281019061123c91906155e2565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250613245915050565b82828151811061128a5761128a6155cc565b602002602001018190525080806112a09061563e565b91505061120d565b509392505050565b60606112f384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250613245915050565b949350505050565b600b546001600160a01b031633146113255760405162461bcd60e51b8152600401610fca90615657565b6018805460ff19811660ff90911615179055565b61134233612452565b61135e5760405162461bcd60e51b8152600401610fca9061568c565b60005b818110156110ff5782828281811061137b5761137b6155cc565b905060200281019061138d91906155e2565b600f8585858181106113a1576113a16155cc565b90506020028101906113b391906155e2565b6040516113c19291906156d6565b908152602001604051809103902091826113dc92919061572c565b50806113e78161563e565b915050611361565b6113fa335b8261327a565b6114465760405162461bcd60e51b815260206004820152601e60248201527f4552433732313a206e6f74206f776e6572206e6f7220617070726f76656400006044820152606401610fca565b61144f81613360565b6110ff8383836133cd565b80611464336113f4565b61146d57600080fd5b61147a8686868686613578565b505050505050565b60008161148e84612265565b1161149857600080fd5b60008381526011602052604090206114b090836135db565b9392505050565b60006114c2836121aa565b82106115245760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610fca565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b80611557336113f4565b61156057600080fd5b61156982613360565b5050565b33611578818361327a565b6115945760405162461bcd60e51b8152600401610fca906157eb565b6001600160a01b0316600090815260156020526040902055565b600b546001600160a01b031633146115d85760405162461bcd60e51b8152600401610fca90615657565b60405133904780156108fc02916000818181858888f193505050506115fc57600080fd5b565b600b546001600160a01b031633146116285760405162461bcd60e51b8152600401610fca90615657565b611631816135e7565b50565b6110ff838383604051806020016040528060008152506127e2565b611658336113f4565b6116b35760405162461bcd60e51b815260206004820152602660248201527f4552433732314275726e61626c653a206e6f74206f776e6572206e6f722061706044820152651c1c9bdd995960d21b6064820152608401610fca565b600081815260126020526040902080546116cc90615592565b1590506116ea5760008181526012602052604081206116ea91614c13565b336000908152601560205260409020541561171057336000908152601560205260408120555b6000818152601460205260409020546001600160a01b03161561174a57600081815260146020526040902080546001600160a01b03191690555b61175381613360565b611631816135f2565b60006114b0838361327a565b8051602081830181018051600f825292820191909301209152805461111d90615592565b600b546001600160a01b031633146117b65760405162461bcd60e51b8152600401610fca90615657565b6018805461ff001981166101009182900460ff1615909102179055565b806117dd336113f4565b6117e657600080fd5b61147a8686868686613699565b806117fd336113f4565b61180657600080fd5b61181285858585613778565b5050505050565b60008061182583613818565b905060008160405160200161183a9190615832565b6040516020818303038152906040528051906020012060001c90506112f3816120b6565b60006111b5601d546111af60195490565b6000610eca826131ae565b600061188560085490565b82106118e85760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610fca565b600882815481106118fb576118fb6155cc565b90600052602060002001549050919050565b611631816040516020016119219190615832565b6040516020818303038152906040528051906020012060001c82613972565b6000815160000361195057600080fd5b816040516020016119619190615832565b60408051601f19818403018152919052805160209091012092915050565b61198833612452565b6119a45760405162461bcd60e51b8152600401610fca9061568c565b8181600f84846040516119b89291906156d6565b908152602001604051809103902091826110ff92919061572c565b600b546001600160a01b031633146119fd5760405162461bcd60e51b8152600401610fca90615657565b6017611569828261584e565b60185460ff16611a5b5760405162461bcd60e51b815260206004820152601a60248201527f53616c65206d7573742062652061637469766520746f206275790000000000006044820152606401610fca565b6001600160a01b038316611aa65760405162461bcd60e51b8152602060048201526012602482015271151bc81859191c995cdcc81a5cc81b9d5b1b60721b6044820152606401610fca565b8051600003611aef5760405162461bcd60e51b8152602060048201526015602482015274544c44206d757374206265206e6f6e2d656d70747960581b6044820152606401610fca565b611af881612da1565b1515600114611b395760405162461bcd60e51b815260206004820152600d60248201526c151311081b9bdd08195e1a5cdd609a1b6044820152606401610fca565b81516000819003611b805760405162461bcd60e51b81526020600482015260116024820152704d757374206265206e6f6e2d656d70747960781b6044820152606401610fca565b611b8983613997565b15611bd25760405162461bcd60e51b815260206004820152601960248201527843616e6e6f7420636f6e7461696e207768697465737061636560381b6044820152606401610fca565b611bdb836139fe565b15611c1d5760405162461bcd60e51b815260206004820152601260248201527110d85b9b9bdd0818dbdb9d185a5b88191bdd60721b6044820152606401610fca565b60105460ff161515600103611d2a576000600f84604051611c3e9190615832565b90815260200160405180910390208054611c5790615592565b80601f0160208091040260200160405190810160405280929190818152602001828054611c8390615592565b8015611cd05780601f10611ca557610100808354040283529160200191611cd0565b820191906000526020600020905b815481529060010190602001808311611cb357829003601f168201915b505050505090508051600014611d285760405162461bcd60e51b815260206004820152601d60248201527f54686973206e616d6520697320616c72656164792072657365727665640000006044820152606401610fca565b505b6000611d3584613818565b90506000611d4284613818565b90508181604051602001611d5792919061590d565b60405160208183030381529060405291506000611d7383611940565b601f549091506001600160a01b031615611e3557601f54604051634f558e7960e01b8152600481018390526001600160a01b0390911690634f558e7990602401602060405180830381865afa158015611dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df49190615949565b15611e355760405162461bcd60e51b8152602060048201526011602482015270563120416c72656164792065786973747360781b6044820152606401610fca565b611e3e816131ae565b15611e5b5760405162461bcd60e51b8152600401610fca90615966565b83600103611f055760185462010000900460ff161515600114611ed05760405162461bcd60e51b815260206004820152602760248201527f4f6e6520636861726163746572206e65656420746f20626520616c6c6f77656460448201526620746f2062757960c81b6064820152608401610fca565b6000611ee1601a546111af60195490565b905080341015611f035760405162461bcd60e51b8152600401610fca9061598e565b505b83600203611fb05760185460ff610100909104161515600114611f7b5760405162461bcd60e51b815260206004820152602860248201527f54776f2063686172616374657273206e65656420746f20626520616c6c6f77656044820152676420746f2062757960c01b6064820152608401610fca565b6000611f8c601b546111af60195490565b905080341015611fae5760405162461bcd60e51b8152600401610fca9061598e565b505b83600303611fed576000611fc9601c546111af60195490565b905080341015611feb5760405162461bcd60e51b8152600401610fca9061598e565b505b8360040361202a576000612006601d546111af60195490565b9050803410156120285760405162461bcd60e51b8152600401610fca9061598e565b505b6005841061206157600061203d60195490565b90508034101561205f5760405162461bcd60e51b8152600401610fca9061598e565b505b61206b8782613a5d565b6120758184613a77565b807fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c3952846040516120a59190614ce0565b60405180910390a250505050505050565b6000818152600260205260408120546001600160a01b031680610eca5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610fca565b61213633612452565b6121525760405162461bcd60e51b8152600401610fca9061568c565b6118128585858585613af9565b60608061216c8484613b67565b909590945092505050565b600b546001600160a01b031633146121a15760405162461bcd60e51b8152600401610fca90615657565b61163181613b88565b60006001600160a01b0382166122155760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610fca565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b0316331461225b5760405162461bcd60e51b8152600401610fca90615657565b6115fc6000613b93565b6000612270826131ae565b61227957600080fd5b6000828152601160205260409020610eca90613be5565b61229933612452565b6122b55760405162461bcd60e51b8152600401610fca9061568c565b6110ff838383613bef565b6122c933612452565b6122e55760405162461bcd60e51b8152600401610fca9061568c565b600f82826040516122f79291906156d6565b908152602001604051809103902060006115699190614c13565b6001600160a01b03811660009081526015602052604081205460609181900361238d5760405162461bcd60e51b815260206004820152602860248201527f526576657273655265736f6c7665723a20524556455253455f5245434f52445f60448201526749535f454d50545960c01b6064820152608401610fca565b612397838261327a565b6123b35760405162461bcd60e51b8152600401610fca906157eb565b600081815260126020526040902080546123cc90615592565b80601f01602080910402602001604051908101604052809291908181526020018280546123f890615592565b80156124455780601f1061241a57610100808354040283529160200191612445565b820191906000526020600020905b81548152906001019060200180831161242857829003601f168201915b5050505050915050919050565b6000610eca600c83613f34565b61246833612452565b6124845760405162461bcd60e51b8152600401610fca9061568c565b60005b838110156118125760006124b38483815181106124a6576124a66155cc565b6020026020010151613818565b905060008686848181106124c9576124c96155cc565b90506020020160208101906124de9190614fdd565b9050600082511180156124f957506001600160a01b03811615155b1561252557600061250983611940565b9050612514816131ae565b61252357612523828487613bef565b505b505080806125329061563e565b915050612487565b600b546001600160a01b031633146125645760405162461bcd60e51b8152600401610fca90615657565b601955565b606060018054610edf90615592565b81612582336113f4565b61258b57600080fd5b6125a684848460405180602001604052806000815250613fb7565b50505050565b336001600160a01b038316036126045760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610fca565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b546001600160a01b0316331461269a5760405162461bcd60e51b8152600401610fca90615657565b60006126a582611940565b60008181526016602052604090209091506110ff838261584e565b606080836001600160401b038111156126db576126db614ffa565b60405190808252806020026020018201604052801561270e57816020015b60608152602001906001900390816126f95790505b509150836001600160401b0381111561272957612729614ffa565b60405190808252806020026020018201604052801561275c57816020015b60608152602001906001900390816127475790505b50905060005b848110156127d95761278c86868381811061277f5761277f6155cc565b9050602002013585613b67565b84838151811061279e5761279e6155cc565b602002602001018484815181106127b7576127b76155cc565b60200260200101829052829052505080806127d19061563e565b915050612762565b50935093915050565b6127ec338361327a565b6128385760405162461bcd60e51b815260206004820152601e60248201527f4552433732313a206e6f74206f776e6572206e6f7220617070726f76656400006044820152606401610fca565b61284182613360565b6125a6848484846141ba565b6000818152600a6020526040902080546060919061286a90615592565b80601f016020809104026020016040519081016040528092919081815260200182805461289690615592565b80156128e35780601f106128b8576101008083540402835291602001916128e3565b820191906000526020600020905b8154815290600101906020018083116128c657829003601f168201915b50505050509050919050565b60608060006128fd846121aa565b9050600081116129295760405162461bcd60e51b81526020600482015260006024820152604401610fca565b6000816001600160401b0381111561294357612943614ffa565b60405190808252806020026020018201604052801561296c578160200160208202803683370190505b5090506000826001600160401b0381111561298957612989614ffa565b6040519080825280602002602001820160405280156129bc57816020015b60608152602001906001900390816129a75790505b50905060005b83811015612ac65760006129d688836114b7565b6000818152601260205260408120805492935090916129f490615592565b80601f0160208091040260200160405190810160405280929190818152602001828054612a2090615592565b8015612a6d5780601f10612a4257610100808354040283529160200191612a6d565b820191906000526020600020905b815481529060010190602001808311612a5057829003601f168201915b5050505050905081858481518110612a8757612a876155cc565b60200260200101818152505080848481518110612aa657612aa66155cc565b602002602001018190525050508080612abe9061563e565b9150506129c2565b50909590945092505050565b6013602052600090815260409020805461111d90615592565b81612af5336113f4565b612afe57600080fd5b6110ff83836141ed565b60006111b5601c546111af60195490565b6060612b24826131ae565b612b885760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610fca565b60008281526012602052604081208054612ba190615592565b80601f0160208091040260200160405190810160405280929190818152602001828054612bcd90615592565b8015612c1a5780601f10612bef57610100808354040283529160200191612c1a565b820191906000526020600020905b815481529060010190602001808311612bfd57829003601f168201915b505050505090506000612c2b614299565b90508051600003612c3d575092915050565b815115612c6f578082604051602001612c579291906159dd565b60405160208183030381529060405292505050919050565b8084604051602001612c57929190615a0c565b600b546001600160a01b03163314612cac5760405162461bcd60e51b8152600401610fca90615657565b6018805462ff0000198116620100009182900460ff1615909102179055565b612cd433612452565b612cf05760405162461bcd60e51b8152600401610fca9061568c565b6110ff83838360405180602001604052806000815250613fb7565b80612d15336113f4565b612d1e57600080fd5b61147a8686868686613af9565b601f54604051632557a50960e11b81526000916001600160a01b031690634aaf4a1290612d5c908590600401614ce0565b602060405180830381865afa925050508015612d95575060408051601f3d908101601f19168201909252612d9291810190615a2e565b60015b610eca57506000919050565b60008080612dae84611940565b6000818152601660205260409020805491925090612dcb90615592565b159050612dd757600191505b5092915050565b600b546001600160a01b03163314612e085760405162461bcd60e51b8152600401610fca90615657565b601a93909355601b91909155601c55601d55565b600b546001600160a01b03163314612e465760405162461bcd60e51b8152600401610fca90615657565b6010805460ff19811660ff90911615179055565b80612e64336113f4565b612e6d57600080fd5b61147a86868686866142a8565b3360008181526015602052604081205490819003612eaa5760405162461bcd60e51b8152600401610fca906157eb565b506001600160a01b0316600090815260156020526040812055565b600b546001600160a01b03163314612eef5760405162461bcd60e51b8152600401610fca90615657565b6001600160a01b038116612f545760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fca565b61163181613b93565b6060816001600160401b03811115612f7757612f77614ffa565b604051908082528060200260200182016040528015612faa57816020015b6060815260200190600190039081612f955790505b50905060005b82811015612dd757612fd9848483818110612fcd57612fcd6155cc565b9050602002013561284d565b828281518110612feb57612feb6155cc565b602002602001018190525080806130019061563e565b915050612fb0565b600080600f848460405161301e9291906156d6565b9081526020016040518091039020805461303790615592565b80601f016020809104026020016040519081016040528092919081815260200182805461306390615592565b80156130b05780601f10613085576101008083540402835291602001916130b0565b820191906000526020600020905b81548152906001019060200180831161309357829003601f168201915b505092511515979650505050505050565b600b546001600160a01b031633146130eb5760405162461bcd60e51b8152600401610fca90615657565b601f80546001600160a01b0319166001600160a01b0392909216919091179055565b6131178282613f34565b156131645760405162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c65006044820152606401610fca565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160e01b0319821663780e9d6360e01b1480610eca5750610eca826142b1565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613200826120b6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006114b08284615a4b565b60606114b08360405160200161325b9190615832565b6040516020818303038152906040528051906020012060001c83614301565b6000613285826131ae565b6132e65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610fca565b60006132f1836120b6565b9050806001600160a01b0316846001600160a01b0316148061332c5750836001600160a01b031661332184610f62565b6001600160a01b0316145b806112f357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166112f3565b613369816143c0565b60405160200161337b91815260200190565b60408051601f1981840301815282825280516020918201206000858152600e9092529181209190915582917f185c30856dadb58bf097c1f665a52ada7029752dbcad008ea3fefc73bee8c9fe9190a250565b826001600160a01b03166133e0826120b6565b6001600160a01b0316146134485760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610fca565b6001600160a01b0382166134aa5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610fca565b6134b58383836143ec565b6134c06000826131cb565b6001600160a01b03831660009081526003602052604081208054600192906134e9908490615a6a565b90915550506001600160a01b0382166000908152600360205260408120805460019290613517908490615a7d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b8481101561147a576135c9868683818110613598576135986155cc565b905060200201358585848181106135b1576135b16155cc565b90506020028101906135c391906155e2565b85613778565b806135d38161563e565b91505061357b565b60006114b083836143f7565b611631600c8261310d565b60006135fd826120b6565b905061360b816000846143ec565b6136166000836131cb565b6001600160a01b038116600090815260036020526040812080546001929061363f908490615a6a565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600085856040516020016136ae9291906156d6565b60408051601f198184030181528282528051602091820120601f8901829004820284018201909252878352909250613702918391899089908190840183828082843760009201919091525061397292505050565b61147a8187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250889250614421915050565b61378184614556565b6137cd5760405162461bcd60e51b815260206004820152601c60248201527f5265636f726453746f726167653a204b45595f4e4f545f464f554e44000000006044820152606401610fca565b6125a6846137da8661284d565b85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250614421915050565b60606000829050600081516001600160401b0381111561383a5761383a614ffa565b6040519080825280601f01601f191660200182016040528015613864576020820181803683370190505b50905060005b82518110156112a8576041838281518110613887576138876155cc565b016020015160f81c108015906138b75750605a8382815181106138ac576138ac6155cc565b016020015160f81c11155b15613919578281815181106138ce576138ce6155cc565b602001015160f81c60f81b60f81c60206138e89190615a90565b60f81b8282815181106138fd576138fd6155cc565b60200101906001600160f81b031916908160001a905350613960565b82818151811061392b5761392b6155cc565b602001015160f81c60f81b828281518110613948576139486155cc565b60200101906001600160f81b031916908160001a9053505b8061396a8161563e565b91505061386a565b61397b82614556565b611569576000828152600a602052604090206110ff828261584e565b600081815b81518110156139f45760008282815181106139b9576139b96155cc565b01602001516001600160f81b0319169050600160fd1b8190036139e157506001949350505050565b50806139ec8161563e565b91505061399c565b5060009392505050565b805160009060018381019184010182805b82841015613a5457835160ff16602e819003613a3357613a30600184615a7d565b92505b613a3e600186615a7d565b9450508080613a4c9061563e565b915050613a0f565b50949350505050565b61156982826040518060200160405280600081525061457c565b613a80826131ae565b613ae15760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610fca565b60008281526012602052604090206110ff828261584e565b60005b8481101561147a57613b55868683818110613b1957613b196155cc565b9050602002810190613b2b91906155e2565b868685818110613b3d57613b3d6155cc565b9050602002810190613b4f91906155e2565b86613699565b80613b5f8161563e565b915050613afc565b606080613b738461284d565b9150613b7f8484614301565b90509250929050565b611631600c826145af565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000610eca825490565b6001600160a01b038316613c3a5760405162461bcd60e51b8152602060048201526012602482015271151bc81859191c995cdcc81a5cc81b9d5b1b60721b6044820152606401610fca565b8051600003613c835760405162461bcd60e51b8152602060048201526015602482015274544c44206d757374206265206e6f6e2d656d70747960581b6044820152606401610fca565b613c8c81612da1565b1515600114613ccd5760405162461bcd60e51b815260206004820152600d60248201526c151311081b9bdd08195e1a5cdd609a1b6044820152606401610fca565b8151600003613d125760405162461bcd60e51b81526020600482015260116024820152704d757374206265206e6f6e2d656d70747960781b6044820152606401610fca565b613d1b82613997565b15613d645760405162461bcd60e51b815260206004820152601960248201527843616e6e6f7420636f6e7461696e207768697465737061636560381b6044820152606401610fca565b613d6d826139fe565b15613daf5760405162461bcd60e51b815260206004820152601260248201527110d85b9b9bdd0818dbdb9d185a5b88191bdd60721b6044820152606401610fca565b6000613dba83613818565b90506000613dc783613818565b90508181604051602001613ddc92919061590d565b60405160208183030381529060405291506000613df883611940565b601f549091506001600160a01b031615613eba57601f54604051634f558e7960e01b8152600481018390526001600160a01b0390911690634f558e7990602401602060405180830381865afa158015613e55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e799190615949565b15613eba5760405162461bcd60e51b8152602060048201526011602482015270563120416c72656164792065786973747360781b6044820152606401610fca565b613ec3816131ae565b15613ee05760405162461bcd60e51b8152600401610fca90615966565b613eea8682613a5d565b613ef48184613a77565b807fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c395284604051613f249190614ce0565b60405180910390a2505050505050565b60006001600160a01b038216613f975760405162461bcd60e51b815260206004820152602260248201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604482015261737360f01b6064820152608401610fca565b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b038416613fca57600080fd5b8151600003613fd857600080fd5b613fe182613997565b15613feb57600080fd5b613ff4826139fe565b15613ffe57600080fd5b614007836131ae565b61401057600080fd5b600061401b83613818565b905060008160126000878152602001908152602001600020604051602001614044929190615aa9565b6040516020818303038152906040529050600061406082611940565b905061406b816131ae565b156140885760405162461bcd60e51b8152600401610fca90615966565b6000868152601260205260408120805461412991906140a690615592565b80601f01602080910402602001604051908101604052809291908181526020018280546140d290615592565b801561411f5780601f106140f45761010080835404028352916020019161411f565b820191906000526020600020905b81548152906001019060200180831161410257829003601f168201915b50505050506139fe565b90508060010361414d57600087815260116020526040902061414b9083614631565b505b8451156141645761415f88838761457c565b61416e565b61416e8883613a5d565b6141788284613a77565b817fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c3952846040516141a89190614ce0565b60405180910390a25050505050505050565b6141c58484846133cd565b6141d18484848461463d565b6125a65760405162461bcd60e51b8152600401610fca90615b45565b60006141f882613818565b905060008160126000868152602001908152602001600020604051602001614221929190615aa9565b6040516020818303038152906040529050600061423d82611940565b6000868152601160205260409020909150614258908261473e565b506000818152601260205260409020805461427290615592565b15905061429057600081815260126020526040812061429091614c13565b611812816135f2565b606060178054610edf90615592565b61215281613360565b60006001600160e01b031982166380ac58cd60e01b14806142e257506001600160e01b03198216635b5e139f60e01b145b80610eca57506301ffc9a760e01b6001600160e01b0319831614610eca565b6060600d6000614310846143c0565b81526020019081526020016000206000848152602001908152602001600020805461433a90615592565b80601f016020809104026020016040519081016040528092919081815260200182805461436690615592565b80156143b35780601f10614388576101008083540402835291602001916143b3565b820191906000526020600020905b81548152906001019060200180831161439657829003601f168201915b5050505050905092915050565b6000818152600e6020526040812054156143e8576000828152600e6020526040902054610eca565b5090565b6110ff83838361474a565b600082600001828154811061440e5761440e6155cc565b9060005260206000200154905092915050565b600d600061442e836143c0565b81526020019081526020016000206000858152602001908152602001600020805461445890615592565b90506000036144b0578260405161446f9190615832565b6040518091039020817f7ae4f661958fbecc2f77be6b0eb280d2a6f604b29e1e7221c82b9da0c4af7f86856040516144a79190614ce0565b60405180910390a35b81600d60006144be846143c0565b8152602001908152602001600020600086815260200190815260200160002090816144e9919061584e565b50816040516144f89190615832565b60405180910390208360405161450e9190615832565b6040518091039020827f851ffe8e74d5015261dba0a1f9e1b0e5d42c5af5d2ad1908fee897c7d80a0d928686604051614548929190615240565b60405180910390a450505050565b6000818152600a60205260408120805482919061457290615592565b9050119050919050565b6145868383614802565b614593600084848461463d565b6110ff5760405162461bcd60e51b8152600401610fca90615b45565b6145b98282613f34565b61460f5760405162461bcd60e51b815260206004820152602160248201527f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6044820152606560f81b6064820152608401610fca565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60006114b08383614941565b60006001600160a01b0384163b1561473357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614681903390899088908890600401615b97565b6020604051808303816000875af19250505080156146bc575060408051601f3d908101601f191682019092526146b991810190615bca565b60015b614719573d8080156146ea576040519150601f19603f3d011682016040523d82523d6000602084013e6146ef565b606091505b5080516000036147115760405162461bcd60e51b8152600401610fca90615b45565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506112f3565b506001949350505050565b60006114b08383614990565b6001600160a01b0383166147a5576147a081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6147c8565b816001600160a01b0316836001600160a01b0316146147c8576147c88382614a83565b6001600160a01b0382166147df576110ff81614b20565b826001600160a01b0316826001600160a01b0316146110ff576110ff8282614bcf565b6001600160a01b0382166148585760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610fca565b614861816131ae565b156148ae5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610fca565b6148ba600083836143ec565b6001600160a01b03821660009081526003602052604081208054600192906148e3908490615a7d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260018301602052604081205461498857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610eca565b506000610eca565b60008181526001830160205260408120548015614a795760006149b4600183615a6a565b85549091506000906149c890600190615a6a565b9050818114614a2d5760008660000182815481106149e8576149e86155cc565b9060005260206000200154905080876000018481548110614a0b57614a0b6155cc565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080614a3e57614a3e615be7565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610eca565b6000915050610eca565b60006001614a90846121aa565b614a9a9190615a6a565b600083815260076020526040902054909150808214614aed576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614b3290600190615a6a565b60008381526009602052604081205460088054939450909284908110614b5a57614b5a6155cc565b906000526020600020015490508060088381548110614b7b57614b7b6155cc565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614bb357614bb3615be7565b6001900381819060005260206000200160009055905550505050565b6000614bda836121aa565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b508054614c1f90615592565b6000825580601f10614c2f575050565b601f01602090049060005260206000209081019061163191905b808211156143e85760008155600101614c49565b6001600160e01b03198116811461163157600080fd5b600060208284031215614c8557600080fd5b81356114b081614c5d565b60005b83811015614cab578181015183820152602001614c93565b50506000910152565b60008151808452614ccc816020860160208601614c90565b601f01601f19169290920160200192915050565b6020815260006114b06020830184614cb4565b600060208284031215614d0557600080fd5b5035919050565b6001600160a01b038116811461163157600080fd5b60008060408385031215614d3457600080fd5b8235614d3f81614d0c565b946020939093013593505050565b60008083601f840112614d5f57600080fd5b5081356001600160401b03811115614d7657600080fd5b6020830191508360208260051b8501011115614d9157600080fd5b9250929050565b600080600060408486031215614dad57600080fd5b83356001600160401b03811115614dc357600080fd5b614dcf86828701614d4d565b909790965060209590950135949350505050565b600082825180855260208086019550808260051b84010181860160005b84811015614e2e57601f19868403018952614e1c838351614cb4565b98840198925090830190600101614e00565b5090979650505050505050565b6020815260006114b06020830184614de3565b60008083601f840112614e6057600080fd5b5081356001600160401b03811115614e7757600080fd5b602083019150836020828501011115614d9157600080fd5b600080600060408486031215614ea457600080fd5b83356001600160401b03811115614eba57600080fd5b614dcf86828701614e4e565b60008060208385031215614ed957600080fd5b82356001600160401b03811115614eef57600080fd5b614efb85828601614d4d565b90969095509350505050565b600080600060608486031215614f1c57600080fd5b8335614f2781614d0c565b92506020840135614f3781614d0c565b929592945050506040919091013590565b600080600080600060608688031215614f6057600080fd5b85356001600160401b0380821115614f7757600080fd5b614f8389838a01614d4d565b90975095506020880135915080821115614f9c57600080fd5b50614fa988828901614d4d565b96999598509660400135949350505050565b60008060408385031215614fce57600080fd5b50508035926020909101359150565b600060208284031215614fef57600080fd5b81356114b081614d0c565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561503857615038614ffa565b604052919050565b600082601f83011261505157600080fd5b81356001600160401b0381111561506a5761506a614ffa565b61507d601f8201601f1916602001615010565b81815284602083860101111561509257600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156150c157600080fd5b81356001600160401b038111156150d757600080fd5b6112f384828501615040565b6000806000806000606086880312156150fb57600080fd5b85356001600160401b038082111561511257600080fd5b61511e89838a01614e4e565b9097509550602088013591508082111561513757600080fd5b50614fa988828901614e4e565b6000806000806060858703121561515a57600080fd5b8435935060208501356001600160401b0381111561517757600080fd5b61518387828801614e4e565b9598909750949560400135949350505050565b600080602083850312156151a957600080fd5b82356001600160401b038111156151bf57600080fd5b614efb85828601614e4e565b6000806000606084860312156151e057600080fd5b83356151eb81614d0c565b925060208401356001600160401b038082111561520757600080fd5b61521387838801615040565b9350604086013591508082111561522957600080fd5b5061523686828701615040565b9150509250925092565b6040815260006152536040830185614cb4565b82810360208401526152658185614cb4565b95945050505050565b6000806000806060858703121561528457600080fd5b84356001600160401b038082111561529b57600080fd5b6152a788838901614d4d565b90965094506020915086820135818111156152c157600080fd5b8701601f810189136152d257600080fd5b8035828111156152e4576152e4614ffa565b8060051b6152f3858201615010565b918252828101850191858101908c84111561530d57600080fd5b86850192505b838310156153495782358681111561532b5760008081fd5b6153398e8983890101615040565b8352509186019190860190615313565b975050505060408801359250508082111561536357600080fd5b5061537087828801615040565b91505092959194509250565b60008060006060848603121561539157600080fd5b833561539c81614d0c565b92506020840135915060408401356001600160401b038111156153be57600080fd5b61523686828701615040565b801515811461163157600080fd5b600080604083850312156153eb57600080fd5b82356153f681614d0c565b91506020830135615406816153ca565b809150509250929050565b6040815260006154246040830185614de3565b82810360208401526152658185614de3565b6000806000806080858703121561544c57600080fd5b843561545781614d0c565b9350602085013561546781614d0c565b92506040850135915060608501356001600160401b0381111561548957600080fd5b61537087828801615040565b604080825283519082018190526000906020906060840190828701845b828110156154ce578151845292840192908401906001016154b2565b505050838103828501526154e28186614de3565b9695505050505050565b600080604083850312156154ff57600080fd5b8235915060208301356001600160401b0381111561551c57600080fd5b61552885828601615040565b9150509250929050565b6000806040838503121561554557600080fd5b823561555081614d0c565b9150602083013561540681614d0c565b6000806000806080858703121561557657600080fd5b5050823594602084013594506040840135936060013592509050565b600181811c908216806155a657607f821691505b6020821081036155c657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126155f957600080fd5b8301803591506001600160401b0382111561561357600080fd5b602001915036819003821315614d9157600080fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161565057615650615628565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602a908201527f41646d696e436f6e74726f6c3a2073656e646572206d75737420686173206d696040820152696e74696e6720726f6c6560b01b606082015260800190565b8183823760009101908152919050565b601f8211156110ff57600081815260208120601f850160051c8101602086101561570d5750805b601f850160051c820191505b8181101561147a57828155600101615719565b6001600160401b0383111561574357615743614ffa565b615757836157518354615592565b836156e6565b6000601f84116001811461578b57600085156157735750838201355b600019600387901b1c1916600186901b178355611812565b600083815260209020601f19861690835b828110156157bc578685013582556020948501946001909201910161579c565b50868210156157d95760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526027908201527f526576657273655265736f6c7665723a206e6f74206f776e6572206e6f7220616040820152661c1c1c9bdd995960ca1b606082015260800190565b60008251615844818460208701614c90565b9190910192915050565b81516001600160401b0381111561586757615867614ffa565b61587b816158758454615592565b846156e6565b602080601f8311600181146158b057600084156158985750858301515b600019600386901b1c1916600185901b17855561147a565b600085815260208120601f198616915b828110156158df578886015182559484019460019091019084016158c0565b50858210156158fd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000835161591f818460208801614c90565b601760f91b908301908152835161593d816001840160208801614c90565b01600101949350505050565b60006020828403121561595b57600080fd5b81516114b0816153ca565b6020808252600e908201526d416c72656164792065786973747360901b604082015260600190565b6020808252602f908201527f496e73756666696369656e74206f7220546f6b656e2076616c75652073656e7460408201526e081a5cc81b9bdd0818dbdc9c9958dd608a1b606082015260800190565b600083516159ef818460208801614c90565b835190830190615a03818360208801614c90565b01949350505050565b60008351615a1e818460208801614c90565b9190910191825250602001919050565b600060208284031215615a4057600080fd5b81516114b081614d0c565b6000816000190483118215151615615a6557615a65615628565b500290565b81810381811115610eca57610eca615628565b80820180821115610eca57610eca615628565b60ff8181168382160190811115610eca57610eca615628565b600083516020615abc8285838901614c90565b8184019150601760f91b8252600160008654615ad781615592565b8184168015615aed5760018114615b0657615b36565b60ff198316878601528115158202870185019350615b36565b896000528560002060005b83811015615b2c578154898201880152908601908701615b11565b5050848288010193505b50919998505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906154e290830184614cb4565b600060208284031215615bdc57600080fd5b81516114b081614c5d565b634e487b7160e01b600052603160045260246000fdfea26469706673582212200a72935c5446d923cf064ce1bf5a9ddfe653ec93bb3255f36c947b8ac7b564f964736f6c63430008100033
Deployed Bytecode Sourcemap
78227:17081:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93576:162;;;;;;;;;;-1:-1:-1;93576:162:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;93576:162:0;;;;;;;;78889:40;;;;;;;;;;-1:-1:-1;78889:40:0;;;;;;;;;;;32338:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33897:221::-;;;;;;;;;;-1:-1:-1;33897:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;33897:221:0;1533:203:1;33420:411:0;;;;;;;;;;-1:-1:-1;33420:411:0;;;;;:::i;:::-;;:::i;:::-;;78540:45;;;;;;;;;;-1:-1:-1;78540:45:0;;;;;:::i;:::-;;:::i;78936:40::-;;;;;;;;;;-1:-1:-1;78936:40:0;;;;;;;;;;;81002:108;;;;;;;;;;;;;:::i;:::-;;;2343:25:1;;;2331:2;2316:18;81002:108:0;2197:177:1;44792:113:0;;;;;;;;;;-1:-1:-1;44880:10:0;:17;44792:113;;73457:280;;;;;;;;;;-1:-1:-1;73457:280:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;73300:149::-;;;;;;;;;;-1:-1:-1;73300:149:0;;;;;:::i;:::-;;:::i;82723:90::-;;;;;;;;;;;;;:::i;77324:212::-;;;;;;;;;;-1:-1:-1;77324:212:0;;;;;:::i;:::-;;:::i;88113:313::-;;;;;;;;;;-1:-1:-1;88113:313:0;;;;;:::i;:::-;;:::i;94677:239::-;;;;;;;;;;-1:-1:-1;94677:239:0;;;;;:::i;:::-;;:::i;92795:197::-;;;;;;;;;;-1:-1:-1;92795:197:0;;;;;:::i;:::-;;:::i;44460:256::-;;;;;;;;;;-1:-1:-1;44460:256:0;;;;;:::i;:::-;;:::i;95155:113::-;;;;;;;;;;-1:-1:-1;95155:113:0;;;;;:::i;:::-;;:::i;81442:92::-;;;;;;;;;;-1:-1:-1;81515:11:0;;81442:92;;89945:236;;;;;;;;;;-1:-1:-1;89945:236:0;;;;;:::i;:::-;;:::i;93271:122::-;;;:::i;52611:97::-;;;;;;;;;;-1:-1:-1;52611:97:0;;;;;:::i;:::-;;:::i;88434:203::-;;;;;;;;;;-1:-1:-1;88434:203:0;;;;;:::i;:::-;;:::i;89008:532::-;;;;;;;;;;-1:-1:-1;89008:532:0;;;;;:::i;:::-;;:::i;79489:152::-;;;;;;;;;;-1:-1:-1;79489:152:0;;;;;:::i;:::-;;:::i;77102:44::-;;;;;;;;;;-1:-1:-1;77102:44:0;;;;;:::i;:::-;;:::i;82002:111::-;;;;;;;;;;;;;:::i;94043:191::-;;;;;;;;;;-1:-1:-1;94043:191:0;;;;;:::i;:::-;;:::i;94457:212::-;;;;;;;;;;-1:-1:-1;94457:212:0;;;;;:::i;:::-;;:::i;79647:241::-;;;;;;;;;;-1:-1:-1;79647:241:0;;;;;:::i;:::-;;:::i;81230:108::-;;;;;;;;;;;;;:::i;80803:104::-;;;;;;;;;;-1:-1:-1;80803:104:0;;;;;:::i;:::-;;:::i;44982:233::-;;;;;;;;;;-1:-1:-1;44982:233:0;;;;;:::i;:::-;;:::i;69114:118::-;;;;;;;;;;-1:-1:-1;69114:118:0;;;;;:::i;:::-;;:::i;93075:185::-;;;;;;;;;;-1:-1:-1;93075:185:0;;;;;:::i;:::-;;:::i;77542:127::-;;;;;;;;;;-1:-1:-1;77542:127:0;;;;;:::i;:::-;;:::i;82935:96::-;;;;;;;;;;-1:-1:-1;82935:96:0;;;;;:::i;:::-;;:::i;84045:2370::-;;;;;;:::i;:::-;;:::i;78850:32::-;;;;;;;;;;-1:-1:-1;78850:32:0;;;;;;;;32032:239;;;;;;;;;;-1:-1:-1;32032:239:0;;;;;:::i;:::-;;:::i;93832:205::-;;;;;;;;;;-1:-1:-1;93832:205:0;;;;;:::i;:::-;;:::i;73745:228::-;;;;;;;;;;-1:-1:-1;73745:228:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;52716:99::-;;;;;;;;;;-1:-1:-1;52716:99:0;;;;;:::i;:::-;;:::i;81344:92::-;;;;;;;;;;-1:-1:-1;81417:11:0;;81344:92;;31762:208;;;;;;;;;;-1:-1:-1;31762:208:0;;;;;:::i;:::-;;:::i;23222:94::-;;;;;;;;;;;;;:::i;92626:163::-;;;;;;;;;;-1:-1:-1;92626:163:0;;;;;:::i;:::-;;:::i;86935:155::-;;;;;;;;;;-1:-1:-1;86935:155:0;;;;;:::i;:::-;;:::i;77675:124::-;;;;;;;;;;-1:-1:-1;77675:124:0;;;;;:::i;:::-;;:::i;89596:343::-;;;;;;;;;;-1:-1:-1;89596:343:0;;;;;:::i;:::-;;:::i;52823:114::-;;;;;;;;;;-1:-1:-1;52823:114:0;;;;;:::i;:::-;;:::i;86421:508::-;;;;;;;;;;-1:-1:-1;86421:508:0;;;;;:::i;:::-;;:::i;22571:87::-;;;;;;;;;;-1:-1:-1;22644:6:0;;-1:-1:-1;;;;;22644:6:0;22571:87;;81913:83;;;;;;;;;;-1:-1:-1;81913:83:0;;;;;:::i;:::-;;:::i;32507:104::-;;;;;;;;;;;;;:::i;90532:188::-;;;;;;;;;;-1:-1:-1;90532:188:0;;;;;:::i;:::-;;:::i;80914:82::-;;;;;;;;;;-1:-1:-1;80982:6:0;;80914:82;;34190:295;;;;;;;;;;-1:-1:-1;34190:295:0;;;;;:::i;:::-;;:::i;82236:132::-;;;;;;;;;;-1:-1:-1;82236:132:0;;;;;:::i;:::-;;:::i;73981:435::-;;;;;;;;;;-1:-1:-1;73981:435:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;88647:354::-;;;;;;;;;;-1:-1:-1;88647:354:0;;;;;:::i;:::-;;:::i;68735:109::-;;;;;;;;;;-1:-1:-1;68735:109:0;;;;;:::i;:::-;;:::i;80152:646::-;;;;;;;;;;-1:-1:-1;80152:646:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;78592:47::-;;;;;;;;;;-1:-1:-1;78592:47:0;;;;;:::i;:::-;;:::i;90909:147::-;;;;;;;;;;-1:-1:-1;90909:147:0;;;;;:::i;:::-;;:::i;81116:108::-;;;;;;;;;;;;;:::i;77153:40::-;;;;;;;;;;-1:-1:-1;77153:40:0;;;;;;;;83037:780;;;;;;;;;;-1:-1:-1;83037:780:0;;;;;:::i;:::-;;:::i;82119:111::-;;;;;;;;;;;;;:::i;90726:174::-;;;;;;;;;;-1:-1:-1;90726:174:0;;;;;:::i;:::-;;:::i;94242:207::-;;;;;;;;;;-1:-1:-1;94242:207:0;;;;;:::i;:::-;;:::i;79895:251::-;;;;;;;;;;-1:-1:-1;79895:251:0;;;;;:::i;:::-;;:::i;81540:92::-;;;;;;;;;;-1:-1:-1;81613:11:0;;81540:92;;82478:239;;;;;;;;;;-1:-1:-1;82478:239:0;;;;;:::i;:::-;;:::i;34556:164::-;;;;;;;;;;-1:-1:-1;34556:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34677:25:0;;;34653:4;34677:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34556:164;81638:269;;;;;;;;;;-1:-1:-1;81638:269:0;;;;;:::i;:::-;;:::i;77202:114::-;;;;;;;;;;;;;:::i;94924:223::-;;;;;;;;;;-1:-1:-1;94924:223:0;;;;;:::i;:::-;;:::i;90186:249::-;;;;;;;;;;;;;:::i;23471:192::-;;;;;;;;;;-1:-1:-1;23471:192:0;;;;;:::i;:::-;;:::i;68852:254::-;;;;;;;;;;-1:-1:-1;68852:254:0;;;;;:::i;:::-;;:::i;77805:178::-;;;;;;;;;;-1:-1:-1;77805:178:0;;;;;:::i;:::-;;:::i;82374:98::-;;;;;;;;;;-1:-1:-1;82374:98:0;;;;;:::i;:::-;;:::i;93576:162::-;93679:4;93697:36;93721:11;93697:23;:36::i;:::-;93690:43;93576:162;-1:-1:-1;;93576:162:0:o;32338:100::-;32392:13;32425:5;32418:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32338:100;:::o;33897:221::-;33973:7;34001:16;34009:7;34001;:16::i;:::-;33993:73;;;;-1:-1:-1;;;33993:73:0;;20320:2:1;33993:73:0;;;20302:21:1;20359:2;20339:18;;;20332:30;20398:34;20378:18;;;20371:62;-1:-1:-1;;;20449:18:1;;;20442:42;20501:19;;33993:73:0;;;;;;;;;-1:-1:-1;34086:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34086:24:0;;33897:221::o;33420:411::-;33501:13;33517:23;33532:7;33517:14;:23::i;:::-;33501:39;;33565:5;-1:-1:-1;;;;;33559:11:0;:2;-1:-1:-1;;;;;33559:11:0;;33551:57;;;;-1:-1:-1;;;33551:57:0;;20733:2:1;33551:57:0;;;20715:21:1;20772:2;20752:18;;;20745:30;20811:34;20791:18;;;20784:62;-1:-1:-1;;;20862:18:1;;;20855:31;20903:19;;33551:57:0;20531:397:1;33551:57:0;682:10;-1:-1:-1;;;;;33643:21:0;;;;:62;;-1:-1:-1;33668:37:0;33685:5;682:10;34556:164;:::i;33668:37::-;33621:168;;;;-1:-1:-1;;;33621:168:0;;21135:2:1;33621:168:0;;;21117:21:1;21174:2;21154:18;;;21147:30;21213:34;21193:18;;;21186:62;21284:26;21264:18;;;21257:54;21328:19;;33621:168:0;20933:420:1;33621:168:0;33802:21;33811:2;33815:7;33802:8;:21::i;:::-;33490:341;33420:411;;:::o;78540:45::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;81002:108::-;81048:7;81075:27;81090:11;;81075:10;80982:6;;;80914:82;81075:10;:14;;:27::i;:::-;81068:34;;81002:108;:::o;73457:280::-;73547:22;73604:4;-1:-1:-1;;;;;73591:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73582:34;;73632:9;73627:103;73647:15;;;73627:103;;;73696:22;73701:4;;73706:1;73701:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;73696:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73710:7:0;;-1:-1:-1;73696:4:0;;-1:-1:-1;;73696:22:0:i;:::-;73684:6;73691:1;73684:9;;;;;;;;:::i;:::-;;;;;;:34;;;;73664:3;;;;;:::i;:::-;;;;73627:103;;;;73457:280;;;;;:::o;73300:149::-;73383:19;73423:18;73428:3;;73423:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73433:7:0;;-1:-1:-1;73423:4:0;;-1:-1:-1;;73423:18:0:i;:::-;73415:26;73300:149;-1:-1:-1;;;;73300:149:0:o;82723:90::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;82792:13:::1;::::0;;-1:-1:-1;;82775:30:0;::::1;82792:13;::::0;;::::1;82791:14;82775:30;::::0;;82723:90::o;77324:212::-;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;77420:9:::1;77415:114;77435:16:::0;;::::1;77415:114;;;77509:5;;77515:1;77509:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;77477:12;77496:5;;77502:1;77496:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;77477:29;;;;;;;:::i;:::-;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;-1:-1:-1::0;77453:3:0;::::1;::::0;::::1;:::i;:::-;;;;77415:114;;88113:313:::0;88275:41;682:10;88294:12;88308:7;88275:18;:41::i;:::-;88267:84;;;;-1:-1:-1;;;88267:84:0;;25597:2:1;88267:84:0;;;25579:21:1;25636:2;25616:18;;;25609:30;25675:32;25655:18;;;25648:60;25725:18;;88267:84:0;25395:354:1;88267:84:0;88360:15;88367:7;88360:6;:15::i;:::-;88390:28;88400:4;88406:2;88410:7;88390:9;:28::i;94677:239::-;94845:7;79339:41;682:10;79358:12;602:98;79339:41;79317:74;;;;;;94866:42:::1;94881:9;;94892:6;;94900:7;94866:14;:42::i;:::-;94677:239:::0;;;;;;:::o;92795:197::-;92875:7;92931:5;92904:24;92920:7;92904:15;:24::i;:::-;:32;92895:42;;;;;;92955:19;;;;:10;:19;;;;;:29;;92978:5;92955:22;:29::i;:::-;92948:36;92795:197;-1:-1:-1;;;92795:197:0:o;44460:256::-;44557:7;44593:23;44610:5;44593:16;:23::i;:::-;44585:5;:31;44577:87;;;;-1:-1:-1;;;44577:87:0;;25956:2:1;44577:87:0;;;25938:21:1;25995:2;25975:18;;;25968:30;26034:34;26014:18;;;26007:62;-1:-1:-1;;;26085:18:1;;;26078:41;26136:19;;44577:87:0;25754:407:1;44577:87:0;-1:-1:-1;;;;;;44682:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;44460:256::o;95155:113::-;95225:7;79339:41;682:10;79358:12;602:98;79339:41;79317:74;;;;;;95245:15:::1;95252:7;95245:6;:15::i;:::-;95155:113:::0;;:::o;89945:236::-;682:10;90049:36;682:10;90077:7;90049:18;:36::i;:::-;90041:88;;;;-1:-1:-1;;;90041:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;90140:23:0;;;;;:14;:23;;;;;:33;89945:236::o;93271:122::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;93337:47:::1;::::0;93345:10:::1;::::0;93362:21:::1;93337:47:::0;::::1;;;::::0;::::1;::::0;;;93362:21;93345:10;93337:47;::::1;;;;;;93329:56;;;::::0;::::1;;93271:122::o:0;52611:97::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;52681:19:::1;52692:7;52681:10;:19::i;:::-;52611:97:::0;:::o;88434:203::-;88590:39;88607:4;88613:2;88617:7;88590:39;;;;;;;;;;;;:16;:39::i;89008:532::-;89073:41;682:10;89092:12;602:98;89073:41;89065:92;;;;-1:-1:-1;;;89065:92:0;;26776:2:1;89065:92:0;;;26758:21:1;26815:2;26795:18;;;26788:30;26854:34;26834:18;;;26827:62;-1:-1:-1;;;26905:18:1;;;26898:36;26951:19;;89065:92:0;26574:402:1;89065:92:0;89176:19;;;;:10;:19;;;;;89170:33;;;;;:::i;:::-;:38;;-1:-1:-1;89166:97:0;;89232:19;;;;:10;:19;;;;;89225:26;;;:::i;:::-;682:10;89275:28;;;;:14;:28;;;;;;:33;89271:101;;682:10;89332:28;;;;:14;:28;;;;;89325:35;89271:101;89420:1;89384:24;;;:15;:24;;;;;;-1:-1:-1;;;;;89384:24:0;:38;89380:102;;89446:24;;;;:15;:24;;;;;89439:31;;-1:-1:-1;;;;;;89439:31:0;;;89380:102;89490:15;89497:7;89490:6;:15::i;:::-;89518:14;89524:7;89518:5;:14::i;79489:152::-;79572:4;79597:36;79616:7;79625;79597:18;:36::i;77102:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;82002:111::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;82085:20:::1;::::0;;-1:-1:-1;;82061:44:0;::::1;82085:20;::::0;;;::::1;;;82084:21;82061:44:::0;;::::1;;::::0;;82002:111::o;94043:191::-;94180:7;79339:41;682:10;79358:12;602:98;79339:41;79317:74;;;;;;94201:25:::1;94206:3;;94211:5;;94218:7;94201:4;:25::i;94457:212::-:0;94605:7;79339:41;682:10;79358:12;602:98;79339:41;79317:74;;;;;;94626:35:::1;94637:7;94646:5;;94653:7;94626:10;:35::i;:::-;94457:212:::0;;;;;:::o;79647:241::-;79710:7;79725:21;79749:26;79768:6;79749:18;:26::i;:::-;79725:50;;79783:15;79836:7;79819:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;79809:36;;;;;;79801:45;;79783:63;;79864:16;79872:7;79864;:16::i;81230:108::-;81276:7;81303:27;81318:11;;81303:10;80982:6;;;80914:82;80803:104;80859:4;80883:16;80891:7;80883;:16::i;44982:233::-;45057:7;45093:30;44880:10;:17;;44792:113;45093:30;45085:5;:38;45077:95;;;;-1:-1:-1;;;45077:95:0;;27477:2:1;45077:95:0;;;27459:21:1;27516:2;27496:18;;;27489:30;27555:34;27535:18;;;27528:62;-1:-1:-1;;;27606:18:1;;;27599:42;27658:19;;45077:95:0;27275:408:1;45077:95:0;45190:10;45201:5;45190:17;;;;;;;;:::i;:::-;;;;;;;;;45183:24;;44982:233;;;:::o;69114:118::-;69169:55;69212:3;69195:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;69185:32;;;;;;69177:41;;69220:3;69169:7;:55::i;93075:185::-;93136:7;93172:5;93166:19;93189:1;93166:24;93157:34;;;;;;93244:5;93227:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;93227:23:0;;;;;;;;;93217:34;;93227:23;93217:34;;;;;93075:185;-1:-1:-1;;93075:185:0:o;77542:127::-;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;77657:4:::1;;77629:12;77648:4;;77629:25;;;;;;;:::i;:::-;;;;;;;;;;;;;:32;;;;;;;:::i;82935:96::-:0;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;83005:11:::1;:18;83019:4:::0;83005:11;:18:::1;:::i;84045:2370::-:0;84150:13;;;;84142:52;;;;-1:-1:-1;;;84142:52:0;;29247:2:1;84142:52:0;;;29229:21:1;29286:2;29266:18;;;29259:30;29325:28;29305:18;;;29298:56;29371:18;;84142:52:0;29045:350:1;84142:52:0;-1:-1:-1;;;;;84211:16:0;;84203:47;;;;-1:-1:-1;;;84203:47:0;;29602:2:1;84203:47:0;;;29584:21:1;29641:2;29621:18;;;29614:30;-1:-1:-1;;;29660:18:1;;;29653:48;29718:18;;84203:47:0;29400:342:1;84203:47:0;84273:3;84267:17;84288:1;84267:22;84259:56;;;;-1:-1:-1;;;84259:56:0;;29949:2:1;84259:56:0;;;29931:21:1;29988:2;29968:18;;;29961:30;-1:-1:-1;;;30007:18:1;;;30000:51;30068:18;;84259:56:0;29747:345:1;84259:56:0;84332:10;84338:3;84332:5;:10::i;:::-;:18;;84346:4;84332:18;84324:44;;;;-1:-1:-1;;;84324:44:0;;30299:2:1;84324:44:0;;;30281:21:1;30338:2;30318:18;;;30311:30;-1:-1:-1;;;30357:18:1;;;30350:43;30410:18;;84324:44:0;30097:337:1;84324:44:0;84395:20;;84377:15;84432:12;;;84424:42;;;;-1:-1:-1;;;84424:42:0;;30641:2:1;84424:42:0;;;30623:21:1;30680:2;30660:18;;;30653:30;-1:-1:-1;;;30699:18:1;;;30692:47;30756:18;;84424:42:0;30439:341:1;84424:42:0;84484:32;84509:6;84484:24;:32::i;:::-;:41;84476:79;;;;-1:-1:-1;;;84476:79:0;;30987:2:1;84476:79:0;;;30969:21:1;31026:2;31006:18;;;30999:30;-1:-1:-1;;;31045:18:1;;;31038:55;31110:18;;84476:79:0;30785:349:1;84476:79:0;84572:27;84592:6;84572:19;:27::i;:::-;:32;84564:63;;;;-1:-1:-1;;;84564:63:0;;31341:2:1;84564:63:0;;;31323:21:1;31380:2;31360:18;;;31353:30;-1:-1:-1;;;31399:18:1;;;31392:48;31457:18;;84564:63:0;31139:342:1;84564:63:0;84664:20;;;;:28;;:20;:28;84660:164;;84699:18;84720:12;84739:6;84720:27;;;;;;:::i;:::-;;;;;;;;;;;;;84699:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84767:4;84761:18;84783:1;84761:23;84753:65;;;;-1:-1:-1;;;84753:65:0;;31980:2:1;84753:65:0;;;31962:21:1;32019:2;31999:18;;;31992:30;32058:31;32038:18;;;32031:59;32107:18;;84753:65:0;31778:353:1;84753:65:0;84693:131;84660:164;84832:21;84856:26;84875:6;84856:18;:26::i;:::-;84832:50;;84891:18;84912:23;84931:3;84912:18;:23::i;:::-;84891:44;;84978:7;84992:4;84961:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;84944:54;;85007:15;85025:19;85036:7;85025:10;:19::i;:::-;85085:10;;85007:37;;-1:-1:-1;;;;;;85085:10:0;:24;85081:123;;85149:10;;85129:47;;-1:-1:-1;;;85129:47:0;;;;;2343:25:1;;;-1:-1:-1;;;;;85149:10:0;;;;85129:38;;2316:18:1;;85129:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85128:48;85120:78;;;;-1:-1:-1;;;85120:78:0;;33233:2:1;85120:78:0;;;33215:21:1;33272:2;33252:18;;;33245:30;-1:-1:-1;;;33291:18:1;;;33284:47;33348:18;;85120:78:0;33031:341:1;85120:78:0;85220:16;85228:7;85220;:16::i;:::-;85219:17;85210:45;;;;-1:-1:-1;;;85210:45:0;;;;;;;:::i;:::-;85272:7;85283:1;85272:12;85268:257;;85303:20;;;;;;;:28;;85327:4;85303:28;85295:80;;;;-1:-1:-1;;;85295:80:0;;33922:2:1;85295:80:0;;;33904:21:1;33961:2;33941:18;;;33934:30;34000:34;33980:18;;;33973:62;-1:-1:-1;;;34051:18:1;;;34044:37;34098:19;;85295:80:0;33720:403:1;85295:80:0;85386:16;85405:27;85420:11;;85405:10;80982:6;;;80914:82;85405:27;85386:46;;85459:8;85446:9;:21;;85438:81;;;;-1:-1:-1;;;85438:81:0;;;;;;;:::i;:::-;85289:236;85268:257;85537:7;85548:1;85537:12;85533:253;;85568:20;;;;;;;;:28;;:20;:28;85560:81;;;;-1:-1:-1;;;85560:81:0;;34746:2:1;85560:81:0;;;34728:21:1;34785:2;34765:18;;;34758:30;34824:34;34804:18;;;34797:62;-1:-1:-1;;;34875:18:1;;;34868:38;34923:19;;85560:81:0;34544:404:1;85560:81:0;85647:16;85666:27;85681:11;;85666:10;80982:6;;;80914:82;85666:27;85647:46;;85720:8;85707:9;:21;;85699:81;;;;-1:-1:-1;;;85699:81:0;;;;;;;:::i;:::-;85554:232;85533:253;85797:7;85808:1;85797:12;85793:166;;85820:16;85839:27;85854:11;;85839:10;80982:6;;;80914:82;85839:27;85820:46;;85893:8;85880:9;:21;;85872:81;;;;-1:-1:-1;;;85872:81:0;;;;;;;:::i;:::-;85814:145;85793:166;85971:7;85982:1;85971:12;85967:166;;85994:16;86013:27;86028:11;;86013:10;80982:6;;;80914:82;86013:27;85994:46;;86067:8;86054:9;:21;;86046:81;;;;-1:-1:-1;;;86046:81:0;;;;;;;:::i;:::-;85988:145;85967:166;86156:1;86145:7;:12;86141:149;;86168:16;86187:10;80982:6;;;80914:82;86187:10;86168:29;;86224:8;86211:9;:21;;86203:81;;;;-1:-1:-1;;;86203:81:0;;;;;;;:::i;:::-;86162:128;86141:149;86300:22;86310:2;86314:7;86300:9;:22::i;:::-;86335:30;86348:7;86357;86335:12;:30::i;:::-;86390:7;86383:24;86399:7;86383:24;;;;;;:::i;:::-;;;;;;;;84137:2278;;;;84045:2370;;;:::o;32032:239::-;32104:7;32140:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32140:16:0;;32167:73;;;;-1:-1:-1;;;32167:73:0;;35155:2:1;32167:73:0;;;35137:21:1;35194:2;35174:18;;;35167:30;35233:34;35213:18;;;35206:62;-1:-1:-1;;;35284:18:1;;;35277:39;35333:19;;32167:73:0;34953:405:1;93832:205:0;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;93998:31:::1;94007:4;;94013:6;;94021:7;93998:8;:31::i;73745:228::-:0;73866:17;73885:19;73937:28;73948:7;73957;73937:10;:28::i;:::-;73922:43;;;;-1:-1:-1;73745:228:0;-1:-1:-1;;;73745:228:0:o;52716:99::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;52787:20:::1;52799:7;52787:11;:20::i;31762:208::-:0;31834:7;-1:-1:-1;;;;;31862:19:0;;31854:74;;;;-1:-1:-1;;;31854:74:0;;35565:2:1;31854:74:0;;;35547:21:1;35604:2;35584:18;;;35577:30;35643:34;35623:18;;;35616:62;-1:-1:-1;;;35694:18:1;;;35687:40;35744:19;;31854:74:0;35363:406:1;31854:74:0;-1:-1:-1;;;;;;31946:16:0;;;;;:9;:16;;;;;;;31762:208::o;23222:94::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;23287:21:::1;23305:1;23287:9;:21::i;92626:163::-:0;92689:7;92718:16;92726:7;92718;:16::i;:::-;92709:26;;;;;;92753:19;;;;:10;:19;;;;;:28;;:26;:28::i;86935:155::-;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;87050:32:::1;87066:2;87070:6;87078:3;87050:15;:32::i;77675:124::-:0;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;77766:12:::1;77785:4;;77766:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;77759:32;;;;:::i;89596:343::-:0;-1:-1:-1;;;;;89696:23:0;;89678:15;89696:23;;;:14;:23;;;;;;89653:13;;89738:12;;;89730:65;;;;-1:-1:-1;;;89730:65:0;;35976:2:1;89730:65:0;;;35958:21:1;36015:2;35995:18;;;35988:30;36054:34;36034:18;;;36027:62;-1:-1:-1;;;36105:18:1;;;36098:38;36153:19;;89730:65:0;35774:404:1;89730:65:0;89814:36;89833:7;89842;89814:18;:36::i;:::-;89806:88;;;;-1:-1:-1;;;89806:88:0;;;;;;;:::i;:::-;89912:19;;;;:10;:19;;;;;89905:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89596:343;;;:::o;52823:114::-;52878:4;52900:29;:16;52921:7;52900:20;:29::i;86421:508::-;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;86564:9:::1;86559:366;86579:17:::0;;::::1;86559:366;;;86622:20;86645:30;86664:7;86672:1;86664:10;;;;;;;;:::i;:::-;;;;;;;86645:18;:30::i;:::-;86622:53;;86686:13;86702:6;;86709:1;86702:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;86686:25;;86749:1;86732:6;86726:20;:24;:47;;;;-1:-1:-1::0;;;;;;86754:19:0;::::1;::::0;::::1;86726:47;86722:192;;;86786:15;86804:18;86815:6;86804:10;:18::i;:::-;86786:36;;86834:16;86842:7;86834;:16::i;:::-;86829:79;;86865:35;86881:5;86888:6;86896:3;86865:15;:35::i;:::-;86779:135;86722:192;86607:318;;86598:3;;;;;:::i;:::-;;;;86559:366;;81913:83:::0;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;81974:6:::1;:14:::0;81913:83::o;32507:104::-;32563:13;32596:7;32589:14;;;;;:::i;90532:188::-;90646:7;79339:41;682:10;79358:12;602:98;79339:41;79317:74;;;;;;90672:40:::1;90691:2;90695:7;90704:3;90672:40;;;;;;;;;;;::::0;:18:::1;:40::i;:::-;90532:188:::0;;;;:::o;34190:295::-;682:10;-1:-1:-1;;;;;34293:24:0;;;34285:62;;;;-1:-1:-1;;;34285:62:0;;36385:2:1;34285:62:0;;;36367:21:1;36424:2;36404:18;;;36397:30;36463:27;36443:18;;;36436:55;36508:18;;34285:62:0;36183:349:1;34285:62:0;682:10;34360:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34360:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34360:53:0;;;;;;;;;;34429:48;;540:41:1;;;34360:42:0;;682:10;34429:48;;513:18:1;34429:48:0;;;;;;;34190:295;;:::o;82236:132::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;82300:15:::1;82318:16;82329:4;82318:10;:16::i;:::-;82339:14;::::0;;;:5:::1;:14;::::0;;;;82300:34;;-1:-1:-1;82339:21:0::1;82356:4:::0;82339:14;:21:::1;:::i;73981:435::-:0;74119:20;;74201:9;-1:-1:-1;;;;;74188:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74181:37:0;-1:-1:-1;74251:9:0;-1:-1:-1;;;;;74238:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74229:39;;74284:9;74279:130;74299:20;;;74279:130;;;74364:33;74375:9;;74385:1;74375:12;;;;;;;:::i;:::-;;;;;;;74389:7;74364:10;:33::i;:::-;74342:4;74347:1;74342:7;;;;;;;;:::i;:::-;;;;;;74351:6;74358:1;74351:9;;;;;;;;:::i;:::-;;;;;;74341:56;;;;;;;;74321:3;;;;;:::i;:::-;;;;74279:130;;;;73981:435;;;;;;:::o;88647:354::-;88839:41;682:10;88872:7;88839:18;:41::i;:::-;88831:84;;;;-1:-1:-1;;;88831:84:0;;25597:2:1;88831:84:0;;;25579:21:1;25636:2;25616:18;;;25609:30;25675:32;25655:18;;;25648:60;25725:18;;88831:84:0;25395:354:1;88831:84:0;88924:15;88931:7;88924:6;:15::i;:::-;88954:39;88968:4;88974:2;88978:7;88987:5;88954:13;:39::i;68735:109::-;68822:14;;;;:5;:14;;;;;68815:21;;68789:13;;68822:14;68815:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68735:109;;;:::o;80152:646::-;80220:25;80248:23;80279:16;80298:18;80308:7;80298:9;:18::i;:::-;80279:37;;80346:1;80335:8;:12;80327:25;;;;-1:-1:-1;;;80327:25:0;;36739:2:1;80327:25:0;;;36721:21:1;-1:-1:-1;36758:18:1;;;36751:29;36797:18;;80327:25:0;36537:284:1;80327:25:0;80364:26;80407:8;-1:-1:-1;;;;;80393:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80393:23:0;;80364:52;;80427:24;80467:8;-1:-1:-1;;;;;80454:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80427:49;;80492:9;80487:244;80511:8;80507:1;:12;80487:244;;;80541:15;80559:31;80579:7;80588:1;80559:19;:31::i;:::-;80605:20;80628:19;;;:10;:19;;;;;80605:42;;80541:49;;-1:-1:-1;80605:20:0;;:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80677:7;80662:9;80672:1;80662:12;;;;;;;;:::i;:::-;;;;;;:22;;;;;80713:6;80699:8;80708:1;80699:11;;;;;;;;:::i;:::-;;;;;;:20;;;;80526:205;;80521:3;;;;;:::i;:::-;;;;80487:244;;;-1:-1:-1;80752:9:0;;80782:8;;-1:-1:-1;80152:646:0;-1:-1:-1;;;80152:646:0:o;78592:47::-;;;;;;;;;;;;;;;;:::i;90909:147::-;90997:7;79339:41;682:10;79358:12;602:98;79339:41;79317:74;;;;;;91020:28:::1;91035:7;91044:3;91020:14;:28::i;81116:108::-:0;81162:7;81189:27;81204:11;;81189:10;80982:6;;;80914:82;83037:780;83102:13;83136:16;83144:7;83136;:16::i;:::-;83128:76;;;;-1:-1:-1;;;83128:76:0;;37028:2:1;83128:76:0;;;37010:21:1;37067:2;37047:18;;;37040:30;37106:34;37086:18;;;37079:62;-1:-1:-1;;;37157:18:1;;;37150:45;37212:19;;83128:76:0;36826:411:1;83128:76:0;83217:23;83243:19;;;:10;:19;;;;;83217:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83328:21;83352:10;:8;:10::i;:::-;83328:34;;83383:7;83377:21;83402:1;83377:26;83373:75;;-1:-1:-1;83427:9:0;83037:780;-1:-1:-1;;83037:780:0:o;83373:75::-;83552:23;;:27;83548:111;;83627:7;83636:9;83610:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83596:51;;;;83037:780;;;:::o;83548:111::-;83791:7;83800;83774:34;;;;;;;;;:::i;82119:111::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;82202:20:::1;::::0;;-1:-1:-1;;82178:44:0;::::1;82202:20:::0;;;;::::1;;;82201:21;82178:44:::0;;::::1;;::::0;;82119:111::o;90726:174::-;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;90852:40:::1;90871:2;90875:7;90884:3;90852:40;;;;;;;;;;;::::0;:18:::1;:40::i;94242:207::-:0;94389:7;79339:41;682:10;79358:12;602:98;79339:41;79317:74;;;;;;94410:31:::1;94419:4;;94425:6;;94433:7;94410:8;:31::i;79895:251::-:0;79997:10;;79977:48;;-1:-1:-1;;;79977:48:0;;79960:7;;-1:-1:-1;;;;;79997:10:0;;79977:40;;:48;;80018:6;;79977:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;79977:48:0;;;;;;;;-1:-1:-1;;79977:48:0;;;;;;;;;;;;:::i;:::-;;;79973:169;;-1:-1:-1;80128:1:0;;79895:251;-1:-1:-1;79895:251:0:o;82478:239::-;82534:4;;;82594:16;82605:4;82594:10;:16::i;:::-;82625:14;;;;:5;:14;;;;;82619:28;;82576:34;;-1:-1:-1;82625:14:0;82619:28;;;:::i;:::-;:33;;-1:-1:-1;82615:79:0;;82678:4;82668:14;;82615:79;-1:-1:-1;82705:7:0;82478:239;-1:-1:-1;;82478:239:0:o;81638:269::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;81770:11:::1;:27:::0;;;;81802:11:::1;:27:::0;;;;81840:11:::1;:27:::0;81872:11:::1;:27:::0;81638:269::o;77202:114::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;77288:20:::1;::::0;;-1:-1:-1;;77264:44:0;::::1;77288:20;::::0;;::::1;77287:21;77264:44;::::0;;77202:114::o;94924:223::-;95084:7;79339:41;682:10;79358:12;602:98;79339:41;79317:74;;;;;;95104:35:::1;95117:4;;95123:6;;95131:7;95104:12;:35::i;90186:249::-:0;682:10;90229:15;90288:23;;;:14;:23;;;;;;;90330:12;;;90322:64;;;;-1:-1:-1;;;90322:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;90404:23:0;;;;;:14;:23;;;;;90397:30;90186:249::o;23471:192::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23560:22:0;::::1;23552:73;;;::::0;-1:-1:-1;;;23552:73:0;;38591:2:1;23552:73:0::1;::::0;::::1;38573:21:1::0;38630:2;38610:18;;;38603:30;38669:34;38649:18;;;38642:62;-1:-1:-1;;;38720:18:1;;;38713:36;38766:19;;23552:73:0::1;38389:402:1::0;23552:73:0::1;23636:19;23646:8;23636:9;:19::i;68852:254::-:0;68917:22;68974:6;-1:-1:-1;;;;;68961:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68952:36;;69004:9;68999:100;69019:17;;;68999:100;;;69070:17;69077:6;;69084:1;69077:9;;;;;;;:::i;:::-;;;;;;;69070:6;:17::i;:::-;69058:6;69065:1;69058:9;;;;;;;;:::i;:::-;;;;;;:29;;;;69038:3;;;;;:::i;:::-;;;;68999:100;;77805:178;77876:4;77887:19;77909:12;77928:4;;77909:25;;;;;;;:::i;:::-;;;;;;;;;;;;;77887:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;77952:19:0;;:23;;;77805:178;-1:-1:-1;;;;;;;77805:178:0:o;82374:98::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;82443:10:::1;:21:::0;;-1:-1:-1;;;;;;82443:21:0::1;-1:-1:-1::0;;;;;82443:21:0;;;::::1;::::0;;;::::1;::::0;;82374:98::o;51351:178::-;51429:18;51433:4;51439:7;51429:3;:18::i;:::-;51428:19;51420:63;;;;-1:-1:-1;;;51420:63:0;;38998:2:1;51420:63:0;;;38980:21:1;39037:2;39017:18;;;39010:30;39076:33;39056:18;;;39049:61;39127:18;;51420:63:0;38796:355:1;51420:63:0;-1:-1:-1;;;;;51494:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;51494:27:0;51517:4;51494:27;;;51351:178::o;44152:224::-;44254:4;-1:-1:-1;;;;;;44278:50:0;;-1:-1:-1;;;44278:50:0;;:90;;;44332:36;44356:11;44332:23;:36::i;37291:127::-;37356:4;37380:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37380:16:0;:30;;;37291:127::o;41273:174::-;41348:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;41348:29:0;-1:-1:-1;;;;;41348:29:0;;;;;;;;:24;;41402:23;41348:24;41402:14;:23::i;:::-;-1:-1:-1;;;;;41393:46:0;;;;;;;;;;;41273:174;;:::o;6480:98::-;6538:7;6565:5;6569:1;6565;:5;:::i;76084:169::-;76156:13;76189:56;76229:3;76212:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;76202:32;;;;;;76194:41;;76237:7;76189:4;:56::i;37585:348::-;37678:4;37703:16;37711:7;37703;:16::i;:::-;37695:73;;;;-1:-1:-1;;;37695:73:0;;39531:2:1;37695:73:0;;;39513:21:1;39570:2;39550:18;;;39543:30;39609:34;39589:18;;;39582:62;-1:-1:-1;;;39660:18:1;;;39653:42;39712:19;;37695:73:0;39329:408:1;37695:73:0;37779:13;37795:23;37810:7;37795:14;:23::i;:::-;37779:39;;37848:5;-1:-1:-1;;;;;37837:16:0;:7;-1:-1:-1;;;;;37837:16:0;;:51;;;;37881:7;-1:-1:-1;;;;;37857:31:0;:20;37869:7;37857:11;:20::i;:::-;-1:-1:-1;;;;;37857:31:0;;37837:51;:87;;;-1:-1:-1;;;;;;34677:25:0;;;34653:4;34677:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37892:32;34556:164;75897:179;76010:18;76020:7;76010:9;:18::i;:::-;75993:36;;;;;;39871:19:1;;39915:2;39906:12;;39742:182;75993:36:0;;;;-1:-1:-1;;75993:36:0;;;;;;;;;75983:47;;75993:36;75983:47;;;;75975:56;75950:22;;;:13;:22;;;;;;:81;;;;75964:7;;76047:21;;75975:56;76047:21;75897:179;:::o;40577:578::-;40736:4;-1:-1:-1;;;;;40709:31:0;:23;40724:7;40709:14;:23::i;:::-;-1:-1:-1;;;;;40709:31:0;;40701:85;;;;-1:-1:-1;;;40701:85:0;;40131:2:1;40701:85:0;;;40113:21:1;40170:2;40150:18;;;40143:30;40209:34;40189:18;;;40182:62;-1:-1:-1;;;40260:18:1;;;40253:39;40309:19;;40701:85:0;39929:405:1;40701:85:0;-1:-1:-1;;;;;40805:16:0;;40797:65;;;;-1:-1:-1;;;40797:65:0;;40541:2:1;40797:65:0;;;40523:21:1;40580:2;40560:18;;;40553:30;40619:34;40599:18;;;40592:62;-1:-1:-1;;;40670:18:1;;;40663:34;40714:19;;40797:65:0;40339:400:1;40797:65:0;40875:39;40896:4;40902:2;40906:7;40875:20;:39::i;:::-;40979:29;40996:1;41000:7;40979:8;:29::i;:::-;-1:-1:-1;;;;;41021:15:0;;;;;;:9;:15;;;;;:20;;41040:1;;41021:15;:20;;41040:1;;41021:20;:::i;:::-;;;;-1:-1:-1;;;;;;;41052:13:0;;;;;;:9;:13;;;;;:18;;41069:1;;41052:13;:18;;41069:1;;41052:18;:::i;:::-;;;;-1:-1:-1;;41081:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41081:21:0;-1:-1:-1;;;;;41081:21:0;;;;;;;;;41120:27;;41081:16;;41120:27;;;;;;;40577:578;;;:::o;75397:276::-;75553:9;75548:118;75568:20;;;75548:118;;;75610:44;75621:9;;75631:1;75621:12;;;;;;;:::i;:::-;;;;;;;75635:6;;75642:1;75635:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;75646:7;75610:10;:44::i;:::-;75590:3;;;;:::i;:::-;;;;75548:118;;67666:137;67737:7;67772:22;67776:3;67788:5;67772:3;:22::i;52949:93::-;53005:29;:16;53026:7;53005:20;:29::i;39880:360::-;39940:13;39956:23;39971:7;39956:14;:23::i;:::-;39940:39;;39992:48;40013:5;40028:1;40032:7;39992:20;:48::i;:::-;40081:29;40098:1;40102:7;40081:8;:29::i;:::-;-1:-1:-1;;;;;40123:16:0;;;;;;:9;:16;;;;;:21;;40143:1;;40123:16;:21;;40143:1;;40123:21;:::i;:::-;;;;-1:-1:-1;;40162:16:0;;;;:7;:16;;;;;;40155:23;;-1:-1:-1;;;;;;40155:23:0;;;40196:36;40170:7;;40162:16;-1:-1:-1;;;;;40196:36:0;;;;;40162:16;;40196:36;39929:311;39880:360;:::o;74596:273::-;74725:15;74778:3;;74761:21;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;74761:21:0;;;;;;;;;74751:32;;74761:21;74751:32;;;;74795:21;;;;;;;;;;;;;;;;;;74751:32;;-1:-1:-1;74795:21:0;;74751:32;;74812:3;;;;;;74795:21;;74812:3;;;;74795:21;;;;;;;;;-1:-1:-1;74795:7:0;;-1:-1:-1;;;74795:21:0:i;:::-;74827:34;74832:7;74841:3;;74827:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;74827:34:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74846:5:0;;-1:-1:-1;74846:5:0;;;;74827:34;;74846:5;;;;74827:34;;;;;;;;;-1:-1:-1;74853:7:0;;-1:-1:-1;74827:4:0;;-1:-1:-1;;74827:34:0:i;75133:256::-;75272:19;75283:7;75272:10;:19::i;:::-;75264:60;;;;-1:-1:-1;;;75264:60:0;;41487:2:1;75264:60:0;;;41469:21:1;41526:2;41506:18;;;41499:30;41565;41545:18;;;41538:58;41613:18;;75264:60:0;41285:352:1;75264:60:0;75335:46;75340:7;75349:15;75356:7;75349:6;:15::i;:::-;75366:5;;75335:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75373:7:0;;-1:-1:-1;75335:4:0;;-1:-1:-1;;75335:46:0:i;53885:566::-;53944:13;53970:17;53996:3;53970:30;;54011:19;54043:4;:11;-1:-1:-1;;;;;54033:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54033:22:0;;54011:44;;54071:6;54066:346;54087:4;:11;54083:1;:15;54066:346;;;54182:2;54170:4;54175:1;54170:7;;;;;;;;:::i;:::-;;;;;;;54164:20;;;;54163:48;;;54208:2;54196:4;54201:1;54196:7;;;;;;;;:::i;:::-;;;;;;;54190:20;;54163:48;54159:242;;;54311:4;54316:1;54311:7;;;;;;;;:::i;:::-;;;;;;;;;54305:14;;54322:2;54305:19;;;;:::i;:::-;54298:27;;54286:6;54293:1;54286:9;;;;;;;;:::i;:::-;;;;:39;-1:-1:-1;;;;;54286:39:0;;;;;;;;;54159:242;;;54378:4;54383:1;54378:7;;;;;;;;:::i;:::-;;;;;;;;;54366:6;54373:1;54366:9;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;54366:19:0;;;;;;;;;54159:242;54100:3;;;;:::i;:::-;;;;54066:346;;69372:153;69450:19;69461:7;69450:10;:19::i;:::-;69445:73;;69486:14;;;;:5;:14;;;;;:20;69503:3;69486:14;:20;:::i;54702:248::-;54767:4;54803:3;54767:4;54812:117;54832:4;:11;54828:1;:15;54812:117;;;54855:11;54869:4;54874:1;54869:7;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;54869:7:0;;-1:-1:-1;;;;54885:12:0;;;54882:42;;-1:-1:-1;54913:4:0;;54702:248;-1:-1:-1;;;;54702:248:0:o;54882:42::-;-1:-1:-1;54845:3:0;;;;:::i;:::-;;;;54812:117;;;-1:-1:-1;54940:5:0;;54702:248;-1:-1:-1;;;54702:248:0:o;53262:617::-;53560:8;;53320:4;;53533:1;53526:9;;;;53556:18;;;53320:4;;53641:210;53657:3;53651;:9;53641:210;;;53726:10;;53738:4;53722:21;53768:4;53763:9;;;53759:58;;53793:8;53800:1;53793:8;;:::i;:::-;;;53759:58;53831:8;53838:1;53831:8;;:::i;:::-;;;53669:182;53662:5;;;;;:::i;:::-;;;;53641:210;;;-1:-1:-1;53868:3:0;53262:617;-1:-1:-1;;;;53262:617:0:o;38275:110::-;38351:26;38361:2;38365:7;38351:26;;;;;;;;;;;;:9;:26::i;83822:215::-;83922:16;83930:7;83922;:16::i;:::-;83914:73;;;;-1:-1:-1;;;83914:73:0;;41997:2:1;83914:73:0;;;41979:21:1;42036:2;42016:18;;;42009:30;42075:34;42055:18;;;42048:62;-1:-1:-1;;;42126:18:1;;;42119:42;42178:19;;83914:73:0;41795:408:1;83914:73:0;83998:19;;;;:10;:19;;;;;:31;84020:9;83998:19;:31;:::i;74877:248::-;75021:9;75016:102;75036:15;;;75016:102;;;75073:33;75078:4;;75083:1;75078:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;75087:6;;75094:1;75087:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;75098:7;75073:4;:33::i;:::-;75053:3;;;;:::i;:::-;;;;75016:102;;76261:229;76364:17;76383:19;76426:15;76433:7;76426:6;:15::i;:::-;76420:21;;76460:22;76465:7;76474;76460:4;:22::i;:::-;76452:30;;76261:229;;;;;:::o;53050:97::-;53107:32;:16;53131:7;53107:23;:32::i;23671:173::-;23746:6;;;-1:-1:-1;;;;;23763:17:0;;;-1:-1:-1;;;;;;23763:17:0;;;;;;;23796:40;;23746:6;;;23763:17;23746:6;;23796:40;;23727:16;;23796:40;23716:128;23671:173;:::o;67198:114::-;67258:7;67285:19;67293:3;60227:18;;60144:109;87095:1013;-1:-1:-1;;;;;87197:16:0;;87189:47;;;;-1:-1:-1;;;87189:47:0;;29602:2:1;87189:47:0;;;29584:21:1;29641:2;29621:18;;;29614:30;-1:-1:-1;;;29660:18:1;;;29653:48;29718:18;;87189:47:0;29400:342:1;87189:47:0;87259:3;87253:17;87274:1;87253:22;87245:56;;;;-1:-1:-1;;;87245:56:0;;29949:2:1;87245:56:0;;;29931:21:1;29988:2;29968:18;;;29961:30;-1:-1:-1;;;30007:18:1;;;30000:51;30068:18;;87245:56:0;29747:345:1;87245:56:0;87318:10;87324:3;87318:5;:10::i;:::-;:18;;87332:4;87318:18;87310:44;;;;-1:-1:-1;;;87310:44:0;;30299:2:1;87310:44:0;;;30281:21:1;30338:2;30318:18;;;30311:30;-1:-1:-1;;;30357:18:1;;;30350:43;30410:18;;87310:44:0;30097:337:1;87310:44:0;87377:6;87371:20;87395:1;87371:25;87363:55;;;;-1:-1:-1;;;87363:55:0;;30641:2:1;87363:55:0;;;30623:21:1;30680:2;30660:18;;;30653:30;-1:-1:-1;;;30699:18:1;;;30692:47;30756:18;;87363:55:0;30439:341:1;87363:55:0;87436:32;87461:6;87436:24;:32::i;:::-;:41;87428:79;;;;-1:-1:-1;;;87428:79:0;;30987:2:1;87428:79:0;;;30969:21:1;31026:2;31006:18;;;30999:30;-1:-1:-1;;;31045:18:1;;;31038:55;31110:18;;87428:79:0;30785:349:1;87428:79:0;87524:27;87544:6;87524:19;:27::i;:::-;:32;87516:63;;;;-1:-1:-1;;;87516:63:0;;31341:2:1;87516:63:0;;;31323:21:1;31380:2;31360:18;;;31353:30;-1:-1:-1;;;31399:18:1;;;31392:48;31457:18;;87516:63:0;31139:342:1;87516:63:0;87586:21;87610:26;87629:6;87610:18;:26::i;:::-;87586:50;;87643:18;87664:23;87683:3;87664:18;:23::i;:::-;87643:44;;87730:7;87744:4;87713:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;87696:54;;87759:15;87777:19;87788:7;87777:10;:19::i;:::-;87809:10;;87759:37;;-1:-1:-1;;;;;;87809:10:0;:24;87805:123;;87873:10;;87853:47;;-1:-1:-1;;;87853:47:0;;;;;2343:25:1;;;-1:-1:-1;;;;;87873:10:0;;;;87853:38;;2316:18:1;;87853:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;87852:48;87844:78;;;;-1:-1:-1;;;87844:78:0;;33233:2:1;87844:78:0;;;33215:21:1;33272:2;33252:18;;;33245:30;-1:-1:-1;;;33291:18:1;;;33284:47;33348:18;;87844:78:0;33031:341:1;87844:78:0;87944:16;87952:7;87944;:16::i;:::-;87943:17;87934:45;;;;-1:-1:-1;;;87934:45:0;;;;;;;:::i;:::-;87993:22;88003:2;88007:7;87993:9;:22::i;:::-;88028:30;88041:7;88050;88028:12;:30::i;:::-;88083:7;88076:24;88092:7;88076:24;;;;;;:::i;:::-;;;;;;;;87184:924;;;87095:1013;;;:::o;51887:203::-;51959:4;-1:-1:-1;;;;;51984:21:0;;51976:68;;;;-1:-1:-1;;;51976:68:0;;42410:2:1;51976:68:0;;;42392:21:1;42449:2;42429:18;;;42422:30;42488:34;42468:18;;;42461:62;-1:-1:-1;;;42539:18:1;;;42532:32;42581:19;;51976:68:0;42208:398:1;51976:68:0;-1:-1:-1;;;;;;52062:20:0;:11;:20;;;;;;;;;;;;;;;51887:203::o;91062:1035::-;-1:-1:-1;;;;;91180:16:0;;91172:25;;;;;;91226:3;91220:17;91241:1;91220:22;91212:31;;;;;;91260:29;91285:3;91260:24;:29::i;:::-;:38;91252:47;;;;;;91322:24;91342:3;91322:19;:24::i;:::-;:29;91314:38;;;;;;91373:16;91381:7;91373;:16::i;:::-;91365:25;;;;;;91399:18;91420:23;91439:3;91420:18;:23::i;:::-;91399:44;;91458:20;91498:4;91509:10;:19;91520:7;91509:19;;;;;;;;;;;91481:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;91458:71;;91538:19;91560:27;91578:7;91560:10;:27::i;:::-;91538:49;;91606:20;91614:11;91606:7;:20::i;:::-;91605:21;91596:49;;;;-1:-1:-1;;;91596:49:0;;;;;;;:::i;:::-;91658:13;91694:19;;;:10;:19;;;;;91674:40;;;;91694:19;91674:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:40::i;:::-;91658:56;;91733:5;91742:1;91733:10;91729:83;;91764:19;;;;:10;:19;;;;;:36;;91788:11;91764:23;:36::i;:::-;;91729:83;91828:19;;:24;91824:149;;91869:33;91879:2;91883:11;91896:5;91869:9;:33::i;:::-;91824:149;;;91935:26;91945:2;91949:11;91935:9;:26::i;:::-;91993:42;92006:11;92026:7;91993:12;:42::i;:::-;92060:11;92053:36;92080:7;92053:36;;;;;;:::i;:::-;;;;;;;;91167:930;;;;91062:1035;;;;:::o;36663:315::-;36820:28;36830:4;36836:2;36840:7;36820:9;:28::i;:::-;36867:48;36890:4;36896:2;36900:7;36909:5;36867:22;:48::i;:::-;36859:111;;;;-1:-1:-1;;;36859:111:0;;;;;;;:::i;92103:517::-;92183:18;92204:23;92223:3;92204:18;:23::i;:::-;92183:44;;92242:20;92282:4;92293:10;:19;92304:7;92293:19;;;;;;;;;;;92265:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;92242:71;;92322:19;92344:27;92362:7;92344:10;:27::i;:::-;92421:19;;;;:10;:19;;;;;92322:49;;-1:-1:-1;92421:39:0;;92322:49;92421:26;:39::i;:::-;-1:-1:-1;92479:23:0;;;;:10;:23;;;;;92473:37;;;;;:::i;:::-;:42;;-1:-1:-1;92469:105:0;;92539:23;;;;:10;:23;;;;;92532:30;;;:::i;:::-;92588:24;92600:11;92588;:24::i;82819:104::-;82871:13;82904:11;82897:18;;;;;:::i;75681:208::-;75824:15;75831:7;75824:6;:15::i;31393:305::-;31495:4;-1:-1:-1;;;;;;31532:40:0;;-1:-1:-1;;;31532:40:0;;:105;;-1:-1:-1;;;;;;;31589:48:0;;-1:-1:-1;;;31589:48:0;31532:105;:158;;;-1:-1:-1;;;;;;;;;;11520:40:0;;;31654:36;11411:157;76498:148;76568:13;76601:8;:28;76610:18;76620:7;76610:9;:18::i;:::-;76601:28;;;;;;;;;;;:37;76630:7;76601:37;;;;;;;;;;;76594:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76498:148;;;;:::o;74424:164::-;74491:7;74518:22;;;:13;:22;;;;;;:27;:62;;74558:22;;;;:13;:22;;;;;;74518:62;;;-1:-1:-1;74548:7:0;74424:164::o;93399:172::-;93521:45;93548:4;93554:2;93558:7;93521:26;:45::i;60607:120::-;60674:7;60701:3;:11;;60713:5;60701:18;;;;;;;;:::i;:::-;;;;;;;;;60694:25;;60607:120;;;;:::o;76654:386::-;76814:8;:28;76823:18;76833:7;76823:9;:18::i;:::-;76814:28;;;;;;;;;;;:37;76843:7;76814:37;;;;;;;;;;;76808:51;;;;;:::i;:::-;;;76863:1;76808:56;76804:119;;76902:3;76886:25;;;;;;:::i;:::-;;;;;;;;76893:7;76886:25;76907:3;76886:25;;;;;;:::i;:::-;;;;;;;;76804:119;76975:5;76935:8;:28;76944:18;76954:7;76944:9;:18::i;:::-;76935:28;;;;;;;;;;;:37;76964:7;76935:37;;;;;;;;;;;:45;;;;;;:::i;:::-;;77014:5;76996:36;;;;;;:::i;:::-;;;;;;;;77009:3;76996:36;;;;;;:::i;:::-;;;;;;;;77000:7;76996:36;77021:3;77026:5;76996:36;;;;;;;:::i;:::-;;;;;;;;76654:386;;;;:::o;69240:124::-;69300:4;69330:14;;;:5;:14;;;;;69324:28;;69300:4;;69330:14;69324:28;;;:::i;:::-;;;:32;69317:39;;69240:124;;;:::o;38612:321::-;38742:18;38748:2;38752:7;38742:5;:18::i;:::-;38793:54;38824:1;38828:2;38832:7;38841:5;38793:22;:54::i;:::-;38771:154;;;;-1:-1:-1;;;38771:154:0;;;;;;;:::i;51609:183::-;51689:18;51693:4;51699:7;51689:3;:18::i;:::-;51681:64;;;;-1:-1:-1;;;51681:64:0;;44452:2:1;51681:64:0;;;44434:21:1;44491:2;44471:18;;;44464:30;44530:34;44510:18;;;44503:62;-1:-1:-1;;;44581:18:1;;;44574:31;44622:19;;51681:64:0;44250:397:1;51681:64:0;-1:-1:-1;;;;;51756:20:0;51779:5;51756:20;;;;;;;;;;;:28;;-1:-1:-1;;51756:28:0;;;51609:183::o;66436:131::-;66503:4;66527:32;66532:3;66552:5;66527:4;:32::i;42012:799::-;42167:4;-1:-1:-1;;;;;42188:13:0;;14624:20;14672:8;42184:620;;42224:72;;-1:-1:-1;;;42224:72:0;;-1:-1:-1;;;;;42224:36:0;;;;;:72;;682:10;;42275:4;;42281:7;;42290:5;;42224:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42224:72:0;;;;;;;;-1:-1:-1;;42224:72:0;;;;;;;;;;;;:::i;:::-;;;42220:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42466:6;:13;42483:1;42466:18;42462:272;;42509:60;;-1:-1:-1;;;42509:60:0;;;;;;;:::i;42462:272::-;42684:6;42678:13;42669:6;42665:2;42661:15;42654:38;42220:529;-1:-1:-1;;;;;;42347:51:0;-1:-1:-1;;;42347:51:0;;-1:-1:-1;42340:58:0;;42184:620;-1:-1:-1;42788:4:0;42012:799;;;;;;:::o;66743:137::-;66813:4;66837:35;66845:3;66865:5;66837:7;:35::i;45828:589::-;-1:-1:-1;;;;;46034:18:0;;46030:187;;46069:40;46101:7;47244:10;:17;;47217:24;;;;:15;:24;;;;;:44;;;47272:24;;;;;;;;;;;;47140:164;46069:40;46030:187;;;46139:2;-1:-1:-1;;;;;46131:10:0;:4;-1:-1:-1;;;;;46131:10:0;;46127:90;;46158:47;46191:4;46197:7;46158:32;:47::i;:::-;-1:-1:-1;;;;;46231:16:0;;46227:183;;46264:45;46301:7;46264:36;:45::i;46227:183::-;46337:4;-1:-1:-1;;;;;46331:10:0;:2;-1:-1:-1;;;;;46331:10:0;;46327:83;;46358:40;46386:2;46390:7;46358:27;:40::i;39269:382::-;-1:-1:-1;;;;;39349:16:0;;39341:61;;;;-1:-1:-1;;;39341:61:0;;45602:2:1;39341:61:0;;;45584:21:1;;;45621:18;;;45614:30;45680:34;45660:18;;;45653:62;45732:18;;39341:61:0;45400:356:1;39341:61:0;39422:16;39430:7;39422;:16::i;:::-;39421:17;39413:58;;;;-1:-1:-1;;;39413:58:0;;45963:2:1;39413:58:0;;;45945:21:1;46002:2;45982:18;;;45975:30;46041;46021:18;;;46014:58;46089:18;;39413:58:0;45761:352:1;39413:58:0;39484:45;39513:1;39517:2;39521:7;39484:20;:45::i;:::-;-1:-1:-1;;;;;39542:13:0;;;;;;:9;:13;;;;;:18;;39559:1;;39542:13;:18;;39559:1;;39542:18;:::i;:::-;;;;-1:-1:-1;;39571:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39571:21:0;-1:-1:-1;;;;;39571:21:0;;;;;;;;39610:33;;39571:16;;;39610:33;;39571:16;;39610:33;39269:382;;:::o;57833:414::-;57896:4;60026:19;;;:12;;;:19;;;;;;57913:327;;-1:-1:-1;57956:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;58139:18;;58117:19;;;:12;;;:19;;;;;;:40;;;;58172:11;;57913:327;-1:-1:-1;58223:5:0;58216:12;;58423:1420;58489:4;58628:19;;;:12;;;:19;;;;;;58664:15;;58660:1176;;59039:21;59063:14;59076:1;59063:10;:14;:::i;:::-;59112:18;;59039:38;;-1:-1:-1;59092:17:0;;59112:22;;59133:1;;59112:22;:::i;:::-;59092:42;;59168:13;59155:9;:26;59151:405;;59202:17;59222:3;:11;;59234:9;59222:22;;;;;;;;:::i;:::-;;;;;;;;;59202:42;;59376:9;59347:3;:11;;59359:13;59347:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;59461:23;;;:12;;;:23;;;;;:36;;;59151:405;59637:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;59732:3;:12;;:19;59745:5;59732:19;;;;;;;;;;;59725:26;;;59775:4;59768:11;;;;;;;58660:1176;59819:5;59812:12;;;;;47931:988;48197:22;48247:1;48222:22;48239:4;48222:16;:22::i;:::-;:26;;;;:::i;:::-;48259:18;48280:26;;;:17;:26;;;;;;48197:51;;-1:-1:-1;48413:28:0;;;48409:328;;-1:-1:-1;;;;;48480:18:0;;48458:19;48480:18;;;:12;:18;;;;;;;;:34;;;;;;;;;48531:30;;;;;;:44;;;48648:30;;:17;:30;;;;;:43;;;48409:328;-1:-1:-1;48833:26:0;;;;:17;:26;;;;;;;;48826:33;;;-1:-1:-1;;;;;48877:18:0;;;;;:12;:18;;;;;:34;;;;;;;48870:41;47931:988::o;49214:1079::-;49492:10;:17;49467:22;;49492:21;;49512:1;;49492:21;:::i;:::-;49524:18;49545:24;;;:15;:24;;;;;;49918:10;:26;;49467:46;;-1:-1:-1;49545:24:0;;49467:46;;49918:26;;;;;;:::i;:::-;;;;;;;;;49896:48;;49982:11;49957:10;49968;49957:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;50062:28;;;:15;:28;;;;;;;:41;;;50234:24;;;;;50227:31;50269:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;49285:1008;;;49214:1079;:::o;46718:221::-;46803:14;46820:20;46837:2;46820:16;:20::i;:::-;-1:-1:-1;;;;;46851:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;46896:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;46718:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:131::-;-1:-1:-1;;;;;1816:31:1;;1806:42;;1796:70;;1862:1;1859;1852:12;1877:315;1945:6;1953;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;2061:9;2048:23;2080:31;2105:5;2080:31;:::i;:::-;2130:5;2182:2;2167:18;;;;2154:32;;-1:-1:-1;;;1877:315:1:o;2379:375::-;2450:8;2460:6;2514:3;2507:4;2499:6;2495:17;2491:27;2481:55;;2532:1;2529;2522:12;2481:55;-1:-1:-1;2555:20:1;;-1:-1:-1;;;;;2587:30:1;;2584:50;;;2630:1;2627;2620:12;2584:50;2667:4;2659:6;2655:17;2643:29;;2727:3;2720:4;2710:6;2707:1;2703:14;2695:6;2691:27;2687:38;2684:47;2681:67;;;2744:1;2741;2734:12;2681:67;2379:375;;;;;:::o;2759:525::-;2866:6;2874;2882;2935:2;2923:9;2914:7;2910:23;2906:32;2903:52;;;2951:1;2948;2941:12;2903:52;2991:9;2978:23;-1:-1:-1;;;;;3016:6:1;3013:30;3010:50;;;3056:1;3053;3046:12;3010:50;3095:78;3165:7;3156:6;3145:9;3141:22;3095:78;:::i;:::-;3192:8;;3069:104;;-1:-1:-1;3274:2:1;3259:18;;;;3246:32;;2759:525;-1:-1:-1;;;;2759:525:1:o;3289:592::-;3341:3;3372;3404:5;3398:12;3431:6;3426:3;3419:19;3457:4;3486:2;3481:3;3477:12;3470:19;;3542:2;3532:6;3529:1;3525:14;3518:5;3514:26;3510:35;3579:2;3572:5;3568:14;3600:1;3610:245;3624:6;3621:1;3618:13;3610:245;;;3711:2;3707:7;3699:5;3693:4;3689:16;3685:30;3680:3;3673:43;3737:38;3770:4;3761:6;3755:13;3737:38;:::i;:::-;3833:12;;;;3729:46;-1:-1:-1;3798:15:1;;;;3646:1;3639:9;3610:245;;;-1:-1:-1;3871:4:1;;3289:592;-1:-1:-1;;;;;;;3289:592:1:o;3886:280::-;4085:2;4074:9;4067:21;4048:4;4105:55;4156:2;4145:9;4141:18;4133:6;4105:55;:::i;4171:348::-;4223:8;4233:6;4287:3;4280:4;4272:6;4268:17;4264:27;4254:55;;4305:1;4302;4295:12;4254:55;-1:-1:-1;4328:20:1;;-1:-1:-1;;;;;4360:30:1;;4357:50;;;4403:1;4400;4393:12;4357:50;4440:4;4432:6;4428:17;4416:29;;4492:3;4485:4;4476:6;4468;4464:19;4460:30;4457:39;4454:59;;;4509:1;4506;4499:12;4524:479;4604:6;4612;4620;4673:2;4661:9;4652:7;4648:23;4644:32;4641:52;;;4689:1;4686;4679:12;4641:52;4729:9;4716:23;-1:-1:-1;;;;;4754:6:1;4751:30;4748:50;;;4794:1;4791;4784:12;4748:50;4833:59;4884:7;4875:6;4864:9;4860:22;4833:59;:::i;5008:457::-;5106:6;5114;5167:2;5155:9;5146:7;5142:23;5138:32;5135:52;;;5183:1;5180;5173:12;5135:52;5223:9;5210:23;-1:-1:-1;;;;;5248:6:1;5245:30;5242:50;;;5288:1;5285;5278:12;5242:50;5327:78;5397:7;5388:6;5377:9;5373:22;5327:78;:::i;:::-;5424:8;;5301:104;;-1:-1:-1;5008:457:1;-1:-1:-1;;;;5008:457:1:o;5470:456::-;5547:6;5555;5563;5616:2;5604:9;5595:7;5591:23;5587:32;5584:52;;;5632:1;5629;5622:12;5584:52;5671:9;5658:23;5690:31;5715:5;5690:31;:::i;:::-;5740:5;-1:-1:-1;5797:2:1;5782:18;;5769:32;5810:33;5769:32;5810:33;:::i;:::-;5470:456;;5862:7;;-1:-1:-1;;;5916:2:1;5901:18;;;;5888:32;;5470:456::o;5931:869::-;6074:6;6082;6090;6098;6106;6159:2;6147:9;6138:7;6134:23;6130:32;6127:52;;;6175:1;6172;6165:12;6127:52;6215:9;6202:23;-1:-1:-1;;;;;6285:2:1;6277:6;6274:14;6271:34;;;6301:1;6298;6291:12;6271:34;6340:78;6410:7;6401:6;6390:9;6386:22;6340:78;:::i;:::-;6437:8;;-1:-1:-1;6314:104:1;-1:-1:-1;6525:2:1;6510:18;;6497:32;;-1:-1:-1;6541:16:1;;;6538:36;;;6570:1;6567;6560:12;6538:36;;6609:80;6681:7;6670:8;6659:9;6655:24;6609:80;:::i;:::-;5931:869;;;;-1:-1:-1;6708:8:1;6790:2;6775:18;6762:32;;5931:869;-1:-1:-1;;;;5931:869:1:o;6805:248::-;6873:6;6881;6934:2;6922:9;6913:7;6909:23;6905:32;6902:52;;;6950:1;6947;6940:12;6902:52;-1:-1:-1;;6973:23:1;;;7043:2;7028:18;;;7015:32;;-1:-1:-1;6805:248:1:o;7058:247::-;7117:6;7170:2;7158:9;7149:7;7145:23;7141:32;7138:52;;;7186:1;7183;7176:12;7138:52;7225:9;7212:23;7244:31;7269:5;7244:31;:::i;7310:127::-;7371:10;7366:3;7362:20;7359:1;7352:31;7402:4;7399:1;7392:15;7426:4;7423:1;7416:15;7442:275;7513:2;7507:9;7578:2;7559:13;;-1:-1:-1;;7555:27:1;7543:40;;-1:-1:-1;;;;;7598:34:1;;7634:22;;;7595:62;7592:88;;;7660:18;;:::i;:::-;7696:2;7689:22;7442:275;;-1:-1:-1;7442:275:1:o;7722:530::-;7764:5;7817:3;7810:4;7802:6;7798:17;7794:27;7784:55;;7835:1;7832;7825:12;7784:55;7871:6;7858:20;-1:-1:-1;;;;;7893:2:1;7890:26;7887:52;;;7919:18;;:::i;:::-;7963:55;8006:2;7987:13;;-1:-1:-1;;7983:27:1;8012:4;7979:38;7963:55;:::i;:::-;8043:2;8034:7;8027:19;8089:3;8082:4;8077:2;8069:6;8065:15;8061:26;8058:35;8055:55;;;8106:1;8103;8096:12;8055:55;8171:2;8164:4;8156:6;8152:17;8145:4;8136:7;8132:18;8119:55;8219:1;8194:16;;;8212:4;8190:27;8183:38;;;;8198:7;7722:530;-1:-1:-1;;;7722:530:1:o;8257:320::-;8325:6;8378:2;8366:9;8357:7;8353:23;8349:32;8346:52;;;8394:1;8391;8384:12;8346:52;8434:9;8421:23;-1:-1:-1;;;;;8459:6:1;8456:30;8453:50;;;8499:1;8496;8489:12;8453:50;8522:49;8563:7;8554:6;8543:9;8539:22;8522:49;:::i;8582:789::-;8683:6;8691;8699;8707;8715;8768:2;8756:9;8747:7;8743:23;8739:32;8736:52;;;8784:1;8781;8774:12;8736:52;8824:9;8811:23;-1:-1:-1;;;;;8894:2:1;8886:6;8883:14;8880:34;;;8910:1;8907;8900:12;8880:34;8949:59;9000:7;8991:6;8980:9;8976:22;8949:59;:::i;:::-;9027:8;;-1:-1:-1;8923:85:1;-1:-1:-1;9115:2:1;9100:18;;9087:32;;-1:-1:-1;9131:16:1;;;9128:36;;;9160:1;9157;9150:12;9128:36;;9199:61;9252:7;9241:8;9230:9;9226:24;9199:61;:::i;9376:547::-;9465:6;9473;9481;9489;9542:2;9530:9;9521:7;9517:23;9513:32;9510:52;;;9558:1;9555;9548:12;9510:52;9594:9;9581:23;9571:33;;9655:2;9644:9;9640:18;9627:32;-1:-1:-1;;;;;9674:6:1;9671:30;9668:50;;;9714:1;9711;9704:12;9668:50;9753:59;9804:7;9795:6;9784:9;9780:22;9753:59;:::i;:::-;9376:547;;9831:8;;-1:-1:-1;9727:85:1;;9913:2;9898:18;9885:32;;9376:547;-1:-1:-1;;;;9376:547:1:o;10254:411::-;10325:6;10333;10386:2;10374:9;10365:7;10361:23;10357:32;10354:52;;;10402:1;10399;10392:12;10354:52;10442:9;10429:23;-1:-1:-1;;;;;10467:6:1;10464:30;10461:50;;;10507:1;10504;10497:12;10461:50;10546:59;10597:7;10588:6;10577:9;10573:22;10546:59;:::i;10670:676::-;10767:6;10775;10783;10836:2;10824:9;10815:7;10811:23;10807:32;10804:52;;;10852:1;10849;10842:12;10804:52;10891:9;10878:23;10910:31;10935:5;10910:31;:::i;:::-;10960:5;-1:-1:-1;11016:2:1;11001:18;;10988:32;-1:-1:-1;;;;;11069:14:1;;;11066:34;;;11096:1;11093;11086:12;11066:34;11119:49;11160:7;11151:6;11140:9;11136:22;11119:49;:::i;:::-;11109:59;;11221:2;11210:9;11206:18;11193:32;11177:48;;11250:2;11240:8;11237:16;11234:36;;;11266:1;11263;11256:12;11234:36;;11289:51;11332:7;11321:8;11310:9;11306:24;11289:51;:::i;:::-;11279:61;;;10670:676;;;;;:::o;12237:383::-;12434:2;12423:9;12416:21;12397:4;12460:45;12501:2;12490:9;12486:18;12478:6;12460:45;:::i;:::-;12553:9;12545:6;12541:22;12536:2;12525:9;12521:18;12514:50;12581:33;12607:6;12599;12581:33;:::i;:::-;12573:41;12237:383;-1:-1:-1;;;;;12237:383:1:o;12625:1688::-;12774:6;12782;12790;12798;12851:2;12839:9;12830:7;12826:23;12822:32;12819:52;;;12867:1;12864;12857:12;12819:52;12907:9;12894:23;-1:-1:-1;;;;;12977:2:1;12969:6;12966:14;12963:34;;;12993:1;12990;12983:12;12963:34;13032:78;13102:7;13093:6;13082:9;13078:22;13032:78;:::i;:::-;13129:8;;-1:-1:-1;13006:104:1;-1:-1:-1;13183:2:1;;-1:-1:-1;13223:18:1;;;13210:32;13254:16;;;13251:36;;;13283:1;13280;13273:12;13251:36;13306:24;;13361:4;13353:13;;13349:27;-1:-1:-1;13339:55:1;;13390:1;13387;13380:12;13339:55;13426:2;13413:16;13448:2;13444;13441:10;13438:36;;;13454:18;;:::i;:::-;13500:2;13497:1;13493:10;13523:28;13547:2;13543;13539:11;13523:28;:::i;:::-;13585:15;;;13655:11;;;13651:20;;;13616:12;;;;13683:19;;;13680:39;;;13715:1;13712;13705:12;13680:39;13747:2;13743;13739:11;13728:22;;13759:352;13775:6;13770:3;13767:15;13759:352;;;13861:3;13848:17;13897:2;13884:11;13881:19;13878:109;;;13941:1;13970:2;13966;13959:14;13878:109;14012:56;14060:7;14055:2;14041:11;14037:2;14033:20;14029:29;14012:56;:::i;:::-;14000:69;;-1:-1:-1;13792:12:1;;;;14089;;;;13759:352;;;14130:5;-1:-1:-1;;;;14188:2:1;14173:18;;14160:32;;-1:-1:-1;;14204:16:1;;;14201:36;;;14233:1;14230;14223:12;14201:36;;14256:51;14299:7;14288:8;14277:9;14273:24;14256:51;:::i;:::-;14246:61;;;12625:1688;;;;;;;:::o;14318:524::-;14405:6;14413;14421;14474:2;14462:9;14453:7;14449:23;14445:32;14442:52;;;14490:1;14487;14480:12;14442:52;14529:9;14516:23;14548:31;14573:5;14548:31;:::i;:::-;14598:5;-1:-1:-1;14650:2:1;14635:18;;14622:32;;-1:-1:-1;14705:2:1;14690:18;;14677:32;-1:-1:-1;;;;;14721:30:1;;14718:50;;;14764:1;14761;14754:12;14718:50;14787:49;14828:7;14819:6;14808:9;14804:22;14787:49;:::i;14847:118::-;14933:5;14926:13;14919:21;14912:5;14909:32;14899:60;;14955:1;14952;14945:12;14970:382;15035:6;15043;15096:2;15084:9;15075:7;15071:23;15067:32;15064:52;;;15112:1;15109;15102:12;15064:52;15151:9;15138:23;15170:31;15195:5;15170:31;:::i;:::-;15220:5;-1:-1:-1;15277:2:1;15262:18;;15249:32;15290:30;15249:32;15290:30;:::i;:::-;15339:7;15329:17;;;14970:382;;;;;:::o;15875:503::-;16172:2;16161:9;16154:21;16135:4;16198:55;16249:2;16238:9;16234:18;16226:6;16198:55;:::i;:::-;16301:9;16293:6;16289:22;16284:2;16273:9;16269:18;16262:50;16329:43;16365:6;16357;16329:43;:::i;16383:665::-;16478:6;16486;16494;16502;16555:3;16543:9;16534:7;16530:23;16526:33;16523:53;;;16572:1;16569;16562:12;16523:53;16611:9;16598:23;16630:31;16655:5;16630:31;:::i;:::-;16680:5;-1:-1:-1;16737:2:1;16722:18;;16709:32;16750:33;16709:32;16750:33;:::i;:::-;16802:7;-1:-1:-1;16856:2:1;16841:18;;16828:32;;-1:-1:-1;16911:2:1;16896:18;;16883:32;-1:-1:-1;;;;;16927:30:1;;16924:50;;;16970:1;16967;16960:12;16924:50;16993:49;17034:7;17025:6;17014:9;17010:22;16993:49;:::i;17053:825::-;17341:2;17353:21;;;17423:13;;17326:18;;;17445:22;;;17293:4;;17520;;17498:2;17483:18;;;17547:15;;;17293:4;17590:169;17604:6;17601:1;17598:13;17590:169;;;17665:13;;17653:26;;17699:12;;;;17734:15;;;;17626:1;17619:9;17590:169;;;17594:3;;;17804:9;17799:3;17795:19;17790:2;17779:9;17775:18;17768:47;17832:40;17868:3;17860:6;17832:40;:::i;:::-;17824:48;17053:825;-1:-1:-1;;;;;;17053:825:1:o;18106:389::-;18184:6;18192;18245:2;18233:9;18224:7;18220:23;18216:32;18213:52;;;18261:1;18258;18251:12;18213:52;18297:9;18284:23;18274:33;;18358:2;18347:9;18343:18;18330:32;-1:-1:-1;;;;;18377:6:1;18374:30;18371:50;;;18417:1;18414;18407:12;18371:50;18440:49;18481:7;18472:6;18461:9;18457:22;18440:49;:::i;:::-;18430:59;;;18106:389;;;;;:::o;18500:388::-;18568:6;18576;18629:2;18617:9;18608:7;18604:23;18600:32;18597:52;;;18645:1;18642;18635:12;18597:52;18684:9;18671:23;18703:31;18728:5;18703:31;:::i;:::-;18753:5;-1:-1:-1;18810:2:1;18795:18;;18782:32;18823:33;18782:32;18823:33;:::i;18893:385::-;18979:6;18987;18995;19003;19056:3;19044:9;19035:7;19031:23;19027:33;19024:53;;;19073:1;19070;19063:12;19024:53;-1:-1:-1;;19096:23:1;;;19166:2;19151:18;;19138:32;;-1:-1:-1;19217:2:1;19202:18;;19189:32;;19268:2;19253:18;19240:32;;-1:-1:-1;18893:385:1;-1:-1:-1;18893:385:1:o;19733:380::-;19812:1;19808:12;;;;19855;;;19876:61;;19930:4;19922:6;19918:17;19908:27;;19876:61;19983:2;19975:6;19972:14;19952:18;19949:38;19946:161;;20029:10;20024:3;20020:20;20017:1;20010:31;20064:4;20061:1;20054:15;20092:4;20089:1;20082:15;19946:161;;19733:380;;;:::o;21358:127::-;21419:10;21414:3;21410:20;21407:1;21400:31;21450:4;21447:1;21440:15;21474:4;21471:1;21464:15;21490:522;21568:4;21574:6;21634:11;21621:25;21728:2;21724:7;21713:8;21697:14;21693:29;21689:43;21669:18;21665:68;21655:96;;21747:1;21744;21737:12;21655:96;21774:33;;21826:20;;;-1:-1:-1;;;;;;21858:30:1;;21855:50;;;21901:1;21898;21891:12;21855:50;21934:4;21922:17;;-1:-1:-1;21965:14:1;21961:27;;;21951:38;;21948:58;;;22002:1;21999;21992:12;22017:127;22078:10;22073:3;22069:20;22066:1;22059:31;22109:4;22106:1;22099:15;22133:4;22130:1;22123:15;22149:135;22188:3;22209:17;;;22206:43;;22229:18;;:::i;:::-;-1:-1:-1;22276:1:1;22265:13;;22149:135::o;22289:356::-;22491:2;22473:21;;;22510:18;;;22503:30;22569:34;22564:2;22549:18;;22542:62;22636:2;22621:18;;22289:356::o;22650:406::-;22852:2;22834:21;;;22891:2;22871:18;;;22864:30;22930:34;22925:2;22910:18;;22903:62;-1:-1:-1;;;22996:2:1;22981:18;;22974:40;23046:3;23031:19;;22650:406::o;23061:271::-;23244:6;23236;23231:3;23218:33;23200:3;23270:16;;23295:13;;;23270:16;23061:271;-1:-1:-1;23061:271:1:o;23463:545::-;23565:2;23560:3;23557:11;23554:448;;;23601:1;23626:5;23622:2;23615:17;23671:4;23667:2;23657:19;23741:2;23729:10;23725:19;23722:1;23718:27;23712:4;23708:38;23777:4;23765:10;23762:20;23759:47;;;-1:-1:-1;23800:4:1;23759:47;23855:2;23850:3;23846:12;23843:1;23839:20;23833:4;23829:31;23819:41;;23910:82;23928:2;23921:5;23918:13;23910:82;;;23973:17;;;23954:1;23943:13;23910:82;;24184:1206;-1:-1:-1;;;;;24303:3:1;24300:27;24297:53;;;24330:18;;:::i;:::-;24359:94;24449:3;24409:38;24441:4;24435:11;24409:38;:::i;:::-;24403:4;24359:94;:::i;:::-;24479:1;24504:2;24499:3;24496:11;24521:1;24516:616;;;;25176:1;25193:3;25190:93;;;-1:-1:-1;25249:19:1;;;25236:33;25190:93;-1:-1:-1;;24141:1:1;24137:11;;;24133:24;24129:29;24119:40;24165:1;24161:11;;;24116:57;25296:78;;24489:895;;24516:616;23410:1;23403:14;;;23447:4;23434:18;;-1:-1:-1;;24552:17:1;;;24653:9;24675:229;24689:7;24686:1;24683:14;24675:229;;;24778:19;;;24765:33;24750:49;;24885:4;24870:20;;;;24838:1;24826:14;;;;24705:12;24675:229;;;24679:3;24932;24923:7;24920:16;24917:159;;;25056:1;25052:6;25046:3;25040;25037:1;25033:11;25029:21;25025:34;25021:39;25008:9;25003:3;24999:19;24986:33;24982:79;24974:6;24967:95;24917:159;;;25119:1;25113:3;25110:1;25106:11;25102:19;25096:4;25089:33;24489:895;;24184:1206;;;:::o;26166:403::-;26368:2;26350:21;;;26407:2;26387:18;;;26380:30;26446:34;26441:2;26426:18;;26419:62;-1:-1:-1;;;26512:2:1;26497:18;;26490:37;26559:3;26544:19;;26166:403::o;26981:289::-;27112:3;27150:6;27144:13;27166:66;27225:6;27220:3;27213:4;27205:6;27201:17;27166:66;:::i;:::-;27248:16;;;;;26981:289;-1:-1:-1;;26981:289:1:o;27688:1352::-;27814:3;27808:10;-1:-1:-1;;;;;27833:6:1;27830:30;27827:56;;;27863:18;;:::i;:::-;27892:97;27982:6;27942:38;27974:4;27968:11;27942:38;:::i;:::-;27936:4;27892:97;:::i;:::-;28044:4;;28108:2;28097:14;;28125:1;28120:663;;;;28827:1;28844:6;28841:89;;;-1:-1:-1;28896:19:1;;;28890:26;28841:89;-1:-1:-1;;24141:1:1;24137:11;;;24133:24;24129:29;24119:40;24165:1;24161:11;;;24116:57;28943:81;;28090:944;;28120:663;23410:1;23403:14;;;23447:4;23434:18;;-1:-1:-1;;28156:20:1;;;28274:236;28288:7;28285:1;28282:14;28274:236;;;28377:19;;;28371:26;28356:42;;28469:27;;;;28437:1;28425:14;;;;28304:19;;28274:236;;;28278:3;28538:6;28529:7;28526:19;28523:201;;;28599:19;;;28593:26;-1:-1:-1;;28682:1:1;28678:14;;;28694:3;28674:24;28670:37;28666:42;28651:58;28636:74;;28523:201;-1:-1:-1;;;;;28770:1:1;28754:14;;;28750:22;28737:36;;-1:-1:-1;27688:1352:1:o;32136:640::-;32416:3;32454:6;32448:13;32470:66;32529:6;32524:3;32517:4;32509:6;32505:17;32470:66;:::i;:::-;-1:-1:-1;;;32558:16:1;;;32583:18;;;32626:13;;32648:78;32626:13;32713:1;32702:13;;32695:4;32683:17;;32648:78;:::i;:::-;32746:20;32768:1;32742:28;;32136:640;-1:-1:-1;;;;32136:640:1:o;32781:245::-;32848:6;32901:2;32889:9;32880:7;32876:23;32872:32;32869:52;;;32917:1;32914;32907:12;32869:52;32949:9;32943:16;32968:28;32990:5;32968:28;:::i;33377:338::-;33579:2;33561:21;;;33618:2;33598:18;;;33591:30;-1:-1:-1;;;33652:2:1;33637:18;;33630:44;33706:2;33691:18;;33377:338::o;34128:411::-;34330:2;34312:21;;;34369:2;34349:18;;;34342:30;34408:34;34403:2;34388:18;;34381:62;-1:-1:-1;;;34474:2:1;34459:18;;34452:45;34529:3;34514:19;;34128:411::o;37242:496::-;37421:3;37459:6;37453:13;37475:66;37534:6;37529:3;37522:4;37514:6;37510:17;37475:66;:::i;:::-;37604:13;;37563:16;;;;37626:70;37604:13;37563:16;37673:4;37661:17;;37626:70;:::i;:::-;37712:20;;37242:496;-1:-1:-1;;;;37242:496:1:o;37743:385::-;37902:3;37940:6;37934:13;37956:66;38015:6;38010:3;38003:4;37995:6;37991:17;37956:66;:::i;:::-;38044:16;;;;38069:21;;;-1:-1:-1;38117:4:1;38106:16;;37743:385;-1:-1:-1;37743:385:1:o;38133:251::-;38203:6;38256:2;38244:9;38235:7;38231:23;38227:32;38224:52;;;38272:1;38269;38262:12;38224:52;38304:9;38298:16;38323:31;38348:5;38323:31;:::i;39156:168::-;39196:7;39262:1;39258;39254:6;39250:14;39247:1;39244:21;39239:1;39232:9;39225:17;39221:45;39218:71;;;39269:18;;:::i;:::-;-1:-1:-1;39309:9:1;;39156:168::o;40744:128::-;40811:9;;;40832:11;;;40829:37;;;40846:18;;:::i;40877:125::-;40942:9;;;40963:10;;;40960:36;;;40976:18;;:::i;41642:148::-;41730:4;41709:12;;;41723;;;41705:31;;41748:13;;41745:39;;;41764:18;;:::i;42611:1215::-;42888:3;42926:6;42920:13;42952:4;42965:64;43022:6;43017:3;43012:2;43004:6;43000:15;42965:64;:::i;:::-;43060:6;43055:3;43051:16;43038:29;;-1:-1:-1;;;43083:5:1;43076:18;43113:1;43134;43167:6;43161:13;43199:36;43225:9;43199:36;:::i;:::-;43251:18;;;43278:159;;;;43451:1;43446:355;;;;43244:557;;43278:159;-1:-1:-1;;43322:24:1;;43306:14;;;43299:48;43403:16;;43396:24;43382:39;;43371:51;;43367:60;;;-1:-1:-1;43278:159:1;;43446:355;43477:6;43474:1;43467:17;43525:2;43522:1;43512:16;43550:1;43564:178;43578:8;43575:1;43572:15;43564:178;;;43669:14;;43649:13;;;43645:22;;43638:46;43712:16;;;;43595:10;;43564:178;;;43568:3;;43788:2;43777:8;43770:5;43766:20;43762:29;43755:36;;43244:557;-1:-1:-1;43817:3:1;;42611:1215;-1:-1:-1;;;;;;;;;42611:1215:1:o;43831:414::-;44033:2;44015:21;;;44072:2;44052:18;;;44045:30;44111:34;44106:2;44091:18;;44084:62;-1:-1:-1;;;44177:2:1;44162:18;;44155:48;44235:3;44220:19;;43831:414::o;44652:489::-;-1:-1:-1;;;;;44921:15:1;;;44903:34;;44973:15;;44968:2;44953:18;;44946:43;45020:2;45005:18;;44998:34;;;45068:3;45063:2;45048:18;;45041:31;;;44846:4;;45089:46;;45115:19;;45107:6;45089:46;:::i;45146:249::-;45215:6;45268:2;45256:9;45247:7;45243:23;45239:32;45236:52;;;45284:1;45281;45274:12;45236:52;45316:9;45310:16;45335:30;45359:5;45335:30;:::i;46118:127::-;46179:10;46174:3;46170:20;46167:1;46160:31;46210:4;46207:1;46200:15;46234:4;46231:1;46224:15
Swarm Source
ipfs://0a72935c5446d923cf064ce1bf5a9ddfe653ec93bb3255f36c947b8ac7b564f9
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.