Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 5 from a total of 5 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Emergency Withdr... | 24627700 | 12 days ago | IN | 0 ETH | 0.00004422 | ||||
| Safe_deploy_Synt... | 24627698 | 12 days ago | IN | 0 ETH | 0.00004112 | ||||
| Purchase Token | 20561528 | 580 days ago | IN | 0.00764818 ETH | 0.00019518 | ||||
| Add Advisor | 20561517 | 580 days ago | IN | 0 ETH | 0.00013418 | ||||
| Purchase Token | 20561364 | 580 days ago | IN | 0.00382409 ETH | 0.00048965 |
Latest 6 internal transactions
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PresaleContract
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2024-08-18
*/
// Sources flattened with hardhat v2.22.6 https://hardhat.org
// SPDX-License-Identifier: MIT
// File @chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol@v1.1.1
// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.0;
// solhint-disable-next-line interface-starts-with-i
interface AggregatorV3Interface {
function decimals() external view returns (uint8);
function description() external view returns (string memory);
function version() external view returns (uint256);
function getRoundData(
uint80 _roundId
) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
function latestRoundData()
external
view
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}
// File openzeppelin-contracts-release-v4.9/contracts/utils/Context.sol
// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File openzeppelin-contracts-release-v4.9/contracts/access/Ownable.sol
// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling 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-release-v4.9/contracts/security/ReentrancyGuard.sol
// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (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() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
// File contracts/PresaleContract.sol
/**
* @dev The `PresaleContract` is a comprehensive smart contract designed to manage the presale of SyntraCoin, a custom ERC20 token.
* The contract facilitates multiple rounds of token sales, distributes tokens to participants, manages advisor commissions,
* and handles the deployment of a Uniswap V3 liquidity pool upon the presale's conclusion. It also includes robust mechanisms
* for emergency handling, participant refunds, and owner-controlled operations.
*
* **Key Features:**
*
* 1. **Token Sale Management:**
* - The presale is divided into four rounds, each with increasing token prices and specific token limits.
* - Participants can purchase tokens using ETH, and the contract automatically handles ETH-to-USD conversions using Chainlink price feeds.
* - The contract tracks token purchases and ETH contributions per participant, ensuring correct token distribution once the presale ends.
* - The presale process is time-bound with a global timer, and it automatically progresses through the rounds as tokens are sold.
*
* 2. **Discount Management:**
* - The contract includes a refund mechanism where participants can receive a 10% refund of their ETH contribution if they are referred by a valid advisor.
* - This discount is applied automatically during the purchase process, reducing the total ETH collected by the contract.
*
* 3. **Investor Rights:**
* - Participants are entitled to receive the tokens they purchased once the presale concludes.
* - If the presale fails or is canceled, participants have the right to claim a refund of 80% of their ETH contributions.
* - Investors can monitor their spending and token allocation via the contract's public functions.
*
* 4. **Advisor Rights:**
* - Advisors can refer participants to the presale and earn a 10% commission on the ETH contributions made by their referred participants.
* - Advisors must be added by the contract owner to be eligible for commissions.
* - The contract automatically distributes the advisor’s commission during the purchase process.
*
* 5. **Team Rights:**
* - The team (represented by the contract owner) receives 20% of the ETH collected from token sales and computer purchases as compensation.
* - The contract ensures that the team's share is transferred immediately during each purchase transaction.
* - The team has the right to withdraw remaining funds after the presale concludes, provided the withdrawal conditions are met.
*
* 6. **Ownership and Control (OnlyOwner Functions):**
* - The contract is owned by a single entity (the owner), who has the authority to perform critical actions:
* - Add or remove advisors.
* - Initiate emergency withdrawals if the presale encounters issues.
* - Deploy the SyntraCoin token and create the Uniswap V3 liquidity pool.
* - Manage the transition from the presale to the post-sale phase, including token minting and fund management.
* - The `onlyOwner` modifier restricts sensitive functions to the contract owner, ensuring that only authorized personnel can execute these functions.
*
* 7. **Emergency Handling and Refunds:**
* - The contract includes mechanisms to handle emergencies and ensure the safety of participant funds.
* - If the contract fails to safely deploy the SyntraCoin token and liquidity pool, it enters an emergency withdrawal mode.
* - In emergency mode, the owner can withdraw the remaining funds to prevent loss.
* - Participants can request a full refund of their ETH contributions if the presale fails, ensuring investor protection.
*
* The `PresaleContract` is a versatile and secure solution for managing the complexities of a token presale, offering various roles and rights
* to participants, advisors, and the project team while ensuring that funds are handled securely and transparently.
*/
// Original license: SPDX_License_Identifier: MIT
pragma solidity 0.8.15;
/// @custom:security-contact admin@syntralink.net
interface IUniswapAndCoinManager {
function deployCoinAndPool(uint256 ethForPool) external payable;
function mintTokens(address participant, uint256 amount) external;
function coinAddress() external view returns (address);
}
contract PresaleContract is Ownable, ReentrancyGuard {
IUniswapAndCoinManager public _uniswapAndCoinManager; // Interface for the Uniswap and Coin Manager contract
AggregatorV3Interface internal _priceFeed; // Interface for the Chainlink price feed contract
uint256 public constant DECIMALS = 1e18; // The number of decimal places for the tokens
uint256 public constant TOTAL_TOKENS = 40e6 * DECIMALS; // Total supply of tokens for the presale
uint256 public constant BASE_TRITON_PRICE = 5.7e5; // Base price for the Triton computer in USD cents
uint256 public constant BASE_HYPERION_PRICE = 7.7e5; // Base price for the Hyperion computer in USD cents
uint256 public constant BASE_NYX_PRICE = 4.2e5; // Base price for the Nyx computer in USD cents
uint256 public constant BASE_HECATE_PRICE = 2.2e5; // Base price for the Hecate computer in USD cents
uint256 public constant GLOBAL_TIMER = 604800 * 26; // Total duration of the presale, calculated as 26 weeks
uint256 public constant MAX_ROUND = 3; // Maximum number of rounds in the presale
uint256 public constant ADVISOR_PERCENTAGE = 10; // Percentage of ETH that advisors receive from their referrals
uint256 public constant REFUND_PERCENTAGE = 10; // Percentage of ETH that discount received
uint256 public constant TEAM_PERCENTAGE = 20; // Percentage of ETH for the team
uint256 public constant PERCENTAGE_BASE = 100; // Base value used for percentage calculations
uint256[4] public _roundPrices = [10, 15, 20, 25]; // Prices per token for each presale round in USD cents
uint256[4] public _roundTokenLimits = [
4e6 * DECIMALS, // Token limit for round 1
8e6 * DECIMALS, // Token limit for round 2
12e6 * DECIMALS, // Token limit for round 3
16e6 * DECIMALS // Token limit for round 4
];
uint256 public _currentRound = 0; // Tracks the current presale round
uint256 public _totalTokensSold = 0; // Total number of tokens sold during the presale
uint256 public _totalEthSpentInComputers = 0; // Total ETH spent on purchasing computers
uint256 public _presaleStartedAt = 0; // Timestamp marking the start of the presale
mapping(address => uint256) public nonces; //nonces for protection against replay attacks
mapping(address => uint256) public _computerTritonPurchases;
mapping(address => uint256) public _computerHyperionPurchases;
mapping(address => uint256) public _computerNyxPurchases;
mapping(address => uint256) public _computerHecatePurchases;
mapping(address => uint256) public _tokenPurchases; // Tracks total tokens purchased by each participant
mapping(uint256 => uint256) public _tokensSoldPerRound; // Tracks total tokens sold per round
mapping(address => uint256) public _totalEthSpentByAddress; // Tracks total ETH spent by each participant
mapping(uint256 => mapping(address => uint256))
public _tokensSoldPerRoundByAddress; // Tracks tokens sold per round by each participant
mapping(address => address[]) public _investorsByAdvisorAddress; // Maps advisors to their referred investors
mapping(address => uint256) public _ethAmountByAdvisorAddress; // Tracks ETH owed to each advisor
mapping(address => uint256) public totalSpent;
address[] public _participants; // List of all participants in the presale
address[] public _advisors; // List of all advisors in the presale
mapping(address => bool) private _validAdvisors;
event AdvisorAdded(address indexed advisor);
event AdvisorRemoved(address indexed advisor);
event TransferCompleted(address indexed advisor, uint256 indexed amount);
event ComputerPurchased(
address indexed buyer,
uint256 indexed amount,
uint256 indexed ethSpent,
string computerType
);
event TokenPurchased(
address indexed buyer,
uint256 indexed amount,
uint256 indexed ethSpent
);
event RoundAdvanced(uint256 indexed newRound);
event AddressRefunded(address indexed purchaser, uint256 indexed amount);
event AdvisorAddressesAdded(
address indexed advisor,
address[] indexed investorsAddresses
);
bool public _isInEmergencyWithdraw = false; // Indicates if the contract is in emergency withdrawal mode
receive() external payable {}
fallback() external payable {}
/**
* @notice Function to add an advisor, only callable by the contract owner
* @param advisor - The address of the advisor to be added
*/
function addAdvisor(address advisor) external onlyOwner {
require(advisor != address(0), "Invalid address"); // @dev Ensures the advisor address is not the zero address
require(!_validAdvisors[advisor], "Advisor already added"); // @dev Checks that the advisor is not already added
_validAdvisors[advisor] = true; // @dev Marks the advisor as valid
_advisors.push(advisor); // @dev Adds the advisor to the list of advisors
emit AdvisorAdded(advisor); // @dev Emits an event signaling the advisor has been added
}
/**
* @notice Function to remove an advisor, only callable by the contract owner
* @param advisor - The address of the advisor to be removed
*/
function removeAdvisor(address advisor) external onlyOwner {
require(advisor != address(0), "Invalid address"); // @dev Ensures the advisor address is not the zero address
require(_validAdvisors[advisor], "Advisor not found"); // @dev Checks that the advisor exists in the list
_validAdvisors[advisor] = false; // @dev Marks the advisor as invalid
emit AdvisorRemoved(advisor); // @dev Emits an event signaling the advisor has been removed
}
/*
* @notice Constructor for initializing the PresaleContract
* @param uniswapAndCoinManager_ - Address of the Uniswap and Coin Manager contract
*/
constructor(address uniswapAndCoinManager_) Ownable() {
require(uniswapAndCoinManager_ != address(0), "Invalid address");
_uniswapAndCoinManager = IUniswapAndCoinManager(uniswapAndCoinManager_);
_priceFeed = AggregatorV3Interface(
0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
);
_presaleStartedAt = block.timestamp; // Record the start time of the presale
}
/*
* @dev Internal function to handle the purchase of computers
* @param amount - The number of computers being purchased
* @param totalPrice - The total ETH value for the purchase
* @param purchases - The mapping that tracks purchases by address
* @param computerType - The type of computer being purchased
* @param advisor - The address of the advisor
*/
function _purchaseComputer(
uint256 amount,
uint256 totalPrice,
mapping(address => uint256) storage purchases,
string memory computerType,
address advisor
) internal {
require(amount > 0, "Amount must be greater than 0");
require(msg.value == totalPrice, "Incorrect ETH sent");
nonces[msg.sender]++;
uint256 teamShare = totalPrice; // Start by assuming the team gets the full amount
uint256 advisorShare = 0;
uint256 refundToSender = 0;
if (advisor != address(0) && _validAdvisors[advisor]) {
refundToSender = (totalPrice * REFUND_PERCENTAGE) / PERCENTAGE_BASE; // Calculate a 10% refund to the sender
advisorShare = (totalPrice * ADVISOR_PERCENTAGE) / PERCENTAGE_BASE; // Calculate 10% for the advisor
teamShare = totalPrice - refundToSender - advisorShare; // Calculate the remaining share for the team
} else if (advisor != address(0) && !_validAdvisors[advisor]) {
revert("Invalid advisor address");
}
purchases[msg.sender] += amount; // Update the purchase record for the sender
_totalEthSpentByAddress[msg.sender] += msg.value; // Update the total ETH spent by the sender
_totalEthSpentInComputers += msg.value; // Update the total ETH spent on computers
totalSpent[msg.sender] += msg.value; // Update the total spent by the participant
_participants.push(msg.sender); // Update the leaderboard with the sender's address
(bool successTeam, ) = payable(owner()).call{value: teamShare}("");
require(successTeam, "Transfer to team failed");
if (advisorShare > 0) {
(bool successAdvisor, ) = payable(advisor).call{value: advisorShare}("");
require(successAdvisor, "Transfer to advisor failed");
}
if (refundToSender > 0) {
(bool successRefund, ) = payable(msg.sender).call{value: refundToSender}("");
require(successRefund, "Refund to sender failed");
}
emit ComputerPurchased(msg.sender, amount, msg.value, computerType); // Emit an event for the purchase
}
/*
* @notice Function to purchase Triton computers during the presale
* @param amount - The number of Triton computers to purchase
*/
function purchaseTriton(uint256 amount, address advisor) external payable nonReentrant {
_purchaseComputer(
amount,
purchaseTriton_price(amount),
_computerTritonPurchases,
"Triton",
advisor
);
}
/*
* @notice Function to purchase Hyperion computers during the presale
* @param amount - The number of Hyperion computers to purchase
*/
function purchaseHyperion(uint256 amount, address advisor) external payable nonReentrant {
_purchaseComputer(
amount,
purchaseHyperion_price(amount),
_computerHyperionPurchases,
"Hyperion",
advisor
);
}
/*
* @notice Function to purchase Nyx computers during the presale
* @param amount - The number of Nyx computers to purchase
*/
function purchaseNyx(uint256 amount, address advisor) external payable nonReentrant {
_purchaseComputer(
amount,
purchaseNyx_price(amount),
_computerNyxPurchases,
"Nyx",
advisor
);
}
/*
* @notice Function to purchase Hecate computers during the presale
* @param amount - The number of Hecate computers to purchase
*/
function purchaseHecate(uint256 amount, address advisor) external payable nonReentrant {
_purchaseComputer(
amount,
purchaseHecate_price(amount),
_computerHecatePurchases,
"Hecate",
advisor
);
}
/*
* @dev View function to calculate the ETH price for purchasing Triton computers
* @param amount - The number of Triton computers to purchase
* @return The total ETH required to purchase the specified number of Triton computers
*/
function purchaseTriton_price(uint256 amount) public view returns (uint256) {
return _convertUSDtoETH(BASE_TRITON_PRICE) * amount;
}
/*
* @dev View function to calculate the ETH price for purchasing Hyperion computers
* @param amount - The number of Hyperion computers to purchase
* @return The total ETH required to purchase the specified number of Hyperion computers
*/
function purchaseHyperion_price(uint256 amount) public view returns (uint256) {
return _convertUSDtoETH(BASE_HYPERION_PRICE) * amount;
}
/*
* @dev View function to calculate the ETH price for purchasing Nyx computers
* @param amount - The number of Nyx computers to purchase
* @return The total ETH required to purchase the specified number of Nyx computers
*/
function purchaseNyx_price(uint256 amount) public view returns (uint256) {
return _convertUSDtoETH(BASE_NYX_PRICE) * amount;
}
/*
* @dev View function to calculate the ETH price for purchasing Hecate computers
* @param amount - The number of Hecate computers to purchase
* @return The total ETH required to purchase the specified number of Hecate computers
*/
function purchaseHecate_price(uint256 amount) public view returns (uint256) {
return _convertUSDtoETH(BASE_HECATE_PRICE) * amount;
}
/*
* @dev View function to get the latest ETH/USD price from the Chainlink price feed
* @return The latest ETH/USD price in USD
*/
function _getLatestETHUSDPrice() public view returns (int) {
(, int answer, , , ) = _priceFeed.latestRoundData();
return answer / 1e8;
}
/*
* @dev View function to convert a USD amount to ETH based on the latest price feed data
* @param amountInUSDCents - The amount in USD cents to convert
* @return The equivalent amount in ETH
*/
function _convertUSDtoETH(uint256 amountInUSDCents) public view returns (uint256) {
uint256 currentETHPrice = uint256(_getLatestETHUSDPrice());
uint256 result = ((amountInUSDCents * 1e16) / currentETHPrice);
return result;
}
/*
* @notice Function to purchase tokens during the presale
* @param amount - The number of tokens to purchase
*/
function purchaseToken(uint256 amount, address advisor) external payable nonReentrant {
uint256 price = purchaseToken_price(amount);
uint256 teamShare = (price * TEAM_PERCENTAGE) / PERCENTAGE_BASE;
uint256 advisorShare = 0;
uint256 refundToSender = 0;
uint256 amountToContract = price - teamShare;
require(amount > 0, "Amount must be greater than 0");
require(_totalTokensSold + amount <= TOTAL_TOKENS, "Exceeds total token supply");
require(msg.value == price, "Incorrect ETH sent");
nonces[msg.sender]++;
if (advisor != address(0) && _validAdvisors[advisor] ) {
refundToSender = (amountToContract * REFUND_PERCENTAGE) / PERCENTAGE_BASE; // Calculate 10% refund to the sender
amountToContract = amountToContract - refundToSender; // Reduce the contract amount by the refund
advisorShare = (amountToContract * ADVISOR_PERCENTAGE) / PERCENTAGE_BASE; // Calculate 10% for the advisor
}
_tokenPurchases[msg.sender] += amount;
_tokensSoldPerRound[_currentRound] += amount;
_tokensSoldPerRoundByAddress[_currentRound][msg.sender] += amount;
_totalEthSpentByAddress[msg.sender] += msg.value;
totalSpent[msg.sender] += msg.value;
_updateRoundProgress(amount);
_participants.push(msg.sender);
(bool successTeam, ) = payable(owner()).call{value: teamShare}("");
require(successTeam, "Transfer to team failed");
(bool successContract, ) = address(this).call{value: amountToContract}("");
require(successContract, "Transfer to contract failed");
if (refundToSender > 0) {
(bool successRefund, ) = payable(msg.sender).call{value: refundToSender}("");
require(successRefund, "Refund to sender failed");
}
emit TokenPurchased(msg.sender, amount, msg.value);
}
/*
* @dev View function to calculate the ETH price for purchasing tokens
* @param amount - The number of tokens to purchase
* @return The total ETH required to purchase the specified number of tokens
*/
function purchaseToken_price(uint256 amount) public view returns (uint256) {
return _getCurrentRoundPrice() * (amount / DECIMALS);
}
/**
* @dev Returns the top `topN` participants based on their total spending.
* Iterates through the list of participants and selects the top spenders.
* @param topN The number of top participants to return.
* @return An array of addresses representing the top `topN` participants by spending.
*/
function getTopParticipants(uint256 topN) public view returns (address[] memory) {
require(topN > 0 && topN <= _participants.length, "Invalid topN value");
address[] memory topParticipants = new address[](topN);
uint256[] memory topAmounts = new uint256[](topN);
for (uint256 i = 0; i < topN; i++) {
topParticipants[i] = _participants[i];
topAmounts[i] = totalSpent[_participants[i]];
}
for (uint256 i = topN / 2; i > 0; i--) {
heapifyDown(topAmounts, topParticipants, i - 1, topN);
}
for (uint256 i = topN; i < _participants.length; i++) {
uint256 spent = totalSpent[_participants[i]];
if (spent > topAmounts[0]) {
topAmounts[0] = spent;
topParticipants[0] = _participants[i];
heapifyDown(topAmounts, topParticipants, 0, topN);
}
}
for (uint256 i = topN - 1; i > 0; i--) {
(topAmounts[0], topAmounts[i]) = (topAmounts[i], topAmounts[0]);
(topParticipants[0], topParticipants[i]) = (topParticipants[i], topParticipants[0]);
heapifyDown(topAmounts, topParticipants, 0, i);
}
return topParticipants;
}
/**
* @dev Heapifies down the element at index `start` in the min-heap.
* @param topAmounts Array of the top spending amounts.
* @param topParticipants Array of the top participant addresses.
* @param start The starting index to heapify down.
* @param size The size of the heap.
*/
function heapifyDown(
uint256[] memory topAmounts,
address[] memory topParticipants,
uint256 start,
uint256 size
) internal pure {
uint256 left = 2 * start + 1;
uint256 right = 2 * start + 2;
uint256 smallest = start;
if (left < size && topAmounts[left] < topAmounts[smallest]) {
smallest = left;
}
if (right < size && topAmounts[right] < topAmounts[smallest]) {
smallest = right;
}
if (smallest != start) {
(topAmounts[start], topAmounts[smallest]) = (topAmounts[smallest], topAmounts[start]);
(topParticipants[start], topParticipants[smallest]) = (topParticipants[smallest], topParticipants[start]);
heapifyDown(topAmounts, topParticipants, smallest, size);
}
}
/**
* @dev Returns the ranking of the caller based on their total spending.
* @return The 1-based ranking of the caller among all participants. Returns 0 if the caller is not in the list.
*/
function getRanking() external view returns (uint256) {
address[] memory sortedParticipants = getTopParticipants(_participants.length);
for (uint256 i = 0; i < sortedParticipants.length; i++) {
if (sortedParticipants[i] == msg.sender) {
return i + 1;
}
}
return 0; // Return 0 if the caller is not in the participants list.
}
/**
* @dev Returns the address of the top spender.
* @return The address of the participant who has spent the most. Returns address(0) if there are no participants.
*/
function getTopSpender() public view returns (address) {
if (_participants.length == 0) return address(0); // Return address(0) if no participants exist.
return getTopParticipants(1)[0]; // Return the address of the top spender.
}
/**
* @dev Returns the address of the second top spender.
* @return The address of the participant who has spent the second most. Returns address(0) if there are less than 2 participants.
*/
function getSecondTopSpender() public view returns (address) {
if (_participants.length < 2) return address(0); // Return address(0) if there are less than 2 participants.
return getTopParticipants(2)[1]; // Return the address of the second top spender.
}
/**
* @dev Returns the address of the third top spender.
* @return The address of the participant who has spent the third most. Returns address(0) if there are less than 3 participants.
*/
function getThirdTopSpender() public view returns (address) {
if (_participants.length < 3) return address(0); // Return address(0) if there are less than 3 participants.
return getTopParticipants(3)[2]; // Return the address of the third top spender.
}
/**
* @dev Returns the amount spent by the top spender.
* @return The total amount spent by the top spender. Returns 0 if there are no participants.
*/
function getTopSpenderAmount() external view returns (uint256) {
address topSpender = getTopSpender(); // Get the address of the top spender.
if (topSpender == address(0)) return 0; // Return 0 if there is no top spender.
return totalSpent[topSpender]; // Return the total amount spent by the top spender.
}
/**
* @dev Returns the amount spent by the second top spender.
* @return The total amount spent by the second top spender. Returns 0 if there are less than 2 participants.
*/
function getSecondTopSpenderAmount() external view returns (uint256) {
address secondTopSpender = getSecondTopSpender(); // Get the address of the second top spender.
if (secondTopSpender == address(0)) return 0; // Return 0 if there is no second top spender.
return totalSpent[secondTopSpender]; // Return the total amount spent by the second top spender.
}
/**
* @dev Returns the amount spent by the third top spender.
* @return The total amount spent by the third top spender. Returns 0 if there are less than 3 participants.
*/
function getThirdTopSpenderAmount() external view returns (uint256) {
address thirdTopSpender = getThirdTopSpender(); // Get the address of the third top spender.
if (thirdTopSpender == address(0)) return 0; // Return 0 if there is no third top spender.
return totalSpent[thirdTopSpender]; // Return the total amount spent by the third top spender.
}
/*
* @dev View function to get the price of tokens for the current round
* @return The price of tokens in ETH for the current round
*/
function _getCurrentRoundPrice() public view returns (uint256) {
return _convertUSDtoETH(_roundPrices[_currentRound]);
}
/*
* @dev View function to get the remaining tokens available for purchase in the current round
* @return The number of tokens still available for purchase in the current round
*/
function _getCurrentRoundTokensRemaining() public view returns (uint256) {
return
_roundTokenLimits[_currentRound] -
_tokensSoldPerRound[_currentRound];
}
/*
* @dev Internal function to update the progress of the current round and handle token distribution across rounds
* @param amount - The number of tokens purchased in the current transaction
*/
function _updateRoundProgress(uint256 amount) internal {
uint256 remainingTokensCurrentRound = _getCurrentRoundTokensRemaining();
if (remainingTokensCurrentRound >= amount) {
_totalTokensSold += amount;
} else {
uint256 excessTokens = amount - remainingTokensCurrentRound;
_totalTokensSold += remainingTokensCurrentRound;
if (_currentRound < MAX_ROUND) {
_currentRound++;
emit RoundAdvanced(_currentRound);
_updateRoundProgress(excessTokens);
} else {
_totalTokensSold += excessTokens;
}
}
}
/*
* @notice Function to withdraw funds from the contract upon presale completion
*/
function deploy_SyntraCoin() external {
require(msg.sender == address(this), "Only contract can call this function");
require(_currentRound == MAX_ROUND, "Presale not finished");
uint256 ethForPool = address(this).balance;
_uniswapAndCoinManager.deployCoinAndPool{value: ethForPool}(ethForPool - 6789788);
}
/*
* @notice Function for participants to mint the tokens they bought in the presale
*/
function mintMyTokens() external nonReentrant {
require(_uniswapAndCoinManager.coinAddress() != address(0), "Coin not deployed yet");
uint256 amountToMint = _tokenPurchases[msg.sender];
require(amountToMint > 0, "No tokens to mint");
nonces[msg.sender]++;
_tokenPurchases[msg.sender] = 0;
_uniswapAndCoinManager.mintTokens(msg.sender, amountToMint);
}
/*
* @notice Function to attempt to withdraw funds safely; enters emergency mode if it fails
*/
function safe_deploy_SyntraCoin() external nonReentrant onlyOwner {
try this.deploy_SyntraCoin() {} catch {
_isInEmergencyWithdraw = true;
}
}
/*
* @notice Function to perform an emergency withdrawal if safe withdrawal fails
*/
function emergencyWithdraw() external onlyOwner {
require(_isInEmergencyWithdraw, "Emergency withdraw is not active");
uint256 amountToWithdraw = address(this).balance;
require(amountToWithdraw > 0, "No funds to withdraw");
nonces[owner()]++;
(bool success, ) = payable(owner()).call{
value: amountToWithdraw,
gas: 500000
}("");
require(success, "Transfer failed");
}
/*
* @notice Function to allow participants to request a full refund if the presale fails
*/
function failedPresaleFullRefundMe() external nonReentrant {
require(block.timestamp > _presaleStartedAt + GLOBAL_TIMER,"Global timer is not ended yet");
address payable purchaser = payable(msg.sender);
uint256 totalEth = _totalEthSpentByAddress[purchaser];
uint256 refundEth = (totalEth * (PERCENTAGE_BASE - TEAM_PERCENTAGE)) / PERCENTAGE_BASE; // Refund only 80%
require(totalEth > 0, "You have no ETH available to withdraw");
nonces[msg.sender]++;
_tokensSoldPerRoundByAddress[_currentRound][purchaser] = 0;
_tokenPurchases[purchaser] = 0;
_totalEthSpentByAddress[purchaser] = 0;
(bool success, ) = purchaser.call{value: refundEth}("");
require(success, "Transfer failed");
emit AddressRefunded(purchaser, refundEth);
}
/*
* @notice Function to allow participants to request a refund if certain conditions are met
*/
function refundMe() external nonReentrant {
address payable purchaser = payable(msg.sender);
uint256 tokensAmount = _tokensSoldPerRoundByAddress[_currentRound][purchaser];
uint256 totalAmountInEth = purchaseToken_price(tokensAmount);
uint256 refundAmountInEth = (totalAmountInEth * (PERCENTAGE_BASE - TEAM_PERCENTAGE)) / PERCENTAGE_BASE; // Refund only 80%
require(tokensAmount > 0, "You have not deposited ETH in this round");
nonces[msg.sender]++;
_totalTokensSold -= tokensAmount;
_tokensSoldPerRound[_currentRound] -= tokensAmount;
_tokensSoldPerRoundByAddress[_currentRound][purchaser] -= tokensAmount;
_tokenPurchases[purchaser] -= tokensAmount;
_totalEthSpentByAddress[purchaser] -= totalAmountInEth;
(bool success, ) = purchaser.call{value: refundAmountInEth}("");
require(success, "Transfer failed");
emit AddressRefunded(purchaser, tokensAmount);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"uniswapAndCoinManager_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"purchaser","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddressRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"advisor","type":"address"}],"name":"AdvisorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"advisor","type":"address"},{"indexed":true,"internalType":"address[]","name":"investorsAddresses","type":"address[]"}],"name":"AdvisorAddressesAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"advisor","type":"address"}],"name":"AdvisorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"ethSpent","type":"uint256"},{"indexed":false,"internalType":"string","name":"computerType","type":"string"}],"name":"ComputerPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newRound","type":"uint256"}],"name":"RoundAdvanced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"ethSpent","type":"uint256"}],"name":"TokenPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"advisor","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferCompleted","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"ADVISOR_PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_HECATE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_HYPERION_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_NYX_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_TRITON_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GLOBAL_TIMER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ROUND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REFUND_PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_advisors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_computerHecatePurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_computerHyperionPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_computerNyxPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_computerTritonPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountInUSDCents","type":"uint256"}],"name":"_convertUSDtoETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_currentRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_ethAmountByAdvisorAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getCurrentRoundPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getCurrentRoundTokensRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getLatestETHUSDPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_investorsByAdvisorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isInEmergencyWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_participants","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_presaleStartedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_roundPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_roundTokenLimits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_tokenPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokensSoldPerRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"_tokensSoldPerRoundByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_totalEthSpentByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalEthSpentInComputers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalTokensSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_uniswapAndCoinManager","outputs":[{"internalType":"contract IUniswapAndCoinManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"advisor","type":"address"}],"name":"addAdvisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deploy_SyntraCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"failedPresaleFullRefundMe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRanking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSecondTopSpender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSecondTopSpenderAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThirdTopSpender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThirdTopSpenderAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"topN","type":"uint256"}],"name":"getTopParticipants","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTopSpender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTopSpenderAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMyTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"advisor","type":"address"}],"name":"purchaseHecate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"purchaseHecate_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"advisor","type":"address"}],"name":"purchaseHyperion","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"purchaseHyperion_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"advisor","type":"address"}],"name":"purchaseNyx","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"purchaseNyx_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"advisor","type":"address"}],"name":"purchaseToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"purchaseToken_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"advisor","type":"address"}],"name":"purchaseTriton","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"purchaseTriton_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundMe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"advisor","type":"address"}],"name":"removeAdvisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safe_deploy_SyntraCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalSpent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
610100604052600a6080908152600f60a052601460c052601960e0526200002a9060049081620001f7565b506040518060800160405280670de0b6b3a7640000623d09006200004f919062000287565b81526020016200006b670de0b6b3a7640000627a120062000287565b815260200162000087670de0b6b3a764000062b71b0062000287565b8152602001620000a3670de0b6b3a764000062f4240062000287565b9052620000b59060089060046200023f565b506000600c819055600d819055600e819055600f55601f805460ff19169055348015620000e157600080fd5b5060405162003385380380620033858339810160408190526200010491620002b5565b6200010f33620001a7565b600180556001600160a01b038116620001605760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640160405180910390fd5b600280546001600160a01b039092166001600160a01b031992831617905560038054909116735f4ec3df9cbd43714fe2740f5e3616155c5b841917905542600f55620002e7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82600481019282156200022d579160200282015b828111156200022d578251829060ff169055916020019190600101906200020b565b506200023b92915062000270565b5090565b82600481019282156200022d579160200282015b828111156200022d57825182559160200191906001019062000253565b5b808211156200023b576000815560010162000271565b6000816000190483118215151615620002b057634e487b7160e01b600052601160045260246000fd5b500290565b600060208284031215620002c857600080fd5b81516001600160a01b0381168114620002e057600080fd5b9392505050565b61308e80620002f76000396000f3fe6080604052600436106103b75760003560e01c80639685ee95116101f0578063cb8d36231161010c578063f196f824116100a5578063f3f11bc311610077578063f3f11bc314610aa8578063f46c858a14610abb578063f89c0fcc14610adb578063fe9edf2e14610af0578063ff5d2a5714610b1d57005b8063f196f82414610a33578063f1b32ad614610a53578063f2840e0214610a68578063f2fde38b14610a8857005b8063db2e21bc116100de578063db2e21bc146109f4578063e1211c4b14610a09578063e451968414610a1e578063eb3690e91461084457005b8063cb8d362314610995578063cdbc760d146109aa578063cfd74cde146109c1578063d1172ea6146109d457005b8063b1af52b111610189578063b6e3a20b1161015b578063b6e3a20b146108f3578063b6ec022114610920578063bd9690ea14610935578063c2b1f60314610955578063c5b0766b1461096857005b8063b1af52b114610879578063b3b427b7146108b1578063b4ac62c5146108c7578063b551b6dc146108dc57005b8063a4b4b771116101c2578063a4b4b77114610802578063a8949b4614610817578063ae06cfd314610844578063b0c1389c1461085957005b80639685ee9514610775578063978cc0d5146107955780639c4a84db146107c25780639d02a9ed146107e257005b80635a9e426b116102df5780637bbf71791161027857806384d9390a1161024a57806384d9390a146106e257806387c13943146106f75780638b048f911461070c5780638da5cb5b146107235780638f3e1e7a1461075557005b80637bbf7179146106635780637cfbc1bd146106765780637ecebe001461068b5780638170823e146106b857005b806372ee14c6116102b157806372ee14c614610603578063757ae291146106185780637714a7e21461062e5780637745b6b41461064e57005b80635a9e426b146105a3578063639e0aaa146105b85780636cc1fa96146105d8578063715018a6146105ee57005b80632e0f26251161035157806344a4062f1161032357806344a4062f1461052857806346fcf18a1461053f5780634730864c1461056c5780634c0318901461058357005b80632e0f2625146104b5578063323a3762146104d157806333bd034d146104e657806343974411146104fb57005b80630eeccb841161038a5780630eeccb84146104585780631398bbf71461047857806322bd6bc21461048d57806326c84cc4146104a057005b80622b55fd146103c057806303fac1061461040057806304f8722e146104165780630b7abf771461044357005b366103be57005b005b3480156103cc57600080fd5b506103ed6103db366004612d50565b60146020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561040c57600080fd5b506103ed600c5481565b34801561042257600080fd5b506103ed610431366004612d50565b60176020526000908152604090205481565b34801561044f57600080fd5b506103ed610b4a565b34801561046457600080fd5b506103be610473366004612d50565b610b63565b34801561048457600080fd5b506103ed610c5d565b6103be61049b366004612d74565b610cdb565b3480156104ac57600080fd5b506103ed610d26565b3480156104c157600080fd5b506103ed670de0b6b3a764000081565b3480156104dd57600080fd5b506103ed610dbc565b3480156104f257600080fd5b506103ed610dfc565b34801561050757600080fd5b5061051b610516366004612da4565b610e34565b6040516103f79190612dbd565b34801561053457600080fd5b506103ed62eff10081565b34801561054b57600080fd5b506103ed61055a366004612d50565b60136020526000908152604090205481565b34801561057857600080fd5b506103ed62035b6081565b34801561058f57600080fd5b506103ed61059e366004612da4565b611265565b3480156105af57600080fd5b506103be611284565b3480156105c457600080fd5b506103ed6105d3366004612da4565b6114e4565b3480156105e457600080fd5b506103ed600d5481565b3480156105fa57600080fd5b506103be6114f3565b34801561060f57600080fd5b506103ed611505565b34801561062457600080fd5b506103ed600e5481565b34801561063a57600080fd5b506103ed610649366004612da4565b611510565b34801561065a57600080fd5b506103be611543565b6103be610671366004612d74565b61165b565b34801561068257600080fd5b506103be611697565b34801561069757600080fd5b506103ed6106a6366004612d50565b60106020526000908152604090205481565b3480156106c457600080fd5b50601f546106d29060ff1681565b60405190151581526020016103f7565b3480156106ee57600080fd5b506103ed601481565b34801561070357600080fd5b506103ed606481565b34801561071857600080fd5b506103ed620668a081565b34801561072f57600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016103f7565b34801561076157600080fd5b5061073d610770366004612da4565b61170e565b34801561078157600080fd5b506103ed610790366004612da4565b611738565b3480156107a157600080fd5b506103ed6107b0366004612d50565b60156020526000908152604090205481565b3480156107ce57600080fd5b506103ed6107dd366004612da4565b611754565b3480156107ee57600080fd5b506103ed6107fd366004612da4565b611763565b34801561080e57600080fd5b506103ed611772565b34801561082357600080fd5b506103ed610832366004612d50565b601b6020526000908152604090205481565b34801561085057600080fd5b506103ed600a81565b34801561086557600080fd5b506103ed610874366004612da4565b61177d565b34801561088557600080fd5b506103ed610894366004612d74565b601860209081526000928352604080842090915290825290205481565b3480156108bd57600080fd5b506103ed600f5481565b3480156108d357600080fd5b506103ed600381565b3480156108e857600080fd5b506103ed6208b29081565b3480156108ff57600080fd5b506103ed61090e366004612d50565b601a6020526000908152604090205481565b34801561092c57600080fd5b506103ed611794565b34801561094157600080fd5b506103ed610950366004612da4565b6117b5565b6103be610963366004612d74565b6117c5565b34801561097457600080fd5b506103ed610983366004612d50565b60126020526000908152604090205481565b3480156109a157600080fd5b506103be611801565b3480156109b657600080fd5b506103ed620bbfd081565b6103be6109cf366004612d74565b6119b7565b3480156109e057600080fd5b5061073d6109ef366004612e0a565b6119f0565b348015610a0057600080fd5b506103be611a28565b348015610a1557600080fd5b5061073d611b82565b348015610a2a57600080fd5b506103be611bbf565b348015610a3f57600080fd5b5061073d610a4e366004612da4565b611dbb565b348015610a5f57600080fd5b5061073d611dcb565b348015610a7457600080fd5b5060025461073d906001600160a01b031681565b348015610a9457600080fd5b506103be610aa3366004612d50565b611dfb565b6103be610ab6366004612d74565b611e74565b348015610ac757600080fd5b506103be610ad6366004612d50565b612379565b348015610ae757600080fd5b5061073d6124b6565b348015610afc57600080fd5b506103ed610b0b366004612da4565b60166020526000908152604090205481565b348015610b2957600080fd5b506103ed610b38366004612d50565b60116020526000908152604090205481565b610b60670de0b6b3a76400006302625a00612e4c565b81565b610b6b6124e4565b6001600160a01b038116610bb85760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b6001600160a01b0381166000908152601e602052604090205460ff16610c145760405162461bcd60e51b815260206004820152601160248201527010591d9a5cdbdc881b9bdd08199bdd5b99607a1b6044820152606401610baf565b6001600160a01b0381166000818152601e6020526040808220805460ff19169055517fd4a6ffced9053f299bd4faabab08c87e208109894dd8437522c15f656a73ffc89190a250565b600080610c6e601c80549050610e34565b905060005b8151811015610cd257336001600160a01b0316828281518110610c9857610c98612e6b565b60200260200101516001600160a01b031603610cc057610cb9816001612e81565b9250505090565b80610cca81612e99565b915050610c73565b50600091505090565b610ce361253e565b610d1982610cf084611763565b601260405180604001604052806008815260200167243cb832b934b7b760c11b81525085612597565b610d2260018055565b5050565b600080600360009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da09190612ed1565b5050509150506305f5e10081610db69190612f37565b91505090565b600080610dc7611b82565b90506001600160a01b038116610ddf57600091505090565b6001600160a01b03166000908152601b6020526040902054919050565b600c54600081815260166020526040812054909160089060048110610e2357610e23612e6b565b0154610e2f9190612f65565b905090565b6060600082118015610e485750601c548211155b610e895760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f704e2076616c756560701b6044820152606401610baf565b60008267ffffffffffffffff811115610ea457610ea4612f7c565b604051908082528060200260200182016040528015610ecd578160200160208202803683370190505b50905060008367ffffffffffffffff811115610eeb57610eeb612f7c565b604051908082528060200260200182016040528015610f14578160200160208202803683370190505b50905060005b84811015610ff257601c8181548110610f3557610f35612e6b565b9060005260206000200160009054906101000a90046001600160a01b0316838281518110610f6557610f65612e6b565b60200260200101906001600160a01b031690816001600160a01b031681525050601b6000601c8381548110610f9c57610f9c612e6b565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610fd557610fd5612e6b565b602090810291909101015280610fea81612e99565b915050610f1a565b506000611000600286612f92565b90505b80156110315761101f8284611019600185612f65565b88612a56565b8061102981612fa6565b915050611003565b50835b601c54811015611139576000601b6000601c848154811061105757611057612e6b565b60009182526020808320909101546001600160a01b03168352820192909252604001812054845190925084919061109057611090612e6b565b60200260200101518111156111265780836000815181106110b3576110b3612e6b565b602002602001018181525050601c82815481106110d2576110d2612e6b565b600091825260208220015485516001600160a01b039091169186916110f9576110f9612e6b565b60200260200101906001600160a01b031690816001600160a01b0316815250506111268385600089612a56565b508061113181612e99565b915050611034565b506000611147600186612f65565b90505b801561125c5781818151811061116257611162612e6b565b60200260200101518260008151811061117d5761117d612e6b565b60200260200101518360008151811061119857611198612e6b565b602002602001018484815181106111b1576111b1612e6b565b60200260200101828152508281525050508281815181106111d4576111d4612e6b565b6020026020010151836000815181106111ef576111ef612e6b565b60200260200101518460008151811061120a5761120a612e6b565b6020026020010185848151811061122357611223612e6b565b6001600160a01b0393841660209182029290920101529116905261124a8284600084612a56565b8061125481612fa6565b91505061114a565b50909392505050565b600081611274620668a0611510565b61127e9190612e4c565b92915050565b61128c61253e565b600c54600090815260186020908152604080832033808552925282205490916112b482611738565b9050600060646112c5601482612f65565b6112cf9084612e4c565b6112d99190612f92565b90506000831161133c5760405162461bcd60e51b815260206004820152602860248201527f596f752068617665206e6f74206465706f73697465642045544820696e2074686044820152671a5cc81c9bdd5b9960c21b6064820152608401610baf565b33600090815260106020526040812080549161135783612e99565b919050555082600d600082825461136e9190612f65565b9091555050600c5460009081526016602052604081208054859290611394908490612f65565b9091555050600c5460009081526018602090815260408083206001600160a01b0388168452909152812080548592906113ce908490612f65565b90915550506001600160a01b038416600090815260156020526040812080548592906113fb908490612f65565b90915550506001600160a01b03841660009081526017602052604081208054849290611428908490612f65565b90915550506040516000906001600160a01b0386169083908381818185875af1925050503d8060008114611478576040519150601f19603f3d011682016040523d82523d6000602084013e61147d565b606091505b505090508061149e5760405162461bcd60e51b8152600401610baf90612fbd565b60405184906001600160a01b038716907fb94c59e5f451678a47808bbdbce1a8d09619d3f2b545399e8870820292834e4390600090a350505050506114e260018055565b565b6000816112746208b290611510565b6114fb6124e4565b6114e26000612c20565b600080610dc7611dcb565b60008061151b610d26565b905060008161153185662386f26fc10000612e4c565b61153b9190612f92565b949350505050565b33301461159e5760405162461bcd60e51b8152602060048201526024808201527f4f6e6c7920636f6e74726163742063616e2063616c6c20746869732066756e636044820152633a34b7b760e11b6064820152608401610baf565b6003600c54146115e75760405162461bcd60e51b8152602060048201526014602482015273141c995cd85b19481b9bdd08199a5b9a5cda195960621b6044820152606401610baf565b60025447906001600160a01b0316635e9352978261160862679a9c82612f65565b6040518363ffffffff1660e01b815260040161162691815260200190565b6000604051808303818588803b15801561163f57600080fd5b505af1158015611653573d6000803e3d6000fd5b505050505050565b61166361253e565b610d198261167084611754565b60146040518060400160405280600681526020016548656361746560d01b81525085612597565b61169f61253e565b6116a76124e4565b306001600160a01b0316637745b6b46040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156116e257600080fd5b505af19250505080156116f3575060015b61170557601f805460ff191660011790555b6114e260018055565b601d818154811061171e57600080fd5b6000918252602090912001546001600160a01b0316905081565b600061174c670de0b6b3a764000083612f92565b611274611794565b60008161127462035b60611510565b600081611274620bbfd0611510565b600080610dc76124b6565b6004816004811061178d57600080fd5b0154905081565b6000610e2f6004600c54600481106117ae576117ae612e6b565b0154611510565b6008816004811061178d57600080fd5b6117cd61253e565b610d19826117da846114e4565b6011604051806040016040528060068152602001652a3934ba37b760d11b81525085612597565b61180961253e565b6002546040805163fdc61dd160e01b815290516000926001600160a01b03169163fdc61dd19160048083019260209291908290030181865afa158015611853573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118779190612fe6565b6001600160a01b0316036118c55760405162461bcd60e51b815260206004820152601560248201527410dbda5b881b9bdd0819195c1b1bde5959081e595d605a1b6044820152606401610baf565b33600090815260156020526040902054806119165760405162461bcd60e51b8152602060048201526011602482015270139bc81d1bdad95b9cc81d1bc81b5a5b9d607a1b6044820152606401610baf565b33600090815260106020526040812080549161193183612e99565b909155505033600081815260156020526040808220919091556002549051633c37699760e21b81526004810192909252602482018390526001600160a01b03169063f0dda65c90604401600060405180830381600087803b15801561199557600080fd5b505af11580156119a9573d6000803e3d6000fd5b50505050506114e260018055565b6119bf61253e565b610d19826119cc84611265565b60136040518060400160405280600381526020016209cf2f60eb1b81525085612597565b60196020528160005260406000208181548110611a0c57600080fd5b6000918252602090912001546001600160a01b03169150829050565b611a306124e4565b601f5460ff16611a825760405162461bcd60e51b815260206004820181905260248201527f456d657267656e6379207769746864726177206973206e6f74206163746976656044820152606401610baf565b4780611ac75760405162461bcd60e51b81526020600482015260146024820152734e6f2066756e647320746f20776974686472617760601b6044820152606401610baf565b60106000611add6000546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000908120805491611b0483612e99565b9091555050600080546040516001600160a01b03909116906207a12090849084818181858888f193505050503d8060008114611b5c576040519150601f19603f3d011682016040523d82523d6000602084013e611b61565b606091505b5050905080610d225760405162461bcd60e51b8152600401610baf90612fbd565b601c5460009060031115611b965750600090565b611ba06003610e34565b600281518110611bb257611bb2612e6b565b6020026020010151905090565b611bc761253e565b62eff100600f54611bd89190612e81565b4211611c265760405162461bcd60e51b815260206004820152601d60248201527f476c6f62616c2074696d6572206973206e6f7420656e646564207965740000006044820152606401610baf565b33600081815260176020526040812054906064611c44601482612f65565b611c4e9084612e4c565b611c589190612f92565b905060008211611cb85760405162461bcd60e51b815260206004820152602560248201527f596f752068617665206e6f2045544820617661696c61626c6520746f20776974604482015264686472617760d81b6064820152608401610baf565b336000908152601060205260408120805491611cd383612e99565b9091555050600c5460009081526018602090815260408083206001600160a01b0387168085529083528184208490556015835281842084905560179092528083208390555183908381818185875af1925050503d8060008114611d52576040519150601f19603f3d011682016040523d82523d6000602084013e611d57565b606091505b5050905080611d785760405162461bcd60e51b8152600401610baf90612fbd565b60405182906001600160a01b038616907fb94c59e5f451678a47808bbdbce1a8d09619d3f2b545399e8870820292834e4390600090a3505050506114e260018055565b601c818154811061171e57600080fd5b601c5460009060021115611ddf5750600090565b611de96002610e34565b600181518110611bb257611bb2612e6b565b611e036124e4565b6001600160a01b038116611e685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610baf565b611e7181612c20565b50565b611e7c61253e565b6000611e8783611738565b905060006064611e98601484612e4c565b611ea29190612f92565b905060008080611eb28486612f65565b905060008711611f045760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610baf565b611f1a670de0b6b3a76400006302625a00612e4c565b87600d54611f289190612e81565b1115611f765760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746f74616c20746f6b656e20737570706c790000000000006044820152606401610baf565b843414611fba5760405162461bcd60e51b8152602060048201526012602482015271125b98dbdc9c9958dd08115512081cd95b9d60721b6044820152606401610baf565b336000908152601060205260408120805491611fd583612e99565b90915550506001600160a01b0386161580159061200a57506001600160a01b0386166000908152601e602052604090205460ff165b1561204e57606461201c600a83612e4c565b6120269190612f92565b91506120328282612f65565b90506064612041600a83612e4c565b61204b9190612f92565b92505b336000908152601560205260408120805489929061206d908490612e81565b9091555050600c5460009081526016602052604081208054899290612093908490612e81565b9091555050600c546000908152601860209081526040808320338452909152812080548992906120c4908490612e81565b909155505033600090815260176020526040812080543492906120e8908490612e81565b9091555050336000908152601b60205260408120805434929061210c908490612e81565b9091555061211b905087612c70565b601c805460018101825560009182527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b0319163317905561216e6000546001600160a01b031690565b6001600160a01b03168560405160006040518083038185875af1925050503d80600081146121b8576040519150601f19603f3d011682016040523d82523d6000602084013e6121bd565b606091505b50509050806122085760405162461bcd60e51b8152602060048201526017602482015276151c985b9cd9995c881d1bc81d19585b4819985a5b1959604a1b6044820152606401610baf565b604051600090309084908381818185875af1925050503d806000811461224a576040519150601f19603f3d011682016040523d82523d6000602084013e61224f565b606091505b50509050806122a05760405162461bcd60e51b815260206004820152601b60248201527f5472616e7366657220746f20636f6e7472616374206661696c656400000000006044820152606401610baf565b831561233a57604051600090339086908381818185875af1925050503d80600081146122e8576040519150601f19603f3d011682016040523d82523d6000602084013e6122ed565b606091505b50509050806123385760405162461bcd60e51b81526020600482015260176024820152761499599d5b99081d1bc81cd95b99195c8819985a5b1959604a1b6044820152606401610baf565b505b60405134908a9033907f3ceffd410054fdaed44f598ff5c1fb450658778e2241892da4aa646979dee61790600090a450505050505050610d2260018055565b6123816124e4565b6001600160a01b0381166123c95760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610baf565b6001600160a01b0381166000908152601e602052604090205460ff161561242a5760405162461bcd60e51b815260206004820152601560248201527410591d9a5cdbdc88185b1c9958591e481859191959605a1b6044820152606401610baf565b6001600160a01b0381166000818152601e6020526040808220805460ff19166001908117909155601d8054918201815583527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b03191684179055517f750baf29cae521cdaad55df39e53298f98cc651ff7462166004f4d6df4e3aa499190a250565b601c5460009081036124c85750600090565b6124d26001610e34565b600081518110611bb257611bb2612e6b565b6000546001600160a01b031633146114e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610baf565b6002600154036125905760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610baf565b6002600155565b600085116125e75760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610baf565b83341461262b5760405162461bcd60e51b8152602060048201526012602482015271125b98dbdc9c9958dd08115512081cd95b9d60721b6044820152606401610baf565b33600090815260106020526040812080549161264683612e99565b909155508490506000806001600160a01b0384161580159061268057506001600160a01b0384166000908152601e602052604090205460ff165b156126d3576064612692600a89612e4c565b61269c9190612f92565b905060646126ab600a89612e4c565b6126b59190612f92565b9150816126c28289612f65565b6126cc9190612f65565b9250612751565b6001600160a01b0384161580159061270457506001600160a01b0384166000908152601e602052604090205460ff16155b156127515760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642061647669736f7220616464726573730000000000000000006044820152606401610baf565b33600090815260208790526040812080548a9290612770908490612e81565b90915550503360009081526017602052604081208054349290612794908490612e81565b9250508190555034600e60008282546127ad9190612e81565b9091555050336000908152601b6020526040812080543492906127d1908490612e81565b9091555050601c805460018101825560009182527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b031916331790556128296000546001600160a01b031690565b6001600160a01b03168460405160006040518083038185875af1925050503d8060008114612873576040519150601f19603f3d011682016040523d82523d6000602084013e612878565b606091505b50509050806128c35760405162461bcd60e51b8152602060048201526017602482015276151c985b9cd9995c881d1bc81d19585b4819985a5b1959604a1b6044820152606401610baf565b821561296e576000856001600160a01b03168460405160006040518083038185875af1925050503d8060008114612916576040519150601f19603f3d011682016040523d82523d6000602084013e61291b565b606091505b505090508061296c5760405162461bcd60e51b815260206004820152601a60248201527f5472616e7366657220746f2061647669736f72206661696c65640000000000006044820152606401610baf565b505b8115612a0857604051600090339084908381818185875af1925050503d80600081146129b6576040519150601f19603f3d011682016040523d82523d6000602084013e6129bb565b606091505b5050905080612a065760405162461bcd60e51b81526020600482015260176024820152761499599d5b99081d1bc81cd95b99195c8819985a5b1959604a1b6044820152606401610baf565b505b3489336001600160a01b03167fb9f9b5dbd785c981fe440f66a245e5fbf580a67f965da5fa353e63bb37d5368589604051612a439190613003565b60405180910390a4505050505050505050565b6000612a63836002612e4c565b612a6e906001612e81565b90506000612a7d846002612e4c565b612a88906002612e81565b9050838383108015612acb5750868181518110612aa757612aa7612e6b565b6020026020010151878481518110612ac157612ac1612e6b565b6020026020010151105b15612ad35750815b8382108015612b135750868181518110612aef57612aef612e6b565b6020026020010151878381518110612b0957612b09612e6b565b6020026020010151105b15612b1b5750805b848114612c1757868181518110612b3457612b34612e6b565b6020026020010151878681518110612b4e57612b4e612e6b565b6020026020010151888781518110612b6857612b68612e6b565b60200260200101898481518110612b8157612b81612e6b565b6020026020010182815250828152505050858181518110612ba457612ba4612e6b565b6020026020010151868681518110612bbe57612bbe612e6b565b6020026020010151878781518110612bd857612bd8612e6b565b60200260200101888481518110612bf157612bf1612e6b565b6001600160a01b03938416602091820292909201015291169052612c1787878387612a56565b50505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612c7a610dfc565b9050818110612ca05781600d6000828254612c959190612e81565b90915550610d229050565b6000612cac8284612f65565b905081600d6000828254612cc09190612e81565b9091555050600c5460031115612d1f57600c8054906000612ce083612e99565b9091555050600c546040517f023811fd72d20a3eb734785eed809172b5c9c24019d493039c70ef9c276d4d9790600090a2612d1a81612c70565b505050565b80600d6000828254612d319190612e81565b9091555050505050565b6001600160a01b0381168114611e7157600080fd5b600060208284031215612d6257600080fd5b8135612d6d81612d3b565b9392505050565b60008060408385031215612d8757600080fd5b823591506020830135612d9981612d3b565b809150509250929050565b600060208284031215612db657600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015612dfe5783516001600160a01b031683529284019291840191600101612dd9565b50909695505050505050565b60008060408385031215612e1d57600080fd5b8235612e2881612d3b565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612e6657612e66612e36565b500290565b634e487b7160e01b600052603260045260246000fd5b60008219821115612e9457612e94612e36565b500190565b600060018201612eab57612eab612e36565b5060010190565b805169ffffffffffffffffffff81168114612ecc57600080fd5b919050565b600080600080600060a08688031215612ee957600080fd5b612ef286612eb2565b9450602086015193506040860151925060608601519150612f1560808701612eb2565b90509295509295909350565b634e487b7160e01b600052601260045260246000fd5b600082612f4657612f46612f21565b600160ff1b821460001984141615612f6057612f60612e36565b500590565b600082821015612f7757612f77612e36565b500390565b634e487b7160e01b600052604160045260246000fd5b600082612fa157612fa1612f21565b500490565b600081612fb557612fb5612e36565b506000190190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b600060208284031215612ff857600080fd5b8151612d6d81612d3b565b600060208083528351808285015260005b8181101561303057858101830151858201604001528201613014565b81811115613042576000604083870101525b50601f01601f191692909201604001939250505056fea2646970667358221220146ccdac3e7236cefd5185910cccd65c9f74919cd2a6b07d43b016b80d9b5d0664736f6c634300080f00330000000000000000000000009b027d11717f68b55424a9bf4461933062e07ddb
Deployed Bytecode
0x6080604052600436106103b75760003560e01c80639685ee95116101f0578063cb8d36231161010c578063f196f824116100a5578063f3f11bc311610077578063f3f11bc314610aa8578063f46c858a14610abb578063f89c0fcc14610adb578063fe9edf2e14610af0578063ff5d2a5714610b1d57005b8063f196f82414610a33578063f1b32ad614610a53578063f2840e0214610a68578063f2fde38b14610a8857005b8063db2e21bc116100de578063db2e21bc146109f4578063e1211c4b14610a09578063e451968414610a1e578063eb3690e91461084457005b8063cb8d362314610995578063cdbc760d146109aa578063cfd74cde146109c1578063d1172ea6146109d457005b8063b1af52b111610189578063b6e3a20b1161015b578063b6e3a20b146108f3578063b6ec022114610920578063bd9690ea14610935578063c2b1f60314610955578063c5b0766b1461096857005b8063b1af52b114610879578063b3b427b7146108b1578063b4ac62c5146108c7578063b551b6dc146108dc57005b8063a4b4b771116101c2578063a4b4b77114610802578063a8949b4614610817578063ae06cfd314610844578063b0c1389c1461085957005b80639685ee9514610775578063978cc0d5146107955780639c4a84db146107c25780639d02a9ed146107e257005b80635a9e426b116102df5780637bbf71791161027857806384d9390a1161024a57806384d9390a146106e257806387c13943146106f75780638b048f911461070c5780638da5cb5b146107235780638f3e1e7a1461075557005b80637bbf7179146106635780637cfbc1bd146106765780637ecebe001461068b5780638170823e146106b857005b806372ee14c6116102b157806372ee14c614610603578063757ae291146106185780637714a7e21461062e5780637745b6b41461064e57005b80635a9e426b146105a3578063639e0aaa146105b85780636cc1fa96146105d8578063715018a6146105ee57005b80632e0f26251161035157806344a4062f1161032357806344a4062f1461052857806346fcf18a1461053f5780634730864c1461056c5780634c0318901461058357005b80632e0f2625146104b5578063323a3762146104d157806333bd034d146104e657806343974411146104fb57005b80630eeccb841161038a5780630eeccb84146104585780631398bbf71461047857806322bd6bc21461048d57806326c84cc4146104a057005b80622b55fd146103c057806303fac1061461040057806304f8722e146104165780630b7abf771461044357005b366103be57005b005b3480156103cc57600080fd5b506103ed6103db366004612d50565b60146020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561040c57600080fd5b506103ed600c5481565b34801561042257600080fd5b506103ed610431366004612d50565b60176020526000908152604090205481565b34801561044f57600080fd5b506103ed610b4a565b34801561046457600080fd5b506103be610473366004612d50565b610b63565b34801561048457600080fd5b506103ed610c5d565b6103be61049b366004612d74565b610cdb565b3480156104ac57600080fd5b506103ed610d26565b3480156104c157600080fd5b506103ed670de0b6b3a764000081565b3480156104dd57600080fd5b506103ed610dbc565b3480156104f257600080fd5b506103ed610dfc565b34801561050757600080fd5b5061051b610516366004612da4565b610e34565b6040516103f79190612dbd565b34801561053457600080fd5b506103ed62eff10081565b34801561054b57600080fd5b506103ed61055a366004612d50565b60136020526000908152604090205481565b34801561057857600080fd5b506103ed62035b6081565b34801561058f57600080fd5b506103ed61059e366004612da4565b611265565b3480156105af57600080fd5b506103be611284565b3480156105c457600080fd5b506103ed6105d3366004612da4565b6114e4565b3480156105e457600080fd5b506103ed600d5481565b3480156105fa57600080fd5b506103be6114f3565b34801561060f57600080fd5b506103ed611505565b34801561062457600080fd5b506103ed600e5481565b34801561063a57600080fd5b506103ed610649366004612da4565b611510565b34801561065a57600080fd5b506103be611543565b6103be610671366004612d74565b61165b565b34801561068257600080fd5b506103be611697565b34801561069757600080fd5b506103ed6106a6366004612d50565b60106020526000908152604090205481565b3480156106c457600080fd5b50601f546106d29060ff1681565b60405190151581526020016103f7565b3480156106ee57600080fd5b506103ed601481565b34801561070357600080fd5b506103ed606481565b34801561071857600080fd5b506103ed620668a081565b34801561072f57600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016103f7565b34801561076157600080fd5b5061073d610770366004612da4565b61170e565b34801561078157600080fd5b506103ed610790366004612da4565b611738565b3480156107a157600080fd5b506103ed6107b0366004612d50565b60156020526000908152604090205481565b3480156107ce57600080fd5b506103ed6107dd366004612da4565b611754565b3480156107ee57600080fd5b506103ed6107fd366004612da4565b611763565b34801561080e57600080fd5b506103ed611772565b34801561082357600080fd5b506103ed610832366004612d50565b601b6020526000908152604090205481565b34801561085057600080fd5b506103ed600a81565b34801561086557600080fd5b506103ed610874366004612da4565b61177d565b34801561088557600080fd5b506103ed610894366004612d74565b601860209081526000928352604080842090915290825290205481565b3480156108bd57600080fd5b506103ed600f5481565b3480156108d357600080fd5b506103ed600381565b3480156108e857600080fd5b506103ed6208b29081565b3480156108ff57600080fd5b506103ed61090e366004612d50565b601a6020526000908152604090205481565b34801561092c57600080fd5b506103ed611794565b34801561094157600080fd5b506103ed610950366004612da4565b6117b5565b6103be610963366004612d74565b6117c5565b34801561097457600080fd5b506103ed610983366004612d50565b60126020526000908152604090205481565b3480156109a157600080fd5b506103be611801565b3480156109b657600080fd5b506103ed620bbfd081565b6103be6109cf366004612d74565b6119b7565b3480156109e057600080fd5b5061073d6109ef366004612e0a565b6119f0565b348015610a0057600080fd5b506103be611a28565b348015610a1557600080fd5b5061073d611b82565b348015610a2a57600080fd5b506103be611bbf565b348015610a3f57600080fd5b5061073d610a4e366004612da4565b611dbb565b348015610a5f57600080fd5b5061073d611dcb565b348015610a7457600080fd5b5060025461073d906001600160a01b031681565b348015610a9457600080fd5b506103be610aa3366004612d50565b611dfb565b6103be610ab6366004612d74565b611e74565b348015610ac757600080fd5b506103be610ad6366004612d50565b612379565b348015610ae757600080fd5b5061073d6124b6565b348015610afc57600080fd5b506103ed610b0b366004612da4565b60166020526000908152604090205481565b348015610b2957600080fd5b506103ed610b38366004612d50565b60116020526000908152604090205481565b610b60670de0b6b3a76400006302625a00612e4c565b81565b610b6b6124e4565b6001600160a01b038116610bb85760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b6001600160a01b0381166000908152601e602052604090205460ff16610c145760405162461bcd60e51b815260206004820152601160248201527010591d9a5cdbdc881b9bdd08199bdd5b99607a1b6044820152606401610baf565b6001600160a01b0381166000818152601e6020526040808220805460ff19169055517fd4a6ffced9053f299bd4faabab08c87e208109894dd8437522c15f656a73ffc89190a250565b600080610c6e601c80549050610e34565b905060005b8151811015610cd257336001600160a01b0316828281518110610c9857610c98612e6b565b60200260200101516001600160a01b031603610cc057610cb9816001612e81565b9250505090565b80610cca81612e99565b915050610c73565b50600091505090565b610ce361253e565b610d1982610cf084611763565b601260405180604001604052806008815260200167243cb832b934b7b760c11b81525085612597565b610d2260018055565b5050565b600080600360009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da09190612ed1565b5050509150506305f5e10081610db69190612f37565b91505090565b600080610dc7611b82565b90506001600160a01b038116610ddf57600091505090565b6001600160a01b03166000908152601b6020526040902054919050565b600c54600081815260166020526040812054909160089060048110610e2357610e23612e6b565b0154610e2f9190612f65565b905090565b6060600082118015610e485750601c548211155b610e895760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f704e2076616c756560701b6044820152606401610baf565b60008267ffffffffffffffff811115610ea457610ea4612f7c565b604051908082528060200260200182016040528015610ecd578160200160208202803683370190505b50905060008367ffffffffffffffff811115610eeb57610eeb612f7c565b604051908082528060200260200182016040528015610f14578160200160208202803683370190505b50905060005b84811015610ff257601c8181548110610f3557610f35612e6b565b9060005260206000200160009054906101000a90046001600160a01b0316838281518110610f6557610f65612e6b565b60200260200101906001600160a01b031690816001600160a01b031681525050601b6000601c8381548110610f9c57610f9c612e6b565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610fd557610fd5612e6b565b602090810291909101015280610fea81612e99565b915050610f1a565b506000611000600286612f92565b90505b80156110315761101f8284611019600185612f65565b88612a56565b8061102981612fa6565b915050611003565b50835b601c54811015611139576000601b6000601c848154811061105757611057612e6b565b60009182526020808320909101546001600160a01b03168352820192909252604001812054845190925084919061109057611090612e6b565b60200260200101518111156111265780836000815181106110b3576110b3612e6b565b602002602001018181525050601c82815481106110d2576110d2612e6b565b600091825260208220015485516001600160a01b039091169186916110f9576110f9612e6b565b60200260200101906001600160a01b031690816001600160a01b0316815250506111268385600089612a56565b508061113181612e99565b915050611034565b506000611147600186612f65565b90505b801561125c5781818151811061116257611162612e6b565b60200260200101518260008151811061117d5761117d612e6b565b60200260200101518360008151811061119857611198612e6b565b602002602001018484815181106111b1576111b1612e6b565b60200260200101828152508281525050508281815181106111d4576111d4612e6b565b6020026020010151836000815181106111ef576111ef612e6b565b60200260200101518460008151811061120a5761120a612e6b565b6020026020010185848151811061122357611223612e6b565b6001600160a01b0393841660209182029290920101529116905261124a8284600084612a56565b8061125481612fa6565b91505061114a565b50909392505050565b600081611274620668a0611510565b61127e9190612e4c565b92915050565b61128c61253e565b600c54600090815260186020908152604080832033808552925282205490916112b482611738565b9050600060646112c5601482612f65565b6112cf9084612e4c565b6112d99190612f92565b90506000831161133c5760405162461bcd60e51b815260206004820152602860248201527f596f752068617665206e6f74206465706f73697465642045544820696e2074686044820152671a5cc81c9bdd5b9960c21b6064820152608401610baf565b33600090815260106020526040812080549161135783612e99565b919050555082600d600082825461136e9190612f65565b9091555050600c5460009081526016602052604081208054859290611394908490612f65565b9091555050600c5460009081526018602090815260408083206001600160a01b0388168452909152812080548592906113ce908490612f65565b90915550506001600160a01b038416600090815260156020526040812080548592906113fb908490612f65565b90915550506001600160a01b03841660009081526017602052604081208054849290611428908490612f65565b90915550506040516000906001600160a01b0386169083908381818185875af1925050503d8060008114611478576040519150601f19603f3d011682016040523d82523d6000602084013e61147d565b606091505b505090508061149e5760405162461bcd60e51b8152600401610baf90612fbd565b60405184906001600160a01b038716907fb94c59e5f451678a47808bbdbce1a8d09619d3f2b545399e8870820292834e4390600090a350505050506114e260018055565b565b6000816112746208b290611510565b6114fb6124e4565b6114e26000612c20565b600080610dc7611dcb565b60008061151b610d26565b905060008161153185662386f26fc10000612e4c565b61153b9190612f92565b949350505050565b33301461159e5760405162461bcd60e51b8152602060048201526024808201527f4f6e6c7920636f6e74726163742063616e2063616c6c20746869732066756e636044820152633a34b7b760e11b6064820152608401610baf565b6003600c54146115e75760405162461bcd60e51b8152602060048201526014602482015273141c995cd85b19481b9bdd08199a5b9a5cda195960621b6044820152606401610baf565b60025447906001600160a01b0316635e9352978261160862679a9c82612f65565b6040518363ffffffff1660e01b815260040161162691815260200190565b6000604051808303818588803b15801561163f57600080fd5b505af1158015611653573d6000803e3d6000fd5b505050505050565b61166361253e565b610d198261167084611754565b60146040518060400160405280600681526020016548656361746560d01b81525085612597565b61169f61253e565b6116a76124e4565b306001600160a01b0316637745b6b46040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156116e257600080fd5b505af19250505080156116f3575060015b61170557601f805460ff191660011790555b6114e260018055565b601d818154811061171e57600080fd5b6000918252602090912001546001600160a01b0316905081565b600061174c670de0b6b3a764000083612f92565b611274611794565b60008161127462035b60611510565b600081611274620bbfd0611510565b600080610dc76124b6565b6004816004811061178d57600080fd5b0154905081565b6000610e2f6004600c54600481106117ae576117ae612e6b565b0154611510565b6008816004811061178d57600080fd5b6117cd61253e565b610d19826117da846114e4565b6011604051806040016040528060068152602001652a3934ba37b760d11b81525085612597565b61180961253e565b6002546040805163fdc61dd160e01b815290516000926001600160a01b03169163fdc61dd19160048083019260209291908290030181865afa158015611853573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118779190612fe6565b6001600160a01b0316036118c55760405162461bcd60e51b815260206004820152601560248201527410dbda5b881b9bdd0819195c1b1bde5959081e595d605a1b6044820152606401610baf565b33600090815260156020526040902054806119165760405162461bcd60e51b8152602060048201526011602482015270139bc81d1bdad95b9cc81d1bc81b5a5b9d607a1b6044820152606401610baf565b33600090815260106020526040812080549161193183612e99565b909155505033600081815260156020526040808220919091556002549051633c37699760e21b81526004810192909252602482018390526001600160a01b03169063f0dda65c90604401600060405180830381600087803b15801561199557600080fd5b505af11580156119a9573d6000803e3d6000fd5b50505050506114e260018055565b6119bf61253e565b610d19826119cc84611265565b60136040518060400160405280600381526020016209cf2f60eb1b81525085612597565b60196020528160005260406000208181548110611a0c57600080fd5b6000918252602090912001546001600160a01b03169150829050565b611a306124e4565b601f5460ff16611a825760405162461bcd60e51b815260206004820181905260248201527f456d657267656e6379207769746864726177206973206e6f74206163746976656044820152606401610baf565b4780611ac75760405162461bcd60e51b81526020600482015260146024820152734e6f2066756e647320746f20776974686472617760601b6044820152606401610baf565b60106000611add6000546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000908120805491611b0483612e99565b9091555050600080546040516001600160a01b03909116906207a12090849084818181858888f193505050503d8060008114611b5c576040519150601f19603f3d011682016040523d82523d6000602084013e611b61565b606091505b5050905080610d225760405162461bcd60e51b8152600401610baf90612fbd565b601c5460009060031115611b965750600090565b611ba06003610e34565b600281518110611bb257611bb2612e6b565b6020026020010151905090565b611bc761253e565b62eff100600f54611bd89190612e81565b4211611c265760405162461bcd60e51b815260206004820152601d60248201527f476c6f62616c2074696d6572206973206e6f7420656e646564207965740000006044820152606401610baf565b33600081815260176020526040812054906064611c44601482612f65565b611c4e9084612e4c565b611c589190612f92565b905060008211611cb85760405162461bcd60e51b815260206004820152602560248201527f596f752068617665206e6f2045544820617661696c61626c6520746f20776974604482015264686472617760d81b6064820152608401610baf565b336000908152601060205260408120805491611cd383612e99565b9091555050600c5460009081526018602090815260408083206001600160a01b0387168085529083528184208490556015835281842084905560179092528083208390555183908381818185875af1925050503d8060008114611d52576040519150601f19603f3d011682016040523d82523d6000602084013e611d57565b606091505b5050905080611d785760405162461bcd60e51b8152600401610baf90612fbd565b60405182906001600160a01b038616907fb94c59e5f451678a47808bbdbce1a8d09619d3f2b545399e8870820292834e4390600090a3505050506114e260018055565b601c818154811061171e57600080fd5b601c5460009060021115611ddf5750600090565b611de96002610e34565b600181518110611bb257611bb2612e6b565b611e036124e4565b6001600160a01b038116611e685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610baf565b611e7181612c20565b50565b611e7c61253e565b6000611e8783611738565b905060006064611e98601484612e4c565b611ea29190612f92565b905060008080611eb28486612f65565b905060008711611f045760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610baf565b611f1a670de0b6b3a76400006302625a00612e4c565b87600d54611f289190612e81565b1115611f765760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746f74616c20746f6b656e20737570706c790000000000006044820152606401610baf565b843414611fba5760405162461bcd60e51b8152602060048201526012602482015271125b98dbdc9c9958dd08115512081cd95b9d60721b6044820152606401610baf565b336000908152601060205260408120805491611fd583612e99565b90915550506001600160a01b0386161580159061200a57506001600160a01b0386166000908152601e602052604090205460ff165b1561204e57606461201c600a83612e4c565b6120269190612f92565b91506120328282612f65565b90506064612041600a83612e4c565b61204b9190612f92565b92505b336000908152601560205260408120805489929061206d908490612e81565b9091555050600c5460009081526016602052604081208054899290612093908490612e81565b9091555050600c546000908152601860209081526040808320338452909152812080548992906120c4908490612e81565b909155505033600090815260176020526040812080543492906120e8908490612e81565b9091555050336000908152601b60205260408120805434929061210c908490612e81565b9091555061211b905087612c70565b601c805460018101825560009182527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b0319163317905561216e6000546001600160a01b031690565b6001600160a01b03168560405160006040518083038185875af1925050503d80600081146121b8576040519150601f19603f3d011682016040523d82523d6000602084013e6121bd565b606091505b50509050806122085760405162461bcd60e51b8152602060048201526017602482015276151c985b9cd9995c881d1bc81d19585b4819985a5b1959604a1b6044820152606401610baf565b604051600090309084908381818185875af1925050503d806000811461224a576040519150601f19603f3d011682016040523d82523d6000602084013e61224f565b606091505b50509050806122a05760405162461bcd60e51b815260206004820152601b60248201527f5472616e7366657220746f20636f6e7472616374206661696c656400000000006044820152606401610baf565b831561233a57604051600090339086908381818185875af1925050503d80600081146122e8576040519150601f19603f3d011682016040523d82523d6000602084013e6122ed565b606091505b50509050806123385760405162461bcd60e51b81526020600482015260176024820152761499599d5b99081d1bc81cd95b99195c8819985a5b1959604a1b6044820152606401610baf565b505b60405134908a9033907f3ceffd410054fdaed44f598ff5c1fb450658778e2241892da4aa646979dee61790600090a450505050505050610d2260018055565b6123816124e4565b6001600160a01b0381166123c95760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610baf565b6001600160a01b0381166000908152601e602052604090205460ff161561242a5760405162461bcd60e51b815260206004820152601560248201527410591d9a5cdbdc88185b1c9958591e481859191959605a1b6044820152606401610baf565b6001600160a01b0381166000818152601e6020526040808220805460ff19166001908117909155601d8054918201815583527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b03191684179055517f750baf29cae521cdaad55df39e53298f98cc651ff7462166004f4d6df4e3aa499190a250565b601c5460009081036124c85750600090565b6124d26001610e34565b600081518110611bb257611bb2612e6b565b6000546001600160a01b031633146114e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610baf565b6002600154036125905760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610baf565b6002600155565b600085116125e75760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610baf565b83341461262b5760405162461bcd60e51b8152602060048201526012602482015271125b98dbdc9c9958dd08115512081cd95b9d60721b6044820152606401610baf565b33600090815260106020526040812080549161264683612e99565b909155508490506000806001600160a01b0384161580159061268057506001600160a01b0384166000908152601e602052604090205460ff165b156126d3576064612692600a89612e4c565b61269c9190612f92565b905060646126ab600a89612e4c565b6126b59190612f92565b9150816126c28289612f65565b6126cc9190612f65565b9250612751565b6001600160a01b0384161580159061270457506001600160a01b0384166000908152601e602052604090205460ff16155b156127515760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642061647669736f7220616464726573730000000000000000006044820152606401610baf565b33600090815260208790526040812080548a9290612770908490612e81565b90915550503360009081526017602052604081208054349290612794908490612e81565b9250508190555034600e60008282546127ad9190612e81565b9091555050336000908152601b6020526040812080543492906127d1908490612e81565b9091555050601c805460018101825560009182527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b031916331790556128296000546001600160a01b031690565b6001600160a01b03168460405160006040518083038185875af1925050503d8060008114612873576040519150601f19603f3d011682016040523d82523d6000602084013e612878565b606091505b50509050806128c35760405162461bcd60e51b8152602060048201526017602482015276151c985b9cd9995c881d1bc81d19585b4819985a5b1959604a1b6044820152606401610baf565b821561296e576000856001600160a01b03168460405160006040518083038185875af1925050503d8060008114612916576040519150601f19603f3d011682016040523d82523d6000602084013e61291b565b606091505b505090508061296c5760405162461bcd60e51b815260206004820152601a60248201527f5472616e7366657220746f2061647669736f72206661696c65640000000000006044820152606401610baf565b505b8115612a0857604051600090339084908381818185875af1925050503d80600081146129b6576040519150601f19603f3d011682016040523d82523d6000602084013e6129bb565b606091505b5050905080612a065760405162461bcd60e51b81526020600482015260176024820152761499599d5b99081d1bc81cd95b99195c8819985a5b1959604a1b6044820152606401610baf565b505b3489336001600160a01b03167fb9f9b5dbd785c981fe440f66a245e5fbf580a67f965da5fa353e63bb37d5368589604051612a439190613003565b60405180910390a4505050505050505050565b6000612a63836002612e4c565b612a6e906001612e81565b90506000612a7d846002612e4c565b612a88906002612e81565b9050838383108015612acb5750868181518110612aa757612aa7612e6b565b6020026020010151878481518110612ac157612ac1612e6b565b6020026020010151105b15612ad35750815b8382108015612b135750868181518110612aef57612aef612e6b565b6020026020010151878381518110612b0957612b09612e6b565b6020026020010151105b15612b1b5750805b848114612c1757868181518110612b3457612b34612e6b565b6020026020010151878681518110612b4e57612b4e612e6b565b6020026020010151888781518110612b6857612b68612e6b565b60200260200101898481518110612b8157612b81612e6b565b6020026020010182815250828152505050858181518110612ba457612ba4612e6b565b6020026020010151868681518110612bbe57612bbe612e6b565b6020026020010151878781518110612bd857612bd8612e6b565b60200260200101888481518110612bf157612bf1612e6b565b6001600160a01b03938416602091820292909201015291169052612c1787878387612a56565b50505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612c7a610dfc565b9050818110612ca05781600d6000828254612c959190612e81565b90915550610d229050565b6000612cac8284612f65565b905081600d6000828254612cc09190612e81565b9091555050600c5460031115612d1f57600c8054906000612ce083612e99565b9091555050600c546040517f023811fd72d20a3eb734785eed809172b5c9c24019d493039c70ef9c276d4d9790600090a2612d1a81612c70565b505050565b80600d6000828254612d319190612e81565b9091555050505050565b6001600160a01b0381168114611e7157600080fd5b600060208284031215612d6257600080fd5b8135612d6d81612d3b565b9392505050565b60008060408385031215612d8757600080fd5b823591506020830135612d9981612d3b565b809150509250929050565b600060208284031215612db657600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015612dfe5783516001600160a01b031683529284019291840191600101612dd9565b50909695505050505050565b60008060408385031215612e1d57600080fd5b8235612e2881612d3b565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612e6657612e66612e36565b500290565b634e487b7160e01b600052603260045260246000fd5b60008219821115612e9457612e94612e36565b500190565b600060018201612eab57612eab612e36565b5060010190565b805169ffffffffffffffffffff81168114612ecc57600080fd5b919050565b600080600080600060a08688031215612ee957600080fd5b612ef286612eb2565b9450602086015193506040860151925060608601519150612f1560808701612eb2565b90509295509295909350565b634e487b7160e01b600052601260045260246000fd5b600082612f4657612f46612f21565b600160ff1b821460001984141615612f6057612f60612e36565b500590565b600082821015612f7757612f77612e36565b500390565b634e487b7160e01b600052604160045260246000fd5b600082612fa157612fa1612f21565b500490565b600081612fb557612fb5612e36565b506000190190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b600060208284031215612ff857600080fd5b8151612d6d81612d3b565b600060208083528351808285015260005b8181101561303057858101830151858201604001528201613014565b81811115613042576000604083870101525b50601f01601f191692909201604001939250505056fea2646970667358221220146ccdac3e7236cefd5185910cccd65c9f74919cd2a6b07d43b016b80d9b5d0664736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009b027d11717f68b55424a9bf4461933062e07ddb
-----Decoded View---------------
Arg [0] : uniswapAndCoinManager_ (address): 0x9B027d11717F68b55424a9bf4461933062e07DDB
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000009b027d11717f68b55424a9bf4461933062e07ddb
Deployed Bytecode Sourcemap
12425:27915:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14959:59;;;;;;;;;;-1:-1:-1;14959:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;548:25:1;;;536:2;521:18;14959:59:0;;;;;;;;14294:32;;;;;;;;;;;;;;;;15234:58;;;;;;;;;;-1:-1:-1;15234:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;12791:54;;;;;;;;;;;;;:::i;17786:482::-;;;;;;;;;;-1:-1:-1;17786:482:0;;;;;:::i;:::-;;:::i;31247:409::-;;;;;;;;;;;;;:::i;22104:290::-;;;;;;:::i;:::-;;:::i;25091:159::-;;;;;;;;;;;;;:::i;12698:39::-;;;;;;;;;;;;12733:4;12698:39;;34426:382;;;;;;;;;;;;;:::i;35321:194::-;;;;;;;;;;;;;:::i;28557:1280::-;;;;;;;;;;-1:-1:-1;28557:1280:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;13320:50::-;;;;;;;;;;;;13359:11;13320:50;;14896:56;;;;;;;;;;-1:-1:-1;14896:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;13213:49;;;;;;;;;;;;13257:5;13213:49;;24373:140;;;;;;;;;;-1:-1:-1;24373:140:0;;;;;:::i;:::-;;:::i;39348:989::-;;;;;;;;;;;;;:::i;23540:146::-;;;;;;;;;;-1:-1:-1;23540:146:0;;;;;:::i;:::-;;:::i;14369:35::-;;;;;;;;;;;;;;;;3910:103;;;;;;;;;;;;;:::i;33832:390::-;;;;;;;;;;;;;:::i;14461:44::-;;;;;;;;;;;;;;;;25483:256;;;;;;;;;;-1:-1:-1;25483:256:0;;;;;:::i;:::-;;:::i;36529:348::-;;;;;;;;;;;;;:::i;22988:282::-;;;;;;:::i;:::-;;:::i;37523:178::-;;;;;;;;;;;;;:::i;14650:41::-;;;;;;;;;;-1:-1:-1;14650:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;16703:42;;;;;;;;;;-1:-1:-1;16703:42:0;;;;;;;;;;;2097:14:1;;2090:22;2072:41;;2060:2;2045:18;16703:42:0;1932:187:1;13736:44:0;;;;;;;;;;;;13778:2;13736:44;;13821:45;;;;;;;;;;;;13863:3;13821:45;;13112:46;;;;;;;;;;;;13153:5;13112:46;;3269:87;;;;;;;;;;-1:-1:-1;3315:7:0;3342:6;-1:-1:-1;;;;;3342:6:0;3269:87;;;-1:-1:-1;;;;;2288:32:1;;;2270:51;;2258:2;2243:18;3269:87:0;2124:203:1;15842:26:0;;;;;;;;;;-1:-1:-1;15842:26:0;;;;;:::i;:::-;;:::i;28070:146::-;;;;;;;;;;-1:-1:-1;28070:146:0;;;;;:::i;:::-;;:::i;15025:50::-;;;;;;;;;;-1:-1:-1;15025:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;24783:146;;;;;;;;;;-1:-1:-1;24783:146:0;;;;;:::i;:::-;;:::i;23962:150::-;;;;;;;;;;-1:-1:-1;23962:150:0;;;;;:::i;:::-;;:::i;33287:339::-;;;;;;;;;;;;;:::i;15710:45::-;;;;;;;;;;-1:-1:-1;15710:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;13521:47;;;;;;;;;;;;13566:2;13521:47;;13920:49;;;;;;;;;;-1:-1:-1;13920:49:0;;;;;:::i;:::-;;:::i;15345:88::-;;;;;;;;;;-1:-1:-1;15345:88:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;14555:36;;;;;;;;;;;;;;;;13434:37;;;;;;;;;;;;13470:1;13434:37;;12894:49;;;;;;;;;;;;12938:5;12894:49;;15607:61;;;;;;;;;;-1:-1:-1;15607:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;34976:134;;;;;;;;;;;;;:::i;14032:255::-;;;;;;;;;;-1:-1:-1;14032:255:0;;;;;:::i;:::-;;:::i;21653:282::-;;;;;;:::i;:::-;;:::i;14828:61::-;;;;;;;;;;-1:-1:-1;14828:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;36991:411;;;;;;;;;;;;;:::i;13001:51::-;;;;;;;;;;;;13047:5;13001:51;;22553:270;;;;;;:::i;:::-;;:::i;15492:63::-;;;;;;;;;;-1:-1:-1;15492:63:0;;;;;:::i;:::-;;:::i;37811:461::-;;;;;;;;;;;;;:::i;32828:276::-;;;;;;;;;;;;;:::i;38390:835::-;;;;;;;;;;;;;:::i;15762:30::-;;;;;;;;;;-1:-1:-1;15762:30:0;;;;;:::i;:::-;;:::i;32330:278::-;;;;;;;;;;;;;:::i;12485:52::-;;;;;;;;;;-1:-1:-1;12485:52:0;;;;-1:-1:-1;;;;;12485:52:0;;;4168:201;;;;;;;;;;-1:-1:-1;4168:201:0;;;;;:::i;:::-;;:::i;25885:1941::-;;;;;;:::i;:::-;;:::i;17049:562::-;;;;;;;;;;-1:-1:-1;17049:562:0;;;;;:::i;:::-;;:::i;31855:253::-;;;;;;;;;;;;;:::i;15135:54::-;;;;;;;;;;-1:-1:-1;15135:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;14762:59;;;;;;;;;;-1:-1:-1;14762:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;12791:54;12830:15;12733:4;12830;:15;:::i;:::-;12791:54;:::o;17786:482::-;3155:13;:11;:13::i;:::-;-1:-1:-1;;;;;17864:21:0;::::1;17856:49;;;::::0;-1:-1:-1;;;17856:49:0;;3397:2:1;17856:49:0::1;::::0;::::1;3379:21:1::0;3436:2;3416:18;;;3409:30;-1:-1:-1;;;3455:18:1;;;3448:45;3510:18;;17856:49:0::1;;;;;;;;;-1:-1:-1::0;;;;;17984:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;17976:53;;;::::0;-1:-1:-1;;;17976:53:0;;3741:2:1;17976:53:0::1;::::0;::::1;3723:21:1::0;3780:2;3760:18;;;3753:30;-1:-1:-1;;;3799:18:1;;;3792:47;3856:18;;17976:53:0::1;3539:341:1::0;17976:53:0::1;-1:-1:-1::0;;;;;18091:23:0;::::1;18117:5;18091:23:::0;;;:14:::1;:23;::::0;;;;;:31;;-1:-1:-1;;18091:31:0::1;::::0;;18175:23;::::1;::::0;18117:5;18175:23:::1;17786:482:::0;:::o;31247:409::-;31292:7;31312:35;31350:40;31369:13;:20;;;;31350:18;:40::i;:::-;31312:78;;31406:9;31401:170;31425:18;:25;31421:1;:29;31401:170;;;31501:10;-1:-1:-1;;;;;31476:35:0;:18;31495:1;31476:21;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;31476:35:0;;31472:88;;31539:5;:1;31543;31539:5;:::i;:::-;31532:12;;;;31247:409;:::o;31472:88::-;31452:3;;;;:::i;:::-;;;;31401:170;;;;31588:1;31581:8;;;31247:409;:::o;22104:290::-;7144:21;:19;:21::i;:::-;22204:182:::1;22236:6;22257:30;22280:6;22257:22;:30::i;:::-;22302:26;22204:182;;;;;;;;;;;;;-1:-1:-1::0;;;22204:182:0::1;;::::0;22368:7:::1;22204:17;:182::i;:::-;7188:20:::0;6582:1;7708:22;;7525:213;7188:20;22104:290;;:::o;25091:159::-;25145:3;25164:10;25184;;;;;;;;;-1:-1:-1;;;;;25184:10:0;-1:-1:-1;;;;;25184:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25161:51;;;;;;25239:3;25230:6;:12;;;;:::i;:::-;25223:19;;;25091:159;:::o;34426:382::-;34485:7;34505:23;34531:20;:18;:20::i;:::-;34505:46;-1:-1:-1;;;;;;34611:29:0;;34607:43;;34649:1;34642:8;;;34426:382;:::o;34607:43::-;-1:-1:-1;;;;;34714:27:0;;;;;:10;:27;;;;;;;34426:382;-1:-1:-1;34426:382:0:o;35321:194::-;35493:13;;35385:7;35473:34;;;:19;:34;;;;;;35385:7;;35425:17;;:32;;;;;;;:::i;:::-;;;:82;;;;:::i;:::-;35405:102;;35321:194;:::o;28557:1280::-;28620:16;28664:1;28657:4;:8;:40;;;;-1:-1:-1;28677:13:0;:20;28669:28;;;28657:40;28649:71;;;;-1:-1:-1;;;28649:71:0;;5614:2:1;28649:71:0;;;5596:21:1;5653:2;5633:18;;;5626:30;-1:-1:-1;;;5672:18:1;;;5665:48;5730:18;;28649:71:0;5412:342:1;28649:71:0;28731:32;28780:4;28766:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28766:19:0;;28731:54;;28796:27;28840:4;28826:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28826:19:0;;28796:49;;28861:9;28856:158;28880:4;28876:1;:8;28856:158;;;28927:13;28941:1;28927:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28927:16:0;28906:15;28922:1;28906:18;;;;;;;;:::i;:::-;;;;;;:37;-1:-1:-1;;;;;28906:37:0;;;-1:-1:-1;;;;;28906:37:0;;;;;28974:10;:28;28985:13;28999:1;28985:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28985:16:0;28974:28;;;;;;;;;;;;;28958:13;;:10;;28969:1;;28958:13;;;;;;:::i;:::-;;;;;;;;;;:44;28886:3;;;;:::i;:::-;;;;28856:158;;;-1:-1:-1;29029:9:0;29041:8;29048:1;29041:4;:8;:::i;:::-;29029:20;;29024:119;29051:5;;29024:119;;29078:53;29090:10;29102:15;29119:5;29123:1;29119;:5;:::i;:::-;29126:4;29078:11;:53::i;:::-;29058:3;;;;:::i;:::-;;;;29024:119;;;-1:-1:-1;29170:4:0;29153:346;29180:13;:20;29176:24;;29153:346;;;29222:13;29238:10;:28;29249:13;29263:1;29249:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29249:16:0;29238:28;;;;;;;;;;;;;29293:13;;29238:28;;-1:-1:-1;29293:10:0;;29249:16;29293:13;;;;:::i;:::-;;;;;;;29285:5;:21;29281:207;;;29343:5;29327:10;29338:1;29327:13;;;;;;;;:::i;:::-;;;;;;:21;;;;;29388:13;29402:1;29388:16;;;;;;;;:::i;:::-;;;;;;;;;;29367:18;;-1:-1:-1;;;;;29388:16:0;;;;29367:15;;:18;;;;:::i;:::-;;;;;;:37;-1:-1:-1;;;;;29367:37:0;;;-1:-1:-1;;;;;29367:37:0;;;;;29423:49;29435:10;29447:15;29464:1;29467:4;29423:11;:49::i;:::-;-1:-1:-1;29202:3:0;;;;:::i;:::-;;;;29153:346;;;-1:-1:-1;29514:9:0;29526:8;29533:1;29526:4;:8;:::i;:::-;29514:20;;29509:288;29536:5;;29509:288;;29597:10;29608:1;29597:13;;;;;;;;:::i;:::-;;;;;;;29612:10;29623:1;29612:13;;;;;;;;:::i;:::-;;;;;;;29564:10;29575:1;29564:13;;;;;;;;:::i;:::-;;;;;;29579:10;29590:1;29579:13;;;;;;;;:::i;:::-;;;;;;29563:63;;;;;;;;;;29685:15;29701:1;29685:18;;;;;;;;:::i;:::-;;;;;;;29705:15;29721:1;29705:18;;;;;;;;:::i;:::-;;;;;;;29642:15;29658:1;29642:18;;;;;;;;:::i;:::-;;;;;;29662:15;29678:1;29662:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29641:83:0;;;29662:18;;;;;;;;;29641:83;;;;;29739:46;29751:10;29763:15;29780:1;29783;29739:11;:46::i;:::-;29543:3;;;;:::i;:::-;;;;29509:288;;;-1:-1:-1;29814:15:0;;28557:1280;-1:-1:-1;;;28557:1280:0:o;24373:140::-;24437:7;24499:6;24464:32;13153:5;24464:16;:32::i;:::-;:41;;;;:::i;:::-;24457:48;24373:140;-1:-1:-1;;24373:140:0:o;39348:989::-;7144:21;:19;:21::i;:::-;39511:13:::1;::::0;39401:25:::1;39482:43:::0;;;:28:::1;:43;::::0;;;;;;;39437:10:::1;39482:54:::0;;;;;;;;39437:10;;39574:33:::1;39482:54:::0;39574:19:::1;:33::i;:::-;39547:60:::0;-1:-1:-1;39618:25:0::1;13863:3;39667:33;13778:2;13863:3:::0;39667:33:::1;:::i;:::-;39647:54;::::0;:16;:54:::1;:::i;:::-;39646:74;;;;:::i;:::-;39618:102;;39773:1;39758:12;:16;39750:69;;;::::0;-1:-1:-1;;;39750:69:0;;6359:2:1;39750:69:0::1;::::0;::::1;6341:21:1::0;6398:2;6378:18;;;6371:30;6437:34;6417:18;;;6410:62;-1:-1:-1;;;6488:18:1;;;6481:38;6536:19;;39750:69:0::1;6157:404:1::0;39750:69:0::1;39837:10;39830:18;::::0;;;:6:::1;:18;::::0;;;;:20;;;::::1;::::0;::::1;:::i;:::-;;;;;;39881:12;39861:16;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;39924:13:0::1;::::0;39904:34:::1;::::0;;;:19:::1;:34;::::0;;;;:50;;39942:12;;39904:34;:50:::1;::::0;39942:12;;39904:50:::1;:::i;:::-;::::0;;;-1:-1:-1;;39994:13:0::1;::::0;39965:43:::1;::::0;;;:28:::1;:43;::::0;;;;;;;-1:-1:-1;;;;;39965:54:0;::::1;::::0;;;;;;;:70;;40023:12;;39965:43;:70:::1;::::0;40023:12;;39965:70:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;40046:26:0;::::1;;::::0;;;:15:::1;:26;::::0;;;;:42;;40076:12;;40046:26;:42:::1;::::0;40076:12;;40046:42:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;40099:34:0;::::1;;::::0;;;:23:::1;:34;::::0;;;;:54;;40137:16;;40099:34;:54:::1;::::0;40137:16;;40099:54:::1;:::i;:::-;::::0;;;-1:-1:-1;;40183:44:0::1;::::0;40165:12:::1;::::0;-1:-1:-1;;;;;40183:14:0;::::1;::::0;40205:17;;40165:12;40183:44;40165:12;40183:44;40205:17;40183:14;:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40164:63;;;40246:7;40238:35;;;;-1:-1:-1::0;;;40238:35:0::1;;;;;;;:::i;:::-;40289:40;::::0;40316:12;;-1:-1:-1;;;;;40289:40:0;::::1;::::0;::::1;::::0;;;::::1;39390:947;;;;;7188:20:::0;6582:1;7708:22;;7525:213;7188:20;39348:989::o;23540:146::-;23607:7;23672:6;23634:35;12938:5;23634:16;:35::i;3910:103::-;3155:13;:11;:13::i;:::-;3975:30:::1;4002:1;3975:18;:30::i;33832:390::-:0;33892:7;33912:24;33939:21;:19;:21::i;25483:256::-;25556:7;25576:23;25610;:21;:23::i;:::-;25576:58;-1:-1:-1;25645:14:0;25576:58;25664:23;:16;25683:4;25664:23;:::i;:::-;25663:43;;;;:::i;:::-;25645:62;25483:256;-1:-1:-1;;;;25483:256:0:o;36529:348::-;36586:10;36608:4;36586:27;36578:76;;;;-1:-1:-1;;;36578:76:0;;7322:2:1;36578:76:0;;;7304:21:1;7361:2;7341:18;;;7334:30;7400:34;7380:18;;;7373:62;-1:-1:-1;;;7451:18:1;;;7444:34;7495:19;;36578:76:0;7120:400:1;36578:76:0;13470:1;36673:13;;:26;36665:59;;;;-1:-1:-1;;;36665:59:0;;7727:2:1;36665:59:0;;;7709:21:1;7766:2;7746:18;;;7739:30;-1:-1:-1;;;7785:18:1;;;7778:50;7845:18;;36665:59:0;7525:344:1;36665:59:0;36788:22;;36756:21;;-1:-1:-1;;;;;36788:22:0;:40;36756:21;36848:20;36861:7;36756:21;36848:20;:::i;:::-;36788:81;;;;;;;;;;;;;548:25:1;;536:2;521:18;;402:177;36788:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36567:310;36529:348::o;22988:282::-;7144:21;:19;:21::i;:::-;23086:176:::1;23118:6;23139:28;23160:6;23139:20;:28::i;:::-;23182:24;23086:176;;;;;;;;;;;;;-1:-1:-1::0;;;23086:176:0::1;;::::0;23244:7:::1;23086:17;:176::i;37523:178::-:0;7144:21;:19;:21::i;:::-;3155:13:::1;:11;:13::i;:::-;37604:4:::2;-1:-1:-1::0;;;;;37604:22:0::2;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;37600:94;;37653:22;:29:::0;;-1:-1:-1;;37653:29:0::2;37678:4;37653:29;::::0;;37600:94:::2;7188:20:::0;6582:1;7708:22;;7525:213;15842:26;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15842:26:0;;-1:-1:-1;15842:26:0;:::o;28070:146::-;28136:7;28190:17;12733:4;28190:6;:17;:::i;:::-;28163:23;:21;:23::i;24783:146::-;24850:7;24915:6;24877:35;13257:5;24877:16;:35::i;23962:150::-;24031:7;24098:6;24058:37;13047:5;24058:16;:37::i;33287:339::-;33341:7;33361:18;33382:15;:13;:15::i;13920:49::-;;;;;;;;;;;;;;;-1:-1:-1;13920:49:0;:::o;34976:134::-;35030:7;35057:45;35074:12;35087:13;;35074:27;;;;;;;:::i;:::-;;;35057:16;:45::i;14032:255::-;;;;;;;;;;;21653:282;7144:21;:19;:21::i;:::-;21751:176:::1;21783:6;21804:28;21825:6;21804:20;:28::i;:::-;21847:24;21751:176;;;;;;;;;;;;;-1:-1:-1::0;;;21751:176:0::1;;::::0;21909:7:::1;21751:17;:176::i;36991:411::-:0;7144:21;:19;:21::i;:::-;37056:22:::1;::::0;:36:::1;::::0;;-1:-1:-1;;;37056:36:0;;;;37104:1:::1;::::0;-1:-1:-1;;;;;37056:22:0::1;::::0;:34:::1;::::0;:36:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:22;:36:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37056:50:0::1;::::0;37048:84:::1;;;::::0;-1:-1:-1;;;37048:84:0;;8332:2:1;37048:84:0::1;::::0;::::1;8314:21:1::0;8371:2;8351:18;;;8344:30;-1:-1:-1;;;8390:18:1;;;8383:51;8451:18;;37048:84:0::1;8130:345:1::0;37048:84:0::1;37182:10;37143:20;37166:27:::0;;;:15:::1;:27;::::0;;;;;37212:16;37204:46:::1;;;::::0;-1:-1:-1;;;37204:46:0;;8682:2:1;37204:46:0::1;::::0;::::1;8664:21:1::0;8721:2;8701:18;;;8694:30;-1:-1:-1;;;8740:18:1;;;8733:47;8797:18;;37204:46:0::1;8480:341:1::0;37204:46:0::1;37269:10;37262:18;::::0;;;:6:::1;:18;::::0;;;;:20;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;37309:10:0::1;37323:1;37293:27:::0;;;:15:::1;:27;::::0;;;;;:31;;;;37335:22:::1;::::0;:59;;-1:-1:-1;;;37335:59:0;;::::1;::::0;::::1;9000:51:1::0;;;;9067:18;;;9060:34;;;-1:-1:-1;;;;;37335:22:0::1;::::0;:33:::1;::::0;8973:18:1;;37335:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37037:365;7188:20:::0;6582:1;7708:22;;7525:213;22553:270;7144:21;:19;:21::i;:::-;22648:167:::1;22680:6;22701:25;22719:6;22701:17;:25::i;:::-;22741:21;22648:167;;;;;;;;;;;;;-1:-1:-1::0;;;22648:167:0::1;;::::0;22797:7:::1;22648:17;:167::i;15492:63::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15492:63:0;;-1:-1:-1;15492:63:0;;-1:-1:-1;15492:63:0:o;37811:461::-;3155:13;:11;:13::i;:::-;37878:22:::1;::::0;::::1;;37870:67;;;::::0;-1:-1:-1;;;37870:67:0;;9307:2:1;37870:67:0::1;::::0;::::1;9289:21:1::0;;;9326:18;;;9319:30;9385:34;9365:18;;;9358:62;9437:18;;37870:67:0::1;9105:356:1::0;37870:67:0::1;37975:21;38015:20:::0;38007:53:::1;;;::::0;-1:-1:-1;;;38007:53:0;;9668:2:1;38007:53:0::1;::::0;::::1;9650:21:1::0;9707:2;9687:18;;;9680:30;-1:-1:-1;;;9726:18:1;;;9719:50;9786:18;;38007:53:0::1;9466:344:1::0;38007:53:0::1;38071:6;:15;38078:7;3315::::0;3342:6;-1:-1:-1;;;;;3342:6:0;;3269:87;38078:7:::1;-1:-1:-1::0;;;;;38071:15:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;38071:15:0;;;:17;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;38100:12:0::1;3342:6:::0;;38118:100:::1;::::0;-1:-1:-1;;;;;3342:6:0;;;;38197::::1;::::0;38161:16;;38100:12;38118:100;38100:12;38118:100;38161:16;3342:6;38197;38118:100:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38099:119;;;38237:7;38229:35;;;;-1:-1:-1::0;;;38229:35:0::1;;;;;;;:::i;32828:276::-:0;32903:13;:20;32879:7;;32926:1;-1:-1:-1;32899:47:0;;;-1:-1:-1;32944:1:0;;32828:276::o;32899:47::-;33024:21;33043:1;33024:18;:21::i;:::-;33046:1;33024:24;;;;;;;;:::i;:::-;;;;;;;33017:31;;32828:276;:::o;38390:835::-;7144:21;:19;:21::i;:::-;13359:11:::1;38486:17;;:32;;;;:::i;:::-;38468:15;:50;38460:91;;;::::0;-1:-1:-1;;;38460:91:0;;10017:2:1;38460:91:0::1;::::0;::::1;9999:21:1::0;10056:2;10036:18;;;10029:30;10095:31;10075:18;;;10068:59;10144:18;;38460:91:0::1;9815:353:1::0;38460:91:0::1;38598:10;38562:25;38639:34:::0;;;:23:::1;:34;::::0;;;;;;13863:3:::1;38717:33;13778:2;13863:3:::0;38717:33:::1;:::i;:::-;38705:46;::::0;:8;:46:::1;:::i;:::-;38704:66;;;;:::i;:::-;38684:86;;38819:1;38808:8;:12;38800:62;;;::::0;-1:-1:-1;;;38800:62:0;;10375:2:1;38800:62:0::1;::::0;::::1;10357:21:1::0;10414:2;10394:18;;;10387:30;10453:34;10433:18;;;10426:62;-1:-1:-1;;;10504:18:1;;;10497:35;10549:19;;38800:62:0::1;10173:401:1::0;38800:62:0::1;38880:10;38873:18;::::0;;;:6:::1;:18;::::0;;;;:20;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;38933:13:0::1;::::0;38961:1:::1;38904:43:::0;;;:28:::1;:43;::::0;;;;;;;-1:-1:-1;;;;;38904:54:0;::::1;::::0;;;;;;;;;:58;;;38973:15:::1;:26:::0;;;;;:30;;;39014:23:::1;:34:::0;;;;;;:38;;;39082:36;39104:9;;38961:1;39082:36;38961:1;39082:36;39104:9;38904:54;39082:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39063:55;;;39137:7;39129:35;;;;-1:-1:-1::0;;;39129:35:0::1;;;;;;;:::i;:::-;39180:37;::::0;39207:9;;-1:-1:-1;;;;;39180:37:0;::::1;::::0;::::1;::::0;;;::::1;38449:776;;;;7188:20:::0;6582:1;7708:22;;7525:213;15762:30;;;;;;;;;;;;32330:278;32406:13;:20;32382:7;;32429:1;-1:-1:-1;32402:47:0;;;-1:-1:-1;32447:1:0;;32330:278::o;32402:47::-;32527:21;32546:1;32527:18;:21::i;:::-;32549:1;32527:24;;;;;;;;:::i;4168:201::-;3155:13;:11;:13::i;:::-;-1:-1:-1;;;;;4257:22:0;::::1;4249:73;;;::::0;-1:-1:-1;;;4249:73:0;;10781:2:1;4249:73:0::1;::::0;::::1;10763:21:1::0;10820:2;10800:18;;;10793:30;10859:34;10839:18;;;10832:62;-1:-1:-1;;;10910:18:1;;;10903:36;10956:19;;4249:73:0::1;10579:402:1::0;4249:73:0::1;4333:28;4352:8;4333:18;:28::i;:::-;4168:201:::0;:::o;25885:1941::-;7144:21;:19;:21::i;:::-;25982:13:::1;25998:27;26018:6;25998:19;:27::i;:::-;25982:43:::0;-1:-1:-1;26036:17:0::1;13863:3;26057:23;13778:2;25982:43:::0;26057:23:::1;:::i;:::-;26056:43;;;;:::i;:::-;26036:63:::0;-1:-1:-1;26110:20:0::1;::::0;;26209:17:::1;26036:63:::0;26209:5;:17:::1;:::i;:::-;26182:44;;26254:1;26245:6;:10;26237:52;;;::::0;-1:-1:-1;;;26237:52:0;;11188:2:1;26237:52:0::1;::::0;::::1;11170:21:1::0;11227:2;11207:18;;;11200:30;11266:31;11246:18;;;11239:59;11315:18;;26237:52:0::1;10986:353:1::0;26237:52:0::1;12830:15;12733:4;12830;:15;:::i;:::-;26327:6;26308:16;;:25;;;;:::i;:::-;:41;;26300:80;;;::::0;-1:-1:-1;;;26300:80:0;;11546:2:1;26300:80:0::1;::::0;::::1;11528:21:1::0;11585:2;11565:18;;;11558:30;11624:28;11604:18;;;11597:56;11670:18;;26300:80:0::1;11344:350:1::0;26300:80:0::1;26412:5;26399:9;:18;26391:49;;;::::0;-1:-1:-1;;;26391:49:0;;11901:2:1;26391:49:0::1;::::0;::::1;11883:21:1::0;11940:2;11920:18;;;11913:30;-1:-1:-1;;;11959:18:1;;;11952:48;12017:18;;26391:49:0::1;11699:342:1::0;26391:49:0::1;26458:10;26451:18;::::0;;;:6:::1;:18;::::0;;;;:20;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;26486:21:0;::::1;::::0;;::::1;::::0;:48:::1;;-1:-1:-1::0;;;;;;26511:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;26486:48;26482:424;;;13863:3;26570:36;13683:2;26570:16:::0;:36:::1;:::i;:::-;26569:56;;;;:::i;:::-;26552:73:::0;-1:-1:-1;26697:33:0::1;26552:73:::0;26697:16;:33:::1;:::i;:::-;26678:52:::0;-1:-1:-1;13863:3:0::1;26805:37;13566:2;26678:52:::0;26805:37:::1;:::i;:::-;26804:57;;;;:::i;:::-;26789:72;;26482:424;26933:10;26917:27;::::0;;;:15:::1;:27;::::0;;;;:37;;26948:6;;26917:27;:37:::1;::::0;26948:6;;26917:37:::1;:::i;:::-;::::0;;;-1:-1:-1;;26985:13:0::1;::::0;26965:34:::1;::::0;;;:19:::1;:34;::::0;;;;:44;;27003:6;;26965:34;:44:::1;::::0;27003:6;;26965:44:::1;:::i;:::-;::::0;;;-1:-1:-1;;27049:13:0::1;::::0;27020:43:::1;::::0;;;:28:::1;:43;::::0;;;;;;;27064:10:::1;27020:55:::0;;;;;;;:65;;27079:6;;27020:43;:65:::1;::::0;27079:6;;27020:65:::1;:::i;:::-;::::0;;;-1:-1:-1;;27120:10:0::1;27096:35;::::0;;;:23:::1;:35;::::0;;;;:48;;27135:9:::1;::::0;27096:35;:48:::1;::::0;27135:9;;27096:48:::1;:::i;:::-;::::0;;;-1:-1:-1;;27166:10:0::1;27155:22;::::0;;;:10:::1;:22;::::0;;;;:35;;27181:9:::1;::::0;27155:22;:35:::1;::::0;27181:9;;27155:35:::1;:::i;:::-;::::0;;;-1:-1:-1;27201:28:0::1;::::0;-1:-1:-1;27222:6:0;27201:20:::1;:28::i;:::-;27240:13;:30:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;27240:30:0;;;;::::1;::::0;;-1:-1:-1;;;;;;27240:30:0::1;27259:10;27240:30;::::0;;27312:7:::1;3315::::0;3342:6;-1:-1:-1;;;;;3342:6:0;;3269:87;27312:7:::1;-1:-1:-1::0;;;;;27304:21:0::1;27333:9;27304:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27281:66;;;27366:11;27358:47;;;::::0;-1:-1:-1;;;27358:47:0;;12248:2:1;27358:47:0::1;::::0;::::1;12230:21:1::0;12287:2;12267:18;;;12260:30;-1:-1:-1;;;12306:18:1;;;12299:53;12369:18;;27358:47:0::1;12046:347:1::0;27358:47:0::1;27443;::::0;27417:20:::1;::::0;27451:4:::1;::::0;27469:16;;27417:20;27443:47;27417:20;27443:47;27469:16;27451:4;27443:47:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27416:74;;;27509:15;27501:55;;;::::0;-1:-1:-1;;;27501:55:0;;12600:2:1;27501:55:0::1;::::0;::::1;12582:21:1::0;12639:2;12619:18;;;12612:30;12678:29;12658:18;;;12651:57;12725:18;;27501:55:0::1;12398:351:1::0;27501:55:0::1;27571:18:::0;;27567:191:::1;;27631:51;::::0;27607:18:::1;::::0;27639:10:::1;::::0;27663:14;;27607:18;27631:51;27607:18;27631:51;27663:14;27639:10;27631:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27606:76;;;27705:13;27697:49;;;::::0;-1:-1:-1;;;27697:49:0;;12956:2:1;27697:49:0::1;::::0;::::1;12938:21:1::0;12995:2;12975:18;;;12968:30;-1:-1:-1;;;13014:18:1;;;13007:53;13077:18;;27697:49:0::1;12754:347:1::0;27697:49:0::1;27591:167;27567:191;27773:45;::::0;27808:9:::1;::::0;27800:6;;27788:10:::1;::::0;27773:45:::1;::::0;;;::::1;25971:1855;;;;;;;7188:20:::0;6582:1;7708:22;;7525:213;17049:562;3155:13;:11;:13::i;:::-;-1:-1:-1;;;;;17124:21:0;::::1;17116:49;;;::::0;-1:-1:-1;;;17116:49:0;;3397:2:1;17116:49:0::1;::::0;::::1;3379:21:1::0;3436:2;3416:18;;;3409:30;-1:-1:-1;;;3455:18:1;;;3448:45;3510:18;;17116:49:0::1;3195:339:1::0;17116:49:0::1;-1:-1:-1::0;;;;;17245:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;17244:24;17236:58;;;::::0;-1:-1:-1;;;17236:58:0;;13308:2:1;17236:58:0::1;::::0;::::1;13290:21:1::0;13347:2;13327:18;;;13320:30;-1:-1:-1;;;13366:18:1;;;13359:51;13427:18;;17236:58:0::1;13106:345:1::0;17236:58:0::1;-1:-1:-1::0;;;;;17358:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:30;;-1:-1:-1;;17358:30:0::1;17384:4;17358:30:::0;;::::1;::::0;;;17434:9:::1;:23:::0;;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;17434:23:0::1;::::0;::::1;::::0;;17522:21;::::1;::::0;17358:23;17522:21:::1;17049:562:::0;:::o;31855:253::-;31925:13;:20;31901:7;;31925:25;;31921:48;;-1:-1:-1;31967:1:0;;31855:253::o;31921:48::-;32034:21;32053:1;32034:18;:21::i;:::-;32056:1;32034:24;;;;;;;;:::i;3434:132::-;3315:7;3342:6;-1:-1:-1;;;;;3342:6:0;1723:10;3498:23;3490:68;;;;-1:-1:-1;;;3490:68:0;;13658:2:1;3490:68:0;;;13640:21:1;;;13677:18;;;13670:30;13736:34;13716:18;;;13709:62;13788:18;;3490:68:0;13456:356:1;7224:293:0;6626:1;7358:7;;:19;7350:63;;;;-1:-1:-1;;;7350:63:0;;14019:2:1;7350:63:0;;;14001:21:1;14058:2;14038:18;;;14031:30;14097:33;14077:18;;;14070:61;14148:18;;7350:63:0;13817:355:1;7350:63:0;6626:1;7491:7;:18;7224:293::o;19278:2210::-;19522:1;19513:6;:10;19505:52;;;;-1:-1:-1;;;19505:52:0;;11188:2:1;19505:52:0;;;11170:21:1;11227:2;11207:18;;;11200:30;11266:31;11246:18;;;11239:59;11315:18;;19505:52:0;10986:353:1;19505:52:0;19589:10;19576:9;:23;19568:54;;;;-1:-1:-1;;;19568:54:0;;11901:2:1;19568:54:0;;;11883:21:1;11940:2;11920:18;;;11913:30;-1:-1:-1;;;11959:18:1;;;11952:48;12017:18;;19568:54:0;11699:342:1;19568:54:0;19640:10;19633:18;;;;:6;:18;;;;;:20;;;;;;:::i;:::-;;;;-1:-1:-1;19684:10:0;;-1:-1:-1;19664:17:0;;-1:-1:-1;;;;;19833:21:0;;;;;;:48;;-1:-1:-1;;;;;;19858:23:0;;;;;;:14;:23;;;;;;;;19833:48;19829:538;;;13863:3;19916:30;13683:2;19916:10;:30;:::i;:::-;19915:50;;;;:::i;:::-;19898:67;-1:-1:-1;13863:3:0;20036:31;13566:2;20036:10;:31;:::i;:::-;20035:51;;;;:::i;:::-;20020:66;-1:-1:-1;20020:66:0;20146:27;20159:14;20146:10;:27;:::i;:::-;:42;;;;:::i;:::-;20134:54;;19829:538;;;-1:-1:-1;;;;;20256:21:0;;;;;;:49;;-1:-1:-1;;;;;;20282:23:0;;;;;;:14;:23;;;;;;;;20281:24;20256:49;20252:115;;;20322:33;;-1:-1:-1;;;20322:33:0;;14379:2:1;20322:33:0;;;14361:21:1;14418:2;14398:18;;;14391:30;14457:25;14437:18;;;14430:53;14500:18;;20322:33:0;14177:347:1;20252:115:0;20387:10;20377:21;;;;;;;;;;;:31;;20402:6;;20377:21;:31;;20402:6;;20377:31;:::i;:::-;;;;-1:-1:-1;;20488:10:0;20464:35;;;;:23;:35;;;;;:48;;20503:9;;20464:35;:48;;20503:9;;20464:48;:::i;:::-;;;;;;;;20596:9;20567:25;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;20670:10:0;20659:22;;;;:10;:22;;;;;:35;;20685:9;;20659:22;:35;;20685:9;;20659:35;:::i;:::-;;;;-1:-1:-1;;20751:13:0;:30;;;;;;;-1:-1:-1;20751:30:0;;;;;;;-1:-1:-1;;;;;;20751:30:0;20770:10;20751:30;;;20875:7;3315;3342:6;-1:-1:-1;;;;;3342:6:0;;3269:87;20875:7;-1:-1:-1;;;;;20867:21:0;20896:9;20867:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20844:66;;;20929:11;20921:47;;;;-1:-1:-1;;;20921:47:0;;12248:2:1;20921:47:0;;;12230:21:1;12287:2;12267:18;;;12260:30;-1:-1:-1;;;12306:18:1;;;12299:53;12369:18;;20921:47:0;12046:347:1;20921:47:0;20983:16;;20979:189;;21017:19;21050:7;-1:-1:-1;;;;;21042:21:0;21071:12;21042:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21016:72;;;21111:14;21103:53;;;;-1:-1:-1;;;21103:53:0;;14731:2:1;21103:53:0;;;14713:21:1;14770:2;14750:18;;;14743:30;14809:28;14789:18;;;14782:56;14855:18;;21103:53:0;14529:350:1;21103:53:0;21001:167;20979:189;21182:18;;21178:191;;21242:51;;21218:18;;21250:10;;21274:14;;21218:18;21242:51;21218:18;21242:51;21274:14;21250:10;21242:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21217:76;;;21316:13;21308:49;;;;-1:-1:-1;;;21308:49:0;;12956:2:1;21308:49:0;;;12938:21:1;12995:2;12975:18;;;12968:30;-1:-1:-1;;;13014:18:1;;;13007:53;13077:18;;21308:49:0;12754:347:1;21308:49:0;21202:167;21178:191;21422:9;21414:6;21402:10;-1:-1:-1;;;;;21384:62:0;;21433:12;21384:62;;;;;;:::i;:::-;;;;;;;;19494:1994;;;;19278:2210;;;;;:::o;30168:855::-;30349:12;30364:9;30368:5;30364:1;:9;:::i;:::-;:13;;30376:1;30364:13;:::i;:::-;30349:28;-1:-1:-1;30388:13:0;30404:9;30408:5;30404:1;:9;:::i;:::-;:13;;30416:1;30404:13;:::i;:::-;30388:29;-1:-1:-1;30447:5:0;30467:11;;;:54;;;;;30501:10;30512:8;30501:20;;;;;;;;:::i;:::-;;;;;;;30482:10;30493:4;30482:16;;;;;;;;:::i;:::-;;;;;;;:39;30467:54;30463:102;;;-1:-1:-1;30549:4:0;30463:102;30587:4;30579:5;:12;:56;;;;;30615:10;30626:8;30615:20;;;;;;;;:::i;:::-;;;;;;;30595:10;30606:5;30595:17;;;;;;;;:::i;:::-;;;;;;;:40;30579:56;30575:105;;;-1:-1:-1;30663:5:0;30575:105;30706:5;30694:8;:17;30690:326;;30773:10;30784:8;30773:20;;;;;;;;:::i;:::-;;;;;;;30795:10;30806:5;30795:17;;;;;;;;:::i;:::-;;;;;;;30729:10;30740:5;30729:17;;;;;;;;:::i;:::-;;;;;;30748:10;30759:8;30748:20;;;;;;;;:::i;:::-;;;;;;30728:85;;;;;;;;;;30883:15;30899:8;30883:25;;;;;;;;:::i;:::-;;;;;;;30910:15;30926:5;30910:22;;;;;;;;:::i;:::-;;;;;;;30829:15;30845:5;30829:22;;;;;;;;:::i;:::-;;;;;;30853:15;30869:8;30853:25;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30828:105:0;;;30853:25;;;;;;;;;30828:105;;;;;30948:56;30960:10;30972:15;30989:8;30999:4;30948:11;:56::i;:::-;30338:685;;;30168:855;;;;:::o;4529:191::-;4603:16;4622:6;;-1:-1:-1;;;;;4639:17:0;;;-1:-1:-1;;;;;;4639:17:0;;;;;;4672:40;;4622:6;;;;;;;4672:40;;4603:16;4672:40;4592:128;4529:191;:::o;35741:678::-;35807:35;35845:33;:31;:33::i;:::-;35807:71;;35924:6;35893:27;:37;35889:523;;35967:6;35947:16;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;35889:523:0;;-1:-1:-1;35889:523:0;;36006:20;36029:36;36038:27;36029:6;:36;:::i;:::-;36006:59;;36100:27;36080:16;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;36146:13:0;;13470:1;-1:-1:-1;36142:259:0;;;36192:13;:15;;;:13;:15;;;:::i;:::-;;;;-1:-1:-1;;36245:13:0;;36231:28;;;;;;;36278:34;36299:12;36278:20;:34::i;:::-;35991:421;35796:623;35741:678;:::o;36142:259::-;36373:12;36353:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;35991:421:0;35796:623;35741:678;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;:::-;386:5;150:247;-1:-1:-1;;;150:247:1:o;584:315::-;652:6;660;713:2;701:9;692:7;688:23;684:32;681:52;;;729:1;726;719:12;681:52;765:9;752:23;742:33;;825:2;814:9;810:18;797:32;838:31;863:5;838:31;:::i;:::-;888:5;878:15;;;584:315;;;;;:::o;1084:180::-;1143:6;1196:2;1184:9;1175:7;1171:23;1167:32;1164:52;;;1212:1;1209;1202:12;1164:52;-1:-1:-1;1235:23:1;;1084:180;-1:-1:-1;1084:180:1:o;1269:658::-;1440:2;1492:21;;;1562:13;;1465:18;;;1584:22;;;1411:4;;1440:2;1663:15;;;;1637:2;1622:18;;;1411:4;1706:195;1720:6;1717:1;1714:13;1706:195;;;1785:13;;-1:-1:-1;;;;;1781:39:1;1769:52;;1876:15;;;;1841:12;;;;1817:1;1735:9;1706:195;;;-1:-1:-1;1918:3:1;;1269:658;-1:-1:-1;;;;;;1269:658:1:o;2332:315::-;2400:6;2408;2461:2;2449:9;2440:7;2436:23;2432:32;2429:52;;;2477:1;2474;2467:12;2429:52;2516:9;2503:23;2535:31;2560:5;2535:31;:::i;:::-;2585:5;2637:2;2622:18;;;;2609:32;;-1:-1:-1;;;2332:315:1:o;2890:127::-;2951:10;2946:3;2942:20;2939:1;2932:31;2982:4;2979:1;2972:15;3006:4;3003:1;2996:15;3022:168;3062:7;3128:1;3124;3120:6;3116:14;3113:1;3110:21;3105:1;3098:9;3091:17;3087:45;3084:71;;;3135:18;;:::i;:::-;-1:-1:-1;3175:9:1;;3022:168::o;3885:127::-;3946:10;3941:3;3937:20;3934:1;3927:31;3977:4;3974:1;3967:15;4001:4;3998:1;3991:15;4017:128;4057:3;4088:1;4084:6;4081:1;4078:13;4075:39;;;4094:18;;:::i;:::-;-1:-1:-1;4130:9:1;;4017:128::o;4150:135::-;4189:3;4210:17;;;4207:43;;4230:18;;:::i;:::-;-1:-1:-1;4277:1:1;4266:13;;4150:135::o;4290:179::-;4368:13;;4421:22;4410:34;;4400:45;;4390:73;;4459:1;4456;4449:12;4390:73;4290:179;;;:::o;4474:473::-;4577:6;4585;4593;4601;4609;4662:3;4650:9;4641:7;4637:23;4633:33;4630:53;;;4679:1;4676;4669:12;4630:53;4702:39;4731:9;4702:39;:::i;:::-;4692:49;;4781:2;4770:9;4766:18;4760:25;4750:35;;4825:2;4814:9;4810:18;4804:25;4794:35;;4869:2;4858:9;4854:18;4848:25;4838:35;;4892:49;4936:3;4925:9;4921:19;4892:49;:::i;:::-;4882:59;;4474:473;;;;;;;;:::o;4952:127::-;5013:10;5008:3;5004:20;5001:1;4994:31;5044:4;5041:1;5034:15;5068:4;5065:1;5058:15;5084:193;5123:1;5149;5139:35;;5154:18;;:::i;:::-;-1:-1:-1;;;5190:18:1;;-1:-1:-1;;5210:13:1;;5186:38;5183:64;;;5227:18;;:::i;:::-;-1:-1:-1;5261:10:1;;5084:193::o;5282:125::-;5322:4;5350:1;5347;5344:8;5341:34;;;5355:18;;:::i;:::-;-1:-1:-1;5392:9:1;;5282:125::o;5759:127::-;5820:10;5815:3;5811:20;5808:1;5801:31;5851:4;5848:1;5841:15;5875:4;5872:1;5865:15;5891:120;5931:1;5957;5947:35;;5962:18;;:::i;:::-;-1:-1:-1;5996:9:1;;5891:120::o;6016:136::-;6055:3;6083:5;6073:39;;6092:18;;:::i;:::-;-1:-1:-1;;;6128:18:1;;6016:136::o;6776:339::-;6978:2;6960:21;;;7017:2;6997:18;;;6990:30;-1:-1:-1;;;7051:2:1;7036:18;;7029:45;7106:2;7091:18;;6776:339::o;7874:251::-;7944:6;7997:2;7985:9;7976:7;7972:23;7968:32;7965:52;;;8013:1;8010;8003:12;7965:52;8045:9;8039:16;8064:31;8089:5;8064:31;:::i;14884:597::-;14996:4;15025:2;15054;15043:9;15036:21;15086:6;15080:13;15129:6;15124:2;15113:9;15109:18;15102:34;15154:1;15164:140;15178:6;15175:1;15172:13;15164:140;;;15273:14;;;15269:23;;15263:30;15239:17;;;15258:2;15235:26;15228:66;15193:10;;15164:140;;;15322:6;15319:1;15316:13;15313:91;;;15392:1;15387:2;15378:6;15367:9;15363:22;15359:31;15352:42;15313:91;-1:-1:-1;15465:2:1;15444:15;-1:-1:-1;;15440:29:1;15425:45;;;;15472:2;15421:54;;14884:597;-1:-1:-1;;;14884:597:1:o
Swarm Source
ipfs://146ccdac3e7236cefd5185910cccd65c9f74919cd2a6b07d43b016b80d9b5d06
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.