More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,537 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Dope | 16659107 | 594 days ago | IN | 0 ETH | 0.00636089 | ||||
Claim Dope | 16609539 | 601 days ago | IN | 0 ETH | 0.00601489 | ||||
Claim Dope | 16560586 | 607 days ago | IN | 0 ETH | 0.00640057 | ||||
Claim Dope | 16511905 | 614 days ago | IN | 0 ETH | 0.0029658 | ||||
Claim Dope | 16511902 | 614 days ago | IN | 0 ETH | 0.00258179 | ||||
Claim Dope | 16511899 | 614 days ago | IN | 0 ETH | 0.0031659 | ||||
Work | 16511207 | 614 days ago | IN | 0 ETH | 0.00196005 | ||||
Work | 16510395 | 614 days ago | IN | 0 ETH | 0.00351922 | ||||
Claim Dope | 16510391 | 614 days ago | IN | 0 ETH | 0.00419918 | ||||
Claim Dope | 16505530 | 615 days ago | IN | 0 ETH | 0.00189593 | ||||
Work | 16458711 | 622 days ago | IN | 0 ETH | 0.00407781 | ||||
Work | 16456024 | 622 days ago | IN | 0 ETH | 0.00195638 | ||||
Claim Dope | 16456012 | 622 days ago | IN | 0 ETH | 0.00211602 | ||||
Claim Dope | 16419665 | 627 days ago | IN | 0 ETH | 0.00213419 | ||||
Claim Dope | 16408967 | 629 days ago | IN | 0 ETH | 0.00446603 | ||||
Claim Dope | 16369372 | 634 days ago | IN | 0 ETH | 0.00190817 | ||||
Claim Dope | 16358461 | 636 days ago | IN | 0 ETH | 0.0038263 | ||||
Upgrade Doper | 16321580 | 641 days ago | IN | 0 ETH | 0.00179472 | ||||
Claim Dope | 16321577 | 641 days ago | IN | 0 ETH | 0.00233186 | ||||
Claim Dope | 16319560 | 641 days ago | IN | 0 ETH | 0.00513534 | ||||
Claim Dope | 16315800 | 642 days ago | IN | 0 ETH | 0.00185657 | ||||
Work | 16309751 | 642 days ago | IN | 0 ETH | 0.0021132 | ||||
Claim Dope | 16308300 | 643 days ago | IN | 0 ETH | 0.00431541 | ||||
Work | 16295266 | 644 days ago | IN | 0 ETH | 0.00364051 | ||||
Work | 16295262 | 644 days ago | IN | 0 ETH | 0.00381432 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Pioneer
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-22 */ //SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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; /** * @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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: contracts/pioneer.sol pragma solidity ^0.8.9; // @@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&&&&&&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@&&######################&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@&&##//,,,,////////////##**&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@&&##////,,,,//////////##**&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@&&##//,,////,,,,//////##**&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@&&##////,,////,,,,////##**&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@&&##//////,,////,,,,//##**&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@&&&&&&&&######################**&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&**&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@&&,,,,,,,,,,,,,,,,,,,,,,,,**&&@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@&&,,,, &&,,,,,, &&,,,,,,,,**&&@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@&&,,,,,, ,,&&&&&&,, &&,,,,,,,,,,**&&@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@&&,,,,&&,,,,,,,,&&,,,,,,,,,,&&,,,,,,,,,,,,&&@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@&&&&,,,,&&,,,,,,&&,,&&,,,,,,,,&&,,,,,,,,,,,,,,&&@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@&&**&&,,,,&&,,,,,,&&&&&&,,,,,,,,&&,,&&,,,,,,,,,,&&@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@&&&&,,,,,,&&&&&& &&&&&&&&,,,,,,&&,,,,,,&&@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@&&,,&& &&,,,,******&&@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@&&,,&& && .. && &&,,******&&@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@&&,,&& && &&,,******&&@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@&&,,&& ,,,, ,,,, &&,,******&&@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@&&**,,&& &&,,******&&@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@&&**,,&& &&,,****&&&&@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@&&**,,&&&&......&&&&&&,,****&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@&&**,,,,&&&&&&,,,,,,********&&@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@&&**,,,,,,******,,,,,,,,,,******&&@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@&&**,,,,,,,,,,,,,,,,,,,,,,,,******&&@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@&&****&&,,,,,,,,,,,,,,,,,,&&,,********&&&&@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@&&****,,&&,,,,,,,,,,,,,,,,,,&&,,************&&@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@&&&&&&,,,,,,,,,,,,,,,,,,,,&& &&,,&&,,**&&@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@&& &&,,,,,,,,,,,,,,,,,,,,&& &&&&&&&&@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@&& &&,,,,,,,,,,,,,,,,,,,,&& ....&&@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@&&&&,,,,,,,,,,**,,,,,,,,,,&&......&&@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@&&,,,,,,,,**&&@@&&,,,,,,,,**&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@&&,,,,,,,,**&&@@&&,,,,,,,,**&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@&&,,,,,,,,**&&@@&&,,,,,,,,**&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@&&,,,,,,,,**&&@@&&,,,,,,,,**&&@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@&&&&********&&@@&&**********&&@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@&& .. ....&&@@&&.. .. &&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@&& .. ....&&@@&&.. .. &&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@ ██████████ ███████ ███████████ ██████████ @@@@@@@@@@@@ // @@@@@@@@@@@@ ░░███░░░░███ ███░░░░░███ ░░███░░░░░███░░███░░░░░█ @@@@@@@@@@@@ // @@@@@@@@@@@@ ░███ ░░███ ███ ░░███ ░███ ░███ ░███ █ ░ @@@@@@@@@@@@ // @@@@@@@@@@@@ ░███ ░███░███ ░███ ░██████████ ░██████ @@@@@@@@@@@@ // @@@@@@@@@@@@ ░███ ░███░███ ░███ ░███░░░░░░ ░███░░█ @@@@@@@@@@@@ // @@@@@@@@@@@@ ░███ ███ ░░███ ███ ░███ ░███ ░ █ @@@@@@@@@@@@ // @@@@@@@@@@@@ ██████████ ░░░███████░ █████ ██████████ @@@@@@@@@@@@ // @@@@@@@@@@@@ ░░░░░░░░░░ ░░░░░░░ ░░░░░ ░░░░░░░░░░ @@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ contract Pioneer is ERC721Holder, Ownable, Pausable, ReentrancyGuard { using SafeERC20 for IERC20; IERC20 public dopes; IERC721 public dopers; uint256 public totalClaimedDopes; uint8 public winner; // if winner is 0 then not endgame uint256 public endGameReward; enum Species { Human, King, Angel, Devil, Zombie } enum VoteSide { None, Angel, Devil } uint8 public constant MAX_SPECIES = 5; uint8 public constant MAX_LAYER = 3; uint8 public constant MAX_CASTLE_SIZE = 61; uint8 public constant MAX_LEVEL = 5; uint8 public constant WINNER_BENEFIT_RATIO = 30; //천사 악마 이길때 claim 비율(30% 추가 Claim) uint8 public constant DOUBLE_WINNER_BENEFIT_RATIO = 50; //천사 악마 2배 이상 이길때 claim 비율(50% 추가 Claim) uint8 public constant FARM_BENEFIT_RATIO = 10; uint8 public constant ANGEL_WINNING_BENEFIT_RATIO = 2; uint8 public constant MAX_ZOMBIES = 5; // 성당 최대 좀비 수 uint16 public constant BLOCKS_PER_DAY = 7200; // 좀비 최대 있을 시간(최대 3일) uint16 public constant BLOCKS_PER_WEEK = 50400; uint256 public constant CASTLE_PRICE = 2 * 10**5 * 10**18; uint256 public constant FLOATING_FACTOR = 10**9; //Game balance parameters uint8 public DELTA = 30; // 토크노믹스를 위한 조정 변수 uint16 public BARRICADE_PRICE = 5000; uint16 public ZOMBIE_TIME = 3000; uint32 public BLOCKS_PER_3DAYS = 21600; // 좀비 최대 있을 시간(최대 3일) uint32 public ZOMBIE_DELTA = 200000; uint256 public TEMPLE_PRICE = 1 * 10**6 * 10**18; struct Castle { bool hasFarm; uint8 barricades; uint8 level; uint8 zombies; uint16 workers; uint256 angelInfluences; uint256 devilInfluences; uint256 ownerTokenID; // 성 주인 uint256 taxPool; // castle에 쌓인 세금량 uint256 balance; // 현재 dope 보유량 uint256 lastAttackedBlock; } struct Character { uint8 voteSide; // 0 : none, 1 : angel side, 2 : devil side uint8 castleId; // 0 : null castle, 1 ~ : castle number | 캐릭터가 현재 있는 캐슬 uint8 species; // default 0 -> human, 1 -> king, 2 -> angel, 3 -> devil, 4 -> zombie uint8 level; // 강화도 bool claimable; bool isCastleOwner; uint256 lastActionedBlock; } struct CastleLevel { uint8 taxRatio; // 10, 9, 8, 7, 5 uint256 upgradeBalance; uint256 levelUpPrice; // 27 * 10**3 * 10**DECIMAL, 32 * 10**3 * 10**DECIMAL, 35 * 10**3 * 10**DECIMAL, 4 * 10**4 * 10**DECIMAL, 0 } struct Zombie { uint256 lastAttackedBlock; // 마지막으로 성을 공격한시간 } // 레이어마다 성이 있고, 처음에 공개되는 레이언은 0번 레이어. 다음 레이어가 공개되려면 여기에 정의된 수 이상의 성이 activate상태여야한다. uint256[MAX_LAYER] public layerCondition = [ 0, 20 * 10**6 * 10**18, 36 * 10**7 * 10**18 ]; uint8[MAX_LAYER] public castleIdxByLayer = [4, 32, 60]; uint8[MAX_SPECIES] public dopenesses = [20, 30, 40, 40, 40]; uint8[MAX_LEVEL] public dopenessesByUpgrade = [6, 15, 27, 42, 60]; // castle level에 따른 세금률 CastleLevel[MAX_LEVEL + 1] public castleInfoByLevel; // default is 1 uint256 public totalAngelInfluences; // 전체 Angel의 voting power uint256 public totalDevilInfluences; // 전체 Devil의 voting power mapping(uint256 => Character) public characters; // tokenId to Character mapping(uint8 => Castle) public castles; address public templeSink; //addreess to receive DOPES from temple purchases constructor( address dopersAddress, address dopesAddress, address _templeSink ) { dopers = IERC721(dopersAddress); dopes = IERC20(dopesAddress); templeSink = _templeSink; castleInfoByLevel[0] = CastleLevel({ taxRatio: 10, upgradeBalance: 4 * 10**6 * 10**18, levelUpPrice: 0 }); castleInfoByLevel[1] = CastleLevel({ taxRatio: 10, upgradeBalance: 4 * 10**6 * 10**18, levelUpPrice: 0 }); castleInfoByLevel[2] = CastleLevel({ taxRatio: 9, upgradeBalance: 12 * 10**5 * 10**18, levelUpPrice: 27 * 10**3 * 10**18 }); castleInfoByLevel[3] = CastleLevel({ taxRatio: 8, upgradeBalance: 16 * 10**5 * 10**18, levelUpPrice: 32 * 10**3 * 10**18 }); castleInfoByLevel[4] = CastleLevel({ taxRatio: 7, upgradeBalance: 2 * 10**6 * 10**18, levelUpPrice: 35 * 10**3 * 10**18 }); castleInfoByLevel[5] = CastleLevel({ taxRatio: 5, upgradeBalance: 32 * 10**5 * 10**18, levelUpPrice: 4 * 10**4 * 10**18 }); uint256 initialBalance = castleInfoByLevel[0].upgradeBalance * 3; castles[1] = Castle({ hasFarm: false, barricades: 0, level: 5, zombies: 0, workers: 0, angelInfluences: 0, devilInfluences: 0, ownerTokenID: 0, taxPool: 0, balance: initialBalance, lastAttackedBlock: 0 }); castles[2] = Castle({ hasFarm: false, barricades: 0, level: 5, zombies: 0, workers: 0, angelInfluences: 0, devilInfluences: 0, ownerTokenID: 0, taxPool: 0, balance: initialBalance, lastAttackedBlock: 0 }); castles[3] = Castle({ hasFarm: false, barricades: 0, level: 5, zombies: 0, workers: 0, angelInfluences: 0, devilInfluences: 0, ownerTokenID: 0, taxPool: 0, balance: initialBalance, lastAttackedBlock: 0 }); castles[4] = Castle({ hasFarm: false, barricades: 0, level: 5, zombies: 0, workers: 0, angelInfluences: 0, devilInfluences: 0, ownerTokenID: 0, taxPool: 0, balance: initialBalance, lastAttackedBlock: 0 }); _pause(); } /* ========== VIEWS ========== */ function ownerOfCastle(uint8 castleId) public view verifyCastle(castleId, true) returns (address) { return dopers.ownerOf(castles[castleId].ownerTokenID); } function calculationRewards(uint256 tokenId) public view returns ( uint256 reward, uint256 tax, bool isBuzzerBeater ) { uint8 castleId = characters[tokenId].castleId; uint256 balance = castles[castleId].balance; if (castleId == 0 || balance == 0) return (0, 0, false); isBuzzerBeater = false; uint8 species = characters[tokenId].species; uint8 taxRate = 0; reward = _min( block.number - characters[tokenId].lastActionedBlock, ( species == uint8(Species.Zombie) ? BLOCKS_PER_3DAYS : BLOCKS_PER_WEEK ) ); // balance factor if (balance <= 10**6 * 10**18) { reward *= 7; } else if (balance <= 2 * 10**6 * 10**18) { reward *= 8; } else if (balance <= 3 * 10**6 * 10**18) { reward *= 9; } else if (balance <= 4 * 10**6 * 10**18) { reward *= 10; } else { reward *= 11; } reward *= dopenesses[characters[tokenId].species] + ( characters[tokenId].level > 0 ? dopenessesByUpgrade[characters[tokenId].level - 1] : 0 ); if (species == uint8(Species.Zombie)) { reward *= castles[castleId].workers; reward *= ZOMBIE_DELTA; } else { // production speed uint8 productionSpeedRatio = 100; if (castles[castleId].hasFarm) { productionSpeedRatio += FARM_BENEFIT_RATIO; } if (totalAngelInfluences > totalDevilInfluences) { // 밸런싱~~ Peace! productionSpeedRatio += totalAngelInfluences >= totalDevilInfluences * 2 ? 0 : ANGEL_WINNING_BENEFIT_RATIO; } else if (totalAngelInfluences < totalDevilInfluences) { productionSpeedRatio -= ANGEL_WINNING_BENEFIT_RATIO; } reward *= productionSpeedRatio; uint8 winningRatio = 100; if (species == uint8(Species.Angel)) { if ( castles[castleId].angelInfluences > castles[castleId].devilInfluences ) { winningRatio += castles[castleId].angelInfluences >= castles[castleId].devilInfluences * 2 ? 30 : 10; } } else if (species == uint8(Species.Devil)) { if ( castles[castleId].devilInfluences > castles[castleId].angelInfluences ) { winningRatio += castles[castleId].devilInfluences >= castles[castleId].angelInfluences * 2 ? 30 : 10; } } reward *= winningRatio; // Zombie effect uint8 zombieDecayRate = 10; if ( (block.number - castles[castleId].lastAttackedBlock) < BLOCKS_PER_3DAYS ) { zombieDecayRate -= castles[castleId].zombies; } reward *= zombieDecayRate; reward *= DELTA; if (species != uint8(Species.King)) { if (castles[castleId].level != 0) { taxRate = castleInfoByLevel[castles[castleId].level] .taxRatio; } } } reward *= FLOATING_FACTOR; if (balance <= reward) { reward = castles[castleId].balance; tax = (reward * taxRate) / 10**2; if (castles[castleId].level != 0) { reward += 20000 * 10**18 * castles[castleId].level; isBuzzerBeater = true; } } else { tax = (reward * taxRate) / 10**2; } reward -= tax; return (reward, tax, isBuzzerBeater); } /* ========== INTERNALS ========== */ function _min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } function _influence( uint8 voteSide, uint8 castleId, uint8 dopeness, bool isPositive ) internal { if (voteSide == uint8(VoteSide.Angel)) { if (isPositive) { castles[castleId].angelInfluences += dopeness; totalAngelInfluences += dopeness; } else { castles[castleId].angelInfluences -= dopeness; totalAngelInfluences -= dopeness; } } else { if (isPositive) { castles[castleId].devilInfluences += dopeness; totalDevilInfluences += dopeness; } else { castles[castleId].devilInfluences -= dopeness; totalDevilInfluences -= dopeness; } } } function _sendReward( uint256 tokenId, uint8 castleId, uint256 reward, uint256 tax, bool isBuzzerBeater ) internal { // accumulate tax castles[castleId].taxPool += tax; // send reward dopes.safeTransfer(_msgSender(), reward); totalClaimedDopes += reward; if (isBuzzerBeater) { emit BuzzerBeater( _msgSender(), tokenId, castleId, castles[castleId].level ); castles[castleId].balance = 0; } else { castles[castleId].balance -= (reward + tax); } } function _isCastleActivated(uint8 castleId) internal view returns (bool) { if (castleId > 0 && castleId <= castleIdxByLayer[0]) return true; if ( (castleId > castleIdxByLayer[0] && castleId <= castleIdxByLayer[1]) && totalClaimedDopes >= layerCondition[1] ) { return true; } if ( (castleId > castleIdxByLayer[1] && castleId <= castleIdxByLayer[2]) && totalClaimedDopes >= layerCondition[2] ) { return true; } return false; } function _infect( uint256 tokenId, uint8 castleId, uint8 oldCastleId ) internal isAvailableZombie(tokenId, castleId) { if (castles[castleId].barricades == 0) { // infect case require( castles[castleId].zombies < MAX_ZOMBIES, "reached the maximum zombie limit" ); castles[castleId].zombies++; castles[castleId].lastAttackedBlock = block.number; if (oldCastleId != 0) { castles[oldCastleId].zombies--; } characters[tokenId].castleId = castleId; characters[tokenId].lastActionedBlock = block.number; } else { // demolish barricades case if (oldCastleId != 0) { castles[oldCastleId].zombies--; characters[tokenId].castleId = 0; } castles[castleId].barricades--; characters[tokenId].lastActionedBlock = block.number; uint256 demolishReward = BARRICADE_PRICE * 10**18; emit AttackBarricade( _msgSender(), tokenId, castleId, demolishReward ); dopes.safeTransfer(_msgSender(), demolishReward); } } /* ========== EXTERNALS ========== */ function work( uint256[] memory tokenIds, uint256[] calldata oldCastleIds, uint8 castleId, uint8 voteSide ) external nonReentrant whenNotPaused verifyCastle(castleId, true) { // 1. idle 상태에서 work // 2. work 상태에서 다른 성으로 work // 3. zombie의 경우 바이케이드가 있으면 demolish require(tokenIds.length != 0, "no tokenIds provided"); uint256 totalReward = 0; uint256 totalTax = 0; for (uint256 i = 0; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; uint8 oldCastleId = characters[tokenId].castleId; require(oldCastleId != castleId, "already exists in this castle"); require( _msgSender() == dopers.ownerOf(tokenId), "msg sender is not doper's owner" ); (uint256 reward, uint256 tax, bool isBuzzerBeater) = this .calculationRewards(tokenId); uint8 species = characters[tokenId].species; if (species == uint8(Species.Zombie)) { _infect(tokenId, castleId, oldCastleId); } else { if ( species == uint8(Species.Human) || species == uint8(Species.King) ) { require( voteSide != uint8(VoteSide.None), "human or king dopers must vote" ); require(voteSide <= uint8(VoteSide.Devil), "invalid vote"); uint8 dopeness = dopenesses[species]; if (oldCastleId == 0) { characters[tokenId].voteSide = voteSide; _influence(voteSide, castleId, dopeness, true); } else { _influence( characters[tokenId].voteSide, oldCastleId, dopeness, false ); characters[tokenId].voteSide = voteSide; _influence(voteSide, castleId, dopeness, true); } } castles[castleId].workers++; if (oldCastleId != 0) { castles[oldCastleId].workers--; } characters[tokenId].castleId = castleId; characters[tokenId].lastActionedBlock = block.number; } if (reward > 0) { _sendReward(tokenId, oldCastleId, reward, tax, isBuzzerBeater); totalTax += tax; totalReward += reward; } } emit Claim(_msgSender(), tokenIds, totalReward, totalTax); emit Worked(_msgSender(), tokenIds, oldCastleIds, castleId); } function claimDope(uint256[] memory tokenIds) external nonReentrant { require(tokenIds.length != 0, "no tokenIds provided"); uint256 totalReward = 0; uint256 totalTax = 0; for (uint256 i = 0; i < tokenIds.length; i++) { require( _msgSender() == dopers.ownerOf(tokenIds[i]), "msg sender is not doper's owner" ); require( characters[tokenIds[i]].species != uint8(Species.Zombie), "zombies can not directly claim" ); (uint256 reward, uint256 tax, bool isBuzzerBeater) = this .calculationRewards(tokenIds[i]); if (reward > 0) { _sendReward( tokenIds[i], characters[tokenIds[i]].castleId, reward, tax, isBuzzerBeater ); totalTax += tax; totalReward += reward; characters[tokenIds[i]].lastActionedBlock = block.number; } if (isBuzzerBeater) break; } emit Claim(_msgSender(), tokenIds, totalReward, totalTax); } function upgradeDoper(uint256 tokenId, uint8 level) external nonReentrant whenNotPaused onlyDoperOwner(tokenId) { require(level <= MAX_LEVEL, "invalid level"); uint8 castleId = characters[tokenId].castleId; require(castleId > castleIdxByLayer[0], "invalid castle"); require( characters[tokenId].level < level, "level has already been reached" ); require(castles[castleId].level >= level, "insufficient castle level"); uint256 price = (dopenessesByUpgrade[level - 1] - ( characters[tokenId].level == 0 ? 0 : dopenessesByUpgrade[characters[tokenId].level - 1] )) * 1000; if (totalDevilInfluences > totalAngelInfluences) { price *= totalDevilInfluences > totalAngelInfluences * 2 ? 10 : 8; } else if (totalDevilInfluences < totalAngelInfluences) { price *= 12; } else { // it handles totalDevilInfluences == totalAngelInfluences price *= 10; } price *= 10**17; dopes.safeTransferFrom(_msgSender(), address(this), price); characters[tokenId].level = level; emit UpgradeDoper(_msgSender(), tokenId, level); } function multiUpgradeDoper(uint256[] memory tokenId, uint8[] memory level) public nonReentrant whenNotPaused { for (uint256 i = 0; i < tokenId.length; i++) { require(level[i] <= MAX_LEVEL, "invalid level"); uint8 castleId = characters[tokenId[i]].castleId; require(castleId > castleIdxByLayer[0], "invalid castle"); require( characters[tokenId[i]].level < level[i], "level has already been reached" ); require( castles[castleId].level >= level[i], "insufficient castle level" ); uint256 price = (dopenessesByUpgrade[level[i] - 1] - ( characters[tokenId[i]].level == 0 ? 0 : dopenessesByUpgrade[characters[tokenId[i]].level - 1] )) * 1000; if (totalDevilInfluences > totalAngelInfluences) { price *= totalDevilInfluences > totalAngelInfluences * 2 ? 10 : 8; } else if (totalDevilInfluences < totalAngelInfluences) { price *= 12; } else { // it handles totalDevilInfluences == totalAngelInfluences price *= 10; } price *= 10**17; dopes.safeTransferFrom(_msgSender(), address(this), price); characters[tokenId[i]].level = level[i]; emit UpgradeDoper(_msgSender(), tokenId[i], level[i]); } } /************* * For King * *************/ function purchaseCastle(uint256 tokenId, uint8 castleId) external nonReentrant whenNotPaused onlyDoperOwner(tokenId) verifyCastle(castleId, false) { require( castleId > castleIdxByLayer[0], "init castle cannot be purchased" ); require( characters[tokenId].species == uint8(Species.King), "doper must be king" ); require(_isCastleActivated(castleId), "castle is not activated"); require( characters[tokenId].isCastleOwner == false, "A king already has a castle." ); dopes.safeTransferFrom(_msgSender(), address(this), CASTLE_PRICE); castles[castleId] = Castle({ hasFarm: false, barricades: 0, level: 1, zombies: 0, workers: 0, angelInfluences: 0, devilInfluences: 0, ownerTokenID: tokenId, taxPool: 0, balance: castleInfoByLevel[0].upgradeBalance, lastAttackedBlock: 0 }); characters[tokenId].isCastleOwner = true; emit PurchaseCastle(_msgSender(), castleId); } function purchaseTemple(uint256 tokenId) external nonReentrant onlyDoperOwner(tokenId) { require( block.number >= BLOCKS_PER_DAY + castles[0].lastAttackedBlock, "too soon to buy the temple again" ); require( characters[tokenId].species == uint8(Species.King), "doper must be king" ); require(castles[0].ownerTokenID != tokenId, "You already own the temple"); dopes.safeTransferFrom(_msgSender(), templeSink, TEMPLE_PRICE); castles[0].ownerTokenID = tokenId; castles[0].lastAttackedBlock = block.number; emit PurchaseCastle(_msgSender(), 0); } function upgradeCastle(uint8 castleId) external nonReentrant whenNotPaused onlyCastleOwner(castleId) verifyCastle(castleId, true) { require(castles[castleId].balance == 0, "castle balance remains"); require( castles[castleId].level < MAX_LEVEL, "castle already reached max level" ); uint256 price = castleInfoByLevel[castles[castleId].level + 1] .levelUpPrice; dopes.safeTransferFrom(_msgSender(), address(this), price); castles[castleId].level++; castles[castleId].balance = castleInfoByLevel[castles[castleId].level] .upgradeBalance; emit UpgradeCastle(_msgSender(), castleId, castles[castleId].level); } function claimTax(uint8 castleId) external nonReentrant onlyCastleOwner(castleId) verifyCastle(castleId, true) { require(castles[castleId].taxPool > 0, "taxpool is empty"); dopes.safeTransfer(_msgSender(), castles[castleId].taxPool); totalClaimedDopes += castles[castleId].taxPool; emit ClaimTax(_msgSender(), castleId, castles[castleId].taxPool); castles[castleId].taxPool = 0; } function buildFarm(uint8 castleId) external nonReentrant whenNotPaused onlyCastleOwner(castleId) verifyCastle(castleId, true) { require( castles[castleId].hasFarm == false, "farm has already been installed" ); uint256 price = 60000; if (castles[castleId].level == 2) { price -= 20000; } else if (castles[castleId].level == 3) { price -= 26000; } else if (castles[castleId].level == 4) { price -= 34000; } else if (castles[castleId].level == 5) { price -= 44000; } price *= 10**18; dopes.safeTransferFrom(_msgSender(), address(this), price); castles[castleId].hasFarm = true; emit PurchaseFarm(_msgSender(), castleId, price); } function buildBarricade(uint8 castleId, uint8 amount) external nonReentrant whenNotPaused onlyCastleOwner(castleId) verifyCastle(castleId, true) { require( castles[castleId].barricades + amount <= 5, "exceeded installable barricades" ); uint256 price = BARRICADE_PRICE * 10**18 * amount; dopes.safeTransferFrom(_msgSender(), address(this), price); castles[castleId].barricades += amount; emit PurchaseBarricades(_msgSender(), castleId, amount, price); } /************* * For EndGame * *************/ function endGameClaim(uint256 tokenId) external onlyDoperOwner(tokenId) nonReentrant { require(winner != 0, "The game is not over yet."); require( characters[tokenId].claimable == false, "have already been paid" ); uint8 species = characters[tokenId].species; require( species == uint8(Species.Angel) || species == uint8(Species.Devil), "doper must be immortal" ); if (winner == uint8(Species.Angel)) { require(species == uint8(Species.Angel), "winner is angel"); } else { // winner == uint8(Species.Devil) case require(species == uint8(Species.Devil), "winner is devil"); } characters[tokenId].claimable = true; dopes.safeTransfer(_msgSender(), endGameReward); emit EndGameClaim(_msgSender(), tokenId); } /* ========== RESTRICTED FUNCTIONS ========== */ function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function setGameParameters( uint8 _delta, uint16 _barricadePrice, uint16 _zombieTime, uint32 _blocksPerThreeDays, uint32 _zombieDelta, uint256 _templePrice ) external onlyOwner whenPaused { DELTA = _delta; BARRICADE_PRICE = _barricadePrice; ZOMBIE_TIME = _zombieTime; BLOCKS_PER_3DAYS = _blocksPerThreeDays; ZOMBIE_DELTA = _zombieDelta; TEMPLE_PRICE = _templePrice; } function registerDoper(uint256[] memory tokenIds, uint8 species) external whenPaused onlyOwner { require(tokenIds.length != 0, "no tokenIds provided"); require( species >= uint8(Species.Human) && species <= uint8(Species.Zombie), "invalid species" ); for (uint256 i = 0; i < tokenIds.length; i++) { require(tokenIds[i] >= 0 && tokenIds[i] < 10000, "invalid tokenId"); characters[tokenIds[i]].species = species; } } function endgame() external onlyOwner { require(winner == 0, "The game is already over"); require(totalClaimedDopes > 6 * 10**26, "can't end the game hastily"); require( totalAngelInfluences != totalDevilInfluences, "There must be a winner" ); endGameReward = dopes.balanceOf(address(this)) / 500; winner = totalAngelInfluences > totalDevilInfluences ? uint8(Species.Angel) : uint8(Species.Devil); _pause(); emit EndGame(totalAngelInfluences, totalDevilInfluences); } /* ========== MODIFIERS ========== */ modifier onlyCastleOwner(uint8 castleId) { require( dopers.ownerOf(castles[castleId].ownerTokenID) == _msgSender(), "msg sender is not castle's owner" ); _; } modifier onlyDoperOwner(uint256 tokenId) { require( dopers.ownerOf(tokenId) == _msgSender(), "msg sender is not token owner" ); _; } modifier verifyCastle(uint8 castleId, bool saled) { require( castleId > 0 && castleId < MAX_CASTLE_SIZE, "invalid castle index" ); if (saled) { if (castleId > 4) { require( castles[castleId].ownerTokenID != 0, "castle was not purchased" ); } } else { require( castles[castleId].ownerTokenID == 0, "castled already sold" ); } _; } modifier isAvailableZombie(uint256 tokenId, uint8 castleId) { require( castleId > castleIdxByLayer[0], "zombies can't act in 1st layer" ); require( (block.number - characters[tokenId].lastActionedBlock) > ZOMBIE_TIME, "zombie can't act yet" ); _; } /* ========== EVENTS ========== */ event Worked( address indexed user, uint256[] tokenIds, uint256[] oldCastleIds, uint8 newCastleId ); event Claim( address indexed user, uint256[] tokenIds, uint256 reward, uint256 tax ); event BuzzerBeater( address indexed user, uint256 tokenId, uint8 castleId, uint8 level ); event UpgradeCastle(address indexed user, uint8 castleId, uint8 level); event UpgradeDoper(address indexed user, uint256 tokenId, uint8 level); event ClaimTax(address indexed user, uint8 castleId, uint256 tax); event PurchaseCastle(address indexed user, uint8 castleId); event PurchaseFarm(address indexed user, uint8 castleId, uint256 price); event PurchaseBarricades( address indexed user, uint8 castleId, uint8 amount, uint256 price ); event AttackBarricade( address indexed user, uint256 tokenId, uint8 castleId, uint256 reward ); event EndGame(uint256 endAngelInfluences, uint256 endDevilInfluences); event EndGameClaim(address indexed user, uint256 tokenId); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"dopersAddress","type":"address"},{"internalType":"address","name":"dopesAddress","type":"address"},{"internalType":"address","name":"_templeSink","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"castleId","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"AttackBarricade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"castleId","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"level","type":"uint8"}],"name":"BuzzerBeater","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tax","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint8","name":"castleId","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"tax","type":"uint256"}],"name":"ClaimTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"endAngelInfluences","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endDevilInfluences","type":"uint256"}],"name":"EndGame","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"EndGameClaim","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint8","name":"castleId","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"amount","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"PurchaseBarricades","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint8","name":"castleId","type":"uint8"}],"name":"PurchaseCastle","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint8","name":"castleId","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"PurchaseFarm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint8","name":"castleId","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"level","type":"uint8"}],"name":"UpgradeCastle","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"level","type":"uint8"}],"name":"UpgradeDoper","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"oldCastleIds","type":"uint256[]"},{"indexed":false,"internalType":"uint8","name":"newCastleId","type":"uint8"}],"name":"Worked","type":"event"},{"inputs":[],"name":"ANGEL_WINNING_BENEFIT_RATIO","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BARRICADE_PRICE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKS_PER_3DAYS","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKS_PER_DAY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKS_PER_WEEK","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CASTLE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELTA","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOUBLE_WINNER_BENEFIT_RATIO","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FARM_BENEFIT_RATIO","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FLOATING_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CASTLE_SIZE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LAYER","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LEVEL","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SPECIES","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ZOMBIES","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEMPLE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WINNER_BENEFIT_RATIO","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZOMBIE_DELTA","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZOMBIE_TIME","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"castleId","type":"uint8"},{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"buildBarricade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"castleId","type":"uint8"}],"name":"buildFarm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"calculationRewards","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"tax","type":"uint256"},{"internalType":"bool","name":"isBuzzerBeater","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"castleIdxByLayer","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"castleInfoByLevel","outputs":[{"internalType":"uint8","name":"taxRatio","type":"uint8"},{"internalType":"uint256","name":"upgradeBalance","type":"uint256"},{"internalType":"uint256","name":"levelUpPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"castles","outputs":[{"internalType":"bool","name":"hasFarm","type":"bool"},{"internalType":"uint8","name":"barricades","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint8","name":"zombies","type":"uint8"},{"internalType":"uint16","name":"workers","type":"uint16"},{"internalType":"uint256","name":"angelInfluences","type":"uint256"},{"internalType":"uint256","name":"devilInfluences","type":"uint256"},{"internalType":"uint256","name":"ownerTokenID","type":"uint256"},{"internalType":"uint256","name":"taxPool","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"lastAttackedBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"characters","outputs":[{"internalType":"uint8","name":"voteSide","type":"uint8"},{"internalType":"uint8","name":"castleId","type":"uint8"},{"internalType":"uint8","name":"species","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"bool","name":"claimable","type":"bool"},{"internalType":"bool","name":"isCastleOwner","type":"bool"},{"internalType":"uint256","name":"lastActionedBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimDope","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"castleId","type":"uint8"}],"name":"claimTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dopenesses","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dopenessesByUpgrade","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dopers","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dopes","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"endGameClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endGameReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endgame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"layerCondition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"uint8[]","name":"level","type":"uint8[]"}],"name":"multiUpgradeDoper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"castleId","type":"uint8"}],"name":"ownerOfCastle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"castleId","type":"uint8"}],"name":"purchaseCastle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"purchaseTemple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint8","name":"species","type":"uint8"}],"name":"registerDoper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_delta","type":"uint8"},{"internalType":"uint16","name":"_barricadePrice","type":"uint16"},{"internalType":"uint16","name":"_zombieTime","type":"uint16"},{"internalType":"uint32","name":"_blocksPerThreeDays","type":"uint32"},{"internalType":"uint32","name":"_zombieDelta","type":"uint32"},{"internalType":"uint256","name":"_templePrice","type":"uint256"}],"name":"setGameParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"templeSink","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAngelInfluences","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimedDopes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDevilInfluences","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"castleId","type":"uint8"}],"name":"upgradeCastle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"level","type":"uint8"}],"name":"upgradeDoper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"winner","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"oldCastleIds","type":"uint256[]"},{"internalType":"uint8","name":"castleId","type":"uint8"},{"internalType":"uint8","name":"voteSide","type":"uint8"}],"name":"work","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600780546001600160681b0319166b030d40000054600bb813881e17905569d3c21bcecceda100000060085560e0604052600060809081526a108b2a2c2802909400000060a0526b0129c8f71ad02e2a6800000060c05262000066906009906003620009cc565b506040805160608101825260048152602080820152603c918101919091526200009490600c90600362000a1a565b506040805160a08101825260148152601e60208201526028918101829052606081018290526080810191909152620000d190600d90600562000a1a565b506040805160a08101825260068152600f6020820152601b91810191909152602a6060820152603c60808201526200010e90600e90600562000a1a565b503480156200011c57600080fd5b50604051620060b1380380620060b18339810160408190526200013f9162000ade565b6200014a33620008be565b6000805460ff60a01b1916815560018055600380546001600160a01b038681166001600160a01b03199283161783556002805487831690841617905560258054918616919092161790556040805160608082018352600a8083526a034f086f3b33b6840000006020808501829052938501879052600f805460ff199081168417909155601082905560118890558551808501875283815280860183905286018890526012805482169093179092556013819055601487905584518084018652600980825269fe1c215e8f838e0000008287018190526905b7ac4553de7ae000009288018390526015805486169092179091556016556017558451808401865260088082526a0152d02c7e14af680000008287018190526906c6b935b8bbd4000000928801839052601880548616909217909155601955601a558451808401865260078082526a01a784379d99db420000008287018190526907695a92c20d6fe00000928801839052601b80548616909217909155601c55601d558451928301855260058084526a02a5a058fc295ed0000000848601819052690878678326eac900000094909601849052601e805490931617909155601f939093559055620003129162000b28565b9050604051806101600160405280600015158152602001600060ff168152602001600560ff168152602001600060ff168152602001600061ffff16815260200160008152602001600081526020016000815260200160008152602001828152602001600081525060246000600160ff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548161ffff021916908361ffff16021790555060a0820151816001015560c0820151816002015560e08201518160030155610100820151816004015561012082015181600501556101408201518160060155905050604051806101600160405280600015158152602001600060ff168152602001600560ff168152602001600060ff168152602001600061ffff16815260200160008152602001600081526020016000815260200160008152602001828152602001600081525060246000600260ff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548161ffff021916908361ffff16021790555060a0820151816001015560c0820151816002015560e08201518160030155610100820151816004015561012082015181600501556101408201518160060155905050604051806101600160405280600015158152602001600060ff168152602001600560ff168152602001600060ff168152602001600061ffff16815260200160008152602001600081526020016000815260200160008152602001828152602001600081525060246000600360ff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548161ffff021916908361ffff16021790555060a0820151816001015560c0820151816002015560e08201518160030155610100820151816004015561012082015181600501556101408201518160060155905050604051806101600160405280600015158152602001600060ff168152602001600560ff168152602001600060ff168152602001600061ffff16815260200160008152602001600081526020016000815260200160008152602001828152602001600081525060246000600460ff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548161ffff021916908361ffff16021790555060a0820151816001015560c0820151816002015560e08201518160030155610100820151816004015561012082015181600501556101408201518160060155905050620008b46200090e60201b60201c565b5050505062000b56565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200091862000971565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620009543390565b6040516001600160a01b03909116815260200160405180910390a1565b62000985600054600160a01b900460ff1690565b15620009ca5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b565b826003810192821562000a08579160200282015b8281111562000a0857825182906001600160601b0316905591602001919060010190620009e0565b5062000a1692915062000aaa565b5090565b60018301918390821562000a085791602002820160005b8382111562000a7157835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262000a31565b801562000aa05782816101000a81549060ff021916905560010160208160000104928301926001030262000a71565b505062000a169291505b5b8082111562000a16576000815560010162000aab565b80516001600160a01b038116811462000ad957600080fd5b919050565b60008060006060848603121562000af457600080fd5b62000aff8462000ac1565b925062000b0f6020850162000ac1565b915062000b1f6040850162000ac1565b90509250925092565b600081600019048311821515161562000b5157634e487b7160e01b600052601160045260246000fd5b500290565b61554b8062000b666000396000f3fe608060405234801561001057600080fd5b50600436106103835760003560e01c80637f5247d9116101de578063c0a94ff31161010f578063ecb5fff6116100ad578063fbadc7861161007c578063fbadc7861461089e578063fc47e209146108b1578063fc897b47146108ba578063fe1cd8d3146108ec57600080fd5b8063ecb5fff61461086e578063f2fde38b1461087b578063f55982451461088e578063f8d56a261461089657600080fd5b8063d732a917116100e9578063d732a9171461083b578063dfbf53ae1461084e578063e22f8e0b14610724578063ecb2fcff1461085b57600080fd5b8063c0a94ff314610800578063c806df9914610813578063d5bd95991461082657600080fd5b80639c43c7041161017c578063a1eb016511610156578063a1eb0165146107c7578063a49062d414610724578063ae0e77f4146107da578063b148a632146107ed57600080fd5b80639c43c704146107a45780639dd63d6b146107b75780639f9dff1d146107bf57600080fd5b8063888cdc60116101b8578063888cdc60146107455780638da5cb5b1461077557806394a2791f1461078657806396566f8f1461079157600080fd5b80637f5247d91461072c578063816d192f146107355780638456cb591461073d57600080fd5b80633b5c58a6116102b85780635c975abb116102565780636fc62782116102305780636fc62782146106fc578063715018a61461070557806372ba491f1461070d5780637da29baf1461072457600080fd5b80635c975abb146106ba5780636bb987fe146106d75780636d5d0778146106f357600080fd5b80634810bc59116102925780634810bc59146105e957806348c1cb8d1461068c5780634db106181461069f5780635a9a3aee146106b257600080fd5b80633b5c58a6146105bb5780633f2e1e4e146105ce5780633f4ba83a146105e157600080fd5b80631f1204ef116103255780632e60312a116102ff5780632e60312a1461056f578063338bef4c14610582578063338cc3f11461059557806334967e5c146105a857600080fd5b80631f1204ef1461045957806324a24af61461048557806325d12d6d1461049857600080fd5b8063166e3ac011610361578063166e3ac01461040e5780631bafda11146104235780631dac07691461042c5780631ed92e5d1461043f57600080fd5b806305612b021461038857806313371a20146103ac578063150b7a02146103d7575b600080fd5b610399692a5a058fc295ed00000081565b6040519081526020015b60405180910390f35b6002546103bf906001600160a01b031681565b6040516001600160a01b0390911681526020016103a3565b6103f56103e5366004614b5a565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016103a3565b61042161041c366004614cc3565b6108f5565b005b61039960215481565b6003546103bf906001600160a01b031681565b610447603d81565b60405160ff90911681526020016103a3565b60075461047090600160481b900463ffffffff1681565b60405163ffffffff90911681526020016103a3565b610421610493366004614d7f565b610f24565b61050e6104a6366004614dcd565b602460205260009081526040902080546001820154600283015460038401546004850154600586015460069096015460ff8087169761010088048216976201000081048316976301000000820490931696600160201b90910461ffff1695929490939091908b565b604080519b15158c5260ff9a8b1660208d0152988a16988b019890985297909516606089015261ffff909316608088015260a087019190915260c086015260e0850152610100840152610120830191909152610140820152610160016103a3565b61042161057d366004614dcd565b611086565b610421610590366004614e0e565b6113fb565b6104476105a3366004614e7b565b61148c565b6104216105b6366004614dcd565b6114b6565b6104216105c9366004614e94565b61176d565b6104216105dc366004614e7b565b611c9b565b610421611f77565b6106476105f7366004614e7b565b6023602052600090815260409020805460019091015460ff80831692610100810482169262010000820483169263010000008304811692600160201b8104821692600160281b9091049091169087565b6040805160ff98891681529688166020880152948716948601949094529490911660608401521515608083015291151560a082015260c081019190915260e0016103a3565b61042161069a366004614f56565b611f89565b6104216106ad366004614e7b565b612390565b610447603281565b600054600160a01b900460ff1660405190151581526020016103a3565b6106e0611c2081565b60405161ffff90911681526020016103a3565b61039960085481565b61039960065481565b61042161269c565b60075461047090600160281b900463ffffffff1681565b610447600581565b61039960045481565b610447600281565b6104216126ae565b610758610753366004614e7b565b6126be565b6040805193845260208401929092521515908201526060016103a3565b6000546001600160a01b03166103bf565b610399633b9aca0081565b61042161079f366004614f79565b612cb2565b6104216107b2366004614f56565b61304d565b61042161350e565b610447601e81565b6007546106e090610100900461ffff1681565b6104216107e8366004614dcd565b613716565b6104216107fb366004614fae565b613aad565b61044761080e366004614e7b565b613db6565b610399610821366004614e7b565b613dc6565b6007546106e0906301000000900461ffff1681565b6025546103bf906001600160a01b031681565b6005546104479060ff1681565b610447610869366004614e7b565b613ddd565b6007546104479060ff1681565b610421610889366004614fd8565b613ded565b610447600381565b610447600a81565b6103bf6108ac366004614dcd565b613e66565b6106e061c4e081565b6108cd6108c8366004614e7b565b613fbc565b6040805160ff90941684526020840192909252908201526060016103a3565b61039960225481565b600260015414156109215760405162461bcd60e51b815260040161091890614ff5565b60405180910390fd5b600260015561092e613fe7565b81600160008260ff161180156109475750603d60ff8316105b6109635760405162461bcd60e51b81526004016109189061502c565b80156109ac5760048260ff1611156109a75760ff82166000908152602460205260409020600301546109a75760405162461bcd60e51b81526004016109189061505a565b6109df565b60ff8216600090815260246020526040902060030154156109df5760405162461bcd60e51b815260040161091890615091565b86516109fd5760405162461bcd60e51b8152600401610918906150bf565b60008060005b8951811015610e885760008a8281518110610a2057610a206150ed565b6020908102919091018101516000818152602390925260409091205490915060ff6101009091048116908916811415610a9b5760405162461bcd60e51b815260206004820152601d60248201527f616c72656164792065786973747320696e207468697320636173746c650000006044820152606401610918565b6003546040516331a9108f60e11b8152600481018490526001600160a01b0390911690636352211e9060240160206040518083038186803b158015610adf57600080fd5b505afa158015610af3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b179190615103565b6001600160a01b0316336001600160a01b031614610b775760405162461bcd60e51b815260206004820152601f60248201527f6d73672073656e646572206973206e6f7420646f7065722773206f776e6572006044820152606401610918565b60405163044466e360e51b81526004810183905260009081908190309063888cdc609060240160606040518083038186803b158015610bb557600080fd5b505afa158015610bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed9190615130565b600088815260236020526040902054929550909350915062010000900460ff166004811415610c2657610c21868e87614034565b610e43565b60ff81161580610c39575060ff81166001145b15610d815760ff8c16610c8e5760405162461bcd60e51b815260206004820152601e60248201527f68756d616e206f72206b696e6720646f70657273206d75737420766f746500006044820152606401610918565b600260ff8d161115610cd15760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420766f746560a01b6044820152606401610918565b6000600d8260ff1660058110610ce957610ce96150ed565b602081049091015460ff601f9092166101000a9004811691508616610d35576000878152602360205260409020805460ff191660ff8f16179055610d308d8f8360016143be565b610d7f565b600087815260236020526040812054610d579160ff90911690889084906143be565b6000878152602360205260409020805460ff191660ff8f16179055610d7f8d8f8360016143be565b505b60ff8d1660009081526024602052604090208054600160201b900461ffff16906004610dac8361517b565b91906101000a81548161ffff021916908361ffff160217905550508460ff16600014610e195760ff851660009081526024602052604090208054600160201b900461ffff16906004610dfd8361519d565b91906101000a81548161ffff021916908361ffff160217905550505b6000868152602360205260409020805460ff8f166101000261ff0019909116178155436001909101555b8315610e6f57610e568686868686614505565b610e6083896151bb565b9750610e6c848a6151bb565b98505b5050505050508080610e80906151d3565b915050610a03565b50336001600160a01b03167fab498de26f80277f14b34408f10c77cf1383957da04fa4363daeefc3f67efc938a8484604051610ec693929190615229565b60405180910390a2336001600160a01b03167f4b24521fbc5d368ba994064a74ccd3e2ab404e64a8ff62f657c0064a25b762348a8a8a8a604051610f0d949392919061524e565b60405180910390a250506001805550505050505050565b610f2c61461a565b610f3461466a565b8151610f525760405162461bcd60e51b8152600401610918906150bf565b600460ff82161115610f985760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207370656369657360881b6044820152606401610918565b60005b8251811015611081576000838281518110610fb857610fb86150ed565b602002602001015110158015610fe85750612710838281518110610fde57610fde6150ed565b6020026020010151105b6110265760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a59081d1bdad95b9259608a1b6044820152606401610918565b816023600085848151811061103d5761103d6150ed565b6020026020010151815260200190815260200160002060000160026101000a81548160ff021916908360ff1602179055508080611079906151d3565b915050610f9b565b505050565b600260015414156110a95760405162461bcd60e51b815260040161091890614ff5565b60026001556110b6613fe7565b80336003805460ff84166000908152602460208190526040918290209093015490516331a9108f60e11b815260048101919091526001600160a01b039384169390911691636352211e910160206040518083038186803b15801561111957600080fd5b505afa15801561112d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111519190615103565b6001600160a01b0316146111775760405162461bcd60e51b8152600401610918906152ad565b81600160008260ff161180156111905750603d60ff8316105b6111ac5760405162461bcd60e51b81526004016109189061502c565b80156111f55760048260ff1611156111f05760ff82166000908152602460205260409020600301546111f05760405162461bcd60e51b81526004016109189061505a565b611228565b60ff8216600090815260246020526040902060030154156112285760405162461bcd60e51b815260040161091890615091565b60ff808516600090815260246020526040902054161561128a5760405162461bcd60e51b815260206004820152601f60248201527f6661726d2068617320616c7265616479206265656e20696e7374616c6c6564006044820152606401610918565b60ff80851660009081526024602052604090205461ea60916201000090910416600214156112c5576112be614e20826152e2565b9050611355565b60ff85811660009081526024602052604090205462010000900416600314156112f4576112be616590826152e2565b60ff8581166000908152602460205260409020546201000090041660041415611323576112be6184d0826152e2565b60ff85811660009081526024602052604090205462010000900416600514156113555761135261abe0826152e2565b90505b611367670de0b6b3a7640000826152f9565b9050611382335b6002546001600160a01b03169030846146c4565b60ff85166000908152602460205260409020805460ff191660011790556113a63390565b6040805160ff88168152602081018490526001600160a01b0392909216917ff93ae10639e96b7ed026e3acc650e8514ad7dbc46f95fccdc8dddcff36bb1efc91015b60405180910390a2505060018055505050565b61140361466a565b61140b61461a565b6007805463ffffffff938416600160481b026cffffffff0000000000000000001995909416600160281b0268ffffffff00000000001961ffff9788166301000000021668ffffffffffff00000019989097166101000262ffffff1990921660ff99909916989098171795909516939093179490941716929092179055600855565b600e816005811061149c57600080fd5b60209182820401919006915054906101000a900460ff1681565b600260015414156114d95760405162461bcd60e51b815260040161091890614ff5565b600260015580336003805460ff84166000908152602460208190526040918290209093015490516331a9108f60e11b815260048101919091526001600160a01b039384169390911691636352211e910160206040518083038186803b15801561154157600080fd5b505afa158015611555573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115799190615103565b6001600160a01b03161461159f5760405162461bcd60e51b8152600401610918906152ad565b81600160008260ff161180156115b85750603d60ff8316105b6115d45760405162461bcd60e51b81526004016109189061502c565b801561161d5760048260ff1611156116185760ff82166000908152602460205260409020600301546116185760405162461bcd60e51b81526004016109189061505a565b611650565b60ff8216600090815260246020526040902060030154156116505760405162461bcd60e51b815260040161091890615091565b60ff84166000908152602460205260409020600401546116a55760405162461bcd60e51b815260206004820152601060248201526f746178706f6f6c20697320656d70747960801b6044820152606401610918565b6116d23360ff86166000908152602460205260409020600401546002546001600160a01b0316919061472f565b60ff8416600090815260246020526040812060049081015481549092906116fa9084906151bb565b909155505060ff841660008181526024602090815260409182902060040154825193845290830152805133927f7dd1639924f2093c8a0b146cfd7f84224e220fe0dff85a16de3572b03de62d2492908290030190a250505060ff1660009081526024602052604081206004015560018055565b600260015414156117905760405162461bcd60e51b815260040161091890614ff5565b600260015561179d613fe7565b60005b8251811015611c9257600560ff168282815181106117c0576117c06150ed565b602002602001015160ff1611156118095760405162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a59081b195d995b609a1b6044820152606401610918565b600060236000858481518110611821576118216150ed565b6020026020010151815260200190815260200160002060000160019054906101000a900460ff169050600c60006003811061185e5761185e6150ed565b602081049091015460ff601f9092166101000a90048116908216116118b65760405162461bcd60e51b815260206004820152600e60248201526d696e76616c696420636173746c6560901b6044820152606401610918565b8282815181106118c8576118c86150ed565b602002602001015160ff16602360008685815181106118e9576118e96150ed565b6020908102919091018101518252810191909152604001600020546301000000900460ff161061195b5760405162461bcd60e51b815260206004820152601e60248201527f6c6576656c2068617320616c7265616479206265656e207265616368656400006044820152606401610918565b82828151811061196d5761196d6150ed565b60209081029190910181015160ff838116600090815260249093526040909220549082166201000090910490911610156119e55760405162461bcd60e51b81526020600482015260196024820152781a5b9cdd59999a58da595b9d0818d85cdd1b19481b195d995b603a1b6044820152606401610918565b6000602360008685815181106119fd576119fd6150ed565b6020908102919091018101518252810191909152604001600020546301000000900460ff1615611aa057600e600160236000888781518110611a4157611a416150ed565b6020026020010151815260200190815260200160002060000160039054906101000a900460ff16611a729190615318565b60ff1660058110611a8557611a856150ed565b602081049091015460ff601f9092166101000a900416611aa3565b60005b600e6001868681518110611ab957611ab96150ed565b6020026020010151611acb9190615318565b60ff1660058110611ade57611ade6150ed565b602091828204019190069054906101000a900460ff16611afe9190615318565b611b0d9060ff166103e861533b565b61ffff1690506021546022541115611b5357602154611b2d9060026152f9565b60225411611b3c576008611b3f565b600a5b611b4c9060ff16826152f9565b9050611b78565b6021546022541015611b6a57611b4c600c826152f9565b611b75600a826152f9565b90505b611b8a67016345785d8a0000826152f9565b9050611b953361136e565b838381518110611ba757611ba76150ed565b602002602001015160236000878681518110611bc557611bc56150ed565b6020026020010151815260200190815260200160002060000160036101000a81548160ff021916908360ff160217905550611bfd3390565b6001600160a01b03167f37c7cfe655b76663aa20f92f231678f8d7e8339c50e1449ae03c197eeea50e21868581518110611c3957611c396150ed565b6020026020010151868681518110611c5357611c536150ed565b6020026020010151604051611c7592919091825260ff16602082015260400190565b60405180910390a250508080611c8a906151d3565b9150506117a0565b50506001805550565b60026001541415611cbe5760405162461bcd60e51b815260040161091890614ff5565b600260015580336003546040516331a9108f60e11b8152600481018490526001600160a01b039283169290911690636352211e9060240160206040518083038186803b158015611d0d57600080fd5b505afa158015611d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d459190615103565b6001600160a01b031614611d6b5760405162461bcd60e51b815260040161091890615365565b6000805260246020527fb7634ec2165a7280a285aac3ec10cf370eca86d8aa9d3243c90b2151434091b354611da290611c206151bb565b431015611df15760405162461bcd60e51b815260206004820181905260248201527f746f6f20736f6f6e20746f20627579207468652074656d706c6520616761696e6044820152606401610918565b60008281526023602052604090205460ff6201000090910416600114611e4e5760405162461bcd60e51b8152602060048201526012602482015271646f706572206d757374206265206b696e6760701b6044820152606401610918565b6000805260246020527fb7634ec2165a7280a285aac3ec10cf370eca86d8aa9d3243c90b2151434091b054821415611ec85760405162461bcd60e51b815260206004820152601a60248201527f596f7520616c7265616479206f776e207468652074656d706c650000000000006044820152606401610918565b611ee9336025546008546002546001600160a01b03908116939216906146c4565b6000808052602460209081527fb7634ec2165a7280a285aac3ec10cf370eca86d8aa9d3243c90b2151434091b0849055437fb7634ec2165a7280a285aac3ec10cf370eca86d8aa9d3243c90b2151434091b355604080519283525133927fb57e7a25d178dc094b3b25471064e0af821ff1a9638a070af5cf4f3ddf222f1e92908290030190a2505060018055565b611f7f61466a565b611f8761475f565b565b60026001541415611fac5760405162461bcd60e51b815260040161091890614ff5565b6002600155611fb9613fe7565b81336003546040516331a9108f60e11b8152600481018490526001600160a01b039283169290911690636352211e9060240160206040518083038186803b15801561200357600080fd5b505afa158015612017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203b9190615103565b6001600160a01b0316146120615760405162461bcd60e51b815260040161091890615365565b600560ff831611156120a55760405162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a59081b195d995b609a1b6044820152606401610918565b600083815260236020526040902054600c5460ff6101009092048216911681116121025760405162461bcd60e51b815260206004820152600e60248201526d696e76616c696420636173746c6560901b6044820152606401610918565b60008481526023602052604090205460ff8085166301000000909204161061216c5760405162461bcd60e51b815260206004820152601e60248201527f6c6576656c2068617320616c7265616479206265656e207265616368656400006044820152606401610918565b60ff8181166000908152602460205260409020548185166201000090910490911610156121d75760405162461bcd60e51b81526020600482015260196024820152781a5b9cdd59999a58da595b9d0818d85cdd1b19481b195d995b603a1b6044820152606401610918565b6000848152602360205260408120546301000000900460ff161561224b57600085815260236020526040902054600e9061221d906001906301000000900460ff16615318565b60ff1660058110612230576122306150ed565b602081049091015460ff601f9092166101000a90041661224e565b60005b600e61225b600187615318565b60ff166005811061226e5761226e6150ed565b602091828204019190069054906101000a900460ff1661228e9190615318565b61229d9060ff166103e861533b565b61ffff16905060215460225411156122e3576021546122bd9060026152f9565b602254116122cc5760086122cf565b600a5b6122dc9060ff16826152f9565b9050612308565b60215460225410156122fa576122dc600c826152f9565b612305600a826152f9565b90505b61231a67016345785d8a0000826152f9565b90506123253361136e565b6000858152602360205260409020805463ff0000001916630100000060ff871602179055336001600160a01b03167f37c7cfe655b76663aa20f92f231678f8d7e8339c50e1449ae03c197eeea50e2186866040516113e892919091825260ff16602082015260400190565b80336003546040516331a9108f60e11b8152600481018490526001600160a01b039283169290911690636352211e9060240160206040518083038186803b1580156123da57600080fd5b505afa1580156123ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124129190615103565b6001600160a01b0316146124385760405162461bcd60e51b815260040161091890615365565b6002600154141561245b5760405162461bcd60e51b815260040161091890614ff5565b600260015560055460ff166124b25760405162461bcd60e51b815260206004820152601960248201527f5468652067616d65206973206e6f74206f766572207965742e000000000000006044820152606401610918565b600082815260236020526040902054600160201b900460ff16156125115760405162461bcd60e51b81526020600482015260166024820152751a185d9948185b1c9958591e481899595b881c185a5960521b6044820152606401610918565b60008281526023602052604090205462010000900460ff16600281148061253b575060ff81166003145b6125805760405162461bcd60e51b8152602060048201526016602482015275191bdc195c881b5d5cdd081899481a5b5b5bdc9d185b60521b6044820152606401610918565b60055460ff16600214156125d85760ff81166002146125d35760405162461bcd60e51b815260206004820152600f60248201526e1dda5b9b995c881a5cc8185b99d95b608a1b6044820152606401610918565b61261d565b60ff811660031461261d5760405162461bcd60e51b815260206004820152600f60248201526e1dda5b9b995c881a5cc819195d9a5b608a1b6044820152606401610918565b6000838152602360205260409020805464ff000000001916600160201b17905561265d6126473390565b6006546002546001600160a01b0316919061472f565b60405183815233907fed3768cdac6e8afc0340c26d26bb36ad9a46fd08010d64abae55b7531ae6a018906020015b60405180910390a250506001805550565b6126a461466a565b611f8760006147af565b6126b661466a565b611f876147ff565b600081815260236020908152604080832054610100900460ff168084526024909252822060050154829182918115806126f5575080155b1561270c5760008060009450945094505050612cab565b6000868152602360205260408120805460019091015491945062010000900460ff1690849061276e9061273f90436152e2565b60ff84166004146127525761c4e0612763565b600754600160281b900463ffffffff165b63ffffffff16614842565b965069d3c21bcecceda100000083116127935761278c6007886152f9565b96506127f8565b6a01a784379d99db4200000083116127b05761278c6008886152f9565b6a027b46536c66c8e300000083116127cd5761278c6009886152f9565b6a034f086f3b33b68400000083116127ea5761278c600a886152f9565b6127f5600b886152f9565b96505b6000888152602360205260409020546301000000900460ff1661281c57600061286e565b600088815260236020526040902054600e90612844906001906301000000900460ff16615318565b60ff1660058110612857576128576150ed565b602081049091015460ff601f9092166101000a9004165b600089815260236020526040902054600d9062010000900460ff1660058110612899576128996150ed565b602091828204019190069054906101000a900460ff166128b9919061539c565b6128c69060ff16886152f9565b965060ff8216600414156129205760ff84166000908152602460205260409020546128fc90600160201b900461ffff16886152f9565b60075490975061291990600160481b900463ffffffff16886152f9565b9650612bbf565b60ff808516600090815260246020526040902054606491161561294b57612948600a8261539c565b90505b6022546021541115612989576022546129659060026152f9565b6021541015612975576002612978565b60005b612982908261539c565b90506129a3565b60225460215410156129a3576129a0600282615318565b90505b6129b060ff8216896152f9565b9750606460ff841660021415612a3c5760ff8616600090815260246020526040902060028101546001909101541115612a375760ff86166000908152602460205260409020600290810154612a04916152f9565b60ff87166000908152602460205260409020600101541015612a2757600a612a2a565b601e5b612a34908261539c565b90505b612abf565b60ff841660031415612abf5760ff8616600090815260246020526040902060018101546002909101541115612abf5760ff8616600090815260246020526040902060010154612a8c9060026152f9565b60ff87166000908152602460205260409020600201541015612aaf57600a612ab2565b601e5b612abc908261539c565b90505b612acc60ff82168a6152f9565b60075460ff8816600090815260246020526040902060060154919a50600a91600160281b90910463ffffffff1690612b0490436152e2565b1015612b345760ff808816600090815260246020526040902054612b319163010000009091041682615318565b90505b612b4160ff82168b6152f9565b600754909a50612b549060ff168b6152f9565b995060ff8516600114612bbb5760ff8088166000908152602460205260409020546201000090041615612bbb5760ff808816600090815260246020526040902054600f91620100009091041660068110612bb057612bb06150ed565b600302015460ff1693505b5050505b612bcd633b9aca00886152f9565b9650868311612c7e5760ff8085166000908152602460205260409020600501549750606490612bfe908316896152f9565b612c0891906153c1565b60ff808616600090815260246020526040902054919750620100009091041615612c795760ff808516600090815260246020526040902054612c5c91620100009091041669043c33c19375648000006153e3565b612c729069ffffffffffffffffffff16886151bb565b9650600194505b612c9a565b6064612c8d60ff8316896152f9565b612c9791906153c1565b95505b612ca486886152e2565b9650505050505b9193909250565b60026001541415612cd55760405162461bcd60e51b815260040161091890614ff5565b60026001558051612cf85760405162461bcd60e51b8152600401610918906150bf565b60008060005b835181101561300f5760035484516001600160a01b0390911690636352211e90869084908110612d3057612d306150ed565b60200260200101516040518263ffffffff1660e01b8152600401612d5691815260200190565b60206040518083038186803b158015612d6e57600080fd5b505afa158015612d82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da69190615103565b6001600160a01b0316336001600160a01b031614612e065760405162461bcd60e51b815260206004820152601f60248201527f6d73672073656e646572206973206e6f7420646f7065722773206f776e6572006044820152606401610918565b600460ff1660236000868481518110612e2157612e216150ed565b60209081029190910181015182528101919091526040016000205462010000900460ff161415612e935760405162461bcd60e51b815260206004820152601e60248201527f7a6f6d626965732063616e206e6f74206469726563746c7920636c61696d00006044820152606401610918565b6000806000306001600160a01b031663888cdc60888681518110612eb957612eb96150ed565b60200260200101516040518263ffffffff1660e01b8152600401612edf91815260200190565b60606040518083038186803b158015612ef757600080fd5b505afa158015612f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2f9190615130565b919450925090508215612feb57612f9e878581518110612f5157612f516150ed565b6020026020010151602360008a8881518110612f6f57612f6f6150ed565b6020026020010151815260200190815260200160002060000160019054906101000a900460ff16858585614505565b612fa882866151bb565b9450612fb483876151bb565b95504360236000898781518110612fcd57612fcd6150ed565b60200260200101518152602001908152602001600020600101819055505b8015612ff95750505061300f565b5050508080613007906151d3565b915050612cfe565b50336001600160a01b03167fab498de26f80277f14b34408f10c77cf1383957da04fa4363daeefc3f67efc9384848460405161268b93929190615229565b600260015414156130705760405162461bcd60e51b815260040161091890614ff5565b600260015561307d613fe7565b81336003546040516331a9108f60e11b8152600481018490526001600160a01b039283169290911690636352211e9060240160206040518083038186803b1580156130c757600080fd5b505afa1580156130db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ff9190615103565b6001600160a01b0316146131255760405162461bcd60e51b815260040161091890615365565b816000808260ff1611801561313d5750603d60ff8316105b6131595760405162461bcd60e51b81526004016109189061502c565b80156131a25760048260ff16111561319d5760ff821660009081526024602052604090206003015461319d5760405162461bcd60e51b81526004016109189061505a565b6131d5565b60ff8216600090815260246020526040902060030154156131d55760405162461bcd60e51b815260040161091890615091565b600c5460ff9081169085161161322d5760405162461bcd60e51b815260206004820152601f60248201527f696e697420636173746c652063616e6e6f7420626520707572636861736564006044820152606401610918565b60008581526023602052604090205460ff620100009091041660011461328a5760405162461bcd60e51b8152602060048201526012602482015271646f706572206d757374206265206b696e6760701b6044820152606401610918565b6132938461485a565b6132df5760405162461bcd60e51b815260206004820152601760248201527f636173746c65206973206e6f74206163746976617465640000000000000000006044820152606401610918565b600085815260236020526040902054600160281b900460ff16156133455760405162461bcd60e51b815260206004820152601c60248201527f41206b696e6720616c726561647920686173206120636173746c652e000000006044820152606401610918565b613367336002546001600160a01b03169030692a5a058fc295ed0000006146c4565b604051806101600160405280600015158152602001600060ff168152602001600160ff168152602001600060ff168152602001600061ffff168152602001600081526020016000815260200186815260200160008152602001600f6000600681106133d4576133d46150ed565b60039081029190910160019081015483526000602093840181905260ff898116808352602486526040808420885181548a8a01518b85015160608d015160808e015161ffff1990941694151561ff0019169490941761010092891683021763ffff00001916620100009189169190910263ff000000191617630100000093909716929092029590951765ffff000000001916600160201b61ffff9096169590950294909417815560a08901519581019590955560c0880151600286015560e088015195850195909555908601516004840155610120860151600584015561014090950151600690920191909155888152602383528190208054600160281b65ff0000000000199091161790555191825233917fb57e7a25d178dc094b3b25471064e0af821ff1a9638a070af5cf4f3ddf222f1e91016113e8565b61351661466a565b60055460ff16156135695760405162461bcd60e51b815260206004820152601860248201527f5468652067616d6520697320616c7265616479206f76657200000000000000006044820152606401610918565b6b01f04ef12cb04cf158000000600454116135c65760405162461bcd60e51b815260206004820152601a60248201527f63616e277420656e64207468652067616d652068617374696c790000000000006044820152606401610918565b60225460215414156136135760405162461bcd60e51b81526020600482015260166024820152752a3432b9329036bab9ba1031329030903bb4b73732b960511b6044820152606401610918565b6002546040516370a0823160e01b81523060048201526101f4916001600160a01b0316906370a082319060240160206040518083038186803b15801561365857600080fd5b505afa15801561366c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613690919061540c565b61369a91906153c1565b600655602254602154116136af5760036136b2565b60025b6005805460ff191660ff929092169190911790556136ce6147ff565b7f7a33579220d1c4ac01f744294990d871f5367239589962f184683b3757c8749660215460225460405161370c929190918252602082015260400190565b60405180910390a1565b600260015414156137395760405162461bcd60e51b815260040161091890614ff5565b6002600155613746613fe7565b80336003805460ff84166000908152602460208190526040918290209093015490516331a9108f60e11b815260048101919091526001600160a01b039384169390911691636352211e910160206040518083038186803b1580156137a957600080fd5b505afa1580156137bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e19190615103565b6001600160a01b0316146138075760405162461bcd60e51b8152600401610918906152ad565b81600160008260ff161180156138205750603d60ff8316105b61383c5760405162461bcd60e51b81526004016109189061502c565b80156138855760048260ff1611156138805760ff82166000908152602460205260409020600301546138805760405162461bcd60e51b81526004016109189061505a565b6138b8565b60ff8216600090815260246020526040902060030154156138b85760405162461bcd60e51b815260040161091890615091565b60ff8416600090815260246020526040902060050154156139145760405162461bcd60e51b8152602060048201526016602482015275636173746c652062616c616e63652072656d61696e7360501b6044820152606401610918565b60ff848116600090815260246020526040902054600562010000909104909116106139815760405162461bcd60e51b815260206004820181905260248201527f636173746c6520616c72656164792072656163686564206d6178206c6576656c6044820152606401610918565b60ff8085166000908152602460205260408120549091600f916139ad916201000090910416600161539c565b60ff16600681106139c0576139c06150ed565b600302016002015490506139d461136e3390565b60ff808616600090815260246020526040902080546201000090049091169060026139fe83615425565b82546101009290920a60ff818102199093169183160217909155868116600090815260246020526040902054600f92506201000090041660068110613a4557613a456150ed565b600302016001015460ff8681166000818152602460209081526040918290206005810195909555935481519283526201000090049092169281019290925233917f175edfc295882efa4e1f35551ba37730f9f4d5b3ced81cd3e0d72d77cddb916b91016113e8565b60026001541415613ad05760405162461bcd60e51b815260040161091890614ff5565b6002600155613add613fe7565b81336003805460ff84166000908152602460208190526040918290209093015490516331a9108f60e11b815260048101919091526001600160a01b039384169390911691636352211e910160206040518083038186803b158015613b4057600080fd5b505afa158015613b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b789190615103565b6001600160a01b031614613b9e5760405162461bcd60e51b8152600401610918906152ad565b82600160008260ff16118015613bb75750603d60ff8316105b613bd35760405162461bcd60e51b81526004016109189061502c565b8015613c1c5760048260ff161115613c175760ff8216600090815260246020526040902060030154613c175760405162461bcd60e51b81526004016109189061505a565b613c4f565b60ff821660009081526024602052604090206003015415613c4f5760405162461bcd60e51b815260040161091890615091565b60ff808616600090815260246020526040902054600591613c789187916101009091041661539c565b60ff161115613cc95760405162461bcd60e51b815260206004820152601f60248201527f657863656564656420696e7374616c6c61626c652062617272696361646573006044820152606401610918565b60075460009060ff861690613cef90610100900461ffff16670de0b6b3a7640000615445565b613cf99190615445565b67ffffffffffffffff169050613d0e3361136e565b60ff808716600090815260246020526040902080548792600191613d3991859161010090041661539c565b92506101000a81548160ff021916908360ff160217905550613d583390565b6040805160ff808a168252881660208201529081018390526001600160a01b0391909116907f4e10163753c03ed9fc89b7472d8f907a296a26aa42cd39419453a8018d9e480a9060600160405180910390a250506001805550505050565b600c816003811061149c57600080fd5b60098160038110613dd657600080fd5b0154905081565b600d816005811061149c57600080fd5b613df561466a565b6001600160a01b038116613e5a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610918565b613e63816147af565b50565b600081600160008260ff16118015613e815750603d60ff8316105b613e9d5760405162461bcd60e51b81526004016109189061502c565b8015613ee65760048260ff161115613ee15760ff8216600090815260246020526040902060030154613ee15760405162461bcd60e51b81526004016109189061505a565b613f19565b60ff821660009081526024602052604090206003015415613f195760405162461bcd60e51b815260040161091890615091565b6003805460ff8616600090815260246020526040908190209092015491516331a9108f60e11b81526001600160a01b0390911691636352211e91613f64919060040190815260200190565b60206040518083038186803b158015613f7c57600080fd5b505afa158015613f90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fb49190615103565b949350505050565b600f8160068110613fcc57600080fd5b600302018054600182015460029092015460ff909116925083565b600054600160a01b900460ff1615611f875760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610918565b600c548390839060ff908116908216116140905760405162461bcd60e51b815260206004820152601e60248201527f7a6f6d626965732063616e27742061637420696e20317374206c6179657200006044820152606401610918565b600754600083815260236020526040902060010154630100000090910461ffff16906140bc90436152e2565b116141005760405162461bcd60e51b81526020600482015260146024820152731e9bdb589a594818d85b89dd081858dd081e595d60621b6044820152606401610918565b60ff8085166000908152602460205260409020546101009004166142635760ff848116600090815260246020526040902054600563010000009091049091161061418c5760405162461bcd60e51b815260206004820181905260248201527f7265616368656420746865206d6178696d756d207a6f6d626965206c696d69746044820152606401610918565b60ff80851660009081526024602052604090208054630100000090049091169060036141b783615425565b82546101009290920a60ff81810219909316918316021790915585811660009081526024602052604090204360069091015584161590506142375760ff808416600090815260246020526040902080546301000000900490911690600361421d8361546c565b91906101000a81548160ff021916908360ff160217905550505b6000858152602360205260409020805461ff00191661010060ff871602178155436001909101556143b7565b60ff8316156142cc5760ff80841660009081526024602052604090208054630100000090049091169060036142978361546c565b825460ff9182166101009390930a9283029190920219909116179055506000858152602360205260409020805461ff00191690555b60ff8085166000908152602460205260409020805461010090049091169060016142f58361546c565b825460ff91821661010093840a9081029202191617909155600087815260236020526040812043600191909101556007549092506143419161ffff910416670de0b6b3a7640000615445565b67ffffffffffffffff169050336040805188815260ff881660208201529081018390526001600160a01b0391909116907f7b4b30f7c9939580983deddd453ff51512f9c99608fc834e4bda36df9d02a2ef9060600160405180910390a26143b5336002546001600160a01b0316908361472f565b505b5050505050565b60ff8416600114156144675780156144215760ff83811660009081526024602052604081206001018054928516929091906143fa9084906151bb565b925050819055508160ff166021600082825461441691906151bb565b909155506144ff9050565b60ff838116600090815260246020526040812060010180549285169290919061444b9084906152e2565b925050819055508160ff166021600082825461441691906152e2565b80156144b35760ff83811660009081526024602052604081206002018054928516929091906144979084906151bb565b925050819055508160ff166022600082825461441691906151bb565b60ff83811660009081526024602052604081206002018054928516929091906144dd9084906152e2565b925050819055508160ff16602260008282546144f991906152e2565b90915550505b50505050565b60ff84166000908152602460205260408120600401805484929061452a9084906151bb565b9091555050600254614546906001600160a01b0316338561472f565b826004600082825461455891906151bb565b909155505080156145df5760ff8481166000818152602460209081526040918290205482518a8152918201939093526201000090920490921681830152905133917f3df2b1a653f00aba2fd135ffbb1017422ab60c26a8a098d5bcfa972c56dc6f13919081900360600190a260ff84166000908152602460205260408120600501556143b7565b6145e982846151bb565b60ff85166000908152602460205260408120600501805490919061460e9084906152e2565b90915550505050505050565b600054600160a01b900460ff16611f875760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610918565b6000546001600160a01b03163314611f875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610918565b6040516001600160a01b03808516602483015283166044820152606481018290526144ff9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614918565b6040516001600160a01b03831660248201526044810182905261108190849063a9059cbb60e01b906064016146f8565b61476761461a565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200161370c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b614807613fe7565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586147973390565b60008183106148515781614853565b825b9392505050565b6000808260ff161180156148775750600c5460ff90811690831611155b1561488457506001919050565b600c5460ff9081169083161180156148aa5750600c54610100900460ff90811690831611155b80156148ba5750600a5460045410155b156148c757506001919050565b600c54610100900460ff9081169083161180156148f35750600c5462010000900460ff90811690831611155b80156149035750600b5460045410155b1561491057506001919050565b506000919050565b600061496d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166149ea9092919063ffffffff16565b805190915015611081578080602001905181019061498b919061547f565b6110815760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610918565b6060613fb48484600085856001600160a01b0385163b614a4c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610918565b600080866001600160a01b03168587604051614a6891906154c6565b60006040518083038185875af1925050503d8060008114614aa5576040519150601f19603f3d011682016040523d82523d6000602084013e614aaa565b606091505b5091509150614aba828286614ac5565b979650505050505050565b60608315614ad4575081614853565b825115614ae45782518084602001fd5b8160405162461bcd60e51b815260040161091891906154e2565b6001600160a01b0381168114613e6357600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614b5257614b52614b13565b604052919050565b60008060008060808587031215614b7057600080fd5b8435614b7b81614afe565b9350602085810135614b8c81614afe565b935060408601359250606086013567ffffffffffffffff80821115614bb057600080fd5b818801915088601f830112614bc457600080fd5b813581811115614bd657614bd6614b13565b614be8601f8201601f19168501614b29565b91508082528984828501011115614bfe57600080fd5b808484018584013760008482840101525080935050505092959194509250565b600067ffffffffffffffff821115614c3857614c38614b13565b5060051b60200190565b600082601f830112614c5357600080fd5b81356020614c68614c6383614c1e565b614b29565b82815260059290921b84018101918181019086841115614c8757600080fd5b8286015b84811015614ca25780358352918301918301614c8b565b509695505050505050565b803560ff81168114614cbe57600080fd5b919050565b600080600080600060808688031215614cdb57600080fd5b853567ffffffffffffffff80821115614cf357600080fd5b614cff89838a01614c42565b96506020880135915080821115614d1557600080fd5b818801915088601f830112614d2957600080fd5b813581811115614d3857600080fd5b8960208260051b8501011115614d4d57600080fd5b602083019650809550505050614d6560408701614cad565b9150614d7360608701614cad565b90509295509295909350565b60008060408385031215614d9257600080fd5b823567ffffffffffffffff811115614da957600080fd5b614db585828601614c42565b925050614dc460208401614cad565b90509250929050565b600060208284031215614ddf57600080fd5b61485382614cad565b803561ffff81168114614cbe57600080fd5b803563ffffffff81168114614cbe57600080fd5b60008060008060008060c08789031215614e2757600080fd5b614e3087614cad565b9550614e3e60208801614de8565b9450614e4c60408801614de8565b9350614e5a60608801614dfa565b9250614e6860808801614dfa565b915060a087013590509295509295509295565b600060208284031215614e8d57600080fd5b5035919050565b60008060408385031215614ea757600080fd5b823567ffffffffffffffff80821115614ebf57600080fd5b614ecb86838701614c42565b9350602091508185013581811115614ee257600080fd5b85019050601f81018613614ef557600080fd5b8035614f03614c6382614c1e565b81815260059190911b82018301908381019088831115614f2257600080fd5b928401925b82841015614f4757614f3884614cad565b82529284019290840190614f27565b80955050505050509250929050565b60008060408385031215614f6957600080fd5b82359150614dc460208401614cad565b600060208284031215614f8b57600080fd5b813567ffffffffffffffff811115614fa257600080fd5b613fb484828501614c42565b60008060408385031215614fc157600080fd5b614fca83614cad565b9150614dc460208401614cad565b600060208284031215614fea57600080fd5b813561485381614afe565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601490820152730d2dcecc2d8d2c840c6c2e6e8d8ca40d2dcc8caf60631b604082015260600190565b60208082526018908201527f636173746c6520776173206e6f74207075726368617365640000000000000000604082015260600190565b60208082526014908201527318d85cdd1b195908185b1c9958591e481cdbdb1960621b604082015260600190565b6020808252601490820152731b9bc81d1bdad95b92591cc81c1c9bdd9a59195960621b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561511557600080fd5b815161485381614afe565b80518015158114614cbe57600080fd5b60008060006060848603121561514557600080fd5b835192506020840151915061515c60408501615120565b90509250925092565b634e487b7160e01b600052601160045260246000fd5b600061ffff8083168181141561519357615193615165565b6001019392505050565b600061ffff8216806151b1576151b1615165565b6000190192915050565b600082198211156151ce576151ce615165565b500190565b60006000198214156151e7576151e7615165565b5060010190565b600081518084526020808501945080840160005b8381101561521e57815187529582019590820190600101615202565b509495945050505050565b60608152600061523c60608301866151ee565b60208301949094525060400152919050565b60608152600061526160608301876151ee565b82810360208401528481526001600160fb1b0385111561528057600080fd5b8460051b808760208401376000910160200190815260ff9390931660409290920191909152509392505050565b6020808252818101527f6d73672073656e646572206973206e6f7420636173746c652773206f776e6572604082015260600190565b6000828210156152f4576152f4615165565b500390565b600081600019048311821515161561531357615313615165565b500290565b600060ff821660ff84168082101561533257615332615165565b90039392505050565b600061ffff8083168185168183048111821515161561535c5761535c615165565b02949350505050565b6020808252601d908201527f6d73672073656e646572206973206e6f7420746f6b656e206f776e6572000000604082015260600190565b600060ff821660ff84168060ff038211156153b9576153b9615165565b019392505050565b6000826153de57634e487b7160e01b600052601260045260246000fd5b500490565b600069ffffffffffffffffffff8083168185168183048111821515161561535c5761535c615165565b60006020828403121561541e57600080fd5b5051919050565b600060ff821660ff81141561543c5761543c615165565b60010192915050565b600067ffffffffffffffff8083168185168183048111821515161561535c5761535c615165565b600060ff8216806151b1576151b1615165565b60006020828403121561549157600080fd5b61485382615120565b60005b838110156154b557818101518382015260200161549d565b838111156144ff5750506000910152565b600082516154d881846020870161549a565b9190910192915050565b602081526000825180602084015261550181604085016020870161549a565b601f01601f1916919091016040019291505056fea2646970667358221220beaeee506aa99408a4e389b3a0da9a312974ffa5f5ff972cc9629e4a03c7f82b64736f6c63430008090033000000000000000000000000dc8c9988212ba573ce74bcc2444042f2f8f39101000000000000000000000000c2a2c4581ae53e79eca49e7c81a8cd5b5094a07400000000000000000000000038f84b77d03bf46249182bd9dd5cf58adf2f39aa
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103835760003560e01c80637f5247d9116101de578063c0a94ff31161010f578063ecb5fff6116100ad578063fbadc7861161007c578063fbadc7861461089e578063fc47e209146108b1578063fc897b47146108ba578063fe1cd8d3146108ec57600080fd5b8063ecb5fff61461086e578063f2fde38b1461087b578063f55982451461088e578063f8d56a261461089657600080fd5b8063d732a917116100e9578063d732a9171461083b578063dfbf53ae1461084e578063e22f8e0b14610724578063ecb2fcff1461085b57600080fd5b8063c0a94ff314610800578063c806df9914610813578063d5bd95991461082657600080fd5b80639c43c7041161017c578063a1eb016511610156578063a1eb0165146107c7578063a49062d414610724578063ae0e77f4146107da578063b148a632146107ed57600080fd5b80639c43c704146107a45780639dd63d6b146107b75780639f9dff1d146107bf57600080fd5b8063888cdc60116101b8578063888cdc60146107455780638da5cb5b1461077557806394a2791f1461078657806396566f8f1461079157600080fd5b80637f5247d91461072c578063816d192f146107355780638456cb591461073d57600080fd5b80633b5c58a6116102b85780635c975abb116102565780636fc62782116102305780636fc62782146106fc578063715018a61461070557806372ba491f1461070d5780637da29baf1461072457600080fd5b80635c975abb146106ba5780636bb987fe146106d75780636d5d0778146106f357600080fd5b80634810bc59116102925780634810bc59146105e957806348c1cb8d1461068c5780634db106181461069f5780635a9a3aee146106b257600080fd5b80633b5c58a6146105bb5780633f2e1e4e146105ce5780633f4ba83a146105e157600080fd5b80631f1204ef116103255780632e60312a116102ff5780632e60312a1461056f578063338bef4c14610582578063338cc3f11461059557806334967e5c146105a857600080fd5b80631f1204ef1461045957806324a24af61461048557806325d12d6d1461049857600080fd5b8063166e3ac011610361578063166e3ac01461040e5780631bafda11146104235780631dac07691461042c5780631ed92e5d1461043f57600080fd5b806305612b021461038857806313371a20146103ac578063150b7a02146103d7575b600080fd5b610399692a5a058fc295ed00000081565b6040519081526020015b60405180910390f35b6002546103bf906001600160a01b031681565b6040516001600160a01b0390911681526020016103a3565b6103f56103e5366004614b5a565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016103a3565b61042161041c366004614cc3565b6108f5565b005b61039960215481565b6003546103bf906001600160a01b031681565b610447603d81565b60405160ff90911681526020016103a3565b60075461047090600160481b900463ffffffff1681565b60405163ffffffff90911681526020016103a3565b610421610493366004614d7f565b610f24565b61050e6104a6366004614dcd565b602460205260009081526040902080546001820154600283015460038401546004850154600586015460069096015460ff8087169761010088048216976201000081048316976301000000820490931696600160201b90910461ffff1695929490939091908b565b604080519b15158c5260ff9a8b1660208d0152988a16988b019890985297909516606089015261ffff909316608088015260a087019190915260c086015260e0850152610100840152610120830191909152610140820152610160016103a3565b61042161057d366004614dcd565b611086565b610421610590366004614e0e565b6113fb565b6104476105a3366004614e7b565b61148c565b6104216105b6366004614dcd565b6114b6565b6104216105c9366004614e94565b61176d565b6104216105dc366004614e7b565b611c9b565b610421611f77565b6106476105f7366004614e7b565b6023602052600090815260409020805460019091015460ff80831692610100810482169262010000820483169263010000008304811692600160201b8104821692600160281b9091049091169087565b6040805160ff98891681529688166020880152948716948601949094529490911660608401521515608083015291151560a082015260c081019190915260e0016103a3565b61042161069a366004614f56565b611f89565b6104216106ad366004614e7b565b612390565b610447603281565b600054600160a01b900460ff1660405190151581526020016103a3565b6106e0611c2081565b60405161ffff90911681526020016103a3565b61039960085481565b61039960065481565b61042161269c565b60075461047090600160281b900463ffffffff1681565b610447600581565b61039960045481565b610447600281565b6104216126ae565b610758610753366004614e7b565b6126be565b6040805193845260208401929092521515908201526060016103a3565b6000546001600160a01b03166103bf565b610399633b9aca0081565b61042161079f366004614f79565b612cb2565b6104216107b2366004614f56565b61304d565b61042161350e565b610447601e81565b6007546106e090610100900461ffff1681565b6104216107e8366004614dcd565b613716565b6104216107fb366004614fae565b613aad565b61044761080e366004614e7b565b613db6565b610399610821366004614e7b565b613dc6565b6007546106e0906301000000900461ffff1681565b6025546103bf906001600160a01b031681565b6005546104479060ff1681565b610447610869366004614e7b565b613ddd565b6007546104479060ff1681565b610421610889366004614fd8565b613ded565b610447600381565b610447600a81565b6103bf6108ac366004614dcd565b613e66565b6106e061c4e081565b6108cd6108c8366004614e7b565b613fbc565b6040805160ff90941684526020840192909252908201526060016103a3565b61039960225481565b600260015414156109215760405162461bcd60e51b815260040161091890614ff5565b60405180910390fd5b600260015561092e613fe7565b81600160008260ff161180156109475750603d60ff8316105b6109635760405162461bcd60e51b81526004016109189061502c565b80156109ac5760048260ff1611156109a75760ff82166000908152602460205260409020600301546109a75760405162461bcd60e51b81526004016109189061505a565b6109df565b60ff8216600090815260246020526040902060030154156109df5760405162461bcd60e51b815260040161091890615091565b86516109fd5760405162461bcd60e51b8152600401610918906150bf565b60008060005b8951811015610e885760008a8281518110610a2057610a206150ed565b6020908102919091018101516000818152602390925260409091205490915060ff6101009091048116908916811415610a9b5760405162461bcd60e51b815260206004820152601d60248201527f616c72656164792065786973747320696e207468697320636173746c650000006044820152606401610918565b6003546040516331a9108f60e11b8152600481018490526001600160a01b0390911690636352211e9060240160206040518083038186803b158015610adf57600080fd5b505afa158015610af3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b179190615103565b6001600160a01b0316336001600160a01b031614610b775760405162461bcd60e51b815260206004820152601f60248201527f6d73672073656e646572206973206e6f7420646f7065722773206f776e6572006044820152606401610918565b60405163044466e360e51b81526004810183905260009081908190309063888cdc609060240160606040518083038186803b158015610bb557600080fd5b505afa158015610bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed9190615130565b600088815260236020526040902054929550909350915062010000900460ff166004811415610c2657610c21868e87614034565b610e43565b60ff81161580610c39575060ff81166001145b15610d815760ff8c16610c8e5760405162461bcd60e51b815260206004820152601e60248201527f68756d616e206f72206b696e6720646f70657273206d75737420766f746500006044820152606401610918565b600260ff8d161115610cd15760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420766f746560a01b6044820152606401610918565b6000600d8260ff1660058110610ce957610ce96150ed565b602081049091015460ff601f9092166101000a9004811691508616610d35576000878152602360205260409020805460ff191660ff8f16179055610d308d8f8360016143be565b610d7f565b600087815260236020526040812054610d579160ff90911690889084906143be565b6000878152602360205260409020805460ff191660ff8f16179055610d7f8d8f8360016143be565b505b60ff8d1660009081526024602052604090208054600160201b900461ffff16906004610dac8361517b565b91906101000a81548161ffff021916908361ffff160217905550508460ff16600014610e195760ff851660009081526024602052604090208054600160201b900461ffff16906004610dfd8361519d565b91906101000a81548161ffff021916908361ffff160217905550505b6000868152602360205260409020805460ff8f166101000261ff0019909116178155436001909101555b8315610e6f57610e568686868686614505565b610e6083896151bb565b9750610e6c848a6151bb565b98505b5050505050508080610e80906151d3565b915050610a03565b50336001600160a01b03167fab498de26f80277f14b34408f10c77cf1383957da04fa4363daeefc3f67efc938a8484604051610ec693929190615229565b60405180910390a2336001600160a01b03167f4b24521fbc5d368ba994064a74ccd3e2ab404e64a8ff62f657c0064a25b762348a8a8a8a604051610f0d949392919061524e565b60405180910390a250506001805550505050505050565b610f2c61461a565b610f3461466a565b8151610f525760405162461bcd60e51b8152600401610918906150bf565b600460ff82161115610f985760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207370656369657360881b6044820152606401610918565b60005b8251811015611081576000838281518110610fb857610fb86150ed565b602002602001015110158015610fe85750612710838281518110610fde57610fde6150ed565b6020026020010151105b6110265760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a59081d1bdad95b9259608a1b6044820152606401610918565b816023600085848151811061103d5761103d6150ed565b6020026020010151815260200190815260200160002060000160026101000a81548160ff021916908360ff1602179055508080611079906151d3565b915050610f9b565b505050565b600260015414156110a95760405162461bcd60e51b815260040161091890614ff5565b60026001556110b6613fe7565b80336003805460ff84166000908152602460208190526040918290209093015490516331a9108f60e11b815260048101919091526001600160a01b039384169390911691636352211e910160206040518083038186803b15801561111957600080fd5b505afa15801561112d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111519190615103565b6001600160a01b0316146111775760405162461bcd60e51b8152600401610918906152ad565b81600160008260ff161180156111905750603d60ff8316105b6111ac5760405162461bcd60e51b81526004016109189061502c565b80156111f55760048260ff1611156111f05760ff82166000908152602460205260409020600301546111f05760405162461bcd60e51b81526004016109189061505a565b611228565b60ff8216600090815260246020526040902060030154156112285760405162461bcd60e51b815260040161091890615091565b60ff808516600090815260246020526040902054161561128a5760405162461bcd60e51b815260206004820152601f60248201527f6661726d2068617320616c7265616479206265656e20696e7374616c6c6564006044820152606401610918565b60ff80851660009081526024602052604090205461ea60916201000090910416600214156112c5576112be614e20826152e2565b9050611355565b60ff85811660009081526024602052604090205462010000900416600314156112f4576112be616590826152e2565b60ff8581166000908152602460205260409020546201000090041660041415611323576112be6184d0826152e2565b60ff85811660009081526024602052604090205462010000900416600514156113555761135261abe0826152e2565b90505b611367670de0b6b3a7640000826152f9565b9050611382335b6002546001600160a01b03169030846146c4565b60ff85166000908152602460205260409020805460ff191660011790556113a63390565b6040805160ff88168152602081018490526001600160a01b0392909216917ff93ae10639e96b7ed026e3acc650e8514ad7dbc46f95fccdc8dddcff36bb1efc91015b60405180910390a2505060018055505050565b61140361466a565b61140b61461a565b6007805463ffffffff938416600160481b026cffffffff0000000000000000001995909416600160281b0268ffffffff00000000001961ffff9788166301000000021668ffffffffffff00000019989097166101000262ffffff1990921660ff99909916989098171795909516939093179490941716929092179055600855565b600e816005811061149c57600080fd5b60209182820401919006915054906101000a900460ff1681565b600260015414156114d95760405162461bcd60e51b815260040161091890614ff5565b600260015580336003805460ff84166000908152602460208190526040918290209093015490516331a9108f60e11b815260048101919091526001600160a01b039384169390911691636352211e910160206040518083038186803b15801561154157600080fd5b505afa158015611555573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115799190615103565b6001600160a01b03161461159f5760405162461bcd60e51b8152600401610918906152ad565b81600160008260ff161180156115b85750603d60ff8316105b6115d45760405162461bcd60e51b81526004016109189061502c565b801561161d5760048260ff1611156116185760ff82166000908152602460205260409020600301546116185760405162461bcd60e51b81526004016109189061505a565b611650565b60ff8216600090815260246020526040902060030154156116505760405162461bcd60e51b815260040161091890615091565b60ff84166000908152602460205260409020600401546116a55760405162461bcd60e51b815260206004820152601060248201526f746178706f6f6c20697320656d70747960801b6044820152606401610918565b6116d23360ff86166000908152602460205260409020600401546002546001600160a01b0316919061472f565b60ff8416600090815260246020526040812060049081015481549092906116fa9084906151bb565b909155505060ff841660008181526024602090815260409182902060040154825193845290830152805133927f7dd1639924f2093c8a0b146cfd7f84224e220fe0dff85a16de3572b03de62d2492908290030190a250505060ff1660009081526024602052604081206004015560018055565b600260015414156117905760405162461bcd60e51b815260040161091890614ff5565b600260015561179d613fe7565b60005b8251811015611c9257600560ff168282815181106117c0576117c06150ed565b602002602001015160ff1611156118095760405162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a59081b195d995b609a1b6044820152606401610918565b600060236000858481518110611821576118216150ed565b6020026020010151815260200190815260200160002060000160019054906101000a900460ff169050600c60006003811061185e5761185e6150ed565b602081049091015460ff601f9092166101000a90048116908216116118b65760405162461bcd60e51b815260206004820152600e60248201526d696e76616c696420636173746c6560901b6044820152606401610918565b8282815181106118c8576118c86150ed565b602002602001015160ff16602360008685815181106118e9576118e96150ed565b6020908102919091018101518252810191909152604001600020546301000000900460ff161061195b5760405162461bcd60e51b815260206004820152601e60248201527f6c6576656c2068617320616c7265616479206265656e207265616368656400006044820152606401610918565b82828151811061196d5761196d6150ed565b60209081029190910181015160ff838116600090815260249093526040909220549082166201000090910490911610156119e55760405162461bcd60e51b81526020600482015260196024820152781a5b9cdd59999a58da595b9d0818d85cdd1b19481b195d995b603a1b6044820152606401610918565b6000602360008685815181106119fd576119fd6150ed565b6020908102919091018101518252810191909152604001600020546301000000900460ff1615611aa057600e600160236000888781518110611a4157611a416150ed565b6020026020010151815260200190815260200160002060000160039054906101000a900460ff16611a729190615318565b60ff1660058110611a8557611a856150ed565b602081049091015460ff601f9092166101000a900416611aa3565b60005b600e6001868681518110611ab957611ab96150ed565b6020026020010151611acb9190615318565b60ff1660058110611ade57611ade6150ed565b602091828204019190069054906101000a900460ff16611afe9190615318565b611b0d9060ff166103e861533b565b61ffff1690506021546022541115611b5357602154611b2d9060026152f9565b60225411611b3c576008611b3f565b600a5b611b4c9060ff16826152f9565b9050611b78565b6021546022541015611b6a57611b4c600c826152f9565b611b75600a826152f9565b90505b611b8a67016345785d8a0000826152f9565b9050611b953361136e565b838381518110611ba757611ba76150ed565b602002602001015160236000878681518110611bc557611bc56150ed565b6020026020010151815260200190815260200160002060000160036101000a81548160ff021916908360ff160217905550611bfd3390565b6001600160a01b03167f37c7cfe655b76663aa20f92f231678f8d7e8339c50e1449ae03c197eeea50e21868581518110611c3957611c396150ed565b6020026020010151868681518110611c5357611c536150ed565b6020026020010151604051611c7592919091825260ff16602082015260400190565b60405180910390a250508080611c8a906151d3565b9150506117a0565b50506001805550565b60026001541415611cbe5760405162461bcd60e51b815260040161091890614ff5565b600260015580336003546040516331a9108f60e11b8152600481018490526001600160a01b039283169290911690636352211e9060240160206040518083038186803b158015611d0d57600080fd5b505afa158015611d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d459190615103565b6001600160a01b031614611d6b5760405162461bcd60e51b815260040161091890615365565b6000805260246020527fb7634ec2165a7280a285aac3ec10cf370eca86d8aa9d3243c90b2151434091b354611da290611c206151bb565b431015611df15760405162461bcd60e51b815260206004820181905260248201527f746f6f20736f6f6e20746f20627579207468652074656d706c6520616761696e6044820152606401610918565b60008281526023602052604090205460ff6201000090910416600114611e4e5760405162461bcd60e51b8152602060048201526012602482015271646f706572206d757374206265206b696e6760701b6044820152606401610918565b6000805260246020527fb7634ec2165a7280a285aac3ec10cf370eca86d8aa9d3243c90b2151434091b054821415611ec85760405162461bcd60e51b815260206004820152601a60248201527f596f7520616c7265616479206f776e207468652074656d706c650000000000006044820152606401610918565b611ee9336025546008546002546001600160a01b03908116939216906146c4565b6000808052602460209081527fb7634ec2165a7280a285aac3ec10cf370eca86d8aa9d3243c90b2151434091b0849055437fb7634ec2165a7280a285aac3ec10cf370eca86d8aa9d3243c90b2151434091b355604080519283525133927fb57e7a25d178dc094b3b25471064e0af821ff1a9638a070af5cf4f3ddf222f1e92908290030190a2505060018055565b611f7f61466a565b611f8761475f565b565b60026001541415611fac5760405162461bcd60e51b815260040161091890614ff5565b6002600155611fb9613fe7565b81336003546040516331a9108f60e11b8152600481018490526001600160a01b039283169290911690636352211e9060240160206040518083038186803b15801561200357600080fd5b505afa158015612017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203b9190615103565b6001600160a01b0316146120615760405162461bcd60e51b815260040161091890615365565b600560ff831611156120a55760405162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a59081b195d995b609a1b6044820152606401610918565b600083815260236020526040902054600c5460ff6101009092048216911681116121025760405162461bcd60e51b815260206004820152600e60248201526d696e76616c696420636173746c6560901b6044820152606401610918565b60008481526023602052604090205460ff8085166301000000909204161061216c5760405162461bcd60e51b815260206004820152601e60248201527f6c6576656c2068617320616c7265616479206265656e207265616368656400006044820152606401610918565b60ff8181166000908152602460205260409020548185166201000090910490911610156121d75760405162461bcd60e51b81526020600482015260196024820152781a5b9cdd59999a58da595b9d0818d85cdd1b19481b195d995b603a1b6044820152606401610918565b6000848152602360205260408120546301000000900460ff161561224b57600085815260236020526040902054600e9061221d906001906301000000900460ff16615318565b60ff1660058110612230576122306150ed565b602081049091015460ff601f9092166101000a90041661224e565b60005b600e61225b600187615318565b60ff166005811061226e5761226e6150ed565b602091828204019190069054906101000a900460ff1661228e9190615318565b61229d9060ff166103e861533b565b61ffff16905060215460225411156122e3576021546122bd9060026152f9565b602254116122cc5760086122cf565b600a5b6122dc9060ff16826152f9565b9050612308565b60215460225410156122fa576122dc600c826152f9565b612305600a826152f9565b90505b61231a67016345785d8a0000826152f9565b90506123253361136e565b6000858152602360205260409020805463ff0000001916630100000060ff871602179055336001600160a01b03167f37c7cfe655b76663aa20f92f231678f8d7e8339c50e1449ae03c197eeea50e2186866040516113e892919091825260ff16602082015260400190565b80336003546040516331a9108f60e11b8152600481018490526001600160a01b039283169290911690636352211e9060240160206040518083038186803b1580156123da57600080fd5b505afa1580156123ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124129190615103565b6001600160a01b0316146124385760405162461bcd60e51b815260040161091890615365565b6002600154141561245b5760405162461bcd60e51b815260040161091890614ff5565b600260015560055460ff166124b25760405162461bcd60e51b815260206004820152601960248201527f5468652067616d65206973206e6f74206f766572207965742e000000000000006044820152606401610918565b600082815260236020526040902054600160201b900460ff16156125115760405162461bcd60e51b81526020600482015260166024820152751a185d9948185b1c9958591e481899595b881c185a5960521b6044820152606401610918565b60008281526023602052604090205462010000900460ff16600281148061253b575060ff81166003145b6125805760405162461bcd60e51b8152602060048201526016602482015275191bdc195c881b5d5cdd081899481a5b5b5bdc9d185b60521b6044820152606401610918565b60055460ff16600214156125d85760ff81166002146125d35760405162461bcd60e51b815260206004820152600f60248201526e1dda5b9b995c881a5cc8185b99d95b608a1b6044820152606401610918565b61261d565b60ff811660031461261d5760405162461bcd60e51b815260206004820152600f60248201526e1dda5b9b995c881a5cc819195d9a5b608a1b6044820152606401610918565b6000838152602360205260409020805464ff000000001916600160201b17905561265d6126473390565b6006546002546001600160a01b0316919061472f565b60405183815233907fed3768cdac6e8afc0340c26d26bb36ad9a46fd08010d64abae55b7531ae6a018906020015b60405180910390a250506001805550565b6126a461466a565b611f8760006147af565b6126b661466a565b611f876147ff565b600081815260236020908152604080832054610100900460ff168084526024909252822060050154829182918115806126f5575080155b1561270c5760008060009450945094505050612cab565b6000868152602360205260408120805460019091015491945062010000900460ff1690849061276e9061273f90436152e2565b60ff84166004146127525761c4e0612763565b600754600160281b900463ffffffff165b63ffffffff16614842565b965069d3c21bcecceda100000083116127935761278c6007886152f9565b96506127f8565b6a01a784379d99db4200000083116127b05761278c6008886152f9565b6a027b46536c66c8e300000083116127cd5761278c6009886152f9565b6a034f086f3b33b68400000083116127ea5761278c600a886152f9565b6127f5600b886152f9565b96505b6000888152602360205260409020546301000000900460ff1661281c57600061286e565b600088815260236020526040902054600e90612844906001906301000000900460ff16615318565b60ff1660058110612857576128576150ed565b602081049091015460ff601f9092166101000a9004165b600089815260236020526040902054600d9062010000900460ff1660058110612899576128996150ed565b602091828204019190069054906101000a900460ff166128b9919061539c565b6128c69060ff16886152f9565b965060ff8216600414156129205760ff84166000908152602460205260409020546128fc90600160201b900461ffff16886152f9565b60075490975061291990600160481b900463ffffffff16886152f9565b9650612bbf565b60ff808516600090815260246020526040902054606491161561294b57612948600a8261539c565b90505b6022546021541115612989576022546129659060026152f9565b6021541015612975576002612978565b60005b612982908261539c565b90506129a3565b60225460215410156129a3576129a0600282615318565b90505b6129b060ff8216896152f9565b9750606460ff841660021415612a3c5760ff8616600090815260246020526040902060028101546001909101541115612a375760ff86166000908152602460205260409020600290810154612a04916152f9565b60ff87166000908152602460205260409020600101541015612a2757600a612a2a565b601e5b612a34908261539c565b90505b612abf565b60ff841660031415612abf5760ff8616600090815260246020526040902060018101546002909101541115612abf5760ff8616600090815260246020526040902060010154612a8c9060026152f9565b60ff87166000908152602460205260409020600201541015612aaf57600a612ab2565b601e5b612abc908261539c565b90505b612acc60ff82168a6152f9565b60075460ff8816600090815260246020526040902060060154919a50600a91600160281b90910463ffffffff1690612b0490436152e2565b1015612b345760ff808816600090815260246020526040902054612b319163010000009091041682615318565b90505b612b4160ff82168b6152f9565b600754909a50612b549060ff168b6152f9565b995060ff8516600114612bbb5760ff8088166000908152602460205260409020546201000090041615612bbb5760ff808816600090815260246020526040902054600f91620100009091041660068110612bb057612bb06150ed565b600302015460ff1693505b5050505b612bcd633b9aca00886152f9565b9650868311612c7e5760ff8085166000908152602460205260409020600501549750606490612bfe908316896152f9565b612c0891906153c1565b60ff808616600090815260246020526040902054919750620100009091041615612c795760ff808516600090815260246020526040902054612c5c91620100009091041669043c33c19375648000006153e3565b612c729069ffffffffffffffffffff16886151bb565b9650600194505b612c9a565b6064612c8d60ff8316896152f9565b612c9791906153c1565b95505b612ca486886152e2565b9650505050505b9193909250565b60026001541415612cd55760405162461bcd60e51b815260040161091890614ff5565b60026001558051612cf85760405162461bcd60e51b8152600401610918906150bf565b60008060005b835181101561300f5760035484516001600160a01b0390911690636352211e90869084908110612d3057612d306150ed565b60200260200101516040518263ffffffff1660e01b8152600401612d5691815260200190565b60206040518083038186803b158015612d6e57600080fd5b505afa158015612d82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da69190615103565b6001600160a01b0316336001600160a01b031614612e065760405162461bcd60e51b815260206004820152601f60248201527f6d73672073656e646572206973206e6f7420646f7065722773206f776e6572006044820152606401610918565b600460ff1660236000868481518110612e2157612e216150ed565b60209081029190910181015182528101919091526040016000205462010000900460ff161415612e935760405162461bcd60e51b815260206004820152601e60248201527f7a6f6d626965732063616e206e6f74206469726563746c7920636c61696d00006044820152606401610918565b6000806000306001600160a01b031663888cdc60888681518110612eb957612eb96150ed565b60200260200101516040518263ffffffff1660e01b8152600401612edf91815260200190565b60606040518083038186803b158015612ef757600080fd5b505afa158015612f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2f9190615130565b919450925090508215612feb57612f9e878581518110612f5157612f516150ed565b6020026020010151602360008a8881518110612f6f57612f6f6150ed565b6020026020010151815260200190815260200160002060000160019054906101000a900460ff16858585614505565b612fa882866151bb565b9450612fb483876151bb565b95504360236000898781518110612fcd57612fcd6150ed565b60200260200101518152602001908152602001600020600101819055505b8015612ff95750505061300f565b5050508080613007906151d3565b915050612cfe565b50336001600160a01b03167fab498de26f80277f14b34408f10c77cf1383957da04fa4363daeefc3f67efc9384848460405161268b93929190615229565b600260015414156130705760405162461bcd60e51b815260040161091890614ff5565b600260015561307d613fe7565b81336003546040516331a9108f60e11b8152600481018490526001600160a01b039283169290911690636352211e9060240160206040518083038186803b1580156130c757600080fd5b505afa1580156130db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ff9190615103565b6001600160a01b0316146131255760405162461bcd60e51b815260040161091890615365565b816000808260ff1611801561313d5750603d60ff8316105b6131595760405162461bcd60e51b81526004016109189061502c565b80156131a25760048260ff16111561319d5760ff821660009081526024602052604090206003015461319d5760405162461bcd60e51b81526004016109189061505a565b6131d5565b60ff8216600090815260246020526040902060030154156131d55760405162461bcd60e51b815260040161091890615091565b600c5460ff9081169085161161322d5760405162461bcd60e51b815260206004820152601f60248201527f696e697420636173746c652063616e6e6f7420626520707572636861736564006044820152606401610918565b60008581526023602052604090205460ff620100009091041660011461328a5760405162461bcd60e51b8152602060048201526012602482015271646f706572206d757374206265206b696e6760701b6044820152606401610918565b6132938461485a565b6132df5760405162461bcd60e51b815260206004820152601760248201527f636173746c65206973206e6f74206163746976617465640000000000000000006044820152606401610918565b600085815260236020526040902054600160281b900460ff16156133455760405162461bcd60e51b815260206004820152601c60248201527f41206b696e6720616c726561647920686173206120636173746c652e000000006044820152606401610918565b613367336002546001600160a01b03169030692a5a058fc295ed0000006146c4565b604051806101600160405280600015158152602001600060ff168152602001600160ff168152602001600060ff168152602001600061ffff168152602001600081526020016000815260200186815260200160008152602001600f6000600681106133d4576133d46150ed565b60039081029190910160019081015483526000602093840181905260ff898116808352602486526040808420885181548a8a01518b85015160608d015160808e015161ffff1990941694151561ff0019169490941761010092891683021763ffff00001916620100009189169190910263ff000000191617630100000093909716929092029590951765ffff000000001916600160201b61ffff9096169590950294909417815560a08901519581019590955560c0880151600286015560e088015195850195909555908601516004840155610120860151600584015561014090950151600690920191909155888152602383528190208054600160281b65ff0000000000199091161790555191825233917fb57e7a25d178dc094b3b25471064e0af821ff1a9638a070af5cf4f3ddf222f1e91016113e8565b61351661466a565b60055460ff16156135695760405162461bcd60e51b815260206004820152601860248201527f5468652067616d6520697320616c7265616479206f76657200000000000000006044820152606401610918565b6b01f04ef12cb04cf158000000600454116135c65760405162461bcd60e51b815260206004820152601a60248201527f63616e277420656e64207468652067616d652068617374696c790000000000006044820152606401610918565b60225460215414156136135760405162461bcd60e51b81526020600482015260166024820152752a3432b9329036bab9ba1031329030903bb4b73732b960511b6044820152606401610918565b6002546040516370a0823160e01b81523060048201526101f4916001600160a01b0316906370a082319060240160206040518083038186803b15801561365857600080fd5b505afa15801561366c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613690919061540c565b61369a91906153c1565b600655602254602154116136af5760036136b2565b60025b6005805460ff191660ff929092169190911790556136ce6147ff565b7f7a33579220d1c4ac01f744294990d871f5367239589962f184683b3757c8749660215460225460405161370c929190918252602082015260400190565b60405180910390a1565b600260015414156137395760405162461bcd60e51b815260040161091890614ff5565b6002600155613746613fe7565b80336003805460ff84166000908152602460208190526040918290209093015490516331a9108f60e11b815260048101919091526001600160a01b039384169390911691636352211e910160206040518083038186803b1580156137a957600080fd5b505afa1580156137bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e19190615103565b6001600160a01b0316146138075760405162461bcd60e51b8152600401610918906152ad565b81600160008260ff161180156138205750603d60ff8316105b61383c5760405162461bcd60e51b81526004016109189061502c565b80156138855760048260ff1611156138805760ff82166000908152602460205260409020600301546138805760405162461bcd60e51b81526004016109189061505a565b6138b8565b60ff8216600090815260246020526040902060030154156138b85760405162461bcd60e51b815260040161091890615091565b60ff8416600090815260246020526040902060050154156139145760405162461bcd60e51b8152602060048201526016602482015275636173746c652062616c616e63652072656d61696e7360501b6044820152606401610918565b60ff848116600090815260246020526040902054600562010000909104909116106139815760405162461bcd60e51b815260206004820181905260248201527f636173746c6520616c72656164792072656163686564206d6178206c6576656c6044820152606401610918565b60ff8085166000908152602460205260408120549091600f916139ad916201000090910416600161539c565b60ff16600681106139c0576139c06150ed565b600302016002015490506139d461136e3390565b60ff808616600090815260246020526040902080546201000090049091169060026139fe83615425565b82546101009290920a60ff818102199093169183160217909155868116600090815260246020526040902054600f92506201000090041660068110613a4557613a456150ed565b600302016001015460ff8681166000818152602460209081526040918290206005810195909555935481519283526201000090049092169281019290925233917f175edfc295882efa4e1f35551ba37730f9f4d5b3ced81cd3e0d72d77cddb916b91016113e8565b60026001541415613ad05760405162461bcd60e51b815260040161091890614ff5565b6002600155613add613fe7565b81336003805460ff84166000908152602460208190526040918290209093015490516331a9108f60e11b815260048101919091526001600160a01b039384169390911691636352211e910160206040518083038186803b158015613b4057600080fd5b505afa158015613b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b789190615103565b6001600160a01b031614613b9e5760405162461bcd60e51b8152600401610918906152ad565b82600160008260ff16118015613bb75750603d60ff8316105b613bd35760405162461bcd60e51b81526004016109189061502c565b8015613c1c5760048260ff161115613c175760ff8216600090815260246020526040902060030154613c175760405162461bcd60e51b81526004016109189061505a565b613c4f565b60ff821660009081526024602052604090206003015415613c4f5760405162461bcd60e51b815260040161091890615091565b60ff808616600090815260246020526040902054600591613c789187916101009091041661539c565b60ff161115613cc95760405162461bcd60e51b815260206004820152601f60248201527f657863656564656420696e7374616c6c61626c652062617272696361646573006044820152606401610918565b60075460009060ff861690613cef90610100900461ffff16670de0b6b3a7640000615445565b613cf99190615445565b67ffffffffffffffff169050613d0e3361136e565b60ff808716600090815260246020526040902080548792600191613d3991859161010090041661539c565b92506101000a81548160ff021916908360ff160217905550613d583390565b6040805160ff808a168252881660208201529081018390526001600160a01b0391909116907f4e10163753c03ed9fc89b7472d8f907a296a26aa42cd39419453a8018d9e480a9060600160405180910390a250506001805550505050565b600c816003811061149c57600080fd5b60098160038110613dd657600080fd5b0154905081565b600d816005811061149c57600080fd5b613df561466a565b6001600160a01b038116613e5a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610918565b613e63816147af565b50565b600081600160008260ff16118015613e815750603d60ff8316105b613e9d5760405162461bcd60e51b81526004016109189061502c565b8015613ee65760048260ff161115613ee15760ff8216600090815260246020526040902060030154613ee15760405162461bcd60e51b81526004016109189061505a565b613f19565b60ff821660009081526024602052604090206003015415613f195760405162461bcd60e51b815260040161091890615091565b6003805460ff8616600090815260246020526040908190209092015491516331a9108f60e11b81526001600160a01b0390911691636352211e91613f64919060040190815260200190565b60206040518083038186803b158015613f7c57600080fd5b505afa158015613f90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fb49190615103565b949350505050565b600f8160068110613fcc57600080fd5b600302018054600182015460029092015460ff909116925083565b600054600160a01b900460ff1615611f875760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610918565b600c548390839060ff908116908216116140905760405162461bcd60e51b815260206004820152601e60248201527f7a6f6d626965732063616e27742061637420696e20317374206c6179657200006044820152606401610918565b600754600083815260236020526040902060010154630100000090910461ffff16906140bc90436152e2565b116141005760405162461bcd60e51b81526020600482015260146024820152731e9bdb589a594818d85b89dd081858dd081e595d60621b6044820152606401610918565b60ff8085166000908152602460205260409020546101009004166142635760ff848116600090815260246020526040902054600563010000009091049091161061418c5760405162461bcd60e51b815260206004820181905260248201527f7265616368656420746865206d6178696d756d207a6f6d626965206c696d69746044820152606401610918565b60ff80851660009081526024602052604090208054630100000090049091169060036141b783615425565b82546101009290920a60ff81810219909316918316021790915585811660009081526024602052604090204360069091015584161590506142375760ff808416600090815260246020526040902080546301000000900490911690600361421d8361546c565b91906101000a81548160ff021916908360ff160217905550505b6000858152602360205260409020805461ff00191661010060ff871602178155436001909101556143b7565b60ff8316156142cc5760ff80841660009081526024602052604090208054630100000090049091169060036142978361546c565b825460ff9182166101009390930a9283029190920219909116179055506000858152602360205260409020805461ff00191690555b60ff8085166000908152602460205260409020805461010090049091169060016142f58361546c565b825460ff91821661010093840a9081029202191617909155600087815260236020526040812043600191909101556007549092506143419161ffff910416670de0b6b3a7640000615445565b67ffffffffffffffff169050336040805188815260ff881660208201529081018390526001600160a01b0391909116907f7b4b30f7c9939580983deddd453ff51512f9c99608fc834e4bda36df9d02a2ef9060600160405180910390a26143b5336002546001600160a01b0316908361472f565b505b5050505050565b60ff8416600114156144675780156144215760ff83811660009081526024602052604081206001018054928516929091906143fa9084906151bb565b925050819055508160ff166021600082825461441691906151bb565b909155506144ff9050565b60ff838116600090815260246020526040812060010180549285169290919061444b9084906152e2565b925050819055508160ff166021600082825461441691906152e2565b80156144b35760ff83811660009081526024602052604081206002018054928516929091906144979084906151bb565b925050819055508160ff166022600082825461441691906151bb565b60ff83811660009081526024602052604081206002018054928516929091906144dd9084906152e2565b925050819055508160ff16602260008282546144f991906152e2565b90915550505b50505050565b60ff84166000908152602460205260408120600401805484929061452a9084906151bb565b9091555050600254614546906001600160a01b0316338561472f565b826004600082825461455891906151bb565b909155505080156145df5760ff8481166000818152602460209081526040918290205482518a8152918201939093526201000090920490921681830152905133917f3df2b1a653f00aba2fd135ffbb1017422ab60c26a8a098d5bcfa972c56dc6f13919081900360600190a260ff84166000908152602460205260408120600501556143b7565b6145e982846151bb565b60ff85166000908152602460205260408120600501805490919061460e9084906152e2565b90915550505050505050565b600054600160a01b900460ff16611f875760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610918565b6000546001600160a01b03163314611f875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610918565b6040516001600160a01b03808516602483015283166044820152606481018290526144ff9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614918565b6040516001600160a01b03831660248201526044810182905261108190849063a9059cbb60e01b906064016146f8565b61476761461a565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200161370c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b614807613fe7565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586147973390565b60008183106148515781614853565b825b9392505050565b6000808260ff161180156148775750600c5460ff90811690831611155b1561488457506001919050565b600c5460ff9081169083161180156148aa5750600c54610100900460ff90811690831611155b80156148ba5750600a5460045410155b156148c757506001919050565b600c54610100900460ff9081169083161180156148f35750600c5462010000900460ff90811690831611155b80156149035750600b5460045410155b1561491057506001919050565b506000919050565b600061496d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166149ea9092919063ffffffff16565b805190915015611081578080602001905181019061498b919061547f565b6110815760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610918565b6060613fb48484600085856001600160a01b0385163b614a4c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610918565b600080866001600160a01b03168587604051614a6891906154c6565b60006040518083038185875af1925050503d8060008114614aa5576040519150601f19603f3d011682016040523d82523d6000602084013e614aaa565b606091505b5091509150614aba828286614ac5565b979650505050505050565b60608315614ad4575081614853565b825115614ae45782518084602001fd5b8160405162461bcd60e51b815260040161091891906154e2565b6001600160a01b0381168114613e6357600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614b5257614b52614b13565b604052919050565b60008060008060808587031215614b7057600080fd5b8435614b7b81614afe565b9350602085810135614b8c81614afe565b935060408601359250606086013567ffffffffffffffff80821115614bb057600080fd5b818801915088601f830112614bc457600080fd5b813581811115614bd657614bd6614b13565b614be8601f8201601f19168501614b29565b91508082528984828501011115614bfe57600080fd5b808484018584013760008482840101525080935050505092959194509250565b600067ffffffffffffffff821115614c3857614c38614b13565b5060051b60200190565b600082601f830112614c5357600080fd5b81356020614c68614c6383614c1e565b614b29565b82815260059290921b84018101918181019086841115614c8757600080fd5b8286015b84811015614ca25780358352918301918301614c8b565b509695505050505050565b803560ff81168114614cbe57600080fd5b919050565b600080600080600060808688031215614cdb57600080fd5b853567ffffffffffffffff80821115614cf357600080fd5b614cff89838a01614c42565b96506020880135915080821115614d1557600080fd5b818801915088601f830112614d2957600080fd5b813581811115614d3857600080fd5b8960208260051b8501011115614d4d57600080fd5b602083019650809550505050614d6560408701614cad565b9150614d7360608701614cad565b90509295509295909350565b60008060408385031215614d9257600080fd5b823567ffffffffffffffff811115614da957600080fd5b614db585828601614c42565b925050614dc460208401614cad565b90509250929050565b600060208284031215614ddf57600080fd5b61485382614cad565b803561ffff81168114614cbe57600080fd5b803563ffffffff81168114614cbe57600080fd5b60008060008060008060c08789031215614e2757600080fd5b614e3087614cad565b9550614e3e60208801614de8565b9450614e4c60408801614de8565b9350614e5a60608801614dfa565b9250614e6860808801614dfa565b915060a087013590509295509295509295565b600060208284031215614e8d57600080fd5b5035919050565b60008060408385031215614ea757600080fd5b823567ffffffffffffffff80821115614ebf57600080fd5b614ecb86838701614c42565b9350602091508185013581811115614ee257600080fd5b85019050601f81018613614ef557600080fd5b8035614f03614c6382614c1e565b81815260059190911b82018301908381019088831115614f2257600080fd5b928401925b82841015614f4757614f3884614cad565b82529284019290840190614f27565b80955050505050509250929050565b60008060408385031215614f6957600080fd5b82359150614dc460208401614cad565b600060208284031215614f8b57600080fd5b813567ffffffffffffffff811115614fa257600080fd5b613fb484828501614c42565b60008060408385031215614fc157600080fd5b614fca83614cad565b9150614dc460208401614cad565b600060208284031215614fea57600080fd5b813561485381614afe565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601490820152730d2dcecc2d8d2c840c6c2e6e8d8ca40d2dcc8caf60631b604082015260600190565b60208082526018908201527f636173746c6520776173206e6f74207075726368617365640000000000000000604082015260600190565b60208082526014908201527318d85cdd1b195908185b1c9958591e481cdbdb1960621b604082015260600190565b6020808252601490820152731b9bc81d1bdad95b92591cc81c1c9bdd9a59195960621b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561511557600080fd5b815161485381614afe565b80518015158114614cbe57600080fd5b60008060006060848603121561514557600080fd5b835192506020840151915061515c60408501615120565b90509250925092565b634e487b7160e01b600052601160045260246000fd5b600061ffff8083168181141561519357615193615165565b6001019392505050565b600061ffff8216806151b1576151b1615165565b6000190192915050565b600082198211156151ce576151ce615165565b500190565b60006000198214156151e7576151e7615165565b5060010190565b600081518084526020808501945080840160005b8381101561521e57815187529582019590820190600101615202565b509495945050505050565b60608152600061523c60608301866151ee565b60208301949094525060400152919050565b60608152600061526160608301876151ee565b82810360208401528481526001600160fb1b0385111561528057600080fd5b8460051b808760208401376000910160200190815260ff9390931660409290920191909152509392505050565b6020808252818101527f6d73672073656e646572206973206e6f7420636173746c652773206f776e6572604082015260600190565b6000828210156152f4576152f4615165565b500390565b600081600019048311821515161561531357615313615165565b500290565b600060ff821660ff84168082101561533257615332615165565b90039392505050565b600061ffff8083168185168183048111821515161561535c5761535c615165565b02949350505050565b6020808252601d908201527f6d73672073656e646572206973206e6f7420746f6b656e206f776e6572000000604082015260600190565b600060ff821660ff84168060ff038211156153b9576153b9615165565b019392505050565b6000826153de57634e487b7160e01b600052601260045260246000fd5b500490565b600069ffffffffffffffffffff8083168185168183048111821515161561535c5761535c615165565b60006020828403121561541e57600080fd5b5051919050565b600060ff821660ff81141561543c5761543c615165565b60010192915050565b600067ffffffffffffffff8083168185168183048111821515161561535c5761535c615165565b600060ff8216806151b1576151b1615165565b60006020828403121561549157600080fd5b61485382615120565b60005b838110156154b557818101518382015260200161549d565b838111156144ff5750506000910152565b600082516154d881846020870161549a565b9190910192915050565b602081526000825180602084015261550181604085016020870161549a565b601f01601f1916919091016040019291505056fea2646970667358221220beaeee506aa99408a4e389b3a0da9a312974ffa5f5ff972cc9629e4a03c7f82b64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000dc8c9988212ba573ce74bcc2444042f2f8f39101000000000000000000000000c2a2c4581ae53e79eca49e7c81a8cd5b5094a07400000000000000000000000038f84b77d03bf46249182bd9dd5cf58adf2f39aa
-----Decoded View---------------
Arg [0] : dopersAddress (address): 0xDc8c9988212Ba573CE74BCC2444042F2F8f39101
Arg [1] : dopesAddress (address): 0xC2a2c4581ae53E79ecA49e7c81a8CD5b5094a074
Arg [2] : _templeSink (address): 0x38F84B77D03bF46249182Bd9DD5Cf58Adf2f39Aa
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000dc8c9988212ba573ce74bcc2444042f2f8f39101
Arg [1] : 000000000000000000000000c2a2c4581ae53e79eca49e7c81a8cd5b5094a074
Arg [2] : 00000000000000000000000038f84b77d03bf46249182bd9dd5cf58adf2f39aa
Deployed Bytecode Sourcemap
42312:32704:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43550:57;;43589:18;43550:57;;;;;160:25:1;;;148:2;133:18;43550:57:0;;;;;;;;42423:19;;;;;-1:-1:-1;;;;;42423:19:0;;;;;;-1:-1:-1;;;;;374:32:1;;;356:51;;344:2;329:18;42423:19:0;196:217:1;13208:207:0;;;;;;:::i;:::-;-1:-1:-1;;;13208:207:0;;;;;;;;;;-1:-1:-1;;;;;;2241:33:1;;;2223:52;;2211:2;2196:18;13208:207:0;2079:202:1;57405:2990:0;;;;;;:::i;:::-;;:::i;:::-;;45874:35;;;;;;42449:21;;;;;-1:-1:-1;;;;;42449:21:0;;;42886:42;;42926:2;42886:42;;;;;4685:4:1;4673:17;;;4655:36;;4643:2;4628:18;42886:42:0;4513:184:1;43945:35:0;;;;;-1:-1:-1;;;43945:35:0;;;;;;;;;4876:10:1;4864:23;;;4846:42;;4834:2;4819:18;43945:35:0;4702:192:1;71182:550:0;;;;;;:::i;:::-;;:::i;46102:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46102:39:0;;;;;;;;;;;;;;;;;;;5942:14:1;;5935:22;5917:41;;6006:4;5994:17;;;5989:2;5974:18;;5967:45;6048:17;;;6028:18;;;6021:45;;;;6102:17;;;;6097:2;6082:18;;6075:45;6169:6;6157:19;;;6151:3;6136:19;;6129:48;6208:3;6193:19;;6186:35;;;;6252:3;6237:19;;6230:35;6296:3;6281:19;;6274:35;6340:3;6325:19;;6318:35;6384:3;6369:19;;6362:35;;;;6428:3;6413:19;;6406:36;5904:3;5889:19;46102:39:0;5509:939:1;67994:867:0;;;;;;:::i;:::-;;:::i;70689:485::-;;;;;;:::i;:::-;;:::i;45683:65::-;;;;;;:::i;:::-;;:::i;67513:473::-;;;;;;:::i;:::-;;:::i;63027:1639::-;;;;;;:::i;:::-;;:::i;65996:716::-;;;;;;:::i;:::-;;:::i;70614:67::-;;;:::i;46024:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46024:47:0;;;;;-1:-1:-1;;;46024:47:0;;;;;;;;;;;;;8978:4:1;8966:17;;;8948:36;;9020:17;;;9015:2;9000:18;;8993:45;9074:17;;;9054:18;;;9047:45;;;;9128:17;;;;9123:2;9108:18;;9101:45;9190:14;9183:22;9177:3;9162:19;;9155:51;9250:14;;9243:22;9237:3;9222:19;;9215:51;9297:3;9282:19;;9275:35;;;;8935:3;8920:19;46024:47:0;8661:655:1;61666:1353:0;;;;;;:::i;:::-;;:::i;69532:947::-;;;;;;:::i;:::-;;:::i;43088:54::-;;43140:2;43088:54;;7858:86;7905:4;7929:7;-1:-1:-1;;;7929:7:0;;;;7858:86;;9741:14:1;;9734:22;9716:41;;9704:2;9689:18;7858:86:0;9576:187:1;43402:44:0;;43442:4;43402:44;;;;;9942:6:1;9930:19;;;9912:38;;9900:2;9885:18;43402:44:0;9768:188:1;43987:48:0;;;;;;42579:28;;;;;;10723:103;;;:::i;43856:38::-;;;;;-1:-1:-1;;;43856:38:0;;;;;;43330:37;;43366:1;43330:37;;42479:32;;;;;;43270:53;;43322:1;43270:53;;70543:63;;;:::i;49358:4326::-;;;;;;:::i;:::-;;:::i;:::-;;;;10157:25:1;;;10213:2;10198:18;;10191:34;;;;10268:14;10261:22;10241:18;;;10234:50;10145:2;10130:18;49358:4326:0;9961:329:1;10075:87:0;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;10075:87;;43614:47;;43656:5;43614:47;;60403:1254;;;;;;:::i;:::-;;:::i;64736:1252::-;;;;;;:::i;:::-;;:::i;71740:596::-;;;:::i;42977:47::-;;43022:2;42977:47;;43774:36;;;;;;;;;;;;66720:785;;;;;;:::i;:::-;;:::i;68869:590::-;;;;;;:::i;:::-;;:::i;45556:54::-;;;;;;:::i;:::-;;:::i;45427:122::-;;;;;;:::i;:::-;;:::i;43817:32::-;;;;;;;;;;;;46148:25;;;;;-1:-1:-1;;;;;46148:25:0;;;42518:19;;;;;;;;;45617:59;;;;;;:::i;:::-;;:::i;43701:23::-;;;;;;;;;10981:201;;;;;;:::i;:::-;;:::i;42844:35::-;;42878:1;42844:35;;43218:45;;43261:2;43218:45;;49139:211;;;;;;:::i;:::-;;:::i;43497:46::-;;43538:5;43497:46;;45798:51;;;;;;:::i;:::-;;:::i;:::-;;;;11593:4:1;11581:17;;;11563:36;;11630:2;11615:18;;11608:34;;;;11658:18;;;11651:34;11551:2;11536:18;45798:51:0;11365:326:1;45948:35:0;;;;;;57405:2990;4345:1;4943:7;;:19;;4935:63;;;;-1:-1:-1;;;4935:63:0;;;;;;;:::i;:::-;;;;;;;;;4345:1;5076:7;:18;7463:19:::1;:17;:19::i;:::-;57603:8:::2;57613:4;72905:1;72894:8;:12;;;:42;;;;-1:-1:-1::0;42926:2:0::2;72910:26;::::0;::::2;;72894:42;72872:112;;;;-1:-1:-1::0;;;72872:112:0::2;;;;;;;:::i;:::-;72999:5;72995:373;;;73036:1;73025:8;:12;;;73021:186;;;73088:17;::::0;::::2;;::::0;;;:7:::2;:17;::::0;;;;:30:::2;;::::0;73058:133:::2;;;;-1:-1:-1::0;;;73058:133:0::2;;;;;;;:::i;:::-;72995:373;;;73265:17;::::0;::::2;;::::0;;;:7:::2;:17;::::0;;;;:30:::2;;::::0;:35;73239:117:::2;;;;-1:-1:-1::0;;;73239:117:0::2;;;;;;;:::i;:::-;57801:15:::0;;57793:53:::3;;;;-1:-1:-1::0;;;57793:53:0::3;;;;;;;:::i;:::-;57859:19;57893:16:::0;57931:9:::3;57926:2324;57950:8;:15;57946:1;:19;57926:2324;;;57987:15;58005:8;58014:1;58005:11;;;;;;;;:::i;:::-;;::::0;;::::3;::::0;;;;;;;58031:17:::3;58051:19:::0;;;:10:::3;:19:::0;;;;;;;:28;58005:11;;-1:-1:-1;58051:28:0::3;;::::0;;::::3;::::0;::::3;::::0;58104:23;::::3;::::0;::::3;;58096:65;;;::::0;-1:-1:-1;;;58096:65:0;;13790:2:1;58096:65:0::3;::::0;::::3;13772:21:1::0;13829:2;13809:18;;;13802:30;13868:31;13848:18;;;13841:59;13917:18;;58096:65:0::3;13588:353:1::0;58096:65:0::3;58218:6;::::0;:23:::3;::::0;-1:-1:-1;;;58218:23:0;;::::3;::::0;::::3;160:25:1::0;;;-1:-1:-1;;;;;58218:6:0;;::::3;::::0;:14:::3;::::0;133:18:1;;58218:23:0::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;58202:39:0::3;6051:10:::0;-1:-1:-1;;;;;58202:39:0::3;;58176:132;;;::::0;-1:-1:-1;;;58176:132:0;;14404:2:1;58176:132:0::3;::::0;::::3;14386:21:1::0;14443:2;14423:18;;;14416:30;14482:33;14462:18;;;14455:61;14533:18;;58176:132:0::3;14202:355:1::0;58176:132:0::3;58378:50;::::0;-1:-1:-1;;;58378:50:0;;::::3;::::0;::::3;160:25:1::0;;;58326:14:0::3;::::0;;;;;58378:4:::3;::::0;:41:::3;::::0;133:18:1;;58378:50:0::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58445:13;58461:19:::0;;;:10:::3;:19;::::0;;;;:27;58325:103;;-1:-1:-1;58325:103:0;;-1:-1:-1;58325:103:0;-1:-1:-1;58461:27:0;;::::3;;;58524:14;58507:32:::0;::::3;58503:1531;;;58560:39;58568:7;58577:8;58587:11;58560:7;:39::i;:::-;58503:1531;;;58666:31;::::0;::::3;::::0;;:86:::3;;-1:-1:-1::0;58722:30:0::3;::::0;::::3;58739:12;58722:30;58666:86;58640:1085;;;58829:32;::::0;::::3;58795:148;;;::::0;-1:-1:-1;;;58795:148:0;;15394:2:1;58795:148:0::3;::::0;::::3;15376:21:1::0;15433:2;15413:18;;;15406:30;15472:32;15452:18;;;15445:60;15522:18;;58795:148:0::3;15192:354:1::0;58795:148:0::3;58992:14;58974:33;::::0;::::3;;;58966:58;;;::::0;-1:-1:-1;;;58966:58:0;;15753:2:1;58966:58:0::3;::::0;::::3;15735:21:1::0;15792:2;15772:18;;;15765:30;-1:-1:-1;;;15811:18:1;;;15804:42;15863:18;;58966:58:0::3;15551:336:1::0;58966:58:0::3;59047:14;59064:10;59075:7;59064:19;;;;;;;;;:::i;:::-;;::::0;::::3;::::0;;::::3;::::0;::::3;::::0;;;;::::3;;::::0;::::3;::::0;::::3;::::0;-1:-1:-1;59112:16:0;::::3;59108:598;;59157:19;::::0;;;:10:::3;:19;::::0;;;;:39;;-1:-1:-1;;59157:39:0::3;;::::0;::::3;;::::0;;59223:46:::3;59157:39:::0;59244:8;59254;-1:-1:-1;59223:10:0::3;:46::i;:::-;59108:598;;;59367:19;::::0;;;:10:::3;:19;::::0;;;;:28;59326:213:::3;::::0;59367:28:::3;::::0;;::::3;::::0;59426:11;;59468:8;;59326:10:::3;:213::i;:::-;59568:19;::::0;;;:10:::3;:19;::::0;;;;:39;;-1:-1:-1;;59568:39:0::3;;::::0;::::3;;::::0;;59636:46:::3;59568:39:::0;59657:8;59667;-1:-1:-1;59636:10:0::3;:46::i;:::-;58772:953;58640:1085;59745:17;::::0;::::3;;::::0;;;:7:::3;:17;::::0;;;;:27;;-1:-1:-1;;;59745:27:0;::::3;;;::::0;:25:::3;:27;::::0;::::3;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;59797:11;:16;;59812:1;59797:16;59793:95;;59838:20;::::0;::::3;;::::0;;;:7:::3;:20;::::0;;;;:30;;-1:-1:-1;;;59838:30:0;::::3;;;::::0;:28:::3;:30;::::0;::::3;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;59793:95;59908:19;::::0;;;:10:::3;:19;::::0;;;;:39;;::::3;::::0;::::3;;;-1:-1:-1::0;;59908:39:0;;::::3;;::::0;;60006:12:::3;59908:28;59966:37:::0;;::::3;:52:::0;58503:1531:::3;60054:10:::0;;60050:189:::3;;60085:62;60097:7;60106:11;60119:6;60127:3;60132:14;60085:11;:62::i;:::-;60168:15;60180:3:::0;60168:15;::::3;:::i;:::-;::::0;-1:-1:-1;60202:21:0::3;60217:6:::0;60202:21;::::3;:::i;:::-;;;60050:189;57972:2278;;;;;;57967:3;;;;;:::i;:::-;;;;57926:2324;;;-1:-1:-1::0;6051:10:0;-1:-1:-1;;;;;60265:52:0::3;;60285:8;60295:11;60308:8;60265:52;;;;;;;;:::i;:::-;;;;;;;;6051:10:::0;-1:-1:-1;;;;;60333:54:0::3;;60354:8;60364:12;;60378:8;60333:54;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;4301:1:0;5255:22;;-1:-1:-1;;;;;;;57405:2990:0:o;71182:550::-;7722:16;:14;:16::i;:::-;9961:13:::1;:11;:13::i;:::-;71328:15:::0;;71320:53:::2;;;;-1:-1:-1::0;;;71320:53:0::2;;;;;;;:::i;:::-;71458:14;71441:32;::::0;::::2;;;71384:132;;;::::0;-1:-1:-1;;;71384:132:0;;18502:2:1;71384:132:0::2;::::0;::::2;18484:21:1::0;18541:2;18521:18;;;18514:30;-1:-1:-1;;;18560:18:1;;;18553:45;18615:18;;71384:132:0::2;18300:339:1::0;71384:132:0::2;71534:9;71529:196;71553:8;:15;71549:1;:19;71529:196;;;71613:1;71598:8;71607:1;71598:11;;;;;;;;:::i;:::-;;;;;;;:16;;:39;;;;;71632:5;71618:8;71627:1;71618:11;;;;;;;;:::i;:::-;;;;;;;:19;71598:39;71590:67;;;::::0;-1:-1:-1;;;71590:67:0;;18846:2:1;71590:67:0::2;::::0;::::2;18828:21:1::0;18885:2;18865:18;;;18858:30;-1:-1:-1;;;18904:18:1;;;18897:45;18959:18;;71590:67:0::2;18644:339:1::0;71590:67:0::2;71706:7;71672:10;:23;71683:8;71692:1;71683:11;;;;;;;;:::i;:::-;;;;;;;71672:23;;;;;;;;;;;:31;;;:41;;;;;;;;;;;;;;;;;;71570:3;;;;;:::i;:::-;;;;71529:196;;;;71182:550:::0;;:::o;67994:867::-;4345:1;4943:7;;:19;;4935:63;;;;-1:-1:-1;;;4935:63:0;;;;;;;:::i;:::-;4345:1;5076:7;:18;7463:19:::1;:17;:19::i;:::-;68117:8:::0;6051:10;72463:6:::2;::::0;;72478:17:::2;::::0;::::2;72463:6;72478:17:::0;;;:7:::2;:17;::::0;;;;;;;;:30;;::::2;::::0;72463:46;;-1:-1:-1;;;72463:46:0;;::::2;::::0;::::2;160:25:1::0;;;;-1:-1:-1;;;;;72463:62:0;;::::2;::::0;:6;;::::2;::::0;:14:::2;::::0;133:18:1;72463:46:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;72463:62:0::2;;72441:144;;;;-1:-1:-1::0;;;72441:144:0::2;;;;;;;:::i;:::-;68149:8:::3;68159:4;72905:1;72894:8;:12;;;:42;;;;-1:-1:-1::0;42926:2:0::3;72910:26;::::0;::::3;;72894:42;72872:112;;;;-1:-1:-1::0;;;72872:112:0::3;;;;;;;:::i;:::-;72999:5;72995:373;;;73036:1;73025:8;:12;;;73021:186;;;73088:17;::::0;::::3;;::::0;;;:7:::3;:17;::::0;;;;:30:::3;;::::0;73058:133:::3;;;;-1:-1:-1::0;;;73058:133:0::3;;;;;;;:::i;:::-;72995:373;;;73265:17;::::0;::::3;;::::0;;;:7:::3;:17;::::0;;;;:30:::3;;::::0;:35;73239:117:::3;;;;-1:-1:-1::0;;;73239:117:0::3;;;;;;;:::i;:::-;68203:17:::4;::::0;;::::4;;::::0;;;:7:::4;:17;::::0;;;;:25;::::4;:34;68181:115;;;::::0;-1:-1:-1;;;68181:115:0;;19551:2:1;68181:115:0::4;::::0;::::4;19533:21:1::0;19590:2;19570:18;;;19563:30;19629:33;19609:18;;;19602:61;19680:18;;68181:115:0::4;19349:355:1::0;68181:115:0::4;68343:17;::::0;;::::4;68307:13;68343:17:::0;;;:7:::4;:17;::::0;;;;:23;68323:5:::4;::::0;68343:23;;;::::4;;;:28;68339:318;;;68388:14;68397:5;68388:14:::0;::::4;:::i;:::-;;;68339:318;;;68424:17;::::0;;::::4;;::::0;;;:7:::4;:17;::::0;;;;:23;;;::::4;;68451:1;68424:28;68420:237;;;68469:14;68478:5;68469:14:::0;::::4;:::i;68420:237::-;68505:17;::::0;;::::4;;::::0;;;:7:::4;:17;::::0;;;;:23;;;::::4;;68532:1;68505:28;68501:156;;;68550:14;68559:5;68550:14:::0;::::4;:::i;68501:156::-;68586:17;::::0;;::::4;;::::0;;;:7:::4;:17;::::0;;;;:23;;;::::4;;68613:1;68586:28;68582:75;;;68631:14;68640:5;68631:14:::0;::::4;:::i;:::-;;;68582:75;68667:15;68676:6;68667:15:::0;::::4;:::i;:::-;::::0;-1:-1:-1;68693:58:0::4;6051:10:::0;68716:12:::4;68693:5;::::0;-1:-1:-1;;;;;68693:5:0::4;::::0;68738:4:::4;68745:5:::0;68693:22:::4;:58::i;:::-;68762:17;::::0;::::4;;::::0;;;:7:::4;:17;::::0;;;;:32;;-1:-1:-1;;68762:32:0::4;68790:4;68762:32;::::0;;68823:12:::4;6051:10:::0;;5971:98;68823:12:::4;68810:43;::::0;;20212:4:1;20200:17;;20182:36;;20249:2;20234:18;;20227:34;;;-1:-1:-1;;;;;68810:43:0;;;::::4;::::0;::::4;::::0;20155:18:1;68810:43:0::4;;;;;;;;-1:-1:-1::0;;4301:1:0;5255:22;;-1:-1:-1;;;67994:867:0:o;70689:485::-;9961:13;:11;:13::i;:::-;7722:16:::1;:14;:16::i;:::-;70947:5:::2;:14:::0;;71052:38:::2;71101:27:::0;;::::2;-1:-1:-1::0;;;71101:27:0::2;-1:-1:-1::0;;71052:38:0;;;::::2;-1:-1:-1::0;;;71052:38:0::2;-1:-1:-1::0;;70972:33:0::2;71016:25:::0;;::::2;::::0;::::2;71052:38:::0;-1:-1:-1;;70972:33:0;;;::::2;70947:14;70972:33;-1:-1:-1::0;;70972:33:0;;;70947:14:::2;::::0;;;::::2;70972:33:::0;;;;::::2;71052:38:::0;;;;;;;;;;;::::2;71101:27;::::0;;;::::2;::::0;;71139:12:::2;:27:::0;70689:485::o;45683:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67513:473::-;4345:1;4943:7;;:19;;4935:63;;;;-1:-1:-1;;;4935:63:0;;;;;;;:::i;:::-;4345:1;5076:7;:18;67612:8;6051:10;72463:6:::1;::::0;;72478:17:::1;::::0;::::1;72463:6;72478:17:::0;;;:7:::1;:17;::::0;;;;;;;;:30;;::::1;::::0;72463:46;;-1:-1:-1;;;72463:46:0;;::::1;::::0;::::1;160:25:1::0;;;;-1:-1:-1;;;;;72463:62:0;;::::1;::::0;:6;;::::1;::::0;:14:::1;::::0;133:18:1;72463:46:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;72463:62:0::1;;72441:144;;;;-1:-1:-1::0;;;72441:144:0::1;;;;;;;:::i;:::-;67644:8:::2;67654:4;72905:1;72894:8;:12;;;:42;;;;-1:-1:-1::0;42926:2:0::2;72910:26;::::0;::::2;;72894:42;72872:112;;;;-1:-1:-1::0;;;72872:112:0::2;;;;;;;:::i;:::-;72999:5;72995:373;;;73036:1;73025:8;:12;;;73021:186;;;73088:17;::::0;::::2;;::::0;;;:7:::2;:17;::::0;;;;:30:::2;;::::0;73058:133:::2;;;;-1:-1:-1::0;;;73058:133:0::2;;;;;;;:::i;:::-;72995:373;;;73265:17;::::0;::::2;;::::0;;;:7:::2;:17;::::0;;;;:30:::2;;::::0;:35;73239:117:::2;;;;-1:-1:-1::0;;;73239:117:0::2;;;;;;;:::i;:::-;67684:17:::3;::::0;::::3;67712:1;67684:17:::0;;;:7:::3;:17;::::0;;;;:25:::3;;::::0;67676:58:::3;;;::::0;-1:-1:-1;;;67676:58:0;;20474:2:1;67676:58:0::3;::::0;::::3;20456:21:1::0;20513:2;20493:18;;;20486:30;-1:-1:-1;;;20532:18:1;;;20525:46;20588:18;;67676:58:0::3;20272:340:1::0;67676:58:0::3;67745:59;6051:10:::0;67778:17:::3;::::0;::::3;;::::0;;;:7:::3;:17;::::0;;;;:25:::3;;::::0;67745:5:::3;::::0;-1:-1:-1;;;;;67745:5:0::3;::::0;:59;:18:::3;:59::i;:::-;67836:17;::::0;::::3;;::::0;;;:7:::3;:17;::::0;;;;:25:::3;::::0;;::::3;::::0;67815:46;;67836:25;;:17;67815:46:::3;::::0;67836:25;;67815:46:::3;:::i;:::-;::::0;;;-1:-1:-1;;67912:17:0::3;::::0;::::3;;::::0;;;:7:::3;:17;::::0;;;;;;;;:25:::3;;::::0;67879:59;;20182:36:1;;;20234:18;;;20227:34;67879:59:0;;6051:10;;67879:59:::3;::::0;;;;;;;::::3;-1:-1:-1::0;;;67949:17:0::3;;67977:1;67949:17:::0;;;:7:::3;:17;::::0;;;;:25:::3;;:29:::0;4301:1;5255:22;;67513:473::o;63027:1639::-;4345:1;4943:7;;:19;;4935:63;;;;-1:-1:-1;;;4935:63:0;;;;;;;:::i;:::-;4345:1;5076:7;:18;7463:19:::1;:17;:19::i;:::-;63184:9:::2;63179:1480;63203:7;:14;63199:1;:18;63179:1480;;;42969:1;63247:21;;:5;63253:1;63247:8;;;;;;;;:::i;:::-;;;;;;;:21;;;;63239:47;;;::::0;-1:-1:-1;;;63239:47:0;;20819:2:1;63239:47:0::2;::::0;::::2;20801:21:1::0;20858:2;20838:18;;;20831:30;-1:-1:-1;;;20877:18:1;;;20870:43;20930:18;;63239:47:0::2;20617:337:1::0;63239:47:0::2;63301:14;63318:10;:22;63329:7;63337:1;63329:10;;;;;;;;:::i;:::-;;;;;;;63318:22;;;;;;;;;;;:31;;;;;;;;;;;;63301:48;;63383:16;63400:1;63383:19;;;;;;;:::i;:::-;;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;;;::::2;;::::0;::::2;::::0;::::2;63372:30:::0;;::::2;;63364:57;;;::::0;-1:-1:-1;;;63364:57:0;;21161:2:1;63364:57:0::2;::::0;::::2;21143:21:1::0;21200:2;21180:18;;;21173:30;-1:-1:-1;;;21219:18:1;;;21212:44;21273:18;;63364:57:0::2;20959:338:1::0;63364:57:0::2;63493:5;63499:1;63493:8;;;;;;;;:::i;:::-;;;;;;;63462:39;;:10;:22;63473:7;63481:1;63473:10;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;63462:22;;;::::2;::::0;;;;;;-1:-1:-1;63462:22:0;:28;;;::::2;;;:39;63436:131;;;::::0;-1:-1:-1;;;63436:131:0;;21504:2:1;63436:131:0::2;::::0;::::2;21486:21:1::0;21543:2;21523:18;;;21516:30;21582:32;21562:18;;;21555:60;21632:18;;63436:131:0::2;21302:354:1::0;63436:131:0::2;63635:5;63641:1;63635:8;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;63608:35:::2;:17:::0;;::::2;;::::0;;;:7:::2;:17:::0;;;;;;;:23;:35;;::::2;:23:::0;;;::::2;::::0;;::::2;:35;;63582:122;;;::::0;-1:-1:-1;;;63582:122:0;;21863:2:1;63582:122:0::2;::::0;::::2;21845:21:1::0;21902:2;21882:18;;;21875:30;-1:-1:-1;;;21921:18:1;;;21914:55;21986:18;;63582:122:0::2;21661:349:1::0;63582:122:0::2;63719:13;63812:10;:22;63823:7;63831:1;63823:10;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;63812:22;;;::::2;::::0;;;;;;-1:-1:-1;63812:22:0;:28;;;::::2;;;:33:::0;:143:::2;;63902:19;63953:1;63922:10;:22;63933:7;63941:1;63933:10;;;;;;;;:::i;:::-;;;;;;;63922:22;;;;;;;;;;;:28;;;;;;;;;;;;:32;;;;:::i;:::-;63902:53;;;;;;;;;:::i;:::-;;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;;;::::2;;::::0;::::2;;63812:143;;;63873:1;63812:143;63736:19;63767:1;63756:5;63762:1;63756:8;;;;;;;;:::i;:::-;;;;;;;:12;;;;:::i;:::-;63736:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:238;;;;:::i;:::-;63735:247;::::0;::::2;;63978:4;63735:247;:::i;:::-;63719:263;;;;64026:20;;64003;;:43;63999:420;;;64099:20;::::0;:24:::2;::::0;64122:1:::2;64099:24;:::i;:::-;64076:20;;:47;:98;;64173:1;64076:98;;;64147:2;64076:98;64067:107;::::0;::::2;;::::0;::::2;:::i;:::-;;;63999:420;;;64223:20;;64200;;:43;64196:223;;;64264:11;64273:2;64264:11:::0;::::2;:::i;64196:223::-;64392:11;64401:2;64392:11:::0;::::2;:::i;:::-;;;64196:223;64435:15;64444:6;64435:15:::0;::::2;:::i;:::-;::::0;-1:-1:-1;64465:58:0::2;6051:10:::0;64488:12:::2;5971:98:::0;64465:58:::2;64569:5;64575:1;64569:8;;;;;;;;:::i;:::-;;;;;;;64538:10;:22;64549:7;64557:1;64549:10;;;;;;;;:::i;:::-;;;;;;;64538:22;;;;;;;;;;;:28;;;:39;;;;;;;;;;;;;;;;;;64612:12;6051:10:::0;;5971:98;64612:12:::2;-1:-1:-1::0;;;;;64599:48:0::2;;64626:7;64634:1;64626:10;;;;;;;;:::i;:::-;;;;;;;64638:5;64644:1;64638:8;;;;;;;;:::i;:::-;;;;;;;64599:48;;;;;;22648:25:1::0;;;22721:4;22709:17;22704:2;22689:18;;22682:45;22636:2;22621:18;;22478:255;64599:48:0::2;;;;;;;;63224:1435;;63219:3;;;;;:::i;:::-;;;;63179:1480;;;-1:-1:-1::0;;4301:1:0;5255:22;;-1:-1:-1;63027:1639:0:o;65996:716::-;4345:1;4943:7;;:19;;4935:63;;;;-1:-1:-1;;;4935:63:0;;;;;;;:::i;:::-;4345:1;5076:7;:18;66101:7;6051:10;72687:6:::1;::::0;:23:::1;::::0;-1:-1:-1;;;72687:23:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;72687:39:0;;::::1;::::0;:6;;::::1;::::0;:14:::1;::::0;133:18:1;;72687:23:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;72687:39:0::1;;72665:118;;;;-1:-1:-1::0;;;72665:118:0::1;;;;;;;:::i;:::-;66181:10:::2;::::0;;:7:::2;:10;::::0;:28;;66164:45:::2;::::0;43442:4:::2;66164:45;:::i;:::-;66148:12;:61;;66126:143;;;::::0;-1:-1:-1;;;66126:143:0;;23298:2:1;66126:143:0::2;::::0;::::2;23280:21:1::0;;;23317:18;;;23310:30;23376:34;23356:18;;;23349:62;23428:18;;66126:143:0::2;23096:356:1::0;66126:143:0::2;66302:19;::::0;;;:10:::2;:19;::::0;;;;:27;:50:::2;:27:::0;;;::::2;;66339:12;66302:50;66280:118;;;::::0;-1:-1:-1;;;66280:118:0;;23659:2:1;66280:118:0::2;::::0;::::2;23641:21:1::0;23698:2;23678:18;;;23671:30;-1:-1:-1;;;23717:18:1;;;23710:48;23775:18;;66280:118:0::2;23457:342:1::0;66280:118:0::2;66417:10;::::0;;:7:::2;:10;::::0;:23;;:34;::::2;;66409:73;;;::::0;-1:-1:-1;;;66409:73:0;;24006:2:1;66409:73:0::2;::::0;::::2;23988:21:1::0;24045:2;24025:18;;;24018:30;24084:28;24064:18;;;24057:56;24130:18;;66409:73:0::2;23804:350:1::0;66409:73:0::2;66493:62;6051:10:::0;66530::::2;::::0;66542:12:::2;::::0;66493:5:::2;::::0;-1:-1:-1;;;;;66493:5:0;;::::2;::::0;:62;66530:10:::2;::::0;66493:22:::2;:62::i;:::-;66568:10;::::0;;;:7:::2;:10;::::0;;;:23;:33;;;66643:12:::2;66612:28:::0;:43;66673:31:::2;::::0;;4655:36:1;;;66673:31:0;6051:10;;66673:31:::2;::::0;;;;;;;::::2;-1:-1:-1::0;;4301:1:0;5255:22;;65996:716::o;70614:67::-;9961:13;:11;:13::i;:::-;70663:10:::1;:8;:10::i;:::-;70614:67::o:0;61666:1353::-;4345:1;4943:7;;:19;;4935:63;;;;-1:-1:-1;;;4935:63:0;;;;;;;:::i;:::-;4345:1;5076:7;:18;7463:19:::1;:17;:19::i;:::-;61805:7:::0;6051:10;72687:6:::2;::::0;:23:::2;::::0;-1:-1:-1;;;72687:23:0;;::::2;::::0;::::2;160:25:1::0;;;-1:-1:-1;;;;;72687:39:0;;::::2;::::0;:6;;::::2;::::0;:14:::2;::::0;133:18:1;;72687:23:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;72687:39:0::2;;72665:118;;;;-1:-1:-1::0;;;72665:118:0::2;;;;;;;:::i;:::-;42969:1:::3;61838:18;::::0;::::3;;;61830:44;;;::::0;-1:-1:-1;;;61830:44:0;;20819:2:1;61830:44:0::3;::::0;::::3;20801:21:1::0;20858:2;20838:18;;;20831:30;-1:-1:-1;;;20877:18:1;;;20870:43;20930:18;;61830:44:0::3;20617:337:1::0;61830:44:0::3;61885:14;61902:19:::0;;;:10:::3;:19;::::0;;;;:28;61960:16:::3;:19:::0;61902:28:::3;;::::0;;::::3;::::0;::::3;::::0;61960:19:::3;61949:30:::0;::::3;61941:57;;;::::0;-1:-1:-1;;;61941:57:0;;21161:2:1;61941:57:0::3;::::0;::::3;21143:21:1::0;21200:2;21180:18;;;21173:30;-1:-1:-1;;;21219:18:1;;;21212:44;21273:18;;61941:57:0::3;20959:338:1::0;61941:57:0::3;62031:19;::::0;;;:10:::3;:19;::::0;;;;:25;:33:::3;::::0;;::::3;:25:::0;;;::::3;;:33;62009:113;;;::::0;-1:-1:-1;;;62009:113:0;;21504:2:1;62009:113:0::3;::::0;::::3;21486:21:1::0;21543:2;21523:18;;;21516:30;21582:32;21562:18;;;21555:60;21632:18;;62009:113:0::3;21302:354:1::0;62009:113:0::3;62141:32;:17:::0;;::::3;;::::0;;;:7:::3;:17;::::0;;;;:23;:32;;::::3;:23:::0;;;::::3;::::0;;::::3;:32;;62133:70;;;::::0;-1:-1:-1;;;62133:70:0;;21863:2:1;62133:70:0::3;::::0;::::3;21845:21:1::0;21902:2;21882:18;;;21875:30;-1:-1:-1;;;21921:18:1;;;21914:55;21986:18;;62133:70:0::3;21661:349:1::0;62133:70:0::3;62214:13;62296:19:::0;;;:10:::3;:19;::::0;;;;:25;;;::::3;;;:30:::0;:129:::3;;62395:19;::::0;;;:10:::3;:19;::::0;;;;:25;62375:19:::3;::::0;62395:29:::3;::::0;62423:1:::3;::::0;62395:25;;::::3;;;:29;:::i;:::-;62375:50;;;;;;;;;:::i;:::-;;::::0;::::3;::::0;;::::3;::::0;::::3;::::0;;;;::::3;;::::0;::::3;;62296:129;;;62350:1;62296:129;62231:19;62251:9;62259:1;62251:5:::0;:9:::3;:::i;:::-;62231:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:209;;;;:::i;:::-;62230:218;::::0;::::3;;62444:4;62230:218;:::i;:::-;62214:234;;;;62488:20;;62465;;:43;62461:350;;;62557:20;::::0;:24:::3;::::0;62580:1:::3;62557:24;:::i;:::-;62534:20;;:47;:56;;62589:1;62534:56;;;62584:2;62534:56;62525:65;::::0;::::3;;::::0;::::3;:::i;:::-;;;62461:350;;;62635:20;;62612;;:43;62608:203;;;62672:11;62681:2;62672:11:::0;::::3;:::i;62608:203::-;62788:11;62797:2;62788:11:::0;::::3;:::i;:::-;;;62608:203;62823:15;62832:6;62823:15:::0;::::3;:::i;:::-;::::0;-1:-1:-1;62849:58:0::3;6051:10:::0;62872:12:::3;5971:98:::0;62849:58:::3;62918:19;::::0;;;:10:::3;:19;::::0;;;;:33;;-1:-1:-1;;62918:33:0::3;::::0;::::3;::::0;::::3;;;::::0;;6051:10;-1:-1:-1;;;;;62969:42:0::3;;62996:7;63005:5;62969:42;;;;;;22648:25:1::0;;;22721:4;22709:17;22704:2;22689:18;;22682:45;22636:2;22621:18;;22478:255;69532:947:0;69613:7;6051:10;72687:6;;:23;;-1:-1:-1;;;72687:23:0;;;;;160:25:1;;;-1:-1:-1;;;;;72687:39:0;;;;:6;;;;:14;;133:18:1;;72687:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;72687:39:0;;72665:118;;;;-1:-1:-1;;;72665:118:0;;;;;;;:::i;:::-;4345:1:::1;4943:7;;:19;;4935:63;;;;-1:-1:-1::0;;;4935:63:0::1;;;;;;;:::i;:::-;4345:1;5076:7;:18:::0;69668:6:::2;::::0;::::2;;69660:49;;;::::0;-1:-1:-1;;;69660:49:0;;24560:2:1;69660:49:0::2;::::0;::::2;24542:21:1::0;24599:2;24579:18;;;24572:30;24638:27;24618:18;;;24611:55;24683:18;;69660:49:0::2;24358:349:1::0;69660:49:0::2;69742:19;::::0;;;:10:::2;:19;::::0;;;;:29;-1:-1:-1;;;69742:29:0;::::2;;;:38;69720:110;;;::::0;-1:-1:-1;;;69720:110:0;;24914:2:1;69720:110:0::2;::::0;::::2;24896:21:1::0;24953:2;24933:18;;;24926:30;-1:-1:-1;;;24972:18:1;;;24965:52;25034:18;;69720:110:0::2;24712:346:1::0;69720:110:0::2;69843:13;69859:19:::0;;;:10:::2;:19;::::0;;;;:27;;;::::2;;;;69919:31:::0;::::2;::::0;:66:::2;;-1:-1:-1::0;69954:31:0::2;::::0;::::2;69971:13;69954:31;69919:66;69897:138;;;::::0;-1:-1:-1;;;69897:138:0;;25265:2:1;69897:138:0::2;::::0;::::2;25247:21:1::0;25304:2;25284:18;;;25277:30;-1:-1:-1;;;25323:18:1;;;25316:52;25385:18;;69897:138:0::2;25063:346:1::0;69897:138:0::2;70052:6;::::0;:30:::2;:6;70068:13;70052:30;70048:266;;;70107:31;::::0;::::2;70124:13;70107:31;70099:59;;;::::0;-1:-1:-1;;;70099:59:0;;25616:2:1;70099:59:0::2;::::0;::::2;25598:21:1::0;25655:2;25635:18;;;25628:30;-1:-1:-1;;;25674:18:1;;;25667:45;25729:18;;70099:59:0::2;25414:339:1::0;70099:59:0::2;70048:266;;;70251:31;::::0;::::2;70268:13;70251:31;70243:59;;;::::0;-1:-1:-1;;;70243:59:0;;25960:2:1;70243:59:0::2;::::0;::::2;25942:21:1::0;25999:2;25979:18;;;25972:30;-1:-1:-1;;;26018:18:1;;;26011:45;26073:18;;70243:59:0::2;25758:339:1::0;70243:59:0::2;70326:19;::::0;;;:10:::2;:19;::::0;;;;:36;;-1:-1:-1;;70326:36:0::2;-1:-1:-1::0;;;70326:36:0::2;::::0;;70373:47:::2;70392:12;6051:10:::0;;5971:98;70392:12:::2;70406:13;::::0;70373:5:::2;::::0;-1:-1:-1;;;;;70373:5:0::2;::::0;:47;:18:::2;:47::i;:::-;70436:35;::::0;160:25:1;;;6051:10:0;;70436:35:::2;::::0;148:2:1;133:18;70436:35:0::2;;;;;;;;-1:-1:-1::0;;4301:1:0::1;5255:22:::0;;-1:-1:-1;69532:947:0:o;10723:103::-;9961:13;:11;:13::i;:::-;10788:30:::1;10815:1;10788:18;:30::i;70543:63::-:0;9961:13;:11;:13::i;:::-;70590:8:::1;:6;:8::i;49358:4326::-:0;49465:14;49584:19;;;:10;:19;;;;;;;;:28;;;;;;49641:17;;;:7;:17;;;;;:25;;;49465:14;;;;49683:13;;;:29;;-1:-1:-1;49700:12:0;;49683:29;49679:55;;;49722:1;49725;49728:5;49714:20;;;;;;;;;;49679:55;49764:5;49796:19;;;:10;:19;;;;;:27;;49907:37;;;;;49764:5;;-1:-1:-1;49796:27:0;;;;;;49764:5;;49873:242;;49892:52;;:12;:52;:::i;:::-;49978:32;;;49995:14;49978:32;:111;;43538:5;49978:111;;;50034:16;;-1:-1:-1;;;50034:16:0;;;;49978:111;49873:242;;:4;:242::i;:::-;49864:251;;50170:14;50159:7;:25;50155:352;;50201:11;50211:1;50201:11;;:::i;:::-;;;50155:352;;;50245:18;50234:7;:29;50230:277;;50280:11;50290:1;50280:11;;:::i;50230:277::-;50324:18;50313:7;:29;50309:198;;50359:11;50369:1;50359:11;;:::i;50309:198::-;50403:18;50392:7;:29;50388:119;;50438:12;50448:2;50438:12;;:::i;50388:119::-;50483:12;50493:2;50483:12;;:::i;:::-;;;50388:119;50644:1;50616:19;;;:10;:19;;;;;:25;;;;;;:128;;50743:1;50616:128;;;50689:19;;;;:10;:19;;;;;:25;50669:19;;50689:29;;50717:1;;50689:25;;;;;:29;:::i;:::-;50669:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;50616:128;50553:19;;;;:10;:19;;;;;:27;50542:10;;50553:27;;;;;50542:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:217;;;;:::i;:::-;50519:240;;;;;;:::i;:::-;;-1:-1:-1;50776:32:0;;;50793:14;50776:32;50772:2413;;;50835:17;;;;;;;:7;:17;;;;;:25;50825:35;;-1:-1:-1;;;50835:25:0;;;;50825:35;;:::i;:::-;50885:12;;50825:35;;-1:-1:-1;50875:22:0;;-1:-1:-1;;;50885:12:0;;;;50825:35;50875:22;:::i;:::-;;;50772:2413;;;51014:17;;;;50963:26;51014:17;;;:7;:17;;;;;:25;50992:3;;51014:25;51010:108;;;51060:42;43261:2;51060:42;;:::i;:::-;;;51010:108;51159:20;;51136;;:43;51132:433;;;51308:20;;:24;;51331:1;51308:24;:::i;:::-;51263:20;;:69;;:145;;43322:1;51263:145;;;51356:1;51263:145;51239:169;;;;:::i;:::-;;;51132:433;;;51457:20;;51434;;:43;51430:135;;;51498:51;43322:1;51498:51;;:::i;:::-;;;51430:135;51581:30;;;;;;:::i;:::-;;-1:-1:-1;51649:3:0;51671:31;;;51688:13;51671:31;51667:856;;;51806:17;;;;;;;:7;:17;;;;;:33;;;;51749;;;;;:90;51723:354;;;51960:17;;;;;;;:7;:17;;;;;:33;;;;;:37;;;:::i;:::-;51898:17;;;;;;;:7;:17;;;;;:33;;;:99;;:159;;52055:2;51898:159;;;52025:2;51898:159;51882:175;;;;:::i;:::-;;;51723:354;51667:856;;;52102:31;;;52119:13;52102:31;52098:425;;;52237:17;;;;;;;:7;:17;;;;;:33;;;;52180;;;;;:90;52154:354;;;52391:17;;;;;;;:7;:17;;;;;:33;;;:37;;52427:1;52391:37;:::i;:::-;52329:17;;;;;;;:7;:17;;;;;:33;;;:99;;:159;;52486:2;52329:159;;;52456:2;52329:159;52313:175;;;;:::i;:::-;;;52154:354;52539:22;;;;;;:::i;:::-;52741:16;;52685:17;;;52606:21;52685:17;;;:7;:17;;;;;:35;;;52539:22;;-1:-1:-1;52630:2:0;;-1:-1:-1;;;52741:16:0;;;;;;52670:50;;:12;:50;:::i;:::-;52669:88;52647:205;;;52811:17;;;;;;;;:7;:17;;;;;:25;52792:44;;52811:25;;;;;52792:44;;:::i;:::-;;;52647:205;52868:25;;;;;;:::i;:::-;52918:5;;52868:25;;-1:-1:-1;52908:15:0;;52918:5;;52868:25;52908:15;:::i;:::-;;-1:-1:-1;52944:30:0;;;52961:12;52944:30;52940:234;;52999:17;;;;;;;;:7;:17;;;;;:23;;;;;:28;52995:164;;53080:17;;;;;;;;:7;:17;;;;;:23;53062:17;;53080:23;;;;;53062:42;;;;;;;:::i;:::-;;;;:77;;;;-1:-1:-1;52995:164:0;50915:2270;;;50772:2413;53197:25;43656:5;53197:25;;:::i;:::-;;;53248:6;53237:7;:17;53233:369;;53280:17;;;;;;;;:7;:17;;;;;:25;;;;-1:-1:-1;53347:5:0;;53327:16;;;;53280:25;53327:16;:::i;:::-;53326:26;;;;:::i;:::-;53371:17;;;;;;;;:7;:17;;;;;:23;53320:32;;-1:-1:-1;53371:23:0;;;;;:28;53367:159;;53447:17;;;;;;;;:7;:17;;;;;:23;53430:40;;53447:23;;;;;53430:14;:40;:::i;:::-;53420:50;;;;;;:::i;:::-;;;53506:4;53489:21;;53367:159;53233:369;;;53585:5;53565:16;;;;:6;:16;:::i;:::-;53564:26;;;;:::i;:::-;53558:32;;53233:369;53614:13;53624:3;53614:13;;:::i;:::-;;;53640:36;;;;49358:4326;;;;;;:::o;60403:1254::-;4345:1;4943:7;;:19;;4935:63;;;;-1:-1:-1;;;4935:63:0;;;;;;;:::i;:::-;4345:1;5076:7;:18;60490:15;;60482:53:::1;;;;-1:-1:-1::0;;;60482:53:0::1;;;;;;;:::i;:::-;60548:19;60582:16:::0;60618:9:::1;60613:969;60637:8;:15;60633:1;:19;60613:969;;;60716:6;::::0;60731:11;;-1:-1:-1;;;;;60716:6:0;;::::1;::::0;:14:::1;::::0;60731:8;;60740:1;;60731:11;::::1;;;;;:::i;:::-;;;;;;;60716:27;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;60716:27:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;60700:43:0::1;6051:10:::0;-1:-1:-1;;;;;60700:43:0::1;;60674:136;;;::::0;-1:-1:-1;;;60674:136:0;;14404:2:1;60674:136:0::1;::::0;::::1;14386:21:1::0;14443:2;14423:18;;;14416:30;14482:33;14462:18;;;14455:61;14533:18;;60674:136:0::1;14202:355:1::0;60674:136:0::1;60892:14;60851:56;;:10;:23;60862:8;60871:1;60862:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;60851:23;;;::::1;::::0;;;;;;-1:-1:-1;60851:23:0;:31;;;::::1;;;:56;;60825:148;;;::::0;-1:-1:-1;;;60825:148:0;;27014:2:1;60825:148:0::1;::::0;::::1;26996:21:1::0;27053:2;27033:18;;;27026:30;27092:32;27072:18;;;27065:60;27142:18;;60825:148:0::1;26812:354:1::0;60825:148:0::1;60991:14;61007:11:::0;61020:19:::1;61043:4;-1:-1:-1::0;;;;;61043:41:0::1;;61085:8;61094:1;61085:11;;;;;;;;:::i;:::-;;;;;;;61043:54;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;61043:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60990:107:::0;;-1:-1:-1;60990:107:0;-1:-1:-1;60990:107:0;-1:-1:-1;61118:10:0;;61114:415:::1;;61149:211;61183:8;61192:1;61183:11;;;;;;;;:::i;:::-;;;;;;;61217:10;:23;61228:8;61237:1;61228:11;;;;;;;;:::i;:::-;;;;;;;61217:23;;;;;;;;;;;:32;;;;;;;;;;;;61272:6;61301:3;61327:14;61149:11;:211::i;:::-;61381:15;61393:3:::0;61381:15;::::1;:::i;:::-;::::0;-1:-1:-1;61415:21:0::1;61430:6:::0;61415:21;::::1;:::i;:::-;;;61501:12;61457:10;:23;61468:8;61477:1;61468:11;;;;;;;;:::i;:::-;;;;;;;61457:23;;;;;;;;;;;:41;;:56;;;;61114:415;61549:14;61545:25;;;61565:5;;;;;61545:25;60659:923;;;60654:3;;;;;:::i;:::-;;;;60613:969;;;-1:-1:-1::0;6051:10:0;-1:-1:-1;;;;;61597:52:0::1;;61617:8;61627:11;61640:8;61597:52;;;;;;;;:::i;64736:1252::-:0;4345:1;4943:7;;:19;;4935:63;;;;-1:-1:-1;;;4935:63:0;;;;;;;:::i;:::-;4345:1;5076:7;:18;7463:19:::1;:17;:19::i;:::-;64880:7:::0;6051:10;72687:6:::2;::::0;:23:::2;::::0;-1:-1:-1;;;72687:23:0;;::::2;::::0;::::2;160:25:1::0;;;-1:-1:-1;;;;;72687:39:0;;::::2;::::0;:6;;::::2;::::0;:14:::2;::::0;133:18:1;;72687:23:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;72687:39:0::2;;72665:118;;;;-1:-1:-1::0;;;72665:118:0::2;;;;;;;:::i;:::-;64911:8:::3;64921:5;72905:1:::0;72894:8:::3;:12;;;:42;;;;-1:-1:-1::0;42926:2:0::3;72910:26;::::0;::::3;;72894:42;72872:112;;;;-1:-1:-1::0;;;72872:112:0::3;;;;;;;:::i;:::-;72999:5;72995:373;;;73036:1;73025:8;:12;;;73021:186;;;73088:17;::::0;::::3;;::::0;;;:7:::3;:17;::::0;;;;:30:::3;;::::0;73058:133:::3;;;;-1:-1:-1::0;;;73058:133:0::3;;;;;;;:::i;:::-;72995:373;;;73265:17;::::0;::::3;;::::0;;;:7:::3;:17;::::0;;;;:30:::3;;::::0;:35;73239:117:::3;;;;-1:-1:-1::0;;;73239:117:0::3;;;;;;;:::i;:::-;64977:16:::4;:19:::0;::::4;::::0;;::::4;64966:30:::0;;::::4;;64944:111;;;::::0;-1:-1:-1;;;64944:111:0;;27373:2:1;64944:111:0::4;::::0;::::4;27355:21:1::0;27412:2;27392:18;;;27385:30;27451:33;27431:18;;;27424:61;27502:18;;64944:111:0::4;27171:355:1::0;64944:111:0::4;65088:19;::::0;;;:10:::4;:19;::::0;;;;:27;:50:::4;:27:::0;;;::::4;;65125:12;65088:50;65066:118;;;::::0;-1:-1:-1;;;65066:118:0;;23659:2:1;65066:118:0::4;::::0;::::4;23641:21:1::0;23698:2;23678:18;;;23671:30;-1:-1:-1;;;23717:18:1;;;23710:48;23775:18;;65066:118:0::4;23457:342:1::0;65066:118:0::4;65203:28;65222:8;65203:18;:28::i;:::-;65195:64;;;::::0;-1:-1:-1;;;65195:64:0;;27733:2:1;65195:64:0::4;::::0;::::4;27715:21:1::0;27772:2;27752:18;;;27745:30;27811:25;27791:18;;;27784:53;27854:18;;65195:64:0::4;27531:347:1::0;65195:64:0::4;65292:19;::::0;;;:10:::4;:19;::::0;;;;:33;-1:-1:-1;;;65292:33:0;::::4;;;:42;65270:120;;;::::0;-1:-1:-1;;;65270:120:0;;28085:2:1;65270:120:0::4;::::0;::::4;28067:21:1::0;28124:2;28104:18;;;28097:30;28163;28143:18;;;28136:58;28211:18;;65270:120:0::4;27883:352:1::0;65270:120:0::4;65403:65;6051:10:::0;65403:5:::4;::::0;-1:-1:-1;;;;;65403:5:0::4;::::0;65448:4:::4;43589:18;65403:22;:65::i;:::-;65501:370;;;;;;;;65532:5;65501:370;;;;;;65564:1;65501:370;;;;;;65587:1;65501:370;;;;;;65612:1;65501:370;;;;;;65637:1;65501:370;;;;;;65670:1;65501:370;;;;65703:1;65501:370;;;;65733:7;65501:370;;;;65764:1;65501:370;;;;65789:17;65807:1;65789:20;;;;;;;:::i;:::-;;::::0;;::::4;::::0;;;::::4;:35;::::0;;::::4;::::0;65501:370;;65858:1:::4;65501:370;::::0;;::::4;::::0;;;65481:17:::4;::::0;;::::4;::::0;;;:7:::4;:17:::0;;;;;;:390;;;;;;::::4;::::0;;;::::4;::::0;::::4;::::0;::::4;::::0;::::4;::::0;::::4;::::0;-1:-1:-1;;65481:390:0;;;;::::4;;-1:-1:-1::0;;65481:390:0;;;;;::::4;::::0;;::::4;::::0;::::4;;-1:-1:-1::0;;65481:390:0;;;;::::4;::::0;;;::::4;-1:-1:-1::0;;65481:390:0;;;;;;::::4;::::0;;;::::4;::::0;;;::::4;-1:-1:-1::0;;65481:390:0::4;-1:-1:-1::0;;;65481:390:0::4;::::0;;::::4;::::0;;;::::4;::::0;;;::::4;::::0;;::::4;::::0;::::4;::::0;;;::::4;::::0;;;;::::4;::::0;::::4;::::0;::::4;::::0;::::4;::::0;::::4;::::0;::::4;::::0;;;::::4;::::0;;;;;;::::4;::::0;::::4;::::0;::::4;::::0;::::4;::::0;::::4;::::0;::::4;::::0;::::4;::::0;::::4;::::0;;::::4;::::0;::::4;::::0;;::::4;::::0;;;;65884:19;;;:10:::4;:19:::0;;;;;:40;;-1:-1:-1;;;;;65884:40:0;;::::4;;::::0;;65942:38;4655:36:1;;;6051:10:0;;65942:38:::4;::::0;4628:18:1;65942:38:0::4;4513:184:1::0;71740:596:0;9961:13;:11;:13::i;:::-;71797:6:::1;::::0;::::1;;:11:::0;71789:48:::1;;;::::0;-1:-1:-1;;;71789:48:0;;28442:2:1;71789:48:0::1;::::0;::::1;28424:21:1::0;28481:2;28461:18;;;28454:30;28520:26;28500:18;;;28493:54;28564:18;;71789:48:0::1;28240:348:1::0;71789:48:0::1;71876:10;71856:17;;:30;71848:69;;;::::0;-1:-1:-1;;;71848:69:0;;28795:2:1;71848:69:0::1;::::0;::::1;28777:21:1::0;28834:2;28814:18;;;28807:30;28873:28;28853:18;;;28846:56;28919:18;;71848:69:0::1;28593:350:1::0;71848:69:0::1;71974:20;;71950;;:44;;71928:116;;;::::0;-1:-1:-1;;;71928:116:0;;29150:2:1;71928:116:0::1;::::0;::::1;29132:21:1::0;29189:2;29169:18;;;29162:30;-1:-1:-1;;;29208:18:1;;;29201:52;29270:18;;71928:116:0::1;28948:346:1::0;71928:116:0::1;72071:5;::::0;:30:::1;::::0;-1:-1:-1;;;72071:30:0;;72095:4:::1;72071:30;::::0;::::1;356:51:1::0;72104:3:0::1;::::0;-1:-1:-1;;;;;72071:5:0::1;::::0;:15:::1;::::0;329:18:1;;72071:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;;;:::i;:::-;72055:13;:52:::0;72150:20:::1;::::0;72127::::1;::::0;:43:::1;:115;;72228:13;72127:115;;;72192:13;72186:20;72118:6;:124:::0;;-1:-1:-1;;72118:124:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;72253:8:::1;:6;:8::i;:::-;72277:51;72285:20;;72307;;72277:51;;;;;;29662:25:1::0;;;29718:2;29703:18;;29696:34;29650:2;29635:18;;29488:248;72277:51:0::1;;;;;;;;71740:596::o:0;66720:785::-;4345:1;4943:7;;:19;;4935:63;;;;-1:-1:-1;;;4935:63:0;;;;;;;:::i;:::-;4345:1;5076:7;:18;7463:19:::1;:17;:19::i;:::-;66847:8:::0;6051:10;72463:6:::2;::::0;;72478:17:::2;::::0;::::2;72463:6;72478:17:::0;;;:7:::2;:17;::::0;;;;;;;;:30;;::::2;::::0;72463:46;;-1:-1:-1;;;72463:46:0;;::::2;::::0;::::2;160:25:1::0;;;;-1:-1:-1;;;;;72463:62:0;;::::2;::::0;:6;;::::2;::::0;:14:::2;::::0;133:18:1;72463:46:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;72463:62:0::2;;72441:144;;;;-1:-1:-1::0;;;72441:144:0::2;;;;;;;:::i;:::-;66879:8:::3;66889:4;72905:1;72894:8;:12;;;:42;;;;-1:-1:-1::0;42926:2:0::3;72910:26;::::0;::::3;;72894:42;72872:112;;;;-1:-1:-1::0;;;72872:112:0::3;;;;;;;:::i;:::-;72999:5;72995:373;;;73036:1;73025:8;:12;;;73021:186;;;73088:17;::::0;::::3;;::::0;;;:7:::3;:17;::::0;;;;:30:::3;;::::0;73058:133:::3;;;;-1:-1:-1::0;;;73058:133:0::3;;;;;;;:::i;:::-;72995:373;;;73265:17;::::0;::::3;;::::0;;;:7:::3;:17;::::0;;;;:30:::3;;::::0;:35;73239:117:::3;;;;-1:-1:-1::0;;;73239:117:0::3;;;;;;;:::i;:::-;66919:17:::4;::::0;::::4;;::::0;;;:7:::4;:17;::::0;;;;:25:::4;;::::0;:30;66911:65:::4;;;::::0;-1:-1:-1;;;66911:65:0;;29943:2:1;66911:65:0::4;::::0;::::4;29925:21:1::0;29982:2;29962:18;;;29955:30;-1:-1:-1;;;30001:18:1;;;29994:52;30063:18;;66911:65:0::4;29741:346:1::0;66911:65:0::4;67009:35;:17:::0;;::::4;;::::0;;;:7:::4;:17;::::0;;;;:23;42969:1:::4;67009:23:::0;;;::::4;::::0;;::::4;:35;66987:117;;;::::0;-1:-1:-1;;;66987:117:0;;30294:2:1;66987:117:0::4;::::0;::::4;30276:21:1::0;;;30313:18;;;30306:30;30372:34;30352:18;;;30345:62;30424:18;;66987:117:0::4;30092:356:1::0;66987:117:0::4;67149:17;::::0;;::::4;67115:13;67149:17:::0;;;:7:::4;:17;::::0;;;;:23;67115:13;;67131:17:::4;::::0;67149:27:::4;::::0;:23;;;::::4;;67175:1;67149:27;:::i;:::-;67131:46;;;;;;;;;:::i;:::-;;;;:73;;;67115:89;;67215:58;67238:12;6051:10:::0;;5971:98;67215:58:::4;67284:17;::::0;;::::4;;::::0;;;:7:::4;:17;::::0;;;;:25;;;;::::4;::::0;;::::4;::::0;:23:::4;:25;::::0;::::4;:::i;:::-;::::0;;::::4;::::0;;;::::4;;::::0;;::::4;;::::0;;::::4;::::0;;::::4;;;::::0;;;67366:17;;::::4;-1:-1:-1::0;67366:17:0;;;:7:::4;:17;::::0;;;;:23;67348:17:::4;::::0;-1:-1:-1;67366:23:0;;::::4;;67348:42;::::0;::::4;;;;;:::i;:::-;;;;:71;;::::0;67320:17:::4;::::0;;::::4;;::::0;;;:7:::4;:17;::::0;;;;;;;;:25:::4;::::0;::::4;:99:::0;;;;67473:23;;67435:62;;30799:36:1;;;67473:23:0;;::::4;::::0;;::::4;30851:18:1::0;;;30844:45;;;;6051:10:0;;67435:62:::4;::::0;30772:18:1;67435:62:0::4;30633:262:1::0;68869:590:0;4345:1;4943:7;;:19;;4935:63;;;;-1:-1:-1;;;4935:63:0;;;;;;;:::i;:::-;4345:1;5076:7;:18;7463:19:::1;:17;:19::i;:::-;69011:8:::0;6051:10;72463:6:::2;::::0;;72478:17:::2;::::0;::::2;72463:6;72478:17:::0;;;:7:::2;:17;::::0;;;;;;;;:30;;::::2;::::0;72463:46;;-1:-1:-1;;;72463:46:0;;::::2;::::0;::::2;160:25:1::0;;;;-1:-1:-1;;;;;72463:62:0;;::::2;::::0;:6;;::::2;::::0;:14:::2;::::0;133:18:1;72463:46:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;72463:62:0::2;;72441:144;;;;-1:-1:-1::0;;;72441:144:0::2;;;;;;;:::i;:::-;69043:8:::3;69053:4;72905:1;72894:8;:12;;;:42;;;;-1:-1:-1::0;42926:2:0::3;72910:26;::::0;::::3;;72894:42;72872:112;;;;-1:-1:-1::0;;;72872:112:0::3;;;;;;;:::i;:::-;72999:5;72995:373;;;73036:1;73025:8;:12;;;73021:186;;;73088:17;::::0;::::3;;::::0;;;:7:::3;:17;::::0;;;;:30:::3;;::::0;73058:133:::3;;;;-1:-1:-1::0;;;73058:133:0::3;;;;;;;:::i;:::-;72995:373;;;73265:17;::::0;::::3;;::::0;;;:7:::3;:17;::::0;;;;:30:::3;;::::0;:35;73239:117:::3;;;;-1:-1:-1::0;;;73239:117:0::3;;;;;;;:::i;:::-;69097:17:::4;::::0;;::::4;;::::0;;;:7:::4;:17;::::0;;;;:28;69138:1:::4;::::0;69097:37:::4;::::0;69128:6;;69097:28:::4;::::0;;::::4;;:37;:::i;:::-;:42;;;;69075:123;;;::::0;-1:-1:-1;;;69075:123:0;;31102:2:1;69075:123:0::4;::::0;::::4;31084:21:1::0;31141:2;31121:18;;;31114:30;31180:33;31160:18;;;31153:61;31231:18;;69075:123:0::4;30900:355:1::0;69075:123:0::4;69227:15;::::0;69211:13:::4;::::0;69227:33:::4;::::0;::::4;::::0;:24:::4;::::0;:15:::4;::::0;::::4;;;69245:6;69227:24;:::i;:::-;:33;;;;:::i;:::-;69211:49;;::::0;-1:-1:-1;69271:58:0::4;6051:10:::0;69294:12:::4;5971:98:::0;69271:58:::4;69340:17;::::0;;::::4;;::::0;;;:7:::4;:17;::::0;;;;:38;;69372:6;;69340:28:::4;::::0;:38:::4;::::0;69372:6;;69340:38:::4;::::0;::::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;69413:12;6051:10:::0;;5971:98;69413:12:::4;69394:57;::::0;;31759:4:1;31747:17;;;31729:36;;31801:17;;31796:2;31781:18;;31774:45;31835:18;;;31828:34;;;-1:-1:-1;;;;;69394:57:0;;;::::4;::::0;::::4;::::0;31717:2:1;31702:18;69394:57:0::4;;;;;;;-1:-1:-1::0;;4301:1:0;5255:22;;-1:-1:-1;;;;68869:590:0:o;45556:54::-;;;;;;;;;;;45427:122;;;;;;;;;;;;;;;-1:-1:-1;45427:122:0;:::o;45617:59::-;;;;;;;;;;;10981:201;9961:13;:11;:13::i;:::-;-1:-1:-1;;;;;11070:22:0;::::1;11062:73;;;::::0;-1:-1:-1;;;11062:73:0;;32075:2:1;11062:73:0::1;::::0;::::1;32057:21:1::0;32114:2;32094:18;;;32087:30;32153:34;32133:18;;;32126:62;-1:-1:-1;;;32204:18:1;;;32197:36;32250:19;;11062:73:0::1;31873:402:1::0;11062:73:0::1;11146:28;11165:8;11146:18;:28::i;:::-;10981:201:::0;:::o;49139:211::-;49264:7;49230:8;49240:4;72905:1;72894:8;:12;;;:42;;;;-1:-1:-1;42926:2:0;72910:26;;;;72894:42;72872:112;;;;-1:-1:-1;;;72872:112:0;;;;;;;:::i;:::-;72999:5;72995:373;;;73036:1;73025:8;:12;;;73021:186;;;73088:17;;;;;;;:7;:17;;;;;:30;;;73058:133;;;;-1:-1:-1;;;73058:133:0;;;;;;;:::i;:::-;72995:373;;;73265:17;;;;;;;:7;:17;;;;;:30;;;:35;73239:117;;;;-1:-1:-1;;;73239:117:0;;;;;;;:::i;:::-;49296:6:::1;::::0;;49311:17:::1;::::0;::::1;49296:6;49311:17:::0;;;:7:::1;:17;::::0;;;;;;:30;;::::1;::::0;49296:46;;-1:-1:-1;;;49296:46:0;;-1:-1:-1;;;;;49296:6:0;;::::1;::::0;:14:::1;::::0;:46:::1;::::0;49311:30;49296:46:::1;;160:25:1::0;;;148:2;133:18;;14:177;49296:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49289:53:::0;49139:211;-1:-1:-1;;;;49139:211:0:o;45798:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45798:51:0;:::o;8017:108::-;7905:4;7929:7;-1:-1:-1;;;7929:7:0;;;;8087:9;8079:38;;;;-1:-1:-1;;;8079:38:0;;32482:2:1;8079:38:0;;;32464:21:1;32521:2;32501:18;;;32494:30;-1:-1:-1;;;32540:18:1;;;32533:46;32596:18;;8079:38:0;32280:340:1;56004:1348:0;73499:16;:19;56134:7;;56143:8;;73499:19;;;;73488:30;;;;73466:110;;;;-1:-1:-1;;;73466:110:0;;32827:2:1;73466:110:0;;;32809:21:1;32866:2;32846:18;;;32839:30;32905:32;32885:18;;;32878:60;32955:18;;73466:110:0;32625:354:1;73466:110:0;73685:11;;73627:19;;;;:10;:19;;;;;:37;;;73685:11;;;;;;;73612:52;;:12;:52;:::i;:::-;73611:85;73589:155;;;;-1:-1:-1;;;73589:155:0;;33186:2:1;73589:155:0;;;33168:21:1;33225:2;33205:18;;;33198:30;-1:-1:-1;;;33244:18:1;;;33237:50;33304:18;;73589:155:0;32984:344:1;73589:155:0;56168:17:::1;::::0;;::::1;;::::0;;;:7:::1;:17;::::0;;;;:28;::::1;::::0;::::1;;56164:1181;;56272:39;:17:::0;;::::1;;::::0;;;:7:::1;:17;::::0;;;;:25;43366:1:::1;56272:25:::0;;;::::1;::::0;;::::1;:39;56246:133;;;::::0;-1:-1:-1;;;56246:133:0;;33535:2:1;56246:133:0::1;::::0;::::1;33517:21:1::0;;;33554:18;;;33547:30;33613:34;33593:18;;;33586:62;33665:18;;56246:133:0::1;33333:356:1::0;56246:133:0::1;56394:17;::::0;;::::1;;::::0;;;:7:::1;:17;::::0;;;;:27;;;;::::1;::::0;;::::1;::::0;:25:::1;:27;::::0;::::1;:::i;:::-;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;56436:17;;::::1;-1:-1:-1::0;56436:17:0;;;:7:::1;:17;::::0;;;;56474:12:::1;56436:35;::::0;;::::1;:50:::0;56507:16;::::1;::::0;;-1:-1:-1;56503:87:0::1;;56544:20;::::0;;::::1;;::::0;;;:7:::1;:20;::::0;;;;:30;;;;::::1;::::0;;::::1;::::0;:28:::1;:30;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;56503:87;56606:19;::::0;;;:10:::1;:19;::::0;;;;:39;;-1:-1:-1;;56606:39:0::1;;;::::0;::::1;;;::::0;;56700:12:::1;-1:-1:-1::0;56660:37:0;;::::1;:52:::0;56164:1181:::1;;;56790:16;::::0;::::1;::::0;56786:138:::1;;56827:20;::::0;;::::1;;::::0;;;:7:::1;:20;::::0;;;;:30;;;;::::1;::::0;;::::1;::::0;:28:::1;:30;::::0;::::1;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;-1:-1:-1;;56876:19:0;;;:10:::1;:19;::::0;;;;:32;;-1:-1:-1;;56876:32:0::1;::::0;;56786:138:::1;56938:17;::::0;;::::1;;::::0;;;:7:::1;:17;::::0;;;;:30;;::::1;::::0;::::1;::::0;;::::1;::::0;:28:::1;:30;::::0;::::1;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;-1:-1:-1;56983:19:0;;;:10:::1;:19;::::0;;;;57023:12:::1;-1:-1:-1::0;56983:37:0;;;::::1;:52:::0;57077:15:::1;::::0;-1:-1:-1;;;57077:24:0::1;::::0;:15:::1;::::0;::::1;;57095:6;57077:24;:::i;:::-;57052:49;;::::0;-1:-1:-1;6051:10:0;57121:147:::1;::::0;;34075:25:1;;;34148:4;34136:17;;34131:2;34116:18;;34109:45;34170:18;;;34163:34;;;-1:-1:-1;;;;;57121:147:0;;;::::1;::::0;::::1;::::0;34063:2:1;34048:18;57121:147:0::1;;;;;;;57285:48;6051:10:::0;57285:5:::1;::::0;-1:-1:-1;;;;;57285:5:0::1;::::0;57318:14;57285:18:::1;:48::i;:::-;56730:615;56164:1181;56004:1348:::0;;;;;:::o;53852:820::-;54004:33;;;54022:14;54004:33;54000:665;;;54058:10;54054:284;;;54089:45;:17;;;;;;;:7;:17;;;;;:33;;:45;;;;;;:33;;:17;:45;;;;;:::i;:::-;;;;;;;;54177:8;54153:32;;:20;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;54000:665:0;;-1:-1:-1;54000:665:0;54054:284;54226:45;:17;;;;;;;:7;:17;;;;;:33;;:45;;;;;;:33;;:17;:45;;;;;:::i;:::-;;;;;;;;54314:8;54290:32;;:20;;:32;;;;;;;:::i;54000:665::-;54374:10;54370:284;;;54405:45;:17;;;;;;;:7;:17;;;;;:33;;:45;;;;;;:33;;:17;:45;;;;;:::i;:::-;;;;;;;;54493:8;54469:32;;:20;;:32;;;;;;;:::i;54370:284::-;54542:45;:17;;;;;;;:7;:17;;;;;:33;;:45;;;;;;:33;;:17;:45;;;;;:::i;:::-;;;;;;;;54630:8;54606:32;;:20;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;54370:284:0;53852:820;;;;:::o;54680:695::-;54883:17;;;;;;;:7;:17;;;;;:25;;:32;;54912:3;;54883:17;:32;;54912:3;;54883:32;:::i;:::-;;;;-1:-1:-1;;54952:5:0;;:40;;-1:-1:-1;;;;;54952:5:0;6051:10;54985:6;54952:18;:40::i;:::-;55024:6;55003:17;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;55043:325:0;;;;55198:17;;;;;;;;:7;:17;;;;;;;;;:23;55083:153;;34402:25:1;;;34443:18;;;34436:45;;;;55198:23:0;;;;;;;34497:18:1;;;34490:45;55083:153:0;;6051:10;;55083:153;;;;;;34390:2:1;55083:153:0;;;55251:17;;;55279:1;55251:17;;;:7;:17;;;;;:25;;:29;55043:325;;;55343:12;55352:3;55343:6;:12;:::i;:::-;55313:17;;;;;;;:7;:17;;;;;:25;;:43;;:25;;:17;:43;;;;;:::i;:::-;;;;-1:-1:-1;;54680:695:0;;;;;:::o;8202:108::-;7905:4;7929:7;-1:-1:-1;;;7929:7:0;;;;8261:41;;;;-1:-1:-1;;;8261:41:0;;34748:2:1;8261:41:0;;;34730:21:1;34787:2;34767:18;;;34760:30;-1:-1:-1;;;34806:18:1;;;34799:50;34866:18;;8261:41:0;34546:344:1;10240:132:0;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;6051:10;10304:23;10296:68;;;;-1:-1:-1;;;10296:68:0;;35097:2:1;10296:68:0;;;35079:21:1;;;35116:18;;;35109:30;35175:34;35155:18;;;35148:62;35227:18;;10296:68:0;34895:356:1;28152:248:0;28323:68;;-1:-1:-1;;;;;35514:15:1;;;28323:68:0;;;35496:34:1;35566:15;;35546:18;;;35539:43;35598:18;;;35591:34;;;28296:96:0;;28316:5;;-1:-1:-1;;;28346:27:0;35431:18:1;;28323:68:0;;;;-1:-1:-1;;28323:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;28323:68:0;-1:-1:-1;;;;;;28323:68:0;;;;;;;;;;28296:19;:96::i;27933:211::-;28077:58;;-1:-1:-1;;;;;35828:32:1;;28077:58:0;;;35810:51:1;35877:18;;;35870:34;;;28050:86:0;;28070:5;;-1:-1:-1;;;28100:23:0;35783:18:1;;28077:58:0;35636:274:1;8713:120:0;7722:16;:14;:16::i;:::-;8782:5:::1;8772:15:::0;;-1:-1:-1;;;;8772:15:0::1;::::0;;8803:22:::1;6051:10:::0;8812:12:::1;8803:22;::::0;-1:-1:-1;;;;;374:32:1;;;356:51;;344:2;329:18;8803:22:0::1;196:217:1::0;11342:191:0;11416:16;11435:6;;-1:-1:-1;;;;;11452:17:0;;;-1:-1:-1;;;;;;11452:17:0;;;;;;11485:40;;11435:6;;;;;;;11485:40;;11416:16;11485:40;11405:128;11342:191;:::o;8454:118::-;7463:19;:17;:19::i;:::-;8514:7:::1;:14:::0;;-1:-1:-1;;;;8514:14:0::1;-1:-1:-1::0;;;8514:14:0::1;::::0;;8544:20:::1;8551:12;6051:10:::0;;5971:98;53737:107;53796:7;53827:1;53823;:5;:13;;53835:1;53823:13;;;53831:1;53823:13;53816:20;53737:107;-1:-1:-1;;;53737:107:0:o;55383:613::-;55450:4;55482:1;55471:8;:12;;;:47;;;;-1:-1:-1;55499:16:0;:19;;;;;55487:31;;;;;55471:47;55467:64;;;-1:-1:-1;55527:4:0;;55383:613;-1:-1:-1;55383:613:0:o;55467:64::-;55572:16;:19;;;;;55561:30;;;;:82;;;;-1:-1:-1;55624:16:0;:19;;;;;;;;55612:31;;;;;55561:82;55560:139;;;;-1:-1:-1;55682:17:0;;55661;;:38;;55560:139;55542:207;;;-1:-1:-1;55733:4:0;;55383:613;-1:-1:-1;55383:613:0:o;55542:207::-;55789:16;:19;;;;;;;;55778:30;;;;:82;;;;-1:-1:-1;55841:16:0;:19;;;;;;;;55829:31;;;;;55778:82;55777:139;;;;-1:-1:-1;55899:17:0;;55878;;:38;;55777:139;55759:207;;;-1:-1:-1;55950:4:0;;55383:613;-1:-1:-1;55383:613:0:o;55759:207::-;-1:-1:-1;55983:5:0;;55383:613;-1:-1:-1;55383:613:0:o;31000:716::-;31424:23;31450:69;31478:4;31450:69;;;;;;;;;;;;;;;;;31458:5;-1:-1:-1;;;;;31450:27:0;;;:69;;;;;:::i;:::-;31534:17;;31424:95;;-1:-1:-1;31534:21:0;31530:179;;31631:10;31620:30;;;;;;;;;;;;:::i;:::-;31612:85;;;;-1:-1:-1;;;31612:85:0;;36324:2:1;31612:85:0;;;36306:21:1;36363:2;36343:18;;;36336:30;36402:34;36382:18;;;36375:62;-1:-1:-1;;;36453:18:1;;;36446:40;36503:19;;31612:85:0;36122:406:1;17400:229:0;17537:12;17569:52;17591:6;17599:4;17605:1;17608:12;17537;-1:-1:-1;;;;;14950:19:0;;;18807:60;;;;-1:-1:-1;;;18807:60:0;;37142:2:1;18807:60:0;;;37124:21:1;37181:2;37161:18;;;37154:30;37220:31;37200:18;;;37193:59;37269:18;;18807:60:0;36940:353:1;18807:60:0;18881:12;18895:23;18922:6;-1:-1:-1;;;;;18922:11:0;18941:5;18948:4;18922:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18880:73;;;;18971:51;18988:7;18997:10;19009:12;18971:16;:51::i;:::-;18964:58;18520:510;-1:-1:-1;;;;;;;18520:510:0:o;21206:762::-;21356:12;21385:7;21381:580;;;-1:-1:-1;21416:10:0;21409:17;;21381:580;21530:17;;:21;21526:424;;21778:10;21772:17;21839:15;21826:10;21822:2;21818:19;21811:44;21526:424;21921:12;21914:20;;-1:-1:-1;;;21914:20:0;;;;;;;;:::i;418:131:1:-;-1:-1:-1;;;;;493:31:1;;483:42;;473:70;;539:1;536;529:12;554:127;615:10;610:3;606:20;603:1;596:31;646:4;643:1;636:15;670:4;667:1;660:15;686:275;757:2;751:9;822:2;803:13;;-1:-1:-1;;799:27:1;787:40;;857:18;842:34;;878:22;;;839:62;836:88;;;904:18;;:::i;:::-;940:2;933:22;686:275;;-1:-1:-1;686:275:1:o;966:1108::-;1061:6;1069;1077;1085;1138:3;1126:9;1117:7;1113:23;1109:33;1106:53;;;1155:1;1152;1145:12;1106:53;1194:9;1181:23;1213:31;1238:5;1213:31;:::i;:::-;1263:5;-1:-1:-1;1287:2:1;1326:18;;;1313:32;1354:33;1313:32;1354:33;:::i;:::-;1406:7;-1:-1:-1;1460:2:1;1445:18;;1432:32;;-1:-1:-1;1515:2:1;1500:18;;1487:32;1538:18;1568:14;;;1565:34;;;1595:1;1592;1585:12;1565:34;1633:6;1622:9;1618:22;1608:32;;1678:7;1671:4;1667:2;1663:13;1659:27;1649:55;;1700:1;1697;1690:12;1649:55;1736:2;1723:16;1758:2;1754;1751:10;1748:36;;;1764:18;;:::i;:::-;1806:53;1849:2;1830:13;;-1:-1:-1;;1826:27:1;1822:36;;1806:53;:::i;:::-;1793:66;;1882:2;1875:5;1868:17;1922:7;1917:2;1912;1908;1904:11;1900:20;1897:33;1894:53;;;1943:1;1940;1933:12;1894:53;1998:2;1993;1989;1985:11;1980:2;1973:5;1969:14;1956:45;2042:1;2037:2;2032;2025:5;2021:14;2017:23;2010:34;;2063:5;2053:15;;;;;966:1108;;;;;;;:::o;2286:183::-;2346:4;2379:18;2371:6;2368:30;2365:56;;;2401:18;;:::i;:::-;-1:-1:-1;2446:1:1;2442:14;2458:4;2438:25;;2286:183::o;2474:662::-;2528:5;2581:3;2574:4;2566:6;2562:17;2558:27;2548:55;;2599:1;2596;2589:12;2548:55;2635:6;2622:20;2661:4;2685:60;2701:43;2741:2;2701:43;:::i;:::-;2685:60;:::i;:::-;2779:15;;;2865:1;2861:10;;;;2849:23;;2845:32;;;2810:12;;;;2889:15;;;2886:35;;;2917:1;2914;2907:12;2886:35;2953:2;2945:6;2941:15;2965:142;2981:6;2976:3;2973:15;2965:142;;;3047:17;;3035:30;;3085:12;;;;2998;;2965:142;;;-1:-1:-1;3125:5:1;2474:662;-1:-1:-1;;;;;;2474:662:1:o;3141:156::-;3207:20;;3267:4;3256:16;;3246:27;;3236:55;;3287:1;3284;3277:12;3236:55;3141:156;;;:::o;3302:982::-;3436:6;3444;3452;3460;3468;3521:3;3509:9;3500:7;3496:23;3492:33;3489:53;;;3538:1;3535;3528:12;3489:53;3578:9;3565:23;3607:18;3648:2;3640:6;3637:14;3634:34;;;3664:1;3661;3654:12;3634:34;3687:61;3740:7;3731:6;3720:9;3716:22;3687:61;:::i;:::-;3677:71;;3801:2;3790:9;3786:18;3773:32;3757:48;;3830:2;3820:8;3817:16;3814:36;;;3846:1;3843;3836:12;3814:36;3884:8;3873:9;3869:24;3859:34;;3931:7;3924:4;3920:2;3916:13;3912:27;3902:55;;3953:1;3950;3943:12;3902:55;3993:2;3980:16;4019:2;4011:6;4008:14;4005:34;;;4035:1;4032;4025:12;4005:34;4088:7;4083:2;4073:6;4070:1;4066:14;4062:2;4058:23;4054:32;4051:45;4048:65;;;4109:1;4106;4099:12;4048:65;4140:2;4136;4132:11;4122:21;;4162:6;4152:16;;;;;4187:36;4219:2;4208:9;4204:18;4187:36;:::i;:::-;4177:46;;4242:36;4274:2;4263:9;4259:18;4242:36;:::i;:::-;4232:46;;3302:982;;;;;;;;:::o;4899:418::-;4990:6;4998;5051:2;5039:9;5030:7;5026:23;5022:32;5019:52;;;5067:1;5064;5057:12;5019:52;5107:9;5094:23;5140:18;5132:6;5129:30;5126:50;;;5172:1;5169;5162:12;5126:50;5195:61;5248:7;5239:6;5228:9;5224:22;5195:61;:::i;:::-;5185:71;;;5275:36;5307:2;5296:9;5292:18;5275:36;:::i;:::-;5265:46;;4899:418;;;;;:::o;5322:182::-;5379:6;5432:2;5420:9;5411:7;5407:23;5403:32;5400:52;;;5448:1;5445;5438:12;5400:52;5471:27;5488:9;5471:27;:::i;6453:159::-;6520:20;;6580:6;6569:18;;6559:29;;6549:57;;6602:1;6599;6592:12;6617:163;6684:20;;6744:10;6733:22;;6723:33;;6713:61;;6770:1;6767;6760:12;6785:541;6883:6;6891;6899;6907;6915;6923;6976:3;6964:9;6955:7;6951:23;6947:33;6944:53;;;6993:1;6990;6983:12;6944:53;7016:27;7033:9;7016:27;:::i;:::-;7006:37;;7062;7095:2;7084:9;7080:18;7062:37;:::i;:::-;7052:47;;7118:37;7151:2;7140:9;7136:18;7118:37;:::i;:::-;7108:47;;7174:37;7207:2;7196:9;7192:18;7174:37;:::i;:::-;7164:47;;7230:38;7263:3;7252:9;7248:19;7230:38;:::i;:::-;7220:48;;7315:3;7304:9;7300:19;7287:33;7277:43;;6785:541;;;;;;;;:::o;7331:180::-;7390:6;7443:2;7431:9;7422:7;7418:23;7414:32;7411:52;;;7459:1;7456;7449:12;7411:52;-1:-1:-1;7482:23:1;;7331:180;-1:-1:-1;7331:180:1:o;7516:1140::-;7632:6;7640;7693:2;7681:9;7672:7;7668:23;7664:32;7661:52;;;7709:1;7706;7699:12;7661:52;7749:9;7736:23;7778:18;7819:2;7811:6;7808:14;7805:34;;;7835:1;7832;7825:12;7805:34;7858:61;7911:7;7902:6;7891:9;7887:22;7858:61;:::i;:::-;7848:71;;7938:2;7928:12;;7993:2;7982:9;7978:18;7965:32;8022:2;8012:8;8009:16;8006:36;;;8038:1;8035;8028:12;8006:36;8061:24;;;-1:-1:-1;8116:4:1;8108:13;;8104:27;-1:-1:-1;8094:55:1;;8145:1;8142;8135:12;8094:55;8181:2;8168:16;8204:60;8220:43;8260:2;8220:43;:::i;8204:60::-;8298:15;;;8380:1;8376:10;;;;8368:19;;8364:28;;;8329:12;;;;8404:19;;;8401:39;;;8436:1;8433;8426:12;8401:39;8460:11;;;;8480:146;8496:6;8491:3;8488:15;8480:146;;;8562:21;8579:3;8562:21;:::i;:::-;8550:34;;8513:12;;;;8604;;;;8480:146;;;8645:5;8635:15;;;;;;;7516:1140;;;;;:::o;9321:250::-;9387:6;9395;9448:2;9436:9;9427:7;9423:23;9419:32;9416:52;;;9464:1;9461;9454:12;9416:52;9500:9;9487:23;9477:33;;9529:36;9561:2;9550:9;9546:18;9529:36;:::i;10503:348::-;10587:6;10640:2;10628:9;10619:7;10615:23;10611:32;10608:52;;;10656:1;10653;10646:12;10608:52;10696:9;10683:23;10729:18;10721:6;10718:30;10715:50;;;10761:1;10758;10751:12;10715:50;10784:61;10837:7;10828:6;10817:9;10813:22;10784:61;:::i;10856:252::-;10920:6;10928;10981:2;10969:9;10960:7;10956:23;10952:32;10949:52;;;10997:1;10994;10987:12;10949:52;11020:27;11037:9;11020:27;:::i;:::-;11010:37;;11066:36;11098:2;11087:9;11083:18;11066:36;:::i;11113:247::-;11172:6;11225:2;11213:9;11204:7;11200:23;11196:32;11193:52;;;11241:1;11238;11231:12;11193:52;11280:9;11267:23;11299:31;11324:5;11299:31;:::i;11696:355::-;11898:2;11880:21;;;11937:2;11917:18;;;11910:30;11976:33;11971:2;11956:18;;11949:61;12042:2;12027:18;;11696:355::o;12056:344::-;12258:2;12240:21;;;12297:2;12277:18;;;12270:30;-1:-1:-1;;;12331:2:1;12316:18;;12309:50;12391:2;12376:18;;12056:344::o;12405:348::-;12607:2;12589:21;;;12646:2;12626:18;;;12619:30;12685:26;12680:2;12665:18;;12658:54;12744:2;12729:18;;12405:348::o;12758:344::-;12960:2;12942:21;;;12999:2;12979:18;;;12972:30;-1:-1:-1;;;13033:2:1;13018:18;;13011:50;13093:2;13078:18;;12758:344::o;13107:::-;13309:2;13291:21;;;13348:2;13328:18;;;13321:30;-1:-1:-1;;;13382:2:1;13367:18;;13360:50;13442:2;13427:18;;13107:344::o;13456:127::-;13517:10;13512:3;13508:20;13505:1;13498:31;13548:4;13545:1;13538:15;13572:4;13569:1;13562:15;13946:251;14016:6;14069:2;14057:9;14048:7;14044:23;14040:32;14037:52;;;14085:1;14082;14075:12;14037:52;14117:9;14111:16;14136:31;14161:5;14136:31;:::i;14562:164::-;14638:13;;14687;;14680:21;14670:32;;14660:60;;14716:1;14713;14706:12;14731:324;14816:6;14824;14832;14885:2;14873:9;14864:7;14860:23;14856:32;14853:52;;;14901:1;14898;14891:12;14853:52;14930:9;14924:16;14914:26;;14980:2;14969:9;14965:18;14959:25;14949:35;;15003:46;15045:2;15034:9;15030:18;15003:46;:::i;:::-;14993:56;;14731:324;;;;;:::o;15892:127::-;15953:10;15948:3;15944:20;15941:1;15934:31;15984:4;15981:1;15974:15;16008:4;16005:1;15998:15;16024:197;16062:3;16090:6;16131:2;16124:5;16120:14;16158:2;16149:7;16146:15;16143:41;;;16164:18;;:::i;:::-;16213:1;16200:15;;16024:197;-1:-1:-1;;;16024:197:1:o;16226:181::-;16264:3;16308:6;16301:5;16297:18;16334:7;16324:41;;16345:18;;:::i;:::-;-1:-1:-1;;16381:20:1;;16226:181;-1:-1:-1;;16226:181:1:o;16412:128::-;16452:3;16483:1;16479:6;16476:1;16473:13;16470:39;;;16489:18;;:::i;:::-;-1:-1:-1;16525:9:1;;16412:128::o;16545:135::-;16584:3;-1:-1:-1;;16605:17:1;;16602:43;;;16625:18;;:::i;:::-;-1:-1:-1;16672:1:1;16661:13;;16545:135::o;16685:435::-;16738:3;16776:5;16770:12;16803:6;16798:3;16791:19;16829:4;16858:2;16853:3;16849:12;16842:19;;16895:2;16888:5;16884:14;16916:1;16926:169;16940:6;16937:1;16934:13;16926:169;;;17001:13;;16989:26;;17035:12;;;;17070:15;;;;16962:1;16955:9;16926:169;;;-1:-1:-1;17111:3:1;;16685:435;-1:-1:-1;;;;;16685:435:1:o;17125:403::-;17360:2;17349:9;17342:21;17323:4;17380:56;17432:2;17421:9;17417:18;17409:6;17380:56;:::i;:::-;17467:2;17452:18;;17445:34;;;;-1:-1:-1;17510:2:1;17495:18;17488:34;17372:64;17125:403;-1:-1:-1;17125:403:1:o;17533:762::-;17824:2;17813:9;17806:21;17787:4;17850:56;17902:2;17891:9;17887:18;17879:6;17850:56;:::i;:::-;17942:22;;;17937:2;17922:18;;17915:50;17974:22;;;-1:-1:-1;;;;;18008:31:1;;18005:51;;;18052:1;18049;18042:12;18005:51;18086:6;18083:1;18079:14;18140:6;18132;18127:2;18119:6;18115:15;18102:45;18214:1;18170:19;;18191:2;18166:28;18203:13;;;18283:4;18271:17;;;;18266:2;18251:18;;;;18244:45;;;;-1:-1:-1;18166:28:1;17533:762;-1:-1:-1;;;17533:762:1:o;18988:356::-;19190:2;19172:21;;;19209:18;;;19202:30;19268:34;19263:2;19248:18;;19241:62;19335:2;19320:18;;18988:356::o;19709:125::-;19749:4;19777:1;19774;19771:8;19768:34;;;19782:18;;:::i;:::-;-1:-1:-1;19819:9:1;;19709:125::o;19839:168::-;19879:7;19945:1;19941;19937:6;19933:14;19930:1;19927:21;19922:1;19915:9;19908:17;19904:45;19901:71;;;19952:18;;:::i;:::-;-1:-1:-1;19992:9:1;;19839:168::o;22015:195::-;22053:4;22090;22087:1;22083:12;22122:4;22119:1;22115:12;22147:3;22142;22139:12;22136:38;;;22154:18;;:::i;:::-;22191:13;;;22015:195;-1:-1:-1;;;22015:195:1:o;22215:258::-;22254:7;22286:6;22319:2;22316:1;22312:10;22349:2;22346:1;22342:10;22405:3;22401:2;22397:12;22392:3;22389:21;22382:3;22375:11;22368:19;22364:47;22361:73;;;22414:18;;:::i;:::-;22454:13;;22215:258;-1:-1:-1;;;;22215:258:1:o;22738:353::-;22940:2;22922:21;;;22979:2;22959:18;;;22952:30;23018:31;23013:2;22998:18;;22991:59;23082:2;23067:18;;22738:353::o;26102:204::-;26140:3;26176:4;26173:1;26169:12;26208:4;26205:1;26201:12;26243:3;26237:4;26233:14;26228:3;26225:23;26222:49;;;26251:18;;:::i;:::-;26287:13;;26102:204;-1:-1:-1;;;26102:204:1:o;26311:217::-;26351:1;26377;26367:132;;26421:10;26416:3;26412:20;26409:1;26402:31;26456:4;26453:1;26446:15;26484:4;26481:1;26474:15;26367:132;-1:-1:-1;26513:9:1;;26311:217::o;26533:274::-;26572:7;26604:22;26653:2;26650:1;26646:10;26683:2;26680:1;26676:10;26739:3;26735:2;26731:12;26726:3;26723:21;26716:3;26709:11;26702:19;26698:47;26695:73;;;26748:18;;:::i;29299:184::-;29369:6;29422:2;29410:9;29401:7;29397:23;29393:32;29390:52;;;29438:1;29435;29428:12;29390:52;-1:-1:-1;29461:16:1;;29299:184;-1:-1:-1;29299:184:1:o;30453:175::-;30490:3;30534:4;30527:5;30523:16;30563:4;30554:7;30551:17;30548:43;;;30571:18;;:::i;:::-;30620:1;30607:15;;30453:175;-1:-1:-1;;30453:175:1:o;31260:270::-;31299:7;31331:18;31376:2;31373:1;31369:10;31406:2;31403:1;31399:10;31462:3;31458:2;31454:12;31449:3;31446:21;31439:3;31432:11;31425:19;31421:47;31418:73;;;31471:18;;:::i;33694:178::-;33731:3;33775:4;33768:5;33764:16;33799:7;33789:41;;33810:18;;:::i;35915:202::-;35982:6;36035:2;36023:9;36014:7;36010:23;36006:32;36003:52;;;36051:1;36048;36041:12;36003:52;36074:37;36101:9;36074:37;:::i;37298:258::-;37370:1;37380:113;37394:6;37391:1;37388:13;37380:113;;;37470:11;;;37464:18;37451:11;;;37444:39;37416:2;37409:10;37380:113;;;37511:6;37508:1;37505:13;37502:48;;;-1:-1:-1;;37546:1:1;37528:16;;37521:27;37298:258::o;37561:274::-;37690:3;37728:6;37722:13;37744:53;37790:6;37785:3;37778:4;37770:6;37766:17;37744:53;:::i;:::-;37813:16;;;;;37561:274;-1:-1:-1;;37561:274:1:o;37840:383::-;37989:2;37978:9;37971:21;37952:4;38021:6;38015:13;38064:6;38059:2;38048:9;38044:18;38037:34;38080:66;38139:6;38134:2;38123:9;38119:18;38114:2;38106:6;38102:15;38080:66;:::i;:::-;38207:2;38186:15;-1:-1:-1;;38182:29:1;38167:45;;;;38214:2;38163:54;;37840:383;-1:-1:-1;;37840:383:1:o
Swarm Source
ipfs://beaeee506aa99408a4e389b3a0da9a312974ffa5f5ff972cc9629e4a03c7f82b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.