More Info
Private Name Tags
ContractCreator
Latest 15 from a total of 15 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 2210820 | 16 hrs ago | IN | 0 S | 0.00011336 | ||||
Withdraw | 2210811 | 16 hrs ago | IN | 0 S | 0.00011331 | ||||
Withdraw | 2210800 | 16 hrs ago | IN | 0 S | 0.00011331 | ||||
Update Alloc Poi... | 1759945 | 6 days ago | IN | 0 S | 0.00006808 | ||||
Deposit | 1759759 | 6 days ago | IN | 0 S | 0.00017401 | ||||
Deposit | 1601515 | 7 days ago | IN | 0 S | 0.00014633 | ||||
Deposit | 1598246 | 7 days ago | IN | 0 S | 0.00013356 | ||||
Deposit | 1590215 | 7 days ago | IN | 0 S | 0.00018476 | ||||
Deposit | 1590206 | 7 days ago | IN | 0 S | 0.00018476 | ||||
Deposit | 1590135 | 7 days ago | IN | 0 S | 0.00019009 | ||||
Deposit | 1587861 | 7 days ago | IN | 0 S | 0.0002166 | ||||
Add | 1586185 | 7 days ago | IN | 0 S | 0.00017409 | ||||
Add | 1585269 | 7 days ago | IN | 0 S | 0.00017102 | ||||
Add | 1585174 | 7 days ago | IN | 0 S | 0.00016947 | ||||
Add | 1584722 | 7 days ago | IN | 0 S | 0.00020475 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MasterchefV2
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2024-12-25 */ pragma solidity ^0.8.7; // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) /** * @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); } } // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) /** * @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; } } // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } interface IBoringERC20 { function mint(address to, uint256 amount) external; function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); /// @notice EIP 2612 function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } interface IComplexRewarder { function onBasedReward( uint256 pid, address user, uint256 newLpAmount ) external; function pendingTokens(uint256 pid, address user) external view returns (uint256 pending); function rewardToken() external view returns (IBoringERC20); function poolRewardsPerSec(uint256 pid) external view returns (uint256); } // solhint-disable avoid-low-level-calls library BoringERC20 { bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol() bytes4 private constant SIG_NAME = 0x06fdde03; // name() bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals() bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256) bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256) function returnDataToString(bytes memory data) internal pure returns (string memory) { if (data.length >= 64) { return abi.decode(data, (string)); } else if (data.length == 32) { uint8 i = 0; while (i < 32 && data[i] != 0) { i++; } bytes memory bytesArray = new bytes(i); for (i = 0; i < 32 && data[i] != 0; i++) { bytesArray[i] = data[i]; } return string(bytesArray); } else { return "???"; } } /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token symbol. function safeSymbol(IBoringERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_SYMBOL) ); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.name version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token name. function safeName(IBoringERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_NAME) ); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. /// @param token The address of the ERC-20 token contract. /// @return (uint8) Token decimals. function safeDecimals(IBoringERC20 token) internal view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_DECIMALS) ); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransfer( IBoringERC20 token, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(SIG_TRANSFER, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed" ); } /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param from Transfer tokens from. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransferFrom( IBoringERC20 token, address from, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed" ); } } interface IUniswapV2Pair { function initialize(address, address) external; function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } contract MasterchefV2 is Ownable, ReentrancyGuard { using BoringERC20 for IBoringERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. uint256 rewardLockedUp; // Reward locked up. uint256 nextHarvestUntil; // When can the user harvest again. } // Info of each pool. struct PoolInfo { IBoringERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. SWIFT to distribute per block. uint256 lastRewardTimestamp; // Last block number that based distribution occurs. uint256 accSwiftPerShare; // Accumulated Swift per share, times 1e18. See below. uint16 depositFeeBP; // Deposit fee in basis points uint256 harvestInterval; // Harvest interval in seconds uint256 totalLp; // Total token in Pool IComplexRewarder[] rewarders; // Array of rewarder contract for pools with incentives } IBoringERC20 public swift; // Swift tokens created per second uint256 public swiftPerSec; // Max harvest interval: 14 days uint256 public constant MAXIMUM_HARVEST_INTERVAL = 14 days; // Maximum deposit fee rate: 5% uint16 public constant MAXIMUM_DEPOSIT_FEE_RATE = 500; // Info of each pool PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The timestamp when Swift mining starts. uint256 public startTimestamp; // Total locked up rewards uint256 public totalLockedUpRewards; // Total Swift in Swift Pools (can be multiple pools) uint256 public totalSwiftInPools = 0; // Team address. address public teamAddress; // Treasury address. address public treasuryAddress; // Investor address. address public investorAddress; // Percentage of pool rewards that goto the team. uint256 public teamPercent; // Percentage of pool rewards that goes to the treasury. uint256 public treasuryPercent; // Percentage of pool rewards that goes to the investor. uint256 public investorPercent; // The precision factor uint256 private immutable ACC_TOKEN_PRECISION = 1e12; modifier validatePoolByPid(uint256 _pid) { require(_pid < poolInfo.length, "Pool does not exist"); _; } event Add( uint256 indexed pid, uint256 allocPoint, IBoringERC20 indexed lpToken, uint16 depositFeeBP, uint256 harvestInterval, IComplexRewarder[] indexed rewarders ); event Set( uint256 indexed pid, uint256 allocPoint, uint16 depositFeeBP, uint256 harvestInterval, IComplexRewarder[] indexed rewarders ); event UpdatePool( uint256 indexed pid, uint256 lastRewardTimestamp, uint256 lpSupply, uint256 accSwiftPerShare ); event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); event EmissionRateUpdated( address indexed caller, uint256 previousValue, uint256 newValue ); event RewardLockedUp( address indexed user, uint256 indexed pid, uint256 amountLockedUp ); event AllocPointsUpdated( address indexed caller, uint256 previousAmount, uint256 newAmount ); event SetTeamAddress( address indexed oldAddress, address indexed newAddress ); event SetTreasuryAddress( address indexed oldAddress, address indexed newAddress ); event SetInvestorAddress( address indexed oldAddress, address indexed newAddress ); event SetTeamPercent(uint256 oldPercent, uint256 newPercent); event SetTreasuryPercent(uint256 oldPercent, uint256 newPercent); event SetInvestorPercent(uint256 oldPercent, uint256 newPercent); constructor( IBoringERC20 _swift, uint256 _swiftPerSec, address _teamAddress, address _treasuryAddress, address _investorAddress, uint256 _teamPercent, uint256 _treasuryPercent, uint256 _investorPercent ) { require( _teamPercent <= 500, "constructor: invalid team percent value" ); require( _treasuryPercent <= 500, "constructor: invalid treasury percent value" ); require( _investorPercent <= 500, "constructor: invalid investor percent value" ); require( _teamPercent + _treasuryPercent + _investorPercent <= 500, "constructor: total percent over max" ); //StartBlock always many years later from contract construct, will be set later in StartFarming function startTimestamp = block.timestamp + (60 * 60 * 24 * 365); swift = _swift; swiftPerSec = _swiftPerSec; teamAddress = _teamAddress; treasuryAddress = _treasuryAddress; investorAddress = _investorAddress; teamPercent = _teamPercent; treasuryPercent = _treasuryPercent; investorPercent = _investorPercent; } // Set farming start, can call only once function startFarming() public onlyOwner { require( block.timestamp < startTimestamp, "start farming: farm started already" ); uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { PoolInfo storage pool = poolInfo[pid]; pool.lastRewardTimestamp = block.timestamp; } startTimestamp = block.timestamp; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the owner. // Can add multiple pool with same lp token without messing up rewards, because each pool's balance is tracked using its own totalLp function add( uint256 _allocPoint, IBoringERC20 _lpToken, uint16 _depositFeeBP, uint256 _harvestInterval, IComplexRewarder[] calldata _rewarders ) public onlyOwner { require(_rewarders.length <= 10, "add: too many rewarders"); require( _depositFeeBP <= MAXIMUM_DEPOSIT_FEE_RATE, "add: deposit fee too high" ); require( _harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "add: invalid harvest interval" ); require( Address.isContract(address(_lpToken)), "add: LP token must be a valid contract" ); for ( uint256 rewarderId = 0; rewarderId < _rewarders.length; ++rewarderId ) { require( Address.isContract(address(_rewarders[rewarderId])), "add: rewarder must be contract" ); } _massUpdatePools(); uint256 lastRewardTimestamp = block.timestamp > startTimestamp ? block.timestamp : startTimestamp; totalAllocPoint += _allocPoint; poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardTimestamp: lastRewardTimestamp, accSwiftPerShare: 0, depositFeeBP: _depositFeeBP, harvestInterval: _harvestInterval, totalLp: 0, rewarders: _rewarders }) ); emit Add( poolInfo.length - 1, _allocPoint, _lpToken, _depositFeeBP, _harvestInterval, _rewarders ); } // Update the given pool's Swift allocation point and deposit fee. Can only be called by the owner. function set( uint256 _pid, uint256 _allocPoint, uint16 _depositFeeBP, uint256 _harvestInterval, IComplexRewarder[] calldata _rewarders ) public onlyOwner validatePoolByPid(_pid) { require(_rewarders.length <= 10, "set: too many rewarders"); require( _depositFeeBP <= MAXIMUM_DEPOSIT_FEE_RATE, "set: deposit fee too high" ); require( _harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "set: invalid harvest interval" ); for ( uint256 rewarderId = 0; rewarderId < _rewarders.length; ++rewarderId ) { require( Address.isContract(address(_rewarders[rewarderId])), "set: rewarder must be contract" ); } _massUpdatePools(); totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint; poolInfo[_pid].allocPoint = _allocPoint; poolInfo[_pid].depositFeeBP = _depositFeeBP; poolInfo[_pid].harvestInterval = _harvestInterval; poolInfo[_pid].rewarders = _rewarders; emit Set( _pid, _allocPoint, _depositFeeBP, _harvestInterval, _rewarders ); } // View function to see pending rewards on frontend. function pendingTokens(uint256 _pid, address _user) external view validatePoolByPid(_pid) returns ( address[] memory addresses, string[] memory symbols, uint256[] memory decimals, uint256[] memory amounts ) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accSwiftPerShare = pool.accSwiftPerShare; uint256 lpSupply = pool.totalLp; if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 multiplier = block.timestamp - pool.lastRewardTimestamp; uint256 total = 1000; uint256 lpPercent = total - teamPercent - treasuryPercent - investorPercent; uint256 swiftReward = (multiplier * swiftPerSec * pool.allocPoint * lpPercent) / totalAllocPoint / total; accSwiftPerShare += ( ((swiftReward * ACC_TOKEN_PRECISION) / lpSupply) ); } uint256 pendingSwift = (((user.amount * accSwiftPerShare) / ACC_TOKEN_PRECISION) - user.rewardDebt) + user.rewardLockedUp; addresses = new address[](pool.rewarders.length + 1); symbols = new string[](pool.rewarders.length + 1); amounts = new uint256[](pool.rewarders.length + 1); decimals = new uint256[](pool.rewarders.length + 1); addresses[0] = address(swift); symbols[0] = IBoringERC20(swift).safeSymbol(); decimals[0] = IBoringERC20(swift).safeDecimals(); amounts[0] = pendingSwift; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { addresses[rewarderId + 1] = address( pool.rewarders[rewarderId].rewardToken() ); symbols[rewarderId + 1] = IBoringERC20( pool.rewarders[rewarderId].rewardToken() ).safeSymbol(); decimals[rewarderId + 1] = IBoringERC20( pool.rewarders[rewarderId].rewardToken() ).safeDecimals(); amounts[rewarderId + 1] = pool.rewarders[rewarderId].pendingTokens( _pid, _user ); } } /// @notice View function to see pool rewards per sec function poolRewardsPerSec(uint256 _pid) external view validatePoolByPid(_pid) returns ( address[] memory addresses, string[] memory symbols, uint256[] memory decimals, uint256[] memory rewardsPerSec ) { PoolInfo storage pool = poolInfo[_pid]; addresses = new address[](pool.rewarders.length + 1); symbols = new string[](pool.rewarders.length + 1); decimals = new uint256[](pool.rewarders.length + 1); rewardsPerSec = new uint256[](pool.rewarders.length + 1); addresses[0] = address(swift); symbols[0] = IBoringERC20(swift).safeSymbol(); decimals[0] = IBoringERC20(swift).safeDecimals(); uint256 total = 1000; uint256 lpPercent = total - teamPercent - treasuryPercent - investorPercent; rewardsPerSec[0] = (pool.allocPoint * swiftPerSec * lpPercent) / totalAllocPoint / total; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { addresses[rewarderId + 1] = address( pool.rewarders[rewarderId].rewardToken() ); symbols[rewarderId + 1] = IBoringERC20( pool.rewarders[rewarderId].rewardToken() ).safeSymbol(); decimals[rewarderId + 1] = IBoringERC20( pool.rewarders[rewarderId].rewardToken() ).safeDecimals(); rewardsPerSec[rewarderId + 1] = pool .rewarders[rewarderId] .poolRewardsPerSec(_pid); } } // View function to see rewarders for a pool function poolRewarders(uint256 _pid) external view validatePoolByPid(_pid) returns (address[] memory rewarders) { PoolInfo storage pool = poolInfo[_pid]; rewarders = new address[](pool.rewarders.length); for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { rewarders[rewarderId] = address(pool.rewarders[rewarderId]); } } // View function to see if user can harvest Swift. function canHarvest(uint256 _pid, address _user) public view validatePoolByPid(_pid) returns (bool) { UserInfo storage user = userInfo[_pid][_user]; return block.timestamp >= startTimestamp && block.timestamp >= user.nextHarvestUntil; } // Update reward vairables for all pools. Be careful of gas spending! function massUpdatePools() external nonReentrant { _massUpdatePools(); } // Internal method for massUpdatePools function _massUpdatePools() internal { for (uint256 pid = 0; pid < poolInfo.length; ++pid) { _updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) external nonReentrant { _updatePool(_pid); } // Internal method for _updatePool function _updatePool(uint256 _pid) internal validatePoolByPid(_pid) { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTimestamp) { return; } uint256 lpSupply = pool.totalLp; if (lpSupply == 0 || pool.allocPoint == 0) { pool.lastRewardTimestamp = block.timestamp; return; } uint256 multiplier = block.timestamp - pool.lastRewardTimestamp; uint256 swiftReward = ((multiplier * swiftPerSec) * pool.allocPoint) / totalAllocPoint; uint256 total = 1000; uint256 lpPercent = total - teamPercent - treasuryPercent - investorPercent; swift.mint(teamAddress, (swiftReward * teamPercent) / total); swift.mint(treasuryAddress, (swiftReward * treasuryPercent) / total); swift.mint(investorAddress, (swiftReward * investorPercent) / total); swift.mint(address(this), (swiftReward * lpPercent) / total); pool.accSwiftPerShare += (swiftReward * ACC_TOKEN_PRECISION * lpPercent) / pool.totalLp / total; pool.lastRewardTimestamp = block.timestamp; emit UpdatePool( _pid, pool.lastRewardTimestamp, lpSupply, pool.accSwiftPerShare ); } function depositWithPermit( uint256 pid, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public nonReentrant validatePoolByPid(pid) { PoolInfo storage pool = poolInfo[pid]; IUniswapV2Pair pair = IUniswapV2Pair(address(pool.lpToken)); pair.permit(msg.sender, address(this), amount, deadline, v, r, s); _deposit(pid, amount); } // Deposit tokens for Swift allocation. function deposit(uint256 _pid, uint256 _amount) public nonReentrant { _deposit(_pid, _amount); } // Deposit tokens for Swift allocation. function _deposit(uint256 _pid, uint256 _amount) internal validatePoolByPid(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; _updatePool(_pid); payOrLockupPendingSwift(_pid); if (_amount > 0) { uint256 beforeDeposit = pool.lpToken.balanceOf(address(this)); pool.lpToken.safeTransferFrom(msg.sender, address(this), _amount); uint256 afterDeposit = pool.lpToken.balanceOf(address(this)); _amount = afterDeposit - beforeDeposit; if (pool.depositFeeBP > 0) { uint256 depositFee = (_amount * pool.depositFeeBP) / 10000; pool.lpToken.safeTransfer(treasuryAddress, depositFee); _amount = _amount - depositFee; } user.amount += _amount; if (address(pool.lpToken) == address(swift)) { totalSwiftInPools += _amount; } } user.rewardDebt = (user.amount * pool.accSwiftPerShare) / ACC_TOKEN_PRECISION; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { pool.rewarders[rewarderId].onBasedReward( _pid, msg.sender, user.amount ); } if (_amount > 0) { pool.totalLp += _amount; } emit Deposit(msg.sender, _pid, _amount); } //withdraw tokens function withdraw(uint256 _pid, uint256 _amount) public nonReentrant validatePoolByPid(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; //this will make sure that user can only withdraw from his pool require(user.amount >= _amount, "withdraw: user amount not enough"); //cannot withdraw more than pool's balance require(pool.totalLp >= _amount, "withdraw: pool total not enough"); _updatePool(_pid); payOrLockupPendingSwift(_pid); if (_amount > 0) { user.amount -= _amount; if (address(pool.lpToken) == address(swift)) { totalSwiftInPools -= _amount; } pool.lpToken.safeTransfer(msg.sender, _amount); } user.rewardDebt = (user.amount * pool.accSwiftPerShare) / ACC_TOKEN_PRECISION; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { pool.rewarders[rewarderId].onBasedReward( _pid, msg.sender, user.amount ); } if (_amount > 0) { pool.totalLp -= _amount; } emit Withdraw(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; //Cannot withdraw more than pool's balance require( pool.totalLp >= amount, "emergency withdraw: pool total not enough" ); user.amount = 0; user.rewardDebt = 0; user.rewardLockedUp = 0; user.nextHarvestUntil = 0; pool.totalLp -= amount; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { pool.rewarders[rewarderId].onBasedReward(_pid, msg.sender, 0); } if (address(pool.lpToken) == address(swift)) { totalSwiftInPools -= amount; } pool.lpToken.safeTransfer(msg.sender, amount); emit EmergencyWithdraw(msg.sender, _pid, amount); } // Pay or lockup pending Swift. function payOrLockupPendingSwift(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; if (user.nextHarvestUntil == 0 && block.timestamp >= startTimestamp) { user.nextHarvestUntil = block.timestamp + pool.harvestInterval; } uint256 pending = ((user.amount * pool.accSwiftPerShare) / ACC_TOKEN_PRECISION) - user.rewardDebt; if (canHarvest(_pid, msg.sender)) { if (pending > 0 || user.rewardLockedUp > 0) { uint256 pendingRewards = pending + user.rewardLockedUp; // reset lockup totalLockedUpRewards -= user.rewardLockedUp; user.rewardLockedUp = 0; user.nextHarvestUntil = block.timestamp + pool.harvestInterval; // send rewards safeSwiftTransfer(msg.sender, pendingRewards); } } else if (pending > 0) { totalLockedUpRewards += pending; user.rewardLockedUp += pending; emit RewardLockedUp(msg.sender, _pid, pending); } } // Safe Swift transfer function, just in case if rounding error causes pool do not have enough Swift. function safeSwiftTransfer(address _to, uint256 _amount) internal { if (swift.balanceOf(address(this)) > totalSwiftInPools) { //swiftBal = total Swift in BasedDistributor - total Swift in Swift pools, this will make sure that BasedDistributor never transfer rewards from deposited Swift pools uint256 swiftBal = swift.balanceOf(address(this)) - totalSwiftInPools; if (_amount >= swiftBal) { swift.safeTransfer(_to, swiftBal); } else if (_amount > 0) { swift.safeTransfer(_to, _amount); } } } function updateEmissionRate(uint256 _swiftPerSec) public onlyOwner { _massUpdatePools(); emit EmissionRateUpdated(msg.sender, swiftPerSec, _swiftPerSec); swiftPerSec = _swiftPerSec; } function updateAllocPoint(uint256 _pid, uint256 _allocPoint) public onlyOwner { _massUpdatePools(); emit AllocPointsUpdated( msg.sender, poolInfo[_pid].allocPoint, _allocPoint ); totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint; poolInfo[_pid].allocPoint = _allocPoint; } function poolTotalLp(uint256 pid) external view returns (uint256) { return poolInfo[pid].totalLp; } // Function to harvest many pools in a single transaction function harvestMany(uint256[] calldata _pids) public nonReentrant { require(_pids.length <= 30, "harvest many: too many pool ids"); for (uint256 index = 0; index < _pids.length; ++index) { _deposit(_pids[index], 0); } } // Update team address by the previous team address. function setTeamAddress(address _teamAddress) public { require( msg.sender == teamAddress, "set team address: only previous team address can call this method" ); require( _teamAddress != address(0), "set team address: invalid new team address" ); teamAddress = _teamAddress; emit SetTeamAddress(msg.sender, _teamAddress); } function setTeamPercent(uint256 _newTeamPercent) public onlyOwner { require( _newTeamPercent <= 500, "set team percent: invalid percent value" ); require( treasuryPercent + _newTeamPercent + investorPercent <= 500, "set team percent: total percent over max" ); emit SetTeamPercent(teamPercent, _newTeamPercent); teamPercent = _newTeamPercent; } // Update treasury address by the previous treasury. function setTreasuryAddress(address _treasuryAddress) public { require( msg.sender == treasuryAddress, "set treasury address: only previous treasury address can call this method" ); require( _treasuryAddress != address(0), "set treasury address: invalid new treasury address" ); treasuryAddress = _treasuryAddress; emit SetTreasuryAddress(msg.sender, _treasuryAddress); } function setTreasuryPercent(uint256 _newTreasuryPercent) public onlyOwner { require( _newTreasuryPercent <= 500, "set treasury percent: invalid percent value" ); require( teamPercent + _newTreasuryPercent + investorPercent <= 500, "set treasury percent: total percent over max" ); emit SetTreasuryPercent(treasuryPercent, _newTreasuryPercent); treasuryPercent = _newTreasuryPercent; } // Update the investor address by the previous investor. function setInvestorAddress(address _investorAddress) public { require( msg.sender == investorAddress, "set investor address: only previous investor can call this method" ); require( _investorAddress != address(0), "set investor address: invalid new investor address" ); investorAddress = _investorAddress; emit SetInvestorAddress(msg.sender, _investorAddress); } function setInvestorPercent(uint256 _newInvestorPercent) public onlyOwner { require( _newInvestorPercent <= 500, "set investor percent: invalid percent value" ); require( teamPercent + _newInvestorPercent + treasuryPercent <= 500, "set investor percent: total percent over max" ); emit SetInvestorPercent(investorPercent, _newInvestorPercent); investorPercent = _newInvestorPercent; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IBoringERC20","name":"_swift","type":"address"},{"internalType":"uint256","name":"_swiftPerSec","type":"uint256"},{"internalType":"address","name":"_teamAddress","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"address","name":"_investorAddress","type":"address"},{"internalType":"uint256","name":"_teamPercent","type":"uint256"},{"internalType":"uint256","name":"_treasuryPercent","type":"uint256"},{"internalType":"uint256","name":"_investorPercent","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IBoringERC20","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"indexed":true,"internalType":"contract IComplexRewarder[]","name":"rewarders","type":"address[]"}],"name":"Add","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"AllocPointsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"EmissionRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountLockedUp","type":"uint256"}],"name":"RewardLockedUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"indexed":true,"internalType":"contract IComplexRewarder[]","name":"rewarders","type":"address[]"}],"name":"Set","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetInvestorAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"SetInvestorPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetTeamAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"SetTeamPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetTreasuryAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"SetTreasuryPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accSwiftPerShare","type":"uint256"}],"name":"UpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAXIMUM_DEPOSIT_FEE_RATE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_HARVEST_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IBoringERC20","name":"_lpToken","type":"address"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"contract IComplexRewarder[]","name":"_rewarders","type":"address[]"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"canHarvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"depositWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_pids","type":"uint256[]"}],"name":"harvestMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"investorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investorPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTokens","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"string[]","name":"symbols","type":"string[]"},{"internalType":"uint256[]","name":"decimals","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBoringERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accSwiftPerShare","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"internalType":"uint256","name":"totalLp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewarders","outputs":[{"internalType":"address[]","name":"rewarders","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewardsPerSec","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"string[]","name":"symbols","type":"string[]"},{"internalType":"uint256[]","name":"decimals","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardsPerSec","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"poolTotalLp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"contract IComplexRewarder[]","name":"_rewarders","type":"address[]"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_investorAddress","type":"address"}],"name":"setInvestorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newInvestorPercent","type":"uint256"}],"name":"setInvestorPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_teamAddress","type":"address"}],"name":"setTeamAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTeamPercent","type":"uint256"}],"name":"setTeamPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTreasuryPercent","type":"uint256"}],"name":"setTreasuryPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startFarming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swift","outputs":[{"internalType":"contract IBoringERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swiftPerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedUpRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSwiftInPools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"updateAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swiftPerSec","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"rewardLockedUp","type":"uint256"},{"internalType":"uint256","name":"nextHarvestUntil","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040525f600681905560095564e8d4a51000608052348015610021575f5ffd5b506040516145b43803806145b4833981016040819052610040916102ce565b61004933610268565b600180556101f48311156100b45760405162461bcd60e51b815260206004820152602760248201527f636f6e7374727563746f723a20696e76616c6964207465616d2070657263656e604482015266742076616c756560c81b60648201526084015b60405180910390fd5b6101f482111561011a5760405162461bcd60e51b815260206004820152602b60248201527f636f6e7374727563746f723a20696e76616c696420747265617375727920706560448201526a7263656e742076616c756560a81b60648201526084016100ab565b6101f48111156101805760405162461bcd60e51b815260206004820152602b60248201527f636f6e7374727563746f723a20696e76616c696420696e766573746f7220706560448201526a7263656e742076616c756560a81b60648201526084016100ab565b6101f48161018e848661034f565b610198919061034f565b11156101f25760405162461bcd60e51b815260206004820152602360248201527f636f6e7374727563746f723a20746f74616c2070657263656e74206f766572206044820152620dac2f60eb1b60648201526084016100ab565b610200426301e1338061034f565b600755600280546001600160a01b03199081166001600160a01b039a8b1617909155600397909755600a8054881696891696909617909555600b8054871694881694909417909355600c80549095169190951617909255600d92909255600e55600f55610374565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146102cb575f5ffd5b50565b5f5f5f5f5f5f5f5f610100898b0312156102e6575f5ffd5b88516102f1816102b7565b60208a015160408b01519199509750610309816102b7565b60608a015190965061031a816102b7565b60808a015190955061032b816102b7565b60a08a015160c08b015160e0909b0151999c989b5096999598909790945092505050565b8082018082111561036e57634e487b7160e01b5f52601160045260245ffd5b92915050565b6080516142056103af5f395f8181610d10015281816126340152818161268101528181612ef10152818161301301526135f501526142055ff3fe608060405234801561000f575f5ffd5b5060043610610260575f3560e01c8063654c9ece1161014b578063c5f956af116100bf578063e2bbb15811610084578063e2bbb1581461058a578063e6fd48bc1461059d578063eddf9652146105a6578063eff8976b146105b9578063f2fde38b146105d9578063ffcd4263146105ec575f5ffd5b8063c5f956af14610548578063d219c6681461055b578063dc640ac914610564578063de73149d14610577578063e164ac5014610581575f5ffd5b8063876d3c9c11610110578063876d3c9c1461049857806389a2bc25146104ab5780638da5cb5b146104be57806393f1a40b146104ce578063949e63021461052d578063afbcfea114610540575f5ffd5b8063654c9ece1461043b5780636605bfda1461044e5780636690864e14610461578063715018a614610474578063812c64f11461047c575f5ffd5b80633a133200116101e2578063508593ab116101a7578063508593ab146103de578063515bc323146103f157806351eb05a61461040457806352e57183146104175780635312ea8e14610420578063630b5ba114610433575f5ffd5b80633a1332001461037957806342602f1e1461038c578063441a3e701461039f578063465e81ec146103b2578063474fa630146103d5575f5ffd5b80631526fe27116102285780631526fe27146102d157806317caf6f1146103275780631c75f085146103305780632081ccc4146103435780632e6c998d14610356575f5ffd5b806304ef9d58146102645780630735b20814610280578063081e3eda146102895780630ba84cd21461029157806312e228fd146102a6575b5f5ffd5b61026d600e5481565b6040519081526020015b60405180910390f35b61026d600f5481565b60045461026d565b6102a461029f366004613c10565b6105ff565b005b600c546102b9906001600160a01b031681565b6040516001600160a01b039091168152602001610277565b6102e46102df366004613c10565b610652565b604080516001600160a01b039098168852602088019690965294860193909352606085019190915261ffff16608084015260a083015260c082015260e001610277565b61026d60065481565b600a546102b9906001600160a01b031681565b6102a4610351366004613c7f565b6106ad565b610369610364366004613cfe565b6109de565b6040519015158152602001610277565b6002546102b9906001600160a01b031681565b6102a461039a366004613d2c565b610a43565b6102a46103ad366004613d47565b610b89565b6103c56103c0366004613c10565b610e4e565b6040516102779493929190613dda565b61026d60085481565b6102a46103ec366004613e97565b61141e565b6102a46103ff366004613eda565b6117d0565b6102a4610412366004613c10565b6118c1565b61026d60035481565b6102a461042e366004613c10565b6118de565b6102a4611ae0565b61026d610449366004613c10565b611afb565b6102a461045c366004613d2c565b611b26565b6102a461046f366004613d2c565b611c74565b6102a4611db2565b6104856101f481565b60405161ffff9091168152602001610277565b6102a46104a6366004613c10565b611dc3565b6102a46104b9366004613c10565b611ef3565b5f546001600160a01b03166102b9565b61050d6104dc366004613cfe565b600560209081525f928352604080842090915290825290208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610277565b6102a461053b366004613c10565b612023565b6102a461214b565b600b546102b9906001600160a01b031681565b61026d60095481565b6102a4610572366004613f29565b6121f6565b61026d6212750081565b61026d600d5481565b6102a4610598366004613d47565b61228d565b61026d60075481565b6102a46105b4366004613d47565b6122a8565b6105cc6105c7366004613c10565b612392565b6040516102779190613f67565b6102a46105e7366004613d2c565b61249d565b6103c56105fa366004613cfe565b612513565b610607612aff565b61060f612b58565b600354604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2600355565b60048181548110610661575f80fd5b5f91825260209091206008909102018054600182015460028301546003840154600485015460058601546006909601546001600160a01b03909516965092949193909261ffff16919087565b6106b5612aff565b600454869081106106e15760405162461bcd60e51b81526004016106d890613f79565b60405180910390fd5b600a8211156107325760405162461bcd60e51b815260206004820152601760248201527f7365743a20746f6f206d616e792072657761726465727300000000000000000060448201526064016106d8565b6101f461ffff861611156107885760405162461bcd60e51b815260206004820152601960248201527f7365743a206465706f7369742066656520746f6f20686967680000000000000060448201526064016106d8565b621275008411156107db5760405162461bcd60e51b815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016106d8565b5f5b828110156108725761081e8484838181106107fa576107fa613fa6565b905060200201602081019061080f9190613d2c565b6001600160a01b03163b151590565b61086a5760405162461bcd60e51b815260206004820152601e60248201527f7365743a207265776172646572206d75737420626520636f6e7472616374000060448201526064016106d8565b6001016107dd565b5061087b612b58565b856004888154811061088f5761088f613fa6565b905f5260205f209060080201600101546006546108ac9190613fce565b6108b69190613fe1565b60068190555085600488815481106108d0576108d0613fa6565b905f5260205f2090600802016001018190555084600488815481106108f7576108f7613fa6565b905f5260205f2090600802016004015f6101000a81548161ffff021916908361ffff160217905550836004888154811061093357610933613fa6565b905f5260205f2090600802016005018190555082826004898154811061095b5761095b613fa6565b905f5260205f2090600802016007019190610977929190613b48565b508282604051610988929190613ff4565b6040805191829003822088835261ffff881660208401529082018690529088907f5ed6f0deef9ab49d02900b40d596df4cd637a2a7fbfa56bbcb377389d3ce8d289060600160405180910390a350505050505050565b6004545f9083908110610a035760405162461bcd60e51b81526004016106d890613f79565b5f8481526005602090815260408083206001600160a01b038716845290915290206007544210801590610a3a575080600301544210155b95945050505050565b600c546001600160a01b03163314610acd5760405162461bcd60e51b815260206004820152604160248201527f73657420696e766573746f7220616464726573733a206f6e6c7920707265766960448201527f6f757320696e766573746f722063616e2063616c6c2074686973206d6574686f6064820152601960fa1b608482015260a4016106d8565b6001600160a01b038116610b3e5760405162461bcd60e51b815260206004820152603260248201527f73657420696e766573746f7220616464726573733a20696e76616c6964206e656044820152717720696e766573746f72206164647265737360701b60648201526084016106d8565b600c80546001600160a01b0319166001600160a01b03831690811790915560405133907f6260cb34f06b782e83bde168f7d74ab2133041cb53b63ce22b127822a92b6791905f90a350565b610b91612b75565b60045482908110610bb45760405162461bcd60e51b81526004016106d890613f79565b5f60048481548110610bc857610bc8613fa6565b5f91825260208083208784526005825260408085203386529092529220805460089092029092019250841115610c405760405162461bcd60e51b815260206004820181905260248201527f77697468647261773a207573657220616d6f756e74206e6f7420656e6f75676860448201526064016106d8565b8382600601541015610c945760405162461bcd60e51b815260206004820152601f60248201527f77697468647261773a20706f6f6c20746f74616c206e6f7420656e6f7567680060448201526064016106d8565b610c9d85612bce565b610ca685612fa2565b8315610d075783815f015f828254610cbe9190613fce565b909155505060025482546001600160a01b03918216911603610cf1578360095f828254610ceb9190613fce565b90915550505b8154610d07906001600160a01b0316338661314c565b600382015481547f000000000000000000000000000000000000000000000000000000000000000091610d3991614035565b610d43919061404c565b60018201555f5b6007830154811015610de757826007018181548110610d6b57610d6b613fa6565b5f918252602090912001548254604051632eef144760e01b81526004810189905233602482015260448101919091526001600160a01b0390911690632eef1447906064015f604051808303815f87803b158015610dc6575f5ffd5b505af1158015610dd8573d5f5f3e3d5ffd5b50505050806001019050610d4a565b508315610e075783826006015f828254610e019190613fce565b90915550505b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a3505050610e4a60018055565b5050565b606080606080846004805490508110610e795760405162461bcd60e51b81526004016106d890613f79565b5f60048781548110610e8d57610e8d613fa6565b905f5260205f209060080201905080600701805490506001610eaf9190613fe1565b6001600160401b03811115610ec657610ec661406b565b604051908082528060200260200182016040528015610eef578160200160208202803683370190505b506007820154909650610f03906001613fe1565b6001600160401b03811115610f1a57610f1a61406b565b604051908082528060200260200182016040528015610f4d57816020015b6060815260200190600190039081610f385790505b506007820154909550610f61906001613fe1565b6001600160401b03811115610f7857610f7861406b565b604051908082528060200260200182016040528015610fa1578160200160208202803683370190505b506007820154909450610fb5906001613fe1565b6001600160401b03811115610fcc57610fcc61406b565b604051908082528060200260200182016040528015610ff5578160200160208202803683370190505b5060025487519194506001600160a01b03169087905f9061101857611018613fa6565b6001600160a01b03928316602091820292909201015260025461103b9116613262565b855f8151811061104d5761104d613fa6565b602090810291909101015260025461106d906001600160a01b0316613321565b60ff16845f8151811061108257611082613fa6565b6020026020010181815250505f6103e890505f600f54600e54600d54846110a99190613fce565b6110b39190613fce565b6110bd9190613fce565b9050816006548260035486600101546110d69190614035565b6110e09190614035565b6110ea919061404c565b6110f4919061404c565b855f8151811061110657611106613fa6565b60209081029190910101525f5b60078401548110156114125783600701818154811061113457611134613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa15801561117f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a3919061407f565b896111af836001613fe1565b815181106111bf576111bf613fa6565b60200260200101906001600160a01b031690816001600160a01b0316815250506112748460070182815481106111f7576111f7613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa158015611242573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611266919061407f565b6001600160a01b0316613262565b88611280836001613fe1565b8151811061129057611290613fa6565b60200260200101819052506113308460070182815481106112b3576112b3613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa1580156112fe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611322919061407f565b6001600160a01b0316613321565b60ff168761133f836001613fe1565b8151811061134f5761134f613fa6565b60200260200101818152505083600701818154811061137057611370613fa6565b5f91825260209091200154604051631197a07b60e21b8152600481018c90526001600160a01b039091169063465e81ec90602401602060405180830381865afa1580156113bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e3919061409a565b866113ef836001613fe1565b815181106113ff576113ff613fa6565b6020908102919091010152600101611113565b50505050509193509193565b611426612aff565b600a8111156114775760405162461bcd60e51b815260206004820152601760248201527f6164643a20746f6f206d616e792072657761726465727300000000000000000060448201526064016106d8565b6101f461ffff851611156114cd5760405162461bcd60e51b815260206004820152601960248201527f6164643a206465706f7369742066656520746f6f20686967680000000000000060448201526064016106d8565b621275008311156115205760405162461bcd60e51b815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016106d8565b6001600160a01b0385163b6115865760405162461bcd60e51b815260206004820152602660248201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f6044820152651b9d1c9858dd60d21b60648201526084016106d8565b5f5b818110156115f9576115a58383838181106107fa576107fa613fa6565b6115f15760405162461bcd60e51b815260206004820152601e60248201527f6164643a207265776172646572206d75737420626520636f6e7472616374000060448201526064016106d8565b600101611588565b50611602612b58565b5f600754421161161457600754611616565b425b90508660065f8282546116299190613fe1565b925050819055506004604051806101000160405280886001600160a01b031681526020018981526020018381526020015f81526020018761ffff1681526020018681526020015f81526020018585808060200260200160405190810160405280939291908181526020018383602002808284375f920182905250939094525050835460018082018655948252602091829020845160089092020180546001600160a01b0319166001600160a01b0390921691909117815583820151948101949094556040830151600285015560608301516003850155608083015160048501805461ffff191661ffff90921691909117905560a0830151600585015560c0830151600685015560e0830151805193949361174d935060078501929190910190613ba9565b5050508282604051611760929190613ff4565b6040519081900390206004546001600160a01b0388169061178390600190613fce565b604080518b815261ffff8a1660208201529081018890527f5ed295c4f5af5aeb1ccd905e1cd55a86ab3bb9fc1fe2346ff64ac47dbef366619060600160405180910390a450505050505050565b6117d8612b75565b600454869081106117fb5760405162461bcd60e51b81526004016106d890613f79565b5f6004888154811061180f5761180f613fa6565b5f9182526020909120600890910201805460405163d505accf60e01b8152336004820152306024820152604481018a90526064810189905260ff8816608482015260a4810187905260c481018690529192506001600160a01b031690819063d505accf9060e4015f604051808303815f87803b15801561188d575f5ffd5b505af115801561189f573d5f5f3e3d5ffd5b505050506118ad89896133d5565b5050506118b960018055565b505050505050565b6118c9612b75565b6118d281612bce565b6118db60018055565b50565b6118e6612b75565b5f600482815481106118fa576118fa613fa6565b5f918252602080832085845260058252604080852033865290925292208054600892909202909201600681015490935081111561198b5760405162461bcd60e51b815260206004820152602960248201527f656d657267656e63792077697468647261773a20706f6f6c20746f74616c206e6044820152680dee840cadcdeeaced60bb1b60648201526084016106d8565b5f8083556001830181905560028301819055600383018190556006840180548392906119b8908490613fce565b909155505f90505b6007840154811015611a58578360070181815481106119e1576119e1613fa6565b5f918252602082200154604051632eef144760e01b81526004810188905233602482015260448101929092526001600160a01b031690632eef1447906064015f604051808303815f87803b158015611a37575f5ffd5b505af1158015611a49573d5f5f3e3d5ffd5b505050508060010190506119c0565b5060025483546001600160a01b03918216911603611a87578060095f828254611a819190613fce565b90915550505b8254611a9d906001600160a01b0316338361314c565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a35050506118db60018055565b611ae8612b75565b611af0612b58565b611af960018055565b565b5f60048281548110611b0f57611b0f613fa6565b905f5260205f209060080201600601549050919050565b600b546001600160a01b03163314611bb85760405162461bcd60e51b815260206004820152604960248201527f73657420747265617375727920616464726573733a206f6e6c7920707265766960448201527f6f757320747265617375727920616464726573732063616e2063616c6c2074686064820152681a5cc81b595d1a1bd960ba1b608482015260a4016106d8565b6001600160a01b038116611c295760405162461bcd60e51b815260206004820152603260248201527f73657420747265617375727920616464726573733a20696e76616c6964206e6560448201527177207472656173757279206164647265737360701b60648201526084016106d8565b600b80546001600160a01b0319166001600160a01b03831690811790915560405133907f61885cdba916be748ff3e3f6f15e4206153b8ea3b7acabade9d04b4063a83510905f90a350565b600a546001600160a01b03163314611cfe5760405162461bcd60e51b815260206004820152604160248201527f736574207465616d20616464726573733a206f6e6c792070726576696f75732060448201527f7465616d20616464726573732063616e2063616c6c2074686973206d6574686f6064820152601960fa1b608482015260a4016106d8565b6001600160a01b038116611d675760405162461bcd60e51b815260206004820152602a60248201527f736574207465616d20616464726573733a20696e76616c6964206e6577207465604482015269616d206164647265737360b01b60648201526084016106d8565b600a80546001600160a01b0319166001600160a01b03831690811790915560405133907f42fbc17d847fdc3e5c82da842a5ef3979c64f3b94cd4e7382310fd5525c6ee0f905f90a350565b611dba612aff565b611af95f61372a565b611dcb612aff565b6101f4811115611e315760405162461bcd60e51b815260206004820152602b60248201527f73657420696e766573746f722070657263656e743a20696e76616c696420706560448201526a7263656e742076616c756560a81b60648201526084016106d8565b6101f4600e5482600d54611e459190613fe1565b611e4f9190613fe1565b1115611eb25760405162461bcd60e51b815260206004820152602c60248201527f73657420696e766573746f722070657263656e743a20746f74616c207065726360448201526b0cadce840deeccae440dac2f60a31b60648201526084016106d8565b600f5460408051918252602082018390527f905b464403a98b455243c8b4d30c545b8fbd70cda670142b9326425b2c039f3b910160405180910390a1600f55565b611efb612aff565b6101f4811115611f615760405162461bcd60e51b815260206004820152602b60248201527f7365742074726561737572792070657263656e743a20696e76616c696420706560448201526a7263656e742076616c756560a81b60648201526084016106d8565b6101f4600f5482600d54611f759190613fe1565b611f7f9190613fe1565b1115611fe25760405162461bcd60e51b815260206004820152602c60248201527f7365742074726561737572792070657263656e743a20746f74616c207065726360448201526b0cadce840deeccae440dac2f60a31b60648201526084016106d8565b600e5460408051918252602082018390527fa565895c0101fca10e6a7b85742e56cf52ac5f58b09ce030425d3555b47069fd910160405180910390a1600e55565b61202b612aff565b6101f481111561208d5760405162461bcd60e51b815260206004820152602760248201527f736574207465616d2070657263656e743a20696e76616c69642070657263656e604482015266742076616c756560c81b60648201526084016106d8565b6101f4600f5482600e546120a19190613fe1565b6120ab9190613fe1565b111561210a5760405162461bcd60e51b815260206004820152602860248201527f736574207465616d2070657263656e743a20746f74616c2070657263656e74206044820152670deeccae440dac2f60c31b60648201526084016106d8565b600d5460408051918252602082018390527f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6910160405180910390a1600d55565b612153612aff565b60075442106121b05760405162461bcd60e51b815260206004820152602360248201527f7374617274206661726d696e673a206661726d207374617274656420616c726560448201526261647960e81b60648201526084016106d8565b6004545f5b818110156121ee575f600482815481106121d1576121d1613fa6565b5f91825260209091204260089092020160020155506001016121b5565b505042600755565b6121fe612b75565b601e81111561224f5760405162461bcd60e51b815260206004820152601f60248201527f68617276657374206d616e793a20746f6f206d616e7920706f6f6c206964730060448201526064016106d8565b5f5b818110156122835761227b83838381811061226e5761226e613fa6565b905060200201355f6133d5565b600101612251565b50610e4a60018055565b612295612b75565b61229f82826133d5565b610e4a60018055565b6122b0612aff565b6122b8612b58565b336001600160a01b03167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef3600484815481106122f6576122f6613fa6565b905f5260205f209060080201600101548360405161231e929190918252602082015260400190565b60405180910390a2806004838154811061233a5761233a613fa6565b905f5260205f209060080201600101546006546123579190613fce565b6123619190613fe1565b600681905550806004838154811061237b5761237b613fa6565b905f5260205f209060080201600101819055505050565b600454606090829081106123b85760405162461bcd60e51b81526004016106d890613f79565b5f600484815481106123cc576123cc613fa6565b905f5260205f209060080201905080600701805490506001600160401b038111156123f9576123f961406b565b604051908082528060200260200182016040528015612422578160200160208202803683370190505b5092505f5b60078201548110156124955781600701818154811061244857612448613fa6565b905f5260205f20015f9054906101000a90046001600160a01b031684828151811061247557612475613fa6565b6001600160a01b0390921660209283029190910190910152600101612427565b505050919050565b6124a5612aff565b6001600160a01b03811661250a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106d8565b6118db8161372a565b60608060608085600480549050811061253e5760405162461bcd60e51b81526004016106d890613f79565b5f6004888154811061255257612552613fa6565b5f91825260208083208b84526005825260408085206001600160a01b038d16865290925292206003600890920290920190810154600682015460028301549294509091421180156125a257508015155b15612674575f8460020154426125b89190613fce565b90505f6103e890505f600f54600e54600d54846125d59190613fce565b6125df9190613fce565b6125e99190613fce565b90505f82600654838a60010154600354886126049190614035565b61260e9190614035565b6126189190614035565b612622919061404c565b61262c919061404c565b9050846126597f000000000000000000000000000000000000000000000000000000000000000083614035565b612663919061404c565b61266d9087613fe1565b9550505050505b5f836002015484600101547f000000000000000000000000000000000000000000000000000000000000000085875f01546126af9190614035565b6126b9919061404c565b6126c39190613fce565b6126cd9190613fe1565b60078601549091506126e0906001613fe1565b6001600160401b038111156126f7576126f761406b565b604051908082528060200260200182016040528015612720578160200160208202803683370190505b506007860154909a50612734906001613fe1565b6001600160401b0381111561274b5761274b61406b565b60405190808252806020026020018201604052801561277e57816020015b60608152602001906001900390816127695790505b506007860154909950612792906001613fe1565b6001600160401b038111156127a9576127a961406b565b6040519080825280602002602001820160405280156127d2578160200160208202803683370190505b5060078601549097506127e6906001613fe1565b6001600160401b038111156127fd576127fd61406b565b604051908082528060200260200182016040528015612826578160200160208202803683370190505b506002548b519199506001600160a01b0316908b905f9061284957612849613fa6565b6001600160a01b03928316602091820292909201015260025461286c9116613262565b895f8151811061287e5761287e613fa6565b602090810291909101015260025461289e906001600160a01b0316613321565b60ff16885f815181106128b3576128b3613fa6565b60200260200101818152505080875f815181106128d2576128d2613fa6565b60209081029190910101525f5b6007860154811015612aef5785600701818154811061290057612900613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa15801561294b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296f919061407f565b8b61297b836001613fe1565b8151811061298b5761298b613fa6565b60200260200101906001600160a01b031690816001600160a01b0316815250506129c38660070182815481106111f7576111f7613fa6565b8a6129cf836001613fe1565b815181106129df576129df613fa6565b6020026020010181905250612a028660070182815481106112b3576112b3613fa6565b60ff1689612a11836001613fe1565b81518110612a2157612a21613fa6565b602002602001018181525050856007018181548110612a4257612a42613fa6565b5f9182526020909120015460405160016232bd9d60e01b03198152600481018f90526001600160a01b038e811660248301529091169063ffcd426390604401602060405180830381865afa158015612a9c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ac0919061409a565b88612acc836001613fe1565b81518110612adc57612adc613fa6565b60209081029190910101526001016128df565b5050505050505092959194509250565b5f546001600160a01b03163314611af95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106d8565b5f5b6004548110156118db57612b6d81612bce565b600101612b5a565b600260015403612bc75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106d8565b6002600155565b60045481908110612bf15760405162461bcd60e51b81526004016106d890613f79565b5f60048381548110612c0557612c05613fa6565b905f5260205f209060080201905080600201544211612c2357505050565b6006810154801580612c3757506001820154155b15612c485750426002909101555050565b5f826002015442612c599190613fce565b90505f600654846001015460035484612c729190614035565b612c7c9190614035565b612c86919061404c565b90505f6103e890505f600f54600e54600d5484612ca39190613fce565b612cad9190613fce565b612cb79190613fce565b600254600a54600d549293506001600160a01b03918216926340c10f1992909116908590612ce59088614035565b612cef919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612d32575f5ffd5b505af1158015612d44573d5f5f3e3d5ffd5b5050600254600b54600e546001600160a01b0392831694506340c10f1993509116908590612d729088614035565b612d7c919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612dbf575f5ffd5b505af1158015612dd1573d5f5f3e3d5ffd5b5050600254600c54600f546001600160a01b0392831694506340c10f1993509116908590612dff9088614035565b612e09919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612e4c575f5ffd5b505af1158015612e5e573d5f5f3e3d5ffd5b50506002546001600160a01b031691506340c10f1990503084612e818588614035565b612e8b919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612ece575f5ffd5b505af1158015612ee0573d5f5f3e3d5ffd5b505050600687015483915082612f167f000000000000000000000000000000000000000000000000000000000000000087614035565b612f209190614035565b612f2a919061404c565b612f34919061404c565b866003015f828254612f469190613fe1565b909155505042600287018190556003870154604080519283526020830188905282015288907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469060600160405180910390a25050505050505050565b5f60048281548110612fb657612fb6613fa6565b5f91825260208083208584526005825260408085203386529092529220600381015460089092029092019250158015612ff157506007544210155b1561300b5760058201546130059042613fe1565b60038201555b5f81600101547f00000000000000000000000000000000000000000000000000000000000000008460030154845f01546130459190614035565b61304f919061404c565b6130599190613fce565b905061306584336109de565b156130d8575f81118061307b57505f8260020154115b156130d3575f8260020154826130919190613fe1565b9050826002015460085f8282546130a89190613fce565b90915550505f600284015560058401546130c29042613fe1565b60038401556130d13382613779565b505b613146565b8015613146578060085f8282546130ef9190613fe1565b9250508190555080826002015f8282546131099190613fe1565b9091555050604051818152849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c19060200160405180910390a35b50505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f928392908716916131a791906140b1565b5f604051808303815f865af19150503d805f81146131e0576040519150601f19603f3d011682016040523d82523d5f602084013e6131e5565b606091505b509150915081801561320f57508051158061320f57508080602001905181019061320f91906140c7565b61325b5760405162461bcd60e51b815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c65640000000060448201526064016106d8565b5050505050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916132a891906140b1565b5f60405180830381855afa9150503d805f81146132e0576040519150601f19603f3d011682016040523d82523d5f602084013e6132e5565b606091505b50915091508161331057604051806040016040528060038152602001623f3f3f60e81b815250613319565b613319816138a6565b949350505050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b0386169161336691906140b1565b5f60405180830381855afa9150503d805f811461339e576040519150601f19603f3d011682016040523d82523d5f602084013e6133a3565b606091505b50915091508180156133b6575080516020145b6133c1576012613319565b8080602001905181019061331991906140e6565b600454829081106133f85760405162461bcd60e51b81526004016106d890613f79565b5f6004848154811061340c5761340c613fa6565b5f918252602080832087845260058252604080852033865290925292206008909102909101915061343c85612bce565b61344585612fa2565b83156135ec5781546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613490573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134b4919061409a565b83549091506134ce906001600160a01b0316333088613a31565b82546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613513573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613537919061409a565b90506135438282613fce565b600485015490965061ffff16156135a45760048401545f906127109061356d9061ffff1689614035565b613577919061404c565b600b548654919250613596916001600160a01b0390811691168361314c565b6135a08188613fce565b9650505b85835f015f8282546135b69190613fe1565b909155505060025484546001600160a01b039182169116036135e9578560095f8282546135e39190613fe1565b90915550505b50505b600382015481547f00000000000000000000000000000000000000000000000000000000000000009161361e91614035565b613628919061404c565b60018201555f5b60078301548110156136cc5782600701818154811061365057613650613fa6565b5f918252602090912001548254604051632eef144760e01b81526004810189905233602482015260448101919091526001600160a01b0390911690632eef1447906064015f604051808303815f87803b1580156136ab575f5ffd5b505af11580156136bd573d5f5f3e3d5ffd5b5050505080600101905061362f565b5083156136ec5783826006015f8282546136e69190613fe1565b90915550505b604051848152859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a35050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6009546002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156137c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137e6919061409a565b1115610e4a576009546002546040516370a0823160e01b81523060048201525f92916001600160a01b0316906370a0823190602401602060405180830381865afa158015613836573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061385a919061409a565b6138649190613fce565b905080821061388957600254613884906001600160a01b0316848361314c565b505050565b811561388457600254613884906001600160a01b0316848461314c565b606060408251106138cb57818060200190518101906138c59190614101565b92915050565b8151602003613a0d575f5b60208160ff1610801561390b5750828160ff16815181106138f9576138f9613fa6565b01602001516001600160f81b03191615155b15613922578061391a816141b1565b9150506138d6565b5f8160ff166001600160401b0381111561393e5761393e61406b565b6040519080825280601f01601f191660200182016040528015613968576020820181803683370190505b5090505f91505b60208260ff161080156139a45750838260ff168151811061399257613992613fa6565b01602001516001600160f81b03191615155b15613a0657838260ff16815181106139be576139be613fa6565b602001015160f81c60f81b818360ff16815181106139de576139de613fa6565b60200101906001600160f81b03191690815f1a905350816139fe816141b1565b92505061396f565b9392505050565b50506040805180820190915260038152623f3f3f60e81b602082015290565b919050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f92839290881691613a9491906140b1565b5f604051808303815f865af19150503d805f8114613acd576040519150601f19603f3d011682016040523d82523d5f602084013e613ad2565b606091505b5091509150818015613afc575080511580613afc575080806020019051810190613afc91906140c7565b6118b95760405162461bcd60e51b815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c656460448201526064016106d8565b828054828255905f5260205f20908101928215613b99579160200282015b82811115613b995781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613b66565b50613ba5929150613bfc565b5090565b828054828255905f5260205f20908101928215613b99579160200282015b82811115613b9957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613bc7565b5b80821115613ba5575f8155600101613bfd565b5f60208284031215613c20575f5ffd5b5035919050565b803561ffff81168114613a2c575f5ffd5b5f5f83601f840112613c48575f5ffd5b5081356001600160401b03811115613c5e575f5ffd5b6020830191508360208260051b8501011115613c78575f5ffd5b9250929050565b5f5f5f5f5f5f60a08789031215613c94575f5ffd5b8635955060208701359450613cab60408801613c27565b93506060870135925060808701356001600160401b03811115613ccc575f5ffd5b613cd889828a01613c38565b979a9699509497509295939492505050565b6001600160a01b03811681146118db575f5ffd5b5f5f60408385031215613d0f575f5ffd5b823591506020830135613d2181613cea565b809150509250929050565b5f60208284031215613d3c575f5ffd5b8135613a0681613cea565b5f5f60408385031215613d58575f5ffd5b50508035926020909101359150565b5f8151808452602084019350602083015f5b82811015613da05781516001600160a01b0316865260209586019590910190600101613d79565b5093949350505050565b5f8151808452602084019350602083015f5b82811015613da0578151865260209586019590910190600101613dbc565b608081525f613dec6080830187613d67565b828103602084015280865180835260208301915060208160051b840101602089015f5b83811015613e6157601f19868403018552815180518085528060208301602087015e5f602082870101526020601f19601f83011686010194505050602082019150602085019450600181019050613e0f565b50508581036040870152613e758189613daa565b93505050508281036060840152613e8c8185613daa565b979650505050505050565b5f5f5f5f5f5f60a08789031215613eac575f5ffd5b863595506020870135613ebe81613cea565b9450613cab60408801613c27565b60ff811681146118db575f5ffd5b5f5f5f5f5f5f60c08789031215613eef575f5ffd5b8635955060208701359450604087013593506060870135613f0f81613ecc565b9598949750929560808101359460a0909101359350915050565b5f5f60208385031215613f3a575f5ffd5b82356001600160401b03811115613f4f575f5ffd5b613f5b85828601613c38565b90969095509350505050565b602081525f613a066020830184613d67565b602080825260139082015272141bdbdb08191bd95cc81b9bdd08195e1a5cdd606a1b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156138c5576138c5613fba565b808201808211156138c5576138c5613fba565b5f8184825b8581101561402a57813561400c81613cea565b6001600160a01b031683526020928301929190910190600101613ff9565b509095945050505050565b80820281158282048414176138c5576138c5613fba565b5f8261406657634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561408f575f5ffd5b8151613a0681613cea565b5f602082840312156140aa575f5ffd5b5051919050565b5f82518060208501845e5f920191825250919050565b5f602082840312156140d7575f5ffd5b81518015158114613a06575f5ffd5b5f602082840312156140f6575f5ffd5b8151613a0681613ecc565b5f60208284031215614111575f5ffd5b81516001600160401b03811115614126575f5ffd5b8201601f81018413614136575f5ffd5b80516001600160401b0381111561414f5761414f61406b565b604051601f8201601f19908116603f011681016001600160401b038111828210171561417d5761417d61406b565b604052818152828201602001861015614194575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60ff821660ff81036141c6576141c6613fba565b6001019291505056fea26469706673582212200f0aae3fb354bab81278a2d6a4c4710cb0ff84a8eaffc0face0f4f738301ec1864736f6c634300081c0033000000000000000000000000a61a600fc7c49457a52a1bad22f77d58faa9b3ba0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000003cea4cd7da3aa815ac05b561d9b30289f6ec99d50000000000000000000000003cea4cd7da3aa815ac05b561d9b30289f6ec99d50000000000000000000000003cea4cd7da3aa815ac05b561d9b30289f6ec99d5000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610260575f3560e01c8063654c9ece1161014b578063c5f956af116100bf578063e2bbb15811610084578063e2bbb1581461058a578063e6fd48bc1461059d578063eddf9652146105a6578063eff8976b146105b9578063f2fde38b146105d9578063ffcd4263146105ec575f5ffd5b8063c5f956af14610548578063d219c6681461055b578063dc640ac914610564578063de73149d14610577578063e164ac5014610581575f5ffd5b8063876d3c9c11610110578063876d3c9c1461049857806389a2bc25146104ab5780638da5cb5b146104be57806393f1a40b146104ce578063949e63021461052d578063afbcfea114610540575f5ffd5b8063654c9ece1461043b5780636605bfda1461044e5780636690864e14610461578063715018a614610474578063812c64f11461047c575f5ffd5b80633a133200116101e2578063508593ab116101a7578063508593ab146103de578063515bc323146103f157806351eb05a61461040457806352e57183146104175780635312ea8e14610420578063630b5ba114610433575f5ffd5b80633a1332001461037957806342602f1e1461038c578063441a3e701461039f578063465e81ec146103b2578063474fa630146103d5575f5ffd5b80631526fe27116102285780631526fe27146102d157806317caf6f1146103275780631c75f085146103305780632081ccc4146103435780632e6c998d14610356575f5ffd5b806304ef9d58146102645780630735b20814610280578063081e3eda146102895780630ba84cd21461029157806312e228fd146102a6575b5f5ffd5b61026d600e5481565b6040519081526020015b60405180910390f35b61026d600f5481565b60045461026d565b6102a461029f366004613c10565b6105ff565b005b600c546102b9906001600160a01b031681565b6040516001600160a01b039091168152602001610277565b6102e46102df366004613c10565b610652565b604080516001600160a01b039098168852602088019690965294860193909352606085019190915261ffff16608084015260a083015260c082015260e001610277565b61026d60065481565b600a546102b9906001600160a01b031681565b6102a4610351366004613c7f565b6106ad565b610369610364366004613cfe565b6109de565b6040519015158152602001610277565b6002546102b9906001600160a01b031681565b6102a461039a366004613d2c565b610a43565b6102a46103ad366004613d47565b610b89565b6103c56103c0366004613c10565b610e4e565b6040516102779493929190613dda565b61026d60085481565b6102a46103ec366004613e97565b61141e565b6102a46103ff366004613eda565b6117d0565b6102a4610412366004613c10565b6118c1565b61026d60035481565b6102a461042e366004613c10565b6118de565b6102a4611ae0565b61026d610449366004613c10565b611afb565b6102a461045c366004613d2c565b611b26565b6102a461046f366004613d2c565b611c74565b6102a4611db2565b6104856101f481565b60405161ffff9091168152602001610277565b6102a46104a6366004613c10565b611dc3565b6102a46104b9366004613c10565b611ef3565b5f546001600160a01b03166102b9565b61050d6104dc366004613cfe565b600560209081525f928352604080842090915290825290208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610277565b6102a461053b366004613c10565b612023565b6102a461214b565b600b546102b9906001600160a01b031681565b61026d60095481565b6102a4610572366004613f29565b6121f6565b61026d6212750081565b61026d600d5481565b6102a4610598366004613d47565b61228d565b61026d60075481565b6102a46105b4366004613d47565b6122a8565b6105cc6105c7366004613c10565b612392565b6040516102779190613f67565b6102a46105e7366004613d2c565b61249d565b6103c56105fa366004613cfe565b612513565b610607612aff565b61060f612b58565b600354604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2600355565b60048181548110610661575f80fd5b5f91825260209091206008909102018054600182015460028301546003840154600485015460058601546006909601546001600160a01b03909516965092949193909261ffff16919087565b6106b5612aff565b600454869081106106e15760405162461bcd60e51b81526004016106d890613f79565b60405180910390fd5b600a8211156107325760405162461bcd60e51b815260206004820152601760248201527f7365743a20746f6f206d616e792072657761726465727300000000000000000060448201526064016106d8565b6101f461ffff861611156107885760405162461bcd60e51b815260206004820152601960248201527f7365743a206465706f7369742066656520746f6f20686967680000000000000060448201526064016106d8565b621275008411156107db5760405162461bcd60e51b815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016106d8565b5f5b828110156108725761081e8484838181106107fa576107fa613fa6565b905060200201602081019061080f9190613d2c565b6001600160a01b03163b151590565b61086a5760405162461bcd60e51b815260206004820152601e60248201527f7365743a207265776172646572206d75737420626520636f6e7472616374000060448201526064016106d8565b6001016107dd565b5061087b612b58565b856004888154811061088f5761088f613fa6565b905f5260205f209060080201600101546006546108ac9190613fce565b6108b69190613fe1565b60068190555085600488815481106108d0576108d0613fa6565b905f5260205f2090600802016001018190555084600488815481106108f7576108f7613fa6565b905f5260205f2090600802016004015f6101000a81548161ffff021916908361ffff160217905550836004888154811061093357610933613fa6565b905f5260205f2090600802016005018190555082826004898154811061095b5761095b613fa6565b905f5260205f2090600802016007019190610977929190613b48565b508282604051610988929190613ff4565b6040805191829003822088835261ffff881660208401529082018690529088907f5ed6f0deef9ab49d02900b40d596df4cd637a2a7fbfa56bbcb377389d3ce8d289060600160405180910390a350505050505050565b6004545f9083908110610a035760405162461bcd60e51b81526004016106d890613f79565b5f8481526005602090815260408083206001600160a01b038716845290915290206007544210801590610a3a575080600301544210155b95945050505050565b600c546001600160a01b03163314610acd5760405162461bcd60e51b815260206004820152604160248201527f73657420696e766573746f7220616464726573733a206f6e6c7920707265766960448201527f6f757320696e766573746f722063616e2063616c6c2074686973206d6574686f6064820152601960fa1b608482015260a4016106d8565b6001600160a01b038116610b3e5760405162461bcd60e51b815260206004820152603260248201527f73657420696e766573746f7220616464726573733a20696e76616c6964206e656044820152717720696e766573746f72206164647265737360701b60648201526084016106d8565b600c80546001600160a01b0319166001600160a01b03831690811790915560405133907f6260cb34f06b782e83bde168f7d74ab2133041cb53b63ce22b127822a92b6791905f90a350565b610b91612b75565b60045482908110610bb45760405162461bcd60e51b81526004016106d890613f79565b5f60048481548110610bc857610bc8613fa6565b5f91825260208083208784526005825260408085203386529092529220805460089092029092019250841115610c405760405162461bcd60e51b815260206004820181905260248201527f77697468647261773a207573657220616d6f756e74206e6f7420656e6f75676860448201526064016106d8565b8382600601541015610c945760405162461bcd60e51b815260206004820152601f60248201527f77697468647261773a20706f6f6c20746f74616c206e6f7420656e6f7567680060448201526064016106d8565b610c9d85612bce565b610ca685612fa2565b8315610d075783815f015f828254610cbe9190613fce565b909155505060025482546001600160a01b03918216911603610cf1578360095f828254610ceb9190613fce565b90915550505b8154610d07906001600160a01b0316338661314c565b600382015481547f000000000000000000000000000000000000000000000000000000e8d4a5100091610d3991614035565b610d43919061404c565b60018201555f5b6007830154811015610de757826007018181548110610d6b57610d6b613fa6565b5f918252602090912001548254604051632eef144760e01b81526004810189905233602482015260448101919091526001600160a01b0390911690632eef1447906064015f604051808303815f87803b158015610dc6575f5ffd5b505af1158015610dd8573d5f5f3e3d5ffd5b50505050806001019050610d4a565b508315610e075783826006015f828254610e019190613fce565b90915550505b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a3505050610e4a60018055565b5050565b606080606080846004805490508110610e795760405162461bcd60e51b81526004016106d890613f79565b5f60048781548110610e8d57610e8d613fa6565b905f5260205f209060080201905080600701805490506001610eaf9190613fe1565b6001600160401b03811115610ec657610ec661406b565b604051908082528060200260200182016040528015610eef578160200160208202803683370190505b506007820154909650610f03906001613fe1565b6001600160401b03811115610f1a57610f1a61406b565b604051908082528060200260200182016040528015610f4d57816020015b6060815260200190600190039081610f385790505b506007820154909550610f61906001613fe1565b6001600160401b03811115610f7857610f7861406b565b604051908082528060200260200182016040528015610fa1578160200160208202803683370190505b506007820154909450610fb5906001613fe1565b6001600160401b03811115610fcc57610fcc61406b565b604051908082528060200260200182016040528015610ff5578160200160208202803683370190505b5060025487519194506001600160a01b03169087905f9061101857611018613fa6565b6001600160a01b03928316602091820292909201015260025461103b9116613262565b855f8151811061104d5761104d613fa6565b602090810291909101015260025461106d906001600160a01b0316613321565b60ff16845f8151811061108257611082613fa6565b6020026020010181815250505f6103e890505f600f54600e54600d54846110a99190613fce565b6110b39190613fce565b6110bd9190613fce565b9050816006548260035486600101546110d69190614035565b6110e09190614035565b6110ea919061404c565b6110f4919061404c565b855f8151811061110657611106613fa6565b60209081029190910101525f5b60078401548110156114125783600701818154811061113457611134613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa15801561117f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a3919061407f565b896111af836001613fe1565b815181106111bf576111bf613fa6565b60200260200101906001600160a01b031690816001600160a01b0316815250506112748460070182815481106111f7576111f7613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa158015611242573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611266919061407f565b6001600160a01b0316613262565b88611280836001613fe1565b8151811061129057611290613fa6565b60200260200101819052506113308460070182815481106112b3576112b3613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa1580156112fe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611322919061407f565b6001600160a01b0316613321565b60ff168761133f836001613fe1565b8151811061134f5761134f613fa6565b60200260200101818152505083600701818154811061137057611370613fa6565b5f91825260209091200154604051631197a07b60e21b8152600481018c90526001600160a01b039091169063465e81ec90602401602060405180830381865afa1580156113bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e3919061409a565b866113ef836001613fe1565b815181106113ff576113ff613fa6565b6020908102919091010152600101611113565b50505050509193509193565b611426612aff565b600a8111156114775760405162461bcd60e51b815260206004820152601760248201527f6164643a20746f6f206d616e792072657761726465727300000000000000000060448201526064016106d8565b6101f461ffff851611156114cd5760405162461bcd60e51b815260206004820152601960248201527f6164643a206465706f7369742066656520746f6f20686967680000000000000060448201526064016106d8565b621275008311156115205760405162461bcd60e51b815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016106d8565b6001600160a01b0385163b6115865760405162461bcd60e51b815260206004820152602660248201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f6044820152651b9d1c9858dd60d21b60648201526084016106d8565b5f5b818110156115f9576115a58383838181106107fa576107fa613fa6565b6115f15760405162461bcd60e51b815260206004820152601e60248201527f6164643a207265776172646572206d75737420626520636f6e7472616374000060448201526064016106d8565b600101611588565b50611602612b58565b5f600754421161161457600754611616565b425b90508660065f8282546116299190613fe1565b925050819055506004604051806101000160405280886001600160a01b031681526020018981526020018381526020015f81526020018761ffff1681526020018681526020015f81526020018585808060200260200160405190810160405280939291908181526020018383602002808284375f920182905250939094525050835460018082018655948252602091829020845160089092020180546001600160a01b0319166001600160a01b0390921691909117815583820151948101949094556040830151600285015560608301516003850155608083015160048501805461ffff191661ffff90921691909117905560a0830151600585015560c0830151600685015560e0830151805193949361174d935060078501929190910190613ba9565b5050508282604051611760929190613ff4565b6040519081900390206004546001600160a01b0388169061178390600190613fce565b604080518b815261ffff8a1660208201529081018890527f5ed295c4f5af5aeb1ccd905e1cd55a86ab3bb9fc1fe2346ff64ac47dbef366619060600160405180910390a450505050505050565b6117d8612b75565b600454869081106117fb5760405162461bcd60e51b81526004016106d890613f79565b5f6004888154811061180f5761180f613fa6565b5f9182526020909120600890910201805460405163d505accf60e01b8152336004820152306024820152604481018a90526064810189905260ff8816608482015260a4810187905260c481018690529192506001600160a01b031690819063d505accf9060e4015f604051808303815f87803b15801561188d575f5ffd5b505af115801561189f573d5f5f3e3d5ffd5b505050506118ad89896133d5565b5050506118b960018055565b505050505050565b6118c9612b75565b6118d281612bce565b6118db60018055565b50565b6118e6612b75565b5f600482815481106118fa576118fa613fa6565b5f918252602080832085845260058252604080852033865290925292208054600892909202909201600681015490935081111561198b5760405162461bcd60e51b815260206004820152602960248201527f656d657267656e63792077697468647261773a20706f6f6c20746f74616c206e6044820152680dee840cadcdeeaced60bb1b60648201526084016106d8565b5f8083556001830181905560028301819055600383018190556006840180548392906119b8908490613fce565b909155505f90505b6007840154811015611a58578360070181815481106119e1576119e1613fa6565b5f918252602082200154604051632eef144760e01b81526004810188905233602482015260448101929092526001600160a01b031690632eef1447906064015f604051808303815f87803b158015611a37575f5ffd5b505af1158015611a49573d5f5f3e3d5ffd5b505050508060010190506119c0565b5060025483546001600160a01b03918216911603611a87578060095f828254611a819190613fce565b90915550505b8254611a9d906001600160a01b0316338361314c565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a35050506118db60018055565b611ae8612b75565b611af0612b58565b611af960018055565b565b5f60048281548110611b0f57611b0f613fa6565b905f5260205f209060080201600601549050919050565b600b546001600160a01b03163314611bb85760405162461bcd60e51b815260206004820152604960248201527f73657420747265617375727920616464726573733a206f6e6c7920707265766960448201527f6f757320747265617375727920616464726573732063616e2063616c6c2074686064820152681a5cc81b595d1a1bd960ba1b608482015260a4016106d8565b6001600160a01b038116611c295760405162461bcd60e51b815260206004820152603260248201527f73657420747265617375727920616464726573733a20696e76616c6964206e6560448201527177207472656173757279206164647265737360701b60648201526084016106d8565b600b80546001600160a01b0319166001600160a01b03831690811790915560405133907f61885cdba916be748ff3e3f6f15e4206153b8ea3b7acabade9d04b4063a83510905f90a350565b600a546001600160a01b03163314611cfe5760405162461bcd60e51b815260206004820152604160248201527f736574207465616d20616464726573733a206f6e6c792070726576696f75732060448201527f7465616d20616464726573732063616e2063616c6c2074686973206d6574686f6064820152601960fa1b608482015260a4016106d8565b6001600160a01b038116611d675760405162461bcd60e51b815260206004820152602a60248201527f736574207465616d20616464726573733a20696e76616c6964206e6577207465604482015269616d206164647265737360b01b60648201526084016106d8565b600a80546001600160a01b0319166001600160a01b03831690811790915560405133907f42fbc17d847fdc3e5c82da842a5ef3979c64f3b94cd4e7382310fd5525c6ee0f905f90a350565b611dba612aff565b611af95f61372a565b611dcb612aff565b6101f4811115611e315760405162461bcd60e51b815260206004820152602b60248201527f73657420696e766573746f722070657263656e743a20696e76616c696420706560448201526a7263656e742076616c756560a81b60648201526084016106d8565b6101f4600e5482600d54611e459190613fe1565b611e4f9190613fe1565b1115611eb25760405162461bcd60e51b815260206004820152602c60248201527f73657420696e766573746f722070657263656e743a20746f74616c207065726360448201526b0cadce840deeccae440dac2f60a31b60648201526084016106d8565b600f5460408051918252602082018390527f905b464403a98b455243c8b4d30c545b8fbd70cda670142b9326425b2c039f3b910160405180910390a1600f55565b611efb612aff565b6101f4811115611f615760405162461bcd60e51b815260206004820152602b60248201527f7365742074726561737572792070657263656e743a20696e76616c696420706560448201526a7263656e742076616c756560a81b60648201526084016106d8565b6101f4600f5482600d54611f759190613fe1565b611f7f9190613fe1565b1115611fe25760405162461bcd60e51b815260206004820152602c60248201527f7365742074726561737572792070657263656e743a20746f74616c207065726360448201526b0cadce840deeccae440dac2f60a31b60648201526084016106d8565b600e5460408051918252602082018390527fa565895c0101fca10e6a7b85742e56cf52ac5f58b09ce030425d3555b47069fd910160405180910390a1600e55565b61202b612aff565b6101f481111561208d5760405162461bcd60e51b815260206004820152602760248201527f736574207465616d2070657263656e743a20696e76616c69642070657263656e604482015266742076616c756560c81b60648201526084016106d8565b6101f4600f5482600e546120a19190613fe1565b6120ab9190613fe1565b111561210a5760405162461bcd60e51b815260206004820152602860248201527f736574207465616d2070657263656e743a20746f74616c2070657263656e74206044820152670deeccae440dac2f60c31b60648201526084016106d8565b600d5460408051918252602082018390527f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6910160405180910390a1600d55565b612153612aff565b60075442106121b05760405162461bcd60e51b815260206004820152602360248201527f7374617274206661726d696e673a206661726d207374617274656420616c726560448201526261647960e81b60648201526084016106d8565b6004545f5b818110156121ee575f600482815481106121d1576121d1613fa6565b5f91825260209091204260089092020160020155506001016121b5565b505042600755565b6121fe612b75565b601e81111561224f5760405162461bcd60e51b815260206004820152601f60248201527f68617276657374206d616e793a20746f6f206d616e7920706f6f6c206964730060448201526064016106d8565b5f5b818110156122835761227b83838381811061226e5761226e613fa6565b905060200201355f6133d5565b600101612251565b50610e4a60018055565b612295612b75565b61229f82826133d5565b610e4a60018055565b6122b0612aff565b6122b8612b58565b336001600160a01b03167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef3600484815481106122f6576122f6613fa6565b905f5260205f209060080201600101548360405161231e929190918252602082015260400190565b60405180910390a2806004838154811061233a5761233a613fa6565b905f5260205f209060080201600101546006546123579190613fce565b6123619190613fe1565b600681905550806004838154811061237b5761237b613fa6565b905f5260205f209060080201600101819055505050565b600454606090829081106123b85760405162461bcd60e51b81526004016106d890613f79565b5f600484815481106123cc576123cc613fa6565b905f5260205f209060080201905080600701805490506001600160401b038111156123f9576123f961406b565b604051908082528060200260200182016040528015612422578160200160208202803683370190505b5092505f5b60078201548110156124955781600701818154811061244857612448613fa6565b905f5260205f20015f9054906101000a90046001600160a01b031684828151811061247557612475613fa6565b6001600160a01b0390921660209283029190910190910152600101612427565b505050919050565b6124a5612aff565b6001600160a01b03811661250a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106d8565b6118db8161372a565b60608060608085600480549050811061253e5760405162461bcd60e51b81526004016106d890613f79565b5f6004888154811061255257612552613fa6565b5f91825260208083208b84526005825260408085206001600160a01b038d16865290925292206003600890920290920190810154600682015460028301549294509091421180156125a257508015155b15612674575f8460020154426125b89190613fce565b90505f6103e890505f600f54600e54600d54846125d59190613fce565b6125df9190613fce565b6125e99190613fce565b90505f82600654838a60010154600354886126049190614035565b61260e9190614035565b6126189190614035565b612622919061404c565b61262c919061404c565b9050846126597f000000000000000000000000000000000000000000000000000000e8d4a5100083614035565b612663919061404c565b61266d9087613fe1565b9550505050505b5f836002015484600101547f000000000000000000000000000000000000000000000000000000e8d4a5100085875f01546126af9190614035565b6126b9919061404c565b6126c39190613fce565b6126cd9190613fe1565b60078601549091506126e0906001613fe1565b6001600160401b038111156126f7576126f761406b565b604051908082528060200260200182016040528015612720578160200160208202803683370190505b506007860154909a50612734906001613fe1565b6001600160401b0381111561274b5761274b61406b565b60405190808252806020026020018201604052801561277e57816020015b60608152602001906001900390816127695790505b506007860154909950612792906001613fe1565b6001600160401b038111156127a9576127a961406b565b6040519080825280602002602001820160405280156127d2578160200160208202803683370190505b5060078601549097506127e6906001613fe1565b6001600160401b038111156127fd576127fd61406b565b604051908082528060200260200182016040528015612826578160200160208202803683370190505b506002548b519199506001600160a01b0316908b905f9061284957612849613fa6565b6001600160a01b03928316602091820292909201015260025461286c9116613262565b895f8151811061287e5761287e613fa6565b602090810291909101015260025461289e906001600160a01b0316613321565b60ff16885f815181106128b3576128b3613fa6565b60200260200101818152505080875f815181106128d2576128d2613fa6565b60209081029190910101525f5b6007860154811015612aef5785600701818154811061290057612900613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa15801561294b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296f919061407f565b8b61297b836001613fe1565b8151811061298b5761298b613fa6565b60200260200101906001600160a01b031690816001600160a01b0316815250506129c38660070182815481106111f7576111f7613fa6565b8a6129cf836001613fe1565b815181106129df576129df613fa6565b6020026020010181905250612a028660070182815481106112b3576112b3613fa6565b60ff1689612a11836001613fe1565b81518110612a2157612a21613fa6565b602002602001018181525050856007018181548110612a4257612a42613fa6565b5f9182526020909120015460405160016232bd9d60e01b03198152600481018f90526001600160a01b038e811660248301529091169063ffcd426390604401602060405180830381865afa158015612a9c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ac0919061409a565b88612acc836001613fe1565b81518110612adc57612adc613fa6565b60209081029190910101526001016128df565b5050505050505092959194509250565b5f546001600160a01b03163314611af95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106d8565b5f5b6004548110156118db57612b6d81612bce565b600101612b5a565b600260015403612bc75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106d8565b6002600155565b60045481908110612bf15760405162461bcd60e51b81526004016106d890613f79565b5f60048381548110612c0557612c05613fa6565b905f5260205f209060080201905080600201544211612c2357505050565b6006810154801580612c3757506001820154155b15612c485750426002909101555050565b5f826002015442612c599190613fce565b90505f600654846001015460035484612c729190614035565b612c7c9190614035565b612c86919061404c565b90505f6103e890505f600f54600e54600d5484612ca39190613fce565b612cad9190613fce565b612cb79190613fce565b600254600a54600d549293506001600160a01b03918216926340c10f1992909116908590612ce59088614035565b612cef919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612d32575f5ffd5b505af1158015612d44573d5f5f3e3d5ffd5b5050600254600b54600e546001600160a01b0392831694506340c10f1993509116908590612d729088614035565b612d7c919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612dbf575f5ffd5b505af1158015612dd1573d5f5f3e3d5ffd5b5050600254600c54600f546001600160a01b0392831694506340c10f1993509116908590612dff9088614035565b612e09919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612e4c575f5ffd5b505af1158015612e5e573d5f5f3e3d5ffd5b50506002546001600160a01b031691506340c10f1990503084612e818588614035565b612e8b919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612ece575f5ffd5b505af1158015612ee0573d5f5f3e3d5ffd5b505050600687015483915082612f167f000000000000000000000000000000000000000000000000000000e8d4a5100087614035565b612f209190614035565b612f2a919061404c565b612f34919061404c565b866003015f828254612f469190613fe1565b909155505042600287018190556003870154604080519283526020830188905282015288907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469060600160405180910390a25050505050505050565b5f60048281548110612fb657612fb6613fa6565b5f91825260208083208584526005825260408085203386529092529220600381015460089092029092019250158015612ff157506007544210155b1561300b5760058201546130059042613fe1565b60038201555b5f81600101547f000000000000000000000000000000000000000000000000000000e8d4a510008460030154845f01546130459190614035565b61304f919061404c565b6130599190613fce565b905061306584336109de565b156130d8575f81118061307b57505f8260020154115b156130d3575f8260020154826130919190613fe1565b9050826002015460085f8282546130a89190613fce565b90915550505f600284015560058401546130c29042613fe1565b60038401556130d13382613779565b505b613146565b8015613146578060085f8282546130ef9190613fe1565b9250508190555080826002015f8282546131099190613fe1565b9091555050604051818152849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c19060200160405180910390a35b50505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f928392908716916131a791906140b1565b5f604051808303815f865af19150503d805f81146131e0576040519150601f19603f3d011682016040523d82523d5f602084013e6131e5565b606091505b509150915081801561320f57508051158061320f57508080602001905181019061320f91906140c7565b61325b5760405162461bcd60e51b815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c65640000000060448201526064016106d8565b5050505050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916132a891906140b1565b5f60405180830381855afa9150503d805f81146132e0576040519150601f19603f3d011682016040523d82523d5f602084013e6132e5565b606091505b50915091508161331057604051806040016040528060038152602001623f3f3f60e81b815250613319565b613319816138a6565b949350505050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b0386169161336691906140b1565b5f60405180830381855afa9150503d805f811461339e576040519150601f19603f3d011682016040523d82523d5f602084013e6133a3565b606091505b50915091508180156133b6575080516020145b6133c1576012613319565b8080602001905181019061331991906140e6565b600454829081106133f85760405162461bcd60e51b81526004016106d890613f79565b5f6004848154811061340c5761340c613fa6565b5f918252602080832087845260058252604080852033865290925292206008909102909101915061343c85612bce565b61344585612fa2565b83156135ec5781546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613490573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134b4919061409a565b83549091506134ce906001600160a01b0316333088613a31565b82546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613513573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613537919061409a565b90506135438282613fce565b600485015490965061ffff16156135a45760048401545f906127109061356d9061ffff1689614035565b613577919061404c565b600b548654919250613596916001600160a01b0390811691168361314c565b6135a08188613fce565b9650505b85835f015f8282546135b69190613fe1565b909155505060025484546001600160a01b039182169116036135e9578560095f8282546135e39190613fe1565b90915550505b50505b600382015481547f000000000000000000000000000000000000000000000000000000e8d4a510009161361e91614035565b613628919061404c565b60018201555f5b60078301548110156136cc5782600701818154811061365057613650613fa6565b5f918252602090912001548254604051632eef144760e01b81526004810189905233602482015260448101919091526001600160a01b0390911690632eef1447906064015f604051808303815f87803b1580156136ab575f5ffd5b505af11580156136bd573d5f5f3e3d5ffd5b5050505080600101905061362f565b5083156136ec5783826006015f8282546136e69190613fe1565b90915550505b604051848152859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a35050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6009546002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156137c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137e6919061409a565b1115610e4a576009546002546040516370a0823160e01b81523060048201525f92916001600160a01b0316906370a0823190602401602060405180830381865afa158015613836573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061385a919061409a565b6138649190613fce565b905080821061388957600254613884906001600160a01b0316848361314c565b505050565b811561388457600254613884906001600160a01b0316848461314c565b606060408251106138cb57818060200190518101906138c59190614101565b92915050565b8151602003613a0d575f5b60208160ff1610801561390b5750828160ff16815181106138f9576138f9613fa6565b01602001516001600160f81b03191615155b15613922578061391a816141b1565b9150506138d6565b5f8160ff166001600160401b0381111561393e5761393e61406b565b6040519080825280601f01601f191660200182016040528015613968576020820181803683370190505b5090505f91505b60208260ff161080156139a45750838260ff168151811061399257613992613fa6565b01602001516001600160f81b03191615155b15613a0657838260ff16815181106139be576139be613fa6565b602001015160f81c60f81b818360ff16815181106139de576139de613fa6565b60200101906001600160f81b03191690815f1a905350816139fe816141b1565b92505061396f565b9392505050565b50506040805180820190915260038152623f3f3f60e81b602082015290565b919050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f92839290881691613a9491906140b1565b5f604051808303815f865af19150503d805f8114613acd576040519150601f19603f3d011682016040523d82523d5f602084013e613ad2565b606091505b5091509150818015613afc575080511580613afc575080806020019051810190613afc91906140c7565b6118b95760405162461bcd60e51b815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c656460448201526064016106d8565b828054828255905f5260205f20908101928215613b99579160200282015b82811115613b995781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613b66565b50613ba5929150613bfc565b5090565b828054828255905f5260205f20908101928215613b99579160200282015b82811115613b9957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613bc7565b5b80821115613ba5575f8155600101613bfd565b5f60208284031215613c20575f5ffd5b5035919050565b803561ffff81168114613a2c575f5ffd5b5f5f83601f840112613c48575f5ffd5b5081356001600160401b03811115613c5e575f5ffd5b6020830191508360208260051b8501011115613c78575f5ffd5b9250929050565b5f5f5f5f5f5f60a08789031215613c94575f5ffd5b8635955060208701359450613cab60408801613c27565b93506060870135925060808701356001600160401b03811115613ccc575f5ffd5b613cd889828a01613c38565b979a9699509497509295939492505050565b6001600160a01b03811681146118db575f5ffd5b5f5f60408385031215613d0f575f5ffd5b823591506020830135613d2181613cea565b809150509250929050565b5f60208284031215613d3c575f5ffd5b8135613a0681613cea565b5f5f60408385031215613d58575f5ffd5b50508035926020909101359150565b5f8151808452602084019350602083015f5b82811015613da05781516001600160a01b0316865260209586019590910190600101613d79565b5093949350505050565b5f8151808452602084019350602083015f5b82811015613da0578151865260209586019590910190600101613dbc565b608081525f613dec6080830187613d67565b828103602084015280865180835260208301915060208160051b840101602089015f5b83811015613e6157601f19868403018552815180518085528060208301602087015e5f602082870101526020601f19601f83011686010194505050602082019150602085019450600181019050613e0f565b50508581036040870152613e758189613daa565b93505050508281036060840152613e8c8185613daa565b979650505050505050565b5f5f5f5f5f5f60a08789031215613eac575f5ffd5b863595506020870135613ebe81613cea565b9450613cab60408801613c27565b60ff811681146118db575f5ffd5b5f5f5f5f5f5f60c08789031215613eef575f5ffd5b8635955060208701359450604087013593506060870135613f0f81613ecc565b9598949750929560808101359460a0909101359350915050565b5f5f60208385031215613f3a575f5ffd5b82356001600160401b03811115613f4f575f5ffd5b613f5b85828601613c38565b90969095509350505050565b602081525f613a066020830184613d67565b602080825260139082015272141bdbdb08191bd95cc81b9bdd08195e1a5cdd606a1b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156138c5576138c5613fba565b808201808211156138c5576138c5613fba565b5f8184825b8581101561402a57813561400c81613cea565b6001600160a01b031683526020928301929190910190600101613ff9565b509095945050505050565b80820281158282048414176138c5576138c5613fba565b5f8261406657634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561408f575f5ffd5b8151613a0681613cea565b5f602082840312156140aa575f5ffd5b5051919050565b5f82518060208501845e5f920191825250919050565b5f602082840312156140d7575f5ffd5b81518015158114613a06575f5ffd5b5f602082840312156140f6575f5ffd5b8151613a0681613ecc565b5f60208284031215614111575f5ffd5b81516001600160401b03811115614126575f5ffd5b8201601f81018413614136575f5ffd5b80516001600160401b0381111561414f5761414f61406b565b604051601f8201601f19908116603f011681016001600160401b038111828210171561417d5761417d61406b565b604052818152828201602001861015614194575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60ff821660ff81036141c6576141c6613fba565b6001019291505056fea26469706673582212200f0aae3fb354bab81278a2d6a4c4710cb0ff84a8eaffc0face0f4f738301ec1864736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a61a600fc7c49457a52a1bad22f77d58faa9b3ba0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000003cea4cd7da3aa815ac05b561d9b30289f6ec99d50000000000000000000000003cea4cd7da3aa815ac05b561d9b30289f6ec99d50000000000000000000000003cea4cd7da3aa815ac05b561d9b30289f6ec99d5000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _swift (address): 0xA61a600fC7c49457a52a1bAd22F77D58FAa9B3BA
Arg [1] : _swiftPerSec (uint256): 1000000000000000000
Arg [2] : _teamAddress (address): 0x3CeA4cd7da3aa815AC05b561D9b30289F6eC99d5
Arg [3] : _treasuryAddress (address): 0x3CeA4cd7da3aa815AC05b561D9b30289F6eC99d5
Arg [4] : _investorAddress (address): 0x3CeA4cd7da3aa815AC05b561D9b30289F6eC99d5
Arg [5] : _teamPercent (uint256): 100
Arg [6] : _treasuryPercent (uint256): 200
Arg [7] : _investorPercent (uint256): 0
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000a61a600fc7c49457a52a1bad22f77d58faa9b3ba
Arg [1] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [2] : 0000000000000000000000003cea4cd7da3aa815ac05b561d9b30289f6ec99d5
Arg [3] : 0000000000000000000000003cea4cd7da3aa815ac05b561d9b30289f6ec99d5
Arg [4] : 0000000000000000000000003cea4cd7da3aa815ac05b561d9b30289f6ec99d5
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [6] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
21811:28316:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24152:30;;;;;;;;;160:25:1;;;148:2;133:18;24152:30:0;;;;;;;;24253;;;;;;28168:95;28240:8;:15;28168:95;;45926:219;;;;;;:::i;:::-;;:::i;:::-;;23961:30;;;;;-1:-1:-1;;;;;23961:30:0;;;;;;-1:-1:-1;;;;;591:32:1;;;573:51;;561:2;546:18;23961:30:0;427:203:1;23259:26:0;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;986:32:1;;;968:51;;1050:2;1035:18;;1028:34;;;;1078:18;;;1071:34;;;;1136:2;1121:18;;1114:34;;;;1197:6;1185:19;1179:3;1164:19;;1157:48;1006:3;1221:19;;1214:35;1280:3;1265:19;;1258:35;955:3;940:19;23259:26:0;635:664:1;23504:34:0;;;;;;23835:26;;;;;-1:-1:-1;;;;;23835:26:0;;;30413:1410;;;;;;:::i;:::-;;:::i;36829:326::-;;;;;;:::i;:::-;;:::i;:::-;;;3443:14:1;;3436:22;3418:41;;3406:2;3391:18;36829:326:0;3278:187:1;22920:25:0;;;;;-1:-1:-1;;;;;22920:25:0;;;49147:474;;;;;;:::i;:::-;;:::i;41449:1414::-;;;;;;:::i;:::-;;:::i;34444:1769::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;23665:35::-;;;;;;28476:1824;;;;;;:::i;:::-;;:::i;39164:443::-;;;;;;:::i;:::-;;:::i;37602:92::-;;;;;;:::i;:::-;;:::i;22994:26::-;;;;;;42934:1016;;;;;;:::i;:::-;;:::i;37238:86::-;;;:::i;46614:113::-;;;;;;:::i;:::-;;:::i;48092:482::-;;;;;;:::i;:::-;;:::i;47129:434::-;;;;;;:::i;:::-;;:::i;2662:103::-;;;:::i;23171:53::-;;23221:3;23171:53;;;;;8844:6:1;8832:19;;;8814:38;;8802:2;8787:18;23171:53:0;8670:188:1;49629:495:0;;;;;;:::i;:::-;;:::i;48582:::-;;;;;;:::i;:::-;;:::i;2021:87::-;2067:7;2094:6;-1:-1:-1;;;;;2094:6:0;2021:87;;23343:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9094:25:1;;;9150:2;9135:18;;9128:34;;;;9178:18;;;9171:34;9236:2;9221:18;;9214:34;9081:3;9066:19;23343:64:0;8863:391:1;47571:455:0;;;;;;:::i;:::-;;:::i;27719:441::-;;;:::i;23896:30::-;;;;;-1:-1:-1;;;;;23896:30:0;;;23768:36;;;;;;46798:265;;;;;;:::i;:::-;;:::i;23067:58::-;;23118:7;23067:58;;24055:26;;;;;;39660:110;;;;;;:::i;:::-;;:::i;23595:29::-;;;;;;46153:453;;;;;;:::i;:::-;;:::i;36271:494::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2920:201::-;;;;;;:::i;:::-;;:::i;31889:2488::-;;;;;;:::i;:::-;;:::i;45926:219::-;1907:13;:11;:13::i;:::-;46004:18:::1;:16;:18::i;:::-;46072:11;::::0;46040:58:::1;::::0;;10159:25:1;;;10215:2;10200:18;;10193:34;;;46060:10:0::1;::::0;46040:58:::1;::::0;10132:18:1;46040:58:0::1;;;;;;;46111:11;:26:::0;45926:219::o;23259:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23259:26:0;;;;-1:-1:-1;23259:26:0;;;;;;;;;;;:::o;30413:1410::-;1907:13;:11;:13::i;:::-;24449:8:::1;:15:::0;30636:4;;24442:22;::::1;24434:54;;;;-1:-1:-1::0;;;24434:54:0::1;;;;;;;:::i;:::-;;;;;;;;;30682:2:::2;30661:23:::0;::::2;;30653:59;;;::::0;-1:-1:-1;;;30653:59:0;;10788:2:1;30653:59:0::2;::::0;::::2;10770:21:1::0;10827:2;10807:18;;;10800:30;10866:25;10846:18;;;10839:53;10909:18;;30653:59:0::2;10586:347:1::0;30653:59:0::2;23221:3;30747:41;::::0;::::2;;;30725:116;;;::::0;-1:-1:-1;;;30725:116:0;;11140:2:1;30725:116:0::2;::::0;::::2;11122:21:1::0;11179:2;11159:18;;;11152:30;11218:27;11198:18;;;11191:55;11263:18;;30725:116:0::2;10938:349:1::0;30725:116:0::2;23118:7;30874:16;:44;;30852:123;;;::::0;-1:-1:-1;;;30852:123:0;;11494:2:1;30852:123:0::2;::::0;::::2;11476:21:1::0;11533:2;11513:18;;;11506:30;11572:31;11552:18;;;11545:59;11621:18;;30852:123:0::2;11292:353:1::0;30852:123:0::2;31007:18;30988:295;31044:30:::0;;::::2;30988:295;;;31154:51;31181:10;;31192;31181:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8317:19:0;;:23;;;8022:326;31154:51:::2;31128:143;;;::::0;-1:-1:-1;;;31128:143:0;;12260:2:1;31128:143:0::2;::::0;::::2;12242:21:1::0;12299:2;12279:18;;;12272:30;12338:32;12318:18;;;12311:60;12388:18;;31128:143:0::2;12058:354:1::0;31128:143:0::2;31089:12;;30988:295;;;;31295:18;:16;:18::i;:::-;31429:11;31388:8;31397:4;31388:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;31357:15;;:56;;;;:::i;:::-;:83;;;;:::i;:::-;31326:15;:114;;;;31481:11;31453:8;31462:4;31453:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;31533:13;31503:8;31512:4;31503:14;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;31590:16;31557:8;31566:4;31557:14;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;:49;;;;31644:10;;31617:8;31626:4;31617:14;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;:37;;;;;;;:::i;:::-;;31794:10;;31672:143;;;;;;;:::i;:::-;;::::0;;;;;::::2;::::0;;13638:25:1;;;13711:6;13699:19;;13694:2;13679:18;;13672:47;13735:18;;;13728:34;;;31672:143:0;31690:4;;31672:143:::2;::::0;13626:2:1;13611:18;31672:143:0::2;;;;;;;1931:1:::1;30413:1410:::0;;;;;;:::o;36829:326::-;24449:8;:15;36959:4;;36935;;24442:22;;24434:54;;;;-1:-1:-1;;;24434:54:0;;;;;;;:::i;:::-;36981:21:::1;37005:14:::0;;;:8:::1;:14;::::0;;;;;;;-1:-1:-1;;;;;37005:21:0;::::1;::::0;;;;;;;37076:14:::1;::::0;37057:15:::1;:33;::::0;::::1;::::0;:90:::1;;;37126:4;:21;;;37107:15;:40;;37057:90;37037:110:::0;36829:326;-1:-1:-1;;;;;36829:326:0:o;49147:474::-;49255:15;;-1:-1:-1;;;;;49255:15:0;49241:10;:29;49219:144;;;;-1:-1:-1;;;49219:144:0;;13975:2:1;49219:144:0;;;13957:21:1;14014:2;13994:18;;;13987:30;14053:34;14033:18;;;14026:62;14124:34;14104:18;;;14097:62;-1:-1:-1;;;14175:19:1;;;14168:32;14217:19;;49219:144:0;13773:469:1;49219:144:0;-1:-1:-1;;;;;49396:30:0;;49374:130;;;;-1:-1:-1;;;49374:130:0;;14449:2:1;49374:130:0;;;14431:21:1;14488:2;14468:18;;;14461:30;14527:34;14507:18;;;14500:62;-1:-1:-1;;;14578:18:1;;;14571:48;14636:19;;49374:130:0;14247:414:1;49374:130:0;49515:15;:34;;-1:-1:-1;;;;;;49515:34:0;-1:-1:-1;;;;;49515:34:0;;;;;;;;49565:48;;49584:10;;49565:48;;-1:-1:-1;;49565:48:0;49147:474;:::o;41449:1414::-;5732:21;:19;:21::i;:::-;24449:8:::1;:15:::0;41563:4;;24442:22;::::1;24434:54;;;;-1:-1:-1::0;;;24434:54:0::1;;;;;;;:::i;:::-;41585:21:::2;41609:8;41618:4;41609:14;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;41658;;;:8:::2;:14:::0;;;;;;41673:10:::2;41658:26:::0;;;;;;;41778:11;;41609:14:::2;::::0;;::::2;::::0;;::::2;::::0;-1:-1:-1;41778:22:0;-1:-1:-1;41778:22:0::2;41770:67;;;::::0;-1:-1:-1;;;41770:67:0;;14868:2:1;41770:67:0::2;::::0;::::2;14850:21:1::0;;;14887:18;;;14880:30;14946:34;14926:18;;;14919:62;14998:18;;41770:67:0::2;14666:356:1::0;41770:67:0::2;41926:7;41910:4;:12;;;:23;;41902:67;;;::::0;-1:-1:-1;;;41902:67:0;;15229:2:1;41902:67:0::2;::::0;::::2;15211:21:1::0;15268:2;15248:18;;;15241:30;15307:33;15287:18;;;15280:61;15358:18;;41902:67:0::2;15027:355:1::0;41902:67:0::2;41982:17;41994:4;41982:11;:17::i;:::-;42012:29;42036:4;42012:23;:29::i;:::-;42058:11:::0;;42054:249:::2;;42101:7;42086:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42160:5:0::2;::::0;42135:12;;-1:-1:-1;;;;;42160:5:0;;::::2;42135:12:::0;::::2;42127:39:::0;42123:108:::2;;42208:7;42187:17;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42123:108:0::2;42245:12:::0;;:46:::2;::::0;-1:-1:-1;;;;;42245:12:0::2;42271:10;42283:7:::0;42245:25:::2;:46::i;:::-;42361:21;::::0;::::2;::::0;42347:11;;42399:19:::2;::::0;42347:35:::2;::::0;::::2;:::i;:::-;42346:72;;;;:::i;:::-;42315:15;::::0;::::2;:103:::0;42450:18:::2;42431:293;42500:14;::::0;::::2;:21:::0;42487:34;::::2;42431:293;;;42575:4;:14;;42590:10;42575:26;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;42686:11;;42575:137:::2;::::0;-1:-1:-1;;;42575:137:0;;::::2;::::0;::::2;15984:25:1::0;;;42657:10:0::2;16025:18:1::0;;;16018:60;16094:18;;;16087:34;;;;-1:-1:-1;;;;;42575:26:0;;::::2;::::0;:40:::2;::::0;15957:18:1;;42575:137:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42536:12;;;;;42431:293;;;-1:-1:-1::0;42740:11:0;;42736:67:::2;;42784:7;42768:4;:12;;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42736:67:0::2;42820:35;::::0;160:25:1;;;42841:4:0;;42829:10:::2;::::0;42820:35:::2;::::0;148:2:1;133:18;42820:35:0::2;;;;;;;41574:1289;;5764:1:::1;5776:20:::0;5170:1;6296:22;;6113:213;5776:20;41449:1414;;:::o;34444:1769::-;34582:26;34623:23;34661:25;34701:30;34544:4;24449:8;:15;;;;24442:4;:22;24434:54;;;;-1:-1:-1;;;24434:54:0;;;;;;;:::i;:::-;34759:21:::1;34783:8;34792:4;34783:14;;;;;;;;:::i;:::-;;;;;;;;;;;34759:38;;34836:4;:14;;:21;;;;34860:1;34836:25;;;;:::i;:::-;-1:-1:-1::0;;;;;34822:40:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;34822:40:0::1;-1:-1:-1::0;34896:14:0::1;::::0;::::1;:21:::0;34810:52;;-1:-1:-1;34896:25:0::1;::::0;34920:1:::1;34896:25;:::i;:::-;-1:-1:-1::0;;;;;34883:39:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;34958:14:0::1;::::0;::::1;:21:::0;34873:49;;-1:-1:-1;34958:25:0::1;::::0;34982:1:::1;34958:25;:::i;:::-;-1:-1:-1::0;;;;;34944:40:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;34944:40:0::1;-1:-1:-1::0;35025:14:0::1;::::0;::::1;:21:::0;34933:51;;-1:-1:-1;35025:25:0::1;::::0;35049:1:::1;35025:25;:::i;:::-;-1:-1:-1::0;;;;;35011:40:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;35011:40:0::1;-1:-1:-1::0;35087:5:0::1;::::0;35064:12;;34995:56;;-1:-1:-1;;;;;;35087:5:0::1;::::0;35064:9;;35087:5:::1;::::0;35064:12:::1;;;;:::i;:::-;-1:-1:-1::0;;;;;35064:29:0;;::::1;:12;::::0;;::::1;::::0;;;;;:29;35130:5:::1;::::0;35117:32:::1;::::0;35130:5:::1;35117:30;:32::i;:::-;35104:7;35112:1;35104:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:45;35187:5:::1;::::0;35174:34:::1;::::0;-1:-1:-1;;;;;35187:5:0::1;35174:32;:34::i;:::-;35160:48;;:8;35169:1;35160:11;;;;;;;;:::i;:::-;;;;;;:48;;;::::0;::::1;35221:13;35237:4;35221:20;;35252:17;35351:15;;35320;;35293:11;;35272:5;:32;;;;:::i;:::-;:63;;;;:::i;:::-;:94;;;;:::i;:::-;35252:114;;35501:5;35470:15;;35444:9;35430:11;;35412:4;:15;;;:29;;;;:::i;:::-;:41;;;;:::i;:::-;35411:74;;;;:::i;:::-;:95;;;;:::i;:::-;35379:13;35393:1;35379:16;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:127;35538:18:::1;35519:687;35588:14;::::0;::::1;:21:::0;35575:34;::::1;35519:687;;;35717:4;:14;;35732:10;35717:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;-1:-1:-1;;;35717:40:0;;;;-1:-1:-1;;;;;35717:26:0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35663:9:::0;35673:14:::1;:10:::0;35686:1:::1;35673:14;:::i;:::-;35663:25;;;;;;;;:::i;:::-;;;;;;:109;-1:-1:-1::0;;;;;35663:109:0::1;;;-1:-1:-1::0;;;;;35663:109:0::1;;;::::0;::::1;35815:99;35846:4;:14;;35861:10;35846:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;-1:-1:-1;;;35846:40:0;;;;-1:-1:-1;;;;;35846:26:0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35815:97:0::1;;:99::i;:::-;35789:7:::0;35797:14:::1;:10:::0;35810:1:::1;35797:14;:::i;:::-;35789:23;;;;;;;;:::i;:::-;;;;;;:125;;;;35958:101;35989:4;:14;;36004:10;35989:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;-1:-1:-1;;;35989:40:0;;;;-1:-1:-1;;;;;35989:26:0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35958:99:0::1;;:101::i;:::-;35931:128;;:8:::0;35940:14:::1;:10:::0;35953:1:::1;35940:14;:::i;:::-;35931:24;;;;;;;;:::i;:::-;;;;;;:128;;;::::0;::::1;36108:4;:32;;36141:10;36108:44;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;:86:::1;::::0;-1:-1:-1;;;36108:86:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;36108:44:0;;::::1;::::0;:80:::1;::::0;133:18:1;;36108:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36076:13:::0;36090:14:::1;:10:::0;36103:1:::1;36090:14;:::i;:::-;36076:29;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:118;35624:12:::1;;35519:687;;;;34748:1465;;;34444:1769:::0;;;;;;:::o;28476:1824::-;1907:13;:11;:13::i;:::-;28730:2:::1;28709:23:::0;::::1;;28701:59;;;::::0;-1:-1:-1;;;28701:59:0;;16931:2:1;28701:59:0::1;::::0;::::1;16913:21:1::0;16970:2;16950:18;;;16943:30;17009:25;16989:18;;;16982:53;17052:18;;28701:59:0::1;16729:347:1::0;28701:59:0::1;23221:3;28793:41;::::0;::::1;;;28771:116;;;::::0;-1:-1:-1;;;28771:116:0;;17283:2:1;28771:116:0::1;::::0;::::1;17265:21:1::0;17322:2;17302:18;;;17295:30;17361:27;17341:18;;;17334:55;17406:18;;28771:116:0::1;17081:349:1::0;28771:116:0::1;23118:7;28920:16;:44;;28898:123;;;::::0;-1:-1:-1;;;28898:123:0;;17637:2:1;28898:123:0::1;::::0;::::1;17619:21:1::0;17676:2;17656:18;;;17649:30;17715:31;17695:18;;;17688:59;17764:18;;28898:123:0::1;17435:353:1::0;28898:123:0::1;-1:-1:-1::0;;;;;8317:19:0;;;29032:125:::1;;;::::0;-1:-1:-1;;;29032:125:0;;17995:2:1;29032:125:0::1;::::0;::::1;17977:21:1::0;18034:2;18014:18;;;18007:30;18073:34;18053:18;;;18046:62;-1:-1:-1;;;18124:18:1;;;18117:36;18170:19;;29032:125:0::1;17793:402:1::0;29032:125:0::1;29189:18;29170:295;29226:30:::0;;::::1;29170:295;;;29336:51;29363:10;;29374;29363:22;;;;;;;:::i;29336:51::-;29310:143;;;::::0;-1:-1:-1;;;29310:143:0;;18402:2:1;29310:143:0::1;::::0;::::1;18384:21:1::0;18441:2;18421:18;;;18414:30;18480:32;18460:18;;;18453:60;18530:18;;29310:143:0::1;18200:354:1::0;29310:143:0::1;29271:12;;29170:295;;;;29477:18;:16;:18::i;:::-;29508:27;29556:14;;29538:15;:32;:93;;29617:14;;29538:93;;;29586:15;29538:93;29508:123;;29663:11;29644:15;;:30;;;;;;;:::i;:::-;;;;;;;;29687:8;29715:367;;;;;;;;29752:8;-1:-1:-1::0;;;;;29715:367:0::1;;;;;29791:11;29715:367;;;;29842:19;29715:367;;;;29898:1;29715:367;;;;29932:13;29715:367;;;;;;29981:16;29715:367;;;;30025:1;29715:367;;;;30056:10;;29715:367;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;29715:367:0;;;;-1:-1:-1;;29687:406:0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;29687:406:0::1;-1:-1:-1::0;;;;;29687:406:0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;29687:406:0::1;;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;29687:406:0::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;:::i;:::-;;;;30271:10;;30111:181;;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;30129:8:::1;:15:::0;-1:-1:-1;;;;;30111:181:0;::::1;::::0;30129:19:::1;::::0;30147:1:::1;::::0;30129:19:::1;:::i;:::-;30111:181;::::0;;13638:25:1;;;13711:6;13699:19;;13694:2;13679:18;;13672:47;13735:18;;;13728:34;;;30111:181:0::1;::::0;13626:2:1;13611:18;30111:181:0::1;;;;;;;28690:1610;28476:1824:::0;;;;;;:::o;39164:443::-;5732:21;:19;:21::i;:::-;24449:8:::1;:15:::0;39368:3;;24442:22;::::1;24434:54;;;;-1:-1:-1::0;;;24434:54:0::1;;;;;;;:::i;:::-;39384:21:::2;39408:8;39417:3;39408:13;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;39477:12:::0;;39502:65:::2;::::0;-1:-1:-1;;;39502:65:0;;39514:10:::2;39502:65;::::0;::::2;18870:51:1::0;39534:4:0::2;18937:18:1::0;;;18930:60;19006:18;;;18999:34;;;19049:18;;;19042:34;;;19125:4;19113:17;;19092:19;;;19085:46;19147:19;;;19140:35;;;19191:19;;;19184:35;;;39408:13:0;;-1:-1:-1;;;;;;39477:12:0::2;::::0;;;39502:11:::2;::::0;18842:19:1;;39502:65:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39578:21;39587:3;39592:6;39578:8;:21::i;:::-;39373:234;;5764:1:::1;5776:20:::0;5170:1;6296:22;;6113:213;5776:20;39164:443;;;;;;:::o;37602:92::-;5732:21;:19;:21::i;:::-;37669:17:::1;37681:4;37669:11;:17::i;:::-;5776:20:::0;5170:1;6296:22;;6113:213;5776:20;37602:92;:::o;42934:1016::-;5732:21;:19;:21::i;:::-;43006::::1;43030:8;43039:4;43030:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;43079;;;:8:::1;:14:::0;;;;;;43094:10:::1;43079:26:::0;;;;;;;43133:11;;43030:14:::1;::::0;;;::::1;::::0;;::::1;43231:12;::::0;::::1;::::0;43030:14;;-1:-1:-1;;;43231:22:0::1;43209:113;;;::::0;-1:-1:-1;;;43209:113:0;;19432:2:1;43209:113:0::1;::::0;::::1;19414:21:1::0;19471:2;19451:18;;;19444:30;19510:34;19490:18;;;19483:62;-1:-1:-1;;;19561:18:1;;;19554:39;19610:19;;43209:113:0::1;19230:405:1::0;43209:113:0::1;43349:1;43335:15:::0;;;43361::::1;::::0;::::1;:19:::0;;;43391::::1;::::0;::::1;:23:::0;;;43425:21:::1;::::0;::::1;:25:::0;;;43461:12:::1;::::0;::::1;:22:::0;;43477:6;;43349:1;43461:22:::1;::::0;43477:6;;43461:22:::1;:::i;:::-;::::0;;;-1:-1:-1;43515:18:0::1;::::0;-1:-1:-1;43496:217:0::1;43565:14;::::0;::::1;:21:::0;43552:34;::::1;43496:217;;;43640:4;:14;;43655:10;43640:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;:61:::1;::::0;-1:-1:-1;;;43640:61:0;;::::1;::::0;::::1;15984:25:1::0;;;43687:10:0::1;16025:18:1::0;;;16018:60;16094:18;;;16087:34;;;;-1:-1:-1;;;;;43640:26:0::1;::::0;:40:::1;::::0;15957:18:1;;43640:61:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43601:12;;;;;43496:217;;;-1:-1:-1::0;43762:5:0::1;::::0;43737:12;;-1:-1:-1;;;;;43762:5:0;;::::1;43737:12:::0;::::1;43729:39:::0;43725:99:::1;;43806:6;43785:17;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43725:99:0::1;43836:12:::0;;:45:::1;::::0;-1:-1:-1;;;;;43836:12:0::1;43862:10;43874:6:::0;43836:25:::1;:45::i;:::-;43899:43;::::0;160:25:1;;;43929:4:0;;43917:10:::1;::::0;43899:43:::1;::::0;148:2:1;133:18;43899:43:0::1;;;;;;;42995:955;;;5776:20:::0;5170:1;6296:22;;6113:213;37238:86;5732:21;:19;:21::i;:::-;37298:18:::1;:16;:18::i;:::-;5776:20:::0;5170:1;6296:22;;6113:213;5776:20;37238:86::o;46614:113::-;46671:7;46698:8;46707:3;46698:13;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;;46691:28;;46614:113;;;:::o;48092:482::-;48200:15;;-1:-1:-1;;;;;48200:15:0;48186:10;:29;48164:152;;;;-1:-1:-1;;;48164:152:0;;20200:2:1;48164:152:0;;;20182:21:1;20239:2;20219:18;;;20212:30;20278:34;20258:18;;;20251:62;20349:34;20329:18;;;20322:62;-1:-1:-1;;;20400:19:1;;;20393:40;20450:19;;48164:152:0;19998:477:1;48164:152:0;-1:-1:-1;;;;;48349:30:0;;48327:130;;;;-1:-1:-1;;;48327:130:0;;20682:2:1;48327:130:0;;;20664:21:1;20721:2;20701:18;;;20694:30;20760:34;20740:18;;;20733:62;-1:-1:-1;;;20811:18:1;;;20804:48;20869:19;;48327:130:0;20480:414:1;48327:130:0;48468:15;:34;;-1:-1:-1;;;;;;48468:34:0;-1:-1:-1;;;;;48468:34:0;;;;;;;;48518:48;;48537:10;;48518:48;;-1:-1:-1;;48518:48:0;48092:482;:::o;47129:434::-;47229:11;;-1:-1:-1;;;;;47229:11:0;47215:10;:25;47193:140;;;;-1:-1:-1;;;47193:140:0;;21101:2:1;47193:140:0;;;21083:21:1;21140:2;21120:18;;;21113:30;21179:34;21159:18;;;21152:62;21250:34;21230:18;;;21223:62;-1:-1:-1;;;21301:19:1;;;21294:32;21343:19;;47193:140:0;20899:469:1;47193:140:0;-1:-1:-1;;;;;47366:26:0;;47344:118;;;;-1:-1:-1;;;47344:118:0;;21575:2:1;47344:118:0;;;21557:21:1;21614:2;21594:18;;;21587:30;21653:34;21633:18;;;21626:62;-1:-1:-1;;;21704:18:1;;;21697:40;21754:19;;47344:118:0;21373:406:1;47344:118:0;47473:11;:26;;-1:-1:-1;;;;;;47473:26:0;-1:-1:-1;;;;;47473:26:0;;;;;;;;47515:40;;47530:10;;47515:40;;-1:-1:-1;;47515:40:0;47129:434;:::o;2662:103::-;1907:13;:11;:13::i;:::-;2727:30:::1;2754:1;2727:18;:30::i;49629:495::-:0;1907:13;:11;:13::i;:::-;49759:3:::1;49736:19;:26;;49714:119;;;::::0;-1:-1:-1;;;49714:119:0;;21986:2:1;49714:119:0::1;::::0;::::1;21968:21:1::0;22025:2;22005:18;;;21998:30;22064:34;22044:18;;;22037:62;-1:-1:-1;;;22115:18:1;;;22108:41;22166:19;;49714:119:0::1;21784:407:1::0;49714:119:0::1;49921:3;49902:15;;49880:19;49866:11;;:33;;;;:::i;:::-;:51;;;;:::i;:::-;:58;;49844:152;;;::::0;-1:-1:-1;;;49844:152:0;;22398:2:1;49844:152:0::1;::::0;::::1;22380:21:1::0;22437:2;22417:18;;;22410:30;22476:34;22456:18;;;22449:62;-1:-1:-1;;;22527:18:1;;;22520:42;22579:19;;49844:152:0::1;22196:408:1::0;49844:152:0::1;50031:15;::::0;50012:56:::1;::::0;;10159:25:1;;;10215:2;10200:18;;10193:34;;;50012:56:0::1;::::0;10132:18:1;50012:56:0::1;;;;;;;50079:15;:37:::0;49629:495::o;48582:::-;1907:13;:11;:13::i;:::-;48712:3:::1;48689:19;:26;;48667:119;;;::::0;-1:-1:-1;;;48667:119:0;;22811:2:1;48667:119:0::1;::::0;::::1;22793:21:1::0;22850:2;22830:18;;;22823:30;22889:34;22869:18;;;22862:62;-1:-1:-1;;;22940:18:1;;;22933:41;22991:19;;48667:119:0::1;22609:407:1::0;48667:119:0::1;48874:3;48855:15;;48833:19;48819:11;;:33;;;;:::i;:::-;:51;;;;:::i;:::-;:58;;48797:152;;;::::0;-1:-1:-1;;;48797:152:0;;23223:2:1;48797:152:0::1;::::0;::::1;23205:21:1::0;23262:2;23242:18;;;23235:30;23301:34;23281:18;;;23274:62;-1:-1:-1;;;23352:18:1;;;23345:42;23404:19;;48797:152:0::1;23021:408:1::0;48797:152:0::1;48984:15;::::0;48965:56:::1;::::0;;10159:25:1;;;10215:2;10200:18;;10193:34;;;48965:56:0::1;::::0;10132:18:1;48965:56:0::1;;;;;;;49032:15;:37:::0;48582:495::o;47571:455::-;1907:13;:11;:13::i;:::-;47689:3:::1;47670:15;:22;;47648:111;;;::::0;-1:-1:-1;;;47648:111:0;;23636:2:1;47648:111:0::1;::::0;::::1;23618:21:1::0;23675:2;23655:18;;;23648:30;23714:34;23694:18;;;23687:62;-1:-1:-1;;;23765:18:1;;;23758:37;23812:19;;47648:111:0::1;23434:403:1::0;47648:111:0::1;47847:3;47828:15;;47810;47792;;:33;;;;:::i;:::-;:51;;;;:::i;:::-;:58;;47770:148;;;::::0;-1:-1:-1;;;47770:148:0;;24044:2:1;47770:148:0::1;::::0;::::1;24026:21:1::0;24083:2;24063:18;;;24056:30;24122:34;24102:18;;;24095:62;-1:-1:-1;;;24173:18:1;;;24166:38;24221:19;;47770:148:0::1;23842:404:1::0;47770:148:0::1;47949:11;::::0;47934:44:::1;::::0;;10159:25:1;;;10215:2;10200:18;;10193:34;;;47934:44:0::1;::::0;10132:18:1;47934:44:0::1;;;;;;;47989:11;:29:::0;47571:455::o;27719:441::-;1907:13;:11;:13::i;:::-;27811:14:::1;;27793:15;:32;27771:117;;;::::0;-1:-1:-1;;;27771:117:0;;24453:2:1;27771:117:0::1;::::0;::::1;24435:21:1::0;24492:2;24472:18;;;24465:30;24531:34;24511:18;;;24504:62;-1:-1:-1;;;24582:18:1;;;24575:33;24625:19;;27771:117:0::1;24251:399:1::0;27771:117:0::1;27918:8;:15:::0;27901:14:::1;27944:164;27972:6;27966:3;:12;27944:164;;;28002:21;28026:8;28035:3;28026:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;28081:15:::1;28026:13;::::0;;::::1;;28054:24;;:42:::0;-1:-1:-1;27980:5:0::1;;27944:164;;;-1:-1:-1::0;;28137:15:0::1;28120:14;:32:::0;27719:441::o;46798:265::-;5732:21;:19;:21::i;:::-;46900:2:::1;46884:18:::0;::::1;;46876:62;;;::::0;-1:-1:-1;;;46876:62:0;;24857:2:1;46876:62:0::1;::::0;::::1;24839:21:1::0;24896:2;24876:18;;;24869:30;24935:33;24915:18;;;24908:61;24986:18;;46876:62:0::1;24655:355:1::0;46876:62:0::1;46954:13;46949:107;46973:20:::0;;::::1;46949:107;;;47019:25;47028:5;;47034;47028:12;;;;;;;:::i;:::-;;;;;;;47042:1;47019:8;:25::i;:::-;46995:7;;46949:107;;;;5776:20:::0;5170:1;6296:22;;6113:213;39660:110;5732:21;:19;:21::i;:::-;39739:23:::1;39748:4;39754:7;39739:8;:23::i;:::-;5776:20:::0;5170:1;6296:22;;6113:213;46153:453;1907:13;:11;:13::i;:::-;46265:18:::1;:16;:18::i;:::-;46334:10;-1:-1:-1::0;;;;;46301:120:0::1;;46359:8;46368:4;46359:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;46399:11;46301:120;;;;;;10159:25:1::0;;;10215:2;10200:18;;10193:34;10147:2;10132:18;;9985:248;46301:120:0::1;;;;;;;;46537:11;46496:8;46505:4;46496:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;46465:15;;:56;;;;:::i;:::-;:83;;;;:::i;:::-;46434:15;:114;;;;46587:11;46559:8;46568:4;46559:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;46153:453:::0;;:::o;36271:494::-;24449:8;:15;36391:26;;36367:4;;24442:22;;24434:54;;;;-1:-1:-1;;;24434:54:0;;;;;;;:::i;:::-;36435:21:::1;36459:8;36468:4;36459:14;;;;;;;;:::i;:::-;;;;;;;;;;;36435:38;;36510:4;:14;;:21;;;;-1:-1:-1::0;;;;;36496:36:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;36496:36:0::1;-1:-1:-1::0;36484:48:0;-1:-1:-1;36562:18:0::1;36543:215;36612:14;::::0;::::1;:21:::0;36599:34;::::1;36543:215;;;36719:4;:14;;36734:10;36719:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;36719:26:0::1;36687:9;36697:10;36687:21;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36687:59:0;;::::1;:21;::::0;;::::1;::::0;;;;;;;:59;36648:12:::1;;36543:215;;;;36424:341;36271:494:::0;;;;:::o;2920:201::-;1907:13;:11;:13::i;:::-;-1:-1:-1;;;;;3009:22:0;::::1;3001:73;;;::::0;-1:-1:-1;;;3001:73:0;;25217:2:1;3001:73:0::1;::::0;::::1;25199:21:1::0;25256:2;25236:18;;;25229:30;25295:34;25275:18;;;25268:62;-1:-1:-1;;;25346:18:1;;;25339:36;25392:19;;3001:73:0::1;25015:402:1::0;3001:73:0::1;3085:28;3104:8;3085:18;:28::i;31889:2488::-:0;32038:26;32079:23;32117:25;32157:24;32000:4;24449:8;:15;;;;24442:4;:22;24434:54;;;;-1:-1:-1;;;24434:54:0;;;;;;;:::i;:::-;32209:21:::1;32233:8;32242:4;32233:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;32282;;;:8:::1;:14:::0;;;;;;-1:-1:-1;;;;;32282:21:0;::::1;::::0;;;;;;;32341::::1;32233:14;::::0;;::::1;::::0;;::::1;32341:21:::0;;::::1;::::0;32392:12:::1;::::0;::::1;::::0;32439:24:::1;::::0;::::1;::::0;32233:14;;-1:-1:-1;32341:21:0;;32421:15:::1;:42;:59:::0;::::1;;;-1:-1:-1::0;32467:13:0;;::::1;32421:59;32417:656;;;32497:18;32536:4;:24;;;32518:15;:42;;;;:::i;:::-;32497:63;;32575:13;32591:4;32575:20;;32610:17;32721:15;;32686;;32655:11;;32630:5;:36;;;;:::i;:::-;:71;;;;:::i;:::-;:106;;;;:::i;:::-;32610:126;;32753:19;32937:5;32902:15;;32872:9;32837:4;:15;;;32806:11;;32776:10;:41;;;;:::i;:::-;:76;;;;:::i;:::-;:105;;;;:::i;:::-;32775:142;;;;:::i;:::-;:167;;;;:::i;:::-;32753:189:::0;-1:-1:-1;33037:8:0;33000:33:::1;33014:19;32753:189:::0;33000:33:::1;:::i;:::-;32999:46;;;;:::i;:::-;32959:102;::::0;;::::1;:::i;:::-;;;32482:591;;;;32417:656;33085:20;33200:4;:19;;;33181:4;:15;;;33158:19;33125:16;33111:4;:11;;;:30;;;;:::i;:::-;33110:67;;;;:::i;:::-;33109:87;;;;:::i;:::-;33108:111;;;;:::i;:::-;33258:14;::::0;::::1;:21:::0;33085:134;;-1:-1:-1;33258:25:0::1;::::0;33282:1:::1;33258:25;:::i;:::-;-1:-1:-1::0;;;;;33244:40:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;33244:40:0::1;-1:-1:-1::0;33318:14:0::1;::::0;::::1;:21:::0;33232:52;;-1:-1:-1;33318:25:0::1;::::0;33342:1:::1;33318:25;:::i;:::-;-1:-1:-1::0;;;;;33305:39:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;33379:14:0::1;::::0;::::1;:21:::0;33295:49;;-1:-1:-1;33379:25:0::1;::::0;33403:1:::1;33379:25;:::i;:::-;-1:-1:-1::0;;;;;33365:40:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;33365:40:0::1;-1:-1:-1::0;33441:14:0::1;::::0;::::1;:21:::0;33355:50;;-1:-1:-1;33441:25:0::1;::::0;33465:1:::1;33441:25;:::i;:::-;-1:-1:-1::0;;;;;33427:40:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;33427:40:0::1;-1:-1:-1::0;33503:5:0::1;::::0;33480:12;;33416:51;;-1:-1:-1;;;;;;33503:5:0::1;::::0;33480:9;;33503:5:::1;::::0;33480:12:::1;;;;:::i;:::-;-1:-1:-1::0;;;;;33480:29:0;;::::1;:12;::::0;;::::1;::::0;;;;;:29;33546:5:::1;::::0;33533:32:::1;::::0;33546:5:::1;33533:30;:32::i;:::-;33520:7;33528:1;33520:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:45;33603:5:::1;::::0;33590:34:::1;::::0;-1:-1:-1;;;;;33603:5:0::1;33590:32;:34::i;:::-;33576:48;;:8;33585:1;33576:11;;;;;;;;:::i;:::-;;;;;;:48;;;::::0;::::1;33648:12;33635:7;33643:1;33635:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:25;33692:18:::1;33673:697;33742:14;::::0;::::1;:21:::0;33729:34;::::1;33673:697;;;33871:4;:14;;33886:10;33871:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;-1:-1:-1;;;33871:40:0;;;;-1:-1:-1;;;;;33871:26:0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33817:9:::0;33827:14:::1;:10:::0;33840:1:::1;33827:14;:::i;:::-;33817:25;;;;;;;;:::i;:::-;;;;;;:109;-1:-1:-1::0;;;;;33817:109:0::1;;;-1:-1:-1::0;;;;;33817:109:0::1;;;::::0;::::1;33969:99;34000:4;:14;;34015:10;34000:26;;;;;;;;:::i;33969:99::-;33943:7:::0;33951:14:::1;:10:::0;33964:1:::1;33951:14;:::i;:::-;33943:23;;;;;;;;:::i;:::-;;;;;;:125;;;;34112:101;34143:4;:14;;34158:10;34143:26;;;;;;;;:::i;34112:101::-;34085:128;;:8:::0;34094:14:::1;:10:::0;34107:1:::1;34094:14;:::i;:::-;34085:24;;;;;;;;:::i;:::-;;;;;;:128;;;::::0;::::1;34256:4;:14;;34271:10;34256:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;:102:::1;::::0;-1:-1:-1;;;;;;34256:102:0;;::::1;::::0;::::1;25596:25:1::0;;;-1:-1:-1;;;;;25657:32:1;;;25637:18;;;25630:60;34256:26:0;;::::1;::::0;:40:::1;::::0;25569:18:1;;34256:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34230:7:::0;34238:14:::1;:10:::0;34251:1:::1;34238:14;:::i;:::-;34230:23;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:128;33778:12:::1;;33673:697;;;;32198:2179;;;;;31889:2488:::0;;;;;;;;:::o;2186:132::-;2067:7;2094:6;-1:-1:-1;;;;;2094:6:0;740:10;2250:23;2242:68;;;;-1:-1:-1;;;2242:68:0;;25903:2:1;2242:68:0;;;25885:21:1;;;25922:18;;;25915:30;25981:34;25961:18;;;25954:62;26033:18;;2242:68:0;25701:356:1;37376:150:0;37429:11;37424:95;37452:8;:15;37446:21;;37424:95;;;37491:16;37503:3;37491:11;:16::i;:::-;37469:5;;37424:95;;5812:293;5214:1;5946:7;;:19;5938:63;;;;-1:-1:-1;;;5938:63:0;;26264:2:1;5938:63:0;;;26246:21:1;26303:2;26283:18;;;26276:30;26342:33;26322:18;;;26315:61;26393:18;;5938:63:0;26062:355:1;5938:63:0;5214:1;6079:7;:18;5812:293::o;37742:1414::-;24449:8;:15;37804:4;;24442:22;;24434:54;;;;-1:-1:-1;;;24434:54:0;;;;;;;:::i;:::-;37821:21:::1;37845:8;37854:4;37845:14;;;;;;;;:::i;:::-;;;;;;;;;;;37821:38;;37895:4;:24;;;37876:15;:43;37872:82;;37936:7;41449:1414:::0;;:::o;37872:82::-:1;37985:12;::::0;::::1;::::0;38014:13;;;:37:::1;;-1:-1:-1::0;38031:15:0::1;::::0;::::1;::::0;:20;38014:37:::1;38010:133;;;-1:-1:-1::0;38095:15:0::1;38068:24;::::0;;::::1;:42:::0;41449:1414;;:::o;38010:133::-:1;38155:18;38194:4;:24;;;38176:15;:42;;;;:::i;:::-;38155:63;;38231:19;38315:15;;38283:4;:15;;;38268:11;;38255:10;:24;;;;:::i;:::-;38254:44;;;;:::i;:::-;38253:77;;;;:::i;:::-;38231:99;;38343:13;38359:4;38343:20;;38374:17;38473:15;;38442;;38415:11;;38394:5;:32;;;;:::i;:::-;:63;;;;:::i;:::-;:94;;;;:::i;:::-;38501:5;::::0;38512:11:::1;::::0;38540::::1;::::0;38374:114;;-1:-1:-1;;;;;;38501:5:0;;::::1;::::0;:10:::1;::::0;38512:11;;::::1;::::0;38555:5;;38526:25:::1;::::0;:11;:25:::1;:::i;:::-;38525:35;;;;:::i;:::-;38501:60;::::0;-1:-1:-1;;;;;;38501:60:0::1;::::0;;;;;;-1:-1:-1;;;;;26614:32:1;;;38501:60:0::1;::::0;::::1;26596:51:1::0;26663:18;;;26656:34;26569:18;;38501:60:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;38572:5:0::1;::::0;38583:15:::1;::::0;38615::::1;::::0;-1:-1:-1;;;;;38572:5:0;;::::1;::::0;-1:-1:-1;38572:10:0::1;::::0;-1:-1:-1;38583:15:0;::::1;::::0;38634:5;;38601:29:::1;::::0;:11;:29:::1;:::i;:::-;38600:39;;;;:::i;:::-;38572:68;::::0;-1:-1:-1;;;;;;38572:68:0::1;::::0;;;;;;-1:-1:-1;;;;;26614:32:1;;;38572:68:0::1;::::0;::::1;26596:51:1::0;26663:18;;;26656:34;26569:18;;38572:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;38651:5:0::1;::::0;38662:15:::1;::::0;38694::::1;::::0;-1:-1:-1;;;;;38651:5:0;;::::1;::::0;-1:-1:-1;38651:10:0::1;::::0;-1:-1:-1;38662:15:0;::::1;::::0;38713:5;;38680:29:::1;::::0;:11;:29:::1;:::i;:::-;38679:39;;;;:::i;:::-;38651:68;::::0;-1:-1:-1;;;;;;38651:68:0::1;::::0;;;;;;-1:-1:-1;;;;;26614:32:1;;;38651:68:0::1;::::0;::::1;26596:51:1::0;26663:18;;;26656:34;26569:18;;38651:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;38730:5:0::1;::::0;-1:-1:-1;;;;;38730:5:0::1;::::0;-1:-1:-1;38730:10:0::1;::::0;-1:-1:-1;38749:4:0::1;38784:5:::0;38757:23:::1;38771:9:::0;38757:11;:23:::1;:::i;:::-;38756:33;;;;:::i;:::-;38730:60;::::0;-1:-1:-1;;;;;;38730:60:0::1;::::0;;;;;;-1:-1:-1;;;;;26614:32:1;;;38730:60:0::1;::::0;::::1;26596:51:1::0;26663:18;;;26656:34;26569:18;;38730:60:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;38904:12:0::1;::::0;::::1;::::0;38932:5;;-1:-1:-1;38878:9:0;38842:33:::1;38856:19;38842:11:::0;:33:::1;:::i;:::-;:45;;;;:::i;:::-;38841:75;;;;:::i;:::-;:96;;;;:::i;:::-;38803:4;:21;;;:134;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;38977:15:0::1;38950:24;::::0;::::1;:42:::0;;;39116:21:::1;::::0;::::1;::::0;39010:138:::1;::::0;;26903:25:1;;;26959:2;26944:18;;26937:34;;;26987:18;;26980:34;39035:4:0;;39010:138:::1;::::0;26891:2:1;26876:18;39010:138:0::1;;;;;;;37810:1346;;;;;;37742:1414:::0;;:::o;43995:1178::-;44062:21;44086:8;44095:4;44086:14;;;;;;;;:::i;:::-;;;;;;;;;44135;;;:8;:14;;;;;;44150:10;44135:26;;;;;;;44178:21;;;;44086:14;;;;;;;;-1:-1:-1;44178:26:0;:63;;;;;44227:14;;44208:15;:33;;44178:63;44174:158;;;44300:20;;;;44282:38;;:15;:38;:::i;:::-;44258:21;;;:62;44174:158;44344:15;44439:4;:15;;;44416:19;44378:4;:21;;;44364:4;:11;;;:35;;;;:::i;:::-;44363:72;;;;:::i;:::-;44362:92;;;;:::i;:::-;44344:110;;44471:28;44482:4;44488:10;44471;:28::i;:::-;44467:699;;;44530:1;44520:7;:11;:38;;;;44557:1;44535:4;:19;;;:23;44520:38;44516:452;;;44579:22;44614:4;:19;;;44604:7;:29;;;;:::i;:::-;44579:54;;44711:4;:19;;;44687:20;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;;44771:1:0;44749:19;;;:23;44833:20;;;;44815:38;;:15;:38;:::i;:::-;44791:21;;;:62;44907:45;44925:10;44937:14;44907:17;:45::i;:::-;44560:408;44516:452;44467:699;;;44989:11;;44985:181;;45041:7;45017:20;;:31;;;;;;;:::i;:::-;;;;;;;;45086:7;45063:4;:19;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;45113:41:0;;160:25:1;;;45140:4:0;;45128:10;;45113:41;;148:2:1;133:18;45113:41:0;;;;;;;44985:181;44051:1122;;;43995:1178;:::o;20340:407::-;20534:48;;;-1:-1:-1;;;;;26614:32:1;;;20534:48:0;;;26596:51:1;26663:18;;;;26656:34;;;20534:48:0;;;;;;;;;;26569:18:1;;;;20534:48:0;;;;;;;-1:-1:-1;;;;;20534:48:0;-1:-1:-1;;;20534:48:0;;;20500:93;;-1:-1:-1;;;;20500:19:0;;;;:93;;20534:48;20500:93;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20464:129;;;;20626:7;:57;;;;-1:-1:-1;20638:11:0;;:16;;:44;;;20669:4;20658:24;;;;;;;;;;;;:::i;:::-;20604:135;;;;-1:-1:-1;;;20604:135:0;;27815:2:1;20604:135:0;;;27797:21:1;27854:2;27834:18;;;27827:30;27893;27873:18;;;27866:58;27941:18;;20604:135:0;27613:352:1;20604:135:0;20453:294;;20340:407;;;:::o;18746:310::-;18943:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18943:34:0;-1:-1:-1;;;18943:34:0;;;18903:85;;18836:13;;18868:12;;;;-1:-1:-1;;;;;18903:25:0;;;:85;;18943:34;18903:85;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18867:121;;;;19006:7;:42;;;;;;;;;;;;;;;-1:-1:-1;;;19006:42:0;;;;;;19016:24;19035:4;19016:18;:24::i;:::-;18999:49;18746:310;-1:-1:-1;;;;18746:310:0:o;19771:293::-;19930:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19930:36:0;-1:-1:-1;;;19930:36:0;;;19890:87;;19836:5;;;;;;-1:-1:-1;;;;;19890:25:0;;;:87;;19930:36;19890:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19854:123;;;;19995:7;:28;;;;;20006:4;:11;20021:2;20006:17;19995:28;:61;;20054:2;19995:61;;;20037:4;20026:25;;;;;;;;;;;;:::i;39823:1595::-;24449:8;:15;39917:4;;24442:22;;24434:54;;;;-1:-1:-1;;;24434:54:0;;;;;;;:::i;:::-;39939:21:::1;39963:8;39972:4;39963:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;40012;;;:8:::1;:14:::0;;;;;;40027:10:::1;40012:26:::0;;;;;;;39963:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;40051:17:0::1;40021:4:::0;40051:11:::1;:17::i;:::-;40081:29;40105:4;40081:23;:29::i;:::-;40127:11:::0;;40123:738:::1;;40179:12:::0;;:37:::1;::::0;-1:-1:-1;;;40179:37:0;;40210:4:::1;40179:37;::::0;::::1;573:51:1::0;40155:21:0::1;::::0;-1:-1:-1;;;;;40179:12:0::1;::::0;:22:::1;::::0;546:18:1;;40179:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40231:12:::0;;40155:61;;-1:-1:-1;40231:65:0::1;::::0;-1:-1:-1;;;;;40231:12:0::1;40261:10;40281:4;40288:7:::0;40231:29:::1;:65::i;:::-;40334:12:::0;;:37:::1;::::0;-1:-1:-1;;;40334:37:0;;40365:4:::1;40334:37;::::0;::::1;573:51:1::0;40311:20:0::1;::::0;-1:-1:-1;;;;;40334:12:0::1;::::0;:22:::1;::::0;546:18:1;;40334:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40311:60:::0;-1:-1:-1;40398:28:0::1;40413:13:::0;40311:60;40398:28:::1;:::i;:::-;40447:17;::::0;::::1;::::0;40388:38;;-1:-1:-1;40447:17:0::1;;:21:::0;40443:244:::1;;40521:17;::::0;::::1;::::0;40489:18:::1;::::0;40542:5:::1;::::0;40511:27:::1;::::0;40521:17:::1;;40511:7:::0;:27:::1;:::i;:::-;40510:37;;;;:::i;:::-;40592:15;::::0;40566:12;;40489:58;;-1:-1:-1;40566:54:0::1;::::0;-1:-1:-1;;;;;40566:12:0;;::::1;::::0;40592:15:::1;40489:58:::0;40566:25:::1;:54::i;:::-;40651:20;40661:10:::0;40651:7;:20:::1;:::i;:::-;40641:30;;40470:217;40443:244;40718:7;40703:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40779:5:0::1;::::0;40754:12;;-1:-1:-1;;;;;40779:5:0;;::::1;40754:12:::0;::::1;40746:39:::0;40742:108:::1;;40827:7;40806:17;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40742:108:0::1;40140:721;;40123:738;40917:21;::::0;::::1;::::0;40903:11;;40955:19:::1;::::0;40903:35:::1;::::0;::::1;:::i;:::-;40902:72;;;;:::i;:::-;40871:15;::::0;::::1;:103:::0;41006:18:::1;40987:293;41056:14;::::0;::::1;:21:::0;41043:34;::::1;40987:293;;;41131:4;:14;;41146:10;41131:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;41242:11;;41131:137:::1;::::0;-1:-1:-1;;;41131:137:0;;::::1;::::0;::::1;15984:25:1::0;;;41213:10:0::1;16025:18:1::0;;;16018:60;16094:18;;;16087:34;;;;-1:-1:-1;;;;;41131:26:0;;::::1;::::0;:40:::1;::::0;15957:18:1;;41131:137:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41092:12;;;;;40987:293;;;-1:-1:-1::0;41296:11:0;;41292:67:::1;;41340:7;41324:4;:12;;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;41292:67:0::1;41376:34;::::0;160:25:1;;;41396:4:0;;41384:10:::1;::::0;41376:34:::1;::::0;148:2:1;133:18;41376:34:0::1;;;;;;;39928:1490;;39823:1595:::0;;;:::o;3281:191::-;3355:16;3374:6;;-1:-1:-1;;;;;3391:17:0;;;-1:-1:-1;;;;;;3391:17:0;;;;;;3424:40;;3374:6;;;;;;;3424:40;;3355:16;3424:40;3344:128;3281:191;:::o;45288:630::-;45402:17;;45369:5;;:30;;-1:-1:-1;;;45369:30:0;;45393:4;45369:30;;;573:51:1;-1:-1:-1;;;;;45369:5:0;;;;:15;;546:18:1;;45369:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;45365:546;;;45685:17;;45635:5;;:30;;-1:-1:-1;;;45635:30:0;;45659:4;45635:30;;;573:51:1;45616:16:0;;45685:17;-1:-1:-1;;;;;45635:5:0;;:15;;546:18:1;;45635:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;;;:::i;:::-;45616:86;;45732:8;45721:7;:19;45717:183;;45761:5;;:33;;-1:-1:-1;;;;;45761:5:0;45780:3;45785:8;45761:18;:33::i;:::-;45421:490;45288:630;;:::o;45717:183::-;45820:11;;45816:84;;45852:5;;:32;;-1:-1:-1;;;;;45852:5:0;45871:3;45876:7;45852:18;:32::i;17921:619::-;18018:13;18068:2;18053:4;:11;:17;18049:484;;18105:4;18094:26;;;;;;;;;;;;:::i;:::-;18087:33;17921:619;-1:-1:-1;;17921:619:0:o;18049:484::-;18142:4;:11;18157:2;18142:17;18138:395;;18176:7;18202:69;18213:2;18209:1;:6;;;:22;;;;;18219:4;18224:1;18219:7;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;18219:7:0;:12;;18209:22;18202:69;;;18252:3;;;;:::i;:::-;;;;18202:69;;;18285:23;18321:1;18311:12;;-1:-1:-1;;;;;18311:12:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18311:12:0;;18285:38;;18347:1;18343:5;;18338:99;18354:2;18350:1;:6;;;:22;;;;;18360:4;18365:1;18360:7;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;18360:7:0;:12;;18350:22;18338:99;;;18414:4;18419:1;18414:7;;;;;;;;;;:::i;:::-;;;;;;;;;18398:10;18409:1;18398:13;;;;;;;;;;:::i;:::-;;;;:23;-1:-1:-1;;;;;18398:23:0;;;;;;;;-1:-1:-1;18374:3:0;;;;:::i;:::-;;;;18338:99;;;18465:10;17921:619;-1:-1:-1;;;17921:619:0:o;18138:395::-;-1:-1:-1;;18509:12:0;;;;;;;;;;;;-1:-1:-1;;;18509:12:0;;;;;17921:619::o;18138:395::-;17921:619;;;:::o;21070:449::-;21291:59;;;-1:-1:-1;;;;;29562:32:1;;;21291:59:0;;;29544:51:1;29631:32;;;29611:18;;;29604:60;29680:18;;;;29673:34;;;21291:59:0;;;;;;;;;;29517:18:1;;;;21291:59:0;;;;;;;-1:-1:-1;;;;;21291:59:0;-1:-1:-1;;;21291:59:0;;;21257:104;;-1:-1:-1;;;;21257:19:0;;;;:104;;21291:59;21257:104;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21221:140;;;;21394:7;:57;;;;-1:-1:-1;21406:11:0;;:16;;:44;;;21437:4;21426:24;;;;;;;;;;;;:::i;:::-;21372:139;;;;-1:-1:-1;;;21372:139:0;;29920:2:1;21372:139:0;;;29902:21:1;;;29939:18;;;29932:30;29998:34;29978:18;;;29971:62;30050:18;;21372:139:0;29718:356:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:226:1;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;369:23:1;;196:226;-1:-1:-1;196:226:1:o;1304:159::-;1371:20;;1431:6;1420:18;;1410:29;;1400:57;;1453:1;1450;1443:12;1468:385;1549:8;1559:6;1613:3;1606:4;1598:6;1594:17;1590:27;1580:55;;1631:1;1628;1621:12;1580:55;-1:-1:-1;1654:20:1;;-1:-1:-1;;;;;1686:30:1;;1683:50;;;1729:1;1726;1719:12;1683:50;1766:4;1758:6;1754:17;1742:29;;1826:3;1819:4;1809:6;1806:1;1802:14;1794:6;1790:27;1786:38;1783:47;1780:67;;;1843:1;1840;1833:12;1780:67;1468:385;;;;;:::o;1858:907::-;2003:6;2011;2019;2027;2035;2043;2096:3;2084:9;2075:7;2071:23;2067:33;2064:53;;;2113:1;2110;2103:12;2064:53;2158:23;;;-1:-1:-1;2278:2:1;2263:18;;2250:32;;-1:-1:-1;2327:37:1;2360:2;2345:18;;2327:37;:::i;:::-;2317:47;-1:-1:-1;2437:2:1;2422:18;;2409:32;;-1:-1:-1;2518:3:1;2503:19;;2490:33;-1:-1:-1;;;;;2535:30:1;;2532:50;;;2578:1;2575;2568:12;2532:50;2617:88;2697:7;2688:6;2677:9;2673:22;2617:88;:::i;:::-;1858:907;;;;-1:-1:-1;1858:907:1;;-1:-1:-1;1858:907:1;;2724:8;;1858:907;-1:-1:-1;;;1858:907:1:o;2770:131::-;-1:-1:-1;;;;;2845:31:1;;2835:42;;2825:70;;2891:1;2888;2881:12;2906:367;2974:6;2982;3035:2;3023:9;3014:7;3010:23;3006:32;3003:52;;;3051:1;3048;3041:12;3003:52;3096:23;;;-1:-1:-1;3195:2:1;3180:18;;3167:32;3208:33;3167:32;3208:33;:::i;:::-;3260:7;3250:17;;;2906:367;;;;;:::o;3698:247::-;3757:6;3810:2;3798:9;3789:7;3785:23;3781:32;3778:52;;;3826:1;3823;3816:12;3778:52;3865:9;3852:23;3884:31;3909:5;3884:31;:::i;3950:346::-;4018:6;4026;4079:2;4067:9;4058:7;4054:23;4050:32;4047:52;;;4095:1;4092;4085:12;4047:52;-1:-1:-1;;4140:23:1;;;4260:2;4245:18;;;4232:32;;-1:-1:-1;3950:346:1:o;4301:446::-;4354:3;4392:5;4386:12;4419:6;4414:3;4407:19;4451:4;4446:3;4442:14;4435:21;;4490:4;4483:5;4479:16;4513:1;4523:199;4537:6;4534:1;4531:13;4523:199;;;4602:13;;-1:-1:-1;;;;;4598:39:1;4586:52;;4667:4;4658:14;;;;4695:17;;;;4634:1;4552:9;4523:199;;;-1:-1:-1;4738:3:1;;4301:446;-1:-1:-1;;;;4301:446:1:o;4752:420::-;4805:3;4843:5;4837:12;4870:6;4865:3;4858:19;4902:4;4897:3;4893:14;4886:21;;4941:4;4934:5;4930:16;4964:1;4974:173;4988:6;4985:1;4982:13;4974:173;;;5049:13;;5037:26;;5092:4;5083:14;;;;5120:17;;;;5010:1;5003:9;4974:173;;5177:1565;5610:3;5599:9;5592:22;5573:4;5637:57;5689:3;5678:9;5674:19;5666:6;5637:57;:::i;:::-;5742:9;5734:6;5730:22;5725:2;5714:9;5710:18;5703:50;5773:6;5808;5802:13;5839:6;5831;5824:22;5874:2;5866:6;5862:15;5855:22;;5933:2;5923:6;5920:1;5916:14;5908:6;5904:27;5900:36;5971:2;5963:6;5959:15;5992:1;6002:488;6016:6;6013:1;6010:13;6002:488;;;6106:2;6102:7;6093:6;6085;6081:19;6077:33;6072:3;6065:46;6140:6;6134:13;6182:2;6176:9;6213:8;6205:6;6198:24;6271:8;6266:2;6262;6258:11;6253:2;6245:6;6241:15;6235:45;6332:1;6327:2;6316:8;6308:6;6304:21;6300:30;6293:41;6407:2;6400;6396:7;6391:2;6381:8;6377:17;6373:31;6365:6;6361:44;6357:53;6347:63;;;;6445:2;6437:6;6433:15;6423:25;;6477:2;6472:3;6468:12;6461:19;;6038:1;6035;6031:9;6026:14;;6002:488;;;6006:3;;6538:9;6530:6;6526:22;6521:2;6510:9;6506:18;6499:50;6572:44;6609:6;6601;6572:44;:::i;:::-;6558:58;;;;;6664:9;6656:6;6652:22;6647:2;6636:9;6632:18;6625:50;6692:44;6729:6;6721;6692:44;:::i;:::-;6684:52;5177:1565;-1:-1:-1;;;;;;;5177:1565:1:o;6747:948::-;6912:6;6920;6928;6936;6944;6952;7005:3;6993:9;6984:7;6980:23;6976:33;6973:53;;;7022:1;7019;7012:12;6973:53;7067:23;;;-1:-1:-1;7166:2:1;7151:18;;7138:32;7179:33;7138:32;7179:33;:::i;:::-;7231:7;-1:-1:-1;7257:37:1;7290:2;7275:18;;7257:37;:::i;7700:114::-;7784:4;7777:5;7773:16;7766:5;7763:27;7753:55;;7804:1;7801;7794:12;7819:846;7921:6;7929;7937;7945;7953;7961;8014:3;8002:9;7993:7;7989:23;7985:33;7982:53;;;8031:1;8028;8021:12;7982:53;8076:23;;;-1:-1:-1;8196:2:1;8181:18;;8168:32;;-1:-1:-1;8299:2:1;8284:18;;8271:32;;-1:-1:-1;8381:2:1;8366:18;;8353:32;8394:31;8353:32;8394:31;:::i;:::-;7819:846;;;;-1:-1:-1;7819:846:1;;8524:3;8509:19;;8496:33;;8628:3;8613:19;;;8600:33;;-1:-1:-1;7819:846:1;-1:-1:-1;;7819:846:1:o;9259:455::-;9345:6;9353;9406:2;9394:9;9385:7;9381:23;9377:32;9374:52;;;9422:1;9419;9412:12;9374:52;9462:9;9449:23;-1:-1:-1;;;;;9487:6:1;9484:30;9481:50;;;9527:1;9524;9517:12;9481:50;9566:88;9646:7;9637:6;9626:9;9622:22;9566:88;:::i;:::-;9673:8;;9540:114;;-1:-1:-1;9259:455:1;-1:-1:-1;;;;9259:455:1:o;9719:261::-;9898:2;9887:9;9880:21;9861:4;9918:56;9970:2;9959:9;9955:18;9947:6;9918:56;:::i;10238:343::-;10440:2;10422:21;;;10479:2;10459:18;;;10452:30;-1:-1:-1;;;10513:2:1;10498:18;;10491:49;10572:2;10557:18;;10238:343::o;11650:127::-;11711:10;11706:3;11702:20;11699:1;11692:31;11742:4;11739:1;11732:15;11766:4;11763:1;11756:15;12417:127;12478:10;12473:3;12469:20;12466:1;12459:31;12509:4;12506:1;12499:15;12533:4;12530:1;12523:15;12549:128;12616:9;;;12637:11;;;12634:37;;;12651:18;;:::i;12682:125::-;12747:9;;;12768:10;;;12765:36;;;12781:18;;:::i;12812:621::-;13007:3;13038;13085:6;13007:3;13119:287;13133:6;13130:1;13127:13;13119:287;;;13208:6;13195:20;13228:31;13253:5;13228:31;:::i;:::-;-1:-1:-1;;;;;13286:31:1;13272:46;;13351:4;13340:16;;;;13379:17;;;;;13314:1;13148:9;13119:287;;;-1:-1:-1;13422:5:1;;12812:621;-1:-1:-1;;;;;12812:621:1:o;15387:168::-;15460:9;;;15491;;15508:15;;;15502:22;;15488:37;15478:71;;15529:18;;:::i;15560:217::-;15600:1;15626;15616:132;;15670:10;15665:3;15661:20;15658:1;15651:31;15705:4;15702:1;15695:15;15733:4;15730:1;15723:15;15616:132;-1:-1:-1;15762:9:1;;15560:217::o;16132:127::-;16193:10;16188:3;16184:20;16181:1;16174:31;16224:4;16221:1;16214:15;16248:4;16245:1;16238:15;16264:271;16354:6;16407:2;16395:9;16386:7;16382:23;16378:32;16375:52;;;16423:1;16420;16413:12;16375:52;16455:9;16449:16;16474:31;16499:5;16474:31;:::i;16540:184::-;16610:6;16663:2;16651:9;16642:7;16638:23;16634:32;16631:52;;;16679:1;16676;16669:12;16631:52;-1:-1:-1;16702:16:1;;16540:184;-1:-1:-1;16540:184:1:o;27025:301::-;27154:3;27192:6;27186:13;27238:6;27231:4;27223:6;27219:17;27214:3;27208:37;27300:1;27264:16;;27289:13;;;-1:-1:-1;27264:16:1;27025:301;-1:-1:-1;27025:301:1:o;27331:277::-;27398:6;27451:2;27439:9;27430:7;27426:23;27422:32;27419:52;;;27467:1;27464;27457:12;27419:52;27499:9;27493:16;27552:5;27545:13;27538:21;27531:5;27528:32;27518:60;;27574:1;27571;27564:12;27970:247;28038:6;28091:2;28079:9;28070:7;28066:23;28062:32;28059:52;;;28107:1;28104;28097:12;28059:52;28139:9;28133:16;28158:29;28181:5;28158:29;:::i;28222:935::-;28302:6;28355:2;28343:9;28334:7;28330:23;28326:32;28323:52;;;28371:1;28368;28361:12;28323:52;28404:9;28398:16;-1:-1:-1;;;;;28429:6:1;28426:30;28423:50;;;28469:1;28466;28459:12;28423:50;28492:22;;28545:4;28537:13;;28533:27;-1:-1:-1;28523:55:1;;28574:1;28571;28564:12;28523:55;28607:2;28601:9;-1:-1:-1;;;;;28625:6:1;28622:30;28619:56;;;28655:18;;:::i;:::-;28704:2;28698:9;28796:2;28758:17;;-1:-1:-1;;28754:31:1;;;28787:2;28750:40;28746:54;28734:67;;-1:-1:-1;;;;;28816:34:1;;28852:22;;;28813:62;28810:88;;;28878:18;;:::i;:::-;28914:2;28907:22;28938;;;28979:15;;;28996:2;28975:24;28972:37;-1:-1:-1;28969:57:1;;;29022:1;29019;29012:12;28969:57;29071:6;29066:2;29062;29058:11;29053:2;29045:6;29041:15;29035:43;29124:1;29098:19;;;29119:2;29094:28;29087:39;;;;29102:6;28222:935;-1:-1:-1;;;;28222:935:1:o;29162:175::-;29199:3;29243:4;29236:5;29232:16;29272:4;29263:7;29260:17;29257:43;;29280:18;;:::i;:::-;29329:1;29316:15;;29162:175;-1:-1:-1;;29162:175:1:o
Swarm Source
ipfs://0f0aae3fb354bab81278a2d6a4c4710cb0ff84a8eaffc0face0f4f738301ec18
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.