More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 35 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 1589618 | 11 days ago | IN | 0 S | 0.00013016 | ||||
Withdraw | 1503825 | 12 days ago | IN | 0 S | 0.00013028 | ||||
Update Emission ... | 1476475 | 12 days ago | IN | 0 S | 0.00005026 | ||||
Set | 1476039 | 12 days ago | IN | 0 S | 0.00006788 | ||||
Set | 1475995 | 12 days ago | IN | 0 S | 0.00006785 | ||||
Set | 1475933 | 12 days ago | IN | 0 S | 0.00006786 | ||||
Deposit | 1407955 | 13 days ago | IN | 0 S | 0.00010619 | ||||
Deposit | 1407923 | 13 days ago | IN | 0 S | 0.00010619 | ||||
Deposit | 1407731 | 13 days ago | IN | 0 S | 0.00010618 | ||||
Deposit | 1358863 | 13 days ago | IN | 0 S | 0.00013336 | ||||
Deposit | 1358418 | 13 days ago | IN | 0 S | 0.00014707 | ||||
Deposit | 1358273 | 13 days ago | IN | 0 S | 0.00013335 | ||||
Deposit | 1265243 | 14 days ago | IN | 0 S | 0.00013336 | ||||
Deposit | 1264866 | 14 days ago | IN | 0 S | 0.00018457 | ||||
Set | 1246754 | 14 days ago | IN | 0 S | 0.00005949 | ||||
Deposit | 1246684 | 14 days ago | IN | 0 S | 0.00014708 | ||||
Update Emission ... | 1246467 | 14 days ago | IN | 0 S | 0.00005026 | ||||
Update Emission ... | 1246402 | 14 days ago | IN | 0 S | 0.00005026 | ||||
Set | 1246079 | 14 days ago | IN | 0 S | 0.00006044 | ||||
Add | 1245931 | 14 days ago | IN | 0 S | 0.00017404 | ||||
Deposit | 1245739 | 14 days ago | IN | 0 S | 0.00014575 | ||||
Deposit | 1245576 | 14 days ago | IN | 0 S | 0.00019639 | ||||
Deposit | 1245222 | 14 days ago | IN | 0 S | 0.00014575 | ||||
Deposit | 1244921 | 14 days ago | IN | 0 S | 0.00013336 | ||||
Add | 1244525 | 14 days ago | IN | 0 S | 0.00019418 |
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-22 */ 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. LibreX to distribute per block. uint256 lastRewardTimestamp; // Last block number that based distribution occurs. uint256 accLibrexPerShare; // Accumulated Librex 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 librex; // Librex tokens created per second uint256 public librexPerSec; // 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 Librex mining starts. uint256 public startTimestamp; // Total locked up rewards uint256 public totalLockedUpRewards; // Total Librex in Librex Pools (can be multiple pools) uint256 public totalLibrexInPools = 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 accLibrexPerShare ); 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 _librex, uint256 _librexPerSec, 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); librex = _librex; librexPerSec = _librexPerSec; 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, accLibrexPerShare: 0, depositFeeBP: _depositFeeBP, harvestInterval: _harvestInterval, totalLp: 0, rewarders: _rewarders }) ); emit Add( poolInfo.length - 1, _allocPoint, _lpToken, _depositFeeBP, _harvestInterval, _rewarders ); } // Update the given pool's Librex 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 accLibrexPerShare = pool.accLibrexPerShare; 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 librexReward = (multiplier * librexPerSec * pool.allocPoint * lpPercent) / totalAllocPoint / total; accLibrexPerShare += ( ((librexReward * ACC_TOKEN_PRECISION) / lpSupply) ); } uint256 pendingLibrex = (((user.amount * accLibrexPerShare) / 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(librex); symbols[0] = IBoringERC20(librex).safeSymbol(); decimals[0] = IBoringERC20(librex).safeDecimals(); amounts[0] = pendingLibrex; 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(librex); symbols[0] = IBoringERC20(librex).safeSymbol(); decimals[0] = IBoringERC20(librex).safeDecimals(); uint256 total = 1000; uint256 lpPercent = total - teamPercent - treasuryPercent - investorPercent; rewardsPerSec[0] = (pool.allocPoint * librexPerSec * 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 Librex. 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 librexReward = ((multiplier * librexPerSec) * pool.allocPoint) / totalAllocPoint; uint256 total = 1000; uint256 lpPercent = total - teamPercent - treasuryPercent - investorPercent; librex.mint(teamAddress, (librexReward * teamPercent) / total); librex.mint(treasuryAddress, (librexReward * treasuryPercent) / total); librex.mint(investorAddress, (librexReward * investorPercent) / total); librex.mint(address(this), (librexReward * lpPercent) / total); pool.accLibrexPerShare += (librexReward * ACC_TOKEN_PRECISION * lpPercent) / pool.totalLp / total; pool.lastRewardTimestamp = block.timestamp; emit UpdatePool( _pid, pool.lastRewardTimestamp, lpSupply, pool.accLibrexPerShare ); } 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 Librex allocation. function deposit(uint256 _pid, uint256 _amount) public nonReentrant { _deposit(_pid, _amount); } // Deposit tokens for Librex allocation. function _deposit(uint256 _pid, uint256 _amount) internal validatePoolByPid(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; _updatePool(_pid); payOrLockupPendingLibrex(_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(librex)) { totalLibrexInPools += _amount; } } user.rewardDebt = (user.amount * pool.accLibrexPerShare) / 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); payOrLockupPendingLibrex(_pid); if (_amount > 0) { user.amount -= _amount; if (address(pool.lpToken) == address(librex)) { totalLibrexInPools -= _amount; } pool.lpToken.safeTransfer(msg.sender, _amount); } user.rewardDebt = (user.amount * pool.accLibrexPerShare) / 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(librex)) { totalLibrexInPools -= amount; } pool.lpToken.safeTransfer(msg.sender, amount); emit EmergencyWithdraw(msg.sender, _pid, amount); } // Pay or lockup pending Librex. function payOrLockupPendingLibrex(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.accLibrexPerShare) / 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 safeLibrexTransfer(msg.sender, pendingRewards); } } else if (pending > 0) { totalLockedUpRewards += pending; user.rewardLockedUp += pending; emit RewardLockedUp(msg.sender, _pid, pending); } } // Safe Librex transfer function, just in case if rounding error causes pool do not have enough Librex. function safeLibrexTransfer(address _to, uint256 _amount) internal { if (librex.balanceOf(address(this)) > totalLibrexInPools) { //librexBal = total Librex in BasedDistributor - total Librex in Librex pools, this will make sure that BasedDistributor never transfer rewards from deposited Librex pools uint256 librexBal = librex.balanceOf(address(this)) - totalLibrexInPools; if (_amount >= librexBal) { librex.safeTransfer(_to, librexBal); } else if (_amount > 0) { librex.safeTransfer(_to, _amount); } } } function updateEmissionRate(uint256 _librexPerSec) public onlyOwner { _massUpdatePools(); emit EmissionRateUpdated(msg.sender, librexPerSec, _librexPerSec); librexPerSec = _librexPerSec; } 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":"_librex","type":"address"},{"internalType":"uint256","name":"_librexPerSec","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":"accLibrexPerShare","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":"librex","outputs":[{"internalType":"contract IBoringERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"librexPerSec","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":"accLibrexPerShare","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":"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":"totalLibrexInPools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedUpRewards","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":"_librexPerSec","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
60a06040525f600681905560095564e8d4a51000608052348015610021575f5ffd5b506040516155c83803806155c8833981016040819052610040916102ce565b61004933610268565b600180556101f48311156100b45760405162461bcd60e51b815260206004820152602760248201527f636f6e7374727563746f723a20696e76616c6964207465616d2070657263656e604482015266742076616c756560c81b60648201526084015b60405180910390fd5b6101f482111561011a5760405162461bcd60e51b815260206004820152602b60248201527f636f6e7374727563746f723a20696e76616c696420747265617375727920706560448201526a7263656e742076616c756560a81b60648201526084016100ab565b6101f48111156101805760405162461bcd60e51b815260206004820152602b60248201527f636f6e7374727563746f723a20696e76616c696420696e766573746f7220706560448201526a7263656e742076616c756560a81b60648201526084016100ab565b6101f48161018e848661034f565b610198919061034f565b11156101f25760405162461bcd60e51b815260206004820152602360248201527f636f6e7374727563746f723a20746f74616c2070657263656e74206f766572206044820152620dac2f60eb1b60648201526084016100ab565b610200426301e1338061034f565b600755600280546001600160a01b03199081166001600160a01b039a8b1617909155600397909755600a8054881696891696909617909555600b8054871694881694909417909355600c80549095169190951617909255600d92909255600e55600f55610374565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146102cb575f5ffd5b50565b5f5f5f5f5f5f5f5f610100898b0312156102e6575f5ffd5b88516102f1816102b7565b60208a015160408b01519199509750610309816102b7565b60608a015190965061031a816102b7565b60808a015190955061032b816102b7565b60a08a015160c08b015160e0909b0151999c989b5096999598909790945092505050565b8082018082111561036e57634e487b7160e01b5f52601160045260245ffd5b92915050565b6080516152196103af5f395f8181611034015281816130350152818161308201528181613ad301528181613bf5015261437901526152195ff3fe608060405234801561000f575f5ffd5b50600436106102d8575f3560e01c80636690864e11610187578063dc640ac9116100dd578063e2bbb15811610093578063eff8976b1161006e578063eff8976b1461068c578063f2fde38b146106ac578063ffcd4263146106bf575f5ffd5b8063e2bbb1581461065d578063e6fd48bc14610670578063eddf965214610679575f5ffd5b8063de2885ad116100c3578063de2885ad1461062a578063de73149d1461064a578063e164ac5014610654575f5ffd5b8063dc640ac91461060e578063dce13e4114610621575f5ffd5b80638da5cb5b1161013d578063afbcfea111610118578063afbcfea1146105dd578063c5f956af146105e5578063cf23762714610605575f5ffd5b80638da5cb5b1461054e57806393f1a40b1461056b578063949e6302146105ca575f5ffd5b8063812c64f11161016d578063812c64f11461050c578063876d3c9c1461052857806389a2bc251461053b575f5ffd5b80636690864e146104f1578063715018a614610504575f5ffd5b806342602f1e1161023c578063515bc323116101f2578063630b5ba1116101cd578063630b5ba1146104c3578063654c9ece146104cb5780636605bfda146104de575f5ffd5b8063515bc3231461048a57806351eb05a61461049d5780635312ea8e146104b0575f5ffd5b8063465e81ec11610222578063465e81ec1461044b578063474fa6301461046e578063508593ab14610477575f5ffd5b806342602f1e14610425578063441a3e7014610438575f5ffd5b80631526fe27116102915780631c75f085116102775780631c75f085146103cf5780632081ccc4146103ef5780632e6c998d14610402575f5ffd5b80631526fe271461036357806317caf6f1146103c6575f5ffd5b8063081e3eda116102c1578063081e3eda146103015780630ba84cd21461030957806312e228fd1461031e575f5ffd5b806304ef9d58146102dc5780630735b208146102f8575b5f5ffd5b6102e5600e5481565b6040519081526020015b60405180910390f35b6102e5600f5481565b6004546102e5565b61031c610317366004614b47565b6106d2565b005b600c5461033e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ef565b610376610371366004614b47565b610725565b6040805173ffffffffffffffffffffffffffffffffffffffff9098168852602088019690965294860193909352606085019190915261ffff16608084015260a083015260c082015260e0016102ef565b6102e560065481565b600a5461033e9073ffffffffffffffffffffffffffffffffffffffff1681565b61031c6103fd366004614bb7565b61078d565b610415610410366004614c44565b610b79565b60405190151581526020016102ef565b61031c610433366004614c72565b610c35565b61031c610446366004614c8d565b610e15565b61045e610459366004614b47565b611198565b6040516102ef9493929190614d2d565b6102e560085481565b61031c610485366004614e26565b6118a9565b61031c610498366004614e69565b611d5d565b61031c6104ab366004614b47565b611ebe565b61031c6104be366004614b47565b611edb565b61031c61214b565b6102e56104d9366004614b47565b612166565b61031c6104ec366004614c72565b612191565b61031c6104ff366004614c72565b612371565b61031c612551565b6105156101f481565b60405161ffff90911681526020016102ef565b61031c610536366004614b47565b612562565b61031c610549366004614b47565b6126e9565b5f5473ffffffffffffffffffffffffffffffffffffffff1661033e565b6105aa610579366004614c44565b600560209081525f928352604080842090915290825290208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102ef565b61031c6105d8366004614b47565b612870565b61031c6129f7565b600b5461033e9073ffffffffffffffffffffffffffffffffffffffff1681565b6102e560035481565b61031c61061c366004614eb8565b612ad6565b6102e560095481565b60025461033e9073ffffffffffffffffffffffffffffffffffffffff1681565b6102e56212750081565b6102e5600d5481565b61031c61066b366004614c8d565b612b87565b6102e560075481565b61031c610687366004614c8d565b612ba2565b61069f61069a366004614b47565b612c99565b6040516102ef9190614ef7565b61031c6106ba366004614c72565b612e09565b61045e6106cd366004614c44565b612ebd565b6106da61358e565b6106e261360e565b600354604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2600355565b60048181548110610734575f80fd5b5f918252602090912060089091020180546001820154600283015460038401546004850154600586015460069096015473ffffffffffffffffffffffffffffffffffffffff909516965092949193909261ffff16919087565b61079561358e565b60045486908110610807576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064015b60405180910390fd5b600a821115610872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7365743a20746f6f206d616e792072657761726465727300000000000000000060448201526064016107fe565b6101f461ffff861611156108e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f7365743a206465706f7369742066656520746f6f20686967680000000000000060448201526064016107fe565b6212750084111561094f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016107fe565b5f5b82811015610a0d5761099f84848381811061096e5761096e614f09565b90506020020160208101906109839190614c72565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b610a05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7365743a207265776172646572206d75737420626520636f6e7472616374000060448201526064016107fe565b600101610951565b50610a1661360e565b8560048881548110610a2a57610a2a614f09565b905f5260205f20906008020160010154600654610a479190614f63565b610a519190614f76565b6006819055508560048881548110610a6b57610a6b614f09565b905f5260205f209060080201600101819055508460048881548110610a9257610a92614f09565b905f5260205f2090600802016004015f6101000a81548161ffff021916908361ffff1602179055508360048881548110610ace57610ace614f09565b905f5260205f20906008020160050181905550828260048981548110610af657610af6614f09565b905f5260205f2090600802016007019190610b12929190614a35565b508282604051610b23929190614f89565b6040805191829003822088835261ffff881660208401529082018690529088907f5ed6f0deef9ab49d02900b40d596df4cd637a2a7fbfa56bbcb377389d3ce8d289060600160405180910390a350505050505050565b6004545f9083908110610be8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f84815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290206007544210801590610c2c575080600301544210155b95945050505050565b600c5473ffffffffffffffffffffffffffffffffffffffff163314610d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f73657420696e766573746f7220616464726573733a206f6e6c7920707265766960448201527f6f757320696e766573746f722063616e2063616c6c2074686973206d6574686f60648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a4016107fe565b73ffffffffffffffffffffffffffffffffffffffff8116610da5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f73657420696e766573746f7220616464726573733a20696e76616c6964206e6560448201527f7720696e766573746f722061646472657373000000000000000000000000000060648201526084016107fe565b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f6260cb34f06b782e83bde168f7d74ab2133041cb53b63ce22b127822a92b6791905f90a350565b610e1d61362b565b60045482908110610e8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f60048481548110610e9e57610e9e614f09565b5f91825260208083208784526005825260408085203386529092529220805460089092029092019250841115610f30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f77697468647261773a207573657220616d6f756e74206e6f7420656e6f75676860448201526064016107fe565b8382600601541015610f9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f77697468647261773a20706f6f6c20746f74616c206e6f7420656e6f7567680060448201526064016107fe565b610fa78561369e565b610fb085613b84565b831561102b5783815f015f828254610fc89190614f63565b9091555050600254825473ffffffffffffffffffffffffffffffffffffffff918216911603611008578360095f8282546110029190614f63565b90915550505b815461102b9073ffffffffffffffffffffffffffffffffffffffff163386613d2e565b600382015481547f00000000000000000000000000000000000000000000000000000000000000009161105d91614fd7565b6110679190614fee565b60018201555f5b60078301548110156111315782600701818154811061108f5761108f614f09565b5f9182526020909120015482546040517f2eef144700000000000000000000000000000000000000000000000000000000815260048101899052336024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff90911690632eef1447906064015f604051808303815f87803b158015611110575f5ffd5b505af1158015611122573d5f5f3e3d5ffd5b5050505080600101905061106e565b5083156111515783826006015f82825461114b9190614f63565b90915550505b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a350505061119460018055565b5050565b60608060608084600480549050811061120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f6004878154811061122157611221614f09565b905f5260205f2090600802019050806007018054905060016112439190614f76565b67ffffffffffffffff81111561125b5761125b615026565b604051908082528060200260200182016040528015611284578160200160208202803683370190505b506007820154909650611298906001614f76565b67ffffffffffffffff8111156112b0576112b0615026565b6040519080825280602002602001820160405280156112e357816020015b60608152602001906001900390816112ce5790505b5060078201549095506112f7906001614f76565b67ffffffffffffffff81111561130f5761130f615026565b604051908082528060200260200182016040528015611338578160200160208202803683370190505b50600782015490945061134c906001614f76565b67ffffffffffffffff81111561136457611364615026565b60405190808252806020026020018201604052801561138d578160200160208202803683370190505b50600254875191945073ffffffffffffffffffffffffffffffffffffffff169087905f906113bd576113bd614f09565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526002546113ed9116613e99565b855f815181106113ff576113ff614f09565b602090810291909101015260025461142c9073ffffffffffffffffffffffffffffffffffffffff16613fad565b60ff16845f8151811061144157611441614f09565b6020026020010181815250505f6103e890505f600f54600e54600d54846114689190614f63565b6114729190614f63565b61147c9190614f63565b9050816006548260035486600101546114959190614fd7565b61149f9190614fd7565b6114a99190614fee565b6114b39190614fee565b855f815181106114c5576114c5614f09565b60209081029190910101525f5b600784015481101561189d578360070181815481106114f3576114f3614f09565b5f9182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c1926004808401938290030181865afa158015611564573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115889190615053565b89611594836001614f76565b815181106115a4576115a4614f09565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506116a68460070182815481106115f6576115f6614f09565b5f9182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c1926004808401938290030181865afa158015611667573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061168b9190615053565b73ffffffffffffffffffffffffffffffffffffffff16613e99565b886116b2836001614f76565b815181106116c2576116c2614f09565b60200260200101819052506117958460070182815481106116e5576116e5614f09565b5f9182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c1926004808401938290030181865afa158015611756573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177a9190615053565b73ffffffffffffffffffffffffffffffffffffffff16613fad565b60ff16876117a4836001614f76565b815181106117b4576117b4614f09565b6020026020010181815250508360070181815481106117d5576117d5614f09565b5f918252602090912001546040517f465e81ec000000000000000000000000000000000000000000000000000000008152600481018c905273ffffffffffffffffffffffffffffffffffffffff9091169063465e81ec90602401602060405180830381865afa15801561184a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061186e919061506e565b8661187a836001614f76565b8151811061188a5761188a614f09565b60209081029190910101526001016114d2565b50505050509193509193565b6118b161358e565b600a81111561191c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6164643a20746f6f206d616e792072657761726465727300000000000000000060448201526064016107fe565b6101f461ffff8516111561198c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6164643a206465706f7369742066656520746f6f20686967680000000000000060448201526064016107fe565b621275008311156119f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016107fe565b73ffffffffffffffffffffffffffffffffffffffff85163b611a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016107fe565b5f5b81811015611b2a57611abc83838381811061096e5761096e614f09565b611b22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f6164643a207265776172646572206d75737420626520636f6e7472616374000060448201526064016107fe565b600101611a9f565b50611b3361360e565b5f6007544211611b4557600754611b47565b425b90508660065f828254611b5a9190614f76565b9250508190555060046040518061010001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018381526020015f81526020018761ffff1681526020018681526020015f81526020018585808060200260200160405190810160405280939291908181526020018383602002808284375f920182905250939094525050835460018082018655948252602091829020845160089092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911781558382015194810194909455604083015160028501556060830151600385015560808301516004850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff90921691909117905560a0830151600585015560c0830151600685015560e08301518051939493611ccd935060078501929190910190614abb565b5050508282604051611ce0929190614f89565b60405190819003902060045473ffffffffffffffffffffffffffffffffffffffff881690611d1090600190614f63565b604080518b815261ffff8a1660208201529081018890527f5ed295c4f5af5aeb1ccd905e1cd55a86ab3bb9fc1fe2346ff64ac47dbef366619060600160405180910390a450505050505050565b611d6561362b565b60045486908110611dd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f60048881548110611de657611de6614f09565b5f918252602090912060089091020180546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018a90526064810189905260ff8816608482015260a4810187905260c4810186905291925073ffffffffffffffffffffffffffffffffffffffff1690819063d505accf9060e4015f604051808303815f87803b158015611e8a575f5ffd5b505af1158015611e9c573d5f5f3e3d5ffd5b50505050611eaa898961409c565b505050611eb660018055565b505050505050565b611ec661362b565b611ecf8161369e565b611ed860018055565b50565b611ee361362b565b5f60048281548110611ef757611ef7614f09565b5f9182526020808320858452600582526040808520338652909252922080546008929092029092016006810154909350811115611fb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f656d657267656e63792077697468647261773a20706f6f6c20746f74616c206e60448201527f6f7420656e6f756768000000000000000000000000000000000000000000000060648201526084016107fe565b5f808355600183018190556002830181905560038301819055600684018054839290611fe3908490614f63565b909155505f90505b60078401548110156120a95783600701818154811061200c5761200c614f09565b5f9182526020822001546040517f2eef144700000000000000000000000000000000000000000000000000000000815260048101889052336024820152604481019290925273ffffffffffffffffffffffffffffffffffffffff1690632eef1447906064015f604051808303815f87803b158015612088575f5ffd5b505af115801561209a573d5f5f3e3d5ffd5b50505050806001019050611feb565b50600254835473ffffffffffffffffffffffffffffffffffffffff9182169116036120e5578060095f8282546120df9190614f63565b90915550505b82546121089073ffffffffffffffffffffffffffffffffffffffff163383613d2e565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a3505050611ed860018055565b61215361362b565b61215b61360e565b61216460018055565b565b5f6004828154811061217a5761217a614f09565b905f5260205f209060080201600601549050919050565b600b5473ffffffffffffffffffffffffffffffffffffffff16331461225e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f73657420747265617375727920616464726573733a206f6e6c7920707265766960448201527f6f757320747265617375727920616464726573732063616e2063616c6c20746860648201527f6973206d6574686f640000000000000000000000000000000000000000000000608482015260a4016107fe565b73ffffffffffffffffffffffffffffffffffffffff8116612301576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f73657420747265617375727920616464726573733a20696e76616c6964206e6560448201527f772074726561737572792061646472657373000000000000000000000000000060648201526084016107fe565b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f61885cdba916be748ff3e3f6f15e4206153b8ea3b7acabade9d04b4063a83510905f90a350565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461243e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f736574207465616d20616464726573733a206f6e6c792070726576696f75732060448201527f7465616d20616464726573732063616e2063616c6c2074686973206d6574686f60648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a4016107fe565b73ffffffffffffffffffffffffffffffffffffffff81166124e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f736574207465616d20616464726573733a20696e76616c6964206e657720746560448201527f616d20616464726573730000000000000000000000000000000000000000000060648201526084016107fe565b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f42fbc17d847fdc3e5c82da842a5ef3979c64f3b94cd4e7382310fd5525c6ee0f905f90a350565b61255961358e565b6121645f6144d4565b61256a61358e565b6101f48111156125fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f73657420696e766573746f722070657263656e743a20696e76616c696420706560448201527f7263656e742076616c756500000000000000000000000000000000000000000060648201526084016107fe565b6101f4600e5482600d546126109190614f76565b61261a9190614f76565b11156126a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f73657420696e766573746f722070657263656e743a20746f74616c207065726360448201527f656e74206f766572206d6178000000000000000000000000000000000000000060648201526084016107fe565b600f5460408051918252602082018390527f905b464403a98b455243c8b4d30c545b8fbd70cda670142b9326425b2c039f3b910160405180910390a1600f55565b6126f161358e565b6101f4811115612783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f7365742074726561737572792070657263656e743a20696e76616c696420706560448201527f7263656e742076616c756500000000000000000000000000000000000000000060648201526084016107fe565b6101f4600f5482600d546127979190614f76565b6127a19190614f76565b111561282f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f7365742074726561737572792070657263656e743a20746f74616c207065726360448201527f656e74206f766572206d6178000000000000000000000000000000000000000060648201526084016107fe565b600e5460408051918252602082018390527fa565895c0101fca10e6a7b85742e56cf52ac5f58b09ce030425d3555b47069fd910160405180910390a1600e55565b61287861358e565b6101f481111561290a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f736574207465616d2070657263656e743a20696e76616c69642070657263656e60448201527f742076616c75650000000000000000000000000000000000000000000000000060648201526084016107fe565b6101f4600f5482600e5461291e9190614f76565b6129289190614f76565b11156129b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f736574207465616d2070657263656e743a20746f74616c2070657263656e742060448201527f6f766572206d617800000000000000000000000000000000000000000000000060648201526084016107fe565b600d5460408051918252602082018390527f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6910160405180910390a1600d55565b6129ff61358e565b6007544210612a90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f7374617274206661726d696e673a206661726d207374617274656420616c726560448201527f616479000000000000000000000000000000000000000000000000000000000060648201526084016107fe565b6004545f5b81811015612ace575f60048281548110612ab157612ab1614f09565b5f9182526020909120426008909202016002015550600101612a95565b505042600755565b612ade61362b565b601e811115612b49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f68617276657374206d616e793a20746f6f206d616e7920706f6f6c206964730060448201526064016107fe565b5f5b81811015612b7d57612b75838383818110612b6857612b68614f09565b905060200201355f61409c565b600101612b4b565b5061119460018055565b612b8f61362b565b612b99828261409c565b61119460018055565b612baa61358e565b612bb261360e565b3373ffffffffffffffffffffffffffffffffffffffff167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef360048481548110612bfd57612bfd614f09565b905f5260205f2090600802016001015483604051612c25929190918252602082015260400190565b60405180910390a28060048381548110612c4157612c41614f09565b905f5260205f20906008020160010154600654612c5e9190614f63565b612c689190614f76565b6006819055508060048381548110612c8257612c82614f09565b905f5260205f209060080201600101819055505050565b60045460609082908110612d09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f60048481548110612d1d57612d1d614f09565b905f5260205f2090600802019050806007018054905067ffffffffffffffff811115612d4b57612d4b615026565b604051908082528060200260200182016040528015612d74578160200160208202803683370190505b5092505f5b6007820154811015612e0157816007018181548110612d9a57612d9a614f09565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848281518110612dd457612dd4614f09565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600101612d79565b505050919050565b612e1161358e565b73ffffffffffffffffffffffffffffffffffffffff8116612eb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107fe565b611ed8816144d4565b606080606080856004805490508110612f32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f60048881548110612f4657612f46614f09565b5f91825260208083208b845260058252604080852073ffffffffffffffffffffffffffffffffffffffff8d1686529092529220600360089092029092019081015460068201546002830154929450909142118015612fa357508015155b15613075575f846002015442612fb99190614f63565b90505f6103e890505f600f54600e54600d5484612fd69190614f63565b612fe09190614f63565b612fea9190614f63565b90505f82600654838a60010154600354886130059190614fd7565b61300f9190614fd7565b6130199190614fd7565b6130239190614fee565b61302d9190614fee565b90508461305a7f000000000000000000000000000000000000000000000000000000000000000083614fd7565b6130649190614fee565b61306e9087614f76565b9550505050505b5f836002015484600101547f000000000000000000000000000000000000000000000000000000000000000085875f01546130b09190614fd7565b6130ba9190614fee565b6130c49190614f63565b6130ce9190614f76565b60078601549091506130e1906001614f76565b67ffffffffffffffff8111156130f9576130f9615026565b604051908082528060200260200182016040528015613122578160200160208202803683370190505b506007860154909a50613136906001614f76565b67ffffffffffffffff81111561314e5761314e615026565b60405190808252806020026020018201604052801561318157816020015b606081526020019060019003908161316c5790505b506007860154909950613195906001614f76565b67ffffffffffffffff8111156131ad576131ad615026565b6040519080825280602002602001820160405280156131d6578160200160208202803683370190505b5060078601549097506131ea906001614f76565b67ffffffffffffffff81111561320257613202615026565b60405190808252806020026020018201604052801561322b578160200160208202803683370190505b506002548b5191995073ffffffffffffffffffffffffffffffffffffffff16908b905f9061325b5761325b614f09565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201015260025461328b9116613e99565b895f8151811061329d5761329d614f09565b60209081029190910101526002546132ca9073ffffffffffffffffffffffffffffffffffffffff16613fad565b60ff16885f815181106132df576132df614f09565b60200260200101818152505080875f815181106132fe576132fe614f09565b60209081029190910101525f5b600786015481101561357e5785600701818154811061332c5761332c614f09565b5f9182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c1926004808401938290030181865afa15801561339d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133c19190615053565b8b6133cd836001614f76565b815181106133dd576133dd614f09565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061342f8660070182815481106115f6576115f6614f09565b8a61343b836001614f76565b8151811061344b5761344b614f09565b602002602001018190525061346e8660070182815481106116e5576116e5614f09565b60ff168961347d836001614f76565b8151811061348d5761348d614f09565b6020026020010181815250508560070181815481106134ae576134ae614f09565b5f918252602090912001546040517fffcd4263000000000000000000000000000000000000000000000000000000008152600481018f905273ffffffffffffffffffffffffffffffffffffffff8e811660248301529091169063ffcd426390604401602060405180830381865afa15801561352b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061354f919061506e565b8861355b836001614f76565b8151811061356b5761356b614f09565b602090810291909101015260010161330b565b5050505050505092959194509250565b5f5473ffffffffffffffffffffffffffffffffffffffff163314612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107fe565b5f5b600454811015611ed8576136238161369e565b600101613610565b600260015403613697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107fe565b6002600155565b6004548190811061370b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f6004838154811061371f5761371f614f09565b905f5260205f20906008020190508060020154421161373d57505050565b600681015480158061375157506001820154155b156137625750426002909101555050565b5f8260020154426137739190614f63565b90505f60065484600101546003548461378c9190614fd7565b6137969190614fd7565b6137a09190614fee565b90505f6103e890505f600f54600e54600d54846137bd9190614f63565b6137c79190614f63565b6137d19190614f63565b600254600a54600d5492935073ffffffffffffffffffffffffffffffffffffffff918216926340c10f199290911690859061380c9088614fd7565b6138169190614fee565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044015f604051808303815f87803b15801561387e575f5ffd5b505af1158015613890573d5f5f3e3d5ffd5b5050600254600b54600e5473ffffffffffffffffffffffffffffffffffffffff92831694506340c10f19935091169085906138cb9088614fd7565b6138d59190614fee565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044015f604051808303815f87803b15801561393d575f5ffd5b505af115801561394f573d5f5f3e3d5ffd5b5050600254600c54600f5473ffffffffffffffffffffffffffffffffffffffff92831694506340c10f199350911690859061398a9088614fd7565b6139949190614fee565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044015f604051808303815f87803b1580156139fc575f5ffd5b505af1158015613a0e573d5f5f3e3d5ffd5b505060025473ffffffffffffffffffffffffffffffffffffffff1691506340c10f1990503084613a3e8588614fd7565b613a489190614fee565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044015f604051808303815f87803b158015613ab0575f5ffd5b505af1158015613ac2573d5f5f3e3d5ffd5b505050600687015483915082613af87f000000000000000000000000000000000000000000000000000000000000000087614fd7565b613b029190614fd7565b613b0c9190614fee565b613b169190614fee565b866003015f828254613b289190614f76565b909155505042600287018190556003870154604080519283526020830188905282015288907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469060600160405180910390a25050505050505050565b5f60048281548110613b9857613b98614f09565b5f91825260208083208584526005825260408085203386529092529220600381015460089092029092019250158015613bd357506007544210155b15613bed576005820154613be79042614f76565b60038201555b5f81600101547f00000000000000000000000000000000000000000000000000000000000000008460030154845f0154613c279190614fd7565b613c319190614fee565b613c3b9190614f63565b9050613c478433610b79565b15613cba575f811180613c5d57505f8260020154115b15613cb5575f826002015482613c739190614f76565b9050826002015460085f828254613c8a9190614f63565b90915550505f60028401556005840154613ca49042614f76565b6003840155613cb33382614548565b505b613d28565b8015613d28578060085f828254613cd19190614f76565b9250508190555080826002015f828254613ceb9190614f76565b9091555050604051818152849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c19060200160405180910390a35b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f92839290871691613dc49190615085565b5f604051808303815f865af19150503d805f8114613dfd576040519150601f19603f3d011682016040523d82523d5f602084013e613e02565b606091505b5091509150818015613e2c575080511580613e2c575080806020019051810190613e2c919061509b565b613e92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c65640000000060448201526064016107fe565b5050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff861691613f1a9190615085565b5f60405180830381855afa9150503d805f8114613f52576040519150601f19603f3d011682016040523d82523d5f602084013e613f57565b606091505b509150915081613f9c576040518060400160405280600381526020017f3f3f3f0000000000000000000000000000000000000000000000000000000000815250613fa5565b613fa5816146db565b949350505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169161402d9190615085565b5f60405180830381855afa9150503d805f8114614065576040519150601f19603f3d011682016040523d82523d5f602084013e61406a565b606091505b509150915081801561407d575080516020145b614088576012613fa5565b80806020019051810190613fa591906150ba565b60045482908110614109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f6004848154811061411d5761411d614f09565b5f918252602080832087845260058252604080852033865290925292206008909102909101915061414d8561369e565b61415685613b84565b83156143705781546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156141c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141eb919061506e565b83549091506142129073ffffffffffffffffffffffffffffffffffffffff163330886148c9565b82546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561427d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142a1919061506e565b90506142ad8282614f63565b600485015490965061ffff161561431b5760048401545f90612710906142d79061ffff1689614fd7565b6142e19190614fee565b600b54865491925061430d9173ffffffffffffffffffffffffffffffffffffffff908116911683613d2e565b6143178188614f63565b9650505b85835f015f82825461432d9190614f76565b9091555050600254845473ffffffffffffffffffffffffffffffffffffffff91821691160361436d578560095f8282546143679190614f76565b90915550505b50505b600382015481547f0000000000000000000000000000000000000000000000000000000000000000916143a291614fd7565b6143ac9190614fee565b60018201555f5b6007830154811015614476578260070181815481106143d4576143d4614f09565b5f9182526020909120015482546040517f2eef144700000000000000000000000000000000000000000000000000000000815260048101899052336024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff90911690632eef1447906064015f604051808303815f87803b158015614455575f5ffd5b505af1158015614467573d5f5f3e3d5ffd5b505050508060010190506143b3565b5083156144965783826006015f8282546144909190614f76565b90915550505b604051848152859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a35050505050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6009546002546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156145b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145db919061506e565b1115611194576009546002546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f929173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015614651573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614675919061506e565b61467f9190614f63565b90508082106146b1576002546146ac9073ffffffffffffffffffffffffffffffffffffffff168483613d2e565b505050565b81156146ac576002546146ac9073ffffffffffffffffffffffffffffffffffffffff168484613d2e565b6060604082511061470057818060200190518101906146fa91906150d5565b92915050565b815160200361488b575f5b60208160ff161080156147585750828160ff168151811061472e5761472e614f09565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1561476f5780614767816151c5565b91505061470b565b5f8160ff1667ffffffffffffffff81111561478c5761478c615026565b6040519080825280601f01601f1916602001820160405280156147b6576020820181803683370190505b5090505f91505b60208260ff1610801561480a5750838260ff16815181106147e0576147e0614f09565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1561488457838260ff168151811061482457614824614f09565b602001015160f81c60f81b818360ff168151811061484457614844614f09565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508161487c816151c5565b9250506147bd565b9392505050565b505060408051808201909152600381527f3f3f3f0000000000000000000000000000000000000000000000000000000000602082015290565b919050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291515f928392908816916149679190615085565b5f604051808303815f865af19150503d805f81146149a0576040519150601f19603f3d011682016040523d82523d5f602084013e6149a5565b606091505b50915091508180156149cf5750805115806149cf5750808060200190518101906149cf919061509b565b611eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c656460448201526064016107fe565b828054828255905f5260205f20908101928215614aab579160200282015b82811115614aab5781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190614a53565b50614ab7929150614b33565b5090565b828054828255905f5260205f20908101928215614aab579160200282015b82811115614aab57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614ad9565b5b80821115614ab7575f8155600101614b34565b5f60208284031215614b57575f5ffd5b5035919050565b803561ffff811681146148c4575f5ffd5b5f5f83601f840112614b7f575f5ffd5b50813567ffffffffffffffff811115614b96575f5ffd5b6020830191508360208260051b8501011115614bb0575f5ffd5b9250929050565b5f5f5f5f5f5f60a08789031215614bcc575f5ffd5b8635955060208701359450614be360408801614b5e565b935060608701359250608087013567ffffffffffffffff811115614c05575f5ffd5b614c1189828a01614b6f565b979a9699509497509295939492505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611ed8575f5ffd5b5f5f60408385031215614c55575f5ffd5b823591506020830135614c6781614c23565b809150509250929050565b5f60208284031215614c82575f5ffd5b813561488481614c23565b5f5f60408385031215614c9e575f5ffd5b50508035926020909101359150565b5f8151808452602084019350602083015f5b82811015614cf357815173ffffffffffffffffffffffffffffffffffffffff16865260209586019590910190600101614cbf565b5093949350505050565b5f8151808452602084019350602083015f5b82811015614cf3578151865260209586019590910190600101614d0f565b608081525f614d3f6080830187614cad565b828103602084015280865180835260208301915060208160051b840101602089015f5b83811015614df0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552815180518085528060208301602087015e5f6020828701015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011686010194505050602082019150602085019450600181019050614d62565b50508581036040870152614e048189614cfd565b93505050508281036060840152614e1b8185614cfd565b979650505050505050565b5f5f5f5f5f5f60a08789031215614e3b575f5ffd5b863595506020870135614e4d81614c23565b9450614be360408801614b5e565b60ff81168114611ed8575f5ffd5b5f5f5f5f5f5f60c08789031215614e7e575f5ffd5b8635955060208701359450604087013593506060870135614e9e81614e5b565b9598949750929560808101359460a0909101359350915050565b5f5f60208385031215614ec9575f5ffd5b823567ffffffffffffffff811115614edf575f5ffd5b614eeb85828601614b6f565b90969095509350505050565b602081525f6148846020830184614cad565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156146fa576146fa614f36565b808201808211156146fa576146fa614f36565b5f8184825b85811015614fcc578135614fa181614c23565b73ffffffffffffffffffffffffffffffffffffffff1683526020928301929190910190600101614f8e565b509095945050505050565b80820281158282048414176146fa576146fa614f36565b5f82615021577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215615063575f5ffd5b815161488481614c23565b5f6020828403121561507e575f5ffd5b5051919050565b5f82518060208501845e5f920191825250919050565b5f602082840312156150ab575f5ffd5b81518015158114614884575f5ffd5b5f602082840312156150ca575f5ffd5b815161488481614e5b565b5f602082840312156150e5575f5ffd5b815167ffffffffffffffff8111156150fb575f5ffd5b8201601f8101841361510b575f5ffd5b805167ffffffffffffffff81111561512557615125615026565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561519157615191615026565b6040528181528282016020018610156151a8575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60ff821660ff81036151da576151da614f36565b6001019291505056fea26469706673582212209bc60f2037c62aab4ba13d7475102e2166cadc72b2663725c746c5cac9a42f4b64736f6c634300081c0033000000000000000000000000ba56b07d7d730212a1f0e5eb6684a02760f7e1e700000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000949cc36ead9167ee373ce971bc3d3e5800a809f5000000000000000000000000949cc36ead9167ee373ce971bc3d3e5800a809f5000000000000000000000000949cc36ead9167ee373ce971bc3d3e5800a809f5000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106102d8575f3560e01c80636690864e11610187578063dc640ac9116100dd578063e2bbb15811610093578063eff8976b1161006e578063eff8976b1461068c578063f2fde38b146106ac578063ffcd4263146106bf575f5ffd5b8063e2bbb1581461065d578063e6fd48bc14610670578063eddf965214610679575f5ffd5b8063de2885ad116100c3578063de2885ad1461062a578063de73149d1461064a578063e164ac5014610654575f5ffd5b8063dc640ac91461060e578063dce13e4114610621575f5ffd5b80638da5cb5b1161013d578063afbcfea111610118578063afbcfea1146105dd578063c5f956af146105e5578063cf23762714610605575f5ffd5b80638da5cb5b1461054e57806393f1a40b1461056b578063949e6302146105ca575f5ffd5b8063812c64f11161016d578063812c64f11461050c578063876d3c9c1461052857806389a2bc251461053b575f5ffd5b80636690864e146104f1578063715018a614610504575f5ffd5b806342602f1e1161023c578063515bc323116101f2578063630b5ba1116101cd578063630b5ba1146104c3578063654c9ece146104cb5780636605bfda146104de575f5ffd5b8063515bc3231461048a57806351eb05a61461049d5780635312ea8e146104b0575f5ffd5b8063465e81ec11610222578063465e81ec1461044b578063474fa6301461046e578063508593ab14610477575f5ffd5b806342602f1e14610425578063441a3e7014610438575f5ffd5b80631526fe27116102915780631c75f085116102775780631c75f085146103cf5780632081ccc4146103ef5780632e6c998d14610402575f5ffd5b80631526fe271461036357806317caf6f1146103c6575f5ffd5b8063081e3eda116102c1578063081e3eda146103015780630ba84cd21461030957806312e228fd1461031e575f5ffd5b806304ef9d58146102dc5780630735b208146102f8575b5f5ffd5b6102e5600e5481565b6040519081526020015b60405180910390f35b6102e5600f5481565b6004546102e5565b61031c610317366004614b47565b6106d2565b005b600c5461033e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ef565b610376610371366004614b47565b610725565b6040805173ffffffffffffffffffffffffffffffffffffffff9098168852602088019690965294860193909352606085019190915261ffff16608084015260a083015260c082015260e0016102ef565b6102e560065481565b600a5461033e9073ffffffffffffffffffffffffffffffffffffffff1681565b61031c6103fd366004614bb7565b61078d565b610415610410366004614c44565b610b79565b60405190151581526020016102ef565b61031c610433366004614c72565b610c35565b61031c610446366004614c8d565b610e15565b61045e610459366004614b47565b611198565b6040516102ef9493929190614d2d565b6102e560085481565b61031c610485366004614e26565b6118a9565b61031c610498366004614e69565b611d5d565b61031c6104ab366004614b47565b611ebe565b61031c6104be366004614b47565b611edb565b61031c61214b565b6102e56104d9366004614b47565b612166565b61031c6104ec366004614c72565b612191565b61031c6104ff366004614c72565b612371565b61031c612551565b6105156101f481565b60405161ffff90911681526020016102ef565b61031c610536366004614b47565b612562565b61031c610549366004614b47565b6126e9565b5f5473ffffffffffffffffffffffffffffffffffffffff1661033e565b6105aa610579366004614c44565b600560209081525f928352604080842090915290825290208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102ef565b61031c6105d8366004614b47565b612870565b61031c6129f7565b600b5461033e9073ffffffffffffffffffffffffffffffffffffffff1681565b6102e560035481565b61031c61061c366004614eb8565b612ad6565b6102e560095481565b60025461033e9073ffffffffffffffffffffffffffffffffffffffff1681565b6102e56212750081565b6102e5600d5481565b61031c61066b366004614c8d565b612b87565b6102e560075481565b61031c610687366004614c8d565b612ba2565b61069f61069a366004614b47565b612c99565b6040516102ef9190614ef7565b61031c6106ba366004614c72565b612e09565b61045e6106cd366004614c44565b612ebd565b6106da61358e565b6106e261360e565b600354604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2600355565b60048181548110610734575f80fd5b5f918252602090912060089091020180546001820154600283015460038401546004850154600586015460069096015473ffffffffffffffffffffffffffffffffffffffff909516965092949193909261ffff16919087565b61079561358e565b60045486908110610807576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064015b60405180910390fd5b600a821115610872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7365743a20746f6f206d616e792072657761726465727300000000000000000060448201526064016107fe565b6101f461ffff861611156108e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f7365743a206465706f7369742066656520746f6f20686967680000000000000060448201526064016107fe565b6212750084111561094f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016107fe565b5f5b82811015610a0d5761099f84848381811061096e5761096e614f09565b90506020020160208101906109839190614c72565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b610a05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7365743a207265776172646572206d75737420626520636f6e7472616374000060448201526064016107fe565b600101610951565b50610a1661360e565b8560048881548110610a2a57610a2a614f09565b905f5260205f20906008020160010154600654610a479190614f63565b610a519190614f76565b6006819055508560048881548110610a6b57610a6b614f09565b905f5260205f209060080201600101819055508460048881548110610a9257610a92614f09565b905f5260205f2090600802016004015f6101000a81548161ffff021916908361ffff1602179055508360048881548110610ace57610ace614f09565b905f5260205f20906008020160050181905550828260048981548110610af657610af6614f09565b905f5260205f2090600802016007019190610b12929190614a35565b508282604051610b23929190614f89565b6040805191829003822088835261ffff881660208401529082018690529088907f5ed6f0deef9ab49d02900b40d596df4cd637a2a7fbfa56bbcb377389d3ce8d289060600160405180910390a350505050505050565b6004545f9083908110610be8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f84815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290206007544210801590610c2c575080600301544210155b95945050505050565b600c5473ffffffffffffffffffffffffffffffffffffffff163314610d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f73657420696e766573746f7220616464726573733a206f6e6c7920707265766960448201527f6f757320696e766573746f722063616e2063616c6c2074686973206d6574686f60648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a4016107fe565b73ffffffffffffffffffffffffffffffffffffffff8116610da5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f73657420696e766573746f7220616464726573733a20696e76616c6964206e6560448201527f7720696e766573746f722061646472657373000000000000000000000000000060648201526084016107fe565b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f6260cb34f06b782e83bde168f7d74ab2133041cb53b63ce22b127822a92b6791905f90a350565b610e1d61362b565b60045482908110610e8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f60048481548110610e9e57610e9e614f09565b5f91825260208083208784526005825260408085203386529092529220805460089092029092019250841115610f30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f77697468647261773a207573657220616d6f756e74206e6f7420656e6f75676860448201526064016107fe565b8382600601541015610f9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f77697468647261773a20706f6f6c20746f74616c206e6f7420656e6f7567680060448201526064016107fe565b610fa78561369e565b610fb085613b84565b831561102b5783815f015f828254610fc89190614f63565b9091555050600254825473ffffffffffffffffffffffffffffffffffffffff918216911603611008578360095f8282546110029190614f63565b90915550505b815461102b9073ffffffffffffffffffffffffffffffffffffffff163386613d2e565b600382015481547f000000000000000000000000000000000000000000000000000000e8d4a510009161105d91614fd7565b6110679190614fee565b60018201555f5b60078301548110156111315782600701818154811061108f5761108f614f09565b5f9182526020909120015482546040517f2eef144700000000000000000000000000000000000000000000000000000000815260048101899052336024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff90911690632eef1447906064015f604051808303815f87803b158015611110575f5ffd5b505af1158015611122573d5f5f3e3d5ffd5b5050505080600101905061106e565b5083156111515783826006015f82825461114b9190614f63565b90915550505b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a350505061119460018055565b5050565b60608060608084600480549050811061120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f6004878154811061122157611221614f09565b905f5260205f2090600802019050806007018054905060016112439190614f76565b67ffffffffffffffff81111561125b5761125b615026565b604051908082528060200260200182016040528015611284578160200160208202803683370190505b506007820154909650611298906001614f76565b67ffffffffffffffff8111156112b0576112b0615026565b6040519080825280602002602001820160405280156112e357816020015b60608152602001906001900390816112ce5790505b5060078201549095506112f7906001614f76565b67ffffffffffffffff81111561130f5761130f615026565b604051908082528060200260200182016040528015611338578160200160208202803683370190505b50600782015490945061134c906001614f76565b67ffffffffffffffff81111561136457611364615026565b60405190808252806020026020018201604052801561138d578160200160208202803683370190505b50600254875191945073ffffffffffffffffffffffffffffffffffffffff169087905f906113bd576113bd614f09565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526002546113ed9116613e99565b855f815181106113ff576113ff614f09565b602090810291909101015260025461142c9073ffffffffffffffffffffffffffffffffffffffff16613fad565b60ff16845f8151811061144157611441614f09565b6020026020010181815250505f6103e890505f600f54600e54600d54846114689190614f63565b6114729190614f63565b61147c9190614f63565b9050816006548260035486600101546114959190614fd7565b61149f9190614fd7565b6114a99190614fee565b6114b39190614fee565b855f815181106114c5576114c5614f09565b60209081029190910101525f5b600784015481101561189d578360070181815481106114f3576114f3614f09565b5f9182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c1926004808401938290030181865afa158015611564573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115889190615053565b89611594836001614f76565b815181106115a4576115a4614f09565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506116a68460070182815481106115f6576115f6614f09565b5f9182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c1926004808401938290030181865afa158015611667573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061168b9190615053565b73ffffffffffffffffffffffffffffffffffffffff16613e99565b886116b2836001614f76565b815181106116c2576116c2614f09565b60200260200101819052506117958460070182815481106116e5576116e5614f09565b5f9182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c1926004808401938290030181865afa158015611756573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177a9190615053565b73ffffffffffffffffffffffffffffffffffffffff16613fad565b60ff16876117a4836001614f76565b815181106117b4576117b4614f09565b6020026020010181815250508360070181815481106117d5576117d5614f09565b5f918252602090912001546040517f465e81ec000000000000000000000000000000000000000000000000000000008152600481018c905273ffffffffffffffffffffffffffffffffffffffff9091169063465e81ec90602401602060405180830381865afa15801561184a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061186e919061506e565b8661187a836001614f76565b8151811061188a5761188a614f09565b60209081029190910101526001016114d2565b50505050509193509193565b6118b161358e565b600a81111561191c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6164643a20746f6f206d616e792072657761726465727300000000000000000060448201526064016107fe565b6101f461ffff8516111561198c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6164643a206465706f7369742066656520746f6f20686967680000000000000060448201526064016107fe565b621275008311156119f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016107fe565b73ffffffffffffffffffffffffffffffffffffffff85163b611a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016107fe565b5f5b81811015611b2a57611abc83838381811061096e5761096e614f09565b611b22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f6164643a207265776172646572206d75737420626520636f6e7472616374000060448201526064016107fe565b600101611a9f565b50611b3361360e565b5f6007544211611b4557600754611b47565b425b90508660065f828254611b5a9190614f76565b9250508190555060046040518061010001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018381526020015f81526020018761ffff1681526020018681526020015f81526020018585808060200260200160405190810160405280939291908181526020018383602002808284375f920182905250939094525050835460018082018655948252602091829020845160089092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911781558382015194810194909455604083015160028501556060830151600385015560808301516004850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff90921691909117905560a0830151600585015560c0830151600685015560e08301518051939493611ccd935060078501929190910190614abb565b5050508282604051611ce0929190614f89565b60405190819003902060045473ffffffffffffffffffffffffffffffffffffffff881690611d1090600190614f63565b604080518b815261ffff8a1660208201529081018890527f5ed295c4f5af5aeb1ccd905e1cd55a86ab3bb9fc1fe2346ff64ac47dbef366619060600160405180910390a450505050505050565b611d6561362b565b60045486908110611dd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f60048881548110611de657611de6614f09565b5f918252602090912060089091020180546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018a90526064810189905260ff8816608482015260a4810187905260c4810186905291925073ffffffffffffffffffffffffffffffffffffffff1690819063d505accf9060e4015f604051808303815f87803b158015611e8a575f5ffd5b505af1158015611e9c573d5f5f3e3d5ffd5b50505050611eaa898961409c565b505050611eb660018055565b505050505050565b611ec661362b565b611ecf8161369e565b611ed860018055565b50565b611ee361362b565b5f60048281548110611ef757611ef7614f09565b5f9182526020808320858452600582526040808520338652909252922080546008929092029092016006810154909350811115611fb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f656d657267656e63792077697468647261773a20706f6f6c20746f74616c206e60448201527f6f7420656e6f756768000000000000000000000000000000000000000000000060648201526084016107fe565b5f808355600183018190556002830181905560038301819055600684018054839290611fe3908490614f63565b909155505f90505b60078401548110156120a95783600701818154811061200c5761200c614f09565b5f9182526020822001546040517f2eef144700000000000000000000000000000000000000000000000000000000815260048101889052336024820152604481019290925273ffffffffffffffffffffffffffffffffffffffff1690632eef1447906064015f604051808303815f87803b158015612088575f5ffd5b505af115801561209a573d5f5f3e3d5ffd5b50505050806001019050611feb565b50600254835473ffffffffffffffffffffffffffffffffffffffff9182169116036120e5578060095f8282546120df9190614f63565b90915550505b82546121089073ffffffffffffffffffffffffffffffffffffffff163383613d2e565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a3505050611ed860018055565b61215361362b565b61215b61360e565b61216460018055565b565b5f6004828154811061217a5761217a614f09565b905f5260205f209060080201600601549050919050565b600b5473ffffffffffffffffffffffffffffffffffffffff16331461225e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f73657420747265617375727920616464726573733a206f6e6c7920707265766960448201527f6f757320747265617375727920616464726573732063616e2063616c6c20746860648201527f6973206d6574686f640000000000000000000000000000000000000000000000608482015260a4016107fe565b73ffffffffffffffffffffffffffffffffffffffff8116612301576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f73657420747265617375727920616464726573733a20696e76616c6964206e6560448201527f772074726561737572792061646472657373000000000000000000000000000060648201526084016107fe565b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f61885cdba916be748ff3e3f6f15e4206153b8ea3b7acabade9d04b4063a83510905f90a350565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461243e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f736574207465616d20616464726573733a206f6e6c792070726576696f75732060448201527f7465616d20616464726573732063616e2063616c6c2074686973206d6574686f60648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a4016107fe565b73ffffffffffffffffffffffffffffffffffffffff81166124e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f736574207465616d20616464726573733a20696e76616c6964206e657720746560448201527f616d20616464726573730000000000000000000000000000000000000000000060648201526084016107fe565b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f42fbc17d847fdc3e5c82da842a5ef3979c64f3b94cd4e7382310fd5525c6ee0f905f90a350565b61255961358e565b6121645f6144d4565b61256a61358e565b6101f48111156125fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f73657420696e766573746f722070657263656e743a20696e76616c696420706560448201527f7263656e742076616c756500000000000000000000000000000000000000000060648201526084016107fe565b6101f4600e5482600d546126109190614f76565b61261a9190614f76565b11156126a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f73657420696e766573746f722070657263656e743a20746f74616c207065726360448201527f656e74206f766572206d6178000000000000000000000000000000000000000060648201526084016107fe565b600f5460408051918252602082018390527f905b464403a98b455243c8b4d30c545b8fbd70cda670142b9326425b2c039f3b910160405180910390a1600f55565b6126f161358e565b6101f4811115612783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f7365742074726561737572792070657263656e743a20696e76616c696420706560448201527f7263656e742076616c756500000000000000000000000000000000000000000060648201526084016107fe565b6101f4600f5482600d546127979190614f76565b6127a19190614f76565b111561282f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f7365742074726561737572792070657263656e743a20746f74616c207065726360448201527f656e74206f766572206d6178000000000000000000000000000000000000000060648201526084016107fe565b600e5460408051918252602082018390527fa565895c0101fca10e6a7b85742e56cf52ac5f58b09ce030425d3555b47069fd910160405180910390a1600e55565b61287861358e565b6101f481111561290a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f736574207465616d2070657263656e743a20696e76616c69642070657263656e60448201527f742076616c75650000000000000000000000000000000000000000000000000060648201526084016107fe565b6101f4600f5482600e5461291e9190614f76565b6129289190614f76565b11156129b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f736574207465616d2070657263656e743a20746f74616c2070657263656e742060448201527f6f766572206d617800000000000000000000000000000000000000000000000060648201526084016107fe565b600d5460408051918252602082018390527f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6910160405180910390a1600d55565b6129ff61358e565b6007544210612a90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f7374617274206661726d696e673a206661726d207374617274656420616c726560448201527f616479000000000000000000000000000000000000000000000000000000000060648201526084016107fe565b6004545f5b81811015612ace575f60048281548110612ab157612ab1614f09565b5f9182526020909120426008909202016002015550600101612a95565b505042600755565b612ade61362b565b601e811115612b49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f68617276657374206d616e793a20746f6f206d616e7920706f6f6c206964730060448201526064016107fe565b5f5b81811015612b7d57612b75838383818110612b6857612b68614f09565b905060200201355f61409c565b600101612b4b565b5061119460018055565b612b8f61362b565b612b99828261409c565b61119460018055565b612baa61358e565b612bb261360e565b3373ffffffffffffffffffffffffffffffffffffffff167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef360048481548110612bfd57612bfd614f09565b905f5260205f2090600802016001015483604051612c25929190918252602082015260400190565b60405180910390a28060048381548110612c4157612c41614f09565b905f5260205f20906008020160010154600654612c5e9190614f63565b612c689190614f76565b6006819055508060048381548110612c8257612c82614f09565b905f5260205f209060080201600101819055505050565b60045460609082908110612d09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f60048481548110612d1d57612d1d614f09565b905f5260205f2090600802019050806007018054905067ffffffffffffffff811115612d4b57612d4b615026565b604051908082528060200260200182016040528015612d74578160200160208202803683370190505b5092505f5b6007820154811015612e0157816007018181548110612d9a57612d9a614f09565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848281518110612dd457612dd4614f09565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600101612d79565b505050919050565b612e1161358e565b73ffffffffffffffffffffffffffffffffffffffff8116612eb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107fe565b611ed8816144d4565b606080606080856004805490508110612f32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f60048881548110612f4657612f46614f09565b5f91825260208083208b845260058252604080852073ffffffffffffffffffffffffffffffffffffffff8d1686529092529220600360089092029092019081015460068201546002830154929450909142118015612fa357508015155b15613075575f846002015442612fb99190614f63565b90505f6103e890505f600f54600e54600d5484612fd69190614f63565b612fe09190614f63565b612fea9190614f63565b90505f82600654838a60010154600354886130059190614fd7565b61300f9190614fd7565b6130199190614fd7565b6130239190614fee565b61302d9190614fee565b90508461305a7f000000000000000000000000000000000000000000000000000000e8d4a5100083614fd7565b6130649190614fee565b61306e9087614f76565b9550505050505b5f836002015484600101547f000000000000000000000000000000000000000000000000000000e8d4a5100085875f01546130b09190614fd7565b6130ba9190614fee565b6130c49190614f63565b6130ce9190614f76565b60078601549091506130e1906001614f76565b67ffffffffffffffff8111156130f9576130f9615026565b604051908082528060200260200182016040528015613122578160200160208202803683370190505b506007860154909a50613136906001614f76565b67ffffffffffffffff81111561314e5761314e615026565b60405190808252806020026020018201604052801561318157816020015b606081526020019060019003908161316c5790505b506007860154909950613195906001614f76565b67ffffffffffffffff8111156131ad576131ad615026565b6040519080825280602002602001820160405280156131d6578160200160208202803683370190505b5060078601549097506131ea906001614f76565b67ffffffffffffffff81111561320257613202615026565b60405190808252806020026020018201604052801561322b578160200160208202803683370190505b506002548b5191995073ffffffffffffffffffffffffffffffffffffffff16908b905f9061325b5761325b614f09565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201015260025461328b9116613e99565b895f8151811061329d5761329d614f09565b60209081029190910101526002546132ca9073ffffffffffffffffffffffffffffffffffffffff16613fad565b60ff16885f815181106132df576132df614f09565b60200260200101818152505080875f815181106132fe576132fe614f09565b60209081029190910101525f5b600786015481101561357e5785600701818154811061332c5761332c614f09565b5f9182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c1926004808401938290030181865afa15801561339d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133c19190615053565b8b6133cd836001614f76565b815181106133dd576133dd614f09565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061342f8660070182815481106115f6576115f6614f09565b8a61343b836001614f76565b8151811061344b5761344b614f09565b602002602001018190525061346e8660070182815481106116e5576116e5614f09565b60ff168961347d836001614f76565b8151811061348d5761348d614f09565b6020026020010181815250508560070181815481106134ae576134ae614f09565b5f918252602090912001546040517fffcd4263000000000000000000000000000000000000000000000000000000008152600481018f905273ffffffffffffffffffffffffffffffffffffffff8e811660248301529091169063ffcd426390604401602060405180830381865afa15801561352b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061354f919061506e565b8861355b836001614f76565b8151811061356b5761356b614f09565b602090810291909101015260010161330b565b5050505050505092959194509250565b5f5473ffffffffffffffffffffffffffffffffffffffff163314612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107fe565b5f5b600454811015611ed8576136238161369e565b600101613610565b600260015403613697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107fe565b6002600155565b6004548190811061370b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f6004838154811061371f5761371f614f09565b905f5260205f20906008020190508060020154421161373d57505050565b600681015480158061375157506001820154155b156137625750426002909101555050565b5f8260020154426137739190614f63565b90505f60065484600101546003548461378c9190614fd7565b6137969190614fd7565b6137a09190614fee565b90505f6103e890505f600f54600e54600d54846137bd9190614f63565b6137c79190614f63565b6137d19190614f63565b600254600a54600d5492935073ffffffffffffffffffffffffffffffffffffffff918216926340c10f199290911690859061380c9088614fd7565b6138169190614fee565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044015f604051808303815f87803b15801561387e575f5ffd5b505af1158015613890573d5f5f3e3d5ffd5b5050600254600b54600e5473ffffffffffffffffffffffffffffffffffffffff92831694506340c10f19935091169085906138cb9088614fd7565b6138d59190614fee565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044015f604051808303815f87803b15801561393d575f5ffd5b505af115801561394f573d5f5f3e3d5ffd5b5050600254600c54600f5473ffffffffffffffffffffffffffffffffffffffff92831694506340c10f199350911690859061398a9088614fd7565b6139949190614fee565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044015f604051808303815f87803b1580156139fc575f5ffd5b505af1158015613a0e573d5f5f3e3d5ffd5b505060025473ffffffffffffffffffffffffffffffffffffffff1691506340c10f1990503084613a3e8588614fd7565b613a489190614fee565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044015f604051808303815f87803b158015613ab0575f5ffd5b505af1158015613ac2573d5f5f3e3d5ffd5b505050600687015483915082613af87f000000000000000000000000000000000000000000000000000000e8d4a5100087614fd7565b613b029190614fd7565b613b0c9190614fee565b613b169190614fee565b866003015f828254613b289190614f76565b909155505042600287018190556003870154604080519283526020830188905282015288907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469060600160405180910390a25050505050505050565b5f60048281548110613b9857613b98614f09565b5f91825260208083208584526005825260408085203386529092529220600381015460089092029092019250158015613bd357506007544210155b15613bed576005820154613be79042614f76565b60038201555b5f81600101547f000000000000000000000000000000000000000000000000000000e8d4a510008460030154845f0154613c279190614fd7565b613c319190614fee565b613c3b9190614f63565b9050613c478433610b79565b15613cba575f811180613c5d57505f8260020154115b15613cb5575f826002015482613c739190614f76565b9050826002015460085f828254613c8a9190614f63565b90915550505f60028401556005840154613ca49042614f76565b6003840155613cb33382614548565b505b613d28565b8015613d28578060085f828254613cd19190614f76565b9250508190555080826002015f828254613ceb9190614f76565b9091555050604051818152849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c19060200160405180910390a35b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f92839290871691613dc49190615085565b5f604051808303815f865af19150503d805f8114613dfd576040519150601f19603f3d011682016040523d82523d5f602084013e613e02565b606091505b5091509150818015613e2c575080511580613e2c575080806020019051810190613e2c919061509b565b613e92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c65640000000060448201526064016107fe565b5050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff861691613f1a9190615085565b5f60405180830381855afa9150503d805f8114613f52576040519150601f19603f3d011682016040523d82523d5f602084013e613f57565b606091505b509150915081613f9c576040518060400160405280600381526020017f3f3f3f0000000000000000000000000000000000000000000000000000000000815250613fa5565b613fa5816146db565b949350505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169161402d9190615085565b5f60405180830381855afa9150503d805f8114614065576040519150601f19603f3d011682016040523d82523d5f602084013e61406a565b606091505b509150915081801561407d575080516020145b614088576012613fa5565b80806020019051810190613fa591906150ba565b60045482908110614109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f742065786973740000000000000000000000000060448201526064016107fe565b5f6004848154811061411d5761411d614f09565b5f918252602080832087845260058252604080852033865290925292206008909102909101915061414d8561369e565b61415685613b84565b83156143705781546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156141c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141eb919061506e565b83549091506142129073ffffffffffffffffffffffffffffffffffffffff163330886148c9565b82546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561427d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142a1919061506e565b90506142ad8282614f63565b600485015490965061ffff161561431b5760048401545f90612710906142d79061ffff1689614fd7565b6142e19190614fee565b600b54865491925061430d9173ffffffffffffffffffffffffffffffffffffffff908116911683613d2e565b6143178188614f63565b9650505b85835f015f82825461432d9190614f76565b9091555050600254845473ffffffffffffffffffffffffffffffffffffffff91821691160361436d578560095f8282546143679190614f76565b90915550505b50505b600382015481547f000000000000000000000000000000000000000000000000000000e8d4a51000916143a291614fd7565b6143ac9190614fee565b60018201555f5b6007830154811015614476578260070181815481106143d4576143d4614f09565b5f9182526020909120015482546040517f2eef144700000000000000000000000000000000000000000000000000000000815260048101899052336024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff90911690632eef1447906064015f604051808303815f87803b158015614455575f5ffd5b505af1158015614467573d5f5f3e3d5ffd5b505050508060010190506143b3565b5083156144965783826006015f8282546144909190614f76565b90915550505b604051848152859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a35050505050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6009546002546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156145b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145db919061506e565b1115611194576009546002546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f929173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015614651573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614675919061506e565b61467f9190614f63565b90508082106146b1576002546146ac9073ffffffffffffffffffffffffffffffffffffffff168483613d2e565b505050565b81156146ac576002546146ac9073ffffffffffffffffffffffffffffffffffffffff168484613d2e565b6060604082511061470057818060200190518101906146fa91906150d5565b92915050565b815160200361488b575f5b60208160ff161080156147585750828160ff168151811061472e5761472e614f09565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1561476f5780614767816151c5565b91505061470b565b5f8160ff1667ffffffffffffffff81111561478c5761478c615026565b6040519080825280601f01601f1916602001820160405280156147b6576020820181803683370190505b5090505f91505b60208260ff1610801561480a5750838260ff16815181106147e0576147e0614f09565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1561488457838260ff168151811061482457614824614f09565b602001015160f81c60f81b818360ff168151811061484457614844614f09565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508161487c816151c5565b9250506147bd565b9392505050565b505060408051808201909152600381527f3f3f3f0000000000000000000000000000000000000000000000000000000000602082015290565b919050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291515f928392908816916149679190615085565b5f604051808303815f865af19150503d805f81146149a0576040519150601f19603f3d011682016040523d82523d5f602084013e6149a5565b606091505b50915091508180156149cf5750805115806149cf5750808060200190518101906149cf919061509b565b611eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c656460448201526064016107fe565b828054828255905f5260205f20908101928215614aab579160200282015b82811115614aab5781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190614a53565b50614ab7929150614b33565b5090565b828054828255905f5260205f20908101928215614aab579160200282015b82811115614aab57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614ad9565b5b80821115614ab7575f8155600101614b34565b5f60208284031215614b57575f5ffd5b5035919050565b803561ffff811681146148c4575f5ffd5b5f5f83601f840112614b7f575f5ffd5b50813567ffffffffffffffff811115614b96575f5ffd5b6020830191508360208260051b8501011115614bb0575f5ffd5b9250929050565b5f5f5f5f5f5f60a08789031215614bcc575f5ffd5b8635955060208701359450614be360408801614b5e565b935060608701359250608087013567ffffffffffffffff811115614c05575f5ffd5b614c1189828a01614b6f565b979a9699509497509295939492505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611ed8575f5ffd5b5f5f60408385031215614c55575f5ffd5b823591506020830135614c6781614c23565b809150509250929050565b5f60208284031215614c82575f5ffd5b813561488481614c23565b5f5f60408385031215614c9e575f5ffd5b50508035926020909101359150565b5f8151808452602084019350602083015f5b82811015614cf357815173ffffffffffffffffffffffffffffffffffffffff16865260209586019590910190600101614cbf565b5093949350505050565b5f8151808452602084019350602083015f5b82811015614cf3578151865260209586019590910190600101614d0f565b608081525f614d3f6080830187614cad565b828103602084015280865180835260208301915060208160051b840101602089015f5b83811015614df0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552815180518085528060208301602087015e5f6020828701015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011686010194505050602082019150602085019450600181019050614d62565b50508581036040870152614e048189614cfd565b93505050508281036060840152614e1b8185614cfd565b979650505050505050565b5f5f5f5f5f5f60a08789031215614e3b575f5ffd5b863595506020870135614e4d81614c23565b9450614be360408801614b5e565b60ff81168114611ed8575f5ffd5b5f5f5f5f5f5f60c08789031215614e7e575f5ffd5b8635955060208701359450604087013593506060870135614e9e81614e5b565b9598949750929560808101359460a0909101359350915050565b5f5f60208385031215614ec9575f5ffd5b823567ffffffffffffffff811115614edf575f5ffd5b614eeb85828601614b6f565b90969095509350505050565b602081525f6148846020830184614cad565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156146fa576146fa614f36565b808201808211156146fa576146fa614f36565b5f8184825b85811015614fcc578135614fa181614c23565b73ffffffffffffffffffffffffffffffffffffffff1683526020928301929190910190600101614f8e565b509095945050505050565b80820281158282048414176146fa576146fa614f36565b5f82615021577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215615063575f5ffd5b815161488481614c23565b5f6020828403121561507e575f5ffd5b5051919050565b5f82518060208501845e5f920191825250919050565b5f602082840312156150ab575f5ffd5b81518015158114614884575f5ffd5b5f602082840312156150ca575f5ffd5b815161488481614e5b565b5f602082840312156150e5575f5ffd5b815167ffffffffffffffff8111156150fb575f5ffd5b8201601f8101841361510b575f5ffd5b805167ffffffffffffffff81111561512557615125615026565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561519157615191615026565b6040528181528282016020018610156151a8575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60ff821660ff81036151da576151da614f36565b6001019291505056fea26469706673582212209bc60f2037c62aab4ba13d7475102e2166cadc72b2663725c746c5cac9a42f4b64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ba56b07d7d730212a1f0e5eb6684a02760f7e1e700000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000949cc36ead9167ee373ce971bc3d3e5800a809f5000000000000000000000000949cc36ead9167ee373ce971bc3d3e5800a809f5000000000000000000000000949cc36ead9167ee373ce971bc3d3e5800a809f5000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _librex (address): 0xBa56b07d7D730212A1f0E5eb6684a02760F7e1e7
Arg [1] : _librexPerSec (uint256): 1000000000000000
Arg [2] : _teamAddress (address): 0x949CC36EAD9167EE373Ce971Bc3D3E5800a809F5
Arg [3] : _treasuryAddress (address): 0x949CC36EAD9167EE373Ce971Bc3D3E5800a809F5
Arg [4] : _investorAddress (address): 0x949CC36EAD9167EE373Ce971Bc3D3E5800a809F5
Arg [5] : _teamPercent (uint256): 100
Arg [6] : _treasuryPercent (uint256): 100
Arg [7] : _investorPercent (uint256): 0
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000ba56b07d7d730212a1f0e5eb6684a02760f7e1e7
Arg [1] : 00000000000000000000000000000000000000000000000000038d7ea4c68000
Arg [2] : 000000000000000000000000949cc36ead9167ee373ce971bc3d3e5800a809f5
Arg [3] : 000000000000000000000000949cc36ead9167ee373ce971bc3d3e5800a809f5
Arg [4] : 000000000000000000000000949cc36ead9167ee373ce971bc3d3e5800a809f5
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
21811:28403:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24162:30;;;;;;;;;160:25:1;;;148:2;133:18;24162:30:0;;;;;;;;24263;;;;;;28185:95;28257:8;:15;28185:95;;46008:224;;;;;;:::i;:::-;;:::i;:::-;;23971:30;;;;;;;;;;;;603:42:1;591:55;;;573:74;;561:2;546:18;23971:30:0;427:226:1;23265:26:0;;;;;;:::i;:::-;;:::i;:::-;;;;1021:42:1;1009:55;;;991:74;;1096:2;1081:18;;1074:34;;;;1124:18;;;1117:34;;;;1182:2;1167:18;;1160:34;;;;1243:6;1231:19;1225:3;1210:19;;1203:48;1282:3;1267:19;;1260:35;1326:3;1311:19;;1304:35;978:3;963:19;23265:26:0;658:687:1;23510:34:0;;;;;;23845:26;;;;;;;;;30432:1410;;;;;;:::i;:::-;;:::i;36865:326::-;;;;;;:::i;:::-;;:::i;:::-;;;3512:14:1;;3505:22;3487:41;;3475:2;3460:18;36865:326:0;3347:187:1;49234:474:0;;;;;;:::i;:::-;;:::i;41504:1418::-;;;;;;:::i;:::-;;:::i;34475:1773::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;23672:35::-;;;;;;28493:1825;;;;;;:::i;:::-;;:::i;39213:443::-;;;;;;:::i;:::-;;:::i;37638:92::-;;;;;;:::i;:::-;;:::i;42993:1018::-;;;;;;:::i;:::-;;:::i;37274:86::-;;;:::i;46701:113::-;;;;;;:::i;:::-;;:::i;48179:482::-;;;;;;:::i;:::-;;:::i;47216:434::-;;;;;;:::i;:::-;;:::i;2662:103::-;;;:::i;23177:53::-;;23227:3;23177:53;;;;;8826:6:1;8814:19;;;8796:38;;8784:2;8769:18;23177:53:0;8652:188:1;49716:495:0;;;;;;:::i;:::-;;:::i;48669:::-;;;;;;:::i;:::-;;:::i;2021:87::-;2067:7;2094:6;;;2021:87;;23349:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9076:25:1;;;9132:2;9117:18;;9110:34;;;;9160:18;;;9153:34;9218:2;9203:18;;9196:34;9063:3;9048:19;23349:64:0;8845:391:1;47658:455:0;;;;;;:::i;:::-;;:::i;27736:441::-;;;:::i;23906:30::-;;;;;;;;;22999:27;;;;;;46885:265;;;;;;:::i;:::-;;:::i;23777:37::-;;;;;;22923:26;;;;;;;;;23073:58;;23124:7;23073:58;;24065:26;;;;;;39710:110;;;;;;:::i;:::-;;:::i;23602:29::-;;;;;;46240:453;;;;;;:::i;:::-;;:::i;36306:494::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2920:201::-;;;;;;:::i;:::-;;:::i;31908:2500::-;;;;;;:::i;:::-;;:::i;46008:224::-;1907:13;:11;:13::i;:::-;46087:18:::1;:16;:18::i;:::-;46155:12;::::0;46123:60:::1;::::0;;10392:25:1;;;10448:2;10433:18;;10426:34;;;46143:10:0::1;::::0;46123:60:::1;::::0;10365:18:1;46123:60:0::1;;;;;;;46196:12;:28:::0;46008:224::o;23265:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23265:26:0;;;;;;;;;;;:::o;30432:1410::-;1907:13;:11;:13::i;:::-;24459:8:::1;:15:::0;30655:4;;24452:22;::::1;24444:54;;;::::0;::::1;::::0;;10673:2:1;24444:54:0::1;::::0;::::1;10655:21:1::0;10712:2;10692:18;;;10685:30;10751:21;10731:18;;;10724:49;10790:18;;24444:54:0::1;;;;;;;;;30701:2:::2;30680:23:::0;::::2;;30672:59;;;::::0;::::2;::::0;;11021:2:1;30672:59:0::2;::::0;::::2;11003:21:1::0;11060:2;11040:18;;;11033:30;11099:25;11079:18;;;11072:53;11142:18;;30672:59:0::2;10819:347:1::0;30672:59:0::2;23227:3;30766:41;::::0;::::2;;;30744:116;;;::::0;::::2;::::0;;11373:2:1;30744:116:0::2;::::0;::::2;11355:21:1::0;11412:2;11392:18;;;11385:30;11451:27;11431:18;;;11424:55;11496:18;;30744:116:0::2;11171:349:1::0;30744:116:0::2;23124:7;30893:16;:44;;30871:123;;;::::0;::::2;::::0;;11727:2:1;30871:123:0::2;::::0;::::2;11709:21:1::0;11766:2;11746:18;;;11739:30;11805:31;11785:18;;;11778:59;11854:18;;30871:123:0::2;11525:353:1::0;30871:123:0::2;31026:18;31007:295;31063:30:::0;;::::2;31007:295;;;31173:51;31200:10;;31211;31200:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8317:19:::0;;;:23;;;8022:326;31173:51:::2;31147:143;;;::::0;::::2;::::0;;12550:2:1;31147:143:0::2;::::0;::::2;12532:21:1::0;12589:2;12569:18;;;12562:30;12628:32;12608:18;;;12601:60;12678:18;;31147:143:0::2;12348:354:1::0;31147:143:0::2;31108:12;;31007:295;;;;31314:18;:16;:18::i;:::-;31448:11;31407:8;31416:4;31407:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;31376:15;;:56;;;;:::i;:::-;:83;;;;:::i;:::-;31345:15;:114;;;;31500:11;31472:8;31481:4;31472:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;31552:13;31522:8;31531:4;31522:14;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;31609:16;31576:8;31585:4;31576:14;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;:49;;;;31663:10;;31636:8;31645:4;31636:14;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;:37;;;;;;;:::i;:::-;;31813:10;;31691:143;;;;;;;:::i;:::-;;::::0;;;;;::::2;::::0;;14008:25:1;;;14081:6;14069:19;;14064:2;14049:18;;14042:47;14105:18;;;14098:34;;;31691:143:0;31709:4;;31691:143:::2;::::0;13996:2:1;13981:18;31691:143:0::2;;;;;;;1931:1:::1;30432:1410:::0;;;;;;:::o;36865:326::-;24459:8;:15;36995:4;;36971;;24452:22;;24444:54;;;;;;;10673:2:1;24444:54:0;;;10655:21:1;10712:2;10692:18;;;10685:30;10751:21;10731:18;;;10724:49;10790:18;;24444:54:0;10471:343:1;24444:54:0;37017:21:::1;37041:14:::0;;;:8:::1;:14;::::0;;;;;;;:21:::1;::::0;::::1;::::0;;;;;;;37112:14:::1;::::0;37093:15:::1;:33;::::0;::::1;::::0;:90:::1;;;37162:4;:21;;;37143:15;:40;;37093:90;37073:110:::0;36865:326;-1:-1:-1;;;;;36865:326:0:o;49234:474::-;49342:15;;;;49328:10;:29;49306:144;;;;;;;14345:2:1;49306:144:0;;;14327:21:1;14384:2;14364:18;;;14357:30;14423:34;14403:18;;;14396:62;14494:34;14474:18;;;14467:62;14566:3;14545:19;;;14538:32;14587:19;;49306:144:0;14143:469:1;49306:144:0;49483:30;;;49461:130;;;;;;;14819:2:1;49461:130:0;;;14801:21:1;14858:2;14838:18;;;14831:30;14897:34;14877:18;;;14870:62;14968:20;14948:18;;;14941:48;15006:19;;49461:130:0;14617:414:1;49461:130:0;49602:15;:34;;;;;;;;;;;;;49652:48;;49671:10;;49652:48;;-1:-1:-1;;49652:48:0;49234:474;:::o;41504:1418::-;5732:21;:19;:21::i;:::-;24459:8:::1;:15:::0;41618:4;;24452:22;::::1;24444:54;;;::::0;::::1;::::0;;10673:2:1;24444:54:0::1;::::0;::::1;10655:21:1::0;10712:2;10692:18;;;10685:30;10751:21;10731:18;;;10724:49;10790:18;;24444:54:0::1;10471:343:1::0;24444:54:0::1;41640:21:::2;41664:8;41673:4;41664:14;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;41713;;;:8:::2;:14:::0;;;;;;41728:10:::2;41713:26:::0;;;;;;;41833:11;;41664:14:::2;::::0;;::::2;::::0;;::::2;::::0;-1:-1:-1;41833:22:0;-1:-1:-1;41833:22:0::2;41825:67;;;::::0;::::2;::::0;;15238:2:1;41825:67:0::2;::::0;::::2;15220:21:1::0;;;15257:18;;;15250:30;15316:34;15296:18;;;15289:62;15368:18;;41825:67:0::2;15036:356:1::0;41825:67:0::2;41981:7;41965:4;:12;;;:23;;41957:67;;;::::0;::::2;::::0;;15599:2:1;41957:67:0::2;::::0;::::2;15581:21:1::0;15638:2;15618:18;;;15611:30;15677:33;15657:18;;;15650:61;15728:18;;41957:67:0::2;15397:355:1::0;41957:67:0::2;42037:17;42049:4;42037:11;:17::i;:::-;42067:30;42092:4;42067:24;:30::i;:::-;42114:11:::0;;42110:251:::2;;42157:7;42142:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42216:6:0::2;::::0;42191:12;;42216:6:::2;::::0;;::::2;42191:12:::0;::::2;42183:40:::0;42179:110:::2;;42266:7;42244:18;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42179:110:0::2;42303:12:::0;;:46:::2;::::0;:12:::2;;42329:10;42341:7:::0;42303:25:::2;:46::i;:::-;42419:22;::::0;::::2;::::0;42405:11;;42458:19:::2;::::0;42405:36:::2;::::0;::::2;:::i;:::-;42404:73;;;;:::i;:::-;42373:15;::::0;::::2;:104:::0;42509:18:::2;42490:293;42559:14;::::0;::::2;:21:::0;42546:34;::::2;42490:293;;;42634:4;:14;;42649:10;42634:26;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;42745:11;;42634:137:::2;::::0;;;;::::2;::::0;::::2;16411:25:1::0;;;42716:10:0::2;16452:18:1::0;;;16445:83;16544:18;;;16537:34;;;;42634:26:0::2;::::0;;::::2;::::0;:40:::2;::::0;16384:18:1;;42634:137:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42595:12;;;;;42490:293;;;-1:-1:-1::0;42799:11:0;;42795:67:::2;;42843:7;42827:4;:12;;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42795:67:0::2;42879:35;::::0;160:25:1;;;42900:4:0;;42888:10:::2;::::0;42879:35:::2;::::0;148:2:1;133:18;42879:35:0::2;;;;;;;41629:1293;;5764:1:::1;5776:20:::0;5170:1;6296:22;;6113:213;5776:20;41504:1418;;:::o;34475:1773::-;34613:26;34654:23;34692:25;34732:30;34575:4;24459:8;:15;;;;24452:4;:22;24444:54;;;;;;;10673:2:1;24444:54:0;;;10655:21:1;10712:2;10692:18;;;10685:30;10751:21;10731:18;;;10724:49;10790:18;;24444:54:0;10471:343:1;24444:54:0;34790:21:::1;34814:8;34823:4;34814:14;;;;;;;;:::i;:::-;;;;;;;;;;;34790:38;;34867:4;:14;;:21;;;;34891:1;34867:25;;;;:::i;:::-;34853:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;34853:40:0::1;-1:-1:-1::0;34927:14:0::1;::::0;::::1;:21:::0;34841:52;;-1:-1:-1;34927:25:0::1;::::0;34951:1:::1;34927:25;:::i;:::-;34914:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;34989:14:0::1;::::0;::::1;:21:::0;34904:49;;-1:-1:-1;34989:25:0::1;::::0;35013:1:::1;34989:25;:::i;:::-;34975:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;34975:40:0::1;-1:-1:-1::0;35056:14:0::1;::::0;::::1;:21:::0;34964:51;;-1:-1:-1;35056:25:0::1;::::0;35080:1:::1;35056:25;:::i;:::-;35042:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;35042:40:0::1;-1:-1:-1::0;35118:6:0::1;::::0;35095:12;;35026:56;;-1:-1:-1;35118:6:0::1;;::::0;35095:9;;35118:6:::1;::::0;35095:12:::1;;;;:::i;:::-;:30;::::0;;::::1;:12;::::0;;::::1;::::0;;;;;:30;35162:6:::1;::::0;35149:33:::1;::::0;35162:6:::1;35149:31;:33::i;:::-;35136:7;35144:1;35136:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:46;35220:6:::1;::::0;35207:35:::1;::::0;35220:6:::1;;35207:33;:35::i;:::-;35193:49;;:8;35202:1;35193:11;;;;;;;;:::i;:::-;;;;;;:49;;;::::0;::::1;35255:13;35271:4;35255:20;;35286:17;35385:15;;35354;;35327:11;;35306:5;:32;;;;:::i;:::-;:63;;;;:::i;:::-;:94;;;;:::i;:::-;35286:114;;35536:5;35505:15;;35479:9;35464:12;;35446:4;:15;;;:30;;;;:::i;:::-;:42;;;;:::i;:::-;35445:75;;;;:::i;:::-;:96;;;;:::i;:::-;35413:13;35427:1;35413:16;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:128;35573:18:::1;35554:687;35623:14;::::0;::::1;:21:::0;35610:34;::::1;35554:687;;;35752:4;:14;;35767:10;35752:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;;;;;;:26:::1;::::0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35698:9:::0;35708:14:::1;:10:::0;35721:1:::1;35708:14;:::i;:::-;35698:25;;;;;;;;:::i;:::-;;;;;;:109;;;;;;;;;::::0;::::1;35850:99;35881:4;:14;;35896:10;35881:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;;;;;;:26:::1;::::0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35850:97;;;:99::i;:::-;35824:7:::0;35832:14:::1;:10:::0;35845:1:::1;35832:14;:::i;:::-;35824:23;;;;;;;;:::i;:::-;;;;;;:125;;;;35993:101;36024:4;:14;;36039:10;36024:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;;;;;;:26:::1;::::0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35993:99;;;:101::i;:::-;35966:128;;:8:::0;35975:14:::1;:10:::0;35988:1:::1;35975:14;:::i;:::-;35966:24;;;;;;;;:::i;:::-;;;;;;:128;;;::::0;::::1;36143:4;:32;;36176:10;36143:44;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;:86:::1;::::0;;;;::::1;::::0;::::1;160:25:1::0;;;36143:44:0::1;::::0;;::::1;::::0;:80:::1;::::0;133:18:1;;36143:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36111:13:::0;36125:14:::1;:10:::0;36138:1:::1;36125:14;:::i;:::-;36111:29;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:118;35659:12:::1;;35554:687;;;;34779:1469;;;34475:1773:::0;;;;;;:::o;28493:1825::-;1907:13;:11;:13::i;:::-;28747:2:::1;28726:23:::0;::::1;;28718:59;;;::::0;::::1;::::0;;17438:2:1;28718:59:0::1;::::0;::::1;17420:21:1::0;17477:2;17457:18;;;17450:30;17516:25;17496:18;;;17489:53;17559:18;;28718:59:0::1;17236:347:1::0;28718:59:0::1;23227:3;28810:41;::::0;::::1;;;28788:116;;;::::0;::::1;::::0;;17790:2:1;28788:116:0::1;::::0;::::1;17772:21:1::0;17829:2;17809:18;;;17802:30;17868:27;17848:18;;;17841:55;17913:18;;28788:116:0::1;17588:349:1::0;28788:116:0::1;23124:7;28937:16;:44;;28915:123;;;::::0;::::1;::::0;;18144:2:1;28915:123:0::1;::::0;::::1;18126:21:1::0;18183:2;18163:18;;;18156:30;18222:31;18202:18;;;18195:59;18271:18;;28915:123:0::1;17942:353:1::0;28915:123:0::1;8317:19:::0;;;;29049:125:::1;;;::::0;::::1;::::0;;18502:2:1;29049:125:0::1;::::0;::::1;18484:21:1::0;18541:2;18521:18;;;18514:30;18580:34;18560:18;;;18553:62;18651:8;18631:18;;;18624:36;18677:19;;29049:125:0::1;18300:402:1::0;29049:125:0::1;29206:18;29187:295;29243:30:::0;;::::1;29187:295;;;29353:51;29380:10;;29391;29380:22;;;;;;;:::i;29353:51::-;29327:143;;;::::0;::::1;::::0;;18909:2:1;29327:143:0::1;::::0;::::1;18891:21:1::0;18948:2;18928:18;;;18921:30;18987:32;18967:18;;;18960:60;19037:18;;29327:143:0::1;18707:354:1::0;29327:143:0::1;29288:12;;29187:295;;;;29494:18;:16;:18::i;:::-;29525:27;29573:14;;29555:15;:32;:93;;29634:14;;29555:93;;;29603:15;29555:93;29525:123;;29680:11;29661:15;;:30;;;;;;;:::i;:::-;;;;;;;;29704:8;29732:368;;;;;;;;29769:8;29732:368;;;;;;29808:11;29732:368;;;;29859:19;29732:368;;;;29916:1;29732:368;;;;29950:13;29732:368;;;;;;29999:16;29732:368;;;;30043:1;29732:368;;;;30074:10;;29732:368;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;29732:368:0;;;;-1:-1:-1;;29704:407: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;::::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;::::0;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;29704:407:0::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;:::i;:::-;;;;30289:10;;30129:181;;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;30147:8:::1;:15:::0;30129:181:::1;::::0;::::1;::::0;30147:19:::1;::::0;30165:1:::1;::::0;30147:19:::1;:::i;:::-;30129:181;::::0;;14008:25:1;;;14081:6;14069:19;;14064:2;14049:18;;14042:47;14105:18;;;14098:34;;;30129:181:0::1;::::0;13996:2:1;13981:18;30129:181:0::1;;;;;;;28707:1611;28493:1825:::0;;;;;;:::o;39213:443::-;5732:21;:19;:21::i;:::-;24459:8:::1;:15:::0;39417:3;;24452:22;::::1;24444:54;;;::::0;::::1;::::0;;10673:2:1;24444:54:0::1;::::0;::::1;10655:21:1::0;10712:2;10692:18;;;10685:30;10751:21;10731:18;;;10724:49;10790:18;;24444:54:0::1;10471:343:1::0;24444:54:0::1;39433:21:::2;39457:8;39466:3;39457:13;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;39526:12:::0;;39551:65:::2;::::0;;;;39563:10:::2;39551:65;::::0;::::2;19377:74:1::0;39583:4:0::2;19467:18:1::0;;;19460:83;19559:18;;;19552:34;;;19602:18;;;19595:34;;;19678:4;19666:17;;19645:19;;;19638:46;19700:19;;;19693:35;;;19744:19;;;19737:35;;;39457:13:0;;-1:-1:-1;39526:12:0::2;;::::0;;;39551:11:::2;::::0;19349:19:1;;39551:65:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39627:21;39636:3;39641:6;39627:8;:21::i;:::-;39422:234;;5764:1:::1;5776:20:::0;5170:1;6296:22;;6113:213;5776:20;39213:443;;;;;;:::o;37638:92::-;5732:21;:19;:21::i;:::-;37705:17:::1;37717:4;37705:11;:17::i;:::-;5776:20:::0;5170:1;6296:22;;6113:213;5776:20;37638:92;:::o;42993:1018::-;5732:21;:19;:21::i;:::-;43065::::1;43089:8;43098:4;43089:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;43138;;;:8:::1;:14:::0;;;;;;43153:10:::1;43138:26:::0;;;;;;;43192:11;;43089:14:::1;::::0;;;::::1;::::0;;::::1;43290:12;::::0;::::1;::::0;43089:14;;-1:-1:-1;;;43290:22:0::1;43268:113;;;::::0;::::1;::::0;;19985:2:1;43268:113:0::1;::::0;::::1;19967:21:1::0;20024:2;20004:18;;;19997:30;20063:34;20043:18;;;20036:62;20134:11;20114:18;;;20107:39;20163:19;;43268:113:0::1;19783:405:1::0;43268:113:0::1;43408:1;43394:15:::0;;;43420::::1;::::0;::::1;:19:::0;;;43450::::1;::::0;::::1;:23:::0;;;43484:21:::1;::::0;::::1;:25:::0;;;43520:12:::1;::::0;::::1;:22:::0;;43536:6;;43408:1;43520:22:::1;::::0;43536:6;;43520:22:::1;:::i;:::-;::::0;;;-1:-1:-1;43574:18:0::1;::::0;-1:-1:-1;43555:217:0::1;43624:14;::::0;::::1;:21:::0;43611:34;::::1;43555:217;;;43699:4;:14;;43714:10;43699:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;:61:::1;::::0;;;;::::1;::::0;::::1;16411:25:1::0;;;43746:10:0::1;16452:18:1::0;;;16445:83;16544:18;;;16537:34;;;;43699:26:0::1;;::::0;:40:::1;::::0;16384:18:1;;43699:61:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43660:12;;;;;43555:217;;;-1:-1:-1::0;43821:6:0::1;::::0;43796:12;;43821:6:::1;::::0;;::::1;43796:12:::0;::::1;43788:40:::0;43784:101:::1;;43867:6;43845:18;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43784:101:0::1;43897:12:::0;;:45:::1;::::0;:12:::1;;43923:10;43935:6:::0;43897:25:::1;:45::i;:::-;43960:43;::::0;160:25:1;;;43990:4:0;;43978:10:::1;::::0;43960:43:::1;::::0;148:2:1;133:18;43960:43:0::1;;;;;;;43054:957;;;5776:20:::0;5170:1;6296:22;;6113:213;37274:86;5732:21;:19;:21::i;:::-;37334:18:::1;:16;:18::i;:::-;5776:20:::0;5170:1;6296:22;;6113:213;5776:20;37274:86::o;46701:113::-;46758:7;46785:8;46794:3;46785:13;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;;46778:28;;46701:113;;;:::o;48179:482::-;48287:15;;;;48273:10;:29;48251:152;;;;;;;20776:2:1;48251:152:0;;;20758:21:1;20815:2;20795:18;;;20788:30;20854:34;20834:18;;;20827:62;20925:34;20905:18;;;20898:62;20997:11;20976:19;;;20969:40;21026:19;;48251:152:0;20574:477:1;48251:152:0;48436:30;;;48414:130;;;;;;;21258:2:1;48414:130:0;;;21240:21:1;21297:2;21277:18;;;21270:30;21336:34;21316:18;;;21309:62;21407:20;21387:18;;;21380:48;21445:19;;48414:130:0;21056:414:1;48414:130:0;48555:15;:34;;;;;;;;;;;;;48605:48;;48624:10;;48605:48;;-1:-1:-1;;48605:48:0;48179:482;:::o;47216:434::-;47316:11;;;;47302:10;:25;47280:140;;;;;;;21677:2:1;47280:140:0;;;21659:21:1;21716:2;21696:18;;;21689:30;21755:34;21735:18;;;21728:62;21826:34;21806:18;;;21799:62;21898:3;21877:19;;;21870:32;21919:19;;47280:140:0;21475:469:1;47280:140:0;47453:26;;;47431:118;;;;;;;22151:2:1;47431:118:0;;;22133:21:1;22190:2;22170:18;;;22163:30;22229:34;22209:18;;;22202:62;22300:12;22280:18;;;22273:40;22330:19;;47431:118:0;21949:406:1;47431:118:0;47560:11;:26;;;;;;;;;;;;;47602:40;;47617:10;;47602:40;;-1:-1:-1;;47602:40:0;47216:434;:::o;2662:103::-;1907:13;:11;:13::i;:::-;2727:30:::1;2754:1;2727:18;:30::i;49716:495::-:0;1907:13;:11;:13::i;:::-;49846:3:::1;49823:19;:26;;49801:119;;;::::0;::::1;::::0;;22562:2:1;49801:119:0::1;::::0;::::1;22544:21:1::0;22601:2;22581:18;;;22574:30;22640:34;22620:18;;;22613:62;22711:13;22691:18;;;22684:41;22742:19;;49801:119:0::1;22360:407:1::0;49801:119:0::1;50008:3;49989:15;;49967:19;49953:11;;:33;;;;:::i;:::-;:51;;;;:::i;:::-;:58;;49931:152;;;::::0;::::1;::::0;;22974:2:1;49931:152:0::1;::::0;::::1;22956:21:1::0;23013:2;22993:18;;;22986:30;23052:34;23032:18;;;23025:62;23123:14;23103:18;;;23096:42;23155:19;;49931:152:0::1;22772:408:1::0;49931:152:0::1;50118:15;::::0;50099:56:::1;::::0;;10392:25:1;;;10448:2;10433:18;;10426:34;;;50099:56:0::1;::::0;10365:18:1;50099:56:0::1;;;;;;;50166:15;:37:::0;49716:495::o;48669:::-;1907:13;:11;:13::i;:::-;48799:3:::1;48776:19;:26;;48754:119;;;::::0;::::1;::::0;;23387:2:1;48754:119:0::1;::::0;::::1;23369:21:1::0;23426:2;23406:18;;;23399:30;23465:34;23445:18;;;23438:62;23536:13;23516:18;;;23509:41;23567:19;;48754:119:0::1;23185:407:1::0;48754:119:0::1;48961:3;48942:15;;48920:19;48906:11;;:33;;;;:::i;:::-;:51;;;;:::i;:::-;:58;;48884:152;;;::::0;::::1;::::0;;23799:2:1;48884:152:0::1;::::0;::::1;23781:21:1::0;23838:2;23818:18;;;23811:30;23877:34;23857:18;;;23850:62;23948:14;23928:18;;;23921:42;23980:19;;48884:152:0::1;23597:408:1::0;48884:152:0::1;49071:15;::::0;49052:56:::1;::::0;;10392:25:1;;;10448:2;10433:18;;10426:34;;;49052:56:0::1;::::0;10365:18:1;49052:56:0::1;;;;;;;49119:15;:37:::0;48669:495::o;47658:455::-;1907:13;:11;:13::i;:::-;47776:3:::1;47757:15;:22;;47735:111;;;::::0;::::1;::::0;;24212:2:1;47735:111:0::1;::::0;::::1;24194:21:1::0;24251:2;24231:18;;;24224:30;24290:34;24270:18;;;24263:62;24361:9;24341:18;;;24334:37;24388:19;;47735:111:0::1;24010:403:1::0;47735:111:0::1;47934:3;47915:15;;47897;47879;;:33;;;;:::i;:::-;:51;;;;:::i;:::-;:58;;47857:148;;;::::0;::::1;::::0;;24620:2:1;47857:148:0::1;::::0;::::1;24602:21:1::0;24659:2;24639:18;;;24632:30;24698:34;24678:18;;;24671:62;24769:10;24749:18;;;24742:38;24797:19;;47857:148:0::1;24418:404:1::0;47857:148:0::1;48036:11;::::0;48021:44:::1;::::0;;10392:25:1;;;10448:2;10433:18;;10426:34;;;48021:44:0::1;::::0;10365:18:1;48021:44:0::1;;;;;;;48076:11;:29:::0;47658:455::o;27736:441::-;1907:13;:11;:13::i;:::-;27828:14:::1;;27810:15;:32;27788:117;;;::::0;::::1;::::0;;25029:2:1;27788:117:0::1;::::0;::::1;25011:21:1::0;25068:2;25048:18;;;25041:30;25107:34;25087:18;;;25080:62;25178:5;25158:18;;;25151:33;25201:19;;27788:117:0::1;24827:399:1::0;27788:117:0::1;27935:8;:15:::0;27918:14:::1;27961:164;27989:6;27983:3;:12;27961:164;;;28019:21;28043:8;28052:3;28043:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;28098:15:::1;28043:13;::::0;;::::1;;28071:24;;:42:::0;-1:-1:-1;27997:5:0::1;;27961:164;;;-1:-1:-1::0;;28154:15:0::1;28137:14;:32:::0;27736:441::o;46885:265::-;5732:21;:19;:21::i;:::-;46987:2:::1;46971:18:::0;::::1;;46963:62;;;::::0;::::1;::::0;;25433:2:1;46963:62:0::1;::::0;::::1;25415:21:1::0;25472:2;25452:18;;;25445:30;25511:33;25491:18;;;25484:61;25562:18;;46963:62:0::1;25231:355:1::0;46963:62:0::1;47041:13;47036:107;47060:20:::0;;::::1;47036:107;;;47106:25;47115:5;;47121;47115:12;;;;;;;:::i;:::-;;;;;;;47129:1;47106:8;:25::i;:::-;47082:7;;47036:107;;;;5776:20:::0;5170:1;6296:22;;6113:213;39710:110;5732:21;:19;:21::i;:::-;39789:23:::1;39798:4;39804:7;39789:8;:23::i;:::-;5776:20:::0;5170:1;6296:22;;6113:213;46240:453;1907:13;:11;:13::i;:::-;46352:18:::1;:16;:18::i;:::-;46421:10;46388:120;;;46446:8;46455:4;46446:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;46486:11;46388:120;;;;;;10392:25:1::0;;;10448:2;10433:18;;10426:34;10380:2;10365:18;;10218:248;46388:120:0::1;;;;;;;;46624:11;46583:8;46592:4;46583:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;46552:15;;:56;;;;:::i;:::-;:83;;;;:::i;:::-;46521:15;:114;;;;46674:11;46646:8;46655:4;46646:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;46240:453:::0;;:::o;36306:494::-;24459:8;:15;36426:26;;36402:4;;24452:22;;24444:54;;;;;;;10673:2:1;24444:54:0;;;10655:21:1;10712:2;10692:18;;;10685:30;10751:21;10731:18;;;10724:49;10790:18;;24444:54:0;10471:343:1;24444:54:0;36470:21:::1;36494:8;36503:4;36494:14;;;;;;;;:::i;:::-;;;;;;;;;;;36470:38;;36545:4;:14;;:21;;;;36531:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;36531:36:0::1;-1:-1:-1::0;36519:48:0;-1:-1:-1;36597:18:0::1;36578:215;36647:14;::::0;::::1;:21:::0;36634:34;::::1;36578:215;;;36754:4;:14;;36769:10;36754:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;36722:9;36732:10;36722:21;;;;;;;;:::i;:::-;:59;::::0;;::::1;:21;::::0;;::::1;::::0;;;;;;;:59;36683:12:::1;;36578:215;;;;36459:341;36306:494:::0;;;;:::o;2920:201::-;1907:13;:11;:13::i;:::-;3009:22:::1;::::0;::::1;3001:73;;;::::0;::::1;::::0;;25793:2:1;3001:73:0::1;::::0;::::1;25775:21:1::0;25832:2;25812:18;;;25805:30;25871:34;25851:18;;;25844:62;25942:8;25922:18;;;25915:36;25968:19;;3001:73:0::1;25591:402:1::0;3001:73:0::1;3085:28;3104:8;3085:18;:28::i;31908:2500::-:0;32057:26;32098:23;32136:25;32176:24;32019:4;24459:8;:15;;;;24452:4;:22;24444:54;;;;;;;10673:2:1;24444:54:0;;;10655:21:1;10712:2;10692:18;;;10685:30;10751:21;10731:18;;;10724:49;10790:18;;24444:54:0;10471:343:1;24444:54:0;32228:21:::1;32252:8;32261:4;32252:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;32301;;;:8:::1;:14:::0;;;;;;:21:::1;::::0;::::1;::::0;;;;;;;32361:22:::1;32252:14;::::0;;::::1;::::0;;::::1;32361:22:::0;;::::1;::::0;32413:12:::1;::::0;::::1;::::0;32460:24:::1;::::0;::::1;::::0;32252:14;;-1:-1:-1;32361:22:0;;32442:15:::1;:42;:59:::0;::::1;;;-1:-1:-1::0;32488:13:0;;::::1;32442:59;32438:660;;;32518:18;32557:4;:24;;;32539:15;:42;;;;:::i;:::-;32518:63;;32596:13;32612:4;32596:20;;32631:17;32742:15;;32707;;32676:11;;32651:5;:36;;;;:::i;:::-;:71;;;;:::i;:::-;:106;;;;:::i;:::-;32631:126;;32774:20;32960:5;32925:15;;32895:9;32860:4;:15;;;32828:12;;32798:10;:42;;;;:::i;:::-;:77;;;;:::i;:::-;:106;;;;:::i;:::-;32797:143;;;;:::i;:::-;:168;;;;:::i;:::-;32774:191:::0;-1:-1:-1;33062:8:0;33024:34:::1;33039:19;32774:191:::0;33024:34:::1;:::i;:::-;33023:47;;;;:::i;:::-;32982:104;::::0;;::::1;:::i;:::-;;;32503:595;;;;32438:660;33110:21;33227:4;:19;;;33208:4;:15;;;33185:19;33151:17;33137:4;:11;;;:31;;;;:::i;:::-;33136:68;;;;:::i;:::-;33135:88;;;;:::i;:::-;33134:112;;;;:::i;:::-;33285:14;::::0;::::1;:21:::0;33110:136;;-1:-1:-1;33285:25:0::1;::::0;33309:1:::1;33285:25;:::i;:::-;33271:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;33271:40:0::1;-1:-1:-1::0;33345:14:0::1;::::0;::::1;:21:::0;33259:52;;-1:-1:-1;33345:25:0::1;::::0;33369:1:::1;33345:25;:::i;:::-;33332:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;33406:14:0::1;::::0;::::1;:21:::0;33322:49;;-1:-1:-1;33406:25:0::1;::::0;33430:1:::1;33406:25;:::i;:::-;33392:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;33392:40:0::1;-1:-1:-1::0;33468:14:0::1;::::0;::::1;:21:::0;33382:50;;-1:-1:-1;33468:25:0::1;::::0;33492:1:::1;33468:25;:::i;:::-;33454:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;33454:40:0::1;-1:-1:-1::0;33530:6:0::1;::::0;33507:12;;33443:51;;-1:-1:-1;33530:6:0::1;;::::0;33507:9;;33530:6:::1;::::0;33507:12:::1;;;;:::i;:::-;:30;::::0;;::::1;:12;::::0;;::::1;::::0;;;;;:30;33574:6:::1;::::0;33561:33:::1;::::0;33574:6:::1;33561:31;:33::i;:::-;33548:7;33556:1;33548:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:46;33632:6:::1;::::0;33619:35:::1;::::0;33632:6:::1;;33619:33;:35::i;:::-;33605:49;;:8;33614:1;33605:11;;;;;;;;:::i;:::-;;;;;;:49;;;::::0;::::1;33678:13;33665:7;33673:1;33665:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:26;33723:18:::1;33704:697;33773:14;::::0;::::1;:21:::0;33760:34;::::1;33704:697;;;33902:4;:14;;33917:10;33902:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;;;;;;:26:::1;::::0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33848:9:::0;33858:14:::1;:10:::0;33871:1:::1;33858:14;:::i;:::-;33848:25;;;;;;;;:::i;:::-;;;;;;:109;;;;;;;;;::::0;::::1;34000:99;34031:4;:14;;34046:10;34031:26;;;;;;;;:::i;34000:99::-;33974:7:::0;33982:14:::1;:10:::0;33995:1:::1;33982:14;:::i;:::-;33974:23;;;;;;;;:::i;:::-;;;;;;:125;;;;34143:101;34174:4;:14;;34189:10;34174:26;;;;;;;;:::i;34143:101::-;34116:128;;:8:::0;34125:14:::1;:10:::0;34138:1:::1;34125:14;:::i;:::-;34116:24;;;;;;;;:::i;:::-;;;;;;:128;;;::::0;::::1;34287:4;:14;;34302:10;34287:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;:102:::1;::::0;;;;::::1;::::0;::::1;26172:25:1::0;;;34287:26:0::1;26233:55:1::0;;;26213:18;;;26206:83;34287:26:0;;::::1;::::0;:40:::1;::::0;26145:18:1;;34287:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34261:7:::0;34269:14:::1;:10:::0;34282:1:::1;34269:14;:::i;:::-;34261:23;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:128;33809:12:::1;;33704:697;;;;32217:2191;;;;;31908:2500:::0;;;;;;;;:::o;2186:132::-;2067:7;2094:6;2250:23;2094:6;740:10;2250:23;2242:68;;;;;;;26502:2:1;2242:68:0;;;26484:21:1;;;26521:18;;;26514:30;26580:34;26560:18;;;26553:62;26632:18;;2242:68:0;26300:356:1;37412:150:0;37465:11;37460:95;37488:8;:15;37482:21;;37460:95;;;37527:16;37539:3;37527:11;:16::i;:::-;37505:5;;37460:95;;5812:293;5214:1;5946:7;;:19;5938:63;;;;;;;26863:2:1;5938:63:0;;;26845:21:1;26902:2;26882:18;;;26875:30;26941:33;26921:18;;;26914:61;26992:18;;5938:63:0;26661:355:1;5938:63:0;5214:1;6079:7;:18;5812:293::o;37778:1427::-;24459:8;:15;37840:4;;24452:22;;24444:54;;;;;;;10673:2:1;24444:54:0;;;10655:21:1;10712:2;10692:18;;;10685:30;10751:21;10731:18;;;10724:49;10790:18;;24444:54:0;10471:343:1;24444:54:0;37857:21:::1;37881:8;37890:4;37881:14;;;;;;;;:::i;:::-;;;;;;;;;;;37857:38;;37931:4;:24;;;37912:15;:43;37908:82;;37972:7;41504:1418:::0;;:::o;37908:82::-:1;38021:12;::::0;::::1;::::0;38050:13;;;:37:::1;;-1:-1:-1::0;38067:15:0::1;::::0;::::1;::::0;:20;38050:37:::1;38046:133;;;-1:-1:-1::0;38131:15:0::1;38104:24;::::0;;::::1;:42:::0;41504:1418;;:::o;38046:133::-:1;38191:18;38230:4;:24;;;38212:15;:42;;;;:::i;:::-;38191:63;;38267:20;38353:15;;38321:4;:15;;;38305:12;;38292:10;:25;;;;:::i;:::-;38291:45;;;;:::i;:::-;38290:78;;;;:::i;:::-;38267:101;;38381:13;38397:4;38381:20;;38412:17;38511:15;;38480;;38453:11;;38432:5;:32;;;;:::i;:::-;:63;;;;:::i;:::-;:94;;;;:::i;:::-;38539:6;::::0;38551:11:::1;::::0;38580::::1;::::0;38412:114;;-1:-1:-1;38539:6:0::1;::::0;;::::1;::::0;:11:::1;::::0;38551;;::::1;::::0;38595:5;;38565:26:::1;::::0;:12;:26:::1;:::i;:::-;38564:36;;;;:::i;:::-;38539:62;::::0;;::::1;::::0;;;;;;27225:42:1;27213:55;;;38539:62:0::1;::::0;::::1;27195:74:1::0;27285:18;;;27278:34;27168:18;;38539:62:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;38612:6:0::1;::::0;38624:15:::1;::::0;38657::::1;::::0;38612:6:::1;::::0;;::::1;::::0;-1:-1:-1;38612:11:0::1;::::0;-1:-1:-1;38624:15:0;::::1;::::0;38676:5;;38642:30:::1;::::0;:12;:30:::1;:::i;:::-;38641:40;;;;:::i;:::-;38612:70;::::0;;::::1;::::0;;;;;;27225:42:1;27213:55;;;38612:70:0::1;::::0;::::1;27195:74:1::0;27285:18;;;27278:34;27168:18;;38612:70:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;38693:6:0::1;::::0;38705:15:::1;::::0;38738::::1;::::0;38693:6:::1;::::0;;::::1;::::0;-1:-1:-1;38693:11:0::1;::::0;-1:-1:-1;38705:15:0;::::1;::::0;38757:5;;38723:30:::1;::::0;:12;:30:::1;:::i;:::-;38722:40;;;;:::i;:::-;38693:70;::::0;;::::1;::::0;;;;;;27225:42:1;27213:55;;;38693:70:0::1;::::0;::::1;27195:74:1::0;27285:18;;;27278:34;27168:18;;38693:70:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;38774:6:0::1;::::0;::::1;;::::0;-1:-1:-1;38774:11:0::1;::::0;-1:-1:-1;38794:4:0::1;38830:5:::0;38802:24:::1;38817:9:::0;38802:12;:24:::1;:::i;:::-;38801:34;;;;:::i;:::-;38774:62;::::0;;::::1;::::0;;;;;;27225:42:1;27213:55;;;38774:62:0::1;::::0;::::1;27195:74:1::0;27285:18;;;27278:34;27168:18;;38774:62:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;38952:12:0::1;::::0;::::1;::::0;38980:5;;-1:-1:-1;38926:9:0;38889:34:::1;38904:19;38889:12:::0;:34:::1;:::i;:::-;:46;;;;:::i;:::-;38888:76;;;;:::i;:::-;:97;;;;:::i;:::-;38849:4;:22;;;:136;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;39025:15:0::1;38998:24;::::0;::::1;:42:::0;;;39164:22:::1;::::0;::::1;::::0;39058:139:::1;::::0;;27525:25:1;;;27581:2;27566:18;;27559:34;;;27609:18;;27602:34;39083:4:0;;39058:139:::1;::::0;27513:2:1;27498:18;39058:139:0::1;;;;;;;37846:1359;;;;;;37778:1427:::0;;:::o;44057:1181::-;44125:21;44149:8;44158:4;44149:14;;;;;;;;:::i;:::-;;;;;;;;;44198;;;:8;:14;;;;;;44213:10;44198:26;;;;;;;44241:21;;;;44149:14;;;;;;;;-1:-1:-1;44241:26:0;:63;;;;;44290:14;;44271:15;:33;;44241:63;44237:158;;;44363:20;;;;44345:38;;:15;:38;:::i;:::-;44321:21;;;:62;44237:158;44407:15;44503:4;:15;;;44480:19;44441:4;:22;;;44427:4;:11;;;:36;;;;:::i;:::-;44426:73;;;;:::i;:::-;44425:93;;;;:::i;:::-;44407:111;;44535:28;44546:4;44552:10;44535;:28::i;:::-;44531:700;;;44594:1;44584:7;:11;:38;;;;44621:1;44599:4;:19;;;:23;44584:38;44580:453;;;44643:22;44678:4;:19;;;44668:7;:29;;;;:::i;:::-;44643:54;;44775:4;:19;;;44751:20;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;;44835:1:0;44813:19;;;:23;44897:20;;;;44879:38;;:15;:38;:::i;:::-;44855:21;;;:62;44971:46;44990:10;45002:14;44971:18;:46::i;:::-;44624:409;44580:453;44531:700;;;45054:11;;45050:181;;45106:7;45082:20;;:31;;;;;;;:::i;:::-;;;;;;;;45151:7;45128:4;:19;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;45178:41:0;;160:25:1;;;45205:4:0;;45193:10;;45178:41;;148:2:1;133:18;45178:41:0;;;;;;;45050:181;44114:1124;;;44057:1181;:::o;20340:407::-;20534:48;;;20500:19;27213:55:1;;;20534:48:0;;;27195:74:1;27285:18;;;;27278:34;;;20534:48:0;;;;;;;;;;27168:18:1;;;;20534:48:0;;;;;;;;;20557:12;20534:48;;;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;;;;;;;28437:2:1;20604:135:0;;;28419:21:1;28476:2;28456:18;;;28449:30;28515;28495:18;;;28488:58;28563:18;;20604:135:0;28235:352:1;20604:135:0;20453:294;;20340:407;;;:::o;18746:310::-;18943:34;;;;;;;;;;;;;;;;;;18966:10;18943:34;;;18903:85;;18836:13;;18868:12;;;;18903:25;;;;:85;;18943:34;18903:85;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18867:121;;;;19006:7;:42;;;;;;;;;;;;;;;;;;;;;;19016:24;19035:4;19016:18;:24::i;:::-;18999:49;18746:310;-1:-1:-1;;;;18746:310:0:o;19771:293::-;19930:36;;;;;;;;;;;;;;;;;;19953:12;19930:36;;;19890:87;;19836:5;;;;;;19890:25;;;;: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;39874:1599::-;24459:8;:15;39968:4;;24452:22;;24444:54;;;;;;;10673:2:1;24444:54:0;;;10655:21:1;10712:2;10692:18;;;10685:30;10751:21;10731:18;;;10724:49;10790:18;;24444:54:0;10471:343:1;24444:54:0;39990:21:::1;40014:8;40023:4;40014:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;40063;;;:8:::1;:14:::0;;;;;;40078:10:::1;40063:26:::0;;;;;;;40014:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;40102:17:0::1;40072:4:::0;40102:11:::1;:17::i;:::-;40132:30;40157:4;40132:24;:30::i;:::-;40179:11:::0;;40175:740:::1;;40231:12:::0;;:37:::1;::::0;;;;40262:4:::1;40231:37;::::0;::::1;573:74:1::0;40207:21:0::1;::::0;40231:12:::1;;::::0;:22:::1;::::0;546:18:1;;40231:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40283:12:::0;;40207:61;;-1:-1:-1;40283:65:0::1;::::0;:12:::1;;40313:10;40333:4;40340:7:::0;40283:29:::1;:65::i;:::-;40386:12:::0;;:37:::1;::::0;;;;40417:4:::1;40386:37;::::0;::::1;573:74:1::0;40363:20:0::1;::::0;40386:12:::1;;::::0;:22:::1;::::0;546:18:1;;40386:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40363:60:::0;-1:-1:-1;40450:28:0::1;40465:13:::0;40363:60;40450:28:::1;:::i;:::-;40499:17;::::0;::::1;::::0;40440:38;;-1:-1:-1;40499:17:0::1;;:21:::0;40495:244:::1;;40573:17;::::0;::::1;::::0;40541:18:::1;::::0;40594:5:::1;::::0;40563:27:::1;::::0;40573:17:::1;;40563:7:::0;:27:::1;:::i;:::-;40562:37;;;;:::i;:::-;40644:15;::::0;40618:12;;40541:58;;-1:-1:-1;40618:54:0::1;::::0;40644:15:::1;40618:12:::0;;::::1;::::0;40644:15:::1;40541:58:::0;40618:25:::1;:54::i;:::-;40703:20;40713:10:::0;40703:7;:20:::1;:::i;:::-;40693:30;;40522:217;40495:244;40770:7;40755:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40831:6:0::1;::::0;40806:12;;40831:6:::1;::::0;;::::1;40806:12:::0;::::1;40798:40:::0;40794:110:::1;;40881:7;40859:18;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40794:110:0::1;40192:723;;40175:740;40971:22;::::0;::::1;::::0;40957:11;;41010:19:::1;::::0;40957:36:::1;::::0;::::1;:::i;:::-;40956:73;;;;:::i;:::-;40925:15;::::0;::::1;:104:::0;41061:18:::1;41042:293;41111:14;::::0;::::1;:21:::0;41098:34;::::1;41042:293;;;41186:4;:14;;41201:10;41186:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;41297:11;;41186:137:::1;::::0;;;;::::1;::::0;::::1;16411:25:1::0;;;41268:10:0::1;16452:18:1::0;;;16445:83;16544:18;;;16537:34;;;;41186:26:0::1;::::0;;::::1;::::0;:40:::1;::::0;16384:18:1;;41186:137:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41147:12;;;;;41042:293;;;-1:-1:-1::0;41351:11:0;;41347:67:::1;;41395:7;41379:4;:12;;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;41347:67:0::1;41431:34;::::0;160:25:1;;;41451:4:0;;41439:10:::1;::::0;41431:34:::1;::::0;148:2:1;133:18;41431:34:0::1;;;;;;;39979:1494;;39874:1599:::0;;;:::o;3281:191::-;3355:16;3374:6;;;3391:17;;;;;;;;;;3424:40;;3374:6;;;;;;;3424:40;;3355:16;3424:40;3344:128;3281:191;:::o;45355:645::-;45471:18;;45437:6;;:31;;;;;45462:4;45437:31;;;573:74:1;45437:6:0;;;;;:16;;546:18:1;;45437:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;45433:560;;;45762:18;;45711:6;;:31;;;;;45736:4;45711:31;;;573:74:1;45691:17:0;;45762:18;45711:6;;;:16;;546:18:1;;45711:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:69;;;;:::i;:::-;45691:89;;45810:9;45799:7;:20;45795:187;;45840:6;;:35;;:6;;45860:3;45865:9;45840:19;:35::i;:::-;45491:502;45355:645;;:::o;45795:187::-;45901:11;;45897:85;;45933:6;;:33;;:6;;45953:3;45958:7;45933:19;:33::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;:::-;;;;;;;:12;;18209:22;18202:69;;;18252:3;;;;:::i;:::-;;;;18202:69;;;18285:23;18321:1;18311:12;;;;;;;;;;:::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;:::-;;;;;;;:12;;18350:22;18338:99;;;18414:4;18419:1;18414:7;;;;;;;;;;:::i;:::-;;;;;;;;;18398:10;18409:1;18398:13;;;;;;;;;;:::i;:::-;;;;:23;;;;;;;;;;-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;;;;;;;;;;;;;;;;;;17921:619::o;18138:395::-;17921:619;;;:::o;21070:449::-;21291:59;;;21257:19;30302:55:1;;;21291:59:0;;;30284:74:1;30394:55;;;30374:18;;;30367:83;30466:18;;;;30459:34;;;21291:59:0;;;;;;;;;;30257:18:1;;;;21291:59:0;;;;;;;;;21314:17;21291:59;;;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;;;;;;;30706:2:1;21372:139:0;;;30688:21:1;;;30725:18;;;30718:30;30784:34;30764:18;;;30757:62;30836:18;;21372:139:0;30504: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;1350:159::-;1417:20;;1477:6;1466:18;;1456:29;;1446:57;;1499:1;1496;1489:12;1514:385;1595:8;1605:6;1659:3;1652:4;1644:6;1640:17;1636:27;1626:55;;1677:1;1674;1667:12;1626:55;-1:-1:-1;1700:20:1;;1743:18;1732:30;;1729:50;;;1775:1;1772;1765:12;1729:50;1812:4;1804:6;1800:17;1788:29;;1872:3;1865:4;1855:6;1852:1;1848:14;1840:6;1836:27;1832:38;1829:47;1826:67;;;1889:1;1886;1879:12;1826:67;1514:385;;;;;:::o;1904:907::-;2049:6;2057;2065;2073;2081;2089;2142:3;2130:9;2121:7;2117:23;2113:33;2110:53;;;2159:1;2156;2149:12;2110:53;2204:23;;;-1:-1:-1;2324:2:1;2309:18;;2296:32;;-1:-1:-1;2373:37:1;2406:2;2391:18;;2373:37;:::i;:::-;2363:47;-1:-1:-1;2483:2:1;2468:18;;2455:32;;-1:-1:-1;2564:3:1;2549:19;;2536:33;2592:18;2581:30;;2578:50;;;2624:1;2621;2614:12;2578:50;2663:88;2743:7;2734:6;2723:9;2719:22;2663:88;:::i;:::-;1904:907;;;;-1:-1:-1;1904:907:1;;-1:-1:-1;1904:907:1;;2770:8;;1904:907;-1:-1:-1;;;1904:907:1:o;2816:154::-;2902:42;2895:5;2891:54;2884:5;2881:65;2871:93;;2960:1;2957;2950:12;2975:367;3043:6;3051;3104:2;3092:9;3083:7;3079:23;3075:32;3072:52;;;3120:1;3117;3110:12;3072:52;3165:23;;;-1:-1:-1;3264:2:1;3249:18;;3236:32;3277:33;3236:32;3277:33;:::i;:::-;3329:7;3319:17;;;2975:367;;;;;:::o;3539:247::-;3598:6;3651:2;3639:9;3630:7;3626:23;3622:32;3619:52;;;3667:1;3664;3657:12;3619:52;3706:9;3693:23;3725:31;3750:5;3725:31;:::i;3791:346::-;3859:6;3867;3920:2;3908:9;3899:7;3895:23;3891:32;3888:52;;;3936:1;3933;3926:12;3888:52;-1:-1:-1;;3981:23:1;;;4101:2;4086:18;;;4073:32;;-1:-1:-1;3791:346:1:o;4142:469::-;4195:3;4233:5;4227:12;4260:6;4255:3;4248:19;4292:4;4287:3;4283:14;4276:21;;4331:4;4324:5;4320:16;4354:1;4364:222;4378:6;4375:1;4372:13;4364:222;;;4443:13;;4458:42;4439:62;4427:75;;4531:4;4522:14;;;;4559:17;;;;4400:1;4393:9;4364:222;;;-1:-1:-1;4602:3:1;;4142:469;-1:-1:-1;;;;4142:469:1:o;4616:420::-;4669:3;4707:5;4701:12;4734:6;4729:3;4722:19;4766:4;4761:3;4757:14;4750:21;;4805:4;4798:5;4794:16;4828:1;4838:173;4852:6;4849:1;4846:13;4838:173;;;4913:13;;4901:26;;4956:4;4947:14;;;;4984:17;;;;4874:1;4867:9;4838:173;;5041:1683;5474:3;5463:9;5456:22;5437:4;5501:57;5553:3;5542:9;5538:19;5530:6;5501:57;:::i;:::-;5606:9;5598:6;5594:22;5589:2;5578:9;5574:18;5567:50;5637:6;5672;5666:13;5703:6;5695;5688:22;5738:2;5730:6;5726:15;5719:22;;5797:2;5787:6;5784:1;5780:14;5772:6;5768:27;5764:36;5835:2;5827:6;5823:15;5856:1;5866:606;5880:6;5877:1;5874:13;5866:606;;;5966:66;5957:6;5949;5945:19;5941:92;5936:3;5929:105;6063:6;6057:13;6105:2;6099:9;6136:8;6128:6;6121:24;6194:8;6189:2;6185;6181:11;6176:2;6168:6;6164:15;6158:45;6255:1;6250:2;6239:8;6231:6;6227:21;6223:30;6216:41;6389:2;6319:66;6314:2;6304:8;6300:17;6296:90;6288:6;6284:103;6280:112;6270:122;;;;6427:2;6419:6;6415:15;6405:25;;6459:2;6454:3;6450:12;6443:19;;5902:1;5899;5895:9;5890:14;;5866:606;;;5870:3;;6520:9;6512:6;6508:22;6503:2;6492:9;6488:18;6481:50;6554:44;6591:6;6583;6554:44;:::i;:::-;6540:58;;;;;6646:9;6638:6;6634:22;6629:2;6618:9;6614:18;6607:50;6674:44;6711:6;6703;6674:44;:::i;:::-;6666:52;5041:1683;-1:-1:-1;;;;;;;5041:1683:1:o;6729:948::-;6894:6;6902;6910;6918;6926;6934;6987:3;6975:9;6966:7;6962:23;6958:33;6955:53;;;7004:1;7001;6994:12;6955:53;7049:23;;;-1:-1:-1;7148:2:1;7133:18;;7120:32;7161:33;7120:32;7161:33;:::i;:::-;7213:7;-1:-1:-1;7239:37:1;7272:2;7257:18;;7239:37;:::i;7682:114::-;7766:4;7759:5;7755:16;7748:5;7745:27;7735:55;;7786:1;7783;7776:12;7801:846;7903:6;7911;7919;7927;7935;7943;7996:3;7984:9;7975:7;7971:23;7967:33;7964:53;;;8013:1;8010;8003:12;7964:53;8058:23;;;-1:-1:-1;8178:2:1;8163:18;;8150:32;;-1:-1:-1;8281:2:1;8266:18;;8253:32;;-1:-1:-1;8363:2:1;8348:18;;8335:32;8376:31;8335:32;8376:31;:::i;:::-;7801:846;;;;-1:-1:-1;7801:846:1;;8506:3;8491:19;;8478:33;;8610:3;8595:19;;;8582:33;;-1:-1:-1;7801:846:1;-1:-1:-1;;7801:846:1:o;9241:455::-;9327:6;9335;9388:2;9376:9;9367:7;9363:23;9359:32;9356:52;;;9404:1;9401;9394:12;9356:52;9444:9;9431:23;9477:18;9469:6;9466:30;9463:50;;;9509:1;9506;9499:12;9463:50;9548:88;9628:7;9619:6;9608:9;9604:22;9548:88;:::i;:::-;9655:8;;9522:114;;-1:-1:-1;9241:455:1;-1:-1:-1;;;;9241:455:1:o;9952:261::-;10131:2;10120:9;10113:21;10094:4;10151:56;10203:2;10192:9;10188:18;10180:6;10151:56;:::i;11883:184::-;11935:77;11932:1;11925:88;12032:4;12029:1;12022:15;12056:4;12053:1;12046:15;12707:184;12759:77;12756:1;12749:88;12856:4;12853:1;12846:15;12880:4;12877:1;12870:15;12896:128;12963:9;;;12984:11;;;12981:37;;;12998:18;;:::i;13029:125::-;13094:9;;;13115:10;;;13112:36;;;13128:18;;:::i;13159:644::-;13354:3;13385;13432:6;13354:3;13466:310;13480:6;13477:1;13474:13;13466:310;;;13555:6;13542:20;13575:31;13600:5;13575:31;:::i;:::-;13644:42;13633:54;13619:69;;13721:4;13710:16;;;;13749:17;;;;;13502:1;13495:9;13466:310;;;-1:-1:-1;13792:5:1;;13159:644;-1:-1:-1;;;;;13159:644:1:o;15757:168::-;15830:9;;;15861;;15878:15;;;15872:22;;15858:37;15848:71;;15899:18;;:::i;15930:274::-;15970:1;15996;15986:189;;16031:77;16028:1;16021:88;16132:4;16129:1;16122:15;16160:4;16157:1;16150:15;15986:189;-1:-1:-1;16189:9:1;;15930:274::o;16582:184::-;16634:77;16631:1;16624:88;16731:4;16728:1;16721:15;16755:4;16752:1;16745:15;16771:271;16861:6;16914:2;16902:9;16893:7;16889:23;16885:32;16882:52;;;16930:1;16927;16920:12;16882:52;16962:9;16956:16;16981:31;17006:5;16981:31;:::i;17047:184::-;17117:6;17170:2;17158:9;17149:7;17145:23;17141:32;17138:52;;;17186:1;17183;17176:12;17138:52;-1:-1:-1;17209:16:1;;17047:184;-1:-1:-1;17047:184:1:o;27647:301::-;27776:3;27814:6;27808:13;27860:6;27853:4;27845:6;27841:17;27836:3;27830:37;27922:1;27886:16;;27911:13;;;-1:-1:-1;27886:16:1;27647:301;-1:-1:-1;27647:301:1:o;27953:277::-;28020:6;28073:2;28061:9;28052:7;28048:23;28044:32;28041:52;;;28089:1;28086;28079:12;28041:52;28121:9;28115:16;28174:5;28167:13;28160:21;28153:5;28150:32;28140:60;;28196:1;28193;28186:12;28592:247;28660:6;28713:2;28701:9;28692:7;28688:23;28684:32;28681:52;;;28729:1;28726;28719:12;28681:52;28761:9;28755:16;28780:29;28803:5;28780:29;:::i;28844:1053::-;28924:6;28977:2;28965:9;28956:7;28952:23;28948:32;28945:52;;;28993:1;28990;28983:12;28945:52;29026:9;29020:16;29059:18;29051:6;29048:30;29045:50;;;29091:1;29088;29081:12;29045:50;29114:22;;29167:4;29159:13;;29155:27;-1:-1:-1;29145:55:1;;29196:1;29193;29186:12;29145:55;29229:2;29223:9;29255:18;29247:6;29244:30;29241:56;;;29277:18;;:::i;:::-;29326:2;29320:9;29473:66;29468:2;29399:66;29392:4;29384:6;29380:17;29376:90;29372:99;29368:172;29360:6;29356:185;29607:6;29595:10;29592:22;29571:18;29559:10;29556:34;29553:62;29550:88;;;29618:18;;:::i;:::-;29654:2;29647:22;29678;;;29719:15;;;29736:2;29715:24;29712:37;-1:-1:-1;29709:57:1;;;29762:1;29759;29752:12;29709:57;29811:6;29806:2;29802;29798:11;29793:2;29785:6;29781:15;29775:43;29864:1;29838:19;;;29859:2;29834:28;29827:39;;;;29842:6;28844:1053;-1:-1:-1;;;;28844:1053:1:o;29902:175::-;29939:3;29983:4;29976:5;29972:16;30012:4;30003:7;30000:17;29997:43;;30020:18;;:::i;:::-;30069:1;30056:15;;29902:175;-1:-1:-1;;29902:175:1:o
Swarm Source
ipfs://9bc60f2037c62aab4ba13d7475102e2166cadc72b2663725c746c5cac9a42f4b
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.