Source Code
Overview
MATIC Balance
0 MATIC
More Info
ContractCreator:
TokenTracker
Multichain Info
N/A
Latest 25 from a total of 31 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Mint | 26969186 | 638 days ago | IN | 0 MATIC | 0.0006692 | ||||
Mint | 26969153 | 638 days ago | IN | 0 MATIC | 0.0006692 | ||||
Mint | 26969025 | 638 days ago | IN | 0 MATIC | 0.0006692 | ||||
Mint | 26968742 | 638 days ago | IN | 0 MATIC | 0.00806051 | ||||
Mint | 26967972 | 638 days ago | IN | 0 MATIC | 0.01087355 | ||||
Mint | 26967624 | 638 days ago | IN | 0 MATIC | 0.0006692 | ||||
Mint | 26967379 | 638 days ago | IN | 0 MATIC | 0.0006692 | ||||
Mint | 26967368 | 638 days ago | IN | 0 MATIC | 0.0006692 | ||||
Mint | 26967088 | 638 days ago | IN | 0 MATIC | 0.00067943 | ||||
Mint | 26967075 | 638 days ago | IN | 0 MATIC | 0.00066974 | ||||
Mint | 26966966 | 638 days ago | IN | 0 MATIC | 0.00058419 | ||||
Mint | 26954148 | 639 days ago | IN | 0 MATIC | 0.0006692 | ||||
Mint | 26954122 | 639 days ago | IN | 0 MATIC | 0.0006692 | ||||
Mint | 26954114 | 639 days ago | IN | 0 MATIC | 0.0006692 | ||||
Mint | 26954038 | 639 days ago | IN | 0 MATIC | 0.00918142 | ||||
Mint | 26940836 | 640 days ago | IN | 0.00018581 MATIC | 0.000644 | ||||
Mint | 26887378 | 643 days ago | IN | 0.00016705 MATIC | 0.000644 | ||||
Mint | 26887370 | 643 days ago | IN | 0.00016705 MATIC | 0.000644 | ||||
Mint | 26887362 | 643 days ago | IN | 0.00016705 MATIC | 0.00068675 | ||||
Admin Update Bud... | 26886454 | 644 days ago | IN | 0 MATIC | 0.00011853 | ||||
Mint | 26886359 | 644 days ago | IN | 0.00017 MATIC | 0.0007295 | ||||
Admin Update Dev... | 26885839 | 644 days ago | IN | 0 MATIC | 0.00140907 | ||||
Admin Update Bas... | 26885838 | 644 days ago | IN | 0 MATIC | 0.00351111 | ||||
Admin Update Fee... | 26885838 | 644 days ago | IN | 0 MATIC | 0.00140814 | ||||
Admin Update ERC... | 26885835 | 644 days ago | IN | 0 MATIC | 0.00143859 |
Loading...
Loading
Contract Name:
DropsCollection
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at mumbai.polygonscan.com on 2022-06-24 */ /** *Submitted for verification at polygonscan.com on 2022-05-12 */ /** *Submitted for verification at polygonscan.com on 2022-04-20 */ // SPDX-License-Identifier: UNLICENSED // File: contracts/Collection.sol // Sources flattened with hardhat v2.4.1 https://hardhat.org // File @openzeppelin/contracts-upgradeable/introspection/[email protected] pragma solidity ^0.7.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 IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the name of token. */ function name() external view returns (string memory); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } /** * @dev Interface of the Price conversion contract */ interface ConversionInt { function convertMintFee(address paymentToken, uint256 mintFee) external view returns (uint256); function convertUpdateFee(address paymentToken, uint256 updateFee) external view returns (uint256); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity ^0.7.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev 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-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}( data ); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts-upgradeable/proxy/[email protected] // solhint-disable-next-line compiler-version pragma solidity >=0.4.24 <0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require( _initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized" ); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } } // File @openzeppelin/contracts-upgradeable/introspection/[email protected] pragma solidity ^0.7.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; function __ERC165_init() internal initializer { __ERC165_init_unchained(); } function __ERC165_init_unchained() internal initializer { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] pragma solidity ^0.7.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] pragma solidity ^0.7.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] pragma solidity ^0.7.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721EnumerableUpgradeable is IERC721Upgradeable { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] pragma solidity ^0.7.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts-upgradeable/math/[email protected] pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer {} function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.7.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 ContextUpgradeable { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function ownable_init() internal initializer { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity ^0.7.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require( set._values.length > index, "EnumerableSet: index out of bounds" ); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity ^0.7.0; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMapUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping(bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set( Map storage map, bytes32 key, bytes32 value ) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({_key: key, _value: value})); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require( map._entries.length > index, "EnumerableMap: index out of bounds" ); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get( Map storage map, bytes32 key, string memory errorMessage ) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set( UintToAddressMap storage map, uint256 key, address value ) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( UintToAddressMap storage map, uint256 key, string memory errorMessage ) internal view returns (address) { return address( uint160(uint256(_get(map._inner, bytes32(key), errorMessage))) ); } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity ^0.7.0; /** * @dev String operations. */ library StringsUpgradeable { /** * @dev Converts a `uint256` to its ASCII `string` representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + (temp % 10))); temp /= 10; } return string(buffer); } } // File contracts/mixins/ERC721Upgradeable.sol // solhint-disable /** * Copied from the OpenZeppelin repository in order to make `_tokenURIs` internal instead of private. */ pragma solidity ^0.7.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable, IERC721EnumerableUpgradeable { using SafeMathUpgradeable for uint256; using AddressUpgradeable for address; using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; using EnumerableMapUpgradeable for EnumerableMapUpgradeable.UintToAddressMap; using StringsUpgradeable for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping(address => EnumerableSetUpgradeable.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMapUpgradeable.UintToAddressMap private _tokenOwners; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; mapping(address => bool) public whiteListedAddress; mapping(uint256 => bool) public status; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping(uint256 => string) internal _tokenURIs; // Token totalSupply uint256 internal _supply; // Base URI string private _baseURI; //StartDate uint256 internal _startDate; //EndDate uint256 internal _endDate; //WhiteList bool public whiteList; // Price Conversion address public priceConversion; //Buddy Address address public buddyAddress; // Deviation Percentage uint256 public deviationPercentage; // Collection array string[9] internal _collectionDetails; // Collection attributes string[] public collectionAttributes; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; event WhiteList(address whiteListedAddress, bool _status); event BuddyAddressUpdated(address indexed buddyContractAddress); event Locked(uint256 tokenId, bool status); event Released(uint256 tokenId, bool status); modifier onlyBuddyContract() { require(msg.sender == buddyAddress,"NFT721Mint: NOT_BUDDY_ADDRESS"); _; } /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function __ERC721_init( string memory name_, string memory symbol_, uint256 supply_, uint256 startDate_, uint256 endDate_, bool whiteList_, address priceConversion_, string[] memory attributes_, string[9] memory collectionDetails_ ) internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721_init_unchained(name_, symbol_); _updateSupply(supply_); _setTime(startDate_, endDate_); whiteList = whiteList_; priceConversion = priceConversion_; _collectionDetails = collectionDetails_; collectionAttributes = attributes_; } function _updateSupply(uint256 supply_) internal { _supply = supply_; } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } function _setTime(uint256 startDate_, uint256 endDate_) internal { _startDate = startDate_; _endDate = endDate_; } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _tokenOwners.get( tokenId, "ERC721: owner query for nonexistent token" ); } /** * @dev See {IERC721Metadata-name}. */ function name() public view override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view override returns (string memory) { return _symbol; } /** * Returns startDate of minting process */ function startDate() public view returns (uint256) { return _startDate; } /** * Returns endDate of minting process */ function endDate() public view returns (uint256) { return _endDate; } /** * Returns all collection details */ function getCollectionDetails() public view returns ( string memory gender, string memory description, string memory image, string memory category, string memory theme, string memory grade, string memory colType, string memory isWardrobeEnabled, string memory wardrobeType ) { return ( _collectionDetails[0], _collectionDetails[1], _collectionDetails[2], _collectionDetails[3], _collectionDetails[4], _collectionDetails[5], _collectionDetails[6], _collectionDetails[7], _collectionDetails[8] ); } /** * @dev See {IERC721Metadata-tokenURI}. */ 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. 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.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds if (_supply == 0) return _tokenOwners.length(); return _supply; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = 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 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 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" ); require(status[tokenId]==false,"ERC721: Token cannot be transferred"); _transfer(from, to, tokenId); } function lock(uint256 tokenId) external onlyBuddyContract { require(_exists(tokenId),"ERC721: operator query for nonexistent token"); require(status[tokenId] == false, "ERC721: Token locked already"); status[tokenId] = true; emit Locked(tokenId,true); } function release(uint256 tokenId) external onlyBuddyContract { require(_exists(tokenId),"ERC721: operator query for nonexistent token"); require(status[tokenId] == true, "ERC721: Token unlocked already"); status[tokenId] = false; emit Released(tokenId,false); } /** * @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" ); require(status[tokenId]==false,"ERC721: Token cannot be transferred"); _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 returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); //Supply has to be incremented 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 = ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(tokenId); //decrement supply 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( 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); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require( _exists(tokenId), "ERC721Metadata: URI set of nonexistent token" ); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (!to.isContract()) { return true; } bytes memory returndata = to.functionCall( abi.encodeWithSelector( IERC721ReceiverUpgradeable(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer" ); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } function _approve(address to, uint256 tokenId) private { _tokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); } /** * @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 {} uint256[41] private __gap; } // File contracts/roles/TreasuryNode.sol pragma solidity ^0.7.0; /** * @notice A mixin that stores a reference to the Drops treasury contract. */ abstract contract TreasuryNode is Initializable { using AddressUpgradeable for address payable; address payable private treasury; /** * @dev Called once after the initial deployment to set the Drops treasury address. */ function _initializeTreasuryNode(address payable _treasury) internal initializer { require( _treasury.isContract(), "TreasuryNode: Address is not a contract" ); treasury = _treasury; } /** * @notice Returns the address of the Drops treasury. */ function getDropsTreasury() public view returns (address payable) { return treasury; } // `______gap` is added to each mixin to allow adding new data slots or additional mixins in an upgrade-safe way. uint256[2000] private __gap; } // File contracts/mixins/NFT721Creator.sol pragma solidity ^0.7.0; /** * @notice Allows each token to be associated with a creator. */ abstract contract NFT721Creator is Initializable, ERC721Upgradeable { mapping(uint256 => address payable) private tokenIdToCreator; /** * @dev Stores an optional alternate address to receive creator revenue and royalty payments. */ mapping(uint256 => address payable) private tokenIdToCreatorPaymentAddress; event TokenCreatorUpdated( address indexed fromCreator, address indexed toCreator, uint256 indexed tokenId ); /* * bytes4(keccak256('tokenCreator(uint256)')) == 0x40c1a064 */ bytes4 private constant _INTERFACE_TOKEN_CREATOR = 0x40c1a064; modifier onlyCreatorAndOwner(uint256 tokenId) { require( tokenIdToCreator[tokenId] == msg.sender, "NFT721Creator: Caller is not creator" ); require( ownerOf(tokenId) == msg.sender, "NFT721Creator: Caller does not own the NFT" ); _; } /** * @dev Called once after the initial deployment to register the interface with ERC165. */ function _initializeNFT721Creator() internal initializer { _registerInterface(_INTERFACE_TOKEN_CREATOR); } /** * @notice Returns the creator's address for a given tokenId. */ function tokenCreator(uint256 tokenId) public view returns (address payable) { return tokenIdToCreator[tokenId]; } function _updateTokenCreator(uint256 tokenId, address payable creator) internal { emit TokenCreatorUpdated(tokenIdToCreator[tokenId], creator, tokenId); tokenIdToCreator[tokenId] = creator; } /** * @notice Allows the creator to burn if they currently own the NFT. */ function burn(uint256 tokenId) public onlyCreatorAndOwner(tokenId) { require(status[tokenId] == false,"NFT721Creator: Token is locked"); _burn(tokenId); } uint256[999] private ______gap; } // File contracts/mixins/NFT721Metadata.sol pragma solidity ^0.7.0; /** * @notice A mixin to extend the OpenZeppelin metadata implementation. */ abstract contract NFT721Metadata is NFT721Creator { event BaseURIUpdated(string baseURI); function _updateBaseURI(string memory _baseURI) internal { _setBaseURI(_baseURI); emit BaseURIUpdated(_baseURI); } uint256[999] private ______gap; } // File contracts/mixins/NFT721Mint.sol pragma solidity ^0.7.0; /** * @notice Allows creators to mint NFTs. */ abstract contract NFT721Mint is Initializable, ERC721Upgradeable, NFT721Creator, NFT721Metadata, TreasuryNode { using SafeMathUpgradeable for uint256; uint256 private nextTokenId; mapping(address => bool) public erc20tokenAddress; mapping(address => bool) public erc721tokenAddress; uint256 internal mintFee; event Minted(address indexed creator, uint256 indexed tokenId); event CollectionDetails( string symbol, string[] attributes, string[9] collectionDetails ); event ERC20TokenUpdated(address indexed erc20tokenAddress, bool _status); event ERC721TokenUpdated(address indexed erc721tokenAddress, bool _status); event TokenFeesUpdated(uint256 mintFee); event DeviationPercentage(uint256 percentage); event ConversionUpdated(address conversion); modifier onlyWhitelistedUsers() { require( whiteListedAddress[msg.sender] == true || whiteList == false, "NFT721Mint : USER_ADDRESS_NOT_WHITELISTED" ); _; } /** * @notice To check the totalSupply. */ function checkSupply(uint256 tokenId) internal view { if (_supply != 0) { require(tokenId <= _supply, "NFT721Mint : SUPPLY_LIMIT_REACHED"); } } /** * @notice To pay fees. */ function checkMintFees( address paymentToken, uint256 feeAmount, string memory _type ) internal { address payable treasury_ = getDropsTreasury(); if ( keccak256(abi.encodePacked((_type))) == keccak256(abi.encodePacked(("ERC20"))) ) { require( erc20tokenAddress[paymentToken] == true, "NFT721Mint : PaymentToken Not Supported" ); uint256 price = ConversionInt(priceConversion).convertMintFee( paymentToken, getMintFee() ); if (paymentToken != address(0)) { checkDeviation(feeAmount, price); IERC20(paymentToken).transferFrom( msg.sender, getDropsTreasury(), feeAmount ); } else { checkDeviation(msg.value, price); (bool success, ) = treasury_.call{value: msg.value}(""); require(success, "Transfer failed."); } } else { require( erc721tokenAddress[paymentToken] == true, "NFT721Mint : PaymentToken Not Supported" ); require( msg.sender == IERC721Upgradeable(paymentToken).ownerOf(feeAmount), "NFT721Mint : Caller is not the owner" ); IERC721Upgradeable(paymentToken).safeTransferFrom( msg.sender, getDropsTreasury(), feeAmount ); } } function checkDeviation(uint256 feeAmount, uint256 price) public view { require( feeAmount >= price.sub((price.mul(deviationPercentage)).div(100)) && feeAmount <= price.add((price.mul(deviationPercentage)).div(100)), "Amount not within deviation percentage" ); } /** * @notice To check the date. */ function checkDate() internal view { if( _endDate!=0) { require( _startDate <= block.timestamp && block.timestamp <= _endDate, "NFT721Mint : MINTING_ENDED" ); } else { require( _startDate <= block.timestamp , "NFT721Mint : MINTING_NOT_LIVE" ); } } /** * @notice Gets the tokenId of the next NFT minted. */ function getNextTokenId() public view returns (uint256) { return nextTokenId; } /** * @notice Gets the mint Fee */ function getMintFee() public view returns (uint256) { return mintFee; } /** * @dev Called once after the initial deployment to set the initial tokenId. */ function _initializeNFT721Mint() internal initializer { // Use ID 1 for the first NFT tokenId nextTokenId = 1; } /** * @notice Allows a creator to mint an NFT. */ function mint( address paymentToken, uint256 feeAmount, string memory _type ) public payable onlyWhitelistedUsers returns (uint256 tokenId) { tokenId = nextTokenId++; checkSupply(tokenId); checkDate(); checkMintFees(paymentToken, feeAmount, _type); _mint(msg.sender, tokenId); _updateTokenCreator(tokenId, msg.sender); emit Minted(msg.sender, tokenId); } uint256[1000] private ______gap; } // File contracts/FNDNFT721.sol pragma experimental ABIEncoderV2; pragma solidity ^0.7.0; /** * @title Drop NFTs implemented using the ERC-721 standard. */ contract DropsCollection is ERC165Upgradeable, ERC721Upgradeable, NFT721Creator, NFT721Metadata, TreasuryNode, NFT721Mint, Ownable { /** * @notice Called once to configure the contract after the initial deployment. * @dev This farms the initialize call out to inherited contracts as needed. */ function initialize( address payable treasury, string memory name, string memory symbol, uint256 supply, uint256 startDate, uint256 endDate, bool whitelisted, address priceConversion, string[] memory attributes, string[9] memory collectionDetails ) public initializer { Ownable.ownable_init(); NFT721Creator._initializeNFT721Creator(); NFT721Mint._initializeNFT721Mint(); TreasuryNode._initializeTreasuryNode(treasury); ERC721Upgradeable.__ERC721_init( name, symbol, supply, startDate, endDate, whitelisted, priceConversion, attributes, collectionDetails ); emit CollectionDetails(symbol, attributes, collectionDetails); } /** * @notice Allows a Drop admin to update NFT config variables. * @dev This must be called right after the initial call to `initialize`. */ function adminUpdateBaseURI(string memory baseURI) public onlyOwner { _updateBaseURI(baseURI); } /** * @notice Allows Admin to add token address. */ function adminUpdateERC20FeeToken(address _tokenAddress, bool _status) public onlyOwner { erc20tokenAddress[_tokenAddress] = _status; emit ERC20TokenUpdated(_tokenAddress, _status); } /** * @notice Allows Admin to add fees for token address. */ function adminUpdateFees(uint256 _mintFee) public onlyOwner { mintFee = _mintFee; emit TokenFeesUpdated(mintFee); } /** * @notice Allows Admin to update deviation percentage */ function adminUpdateDeviation(uint256 _deviationPercentage) public onlyOwner { deviationPercentage = _deviationPercentage; emit DeviationPercentage(_deviationPercentage); } function adminUpdateBuddy(address _buddyAddress) public onlyOwner { buddyAddress = _buddyAddress; emit BuddyAddressUpdated(_buddyAddress); } /** * @notice Allows Admin to add nft address. */ function adminUpdateERC721FeeToken(address _nftAddress, bool _status) public onlyOwner { erc721tokenAddress[_nftAddress] = _status; emit ERC721TokenUpdated(_nftAddress, _status); } /** * @notice Allows Admin to update price conversion contract */ function adminUpdateConversion(address _conversionAddress) public onlyOwner { priceConversion = _conversionAddress; emit ConversionUpdated(_conversionAddress); } /** * @notice Allows Admin to update address whitelist status. */ function updateWhitelist( address[] memory _whitelistAddresses, bool[] memory _status ) public onlyOwner { require(whiteList == true, "DropsCollection : PUBLIC_COLLECTION"); for (uint256 i = 0; i < _whitelistAddresses.length; i++) { whiteListedAddress[_whitelistAddresses[i]] = _status[i]; emit WhiteList(_whitelistAddresses[i], _status[i]); } } } pragma solidity ^0.7.0; contract LCMasterFlat is Initializable, Ownable { address payable treasury; struct collectionInfo { // the collection symbol string symbol; // the contract address address newCollection; } /** * @notice Called once to configure the contract after the initial deployment. * @dev This farms the initialize call out to inherited contracts as needed. */ function initialize() public initializer { Ownable.ownable_init(); } // collection info mapping mapping(address => mapping(string => collectionInfo)) public collections; // get collection mapping(address => mapping(string => address)) public getCollection; // get collection code with address mapping(address => string) public getCode; event CollectionCreated( address creator, string colCode, address newCollection ); /** * @notice Allows admin to create a collection. */ function createCollection(string memory _colCode) external onlyOwner returns (address collection) { require( getCollection[msg.sender][_colCode] == address(0), "DropMaster : COLLECTION_EXISTS" ); bytes memory bytecode = type(DropsCollection).creationCode; bytes32 salt = keccak256(abi.encodePacked(msg.sender, _colCode)); assembly { collection := create2(0, add(bytecode, 32), mload(bytecode), salt) } require(collection != address(0), "Collection creation ?"); getCollection[msg.sender][_colCode] = collection; getCode[collection] = _colCode; collections[msg.sender][_colCode] = collectionInfo({ symbol: _colCode, newCollection: collection }); emit CollectionCreated(msg.sender, _colCode, collection); } }
[{"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":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buddyContractAddress","type":"address"}],"name":"BuddyAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"string[]","name":"attributes","type":"string[]"},{"indexed":false,"internalType":"string[9]","name":"collectionDetails","type":"string[9]"}],"name":"CollectionDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"conversion","type":"address"}],"name":"ConversionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"DeviationPercentage","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"erc20tokenAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"_status","type":"bool"}],"name":"ERC20TokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"erc721tokenAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"_status","type":"bool"}],"name":"ERC721TokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Minted","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":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromCreator","type":"address"},{"indexed":true,"internalType":"address","name":"toCreator","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenCreatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mintFee","type":"uint256"}],"name":"TokenFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"whiteListedAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"_status","type":"bool"}],"name":"WhiteList","type":"event"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"adminUpdateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_buddyAddress","type":"address"}],"name":"adminUpdateBuddy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_conversionAddress","type":"address"}],"name":"adminUpdateConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_deviationPercentage","type":"uint256"}],"name":"adminUpdateDeviation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"adminUpdateERC20FeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"adminUpdateERC721FeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintFee","type":"uint256"}],"name":"adminUpdateFees","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buddyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"checkDeviation","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collectionAttributes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deviationPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"erc20tokenAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"erc721tokenAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollectionDetails","outputs":[{"internalType":"string","name":"gender","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"image","type":"string"},{"internalType":"string","name":"category","type":"string"},{"internalType":"string","name":"theme","type":"string"},{"internalType":"string","name":"grade","type":"string"},{"internalType":"string","name":"colType","type":"string"},{"internalType":"string","name":"isWardrobeEnabled","type":"string"},{"internalType":"string","name":"wardrobeType","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDropsTreasury","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"treasury","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"bool","name":"whitelisted","type":"bool"},{"internalType":"address","name":"priceConversion","type":"address"},{"internalType":"string[]","name":"attributes","type":"string[]"},{"internalType":"string[9]","name":"collectionDetails","type":"string[9]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"tokenId","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"string","name":"_type","type":"string"}],"name":"mint","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceConversion","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenCreator","outputs":[{"internalType":"address payable","name":"","type":"address"}],"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":[{"internalType":"address[]","name":"_whitelistAddresses","type":"address[]"},{"internalType":"bool[]","name":"_status","type":"bool[]"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListedAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50614cb4806100206000396000f3fe6080604052600436106102c95760003560e01c80637854305911610175578063c24a0f8b116100dc578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610830578063f3ac2c3414610850578063f71c786214610870578063fe07bf1014610890576102c9565b8063e985e9c5146107d0578063ea50283d146107f0578063ed2ed90b14610810576102c9565b8063c24a0f8b14610733578063c30a7c4314610748578063c87b56dd14610768578063caa0f92a14610788578063d3fc98641461079d578063dd467064146107b0576102c9565b8063b1cd4e051161012e578063b1cd4e0514610674578063b3ff78c114610694578063b88d4fde146106be578063bd00af04146106de578063c086b6c1146106fe578063c166d13d14610713576102c9565b806378543059146105d55780637a5caab3146105f55780638da5cb5b1461060a57806395d89b411461061f578063a22cb46514610634578063ad599a3914610654576102c9565b806340c1a064116102345780636352211e116101ed57806365564fba116101c757806365564fba1461056b5780636c0360eb1461058b57806370a08231146105a0578063715018a6146105c0576102c9565b80636352211e14610516578063645538c71461053657806365331bbb14610556576102c9565b806340c1a0641461046157806342842e0e1461048157806342966c68146104a157806342d21ef7146104c15780634f6ccce7146104e15780635b3d409614610501576102c9565b806323b872dd1161028657806323b872dd146103ac5780632e4c1942146103cc5780632f745c59146103ec57806333320de31461040c5780633544a8641461042c57806337bdc99b14610441576102c9565b806301ffc9a7146102ce57806306fdde0314610304578063081812fc14610326578063095ea7b3146103535780630b97bc861461037557806318160ddd14610397575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004613d21565b6108a5565b6040516102fb9190613f60565b60405180910390f35b34801561031057600080fd5b506103196108c8565b6040516102fb9190613f6b565b34801561033257600080fd5b50610346610341366004613d8c565b61095f565b6040516102fb9190613eb7565b34801561035f57600080fd5b5061037361036e366004613bc3565b6109ab565b005b34801561038157600080fd5b5061038a610a43565b6040516102fb9190614b63565b3480156103a357600080fd5b5061038a610a49565b3480156103b857600080fd5b506103736103c7366004613ad9565b610a6e565b3480156103d857600080fd5b506103736103e7366004613b96565b610ad5565b3480156103f857600080fd5b5061038a610407366004613bc3565b610b75565b34801561041857600080fd5b50610373610427366004613c45565b610ba0565b34801561043857600080fd5b506102ee610cdc565b34801561044d57600080fd5b5061037361045c366004613d8c565b610ce5565b34801561046d57600080fd5b5061034661047c366004613d8c565b610db8565b34801561048d57600080fd5b5061037361049c366004613ad9565b610dd3565b3480156104ad57600080fd5b506103736104bc366004613d8c565b610dee565b3480156104cd57600080fd5b506102ee6104dc366004613d8c565b610e92565b3480156104ed57600080fd5b5061038a6104fc366004613d8c565b610ea7565b34801561050d57600080fd5b5061038a610ebd565b34801561052257600080fd5b50610346610531366004613d8c565b610ec3565b34801561054257600080fd5b50610373610551366004613b96565b610eeb565b34801561056257600080fd5b50610346610f7f565b34801561057757600080fd5b50610373610586366004613d8c565b610f93565b34801561059757600080fd5b50610319611008565b3480156105ac57600080fd5b5061038a6105bb366004613970565b611069565b3480156105cc57600080fd5b506103736110b2565b3480156105e157600080fd5b506103736105f0366004613d59565b6110fd565b34801561060157600080fd5b5061038a611148565b34801561061657600080fd5b5061034661114f565b34801561062b57600080fd5b5061031961115f565b34801561064057600080fd5b5061037361064f366004613b96565b6111c0565b34801561066057600080fd5b5061037361066f366004613970565b61128e565b34801561068057600080fd5b506102ee61068f366004613970565b611317565b3480156106a057600080fd5b506106a961132d565b6040516102fb99989796959493929190614031565b3480156106ca57600080fd5b506103736106d9366004613b19565b611875565b3480156106ea57600080fd5b506103736106f93660046139a8565b6118e3565b34801561070a57600080fd5b506103466119dd565b34801561071f57600080fd5b506102ee61072e366004613970565b6119ec565b34801561073f57600080fd5b5061038a611a01565b34801561075457600080fd5b50610373610763366004613970565b611a07565b34801561077457600080fd5b50610319610783366004613d8c565b611a96565b34801561079457600080fd5b5061038a611bde565b61038a6107ab366004613bee565b611be5565b3480156107bc57600080fd5b506103736107cb366004613d8c565b611c98565b3480156107dc57600080fd5b506102ee6107eb366004613aa1565b611d64565b3480156107fc57600080fd5b506102ee61080b366004613970565b611d92565b34801561081c57600080fd5b5061031961082b366004613d8c565b611da8565b34801561083c57600080fd5b5061037361084b366004613970565b611e51565b34801561085c57600080fd5b5061037361086b366004613dbc565b611ebf565b34801561087c57600080fd5b5061037361088b366004613d8c565b611f37565b34801561089c57600080fd5b50610346611fab565b6001600160e01b0319811660009081526033602052604090205460ff165b919050565b606c8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b505050505090505b90565b600061096a82611fbb565b61098f5760405162461bcd60e51b815260040161098690614814565b60405180910390fd5b506000908152606860205260409020546001600160a01b031690565b60006109b682610ec3565b9050806001600160a01b0316836001600160a01b031614156109ea5760405162461bcd60e51b8152600401610986906149a8565b806001600160a01b03166109fc611fc8565b6001600160a01b03161480610a185750610a18816107eb611fc8565b610a345760405162461bcd60e51b8152600401610986906145a6565b610a3e8383611fcc565b505050565b60715490565b6000606f5460001415610a6757610a60606661203a565b905061095c565b50606f5490565b610a7f610a79611fc8565b82612045565b610a9b5760405162461bcd60e51b815260040161098690614a13565b6000818152606b602052604090205460ff1615610aca5760405162461bcd60e51b8152600401610986906143be565b610a3e8383836120ca565b610add611fc8565b6001600160a01b0316610aee61114f565b6001600160a01b031614610b145760405162461bcd60e51b815260040161098690614860565b6001600160a01b038216600081815261104c602052604090819020805460ff1916841515179055517fd5ba71a9c561fc3e42d2faa02d69dc925445bb9a2eb7ea0e137854e334ba8b7090610b69908490613f60565b60405180910390a25050565b6001600160a01b0382166000908152606560205260408120610b9790836121d8565b90505b92915050565b610ba8611fc8565b6001600160a01b0316610bb961114f565b6001600160a01b031614610bdf5760405162461bcd60e51b815260040161098690614860565b60735460ff161515600114610c065760405162461bcd60e51b815260040161098690614603565b60005b8251811015610a3e57818181518110610c1e57fe5b6020026020010151606a6000858481518110610c3657fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055507f606548d83067f365e979d5a0f16d7a3bff7c9184f76176a71e8a67c55a8cc7bd838281518110610ca257fe5b6020026020010151838381518110610cb657fe5b6020026020010151604051610ccc929190613f2c565b60405180910390a1600101610c09565b60735460ff1681565b6074546001600160a01b03163314610d0f5760405162461bcd60e51b815260040161098690614438565b610d1881611fbb565b610d345760405162461bcd60e51b8152600401610986906144dd565b6000818152606b602052604090205460ff161515600114610d675760405162461bcd60e51b81526004016109869061446f565b6000818152606b6020526040808220805460ff19169055517fe623131db635072abb3ae671fdb9598bb8c1c96dbfbaa82a397f42ebff75e5af91610dad91849190614b6c565b60405180910390a150565b600090815260a960205260409020546001600160a01b031690565b610a3e83838360405180602001604052806000815250611875565b600081815260a9602052604090205481906001600160a01b03163314610e265760405162461bcd60e51b815260040161098690614287565b33610e3082610ec3565b6001600160a01b031614610e565760405162461bcd60e51b815260040161098690614ad2565b6000828152606b602052604090205460ff1615610e855760405162461bcd60e51b815260040161098690614a9b565b610e8e826121e4565b5050565b606b6020526000908152604090205460ff1681565b600080610eb56066846122b1565b509392505050565b60755481565b6000610b9a82604051806060016040528060298152602001614c5660299139606691906122cd565b610ef3611fc8565b6001600160a01b0316610f0461114f565b6001600160a01b031614610f2a5760405162461bcd60e51b815260040161098690614860565b6001600160a01b038216600081815261104b602052604090819020805460ff1916841515179055517f9e45c164715ff9288b756987cc4a20ac4305423cd2b889f04302e10a494aafd490610b69908490613f60565b60735461010090046001600160a01b031681565b610f9b611fc8565b6001600160a01b0316610fac61114f565b6001600160a01b031614610fd25760405162461bcd60e51b815260040161098690614860565b61104d8190556040517fb77e7d534838eaeae2dcc0960d6bd6c2f11fb4a816dfe498eb0f38503f21f3bb90610dad908390614b63565b60708054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109545780601f1061092957610100808354040283529160200191610954565b60006001600160a01b0382166110915760405162461bcd60e51b81526004016109869061467d565b6001600160a01b0382166000908152606560205260409020610b9a9061203a565b6110ba611fc8565b6001600160a01b03166110cb61114f565b6001600160a01b0316146110f15760405162461bcd60e51b815260040161098690614860565b6110fb60006122e4565b565b611105611fc8565b6001600160a01b031661111661114f565b6001600160a01b03161461113c5760405162461bcd60e51b815260040161098690614860565b61114581612337565b50565b61104d5490565b611436546001600160a01b031690565b606d8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109545780601f1061092957610100808354040283529160200191610954565b6111c8611fc8565b6001600160a01b0316826001600160a01b031614156111f95760405162461bcd60e51b815260040161098690614387565b8060696000611206611fc8565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561124a611fc8565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112829190613f60565b60405180910390a35050565b611296611fc8565b6001600160a01b03166112a761114f565b6001600160a01b0316146112cd5760405162461bcd60e51b815260040161098690614860565b607480546001600160a01b0319166001600160a01b0383169081179091556040517f1e5969fac1ad70a25b071330ded816ebaa96c90242c3f1fa71f53e1d4b68919690600090a250565b61104b6020526000908152604090205460ff1681565b60768054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060938493849384938493849384938493849392607792607892607992607a92607b92607c92607d92607e92918b918301828280156113e15780601f106113b6576101008083540402835291602001916113e1565b820191906000526020600020905b8154815290600101906020018083116113c457829003601f168201915b50508b5460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959e508d94509250840190508282801561146f5780601f106114445761010080835404028352916020019161146f565b820191906000526020600020905b81548152906001019060200180831161145257829003601f168201915b50508a5460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959d508c9450925084019050828280156114fd5780601f106114d2576101008083540402835291602001916114fd565b820191906000526020600020905b8154815290600101906020018083116114e057829003601f168201915b5050895460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959c508b94509250840190508282801561158b5780601f106115605761010080835404028352916020019161158b565b820191906000526020600020905b81548152906001019060200180831161156e57829003601f168201915b5050885460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959b508a9450925084019050828280156116195780601f106115ee57610100808354040283529160200191611619565b820191906000526020600020905b8154815290600101906020018083116115fc57829003601f168201915b5050875460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959a50899450925084019050828280156116a75780601f1061167c576101008083540402835291602001916116a7565b820191906000526020600020905b81548152906001019060200180831161168a57829003601f168201915b5050865460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959950889450925084019050828280156117355780601f1061170a57610100808354040283529160200191611735565b820191906000526020600020905b81548152906001019060200180831161171857829003601f168201915b5050855460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959850879450925084019050828280156117c35780601f10611798576101008083540402835291602001916117c3565b820191906000526020600020905b8154815290600101906020018083116117a657829003601f168201915b5050845460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959750869450925084019050828280156118515780601f1061182657610100808354040283529160200191611851565b820191906000526020600020905b81548152906001019060200180831161183457829003601f168201915b50505050509050985098509850985098509850985098509850909192939495969798565b611886611880611fc8565b83612045565b6118a25760405162461bcd60e51b815260040161098690614a13565b6000828152606b602052604090205460ff16156118d15760405162461bcd60e51b8152600401610986906143be565b6118dd8484848461236f565b50505050565b600054610100900460ff16806118fc57506118fc6123a2565b8061190a575060005460ff16155b6119265760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff16158015611951576000805460ff1961ff0019909116610100171660011790555b6119596123b3565b611961612445565b6119696124c3565b6119728b61254b565b6119838a8a8a8a8a8a8a8a8a612618565b7f26bc84c538aac7b212b64d32fa1326fd0411bad4d2e4d4423ca29b96e2ddabda8984846040516119b693929190613f7e565b60405180910390a180156119d0576000805461ff00191690555b5050505050505050505050565b6074546001600160a01b031681565b606a6020526000908152604090205460ff1681565b60725490565b611a0f611fc8565b6001600160a01b0316611a2061114f565b6001600160a01b031614611a465760405162461bcd60e51b815260040161098690614860565b60738054610100600160a81b0319166101006001600160a01b038416021790556040517fbc1853b8280baf26b5061781f3906203b3e32852a5413ae8b6b7262d8e92a98490610dad908390613eb7565b6060611aa182611fbb565b611abd5760405162461bcd60e51b815260040161098690614922565b6000828152606e602090815260408083208054825160026001831615610100026000190190921691909104601f810185900485028201850190935282815292909190830182828015611b505780601f10611b2557610100808354040283529160200191611b50565b820191906000526020600020905b815481529060010190602001808311611b3357829003601f168201915b505060705493945050505060026000196101006001841615020190911604611b795790506108c3565b805115611bab57607081604051602001611b94929190613e25565b6040516020818303038152906040529150506108c3565b6070611bb68461271b565b604051602001611bc7929190613e25565b604051602081830303815290604052915050919050565b61104a5490565b336000908152606a602052604081205460ff16151560011480611c0b575060735460ff16155b611c275760405162461bcd60e51b815260040161098690614138565b5061104a805460018101909155611c3d816127f6565b611c45612820565b611c5084848461287f565b611c5a3382612c3b565b611c648133612cff565b604051819033907f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe90600090a39392505050565b6074546001600160a01b03163314611cc25760405162461bcd60e51b815260040161098690614438565b611ccb81611fbb565b611ce75760405162461bcd60e51b8152600401610986906144dd565b6000818152606b602052604090205460ff1615611d165760405162461bcd60e51b815260040161098690614646565b6000818152606b602052604090819020805460ff1916600190811790915590517f8ed24f7d0c11ab2eef7f3d98a2a8f258a2469819af7e11fe564938715d01e2e591610dad91849190614b6c565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b61104c6020526000908152604090205460ff1681565b607f8181548110611db857600080fd5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611e495780601f10611e1e57610100808354040283529160200191611e49565b820191906000526020600020905b815481529060010190602001808311611e2c57829003601f168201915b505050505081565b611e59611fc8565b6001600160a01b0316611e6a61114f565b6001600160a01b031614611e905760405162461bcd60e51b815260040161098690614860565b6001600160a01b038116611eb65760405162461bcd60e51b8152600401610986906141d3565b611145816122e4565b611ee9611ee26064611edc60755485612d7390919063ffffffff16565b90612dad565b8290612ddf565b8210158015611f1b5750611f17611f106064611edc60755485612d7390919063ffffffff16565b8290612e07565b8211155b610e8e5760405162461bcd60e51b815260040161098690614529565b611f3f611fc8565b6001600160a01b0316611f5061114f565b6001600160a01b031614611f765760405162461bcd60e51b815260040161098690614860565b60758190556040517fc6f4f5d84ec5979070f171d14cd7ad017e91a4ade31afb88071cc819a11fa60c90610dad908390614b63565b610879546001600160a01b031690565b6000610b9a606683612e2c565b3390565b600081815260686020526040902080546001600160a01b0319166001600160a01b038416908117909155819061200182610ec3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610b9a82612e38565b600061205082611fbb565b61206c5760405162461bcd60e51b8152600401610986906144dd565b600061207783610ec3565b9050806001600160a01b0316846001600160a01b031614806120b25750836001600160a01b03166120a78461095f565b6001600160a01b0316145b806120c257506120c28185611d64565b949350505050565b826001600160a01b03166120dd82610ec3565b6001600160a01b0316146121035760405162461bcd60e51b8152600401610986906148d9565b6001600160a01b0382166121295760405162461bcd60e51b815260040161098690614343565b612134838383610a3e565b61213f600082611fcc565b6001600160a01b03831660009081526065602052604090206121619082612e3c565b506001600160a01b03821660009081526065602052604090206121849082612e48565b5061219160668284612e54565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610b978383612e6a565b60006121ef82610ec3565b90506121fd81600084610a3e565b612208600083611fcc565b6000828152606e60205260409020546002600019610100600184161502019091160415612246576000828152606e602052604081206122469161361d565b6001600160a01b03811660009081526065602052604090206122689083612e3c565b50612274606683612eaf565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008080806122c08686612ebb565b9097909650945050505050565b60006122da848484612f17565b90505b9392505050565b61143680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61234081612f76565b7f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad81604051610dad9190613f6b565b61237a8484846120ca565b61238684848484612f89565b6118dd5760405162461bcd60e51b815260040161098690614181565b60006123ad30613068565b15905090565b600054610100900460ff16806123cc57506123cc6123a2565b806123da575060005460ff16155b6123f65760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff16158015612421576000805460ff1961ff0019909116610100171660011790555b61243161242c611fc8565b6122e4565b8015611145576000805461ff001916905550565b600054610100900460ff168061245e575061245e6123a2565b8061246c575060005460ff16155b6124885760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff161580156124b3576000805460ff1961ff0019909116610100171660011790555b612431631030681960e21b61306e565b600054610100900460ff16806124dc57506124dc6123a2565b806124ea575060005460ff16155b6125065760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff16158015612531576000805460ff1961ff0019909116610100171660011790555b600161104a558015611145576000805461ff001916905550565b600054610100900460ff168061256457506125646123a2565b80612572575060005460ff16155b61258e5760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff161580156125b9576000805460ff1961ff0019909116610100171660011790555b6125cb826001600160a01b0316613068565b6125e75760405162461bcd60e51b81526004016109869061478c565b61087980546001600160a01b0319166001600160a01b0384161790558015610e8e576000805461ff00191690555050565b600054610100900460ff168061263157506126316123a2565b8061263f575060005460ff16155b61265b5760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff16158015612686576000805460ff1961ff0019909116610100171660011790555b61268e6130bd565b61269661313e565b6126a08a8a6131bc565b6126a988613298565b6126b3878761329d565b6073805460ff191686151517610100600160a81b0319166101006001600160a01b038716021790556126e86076836009613661565b5082516126fc90607f9060208601906136b1565b50801561270f576000805461ff00191690555b50505050505050505050565b60608161274057506040805180820190915260018152600360fc1b60208201526108c3565b8160005b811561275857600101600a82049150612744565b60008167ffffffffffffffff8111801561277157600080fd5b506040519080825280601f01601f19166020018201604052801561279c576020820181803683370190505b50859350905060001982015b83156127ed57600a840660300160f81b828280600190039350815181106127cb57fe5b60200101906001600160f81b031916908160001a905350600a840493506127a8565b50949350505050565b606f541561114557606f548111156111455760405162461bcd60e51b815260040161098690614302565b6072541561285d57426071541115801561283c57506072544211155b6128585760405162461bcd60e51b815260040161098690614971565b6110fb565b4260715411156110fb5760405162461bcd60e51b815260040161098690614401565b6000612889611fab565b905060405160200161289a90613ea6565b60405160208183030381529060405280519060200120826040516020016128c19190613e09565b604051602081830303815290604052805190602001201415612ae2576001600160a01b038416600090815261104b602052604090205460ff16151560011461291b5760405162461bcd60e51b815260040161098690614b1c565b60735460009061010090046001600160a01b0316630a3c748a8661293d611148565b6040518363ffffffff1660e01b815260040161295a929190613f47565b60206040518083038186803b15801561297257600080fd5b505afa158015612986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129aa9190613da4565b90506001600160a01b03851615612a54576129c58482611ebf565b846001600160a01b03166323b872dd336129dd611fab565b876040518463ffffffff1660e01b81526004016129fc93929190613ecb565b602060405180830381600087803b158015612a1657600080fd5b505af1158015612a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4e9190613d05565b50612adc565b612a5e3482611ebf565b6000826001600160a01b031634604051612a779061095c565b60006040518083038185875af1925050503d8060008114612ab4576040519150601f19603f3d011682016040523d82523d6000602084013e612ab9565b606091505b5050905080612ada5760405162461bcd60e51b8152600401610986906149e9565b505b506118dd565b6001600160a01b038416600090815261104c602052604090205460ff161515600114612b205760405162461bcd60e51b815260040161098690614b1c565b6040516331a9108f60e11b81526001600160a01b03851690636352211e90612b4c908690600401614b63565b60206040518083038186803b158015612b6457600080fd5b505afa158015612b78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9c919061398c565b6001600160a01b0316336001600160a01b031614612bcc5760405162461bcd60e51b815260040161098690614895565b836001600160a01b03166342842e0e33612be4611fab565b866040518463ffffffff1660e01b8152600401612c0393929190613ecb565b600060405180830381600087803b158015612c1d57600080fd5b505af1158015612c31573d6000803e3d6000fd5b5050505050505050565b6001600160a01b038216612c615760405162461bcd60e51b815260040161098690614757565b612c6a81611fbb565b15612c875760405162461bcd60e51b815260040161098690614250565b612c9360008383610a3e565b6001600160a01b0382166000908152606560205260409020612cb59082612e48565b50612cc260668284612e54565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600082815260a9602052604080822054905184926001600160a01b038086169316917febd529444fe852bfccb40075e8f8cae7612ea20edebdf5143c72718ccb157f759190a4600091825260a9602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b600082612d8257506000610b9a565b82820282848281612d8f57fe5b0414610b975760405162461bcd60e51b8152600401610986906147d3565b6000808211612dce5760405162461bcd60e51b81526004016109869061456f565b818381612dd757fe5b049392505050565b600082821115612e015760405162461bcd60e51b8152600401610986906144a6565b50900390565b600082820183811015610b975760405162461bcd60e51b8152600401610986906142cb565b6000610b9783836132a8565b5490565b6000610b9783836132c0565b6000610b978383613386565b60006122da84846001600160a01b0385166133d0565b81546000908210612e8d5760405162461bcd60e51b8152600401610986906140f6565b826000018281548110612e9c57fe5b9060005260206000200154905092915050565b6000610b978383613467565b815460009081908310612ee05760405162461bcd60e51b815260040161098690614715565b6000846000018481548110612ef157fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008281526001840160205260408120548281612f475760405162461bcd60e51b81526004016109869190613f6b565b50846000016001820381548110612f5a57fe5b9060005260206000209060020201600101549150509392505050565b8051610e8e9060709060208401906136fe565b6000612f9d846001600160a01b0316613068565b612fa9575060016120c2565b6000613031630a85bd0160e11b612fbe611fc8565b888787604051602401612fd49493929190613eef565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001614c24603291396001600160a01b038816919061353b565b90506000818060200190518101906130499190613d3d565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b3b151590565b6001600160e01b031980821614156130985760405162461bcd60e51b815260040161098690614219565b6001600160e01b0319166000908152603360205260409020805460ff19166001179055565b600054610100900460ff16806130d657506130d66123a2565b806130e4575060005460ff16155b6131005760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff16158015612431576000805460ff1961ff0019909116610100171660011790558015611145576000805461ff001916905550565b600054610100900460ff168061315757506131576123a2565b80613165575060005460ff16155b6131815760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff161580156131ac576000805460ff1961ff0019909116610100171660011790555b6124316301ffc9a760e01b61306e565b600054610100900460ff16806131d557506131d56123a2565b806131e3575060005460ff16155b6131ff5760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff1615801561322a576000805460ff1961ff0019909116610100171660011790555b825161323d90606c9060208601906136fe565b50815161325190606d9060208501906136fe565b506132626380ac58cd60e01b61306e565b613272635b5e139f60e01b61306e565b61328263780e9d6360e01b61306e565b8015610a3e576000805461ff0019169055505050565b606f55565b607191909155607255565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561337c57835460001980830191908101906000908790839081106132f357fe5b906000526020600020015490508087600001848154811061331057fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061334057fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610b9a565b6000915050610b9a565b600061339283836132a8565b6133c857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b9a565b506000610b9a565b6000828152600184016020526040812054806134355750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556122dd565b8285600001600183038154811061344857fe5b90600052602060002090600202016001018190555060009150506122dd565b6000818152600183016020526040812054801561337c578354600019808301919081019060009087908390811061349a57fe5b90600052602060002090600202019050808760000184815481106134ba57fe5b6000918252602080832084546002909302019182556001938401549184019190915583548252898301905260409020908401905586548790806134f957fe5b6000828152602080822060026000199094019384020182815560019081018390559290935588815289820190925260408220919091559450610b9a9350505050565b60606122da84846000858561354f85613068565b61356b5760405162461bcd60e51b815260040161098690614a64565b600080866001600160a01b031685876040516135879190613e09565b60006040518083038185875af1925050503d80600081146135c4576040519150601f19603f3d011682016040523d82523d6000602084013e6135c9565b606091505b50915091506135d98282866135e4565b979650505050505050565b606083156135f35750816122dd565b8251156136035782518084602001fd5b8160405162461bcd60e51b81526004016109869190613f6b565b50805460018160011615610100020316600290046000825580601f106136435750611145565b601f0160209004906000526020600020908101906111459190613782565b82600981019282156136a1579160200282015b828111156136a157825180516136919184916020909101906136fe565b5091602001919060010190613674565b506136ad929150613797565b5090565b8280548282559060005260206000209081019282156136a1579160200282015b828111156136a157825180516136ee9184916020909101906136fe565b50916020019190600101906136d1565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613734576000855561377a565b82601f1061374d57805160ff191683800117855561377a565b8280016001018555821561377a579182015b8281111561377a57825182559160200191906001019061375f565b506136ad9291505b5b808211156136ad5760008155600101613783565b808211156136ad5760006137ab828261361d565b50600101613797565b600067ffffffffffffffff8311156137c857fe5b6137db601f8401601f1916602001614b7c565b90508281528383830111156137ef57600080fd5b828260208301376000602084830101529392505050565b80356108c381614bea565b600082601f830112613821578081fd5b8135602061383661383183614ba0565b614b7c565b8281528181019085830183850287018401881015613852578586fd5b855b8581101561387957813561386781614bff565b84529284019290840190600101613854565b5090979650505050505050565b600082601f830112613896578081fd5b604051610120810181811067ffffffffffffffff821117156138b457fe5b6040528083835b60098110156138e6576138d18783358801613951565b835260209283019291909101906001016138bb565b509195945050505050565b600082601f830112613901578081fd5b8135602061391161383183614ba0565b82815281810190858301855b8581101561387957613934898684358b0101613951565b8452928401929084019060010161391d565b80356108c381614bff565b600082601f830112613961578081fd5b610b97838335602085016137b4565b600060208284031215613981578081fd5b8135610b9781614bea565b60006020828403121561399d578081fd5b8151610b9781614bea565b6000806000806000806000806000806101408b8d0312156139c7578586fd5b6139d08b613806565b995060208b013567ffffffffffffffff808211156139ec578788fd5b6139f88e838f01613951565b9a5060408d0135915080821115613a0d578788fd5b613a198e838f01613951565b995060608d0135985060808d0135975060a08d01359650613a3c60c08e01613946565b9550613a4a60e08e01613806565b94506101008d0135915080821115613a60578384fd5b613a6c8e838f016138f1565b93506101208d0135915080821115613a82578283fd5b50613a8f8d828e01613886565b9150509295989b9194979a5092959850565b60008060408385031215613ab3578182fd5b8235613abe81614bea565b91506020830135613ace81614bea565b809150509250929050565b600080600060608486031215613aed578081fd5b8335613af881614bea565b92506020840135613b0881614bea565b929592945050506040919091013590565b60008060008060808587031215613b2e578182fd5b8435613b3981614bea565b93506020850135613b4981614bea565b925060408501359150606085013567ffffffffffffffff811115613b6b578182fd5b8501601f81018713613b7b578182fd5b613b8a878235602084016137b4565b91505092959194509250565b60008060408385031215613ba8578182fd5b8235613bb381614bea565b91506020830135613ace81614bff565b60008060408385031215613bd5578182fd5b8235613be081614bea565b946020939093013593505050565b600080600060608486031215613c02578081fd5b8335613c0d81614bea565b925060208401359150604084013567ffffffffffffffff811115613c2f578182fd5b613c3b86828701613951565b9150509250925092565b60008060408385031215613c57578182fd5b823567ffffffffffffffff80821115613c6e578384fd5b818501915085601f830112613c81578384fd5b81356020613c9161383183614ba0565b82815281810190858301838502870184018b1015613cad578889fd5b8896505b84871015613cd8578035613cc481614bea565b835260019690960195918301918301613cb1565b5096505086013592505080821115613cee578283fd5b50613cfb85828601613811565b9150509250929050565b600060208284031215613d16578081fd5b8151610b9781614bff565b600060208284031215613d32578081fd5b8135610b9781614c0d565b600060208284031215613d4e578081fd5b8151610b9781614c0d565b600060208284031215613d6a578081fd5b813567ffffffffffffffff811115613d80578182fd5b6120c284828501613951565b600060208284031215613d9d578081fd5b5035919050565b600060208284031215613db5578081fd5b5051919050565b60008060408385031215613dce578182fd5b50508035926020909101359150565b60008151808452613df5816020860160208601614bbe565b601f01601f19169290920160200192915050565b60008251613e1b818460208701614bbe565b9190910192915050565b6000808454600180821660008114613e445760018114613e5b57613e8a565b60ff198316865260028304607f1686019350613e8a565b600283048886526020808720875b83811015613e825781548a820152908501908201613e69565b505050860193505b5050508351613e9d818360208801614bbe565b01949350505050565b64045524332360dc1b815260050190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613f2290830184613ddd565b9695505050505050565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252610b976020830184613ddd565b600060608252613f916060830186613ddd565b602083820381850152818651808452828401915082838202850101838901865b83811015613fdf57601f19878403018552613fcd838351613ddd565b94860194925090850190600101613fb1565b50508681036040880152935050610120830190508583855b6009811015614022578184038652614010848451613ddd565b95850195935091840191600101613ff7565b50919998505050505050505050565b60006101208083526140458184018d613ddd565b90508281036020840152614059818c613ddd565b9050828103604084015261406d818b613ddd565b90508281036060840152614081818a613ddd565b905082810360808401526140958189613ddd565b905082810360a08401526140a98188613ddd565b905082810360c08401526140bd8187613ddd565b905082810360e08401526140d18186613ddd565b90508281036101008401526140e68185613ddd565b9c9b505050505050505050505050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526029908201527f4e46543732314d696e74203a20555345525f414444524553535f4e4f545f5748604082015268125511531254d5115160ba1b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4e465437323143726561746f723a2043616c6c6572206973206e6f742063726560408201526330ba37b960e11b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f4e46543732314d696e74203a20535550504c595f4c494d49545f5245414348456040820152601160fa1b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526023908201527f4552433732313a20546f6b656e2063616e6e6f74206265207472616e736665726040820152621c995960ea1b606082015260800190565b6020808252601d908201527f4e46543732314d696e74203a204d494e54494e475f4e4f545f4c495645000000604082015260600190565b6020808252601d908201527f4e46543732314d696e743a204e4f545f42554444595f41444452455353000000604082015260600190565b6020808252601e908201527f4552433732313a20546f6b656e20756e6c6f636b656420616c72656164790000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526026908201527f416d6f756e74206e6f742077697468696e20646576696174696f6e2070657263604082015265656e7461676560d01b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526023908201527f44726f7073436f6c6c656374696f6e203a205055424c49435f434f4c4c45435460408201526224a7a760e91b606082015260800190565b6020808252601c908201527f4552433732313a20546f6b656e206c6f636b656420616c726561647900000000604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526027908201527f54726561737572794e6f64653a2041646472657373206973206e6f74206120636040820152661bdb9d1c9858dd60ca1b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f4e46543732314d696e74203a2043616c6c6572206973206e6f7420746865206f6040820152633bb732b960e11b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252601a908201527f4e46543732314d696e74203a204d494e54494e475f454e444544000000000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526010908201526f2a3930b739b332b9103330b4b632b21760811b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601e908201527f4e465437323143726561746f723a20546f6b656e206973206c6f636b65640000604082015260600190565b6020808252602a908201527f4e465437323143726561746f723a2043616c6c657220646f6573206e6f74206f6040820152691ddb881d1a194813919560b21b606082015260800190565b60208082526027908201527f4e46543732314d696e74203a205061796d656e74546f6b656e204e6f742053756040820152661c1c1bdc9d195960ca1b606082015260800190565b90815260200190565b9182521515602082015260400190565b60405181810167ffffffffffffffff81118282101715614b9857fe5b604052919050565b600067ffffffffffffffff821115614bb457fe5b5060209081020190565b60005b83811015614bd9578181015183820152602001614bc1565b838111156118dd5750506000910152565b6001600160a01b038116811461114557600080fd5b801515811461114557600080fd5b6001600160e01b03198116811461114557600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212205c826f76995a9fa520213ad89fc1c64875a42907743e708b070d4cc8f8f6244e64736f6c63430007060033
Deployed Bytecode
0x6080604052600436106102c95760003560e01c80637854305911610175578063c24a0f8b116100dc578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610830578063f3ac2c3414610850578063f71c786214610870578063fe07bf1014610890576102c9565b8063e985e9c5146107d0578063ea50283d146107f0578063ed2ed90b14610810576102c9565b8063c24a0f8b14610733578063c30a7c4314610748578063c87b56dd14610768578063caa0f92a14610788578063d3fc98641461079d578063dd467064146107b0576102c9565b8063b1cd4e051161012e578063b1cd4e0514610674578063b3ff78c114610694578063b88d4fde146106be578063bd00af04146106de578063c086b6c1146106fe578063c166d13d14610713576102c9565b806378543059146105d55780637a5caab3146105f55780638da5cb5b1461060a57806395d89b411461061f578063a22cb46514610634578063ad599a3914610654576102c9565b806340c1a064116102345780636352211e116101ed57806365564fba116101c757806365564fba1461056b5780636c0360eb1461058b57806370a08231146105a0578063715018a6146105c0576102c9565b80636352211e14610516578063645538c71461053657806365331bbb14610556576102c9565b806340c1a0641461046157806342842e0e1461048157806342966c68146104a157806342d21ef7146104c15780634f6ccce7146104e15780635b3d409614610501576102c9565b806323b872dd1161028657806323b872dd146103ac5780632e4c1942146103cc5780632f745c59146103ec57806333320de31461040c5780633544a8641461042c57806337bdc99b14610441576102c9565b806301ffc9a7146102ce57806306fdde0314610304578063081812fc14610326578063095ea7b3146103535780630b97bc861461037557806318160ddd14610397575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004613d21565b6108a5565b6040516102fb9190613f60565b60405180910390f35b34801561031057600080fd5b506103196108c8565b6040516102fb9190613f6b565b34801561033257600080fd5b50610346610341366004613d8c565b61095f565b6040516102fb9190613eb7565b34801561035f57600080fd5b5061037361036e366004613bc3565b6109ab565b005b34801561038157600080fd5b5061038a610a43565b6040516102fb9190614b63565b3480156103a357600080fd5b5061038a610a49565b3480156103b857600080fd5b506103736103c7366004613ad9565b610a6e565b3480156103d857600080fd5b506103736103e7366004613b96565b610ad5565b3480156103f857600080fd5b5061038a610407366004613bc3565b610b75565b34801561041857600080fd5b50610373610427366004613c45565b610ba0565b34801561043857600080fd5b506102ee610cdc565b34801561044d57600080fd5b5061037361045c366004613d8c565b610ce5565b34801561046d57600080fd5b5061034661047c366004613d8c565b610db8565b34801561048d57600080fd5b5061037361049c366004613ad9565b610dd3565b3480156104ad57600080fd5b506103736104bc366004613d8c565b610dee565b3480156104cd57600080fd5b506102ee6104dc366004613d8c565b610e92565b3480156104ed57600080fd5b5061038a6104fc366004613d8c565b610ea7565b34801561050d57600080fd5b5061038a610ebd565b34801561052257600080fd5b50610346610531366004613d8c565b610ec3565b34801561054257600080fd5b50610373610551366004613b96565b610eeb565b34801561056257600080fd5b50610346610f7f565b34801561057757600080fd5b50610373610586366004613d8c565b610f93565b34801561059757600080fd5b50610319611008565b3480156105ac57600080fd5b5061038a6105bb366004613970565b611069565b3480156105cc57600080fd5b506103736110b2565b3480156105e157600080fd5b506103736105f0366004613d59565b6110fd565b34801561060157600080fd5b5061038a611148565b34801561061657600080fd5b5061034661114f565b34801561062b57600080fd5b5061031961115f565b34801561064057600080fd5b5061037361064f366004613b96565b6111c0565b34801561066057600080fd5b5061037361066f366004613970565b61128e565b34801561068057600080fd5b506102ee61068f366004613970565b611317565b3480156106a057600080fd5b506106a961132d565b6040516102fb99989796959493929190614031565b3480156106ca57600080fd5b506103736106d9366004613b19565b611875565b3480156106ea57600080fd5b506103736106f93660046139a8565b6118e3565b34801561070a57600080fd5b506103466119dd565b34801561071f57600080fd5b506102ee61072e366004613970565b6119ec565b34801561073f57600080fd5b5061038a611a01565b34801561075457600080fd5b50610373610763366004613970565b611a07565b34801561077457600080fd5b50610319610783366004613d8c565b611a96565b34801561079457600080fd5b5061038a611bde565b61038a6107ab366004613bee565b611be5565b3480156107bc57600080fd5b506103736107cb366004613d8c565b611c98565b3480156107dc57600080fd5b506102ee6107eb366004613aa1565b611d64565b3480156107fc57600080fd5b506102ee61080b366004613970565b611d92565b34801561081c57600080fd5b5061031961082b366004613d8c565b611da8565b34801561083c57600080fd5b5061037361084b366004613970565b611e51565b34801561085c57600080fd5b5061037361086b366004613dbc565b611ebf565b34801561087c57600080fd5b5061037361088b366004613d8c565b611f37565b34801561089c57600080fd5b50610346611fab565b6001600160e01b0319811660009081526033602052604090205460ff165b919050565b606c8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b505050505090505b90565b600061096a82611fbb565b61098f5760405162461bcd60e51b815260040161098690614814565b60405180910390fd5b506000908152606860205260409020546001600160a01b031690565b60006109b682610ec3565b9050806001600160a01b0316836001600160a01b031614156109ea5760405162461bcd60e51b8152600401610986906149a8565b806001600160a01b03166109fc611fc8565b6001600160a01b03161480610a185750610a18816107eb611fc8565b610a345760405162461bcd60e51b8152600401610986906145a6565b610a3e8383611fcc565b505050565b60715490565b6000606f5460001415610a6757610a60606661203a565b905061095c565b50606f5490565b610a7f610a79611fc8565b82612045565b610a9b5760405162461bcd60e51b815260040161098690614a13565b6000818152606b602052604090205460ff1615610aca5760405162461bcd60e51b8152600401610986906143be565b610a3e8383836120ca565b610add611fc8565b6001600160a01b0316610aee61114f565b6001600160a01b031614610b145760405162461bcd60e51b815260040161098690614860565b6001600160a01b038216600081815261104c602052604090819020805460ff1916841515179055517fd5ba71a9c561fc3e42d2faa02d69dc925445bb9a2eb7ea0e137854e334ba8b7090610b69908490613f60565b60405180910390a25050565b6001600160a01b0382166000908152606560205260408120610b9790836121d8565b90505b92915050565b610ba8611fc8565b6001600160a01b0316610bb961114f565b6001600160a01b031614610bdf5760405162461bcd60e51b815260040161098690614860565b60735460ff161515600114610c065760405162461bcd60e51b815260040161098690614603565b60005b8251811015610a3e57818181518110610c1e57fe5b6020026020010151606a6000858481518110610c3657fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055507f606548d83067f365e979d5a0f16d7a3bff7c9184f76176a71e8a67c55a8cc7bd838281518110610ca257fe5b6020026020010151838381518110610cb657fe5b6020026020010151604051610ccc929190613f2c565b60405180910390a1600101610c09565b60735460ff1681565b6074546001600160a01b03163314610d0f5760405162461bcd60e51b815260040161098690614438565b610d1881611fbb565b610d345760405162461bcd60e51b8152600401610986906144dd565b6000818152606b602052604090205460ff161515600114610d675760405162461bcd60e51b81526004016109869061446f565b6000818152606b6020526040808220805460ff19169055517fe623131db635072abb3ae671fdb9598bb8c1c96dbfbaa82a397f42ebff75e5af91610dad91849190614b6c565b60405180910390a150565b600090815260a960205260409020546001600160a01b031690565b610a3e83838360405180602001604052806000815250611875565b600081815260a9602052604090205481906001600160a01b03163314610e265760405162461bcd60e51b815260040161098690614287565b33610e3082610ec3565b6001600160a01b031614610e565760405162461bcd60e51b815260040161098690614ad2565b6000828152606b602052604090205460ff1615610e855760405162461bcd60e51b815260040161098690614a9b565b610e8e826121e4565b5050565b606b6020526000908152604090205460ff1681565b600080610eb56066846122b1565b509392505050565b60755481565b6000610b9a82604051806060016040528060298152602001614c5660299139606691906122cd565b610ef3611fc8565b6001600160a01b0316610f0461114f565b6001600160a01b031614610f2a5760405162461bcd60e51b815260040161098690614860565b6001600160a01b038216600081815261104b602052604090819020805460ff1916841515179055517f9e45c164715ff9288b756987cc4a20ac4305423cd2b889f04302e10a494aafd490610b69908490613f60565b60735461010090046001600160a01b031681565b610f9b611fc8565b6001600160a01b0316610fac61114f565b6001600160a01b031614610fd25760405162461bcd60e51b815260040161098690614860565b61104d8190556040517fb77e7d534838eaeae2dcc0960d6bd6c2f11fb4a816dfe498eb0f38503f21f3bb90610dad908390614b63565b60708054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109545780601f1061092957610100808354040283529160200191610954565b60006001600160a01b0382166110915760405162461bcd60e51b81526004016109869061467d565b6001600160a01b0382166000908152606560205260409020610b9a9061203a565b6110ba611fc8565b6001600160a01b03166110cb61114f565b6001600160a01b0316146110f15760405162461bcd60e51b815260040161098690614860565b6110fb60006122e4565b565b611105611fc8565b6001600160a01b031661111661114f565b6001600160a01b03161461113c5760405162461bcd60e51b815260040161098690614860565b61114581612337565b50565b61104d5490565b611436546001600160a01b031690565b606d8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109545780601f1061092957610100808354040283529160200191610954565b6111c8611fc8565b6001600160a01b0316826001600160a01b031614156111f95760405162461bcd60e51b815260040161098690614387565b8060696000611206611fc8565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561124a611fc8565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112829190613f60565b60405180910390a35050565b611296611fc8565b6001600160a01b03166112a761114f565b6001600160a01b0316146112cd5760405162461bcd60e51b815260040161098690614860565b607480546001600160a01b0319166001600160a01b0383169081179091556040517f1e5969fac1ad70a25b071330ded816ebaa96c90242c3f1fa71f53e1d4b68919690600090a250565b61104b6020526000908152604090205460ff1681565b60768054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060938493849384938493849384938493849392607792607892607992607a92607b92607c92607d92607e92918b918301828280156113e15780601f106113b6576101008083540402835291602001916113e1565b820191906000526020600020905b8154815290600101906020018083116113c457829003601f168201915b50508b5460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959e508d94509250840190508282801561146f5780601f106114445761010080835404028352916020019161146f565b820191906000526020600020905b81548152906001019060200180831161145257829003601f168201915b50508a5460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959d508c9450925084019050828280156114fd5780601f106114d2576101008083540402835291602001916114fd565b820191906000526020600020905b8154815290600101906020018083116114e057829003601f168201915b5050895460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959c508b94509250840190508282801561158b5780601f106115605761010080835404028352916020019161158b565b820191906000526020600020905b81548152906001019060200180831161156e57829003601f168201915b5050885460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959b508a9450925084019050828280156116195780601f106115ee57610100808354040283529160200191611619565b820191906000526020600020905b8154815290600101906020018083116115fc57829003601f168201915b5050875460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959a50899450925084019050828280156116a75780601f1061167c576101008083540402835291602001916116a7565b820191906000526020600020905b81548152906001019060200180831161168a57829003601f168201915b5050865460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959950889450925084019050828280156117355780601f1061170a57610100808354040283529160200191611735565b820191906000526020600020905b81548152906001019060200180831161171857829003601f168201915b5050855460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959850879450925084019050828280156117c35780601f10611798576101008083540402835291602001916117c3565b820191906000526020600020905b8154815290600101906020018083116117a657829003601f168201915b5050845460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959750869450925084019050828280156118515780601f1061182657610100808354040283529160200191611851565b820191906000526020600020905b81548152906001019060200180831161183457829003601f168201915b50505050509050985098509850985098509850985098509850909192939495969798565b611886611880611fc8565b83612045565b6118a25760405162461bcd60e51b815260040161098690614a13565b6000828152606b602052604090205460ff16156118d15760405162461bcd60e51b8152600401610986906143be565b6118dd8484848461236f565b50505050565b600054610100900460ff16806118fc57506118fc6123a2565b8061190a575060005460ff16155b6119265760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff16158015611951576000805460ff1961ff0019909116610100171660011790555b6119596123b3565b611961612445565b6119696124c3565b6119728b61254b565b6119838a8a8a8a8a8a8a8a8a612618565b7f26bc84c538aac7b212b64d32fa1326fd0411bad4d2e4d4423ca29b96e2ddabda8984846040516119b693929190613f7e565b60405180910390a180156119d0576000805461ff00191690555b5050505050505050505050565b6074546001600160a01b031681565b606a6020526000908152604090205460ff1681565b60725490565b611a0f611fc8565b6001600160a01b0316611a2061114f565b6001600160a01b031614611a465760405162461bcd60e51b815260040161098690614860565b60738054610100600160a81b0319166101006001600160a01b038416021790556040517fbc1853b8280baf26b5061781f3906203b3e32852a5413ae8b6b7262d8e92a98490610dad908390613eb7565b6060611aa182611fbb565b611abd5760405162461bcd60e51b815260040161098690614922565b6000828152606e602090815260408083208054825160026001831615610100026000190190921691909104601f810185900485028201850190935282815292909190830182828015611b505780601f10611b2557610100808354040283529160200191611b50565b820191906000526020600020905b815481529060010190602001808311611b3357829003601f168201915b505060705493945050505060026000196101006001841615020190911604611b795790506108c3565b805115611bab57607081604051602001611b94929190613e25565b6040516020818303038152906040529150506108c3565b6070611bb68461271b565b604051602001611bc7929190613e25565b604051602081830303815290604052915050919050565b61104a5490565b336000908152606a602052604081205460ff16151560011480611c0b575060735460ff16155b611c275760405162461bcd60e51b815260040161098690614138565b5061104a805460018101909155611c3d816127f6565b611c45612820565b611c5084848461287f565b611c5a3382612c3b565b611c648133612cff565b604051819033907f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe90600090a39392505050565b6074546001600160a01b03163314611cc25760405162461bcd60e51b815260040161098690614438565b611ccb81611fbb565b611ce75760405162461bcd60e51b8152600401610986906144dd565b6000818152606b602052604090205460ff1615611d165760405162461bcd60e51b815260040161098690614646565b6000818152606b602052604090819020805460ff1916600190811790915590517f8ed24f7d0c11ab2eef7f3d98a2a8f258a2469819af7e11fe564938715d01e2e591610dad91849190614b6c565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b61104c6020526000908152604090205460ff1681565b607f8181548110611db857600080fd5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611e495780601f10611e1e57610100808354040283529160200191611e49565b820191906000526020600020905b815481529060010190602001808311611e2c57829003601f168201915b505050505081565b611e59611fc8565b6001600160a01b0316611e6a61114f565b6001600160a01b031614611e905760405162461bcd60e51b815260040161098690614860565b6001600160a01b038116611eb65760405162461bcd60e51b8152600401610986906141d3565b611145816122e4565b611ee9611ee26064611edc60755485612d7390919063ffffffff16565b90612dad565b8290612ddf565b8210158015611f1b5750611f17611f106064611edc60755485612d7390919063ffffffff16565b8290612e07565b8211155b610e8e5760405162461bcd60e51b815260040161098690614529565b611f3f611fc8565b6001600160a01b0316611f5061114f565b6001600160a01b031614611f765760405162461bcd60e51b815260040161098690614860565b60758190556040517fc6f4f5d84ec5979070f171d14cd7ad017e91a4ade31afb88071cc819a11fa60c90610dad908390614b63565b610879546001600160a01b031690565b6000610b9a606683612e2c565b3390565b600081815260686020526040902080546001600160a01b0319166001600160a01b038416908117909155819061200182610ec3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610b9a82612e38565b600061205082611fbb565b61206c5760405162461bcd60e51b8152600401610986906144dd565b600061207783610ec3565b9050806001600160a01b0316846001600160a01b031614806120b25750836001600160a01b03166120a78461095f565b6001600160a01b0316145b806120c257506120c28185611d64565b949350505050565b826001600160a01b03166120dd82610ec3565b6001600160a01b0316146121035760405162461bcd60e51b8152600401610986906148d9565b6001600160a01b0382166121295760405162461bcd60e51b815260040161098690614343565b612134838383610a3e565b61213f600082611fcc565b6001600160a01b03831660009081526065602052604090206121619082612e3c565b506001600160a01b03821660009081526065602052604090206121849082612e48565b5061219160668284612e54565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610b978383612e6a565b60006121ef82610ec3565b90506121fd81600084610a3e565b612208600083611fcc565b6000828152606e60205260409020546002600019610100600184161502019091160415612246576000828152606e602052604081206122469161361d565b6001600160a01b03811660009081526065602052604090206122689083612e3c565b50612274606683612eaf565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008080806122c08686612ebb565b9097909650945050505050565b60006122da848484612f17565b90505b9392505050565b61143680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61234081612f76565b7f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad81604051610dad9190613f6b565b61237a8484846120ca565b61238684848484612f89565b6118dd5760405162461bcd60e51b815260040161098690614181565b60006123ad30613068565b15905090565b600054610100900460ff16806123cc57506123cc6123a2565b806123da575060005460ff16155b6123f65760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff16158015612421576000805460ff1961ff0019909116610100171660011790555b61243161242c611fc8565b6122e4565b8015611145576000805461ff001916905550565b600054610100900460ff168061245e575061245e6123a2565b8061246c575060005460ff16155b6124885760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff161580156124b3576000805460ff1961ff0019909116610100171660011790555b612431631030681960e21b61306e565b600054610100900460ff16806124dc57506124dc6123a2565b806124ea575060005460ff16155b6125065760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff16158015612531576000805460ff1961ff0019909116610100171660011790555b600161104a558015611145576000805461ff001916905550565b600054610100900460ff168061256457506125646123a2565b80612572575060005460ff16155b61258e5760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff161580156125b9576000805460ff1961ff0019909116610100171660011790555b6125cb826001600160a01b0316613068565b6125e75760405162461bcd60e51b81526004016109869061478c565b61087980546001600160a01b0319166001600160a01b0384161790558015610e8e576000805461ff00191690555050565b600054610100900460ff168061263157506126316123a2565b8061263f575060005460ff16155b61265b5760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff16158015612686576000805460ff1961ff0019909116610100171660011790555b61268e6130bd565b61269661313e565b6126a08a8a6131bc565b6126a988613298565b6126b3878761329d565b6073805460ff191686151517610100600160a81b0319166101006001600160a01b038716021790556126e86076836009613661565b5082516126fc90607f9060208601906136b1565b50801561270f576000805461ff00191690555b50505050505050505050565b60608161274057506040805180820190915260018152600360fc1b60208201526108c3565b8160005b811561275857600101600a82049150612744565b60008167ffffffffffffffff8111801561277157600080fd5b506040519080825280601f01601f19166020018201604052801561279c576020820181803683370190505b50859350905060001982015b83156127ed57600a840660300160f81b828280600190039350815181106127cb57fe5b60200101906001600160f81b031916908160001a905350600a840493506127a8565b50949350505050565b606f541561114557606f548111156111455760405162461bcd60e51b815260040161098690614302565b6072541561285d57426071541115801561283c57506072544211155b6128585760405162461bcd60e51b815260040161098690614971565b6110fb565b4260715411156110fb5760405162461bcd60e51b815260040161098690614401565b6000612889611fab565b905060405160200161289a90613ea6565b60405160208183030381529060405280519060200120826040516020016128c19190613e09565b604051602081830303815290604052805190602001201415612ae2576001600160a01b038416600090815261104b602052604090205460ff16151560011461291b5760405162461bcd60e51b815260040161098690614b1c565b60735460009061010090046001600160a01b0316630a3c748a8661293d611148565b6040518363ffffffff1660e01b815260040161295a929190613f47565b60206040518083038186803b15801561297257600080fd5b505afa158015612986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129aa9190613da4565b90506001600160a01b03851615612a54576129c58482611ebf565b846001600160a01b03166323b872dd336129dd611fab565b876040518463ffffffff1660e01b81526004016129fc93929190613ecb565b602060405180830381600087803b158015612a1657600080fd5b505af1158015612a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4e9190613d05565b50612adc565b612a5e3482611ebf565b6000826001600160a01b031634604051612a779061095c565b60006040518083038185875af1925050503d8060008114612ab4576040519150601f19603f3d011682016040523d82523d6000602084013e612ab9565b606091505b5050905080612ada5760405162461bcd60e51b8152600401610986906149e9565b505b506118dd565b6001600160a01b038416600090815261104c602052604090205460ff161515600114612b205760405162461bcd60e51b815260040161098690614b1c565b6040516331a9108f60e11b81526001600160a01b03851690636352211e90612b4c908690600401614b63565b60206040518083038186803b158015612b6457600080fd5b505afa158015612b78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9c919061398c565b6001600160a01b0316336001600160a01b031614612bcc5760405162461bcd60e51b815260040161098690614895565b836001600160a01b03166342842e0e33612be4611fab565b866040518463ffffffff1660e01b8152600401612c0393929190613ecb565b600060405180830381600087803b158015612c1d57600080fd5b505af1158015612c31573d6000803e3d6000fd5b5050505050505050565b6001600160a01b038216612c615760405162461bcd60e51b815260040161098690614757565b612c6a81611fbb565b15612c875760405162461bcd60e51b815260040161098690614250565b612c9360008383610a3e565b6001600160a01b0382166000908152606560205260409020612cb59082612e48565b50612cc260668284612e54565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600082815260a9602052604080822054905184926001600160a01b038086169316917febd529444fe852bfccb40075e8f8cae7612ea20edebdf5143c72718ccb157f759190a4600091825260a9602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b600082612d8257506000610b9a565b82820282848281612d8f57fe5b0414610b975760405162461bcd60e51b8152600401610986906147d3565b6000808211612dce5760405162461bcd60e51b81526004016109869061456f565b818381612dd757fe5b049392505050565b600082821115612e015760405162461bcd60e51b8152600401610986906144a6565b50900390565b600082820183811015610b975760405162461bcd60e51b8152600401610986906142cb565b6000610b9783836132a8565b5490565b6000610b9783836132c0565b6000610b978383613386565b60006122da84846001600160a01b0385166133d0565b81546000908210612e8d5760405162461bcd60e51b8152600401610986906140f6565b826000018281548110612e9c57fe5b9060005260206000200154905092915050565b6000610b978383613467565b815460009081908310612ee05760405162461bcd60e51b815260040161098690614715565b6000846000018481548110612ef157fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008281526001840160205260408120548281612f475760405162461bcd60e51b81526004016109869190613f6b565b50846000016001820381548110612f5a57fe5b9060005260206000209060020201600101549150509392505050565b8051610e8e9060709060208401906136fe565b6000612f9d846001600160a01b0316613068565b612fa9575060016120c2565b6000613031630a85bd0160e11b612fbe611fc8565b888787604051602401612fd49493929190613eef565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001614c24603291396001600160a01b038816919061353b565b90506000818060200190518101906130499190613d3d565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b3b151590565b6001600160e01b031980821614156130985760405162461bcd60e51b815260040161098690614219565b6001600160e01b0319166000908152603360205260409020805460ff19166001179055565b600054610100900460ff16806130d657506130d66123a2565b806130e4575060005460ff16155b6131005760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff16158015612431576000805460ff1961ff0019909116610100171660011790558015611145576000805461ff001916905550565b600054610100900460ff168061315757506131576123a2565b80613165575060005460ff16155b6131815760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff161580156131ac576000805460ff1961ff0019909116610100171660011790555b6124316301ffc9a760e01b61306e565b600054610100900460ff16806131d557506131d56123a2565b806131e3575060005460ff16155b6131ff5760405162461bcd60e51b8152600401610986906146c7565b600054610100900460ff1615801561322a576000805460ff1961ff0019909116610100171660011790555b825161323d90606c9060208601906136fe565b50815161325190606d9060208501906136fe565b506132626380ac58cd60e01b61306e565b613272635b5e139f60e01b61306e565b61328263780e9d6360e01b61306e565b8015610a3e576000805461ff0019169055505050565b606f55565b607191909155607255565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561337c57835460001980830191908101906000908790839081106132f357fe5b906000526020600020015490508087600001848154811061331057fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061334057fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610b9a565b6000915050610b9a565b600061339283836132a8565b6133c857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b9a565b506000610b9a565b6000828152600184016020526040812054806134355750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556122dd565b8285600001600183038154811061344857fe5b90600052602060002090600202016001018190555060009150506122dd565b6000818152600183016020526040812054801561337c578354600019808301919081019060009087908390811061349a57fe5b90600052602060002090600202019050808760000184815481106134ba57fe5b6000918252602080832084546002909302019182556001938401549184019190915583548252898301905260409020908401905586548790806134f957fe5b6000828152602080822060026000199094019384020182815560019081018390559290935588815289820190925260408220919091559450610b9a9350505050565b60606122da84846000858561354f85613068565b61356b5760405162461bcd60e51b815260040161098690614a64565b600080866001600160a01b031685876040516135879190613e09565b60006040518083038185875af1925050503d80600081146135c4576040519150601f19603f3d011682016040523d82523d6000602084013e6135c9565b606091505b50915091506135d98282866135e4565b979650505050505050565b606083156135f35750816122dd565b8251156136035782518084602001fd5b8160405162461bcd60e51b81526004016109869190613f6b565b50805460018160011615610100020316600290046000825580601f106136435750611145565b601f0160209004906000526020600020908101906111459190613782565b82600981019282156136a1579160200282015b828111156136a157825180516136919184916020909101906136fe565b5091602001919060010190613674565b506136ad929150613797565b5090565b8280548282559060005260206000209081019282156136a1579160200282015b828111156136a157825180516136ee9184916020909101906136fe565b50916020019190600101906136d1565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613734576000855561377a565b82601f1061374d57805160ff191683800117855561377a565b8280016001018555821561377a579182015b8281111561377a57825182559160200191906001019061375f565b506136ad9291505b5b808211156136ad5760008155600101613783565b808211156136ad5760006137ab828261361d565b50600101613797565b600067ffffffffffffffff8311156137c857fe5b6137db601f8401601f1916602001614b7c565b90508281528383830111156137ef57600080fd5b828260208301376000602084830101529392505050565b80356108c381614bea565b600082601f830112613821578081fd5b8135602061383661383183614ba0565b614b7c565b8281528181019085830183850287018401881015613852578586fd5b855b8581101561387957813561386781614bff565b84529284019290840190600101613854565b5090979650505050505050565b600082601f830112613896578081fd5b604051610120810181811067ffffffffffffffff821117156138b457fe5b6040528083835b60098110156138e6576138d18783358801613951565b835260209283019291909101906001016138bb565b509195945050505050565b600082601f830112613901578081fd5b8135602061391161383183614ba0565b82815281810190858301855b8581101561387957613934898684358b0101613951565b8452928401929084019060010161391d565b80356108c381614bff565b600082601f830112613961578081fd5b610b97838335602085016137b4565b600060208284031215613981578081fd5b8135610b9781614bea565b60006020828403121561399d578081fd5b8151610b9781614bea565b6000806000806000806000806000806101408b8d0312156139c7578586fd5b6139d08b613806565b995060208b013567ffffffffffffffff808211156139ec578788fd5b6139f88e838f01613951565b9a5060408d0135915080821115613a0d578788fd5b613a198e838f01613951565b995060608d0135985060808d0135975060a08d01359650613a3c60c08e01613946565b9550613a4a60e08e01613806565b94506101008d0135915080821115613a60578384fd5b613a6c8e838f016138f1565b93506101208d0135915080821115613a82578283fd5b50613a8f8d828e01613886565b9150509295989b9194979a5092959850565b60008060408385031215613ab3578182fd5b8235613abe81614bea565b91506020830135613ace81614bea565b809150509250929050565b600080600060608486031215613aed578081fd5b8335613af881614bea565b92506020840135613b0881614bea565b929592945050506040919091013590565b60008060008060808587031215613b2e578182fd5b8435613b3981614bea565b93506020850135613b4981614bea565b925060408501359150606085013567ffffffffffffffff811115613b6b578182fd5b8501601f81018713613b7b578182fd5b613b8a878235602084016137b4565b91505092959194509250565b60008060408385031215613ba8578182fd5b8235613bb381614bea565b91506020830135613ace81614bff565b60008060408385031215613bd5578182fd5b8235613be081614bea565b946020939093013593505050565b600080600060608486031215613c02578081fd5b8335613c0d81614bea565b925060208401359150604084013567ffffffffffffffff811115613c2f578182fd5b613c3b86828701613951565b9150509250925092565b60008060408385031215613c57578182fd5b823567ffffffffffffffff80821115613c6e578384fd5b818501915085601f830112613c81578384fd5b81356020613c9161383183614ba0565b82815281810190858301838502870184018b1015613cad578889fd5b8896505b84871015613cd8578035613cc481614bea565b835260019690960195918301918301613cb1565b5096505086013592505080821115613cee578283fd5b50613cfb85828601613811565b9150509250929050565b600060208284031215613d16578081fd5b8151610b9781614bff565b600060208284031215613d32578081fd5b8135610b9781614c0d565b600060208284031215613d4e578081fd5b8151610b9781614c0d565b600060208284031215613d6a578081fd5b813567ffffffffffffffff811115613d80578182fd5b6120c284828501613951565b600060208284031215613d9d578081fd5b5035919050565b600060208284031215613db5578081fd5b5051919050565b60008060408385031215613dce578182fd5b50508035926020909101359150565b60008151808452613df5816020860160208601614bbe565b601f01601f19169290920160200192915050565b60008251613e1b818460208701614bbe565b9190910192915050565b6000808454600180821660008114613e445760018114613e5b57613e8a565b60ff198316865260028304607f1686019350613e8a565b600283048886526020808720875b83811015613e825781548a820152908501908201613e69565b505050860193505b5050508351613e9d818360208801614bbe565b01949350505050565b64045524332360dc1b815260050190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613f2290830184613ddd565b9695505050505050565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252610b976020830184613ddd565b600060608252613f916060830186613ddd565b602083820381850152818651808452828401915082838202850101838901865b83811015613fdf57601f19878403018552613fcd838351613ddd565b94860194925090850190600101613fb1565b50508681036040880152935050610120830190508583855b6009811015614022578184038652614010848451613ddd565b95850195935091840191600101613ff7565b50919998505050505050505050565b60006101208083526140458184018d613ddd565b90508281036020840152614059818c613ddd565b9050828103604084015261406d818b613ddd565b90508281036060840152614081818a613ddd565b905082810360808401526140958189613ddd565b905082810360a08401526140a98188613ddd565b905082810360c08401526140bd8187613ddd565b905082810360e08401526140d18186613ddd565b90508281036101008401526140e68185613ddd565b9c9b505050505050505050505050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526029908201527f4e46543732314d696e74203a20555345525f414444524553535f4e4f545f5748604082015268125511531254d5115160ba1b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4e465437323143726561746f723a2043616c6c6572206973206e6f742063726560408201526330ba37b960e11b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f4e46543732314d696e74203a20535550504c595f4c494d49545f5245414348456040820152601160fa1b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526023908201527f4552433732313a20546f6b656e2063616e6e6f74206265207472616e736665726040820152621c995960ea1b606082015260800190565b6020808252601d908201527f4e46543732314d696e74203a204d494e54494e475f4e4f545f4c495645000000604082015260600190565b6020808252601d908201527f4e46543732314d696e743a204e4f545f42554444595f41444452455353000000604082015260600190565b6020808252601e908201527f4552433732313a20546f6b656e20756e6c6f636b656420616c72656164790000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526026908201527f416d6f756e74206e6f742077697468696e20646576696174696f6e2070657263604082015265656e7461676560d01b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526023908201527f44726f7073436f6c6c656374696f6e203a205055424c49435f434f4c4c45435460408201526224a7a760e91b606082015260800190565b6020808252601c908201527f4552433732313a20546f6b656e206c6f636b656420616c726561647900000000604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526027908201527f54726561737572794e6f64653a2041646472657373206973206e6f74206120636040820152661bdb9d1c9858dd60ca1b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f4e46543732314d696e74203a2043616c6c6572206973206e6f7420746865206f6040820152633bb732b960e11b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252601a908201527f4e46543732314d696e74203a204d494e54494e475f454e444544000000000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526010908201526f2a3930b739b332b9103330b4b632b21760811b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601e908201527f4e465437323143726561746f723a20546f6b656e206973206c6f636b65640000604082015260600190565b6020808252602a908201527f4e465437323143726561746f723a2043616c6c657220646f6573206e6f74206f6040820152691ddb881d1a194813919560b21b606082015260800190565b60208082526027908201527f4e46543732314d696e74203a205061796d656e74546f6b656e204e6f742053756040820152661c1c1bdc9d195960ca1b606082015260800190565b90815260200190565b9182521515602082015260400190565b60405181810167ffffffffffffffff81118282101715614b9857fe5b604052919050565b600067ffffffffffffffff821115614bb457fe5b5060209081020190565b60005b83811015614bd9578181015183820152602001614bc1565b838111156118dd5750506000910152565b6001600160a01b038116811461114557600080fd5b801515811461114557600080fd5b6001600160e01b03198116811461114557600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212205c826f76995a9fa520213ad89fc1c64875a42907743e708b070d4cc8f8f6244e64736f6c63430007060033
Deployed Bytecode Sourcemap
84928:3694:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11345:200;;;;;;;;;;-1:-1:-1;11345:200:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60228:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;64316:291::-;;;;;;;;;;-1:-1:-1;64316:291:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63846:404::-;;;;;;;;;;-1:-1:-1;63846:404:0;;;;;:::i;:::-;;:::i;:::-;;60556:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;63245:257::-;;;;;;;;;;;;;:::i;65341:456::-;;;;;;;;;;-1:-1:-1;65341:456:0;;;;;:::i;:::-;;:::i;87576:226::-;;;;;;;;;;-1:-1:-1;87576:226:0;;;;;:::i;:::-;;:::i;62974:195::-;;;;;;;;;;-1:-1:-1;62974:195:0;;;;;:::i;:::-;;:::i;88193:426::-;;;;;;;;;;-1:-1:-1;88193:426:0;;;;;:::i;:::-;;:::i;55616:21::-;;;;;;;;;;;;;:::i;66110:304::-;;;;;;;;;;-1:-1:-1;66110:304:0;;;;;:::i;:::-;;:::i;78447:160::-;;;;;;;;;;-1:-1:-1;78447:160:0;;;;;:::i;:::-;;:::i;66487:185::-;;;;;;;;;;-1:-1:-1;66487:185:0;;;;;:::i;:::-;;:::i;78945:177::-;;;;;;;;;;-1:-1:-1;78945:177:0;;;;;:::i;:::-;;:::i;55147:38::-;;;;;;;;;;-1:-1:-1;55147:38:0;;;;;:::i;:::-;;:::i;63579:205::-;;;;;;;;;;-1:-1:-1;63579:205:0;;;;;:::i;:::-;;:::i;55796:34::-;;;;;;;;;;;;;:::i;59930:231::-;;;;;;;;;;-1:-1:-1;59930:231:0;;;;;:::i;:::-;;:::i;86548:229::-;;;;;;;;;;-1:-1:-1;86548:229:0;;;;;:::i;:::-;;:::i;55671:30::-;;;;;;;;;;;;;:::i;86865:138::-;;;;;;;;;;-1:-1:-1;86865:138:0;;;;;:::i;:::-;;:::i;62801:89::-;;;;;;;;;;;;;:::i;59616:252::-;;;;;;;;;;-1:-1:-1;59616:252:0;;;;;:::i;:::-;;:::i;30786:103::-;;;;;;;;;;;;;:::i;86361:110::-;;;;;;;;;;-1:-1:-1;86361:110:0;;;;;:::i;:::-;;:::i;83854:85::-;;;;;;;;;;;;;:::i;30135:87::-;;;;;;;;;;;;;:::i;60389:96::-;;;;;;;;;;;;;:::i;64679:327::-;;;;;;;;;;-1:-1:-1;64679:327:0;;;;;:::i;:::-;;:::i;87315:186::-;;;;;;;;;;-1:-1:-1;87315:186:0;;;;;:::i;:::-;;:::i;79954:49::-;;;;;;;;;;-1:-1:-1;79954:49:0;;;;;:::i;:::-;;:::i;60860:794::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;66743:447::-;;;;;;;;;;-1:-1:-1;66743:447:0;;;;;:::i;:::-;;:::i;85286:902::-;;;;;;;;;;-1:-1:-1;85286:902:0;;;;;:::i;:::-;;:::i;55731:27::-;;;;;;;;;;;;;:::i;55088:50::-;;;;;;;;;;-1:-1:-1;55088:50:0;;;;;:::i;:::-;;:::i;60712:83::-;;;;;;;;;;;;;:::i;87893:207::-;;;;;;;;;;-1:-1:-1;87893:207:0;;;;;:::i;:::-;;:::i;61725:833::-;;;;;;;;;;-1:-1:-1;61725:833:0;;;;;:::i;:::-;;:::i;83701:93::-;;;;;;;;;;;;;:::i;84257:454::-;;;;;;:::i;:::-;;:::i;65805:297::-;;;;;;;;;;-1:-1:-1;65805:297:0;;;;;:::i;:::-;;:::i;65077:197::-;;;;;;;;;;-1:-1:-1;65077:197:0;;;;;:::i;:::-;;:::i;80010:50::-;;;;;;;;;;-1:-1:-1;80010:50:0;;;;;:::i;:::-;;:::i;55940:36::-;;;;;;;;;;-1:-1:-1;55940:36:0;;;;;:::i;:::-;;:::i;31044:238::-;;;;;;;;;;-1:-1:-1;31044:238:0;;;;;:::i;:::-;;:::i;82828:345::-;;;;;;;;;;-1:-1:-1;82828:345:0;;;;;:::i;:::-;;:::i;87089:218::-;;;;;;;;;;-1:-1:-1;87089:218:0;;;;;:::i;:::-;;:::i;76729:100::-;;;;;;;;;;;;;:::i;11345:200::-;-1:-1:-1;;;;;;11504:33:0;;11475:4;11504:33;;;:20;:33;;;;;;;;11345:200;;;;:::o;60228:92::-;60307:5;60300:12;;;;;;;;;;;;;-1:-1:-1;;60300:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;60274:13;;60300:12;;60307:5;;60300:12;;;60307:5;60300:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60228:92;;:::o;64316:291::-;64420:7;64467:16;64475:7;64467;:16::i;:::-;64445:110;;;;-1:-1:-1;;;64445:110:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;64575:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;64575:24:0;;64316:291::o;63846:404::-;63927:13;63943:16;63951:7;63943;:16::i;:::-;63927:32;-1:-1:-1;;;;;;63978:11:0;;;;;;;;63970:57;;;;-1:-1:-1;;;63970:57:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;64062:21:0;;:12;:10;:12::i;:::-;-1:-1:-1;;;;;64062:21:0;;;:62;;;64087:37;64104:5;64111:12;:10;:12::i;64087:37::-;64040:168;;;;-1:-1:-1;;;64040:168:0;;;;;;;:::i;:::-;64221:21;64230:2;64234:7;64221:8;:21::i;:::-;63846:404;;;:::o;60556:87::-;60625:10;;60556:87;:::o;63245:257::-;63298:7;63417;;63428:1;63417:12;63413:56;;;63448:21;:12;:19;:21::i;:::-;63441:28;;;;63413:56;-1:-1:-1;63487:7:0;;63245:257;:::o;65341:456::-;65550:41;65569:12;:10;:12::i;:::-;65583:7;65550:18;:41::i;:::-;65528:140;;;;-1:-1:-1;;;65528:140:0;;;;;;;:::i;:::-;65687:15;;;;:6;:15;;;;;;;;:22;65679:69;;;;-1:-1:-1;;;65679:69:0;;;;;;;:::i;:::-;65761:28;65771:4;65777:2;65781:7;65761:9;:28::i;87576:226::-;30366:12;:10;:12::i;:::-;-1:-1:-1;;;;;30355:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30355:23:0;;30347:68;;;;-1:-1:-1;;;30347:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;87697:31:0;::::1;;::::0;;;:18:::1;:31;::::0;;;;;;:41;;-1:-1:-1;;87697:41:0::1;::::0;::::1;;;::::0;;87754:40;::::1;::::0;::::1;::::0;87697:41;;87754:40:::1;:::i;:::-;;;;;;;;87576:226:::0;;:::o;62974:195::-;-1:-1:-1;;;;;63131:20:0;;63099:7;63131:20;;;:13;:20;;;;;:30;;63155:5;63131:23;:30::i;:::-;63124:37;;62974:195;;;;;:::o;88193:426::-;30366:12;:10;:12::i;:::-;-1:-1:-1;;;;;30355:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30355:23:0;;30347:68;;;;-1:-1:-1;;;30347:68:0;;;;;;;:::i;:::-;88340:9:::1;::::0;::::1;;:17;;:9:::0;:17:::1;88332:65;;;::::0;-1:-1:-1;;;88332:65:0;;::::1;::::0;::::1;;;:::i;:::-;88413:9;88408:204;88432:19;:26;88428:1;:30;88408:204;;;88525:7;88533:1;88525:10;;;;;;;;;;;;;;88480:18;:42;88499:19;88519:1;88499:22;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;88480:42:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;88480:42:0;:55;;-1:-1:-1;;88480:55:0::1;::::0;::::1;;::::0;;;::::1;::::0;;88565:22;;88555:45:::1;::::0;88565:22;;88585:1;;88565:22;::::1;;;;;;;;;;;88589:7;88597:1;88589:10;;;;;;;;;;;;;;88555:45;;;;;;;:::i;:::-;;;;;;;;88460:3;;88408:204;;55616:21:::0;;;;;;:::o;66110:304::-;57965:12;;-1:-1:-1;;;;;57965:12:0;57951:10;:26;57943:67;;;;-1:-1:-1;;;57943:67:0;;;;;;;:::i;:::-;66190:16:::1;66198:7;66190;:16::i;:::-;66182:72;;;::::0;-1:-1:-1;;;66182:72:0;;::::1;::::0;::::1;;;:::i;:::-;66273:15;::::0;;;:6:::1;:15;::::0;;;;;::::1;;:23;;:15:::0;:23:::1;66265:66;;;::::0;-1:-1:-1;;;66265:66:0;;::::1;::::0;::::1;;;:::i;:::-;66360:5;66342:15:::0;;;:6:::1;:15;::::0;;;;;:23;;-1:-1:-1;;66342:23:0::1;::::0;;66383;::::1;::::0;::::1;::::0;66342:15;;66360:5;66383:23:::1;:::i;:::-;;;;;;;;66110:304:::0;:::o;78447:160::-;78534:15;78574:25;;;:16;:25;;;;;;-1:-1:-1;;;;;78574:25:0;;78447:160::o;66487:185::-;66625:39;66642:4;66648:2;66652:7;66625:39;;;;;;;;;;;;:16;:39::i;78945:177::-;77859:25;;;;:16;:25;;;;;;;;-1:-1:-1;;;;;77859:25:0;77888:10;77859:39;77837:125;;;;-1:-1:-1;;;77837:125:0;;;;;;;:::i;:::-;78015:10;77995:16;78003:7;77995;:16::i;:::-;-1:-1:-1;;;;;77995:30:0;;77973:122;;;;-1:-1:-1;;;77973:122:0;;;;;;;:::i;:::-;79031:15:::1;::::0;;;:6:::1;:15;::::0;;;;;::::1;;:24;79023:66;;;::::0;-1:-1:-1;;;79023:66:0;;::::1;::::0;::::1;;;:::i;:::-;79100:14;79106:7;79100:5;:14::i;:::-;78945:177:::0;;:::o;55147:38::-;;;;;;;;;;;;;;;:::o;63579:205::-;63682:7;;63729:22;:12;63745:5;63729:15;:22::i;:::-;-1:-1:-1;63707:44:0;63579:205;-1:-1:-1;;;63579:205:0:o;55796:34::-;;;;:::o;59930:231::-;59994:7;60034:119;60069:7;60034:119;;;;;;;;;;;;;;;;;:12;;:119;:16;:119::i;86548:229::-;30366:12;:10;:12::i;:::-;-1:-1:-1;;;;;30355:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30355:23:0;;30347:68;;;;-1:-1:-1;;;30347:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;86670:32:0;::::1;;::::0;;;:17:::1;:32;::::0;;;;;;:42;;-1:-1:-1;;86670:42:0::1;::::0;::::1;;;::::0;;86728:41;::::1;::::0;::::1;::::0;86670:42;;86728:41:::1;:::i;55671:30::-:0;;;;;;-1:-1:-1;;;;;55671:30:0;;:::o;86865:138::-;30366:12;:10;:12::i;:::-;-1:-1:-1;;;;;30355:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30355:23:0;;30347:68;;;;-1:-1:-1;;;30347:68:0;;;;;;;:::i;:::-;86936:7:::1;:18:::0;;;86970:25:::1;::::0;::::1;::::0;::::1;::::0;86946:8;;86970:25:::1;:::i;62801:89::-:0;62874:8;62867:15;;;;;;;;;;;;;-1:-1:-1;;62867:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;62841:13;;62867:15;;62874:8;;62867:15;;;62874:8;62867:15;;;;;;;;;;;;;;;;;;;;;;;;59616:252;59680:7;-1:-1:-1;;;;;59722:19:0;;59700:111;;;;-1:-1:-1;;;59700:111:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;59831:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;30786:103::-;30366:12;:10;:12::i;:::-;-1:-1:-1;;;;;30355:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30355:23:0;;30347:68;;;;-1:-1:-1;;;30347:68:0;;;;;;;:::i;:::-;30851:30:::1;30878:1;30851:18;:30::i;:::-;30786:103::o:0;86361:110::-;30366:12;:10;:12::i;:::-;-1:-1:-1;;;;;30355:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30355:23:0;;30347:68;;;;-1:-1:-1;;;30347:68:0;;;;;;;:::i;:::-;86440:23:::1;86455:7;86440:14;:23::i;:::-;86361:110:::0;:::o;83854:85::-;83924:7;;83854:85;:::o;30135:87::-;30208:6;;-1:-1:-1;;;;;30208:6:0;;30135:87::o;60389:96::-;60470:7;60463:14;;;;;;;;;;;;;-1:-1:-1;;60463:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;60437:13;;60463:14;;60470:7;;60463:14;;;60470:7;60463:14;;;;;;;;;;;;;;;;;;;;;;;;64679:327;64826:12;:10;:12::i;:::-;-1:-1:-1;;;;;64814:24:0;;;;;;;64806:62;;;;-1:-1:-1;;;64806:62:0;;;;;;;:::i;:::-;64926:8;64881:18;:32;64900:12;:10;:12::i;:::-;-1:-1:-1;;;;;64881:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;64881:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;64881:53:0;;;;;;;;;;;64965:12;:10;:12::i;:::-;-1:-1:-1;;;;;64950:48:0;;64989:8;64950:48;;;;;;:::i;:::-;;;;;;;;64679:327;;:::o;87315:186::-;30366:12;:10;:12::i;:::-;-1:-1:-1;;;;;30355:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30355:23:0;;30347:68;;;;-1:-1:-1;;;30347:68:0;;;;;;;:::i;:::-;87415:12:::1;:28:::0;;-1:-1:-1;;;;;;87415:28:0::1;-1:-1:-1::0;;;;;87415:28:0;::::1;::::0;;::::1;::::0;;;87459:34:::1;::::0;::::1;::::0;-1:-1:-1;;87459:34:0::1;87315:186:::0;:::o;79954:49::-;;;;;;;;;;;;;;;:::o;60860:794::-;61326:18;61304:342;;;;;;61417:1;61381;61304:342;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;60954:20;;;;;;;;;;;;;;;;;;61326:18;61362:21;;61398;;61434;;61470;;61506;;61542;;61578;;61614;;61304:342;61326:18;;61304:342;;;61326:18;61304:342;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61304:342:0;;-1:-1:-1;61304:342:0;-1:-1:-1;61304:342:0;;;-1:-1:-1;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61304:342:0;;-1:-1:-1;61304:342:0;-1:-1:-1;61304:342:0;;;-1:-1:-1;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61304:342:0;;-1:-1:-1;61304:342:0;-1:-1:-1;61304:342:0;;;-1:-1:-1;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61304:342:0;;-1:-1:-1;61304:342:0;-1:-1:-1;61304:342:0;;;-1:-1:-1;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61304:342:0;;-1:-1:-1;61304:342:0;-1:-1:-1;61304:342:0;;;-1:-1:-1;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61304:342:0;;-1:-1:-1;61304:342:0;-1:-1:-1;61304:342:0;;;-1:-1:-1;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61304:342:0;;-1:-1:-1;61304:342:0;-1:-1:-1;61304:342:0;;;-1:-1:-1;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;-1:-1:-1;;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61304:342:0;;-1:-1:-1;61304:342:0;-1:-1:-1;61304:342:0;;;-1:-1:-1;61304:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60860:794;;;;;;;;;:::o;66743:447::-;66932:41;66951:12;:10;:12::i;:::-;66965:7;66932:18;:41::i;:::-;66910:140;;;;-1:-1:-1;;;66910:140:0;;;;;;;:::i;:::-;67071:15;;;;:6;:15;;;;;;;;:22;67063:69;;;;-1:-1:-1;;;67063:69:0;;;;;;;:::i;:::-;67143:39;67157:4;67163:2;67167:7;67176:5;67143:13;:39::i;:::-;66743:447;;;;:::o;85286:902::-;9539:13;;;;;;;;:33;;;9556:16;:14;:16::i;:::-;9539:50;;;-1:-1:-1;9577:12:0;;;;9576:13;9539:50;9517:146;;;;-1:-1:-1;;;9517:146:0;;;;;;;:::i;:::-;9676:19;9699:13;;;;;;9698:14;9723:101;;;;9758:13;:20;;-1:-1:-1;;;;9758:20:0;;;;;9793:19;9774:4;9793:19;;;9723:101;85660:22:::1;:20;:22::i;:::-;85693:40;:38;:40::i;:::-;85744:34;:32;:34::i;:::-;85789:46;85826:8;85789:36;:46::i;:::-;85846:262;85892:4;85911:6;85932;85953:9;85977:7;85999:11;86025:15;86055:10;86080:17;85846:31;:262::i;:::-;86124:56;86142:6;86150:10;86162:17;86124:56;;;;;;;;:::i;:::-;;;;;;;;9854:14:::0;9850:68;;;9901:5;9885:21;;-1:-1:-1;;9885:21:0;;;9850:68;85286:902;;;;;;;;;;;:::o;55731:27::-;;;-1:-1:-1;;;;;55731:27:0;;:::o;55088:50::-;;;;;;;;;;;;;;;:::o;60712:83::-;60779:8;;60712:83;:::o;87893:207::-;30366:12;:10;:12::i;:::-;-1:-1:-1;;;;;30355:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30355:23:0;;30347:68;;;;-1:-1:-1;;;30347:68:0;;;;;;;:::i;:::-;88003:15:::1;:36:::0;;-1:-1:-1;;;;;;88003:36:0::1;-1:-1:-1::0;;;;;;88003:36:0;::::1;;;::::0;;88055:37:::1;::::0;::::1;::::0;::::1;::::0;88003:36;;88055:37:::1;:::i;61725:833::-:0;61826:13;61879:16;61887:7;61879;:16::i;:::-;61857:113;;;;-1:-1:-1;;;61857:113:0;;;;;;;:::i;:::-;61983:23;62009:19;;;:10;:19;;;;;;;;61983:45;;;;;;;;;;;-1:-1:-1;;61983:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;62009:19;;61983:45;;;62009:19;61983:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62110:8:0;62104:22;61983:45;;-1:-1:-1;;;;62104:22:0;-1:-1:-1;;62104:22:0;;;;;;;;;;;62100:76;;62155:9;-1:-1:-1;62148:16:0;;62100:76;62280:23;;:27;62276:112;;62355:8;62365:9;62338:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62324:52;;;;;62276:112;62520:8;62530:18;:7;:16;:18::i;:::-;62503:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62489:61;;;61725:833;;;:::o;83701:93::-;83775:11;;83701:93;:::o;84257:454::-;80704:10;84412:15;80685:30;;;:18;:30;;;;;;;;:38;;:30;:38;;:60;;-1:-1:-1;80727:9:0;;;;:18;80685:60;80663:151;;;;-1:-1:-1;;;80663:151:0;;;;;;;:::i;:::-;-1:-1:-1;84450:11:0::1;:13:::0;;::::1;::::0;::::1;::::0;;;84474:20:::1;84450:13:::0;84474:11:::1;:20::i;:::-;84505:11;:9;:11::i;:::-;84527:45;84541:12;84555:9;84566:5;84527:13;:45::i;:::-;84583:26;84589:10;84601:7;84583:5;:26::i;:::-;84620:40;84640:7;84649:10;84620:19;:40::i;:::-;84676:27;::::0;84695:7;;84683:10:::1;::::0;84676:27:::1;::::0;;;::::1;84257:454:::0;;;;;:::o;65805:297::-;57965:12;;-1:-1:-1;;;;;57965:12:0;57951:10;:26;57943:67;;;;-1:-1:-1;;;57943:67:0;;;;;;;:::i;:::-;65883:16:::1;65891:7;65883;:16::i;:::-;65875:72;;;::::0;-1:-1:-1;;;65875:72:0;;::::1;::::0;::::1;;;:::i;:::-;65966:15;::::0;;;:6:::1;:15;::::0;;;;;::::1;;:24;65958:65;;;::::0;-1:-1:-1;;;65958:65:0;;::::1;::::0;::::1;;;:::i;:::-;66034:15;::::0;;;:6:::1;:15;::::0;;;;;;:22;;-1:-1:-1;;66034:22:0::1;66052:4;66034:22:::0;;::::1;::::0;;;66074:20;;::::1;::::0;::::1;::::0;66041:7;;66052:4;66074:20:::1;:::i;65077:197::-:0;-1:-1:-1;;;;;65231:25:0;;;65202:4;65231:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;65077:197::o;80010:50::-;;;;;;;;;;;;;;;:::o;55940:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55940:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55940:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31044:238::-;30366:12;:10;:12::i;:::-;-1:-1:-1;;;;;30355:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30355:23:0;;30347:68;;;;-1:-1:-1;;;30347:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31147:22:0;::::1;31125:110;;;::::0;-1:-1:-1;;;31125:110:0;;::::1;::::0;::::1;;;:::i;:::-;31246:28;31265:8;31246:18;:28::i;82828:345::-:0;82944:52;82954:41;82991:3;82955:30;82965:19;;82955:5;:9;;:30;;;;:::i;:::-;82954:36;;:41::i;:::-;82944:5;;:9;:52::i;:::-;82931:9;:65;;:168;;;;;83047:52;83057:41;83094:3;83058:30;83068:19;;83058:5;:9;;:30;;;;:::i;83057:41::-;83047:5;;:9;:52::i;:::-;83017:9;:82;;82931:168;82909:256;;;;-1:-1:-1;;;82909:256:0;;;;;;;:::i;87089:218::-;30366:12;:10;:12::i;:::-;-1:-1:-1;;;;;30355:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30355:23:0;;30347:68;;;;-1:-1:-1;;;30347:68:0;;;;;;;:::i;:::-;87200:19:::1;:42:::0;;;87258:41:::1;::::0;::::1;::::0;::::1;::::0;87222:20;;87258:41:::1;:::i;76729:100::-:0;76813:8;;-1:-1:-1;;;;;76813:8:0;;76729:100::o;68737:119::-;68794:4;68818:30;:12;68840:7;68818:21;:30::i;28677:106::-;28765:10;28677:106;:::o;75028:158::-;75094:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;75094:29:0;-1:-1:-1;;;;;75094:29:0;;;;;;;;:24;;75148:16;75094:24;75148:7;:16::i;:::-;75139:39;;-1:-1:-1;;;;;75139:39:0;;;;;;;;;;75028:158;;:::o;50272:155::-;50368:7;50400:19;50408:3;50400:7;:19::i;69023:428::-;69135:4;69179:16;69187:7;69179;:16::i;:::-;69157:110;;;;-1:-1:-1;;;69157:110:0;;;;;;;:::i;:::-;69278:13;69294:16;69302:7;69294;:16::i;:::-;69278:32;-1:-1:-1;;;;;;69329:16:0;;;;;;;;:64;;-1:-1:-1;;;;;;69362:31:0;;:20;69374:7;69362:11;:20::i;:::-;-1:-1:-1;;;;;69362:31:0;;69329:64;:113;;;;69410:32;69427:5;69434:7;69410:16;:32::i;:::-;69321:122;69023:428;-1:-1:-1;;;;69023:428:0:o;72344:645::-;-1:-1:-1;;;;;72490:24:0;;:16;72498:7;72490;:16::i;:::-;-1:-1:-1;;;;;72490:24:0;;72468:115;;;;-1:-1:-1;;;72468:115:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;72602:16:0;;72594:65;;;;-1:-1:-1;;;72594:65:0;;;;;;;:::i;:::-;72672:39;72693:4;72699:2;72703:7;72672:20;:39::i;:::-;72776:29;72793:1;72797:7;72776:8;:29::i;:::-;-1:-1:-1;;;;;72818:19:0;;;;;;:13;:19;;;;;:35;;72845:7;72818:26;:35::i;:::-;-1:-1:-1;;;;;;72864:17:0;;;;;;:13;:17;;;;;:30;;72886:7;72864:21;:30::i;:::-;-1:-1:-1;72907:29:0;:12;72924:7;72933:2;72907:16;:29::i;:::-;-1:-1:-1;72954:27:0;;72973:7;;-1:-1:-1;;;;;72954:27:0;;;;;;;;;;;;;72344:645;;;:::o;41673:169::-;41771:7;41811:22;41815:3;41827:5;41811:3;:22::i;71459:548::-;71519:13;71535:16;71543:7;71535;:16::i;:::-;71519:32;;71564:48;71585:5;71600:1;71604:7;71564:20;:48::i;:::-;71653:29;71670:1;71674:7;71653:8;:29::i;:::-;71741:19;;;;:10;:19;;;;;71735:33;;;;;;;;-1:-1:-1;;71735:33:0;;;;;:38;71731:97;;71797:19;;;;:10;:19;;;;;71790:26;;;:::i;:::-;-1:-1:-1;;;;;71840:20:0;;;;;;:13;:20;;;;;:36;;71868:7;71840:27;:36::i;:::-;-1:-1:-1;71889:28:0;:12;71909:7;71889:19;:28::i;:::-;-1:-1:-1;71963:36:0;;71991:7;;71987:1;;-1:-1:-1;;;;;71963:36:0;;;;;71987:1;;71963:36;71459:548;;:::o;50775:268::-;50882:7;;;;50947:22;50951:3;50963:5;50947:3;:22::i;:::-;50916:53;;;;-1:-1:-1;50775:268:0;-1:-1:-1;;;;;50775:268:0:o;52157:292::-;52298:7;52380:44;52385:3;52405;52411:12;52380:4;:44::i;:::-;52372:53;-1:-1:-1;52157:292:0;;;;;;:::o;31442:191::-;31535:6;;;-1:-1:-1;;;;;31552:17:0;;;-1:-1:-1;;;;;;31552:17:0;;;;;;;31585:40;;31535:6;;;31552:17;31535:6;;31585:40;;-1:-1:-1;;31585:40:0;31442:191;;:::o;79426:139::-;79494:21;79506:8;79494:11;:21::i;:::-;79533:24;79548:8;79533:24;;;;;;:::i;68072:352::-;68229:28;68239:4;68245:2;68249:7;68229:9;:28::i;:::-;68290:48;68313:4;68319:2;68323:7;68332:5;68290:22;:48::i;:::-;68268:148;;;;-1:-1:-1;;;68268:148:0;;;;;;;:::i;10018:125::-;10066:4;10091:44;10129:4;10091:29;:44::i;:::-;10090:45;10083:52;;10018:125;:::o;29958:96::-;9539:13;;;;;;;;:33;;;9556:16;:14;:16::i;:::-;9539:50;;;-1:-1:-1;9577:12:0;;;;9576:13;9539:50;9517:146;;;;-1:-1:-1;;;9517:146:0;;;;;;;:::i;:::-;9676:19;9699:13;;;;;;9698:14;9723:101;;;;9758:13;:20;;-1:-1:-1;;;;9758:20:0;;;;;9793:19;9774:4;9793:19;;;9723:101;30014:32:::1;30033:12;:10;:12::i;:::-;30014:18;:32::i;:::-;9854:14:::0;9850:68;;;-1:-1:-1;9901:5:0;9885:21;;-1:-1:-1;;9885:21:0;;;29958:96::o;78234:120::-;9539:13;;;;;;;;:33;;;9556:16;:14;:16::i;:::-;9539:50;;;-1:-1:-1;9577:12:0;;;;9576:13;9539:50;9517:146;;;;-1:-1:-1;;;9517:146:0;;;;;;;:::i;:::-;9676:19;9699:13;;;;;;9698:14;9723:101;;;;9758:13;:20;;-1:-1:-1;;;;9758:20:0;;;;;9793:19;9774:4;9793:19;;;9723:101;78302:44:::1;-1:-1:-1::0;;;78302:18:0::1;:44::i;84047:135::-:0;9539:13;;;;;;;;:33;;;9556:16;:14;:16::i;:::-;9539:50;;;-1:-1:-1;9577:12:0;;;;9576:13;9539:50;9517:146;;;;-1:-1:-1;;;9517:146:0;;;;;;;:::i;:::-;9676:19;9699:13;;;;;;9698:14;9723:101;;;;9758:13;:20;;-1:-1:-1;;;;9758:20:0;;;;;9793:19;9774:4;9793:19;;;9723:101;84173:1:::1;84159:11;:15:::0;9850:68;;;;-1:-1:-1;9901:5:0;9885:21;;-1:-1:-1;;9885:21:0;;;84047:135::o;76379:265::-;9539:13;;;;;;;;:33;;;9556:16;:14;:16::i;:::-;9539:50;;;-1:-1:-1;9577:12:0;;;;9576:13;9539:50;9517:146;;;;-1:-1:-1;;;9517:146:0;;;;;;;:::i;:::-;9676:19;9699:13;;;;;;9698:14;9723:101;;;;9758:13;:20;;-1:-1:-1;;;;9758:20:0;;;;;9793:19;9774:4;9793:19;;;9723:101;76516:22:::1;-1:-1:-1::0;;;;;76516:20:0;::::1;;:22::i;:::-;76494:111;;;::::0;-1:-1:-1;;;76494:111:0;;::::1;::::0;::::1;;;:::i;:::-;76616:8;:20:::0;;-1:-1:-1;;;;;;76616:20:0::1;-1:-1:-1::0;;;;;76616:20:0;::::1;;::::0;;9850:68;;;;-1:-1:-1;;9901:5:0;9885:21;;-1:-1:-1;;9885:21:0;;;76379:265::o;58154:718::-;9539:13;;;;;;;;:33;;;9556:16;:14;:16::i;:::-;9539:50;;;-1:-1:-1;9577:12:0;;;;9576:13;9539:50;9517:146;;;;-1:-1:-1;;;9517:146:0;;;;;;;:::i;:::-;9676:19;9699:13;;;;;;9698:14;9723:101;;;;9758:13;:20;;-1:-1:-1;;;;9758:20:0;;;;;9793:19;9774:4;9793:19;;;9723:101;58505:26:::1;:24;:26::i;:::-;58542:25;:23;:25::i;:::-;58578:39;58602:5;58609:7;58578:23;:39::i;:::-;58628:22;58642:7;58628:13;:22::i;:::-;58661:30;58670:10;58682:8;58661;:30::i;:::-;58702:9;:22:::0;;-1:-1:-1;;58702:22:0::1;::::0;::::1;;;-1:-1:-1::0;;;;;;58735:34:0::1;-1:-1:-1::0;;;;;;58735:34:0;::::1;;;::::0;;58780:39:::1;:18;58801::::0;58780:39:::1;;:::i;:::-;-1:-1:-1::0;58830:34:0;;::::1;::::0;:20:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;:::-;;9854:14:::0;9850:68;;;9901:5;9885:21;;-1:-1:-1;;9885:21:0;;;9850:68;58154:718;;;;;;;;;;:::o;52737:748::-;52793:13;53014:10;53010:53;;-1:-1:-1;53041:10:0;;;;;;;;;;;;-1:-1:-1;;;53041:10:0;;;;;;53010:53;53088:5;53073:12;53129:78;53136:9;;53129:78;;53162:8;;53193:2;53185:10;;;;53129:78;;;53217:19;53249:6;53239:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53239:17:0;-1:-1:-1;53311:5:0;;-1:-1:-1;53217:39:0;-1:-1:-1;;;53283:10:0;;53327:119;53334:9;;53327:119;;53404:2;53397:4;:9;53391:2;:16;53378:31;;53360:6;53367:7;;;;;;;53360:15;;;;;;;;-1:-1:-1;;;;;;53360:49:0;;;;;;;;;:15;;;:49;-1:-1:-1;53432:2:0;53424:10;;;;53327:119;;;-1:-1:-1;53470:6:0;52737:748;-1:-1:-1;;;;52737:748:0:o;80904:179::-;80971:7;;:12;80967:109;;81019:7;;81008;:18;;81000:64;;;;-1:-1:-1;;;81000:64:0;;;;;;;:::i;83234:384::-;83284:8;;:11;83280:331;;83344:15;83330:10;;:29;;:60;;;;;83382:8;;83363:15;:27;;83330:60;83308:136;;;;-1:-1:-1;;;83308:136:0;;;;;;;:::i;:::-;83280:331;;;83522:15;83508:10;;:29;;83486:113;;;;-1:-1:-1;;;83486:113:0;;;;;;;:::i;81138:1682::-;81277:25;81305:18;:16;:18::i;:::-;81277:46;;81415:27;;;;;;;:::i;:::-;;;;;;;;;;;;;81405:38;;;;;;81380:5;81362:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;81352:36;;;;;;:91;81334:1479;;;-1:-1:-1;;;;;81496:31:0;;;;;;:17;:31;;;;;;;;:39;;-1:-1:-1;81496:39:0;81470:140;;;;-1:-1:-1;;;81470:140:0;;;;;;;:::i;:::-;81655:15;;81625:13;;81655:15;;;-1:-1:-1;;;;;81655:15:0;81641:45;81705:12;81736;:10;:12::i;:::-;81641:122;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81625:138;-1:-1:-1;;;;;;81782:26:0;;;81778:478;;81829:32;81844:9;81855:5;81829:14;:32::i;:::-;-1:-1:-1;;;;;81880:33:0;;;81936:10;81969:18;:16;:18::i;:::-;82010:9;81880:158;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81778:478;;;82079:32;82094:9;82105:5;82079:14;:32::i;:::-;82149:36;;82131:12;;-1:-1:-1;;;;;82149:14:0;;;82171:9;;82149:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82130:55;;;82212:7;82204:36;;;;-1:-1:-1;;;82204:36:0;;;;;;;:::i;:::-;81778:478;;81334:1479;;;;-1:-1:-1;;;;;82314:32:0;;;;;;:18;:32;;;;;;;;:40;;-1:-1:-1;82314:40:0;82288:141;;;;-1:-1:-1;;;82288:141:0;;;;;;;:::i;:::-;82505:51;;-1:-1:-1;;;82505:51:0;;-1:-1:-1;;;;;82505:40:0;;;;;:51;;82546:9;;82505:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;82470:86:0;:10;:86;82444:184;;;;-1:-1:-1;;;82444:184:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;82643:49:0;;;82711:10;82740:18;:16;:18::i;:::-;82777:9;82643:158;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81138:1682;;;;:::o;70788:442::-;-1:-1:-1;;;;;70868:16:0;;70860:61;;;;-1:-1:-1;;;70860:61:0;;;;;;;:::i;:::-;70941:16;70949:7;70941;:16::i;:::-;70940:17;70932:58;;;;-1:-1:-1;;;70932:58:0;;;;;;;:::i;:::-;71003:45;71032:1;71036:2;71040:7;71003:20;:45::i;:::-;-1:-1:-1;;;;;71061:17:0;;;;;;:13;:17;;;;;:30;;71083:7;71061:21;:30::i;:::-;-1:-1:-1;71104:29:0;:12;71121:7;71130:2;71104:16;:29::i;:::-;-1:-1:-1;71189:33:0;;71214:7;;-1:-1:-1;;;;;71189:33:0;;;71206:1;;71189:33;;71206:1;;71189:33;70788:442;;:::o;78615:230::-;78745:25;;;;:16;:25;;;;;;;78725:64;;78745:25;;-1:-1:-1;;;;;78725:64:0;;;;78745:25;;78725:64;;78745:25;78725:64;78802:25;;;;:16;:25;;;;;;:35;;-1:-1:-1;;;;;;78802:35:0;-1:-1:-1;;;;;78802:35:0;;;;;;;;;78615:230::o;23922:220::-;23980:7;24004:6;24000:20;;-1:-1:-1;24019:1:0;24012:8;;24000:20;24043:5;;;24047:1;24043;:5;:1;24067:5;;;;;:10;24059:56;;;;-1:-1:-1;;;24059:56:0;;;;;;;:::i;24620:153::-;24678:7;24710:1;24706;:5;24698:44;;;;-1:-1:-1;;;24698:44:0;;;;;;;:::i;:::-;24764:1;24760;:5;;;;;;;24620:153;-1:-1:-1;;;24620:153:0:o;23505:158::-;23563:7;23596:1;23591;:6;;23583:49;;;;-1:-1:-1;;;23583:49:0;;;;;;;:::i;:::-;-1:-1:-1;23650:5:0;;;23505:158::o;23043:179::-;23101:7;23133:5;;;23157:6;;;;23149:46;;;;-1:-1:-1;;;23149:46:0;;;;;;;:::i;50001:183::-;50112:4;50141:35;50151:3;50171;50141:9;:35::i;46617:110::-;46700:19;;46617:110::o;40695:160::-;40783:4;40812:35;40820:3;40840:5;40812:7;:35::i;40388:131::-;40455:4;40479:32;40484:3;40504:5;40479:4;:32::i;49367:219::-;49490:4;49514:64;49519:3;49539;-1:-1:-1;;;;;49553:23:0;;49514:4;:64::i;36339:273::-;36480:18;;36433:7;;36480:26;-1:-1:-1;36458:110:0;;;;-1:-1:-1;;;36458:110:0;;;;;;;:::i;:::-;36586:3;:11;;36598:5;36586:18;;;;;;;;;;;;;;;;36579:25;;36339:273;;;;:::o;49752:165::-;49847:4;49876:33;49884:3;49904;49876:7;:33::i;47092:348::-;47242:19;;47186:7;;;;47242:27;-1:-1:-1;47220:111:0;;;;-1:-1:-1;;;47220:111:0;;;;;;;:::i;:::-;47344:22;47369:3;:12;;47382:5;47369:19;;;;;;;;;;;;;;;;;;47344:44;;47407:5;:10;;;47419:5;:12;;;47399:33;;;;;47092:348;;;;;:::o;48690:353::-;48818:7;48857:17;;;:12;;;:17;;;;;;48908:12;48893:13;48885:36;;;;-1:-1:-1;;;48885:36:0;;;;;;;;:::i;:::-;;48975:3;:12;;48999:1;48988:8;:12;48975:26;;;;;;;;;;;;;;;;;;:33;;;48968:40;;;48690:353;;;;;:::o;73650:100::-;73723:19;;;;:8;;:19;;;;;:::i;74315:705::-;74470:4;74492:15;-1:-1:-1;;;;;74492:13:0;;;:15::i;:::-;74487:60;;-1:-1:-1;74531:4:0;74524:11;;74487:60;74557:23;74583:324;-1:-1:-1;;;74729:12:0;:10;:12::i;:::-;74760:4;74783:7;74809:5;74613:216;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;74613:216:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;74613:216:0;-1:-1:-1;;;;;;74613:216:0;;;;;;;;;;74583:324;;;;;;;;;;;;74613:216;;74583:324;;;;;;;;-1:-1:-1;;;;;74583:15:0;;;;;:324::i;:::-;74557:350;;74918:13;74945:10;74934:32;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;74985:26:0;-1:-1:-1;;;74985:26:0;;;-1:-1:-1;;;;;;;74315:705:0:o;5390:444::-;5770:20;5818:8;;;5390:444::o;11952:201::-;-1:-1:-1;;;;;;12036:25:0;;;;;12028:66;;;;-1:-1:-1;;;12028:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;12105:33:0;;;;;:20;:33;;;;;:40;;-1:-1:-1;;12105:40:0;-1:-1:-1;12105:40:0;;;11952:201::o;28610:59::-;9539:13;;;;;;;;:33;;;9556:16;:14;:16::i;:::-;9539:50;;;-1:-1:-1;9577:12:0;;;;9576:13;9539:50;9517:146;;;;-1:-1:-1;;;9517:146:0;;;;;;;:::i;:::-;9676:19;9699:13;;;;;;9698:14;9723:101;;;;9758:13;:20;;-1:-1:-1;;;;9758:20:0;;;;;9793:19;9774:4;9793:19;;;9854:14;9850:68;;;-1:-1:-1;9901:5:0;9885:21;;-1:-1:-1;;9885:21:0;;;28610:59::o;10935:253::-;9539:13;;;;;;;;:33;;;9556:16;:14;:16::i;:::-;9539:50;;;-1:-1:-1;9577:12:0;;;;9576:13;9539:50;9517:146;;;;-1:-1:-1;;;9517:146:0;;;;;;;:::i;:::-;9676:19;9699:13;;;;;;9698:14;9723:101;;;;9758:13;:20;;-1:-1:-1;;;;9758:20:0;;;;;9793:19;9774:4;9793:19;;;9723:101;11140:40:::1;-1:-1:-1::0;;;11140:18:0::1;:40::i;58973:434::-:0;9539:13;;;;;;;;:33;;;9556:16;:14;:16::i;:::-;9539:50;;;-1:-1:-1;9577:12:0;;;;9576:13;9539:50;9517:146;;;;-1:-1:-1;;;9517:146:0;;;;;;;:::i;:::-;9676:19;9699:13;;;;;;9698:14;9723:101;;;;9758:13;:20;;-1:-1:-1;;;;9758:20:0;;;;;9793:19;9774:4;9793:19;;;9723:101;59105:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;59129:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;59237:40:0::1;-1:-1:-1::0;;;59237:18:0::1;:40::i;:::-;59288:49;-1:-1:-1::0;;;59288:18:0::1;:49::i;:::-;59348:51;-1:-1:-1::0;;;59348:18:0::1;:51::i;:::-;9854:14:::0;9850:68;;;-1:-1:-1;;9901:5:0;9885:21;;-1:-1:-1;;9885:21:0;;;-1:-1:-1;58973:434:0:o;58880:85::-;58940:7;:17;58880:85::o;59415:137::-;59491:10;:23;;;;59525:8;:19;59415:137::o;46365:157::-;46463:4;46492:17;;;:12;;;;;:17;;;;;;:22;;;46365:157::o;33986:1557::-;34052:4;34191:19;;;:12;;;:19;;;;;;34227:15;;34223:1313;;34675:18;;-1:-1:-1;;34626:14:0;;;;34675:22;;;;-1:-1:-1;;34675:18:0;;:22;;34962;;;;;;;;;;;;;;34942:42;;35108:9;35079:3;:11;;35091:13;35079:26;;;;;;;;;;;;;;;;;;;:38;;;;35185:23;;;35227:1;35185:12;;;:23;;;;;;35211:17;;;35185:43;;35337:17;;35185:3;;35337:17;;;;;;;;;;;;;;;;;;;;;;35432:3;:12;;:19;35445:5;35432:19;;;;;;;;;;;35425:26;;;35475:4;35468:11;;;;;;;;34223:1313;35519:5;35512:12;;;;;33396:414;33459:4;33481:21;33491:3;33496:5;33481:9;:21::i;:::-;33476:327;;-1:-1:-1;33519:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;33702:18;;33680:19;;;:12;;;:19;;;;;;:40;;;;33735:11;;33476:327;-1:-1:-1;33786:5:0;33779:12;;43807:737;43917:4;44052:17;;;:12;;;:17;;;;;;44086:13;44082:455;;-1:-1:-1;;44184:36:0;;;;;;;;;;;;;;;;;;44166:55;;;;;;;;:12;:55;;;;;;;;;;;;;;;;;;;;;;;;44379:19;;44359:17;;;:12;;;:17;;;;;;;:39;44413:11;;44082:455;44493:5;44457:3;:12;;44481:1;44470:8;:12;44457:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;44520:5;44513:12;;;;;44719:1562;44783:4;44918:17;;;:12;;;:17;;;;;;44952:13;;44948:1326;;45397:19;;-1:-1:-1;;45350:12:0;;;;45397:23;;;;-1:-1:-1;;45397:19:0;;:23;;45694;;;;;;;;;;;;;;;;45665:52;;45842:9;45812:3;:12;;45825:13;45812:27;;;;;;;;;;;;;;;;:39;;:27;;;;;:39;;;;;;;;;;;;;;;45932:14;;45919:28;;:12;;;:28;;;;;45950:17;;;45919:48;;46076:18;;45919:3;;46076:18;;;;;;;;;;;;;;-1:-1:-1;;46076:18:0;;;;;;;;;;;;;;;;;;;;;46172:17;;;:12;;;:17;;;;;;46165:24;;;;46076:18;-1:-1:-1;46206:11:0;;-1:-1:-1;;;;46206:11:0;6064:229;6201:12;6233:52;6255:6;6263:4;6269:1;6272:12;6201;6881:18;6892:6;6881:10;:18::i;:::-;6873:60;;;;-1:-1:-1;;;6873:60:0;;;;;;;:::i;:::-;7007:12;7021:23;7048:6;-1:-1:-1;;;;;7048:11:0;7067:5;7088:4;7048:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7006:97;;;;7121:52;7139:7;7148:10;7160:12;7121:17;:52::i;:::-;7114:59;6549:632;-1:-1:-1;;;;;;;6549:632:0:o;7189:777::-;7339:12;7368:7;7364:595;;;-1:-1:-1;7399:10:0;7392:17;;7364:595;7513:17;;:21;7509:439;;7776:10;7770:17;7837:15;7824:10;7820:2;7816:19;7809:44;7724:148;7912:20;;-1:-1:-1;;;7912:20:0;;;;7919:12;;7912:20;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;14:400:1;;114:18;106:6;103:30;100:2;;;136:9;100:2;165:58;217:4;-1:-1:-1;;211:2:1;188:17;;184:31;180:42;165:58;:::i;:::-;156:67;;246:6;239:5;232:21;286:3;277:6;272:3;268:16;265:25;262:2;;;303:1;300;293:12;262:2;352:6;347:3;340:4;333:5;329:16;316:43;406:1;399:4;390:6;383:5;379:18;375:29;368:40;90:324;;;;;:::o;419:138::-;489:20;;518:33;489:20;518:33;:::i;562:776::-;;672:3;665:4;657:6;653:17;649:27;639:2;;694:5;687;680:20;639:2;734:6;721:20;760:4;784:65;799:49;845:2;799:49;:::i;:::-;784:65;:::i;:::-;883:15;;;914:12;;;;946:15;;;992:11;;;980:24;;976:33;;973:42;-1:-1:-1;970:2:1;;;1032:5;1025;1018:20;970:2;1058:5;1072:237;1086:2;1083:1;1080:9;1072:237;;;1157:3;1144:17;1174:30;1198:5;1174:30;:::i;:::-;1217:18;;1255:12;;;;1287;;;;1104:1;1097:9;1072:237;;;-1:-1:-1;1327:5:1;;629:709;-1:-1:-1;;;;;;;629:709:1:o;1343:676::-;;1450:3;1443:4;1435:6;1431:17;1427:27;1417:2;;1472:5;1465;1458:20;1417:2;1509;1503:9;1551:3;1543:6;1539:16;1621:6;1609:10;1606:22;1585:18;1573:10;1570:34;1567:62;1564:2;;;1632:9;1564:2;1659;1652:22;1694:6;1720;1744:5;1758:231;1772:4;1769:1;1766:11;1758:231;;;1831:56;1883:3;1876;1863:17;1855:6;1851:30;1831:56;:::i;:::-;1819:69;;1911:4;1935:12;;;;1967;;;;;1792:1;1785:9;1758:231;;;-1:-1:-1;2007:6:1;;1407:612;-1:-1:-1;;;;;1407:612:1:o;2024:673::-;;2136:3;2129:4;2121:6;2117:17;2113:27;2103:2;;2158:5;2151;2144:20;2103:2;2198:6;2185:20;2224:4;2248:65;2263:49;2309:2;2263:49;:::i;2248:65::-;2347:15;;;2378:12;;;;2410:15;;;2443:5;2457:211;2471:2;2468:1;2465:9;2457:211;;;2528:65;2589:3;2584:2;2577:3;2564:17;2556:6;2552:30;2548:39;2528:65;:::i;:::-;2516:78;;2614:12;;;;2646;;;;2489:1;2482:9;2457:211;;2702:132;2769:20;;2798:30;2769:20;2798:30;:::i;2839:233::-;;2937:3;2930:4;2922:6;2918:17;2914:27;2904:2;;2959:5;2952;2945:20;2904:2;2985:81;3062:3;3053:6;3040:20;3033:4;3025:6;3021:17;2985:81;:::i;3077:259::-;;3189:2;3177:9;3168:7;3164:23;3160:32;3157:2;;;3210:6;3202;3195:22;3157:2;3254:9;3241:23;3273:33;3300:5;3273:33;:::i;3341:263::-;;3464:2;3452:9;3443:7;3439:23;3435:32;3432:2;;;3485:6;3477;3470:22;3432:2;3522:9;3516:16;3541:33;3568:5;3541:33;:::i;3609:1513::-;;;;;;;;;;;3967:3;3955:9;3946:7;3942:23;3938:33;3935:2;;;3989:6;3981;3974:22;3935:2;4017:31;4038:9;4017:31;:::i;:::-;4007:41;;4099:2;4088:9;4084:18;4071:32;4122:18;4163:2;4155:6;4152:14;4149:2;;;4184:6;4176;4169:22;4149:2;4212:52;4256:7;4247:6;4236:9;4232:22;4212:52;:::i;:::-;4202:62;;4317:2;4306:9;4302:18;4289:32;4273:48;;4346:2;4336:8;4333:16;4330:2;;;4367:6;4359;4352:22;4330:2;4395:54;4441:7;4430:8;4419:9;4415:24;4395:54;:::i;:::-;4385:64;;4496:2;4485:9;4481:18;4468:32;4458:42;;4547:3;4536:9;4532:19;4519:33;4509:43;;4599:3;4588:9;4584:19;4571:33;4561:43;;4623:38;4656:3;4645:9;4641:19;4623:38;:::i;:::-;4613:48;;4680:41;4716:3;4705:9;4701:19;4680:41;:::i;:::-;4670:51;;4774:3;4763:9;4759:19;4746:33;4730:49;;4804:2;4794:8;4791:16;4788:2;;;4825:6;4817;4810:22;4788:2;4853:68;4913:7;4902:8;4891:9;4887:24;4853:68;:::i;:::-;4843:78;;4974:3;4963:9;4959:19;4946:33;4930:49;;5004:2;4994:8;4991:16;4988:2;;;5025:6;5017;5010:22;4988:2;;5053:63;5108:7;5097:8;5086:9;5082:24;5053:63;:::i;:::-;5043:73;;;3925:1197;;;;;;;;;;;;;:::o;5127:402::-;;;5256:2;5244:9;5235:7;5231:23;5227:32;5224:2;;;5277:6;5269;5262:22;5224:2;5321:9;5308:23;5340:33;5367:5;5340:33;:::i;:::-;5392:5;-1:-1:-1;5449:2:1;5434:18;;5421:32;5462:35;5421:32;5462:35;:::i;:::-;5516:7;5506:17;;;5214:315;;;;;:::o;5534:470::-;;;;5680:2;5668:9;5659:7;5655:23;5651:32;5648:2;;;5701:6;5693;5686:22;5648:2;5745:9;5732:23;5764:33;5791:5;5764:33;:::i;:::-;5816:5;-1:-1:-1;5873:2:1;5858:18;;5845:32;5886:35;5845:32;5886:35;:::i;:::-;5638:366;;5940:7;;-1:-1:-1;;;5994:2:1;5979:18;;;;5966:32;;5638:366::o;6009:830::-;;;;;6181:3;6169:9;6160:7;6156:23;6152:33;6149:2;;;6203:6;6195;6188:22;6149:2;6247:9;6234:23;6266:33;6293:5;6266:33;:::i;:::-;6318:5;-1:-1:-1;6375:2:1;6360:18;;6347:32;6388:35;6347:32;6388:35;:::i;:::-;6442:7;-1:-1:-1;6496:2:1;6481:18;;6468:32;;-1:-1:-1;6551:2:1;6536:18;;6523:32;6578:18;6567:30;;6564:2;;;6615:6;6607;6600:22;6564:2;6643:22;;6696:4;6688:13;;6684:27;-1:-1:-1;6674:2:1;;6730:6;6722;6715:22;6674:2;6758:75;6825:7;6820:2;6807:16;6802:2;6798;6794:11;6758:75;:::i;:::-;6748:85;;;6139:700;;;;;;;:::o;6844:396::-;;;6970:2;6958:9;6949:7;6945:23;6941:32;6938:2;;;6991:6;6983;6976:22;6938:2;7035:9;7022:23;7054:33;7081:5;7054:33;:::i;:::-;7106:5;-1:-1:-1;7163:2:1;7148:18;;7135:32;7176;7135;7176;:::i;7245:327::-;;;7374:2;7362:9;7353:7;7349:23;7345:32;7342:2;;;7395:6;7387;7380:22;7342:2;7439:9;7426:23;7458:33;7485:5;7458:33;:::i;:::-;7510:5;7562:2;7547:18;;;;7534:32;;-1:-1:-1;;;7332:240:1:o;7577:549::-;;;;7733:2;7721:9;7712:7;7708:23;7704:32;7701:2;;;7754:6;7746;7739:22;7701:2;7798:9;7785:23;7817:33;7844:5;7817:33;:::i;:::-;7869:5;-1:-1:-1;7921:2:1;7906:18;;7893:32;;-1:-1:-1;7976:2:1;7961:18;;7948:32;8003:18;7992:30;;7989:2;;;8040:6;8032;8025:22;7989:2;8068:52;8112:7;8103:6;8092:9;8088:22;8068:52;:::i;:::-;8058:62;;;7691:435;;;;;:::o;8131:1289::-;;;8307:2;8295:9;8286:7;8282:23;8278:32;8275:2;;;8328:6;8320;8313:22;8275:2;8373:9;8360:23;8402:18;8443:2;8435:6;8432:14;8429:2;;;8464:6;8456;8449:22;8429:2;8507:6;8496:9;8492:22;8482:32;;8552:7;8545:4;8541:2;8537:13;8533:27;8523:2;;8579:6;8571;8564:22;8523:2;8620;8607:16;8642:4;8666:65;8681:49;8727:2;8681:49;:::i;8666:65::-;8765:15;;;8796:12;;;;8828:11;;;8866;;;8858:20;;8854:29;;8851:42;-1:-1:-1;8848:2:1;;;8911:6;8903;8896:22;8848:2;8938:6;8929:15;;8953:240;8967:2;8964:1;8961:9;8953:240;;;9038:3;9025:17;9055:33;9082:5;9055:33;:::i;:::-;9101:18;;8985:1;8978:9;;;;;9139:12;;;;9171;;8953:240;;;-1:-1:-1;9212:5:1;-1:-1:-1;;9255:18:1;;9242:32;;-1:-1:-1;;9286:16:1;;;9283:2;;;9320:6;9312;9305:22;9283:2;;9348:66;9406:7;9395:8;9384:9;9380:24;9348:66;:::i;:::-;9338:76;;;8265:1155;;;;;:::o;9425:257::-;;9545:2;9533:9;9524:7;9520:23;9516:32;9513:2;;;9566:6;9558;9551:22;9513:2;9603:9;9597:16;9622:30;9646:5;9622:30;:::i;9687:257::-;;9798:2;9786:9;9777:7;9773:23;9769:32;9766:2;;;9819:6;9811;9804:22;9766:2;9863:9;9850:23;9882:32;9908:5;9882:32;:::i;9949:261::-;;10071:2;10059:9;10050:7;10046:23;10042:32;10039:2;;;10092:6;10084;10077:22;10039:2;10129:9;10123:16;10148:32;10174:5;10148:32;:::i;10215:344::-;;10337:2;10325:9;10316:7;10312:23;10308:32;10305:2;;;10358:6;10350;10343:22;10305:2;10403:9;10390:23;10436:18;10428:6;10425:30;10422:2;;;10473:6;10465;10458:22;10422:2;10501:52;10545:7;10536:6;10525:9;10521:22;10501:52;:::i;10564:190::-;;10676:2;10664:9;10655:7;10651:23;10647:32;10644:2;;;10697:6;10689;10682:22;10644:2;-1:-1:-1;10725:23:1;;10634:120;-1:-1:-1;10634:120:1:o;10759:194::-;;10882:2;10870:9;10861:7;10857:23;10853:32;10850:2;;;10903:6;10895;10888:22;10850:2;-1:-1:-1;10931:16:1;;10840:113;-1:-1:-1;10840:113:1:o;10958:258::-;;;11087:2;11075:9;11066:7;11062:23;11058:32;11055:2;;;11108:6;11100;11093:22;11055:2;-1:-1:-1;;11136:23:1;;;11206:2;11191:18;;;11178:32;;-1:-1:-1;11045:171:1:o;11221:259::-;;11302:5;11296:12;11329:6;11324:3;11317:19;11345:63;11401:6;11394:4;11389:3;11385:14;11378:4;11371:5;11367:16;11345:63;:::i;:::-;11462:2;11441:15;-1:-1:-1;;11437:29:1;11428:39;;;;11469:4;11424:50;;11272:208;-1:-1:-1;;11272:208:1:o;11485:274::-;;11652:6;11646:13;11668:53;11714:6;11709:3;11702:4;11694:6;11690:17;11668:53;:::i;:::-;11737:16;;;;;11622:137;-1:-1:-1;;11622:137:1:o;12045:993::-;;12250:3;12285:6;12279:13;12311:1;12343:2;12332:9;12328:18;12360:1;12355:126;;;;12495:1;12490:406;;;;12321:575;;12355:126;-1:-1:-1;;12388:24:1;;12376:37;;12465:4;12461:1;12446:17;;12442:28;12433:38;;;-1:-1:-1;12355:126:1;;12490:406;12540:1;12529:9;12525:17;12567:6;12562:3;12555:19;12597:4;12644:2;12639:3;12629:18;12669:3;12685:165;12699:6;12696:1;12693:13;12685:165;;;12777:14;;12764:11;;;12757:35;12820:16;;;;12714:10;;12685:165;;;-1:-1:-1;;;12870:16:1;;;-1:-1:-1;12321:575:1;;;;12927:6;12921:13;12943:55;12989:8;12984:3;12977:4;12969:6;12965:17;12943:55;:::i;:::-;13014:18;;12229:809;-1:-1:-1;;;;12229:809:1:o;13043:255::-;-1:-1:-1;;;13245:20:1;;13290:1;13281:11;;13235:63::o;13513:203::-;-1:-1:-1;;;;;13677:32:1;;;;13659:51;;13647:2;13632:18;;13614:102::o;13945:391::-;-1:-1:-1;;;;;14219:15:1;;;14201:34;;14271:15;;;;14266:2;14251:18;;14244:43;14318:2;14303:18;;14296:34;;;;14151:2;14136:18;;14118:218::o;14341:506::-;-1:-1:-1;;;;;14626:15:1;;;14608:34;;14678:15;;14673:2;14658:18;;14651:43;14725:2;14710:18;;14703:34;;;14773:3;14768:2;14753:18;;14746:31;;;-1:-1:-1;;14794:47:1;;14821:19;;14813:6;14794:47;:::i;:::-;14786:55;14560:287;-1:-1:-1;;;;;;14560:287:1:o;14852:284::-;-1:-1:-1;;;;;15038:32:1;;;;15020:51;;15114:14;15107:22;15102:2;15087:18;;15080:50;15008:2;14993:18;;14975:161::o;15141:274::-;-1:-1:-1;;;;;15333:32:1;;;;15315:51;;15397:2;15382:18;;15375:34;15303:2;15288:18;;15270:145::o;15420:187::-;15585:14;;15578:22;15560:41;;15548:2;15533:18;;15515:92::o;15612:221::-;;15761:2;15750:9;15743:21;15781:46;15823:2;15812:9;15808:18;15800:6;15781:46;:::i;15838:1497::-;;16179:2;16168:9;16161:21;16205:46;16247:2;16236:9;16232:18;16224:6;16205:46;:::i;:::-;16270:2;16320:9;16312:6;16308:22;16303:2;16292:9;16288:18;16281:50;16351:6;16386;16380:13;16417:6;16409;16402:22;16452:2;16444:6;16440:15;16433:22;;16512:2;16506;16498:6;16494:15;16486:6;16482:28;16478:37;16550:2;16542:6;16538:15;16571:4;16584:253;16598:6;16595:1;16592:13;16584:253;;;16688:2;16684:7;16675:6;16667;16663:19;16659:33;16654:3;16647:46;16716:41;16750:6;16741;16735:13;16716:41;:::i;:::-;16815:12;;;;16706:51;-1:-1:-1;16780:15:1;;;;16620:1;16613:9;16584:253;;;-1:-1:-1;;16873:22:1;;;16868:2;16853:18;;16846:50;16877:6;-1:-1:-1;;16983:3:1;16971:16;;;-1:-1:-1;17012:6:1;16877;17038:4;17051:255;17067:4;17062:3;17059:13;17051:255;;;17144:6;17136;17132:19;17125:5;17118:34;17175:43;17211:6;17200:8;17194:15;17175:43;:::i;:::-;17282:14;;;;17165:53;-1:-1:-1;17243:17:1;;;;17091:1;17082:11;17051:255;;;-1:-1:-1;17323:6:1;;16151:1184;-1:-1:-1;;;;;;;;;16151:1184:1:o;17340:1560::-;;17865:3;17895:2;17884:9;17877:21;17921:46;17963:2;17952:9;17948:18;17940:6;17921:46;:::i;:::-;17907:60;;18015:9;18007:6;18003:22;17998:2;17987:9;17983:18;17976:50;18049:34;18076:6;18068;18049:34;:::i;:::-;18035:48;;18131:9;18123:6;18119:22;18114:2;18103:9;18099:18;18092:50;18165:34;18192:6;18184;18165:34;:::i;:::-;18151:48;;18247:9;18239:6;18235:22;18230:2;18219:9;18215:18;18208:50;18281:34;18308:6;18300;18281:34;:::i;:::-;18267:48;;18364:9;18356:6;18352:22;18346:3;18335:9;18331:19;18324:51;18398:34;18425:6;18417;18398:34;:::i;:::-;18384:48;;18481:9;18473:6;18469:22;18463:3;18452:9;18448:19;18441:51;18515:34;18542:6;18534;18515:34;:::i;:::-;18501:48;;18598:9;18590:6;18586:22;18580:3;18569:9;18565:19;18558:51;18632:34;18659:6;18651;18632:34;:::i;:::-;18618:48;;18715:9;18707:6;18703:22;18697:3;18686:9;18682:19;18675:51;18749:34;18776:6;18768;18749:34;:::i;:::-;18735:48;;18832:9;18824:6;18820:22;18814:3;18803:9;18799:19;18792:51;18860:34;18887:6;18879;18860:34;:::i;:::-;18852:42;17845:1055;-1:-1:-1;;;;;;;;;;;;17845:1055:1:o;18905:398::-;19107:2;19089:21;;;19146:2;19126:18;;;19119:30;19185:34;19180:2;19165:18;;19158:62;-1:-1:-1;;;19251:2:1;19236:18;;19229:32;19293:3;19278:19;;19079:224::o;19308:405::-;19510:2;19492:21;;;19549:2;19529:18;;;19522:30;19588:34;19583:2;19568:18;;19561:62;-1:-1:-1;;;19654:2:1;19639:18;;19632:39;19703:3;19688:19;;19482:231::o;19718:414::-;19920:2;19902:21;;;19959:2;19939:18;;;19932:30;19998:34;19993:2;19978:18;;19971:62;-1:-1:-1;;;20064:2:1;20049:18;;20042:48;20122:3;20107:19;;19892:240::o;20137:402::-;20339:2;20321:21;;;20378:2;20358:18;;;20351:30;20417:34;20412:2;20397:18;;20390:62;-1:-1:-1;;;20483:2:1;20468:18;;20461:36;20529:3;20514:19;;20311:228::o;20544:352::-;20746:2;20728:21;;;20785:2;20765:18;;;20758:30;20824;20819:2;20804:18;;20797:58;20887:2;20872:18;;20718:178::o;20901:352::-;21103:2;21085:21;;;21142:2;21122:18;;;21115:30;21181;21176:2;21161:18;;21154:58;21244:2;21229:18;;21075:178::o;21258:400::-;21460:2;21442:21;;;21499:2;21479:18;;;21472:30;21538:34;21533:2;21518:18;;21511:62;-1:-1:-1;;;21604:2:1;21589:18;;21582:34;21648:3;21633:19;;21432:226::o;21663:351::-;21865:2;21847:21;;;21904:2;21884:18;;;21877:30;21943:29;21938:2;21923:18;;21916:57;22005:2;21990:18;;21837:177::o;22019:397::-;22221:2;22203:21;;;22260:2;22240:18;;;22233:30;22299:34;22294:2;22279:18;;22272:62;-1:-1:-1;;;22365:2:1;22350:18;;22343:31;22406:3;22391:19;;22193:223::o;22421:400::-;22623:2;22605:21;;;22662:2;22642:18;;;22635:30;22701:34;22696:2;22681:18;;22674:62;-1:-1:-1;;;22767:2:1;22752:18;;22745:34;22811:3;22796:19;;22595:226::o;22826:349::-;23028:2;23010:21;;;23067:2;23047:18;;;23040:30;23106:27;23101:2;23086:18;;23079:55;23166:2;23151:18;;23000:175::o;23180:399::-;23382:2;23364:21;;;23421:2;23401:18;;;23394:30;23460:34;23455:2;23440:18;;23433:62;-1:-1:-1;;;23526:2:1;23511:18;;23504:33;23569:3;23554:19;;23354:225::o;23584:353::-;23786:2;23768:21;;;23825:2;23805:18;;;23798:30;23864:31;23859:2;23844:18;;23837:59;23928:2;23913:18;;23758:179::o;23942:353::-;24144:2;24126:21;;;24183:2;24163:18;;;24156:30;24222:31;24217:2;24202:18;;24195:59;24286:2;24271:18;;24116:179::o;24300:354::-;24502:2;24484:21;;;24541:2;24521:18;;;24514:30;24580:32;24575:2;24560:18;;24553:60;24645:2;24630:18;;24474:180::o;24659:354::-;24861:2;24843:21;;;24900:2;24880:18;;;24873:30;24939:32;24934:2;24919:18;;24912:60;25004:2;24989:18;;24833:180::o;25425:408::-;25627:2;25609:21;;;25666:2;25646:18;;;25639:30;25705:34;25700:2;25685:18;;25678:62;-1:-1:-1;;;25771:2:1;25756:18;;25749:42;25823:3;25808:19;;25599:234::o;25838:402::-;26040:2;26022:21;;;26079:2;26059:18;;;26052:30;26118:34;26113:2;26098:18;;26091:62;-1:-1:-1;;;26184:2:1;26169:18;;26162:36;26230:3;26215:19;;26012:228::o;26245:350::-;26447:2;26429:21;;;26486:2;26466:18;;;26459:30;26525:28;26520:2;26505:18;;26498:56;26586:2;26571:18;;26419:176::o;26600:420::-;26802:2;26784:21;;;26841:2;26821:18;;;26814:30;26880:34;26875:2;26860:18;;26853:62;26951:26;26946:2;26931:18;;26924:54;27010:3;26995:19;;26774:246::o;27025:399::-;27227:2;27209:21;;;27266:2;27246:18;;;27239:30;27305:34;27300:2;27285:18;;27278:62;-1:-1:-1;;;27371:2:1;27356:18;;27349:33;27414:3;27399:19;;27199:225::o;27429:352::-;27631:2;27613:21;;;27670:2;27650:18;;;27643:30;27709;27704:2;27689:18;;27682:58;27772:2;27757:18;;27603:178::o;27786:406::-;27988:2;27970:21;;;28027:2;28007:18;;;28000:30;28066:34;28061:2;28046:18;;28039:62;-1:-1:-1;;;28132:2:1;28117:18;;28110:40;28182:3;28167:19;;27960:232::o;28197:410::-;28399:2;28381:21;;;28438:2;28418:18;;;28411:30;28477:34;28472:2;28457:18;;28450:62;-1:-1:-1;;;28543:2:1;28528:18;;28521:44;28597:3;28582:19;;28371:236::o;28612:398::-;28814:2;28796:21;;;28853:2;28833:18;;;28826:30;28892:34;28887:2;28872:18;;28865:62;-1:-1:-1;;;28958:2:1;28943:18;;28936:32;29000:3;28985:19;;28786:224::o;29015:356::-;29217:2;29199:21;;;29236:18;;;29229:30;29295:34;29290:2;29275:18;;29268:62;29362:2;29347:18;;29189:182::o;29376:403::-;29578:2;29560:21;;;29617:2;29597:18;;;29590:30;29656:34;29651:2;29636:18;;29629:62;-1:-1:-1;;;29722:2:1;29707:18;;29700:37;29769:3;29754:19;;29550:229::o;29784:397::-;29986:2;29968:21;;;30025:2;30005:18;;;29998:30;30064:34;30059:2;30044:18;;30037:62;-1:-1:-1;;;30130:2:1;30115:18;;30108:31;30171:3;30156:19;;29958:223::o;30186:408::-;30388:2;30370:21;;;30427:2;30407:18;;;30400:30;30466:34;30461:2;30446:18;;30439:62;-1:-1:-1;;;30532:2:1;30517:18;;30510:42;30584:3;30569:19;;30360:234::o;30599:356::-;30801:2;30783:21;;;30820:18;;;30813:30;30879:34;30874:2;30859:18;;30852:62;30946:2;30931:18;;30773:182::o;30960:400::-;31162:2;31144:21;;;31201:2;31181:18;;;31174:30;31240:34;31235:2;31220:18;;31213:62;-1:-1:-1;;;31306:2:1;31291:18;;31284:34;31350:3;31335:19;;31134:226::o;31365:405::-;31567:2;31549:21;;;31606:2;31586:18;;;31579:30;31645:34;31640:2;31625:18;;31618:62;-1:-1:-1;;;31711:2:1;31696:18;;31689:39;31760:3;31745:19;;31539:231::o;31775:411::-;31977:2;31959:21;;;32016:2;31996:18;;;31989:30;32055:34;32050:2;32035:18;;32028:62;-1:-1:-1;;;32121:2:1;32106:18;;32099:45;32176:3;32161:19;;31949:237::o;32191:350::-;32393:2;32375:21;;;32432:2;32412:18;;;32405:30;32471:28;32466:2;32451:18;;32444:56;32532:2;32517:18;;32365:176::o;32546:397::-;32748:2;32730:21;;;32787:2;32767:18;;;32760:30;32826:34;32821:2;32806:18;;32799:62;-1:-1:-1;;;32892:2:1;32877:18;;32870:31;32933:3;32918:19;;32720:223::o;32948:340::-;33150:2;33132:21;;;33189:2;33169:18;;;33162:30;-1:-1:-1;;;33223:2:1;33208:18;;33201:46;33279:2;33264:18;;33122:166::o;33293:413::-;33495:2;33477:21;;;33534:2;33514:18;;;33507:30;33573:34;33568:2;33553:18;;33546:62;-1:-1:-1;;;33639:2:1;33624:18;;33617:47;33696:3;33681:19;;33467:239::o;33711:353::-;33913:2;33895:21;;;33952:2;33932:18;;;33925:30;33991:31;33986:2;33971:18;;33964:59;34055:2;34040:18;;33885:179::o;34069:354::-;34271:2;34253:21;;;34310:2;34290:18;;;34283:30;34349:32;34344:2;34329:18;;34322:60;34414:2;34399:18;;34243:180::o;34428:406::-;34630:2;34612:21;;;34669:2;34649:18;;;34642:30;34708:34;34703:2;34688:18;;34681:62;-1:-1:-1;;;34774:2:1;34759:18;;34752:40;34824:3;34809:19;;34602:232::o;34839:403::-;35041:2;35023:21;;;35080:2;35060:18;;;35053:30;35119:34;35114:2;35099:18;;35092:62;-1:-1:-1;;;35185:2:1;35170:18;;35163:37;35232:3;35217:19;;35013:229::o;35247:177::-;35393:25;;;35381:2;35366:18;;35348:76::o;35429:258::-;35597:25;;;35665:14;35658:22;35653:2;35638:18;;35631:50;35585:2;35570:18;;35552:135::o;35692:242::-;35762:2;35756:9;35792:17;;;35839:18;35824:34;;35860:22;;;35821:62;35818:2;;;35886:9;35818:2;35913;35906:22;35736:198;;-1:-1:-1;35736:198:1:o;35939:183::-;;36038:18;36030:6;36027:30;36024:2;;;36060:9;36024:2;-1:-1:-1;36111:4:1;36092:17;;;36088:28;;36014:108::o;36127:258::-;36199:1;36209:113;36223:6;36220:1;36217:13;36209:113;;;36299:11;;;36293:18;36280:11;;;36273:39;36245:2;36238:10;36209:113;;;36340:6;36337:1;36334:13;36331:2;;;-1:-1:-1;;36375:1:1;36357:16;;36350:27;36180:205::o;36390:133::-;-1:-1:-1;;;;;36467:31:1;;36457:42;;36447:2;;36513:1;36510;36503:12;36528:120;36616:5;36609:13;36602:21;36595:5;36592:32;36582:2;;36638:1;36635;36628:12;36653:133;-1:-1:-1;;;;;;36729:32:1;;36719:43;;36709:2;;36776:1;36773;36766:12
Swarm Source
ipfs://5c826f76995a9fa520213ad89fc1c64875a42907743e708b070d4cc8f8f6244e
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.