Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 10,364 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Reinvest | 2216511 | 1295 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 2069964 | 1320 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1538311 | 1434 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1537985 | 1434 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1537652 | 1434 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1537257 | 1434 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1536926 | 1434 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1536594 | 1434 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1536261 | 1434 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1535935 | 1434 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1535616 | 1434 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1535292 | 1434 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1534958 | 1435 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1534625 | 1435 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1534300 | 1435 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1533980 | 1435 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1533637 | 1435 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1533324 | 1435 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1533007 | 1435 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1532699 | 1435 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1532370 | 1435 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1532020 | 1435 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1531686 | 1435 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1531335 | 1435 days ago | IN | 0 MOVR | 0.00007844 | ||||
| Reinvest | 1531028 | 1436 days ago | IN | 0 MOVR | 0.00007844 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7389312 | 562 days ago | 0 MOVR | ||||
| 7367584 | 564 days ago | 0 MOVR | ||||
| 7367584 | 564 days ago | 0 MOVR | ||||
| 7367584 | 564 days ago | 0 MOVR | ||||
| 7367584 | 564 days ago | 0 MOVR | ||||
| 7367584 | 564 days ago | 0 MOVR | ||||
| 7367584 | 564 days ago | 0 MOVR | ||||
| 7367584 | 564 days ago | 0 MOVR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
StakedLPToken024
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/**
*Submitted for verification at moonriver.moonscan.io on 2021-11-21
*/
// File: contracts\libraries\SafeMath.sol
pragma solidity =0.5.16;
// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol
// Subject to the MIT license.
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the addition of two unsigned integers, reverting with custom message on overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, errorMessage);
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot underflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction underflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot underflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, errorMessage);
return c;
}
/**
* @dev Returns the integer division of two unsigned integers.
* Reverts on division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers.
* Reverts with custom message on division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: contracts\ImpermaxERC20.sol
pragma solidity =0.5.16;
// This contract is basically UniswapV2ERC20 with small modifications
// src: https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol
contract ImpermaxERC20 {
using SafeMath for uint;
string public name;
string public symbol;
uint8 public decimals = 18;
uint public totalSupply;
mapping(address => uint) public balanceOf;
mapping(address => mapping(address => uint)) public allowance;
bytes32 public DOMAIN_SEPARATOR;
mapping(address => uint) public nonces;
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
constructor() public {}
function _setName(string memory _name, string memory _symbol) internal {
name = _name;
symbol = _symbol;
uint chainId;
assembly {
chainId := chainid
}
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(_name)),
keccak256(bytes("1")),
chainId,
address(this)
)
);
}
function _mint(address to, uint value) internal {
totalSupply = totalSupply.add(value);
balanceOf[to] = balanceOf[to].add(value);
emit Transfer(address(0), to, value);
}
function _burn(address from, uint value) internal {
balanceOf[from] = balanceOf[from].sub(value);
totalSupply = totalSupply.sub(value);
emit Transfer(from, address(0), value);
}
function _approve(address owner, address spender, uint value) private {
allowance[owner][spender] = value;
emit Approval(owner, spender, value);
}
function _transfer(address from, address to, uint value) internal {
balanceOf[from] = balanceOf[from].sub(value, "Impermax: TRANSFER_TOO_HIGH");
balanceOf[to] = balanceOf[to].add(value);
emit Transfer(from, to, value);
}
function approve(address spender, uint value) external returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
function transfer(address to, uint value) external returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function transferFrom(address from, address to, uint value) external returns (bool) {
if (allowance[from][msg.sender] != uint(-1)) {
allowance[from][msg.sender] = allowance[from][msg.sender].sub(value, "Impermax: TRANSFER_NOT_ALLOWED");
}
_transfer(from, to, value);
return true;
}
function _checkSignature(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s, bytes32 typehash) internal {
require(deadline >= block.timestamp, "Impermax: EXPIRED");
bytes32 digest = keccak256(
abi.encodePacked(
'\x19\x01',
DOMAIN_SEPARATOR,
keccak256(abi.encode(typehash, owner, spender, value, nonces[owner]++, deadline))
)
);
address recoveredAddress = ecrecover(digest, v, r, s);
require(recoveredAddress != address(0) && recoveredAddress == owner, "Impermax: INVALID_SIGNATURE");
}
// keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
_checkSignature(owner, spender, value, deadline, v, r, s, PERMIT_TYPEHASH);
_approve(owner, spender, value);
}
}
// File: contracts\interfaces\IERC20.sol
pragma solidity >=0.5.0;
interface IERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
}
// File: contracts\interfaces\IPoolToken.sol
pragma solidity >=0.5.0;
interface IPoolToken {
/*** Impermax ERC20 ***/
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
/*** Pool Token ***/
event Mint(address indexed sender, address indexed minter, uint mintAmount, uint mintTokens);
event Redeem(address indexed sender, address indexed redeemer, uint redeemAmount, uint redeemTokens);
event Sync(uint totalBalance);
function underlying() external view returns (address);
function factory() external view returns (address);
function totalBalance() external view returns (uint);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function exchangeRate() external returns (uint);
function mint(address minter) external returns (uint mintTokens);
function redeem(address redeemer) external returns (uint redeemAmount);
function skim(address to) external;
function sync() external;
function _setFactory() external;
}
// File: contracts\PoolToken.sol
pragma solidity =0.5.16;
contract PoolToken is IPoolToken, ImpermaxERC20 {
uint internal constant initialExchangeRate = 1e18;
address public underlying;
address public factory;
uint public totalBalance;
uint public constant MINIMUM_LIQUIDITY = 1000;
event Mint(address indexed sender, address indexed minter, uint mintAmount, uint mintTokens);
event Redeem(address indexed sender, address indexed redeemer, uint redeemAmount, uint redeemTokens);
event Sync(uint totalBalance);
/*** Initialize ***/
// called once by the factory
function _setFactory() external {
require(factory == address(0), "Impermax: FACTORY_ALREADY_SET");
factory = msg.sender;
}
/*** PoolToken ***/
function _update() internal {
totalBalance = IERC20(underlying).balanceOf(address(this));
emit Sync(totalBalance);
}
function exchangeRate() public returns (uint)
{
uint _totalSupply = totalSupply; // gas savings
uint _totalBalance = totalBalance; // gas savings
if (_totalSupply == 0 || _totalBalance == 0) return initialExchangeRate;
return _totalBalance.mul(1e18).div(_totalSupply);
}
// this low-level function should be called from another contract
function mint(address minter) external nonReentrant update returns (uint mintTokens) {
uint balance = IERC20(underlying).balanceOf(address(this));
uint mintAmount = balance.sub(totalBalance);
mintTokens = mintAmount.mul(1e18).div(exchangeRate());
if(totalSupply == 0) {
// permanently lock the first MINIMUM_LIQUIDITY tokens
mintTokens = mintTokens.sub(MINIMUM_LIQUIDITY);
_mint(address(0), MINIMUM_LIQUIDITY);
}
require(mintTokens > 0, "Impermax: MINT_AMOUNT_ZERO");
_mint(minter, mintTokens);
emit Mint(msg.sender, minter, mintAmount, mintTokens);
}
// this low-level function should be called from another contract
function redeem(address redeemer) external nonReentrant update returns (uint redeemAmount) {
uint redeemTokens = balanceOf[address(this)];
redeemAmount = redeemTokens.mul(exchangeRate()).div(1e18);
require(redeemAmount > 0, "Impermax: REDEEM_AMOUNT_ZERO");
require(redeemAmount <= totalBalance, "Impermax: INSUFFICIENT_CASH");
_burn(address(this), redeemTokens);
_safeTransfer(redeemer, redeemAmount);
emit Redeem(msg.sender, redeemer, redeemAmount, redeemTokens);
}
// force real balance to match totalBalance
function skim(address to) external nonReentrant {
_safeTransfer(to, IERC20(underlying).balanceOf(address(this)).sub(totalBalance));
}
// force totalBalance to match real balance
function sync() external nonReentrant update {}
/*** Utilities ***/
// same safe transfer function used by UniSwapV2 (with fixed underlying)
bytes4 private constant SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)")));
function _safeTransfer(address to, uint amount) internal {
(bool success, bytes memory data) = underlying.call(abi.encodeWithSelector(SELECTOR, to, amount));
require(success && (data.length == 0 || abi.decode(data, (bool))), "Impermax: TRANSFER_FAILED");
}
// prevents a contract from calling itself, directly or indirectly.
bool internal _notEntered = true;
modifier nonReentrant() {
require(_notEntered, "Impermax: REENTERED");
_notEntered = false;
_;
_notEntered = true;
}
// update totalBalance with current balance
modifier update() {
_;
_update();
}
}
// File: contracts\interfaces\IMasterChef024.sol
pragma solidity >=0.5.0;
pragma experimental ABIEncoderV2;
// For:
// SolarDistributorV2
interface IMasterChef024 {
function poolInfo(uint256) external view returns (
address lpToken,
uint256 allocPoint,
uint256 lastRewardTimestamp,
uint256 accRewardTokenPerShare,
uint16 depositFeeBP,
uint256 harvestInterval,
uint256 totalLp
);
function userInfo(uint256, address) external view returns (
uint256 amount,
uint256 rewardDebt,
uint256 rewardLockedUp,
uint256 nextHarvestUntil
);
function totalAllocPoint() external view returns (uint256);
function poolRewarders(uint256 _pid) external view returns (address[] memory rewarders);
function poolRewardsPerSec(uint256 _pid) external view returns (
address[] memory addresses,
string[] memory symbols,
uint256[] memory decimals,
uint256[] memory rewardsPerSec
);
function deposit(uint256 _pid, uint256 _amount) external;
function withdraw(uint256 _pid, uint256 _amount) external;
}
// File: contracts\interfaces\IComplexRewarder.sol
pragma solidity >=0.5.0;
interface IComplexRewarder {
function rewardToken() external view returns (address);
}
// File: contracts\interfaces\IUniswapV2Router01.sol
pragma solidity >=0.5.0;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
// File: contracts\interfaces\IUniswapV2Pair.sol
pragma solidity >=0.5.0;
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
}
// File: contracts\interfaces\IWETH.sol
pragma solidity >=0.5.0;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}
// File: contracts\libraries\SafeToken.sol
pragma solidity 0.5.16;
interface ERC20Interface {
function balanceOf(address user) external view returns (uint256);
}
library SafeToken {
function myBalance(address token) internal view returns (uint256) {
return ERC20Interface(token).balanceOf(address(this));
}
function balanceOf(address token, address user) internal view returns (uint256) {
return ERC20Interface(token).balanceOf(user);
}
function safeApprove(address token, address to, uint256 value) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeApprove");
}
function safeTransfer(address token, address to, uint256 value) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeTransfer");
}
function safeTransferFrom(address token, address from, address to, uint256 value) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeTransferFrom");
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call.value(value)(new bytes(0));
require(success, "!safeTransferETH");
}
}
// File: contracts\libraries\Math.sol
pragma solidity =0.5.16;
// a library for performing various math operations
// forked from: https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/libraries/Math.sol
library Math {
function min(uint x, uint y) internal pure returns (uint z) {
z = x < y ? x : y;
}
// babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
function sqrt(uint y) internal pure returns (uint z) {
if (y > 3) {
z = y;
uint x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
}
}
// File: contracts\StakedLPToken024.sol
pragma solidity =0.5.16;
// For SolarDistributorV2
contract StakedLPToken024 is IUniswapV2Pair, PoolToken {
using SafeToken for address;
bool public constant isStakedLPToken = true;
string public constant stakedLPTokenType = "024";
uint256 public pid;
address public token0;
address public token1;
address public router;
address public masterChef;
address public rewardsToken;
address public WETH;
uint256 public constant REINVEST_BOUNTY = 0.02e18;
event Reinvest(address indexed caller, uint256 reward, uint256 bounty);
function _initialize(
uint256 _pid,
address _underlying,
address _token0,
address _token1,
address _router,
address _masterChef,
address _rewardsToken,
address _WETH
) external {
require(factory == address(0), "StakedLPToken: FACTORY_ALREADY_SET"); // sufficient check
factory = msg.sender;
_setName("Staked Uniswap V2", "STKD-UNI-V2");
pid = _pid;
underlying = _underlying;
token0 = _token0;
token1 = _token1;
router = _router;
masterChef = _masterChef;
rewardsToken = _rewardsToken;
WETH = _WETH;
_rewardsToken.safeApprove(address(_router), uint256(-1));
_WETH.safeApprove(address(_router), uint256(-1));
_underlying.safeApprove(address(_masterChef), uint256(-1));
}
function () external payable {
uint256 balance = address(this).balance;
IWETH(WETH).deposit.value(balance)();
}
/*** PoolToken Overrides ***/
function _update() internal {
(uint256 _totalBalance,,,) = IMasterChef024(masterChef).userInfo(pid, address(this));
totalBalance = _totalBalance;
emit Sync(_totalBalance);
}
// this low-level function should be called from another contract
function mint(address minter) external nonReentrant update returns (uint mintTokens) {
uint mintAmount = underlying.myBalance();
// handle pools with deposit fees by checking balance before and after deposit
(uint256 _totalBalanceBefore,,,) = IMasterChef024(masterChef).userInfo(pid, address(this));
IMasterChef024(masterChef).deposit(pid, mintAmount);
(uint256 _totalBalanceAfter,,,) = IMasterChef024(masterChef).userInfo(pid, address(this));
mintTokens = _totalBalanceAfter.sub(_totalBalanceBefore).mul(1e18).div(exchangeRate());
if(totalSupply == 0) {
// permanently lock the first MINIMUM_LIQUIDITY tokens
mintTokens = mintTokens.sub(MINIMUM_LIQUIDITY);
_mint(address(0), MINIMUM_LIQUIDITY);
}
require(mintTokens > 0, "StakedLPToken: MINT_AMOUNT_ZERO");
_mint(minter, mintTokens);
emit Mint(msg.sender, minter, mintAmount, mintTokens);
}
// this low-level function should be called from another contract
function redeem(address redeemer) external nonReentrant update returns (uint redeemAmount) {
uint redeemTokens = balanceOf[address(this)];
redeemAmount = redeemTokens.mul(exchangeRate()).div(1e18);
require(redeemAmount > 0, "StakedLPToken: REDEEM_AMOUNT_ZERO");
require(redeemAmount <= totalBalance, "StakedLPToken: INSUFFICIENT_CASH");
_burn(address(this), redeemTokens);
IMasterChef024(masterChef).withdraw(pid, redeemAmount);
_safeTransfer(redeemer, redeemAmount);
emit Redeem(msg.sender, redeemer, redeemAmount, redeemTokens);
}
/*** Reinvest ***/
function _optimalDepositA(uint256 amountA, uint256 reserveA) internal pure returns (uint256) {
uint256 a = uint256(1997).mul(reserveA);
uint256 b = amountA.mul(1000).mul(reserveA).mul(3988);
uint256 c = Math.sqrt(a.mul(a).add(b));
return c.sub(a).div(1994);
}
function approveRouter(address token, uint256 amount) internal {
if (IERC20(token).allowance(address(this), router) >= amount) return;
token.safeApprove(address(router), uint256(-1));
}
function swapExactTokensForTokens(address tokenIn, address tokenOut, uint256 amount) internal {
address[] memory path = new address[](2);
path[0] = address(tokenIn);
path[1] = address(tokenOut);
approveRouter(tokenIn, amount);
IUniswapV2Router01(router).swapExactTokensForTokens(amount, 0, path, address(this), now);
}
function addLiquidity(address tokenA, address tokenB, uint256 amountA, uint256 amountB) internal returns (uint256 liquidity) {
approveRouter(tokenA, amountA);
approveRouter(tokenB, amountB);
(,,liquidity) = IUniswapV2Router01(router).addLiquidity(tokenA, tokenB, amountA, amountB, 0, 0, address(this), now);
}
function _getReward() internal returns (uint256) {
IMasterChef024(masterChef).withdraw(pid, 0);
address[] memory rewarders = IMasterChef024(masterChef).poolRewarders(pid);
for (uint8 i = 0; i < rewarders.length; i++) {
address token = IComplexRewarder(rewarders[i]).rewardToken();
uint256 myBalance = token.myBalance();
if (myBalance > 0) {
swapExactTokensForTokens(token, rewardsToken, myBalance);
}
}
return rewardsToken.myBalance();
}
function getReward() external nonReentrant returns (uint256) {
require(msg.sender == tx.origin);
return _getReward();
}
function reinvest() external nonReentrant update {
require(msg.sender == tx.origin);
// 1. Withdraw all the rewards.
uint256 reward = _getReward();
if (reward == 0) return;
// 2. Send the reward bounty to the caller.
uint256 bounty = reward.mul(REINVEST_BOUNTY) / 1e18;
rewardsToken.safeTransfer(msg.sender, bounty);
// 3. Convert all the remaining rewards to token0 or token1.
address tokenA;
address tokenB;
if (token0 == rewardsToken || token1 == rewardsToken) {
(tokenA, tokenB) = token0 == rewardsToken ? (token0, token1) : (token1, token0);
}
else {
swapExactTokensForTokens(rewardsToken, WETH, reward.sub(bounty));
if (token0 == WETH || token1 == WETH) {
(tokenA, tokenB) = token0 == WETH ? (token0, token1) : (token1, token0);
}
else {
swapExactTokensForTokens(WETH, token0, WETH.myBalance());
(tokenA, tokenB) = (token0, token1);
}
}
// 4. Convert tokenA to LP Token underlyings.
uint256 totalAmountA = tokenA.myBalance();
assert(totalAmountA > 0);
(uint256 r0, uint256 r1,) = IUniswapV2Pair(underlying).getReserves();
uint256 reserveA = tokenA == token0 ? r0 : r1;
uint256 swapAmount = _optimalDepositA(totalAmountA, reserveA);
swapExactTokensForTokens(tokenA, tokenB, swapAmount);
uint256 liquidity = addLiquidity(tokenA, tokenB, totalAmountA.sub(swapAmount), tokenB.myBalance());
// 5. Stake the LP Tokens.
IMasterChef024(masterChef).deposit(pid, liquidity);
emit Reinvest(msg.sender, reward, bounty);
}
/*** Mirrored From uniswapV2Pair ***/
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) {
(reserve0, reserve1, blockTimestampLast) = IUniswapV2Pair(underlying).getReserves();
// if no token has been minted yet mirror uniswap getReserves
if (totalSupply == 0) return (reserve0, reserve1, blockTimestampLast);
// else, return the underlying reserves of this contract
uint256 _totalBalance = totalBalance;
uint256 _totalSupply = IUniswapV2Pair(underlying).totalSupply();
reserve0 = safe112(_totalBalance.mul(reserve0).div(_totalSupply));
reserve1 = safe112(_totalBalance.mul(reserve1).div(_totalSupply));
require(reserve0 > 100 && reserve1 > 100, "StakedLPToken: INSUFFICIENT_RESERVES");
}
function price0CumulativeLast() external view returns (uint256) {
return IUniswapV2Pair(underlying).price0CumulativeLast();
}
function price1CumulativeLast() external view returns (uint256) {
return IUniswapV2Pair(underlying).price1CumulativeLast();
}
/*** Utilities ***/
function safe112(uint n) internal pure returns (uint112) {
require(n < 2**112, "StakedLPToken: SAFE112");
return uint112(n);
}
}
// File: contracts\StakedLPTokenFactory024.sol
pragma solidity =0.5.16;
// For SolarDistributorV2
contract StakedLPTokenFactory024 {
address public router;
address public masterChef;
address public rewardsToken;
address public WETH;
mapping(uint256 => address) public getStakedLPToken;
address[] public allStakedLPToken;
event StakedLPTokenCreated(address indexed token0, address indexed token1, uint256 indexed pid, address stakedLPToken, uint);
constructor(address _router, address _masterChef, address _rewardsToken) public {
router = _router;
masterChef = _masterChef;
rewardsToken = _rewardsToken;
WETH = IUniswapV2Router01(_router).WETH();
}
function allStakedLPTokenLength() external view returns (uint) {
return allStakedLPToken.length;
}
function createStakedLPToken(uint256 pid) external returns (address payable stakedLPToken) {
require(getStakedLPToken[pid] == address(0), "StakedLPTokenFactory: PID_EXISTS");
(address pair,,,,,,) = IMasterChef024(masterChef).poolInfo(pid);
address token0 = IUniswapV2Pair(pair).token0();
address token1 = IUniswapV2Pair(pair).token1();
bytes memory bytecode = type(StakedLPToken024).creationCode;
assembly {
stakedLPToken := create2(0, add(bytecode, 32), mload(bytecode), pid)
}
StakedLPToken024(stakedLPToken)._initialize(pid, pair, token0, token1, router, masterChef, rewardsToken, WETH);
getStakedLPToken[pid] = stakedLPToken;
allStakedLPToken.push(stakedLPToken);
emit StakedLPTokenCreated(token0, token1, pid, stakedLPToken, allStakedLPToken.length);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintTokens","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"redeemTokens","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bounty","type":"uint256"}],"name":"Reinvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalBalance","type":"uint256"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"REINVEST_BOUNTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_masterChef","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"name":"_initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"_setFactory","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"reserve0","type":"uint112"},{"internalType":"uint112","name":"reserve1","type":"uint112"},{"internalType":"uint32","name":"blockTimestampLast","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"getReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isStakedLPToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"masterChef","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"mintTokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","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":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"redeemer","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"redeemAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"reinvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakedLPTokenType","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sync","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]Contract Creation Code
60806040526002805460ff19908116601217909155600b805490911660011790556144848061002f6000396000f3fe6080604052600436106102a05760003560e01c806370a082311161016e578063d1af0c7d116100cb578063e9d60d9f1161007f578063f887ea4011610064578063f887ea40146106f2578063fdb5a03e14610707578063fff6cae91461071c576102a0565b8063e9d60d9f146106bd578063f1068454146106dd576102a0565b8063d505accf116100b0578063d505accf14610668578063dd62ed3e14610688578063e8bea167146106a8576102a0565b8063d1af0c7d1461063e578063d21220a714610653576102a0565b8063ad5c464811610122578063ba9a7a5611610107578063ba9a7a56146105f4578063bc25cf7714610609578063c45a015514610629576102a0565b8063ad5c4648146105ca578063ad7a672f146105df576102a0565b806395a2251f1161015357806395a2251f1461057557806395d89b4114610595578063a9059cbb146105aa576102a0565b806370a08231146105355780637ecebe0014610555576102a0565b80633644e5151161021c5780635909c0d5116101d05780636a627842116101b55780636a627842146104eb5780636c2a3bc51461050b5780636f307dc314610520576102a0565b80635909c0d5146104c15780635a3d5493146104d6576102a0565b80633d18b912116102015780633d18b912146104805780634a5d316c14610495578063575a86b2146104ac576102a0565b80633644e515146104565780633ba0b9a91461046b576102a0565b80630dfe16811161027357806323b872dd1161025857806323b872dd146103ff57806330adf81f1461041f578063313ce56714610434576102a0565b80630dfe1681146103bb57806318160ddd146103dd576102a0565b806306fdde031461032a5780630902f1ac14610355578063095ea7b3146103795780630a641063146103a6575b601254604080517fd0e30db00000000000000000000000000000000000000000000000000000000081529051479273ffffffffffffffffffffffffffffffffffffffff169163d0e30db091849160048082019260009290919082900301818588803b15801561030e57600080fd5b505af1158015610322573d6000803e3d6000fd5b505050505050005b34801561033657600080fd5b5061033f610731565b60405161034c919061411e565b60405180910390f35b34801561036157600080fd5b5061036a6107dd565b60405161034c9392919061421f565b34801561038557600080fd5b506103996103943660046136e3565b610a18565b60405161034c9190614033565b3480156103b257600080fd5b50610399610a2f565b3480156103c757600080fd5b506103d0610a34565b60405161034c9190613f78565b3480156103e957600080fd5b506103f2610a50565b60405161034c9190614041565b34801561040b57600080fd5b5061039961041a3660046135fa565b610a56565b34801561042b57600080fd5b506103f2610b6b565b34801561044057600080fd5b50610449610b8f565b60405161034c91906142d4565b34801561046257600080fd5b506103f2610b98565b34801561047757600080fd5b506103f2610b9e565b34801561048c57600080fd5b506103f2610bee565b3480156104a157600080fd5b506104aa610c99565b005b3480156104b857600080fd5b506103d0610d15565b3480156104cd57600080fd5b506103f2610d31565b3480156104e257600080fd5b506103f2610dd9565b3480156104f757600080fd5b506103f261050636600461357c565b610e44565b34801561051757600080fd5b506103f261120a565b34801561052c57600080fd5b506103d0611215565b34801561054157600080fd5b506103f261055036600461357c565b611231565b34801561056157600080fd5b506103f261057036600461357c565b611243565b34801561058157600080fd5b506103f261059036600461357c565b611255565b3480156105a157600080fd5b5061033f611477565b3480156105b657600080fd5b506103996105c53660046136e3565b6114ef565b3480156105d657600080fd5b506103d06114fc565b3480156105eb57600080fd5b506103f2611518565b34801561060057600080fd5b506103f261151e565b34801561061557600080fd5b506104aa61062436600461357c565b611524565b34801561063557600080fd5b506103d061167a565b34801561064a57600080fd5b506103d0611696565b34801561065f57600080fd5b506103d06116b2565b34801561067457600080fd5b506104aa610683366004613647565b6116ce565b34801561069457600080fd5b506103f26106a33660046135c0565b611712565b3480156106b457600080fd5b5061033f61172f565b3480156106c957600080fd5b506104aa6106d83660046137fc565b611768565b3480156106e957600080fd5b506103f26119b1565b3480156106fe57600080fd5b506103d06119b7565b34801561071357600080fd5b506104aa6119d3565b34801561072857600080fd5b506104aa611f25565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156107d55780601f106107aa576101008083540402835291602001916107d5565b820191906000526020600020905b8154815290600101906020018083116107b857829003601f168201915b505050505081565b6000806000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561084a57600080fd5b505afa15801561085e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610882919081019061379b565b600354929550909350915061089657610a13565b600a54600854604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916318160ddd916004808301926020929190829003018186803b15801561090457600080fd5b505afa158015610918573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061093c91908101906137de565b905061097661097182610965856dffffffffffffffffffffffffffff8a1663ffffffff611f9116565b9063ffffffff611fe516565b612027565b945061099f61097182610965856dffffffffffffffffffffffffffff891663ffffffff611f9116565b93506064856dffffffffffffffffffffffffffff161180156109d157506064846dffffffffffffffffffffffffffff16115b610a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061416f565b60405180910390fd5b50505b909192565b6000610a25338484612079565b5060015b92915050565b600181565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610b5557604080518082018252601e81527f496d7065726d61783a205452414e534645525f4e4f545f414c4c4f574544000060208083019190915273ffffffffffffffffffffffffffffffffffffffff87166000908152600582528381203382529091529190912054610b2391849063ffffffff6120ee16565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602090815260408083203384529091529020555b610b60848484612134565b5060015b9392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60025460ff1681565b60065481565b600354600a5460009190811580610bb3575080155b15610bca57670de0b6b3a764000092505050610beb565b610be68261096583670de0b6b3a764000063ffffffff611f9116565b925050505b90565b600b5460009060ff16610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061420f565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055333214610c6157600080fd5b610c69612243565b9050600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590565b60095473ffffffffffffffffffffffffffffffffffffffff1615610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061413f565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b60105473ffffffffffffffffffffffffffffffffffffffff1681565b600854604080517f5909c0d5000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635909c0d5916004808301926020929190829003018186803b158015610d9c57600080fd5b505afa158015610db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dd491908101906137de565b905090565b600854604080517f5a3d5493000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635a3d5493916004808301926020929190829003018186803b158015610d9c57600080fd5b600b5460009060ff16610e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061420f565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600854600090610ed09073ffffffffffffffffffffffffffffffffffffffff166124c7565b601054600c546040517f93f1a40b00000000000000000000000000000000000000000000000000000000815292935060009273ffffffffffffffffffffffffffffffffffffffff909216916393f1a40b91610f2f913090600401614247565b60806040518083038186803b158015610f4757600080fd5b505afa158015610f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f7f91908101906138ef565b5050601054600c546040517fe2bbb15800000000000000000000000000000000000000000000000000000000815293945073ffffffffffffffffffffffffffffffffffffffff9091169263e2bbb1589250610fdf919086906004016142c6565b600060405180830381600087803b158015610ff957600080fd5b505af115801561100d573d6000803e3d6000fd5b5050601054600c546040517f93f1a40b0000000000000000000000000000000000000000000000000000000081526000945073ffffffffffffffffffffffffffffffffffffffff90921692506393f1a40b9161106e91903090600401614247565b60806040518083038186803b15801561108657600080fd5b505afa15801561109a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110be91908101906138ef565b50505090506110f66110ce610b9e565b610965670de0b6b3a76400006110ea858763ffffffff61256c16565b9063ffffffff611f9116565b93506003546000141561112457611115846103e863ffffffff61256c16565b935061112460006103e86125ae565b6000841161115e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061414f565b61116885856125ae565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee85876040516111c79291906142c6565b60405180910390a35050506111da612662565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055919050565b66470de4df82000081565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205481565b60076020526000908152604090205481565b600b5460009060ff16611294576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061420f565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055306000908152600460205260409020546112f0670de0b6b3a76400006109656112e3610b9e565b849063ffffffff611f9116565b91506000821161132c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061418f565b600a54821115611368576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07906141df565b6113723082612753565b601054600c546040517f441a3e7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9092169163441a3e70916113cb9186906004016142c6565b600060405180830381600087803b1580156113e557600080fd5b505af11580156113f9573d6000803e3d6000fd5b505050506114078383612810565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3f693fff038bb8a046aa76d9516190ac7444f7d69cf952c4cbdc086fdef2d6fc84846040516114669291906142c6565b60405180910390a3506111da612662565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156107d55780601f106107aa576101008083540402835291602001916107d5565b6000610a25338484612134565b60125473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b6103e881565b600b5460ff16611560576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061420f565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600a546008546040517f70a0823100000000000000000000000000000000000000000000000000000000815261164c9284926116479273ffffffffffffffffffffffffffffffffffffffff909116906370a08231906115eb903090600401613f78565b60206040518083038186803b15801561160357600080fd5b505afa158015611617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061163b91908101906137de565b9063ffffffff61256c16565b612810565b50600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60115473ffffffffffffffffffffffffffffffffffffffff1681565b600e5473ffffffffffffffffffffffffffffffffffffffff1681565b6116fe878787878787877f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96129ca565b611709878787612079565b50505050505050565b600560209081526000928352604080842090915290825290205481565b6040518060400160405280600381526020017f303234000000000000000000000000000000000000000000000000000000000081525081565b60095473ffffffffffffffffffffffffffffffffffffffff16156117b8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07906141ef565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055604080518082018252601181527f5374616b656420556e69737761702056320000000000000000000000000000006020808301919091528251808401909352600b83527f53544b442d554e492d56320000000000000000000000000000000000000000009083015261185391612b95565b600c889055600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8a811691909117909255600d80548216898416179055600e80548216888416179055600f805482168784161790556010805482168684161790556011805482168584169081179091556012805490921692841692909217905561191990857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612c83565b61196073ffffffffffffffffffffffffffffffffffffffff8216857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612c8316565b6119a773ffffffffffffffffffffffffffffffffffffffff8816847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612c8316565b5050505050505050565b600c5481565b600f5473ffffffffffffffffffffffffffffffffffffffff1681565b600b5460ff16611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061420f565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055333214611a4357600080fd5b6000611a4d612243565b905080611a5a5750611ef0565b6000670de0b6b3a7640000611a7c8366470de4df82000063ffffffff611f9116565b81611a8357fe5b6011549190049150611ab29073ffffffffffffffffffffffffffffffffffffffff16338363ffffffff612dad16565b601154600d54600091829173ffffffffffffffffffffffffffffffffffffffff90811691161480611b005750601154600e5473ffffffffffffffffffffffffffffffffffffffff9081169116145b15611b7a57601154600d5473ffffffffffffffffffffffffffffffffffffffff908116911614611b4f57600e54600d5473ffffffffffffffffffffffffffffffffffffffff9182169116611b70565b600d54600e5473ffffffffffffffffffffffffffffffffffffffff91821691165b9092509050611c9b565b601154601254611bb39173ffffffffffffffffffffffffffffffffffffffff9081169116611bae878763ffffffff61256c16565b612ed0565b601254600d5473ffffffffffffffffffffffffffffffffffffffff90811691161480611bfc5750601254600e5473ffffffffffffffffffffffffffffffffffffffff9081169116145b15611c4b57601254600d5473ffffffffffffffffffffffffffffffffffffffff908116911614611b4f57600e54600d5473ffffffffffffffffffffffffffffffffffffffff9182169116611b70565b601254600d54611c789173ffffffffffffffffffffffffffffffffffffffff9081169116611bae826124c7565b5050600d54600e5473ffffffffffffffffffffffffffffffffffffffff91821691165b6000611cbc8373ffffffffffffffffffffffffffffffffffffffff166124c7565b905060008111611cc857fe5b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611d3357600080fd5b505afa158015611d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d6b919081019061379b565b50600d546dffffffffffffffffffffffffffff92831694509116915060009073ffffffffffffffffffffffffffffffffffffffff878116911614611daf5781611db1565b825b90506000611dbf858361305d565b9050611dcc878783612ed0565b6000611e078888611de3898663ffffffff61256c16565b611e028b73ffffffffffffffffffffffffffffffffffffffff166124c7565b6130de565b601054600c546040517fe2bbb15800000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff9091169163e2bbb15891611e639185906004016142c6565b600060405180830381600087803b158015611e7d57600080fd5b505af1158015611e91573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fc003f45bc224d116b6d079100d4ab57a5b9633244c47a5a92a176c5b79a85f288b8b604051611edd9291906142c6565b60405180910390a2505050505050505050505b611ef8612662565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600b5460ff16611f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061420f565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611ef8612662565b600082611fa057506000610a29565b82820282848281611fad57fe5b0414610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07906141bf565b6000610b6483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506131b6565b60006e0100000000000000000000000000008210612071576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07906141af565b50805b919050565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526005602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906120e1908590614041565b60405180910390a3505050565b6000818484111561212c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07919061411e565b505050900390565b604080518082018252601b81527f496d7065726d61783a205452414e534645525f544f4f5f48494748000000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff86166000908152600490915291909120546121a291839063ffffffff6120ee16565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526004602052604080822093909355908416815220546121e4908263ffffffff61320716565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526004602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906120e1908590614041565b601054600c546040517f441a3e7000000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163441a3e709161229e91908590600401614262565b600060405180830381600087803b1580156122b857600080fd5b505af11580156122cc573d6000803e3d6000fd5b5050601054600c546040517feff8976b0000000000000000000000000000000000000000000000000000000081526060945073ffffffffffffffffffffffffffffffffffffffff909216925063eff8976b9161232b9190600401614041565b60006040518083038186803b15801561234357600080fd5b505afa158015612357573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261239d9190810190613713565b905060005b81518160ff16101561249e576000828260ff16815181106123bf57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663f7c618c16040518163ffffffff1660e01b815260040160206040518083038186803b15801561240c57600080fd5b505afa158015612420573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061244491908101906135a2565b905060006124678273ffffffffffffffffffffffffffffffffffffffff166124c7565b905080156124945760115461249490839073ffffffffffffffffffffffffffffffffffffffff1683612ed0565b50506001016123a2565b506011546124c19073ffffffffffffffffffffffffffffffffffffffff166124c7565b91505090565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319061251c903090600401613f78565b60206040518083038186803b15801561253457600080fd5b505afa158015612548573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a2991908101906137de565b6000610b6483836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f77008152506120ee565b6003546125c1908263ffffffff61320716565b60035573ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260409020546125fa908263ffffffff61320716565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600460205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612656908590614041565b60405180910390a35050565b601054600c546040517f93f1a40b00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff16916393f1a40b916126bd91903090600401614247565b60806040518083038186803b1580156126d557600080fd5b505afa1580156126e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061270d91908101906138ef565b505050905080600a819055507f8a0df8ef054fae2c3d2d19a7b322e864870cc9fd3cb07fb9526309c596244bf4816040516127489190614041565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054612789908263ffffffff61256c16565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600460205260409020556003546127c2908263ffffffff61256c16565b60035560405160009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612656908590614041565b600854604080518082018252601981527f7472616e7366657228616464726573732c75696e7432353629000000000000006020909101525160009160609173ffffffffffffffffffffffffffffffffffffffff909116907fa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b906128999087908790602401614018565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516129229190613f30565b6000604051808303816000865af19150503d806000811461295f576040519150601f19603f3d011682016040523d82523d6000602084013e612964565b606091505b509150915081801561298e57508051158061298e57508080602001905161298e919081019061377d565b6129c4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07906141ff565b50505050565b42851015612a04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061412f565b60065473ffffffffffffffffffffffffffffffffffffffff891660009081526007602090815260408083208054600181019091559051929392612a529286928e928e928e92918e910161404f565b60405160208183030381529060405280519060200120604051602001612a79929190613f3c565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051612ab694939291906140e0565b6020604051602081039080840390855afa158015612ad8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590612b5357508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061419f565b50505050505050505050565b8151612ba890600090602085019061339d565b508051612bbc90600190602084019061339d565b506040514690612bcb90613f6d565b6040805191829003822085516020808801919091208484018452600185527f3100000000000000000000000000000000000000000000000000000000000000948201949094529151612c459391927fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc691869130910161409e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120600655505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663095ea7b38585604051602401612cb6929190614018565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612d049190613f30565b6000604051808303816000865af19150503d8060008114612d41576040519150601f19603f3d011682016040523d82523d6000602084013e612d46565b606091505b5091509150818015612d70575080511580612d70575080806020019051612d70919081019061377d565b612da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061415f565b5050505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612de0929190614018565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612e2e9190613f30565b6000604051808303816000865af19150503d8060008114612e6b576040519150601f19603f3d011682016040523d82523d6000602084013e612e70565b606091505b5091509150818015612e9a575080511580612e9a575080806020019051612e9a919081019061377d565b612da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07906141cf565b60408051600280825260608083018452926020830190803883390190505090508381600081518110612efe57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281600181518110612f4657fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612f8a8483613246565b600f546040517f38ed173900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906338ed173990612fe990859060009086903090429060040161427d565b600060405180830381600087803b15801561300357600080fd5b505af1158015613017573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612da69190810190613748565b6000806130726107cd8463ffffffff611f9116565b90506000613090610f946110ea8681896103e863ffffffff611f9116565b905060006130bc6130b7836130ab868063ffffffff611f9116565b9063ffffffff61320716565b61334c565b90506130d46107ca610965838663ffffffff61256c16565b9695505050505050565b60006130ea8584613246565b6130f48483613246565b600f546040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e8e3370090613159908890889088908890600090819030904290600401613fa1565b606060405180830381600087803b15801561317357600080fd5b505af1158015613187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131ab91908101906138ac565b979650505050505050565b600081836131f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07919061411e565b5060008385816131fd57fe5b0495945050505050565b600082820183811015610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061417f565b600f546040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff8086169263dd62ed3e926132a1923092911690600401613f86565b60206040518083038186803b1580156132b957600080fd5b505afa1580156132cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132f191908101906137de565b106132fb57613348565b600f546133489073ffffffffffffffffffffffffffffffffffffffff84811691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612c8316565b5050565b6000600382111561338f575080600160028204015b818110156133895780915060028182858161337857fe5b04018161338157fe5b049050613361565b50612074565b811561207457506001919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106133de57805160ff191683800117855561340b565b8280016001018555821561340b579182015b8281111561340b5782518255916020019190600101906133f0565b5061341792915061341b565b5090565b610beb91905b808211156134175760008155600101613421565b8035610a29816143fd565b8051610a29816143fd565b600082601f83011261345c57600080fd5b815161346f61346a82614309565b6142e2565b9150818183526020840193506020810190508385602084028201111561349457600080fd5b60005b838110156134c057816134aa8882613440565b8452506020928301929190910190600101613497565b5050505092915050565b600082601f8301126134db57600080fd5b81516134e961346a82614309565b9150818183526020840193506020810190508385602084028201111561350e57600080fd5b60005b838110156134c05781613524888261355b565b8452506020928301929190910190600101613511565b8051610a2981614414565b8035610a298161441d565b8051610a2981614426565b8051610a298161441d565b8051610a298161442f565b8035610a2981614438565b60006020828403121561358e57600080fd5b600061359a8484613435565b949350505050565b6000602082840312156135b457600080fd5b600061359a8484613440565b600080604083850312156135d357600080fd5b60006135df8585613435565b92505060206135f085828601613435565b9150509250929050565b60008060006060848603121561360f57600080fd5b600061361b8686613435565b935050602061362c86828701613435565b925050604061363d86828701613545565b9150509250925092565b600080600080600080600060e0888a03121561366257600080fd5b600061366e8a8a613435565b975050602061367f8a828b01613435565b96505060406136908a828b01613545565b95505060606136a18a828b01613545565b94505060806136b28a828b01613571565b93505060a06136c38a828b01613545565b92505060c06136d48a828b01613545565b91505092959891949750929550565b600080604083850312156136f657600080fd5b60006137028585613435565b92505060206135f085828601613545565b60006020828403121561372557600080fd5b815167ffffffffffffffff81111561373c57600080fd5b61359a8482850161344b565b60006020828403121561375a57600080fd5b815167ffffffffffffffff81111561377157600080fd5b61359a848285016134ca565b60006020828403121561378f57600080fd5b600061359a848461353a565b6000806000606084860312156137b057600080fd5b60006137bc8686613550565b93505060206137cd86828701613550565b925050604061363d86828701613566565b6000602082840312156137f057600080fd5b600061359a848461355b565b600080600080600080600080610100898b03121561381957600080fd5b60006138258b8b613545565b98505060206138368b828c01613435565b97505060406138478b828c01613435565b96505060606138588b828c01613435565b95505060806138698b828c01613435565b94505060a061387a8b828c01613435565b93505060c061388b8b828c01613435565b92505060e061389c8b828c01613435565b9150509295985092959890939650565b6000806000606084860312156138c157600080fd5b60006138cd868661355b565b93505060206138de8682870161355b565b925050604061363d8682870161355b565b6000806000806080858703121561390557600080fd5b6000613911878761355b565b94505060206139228782880161355b565b93505060406139338782880161355b565b92505060606139448782880161355b565b91505092959194509250565b600061395c8383613973565b505060200190565b61396d81614388565b82525050565b61396d8161433d565b600061398782614330565b6139918185614334565b935061399c8361432a565b8060005b838110156139ca5781516139b48882613950565b97506139bf8361432a565b9250506001016139a0565b509495945050505050565b61396d81614348565b61396d81610beb565b61396d6139f382610beb565b610beb565b6000613a0382614330565b613a0d8185612074565b9350613a1d8185602086016143a9565b9290920192915050565b61396d81614393565b6000613a3b82614330565b613a458185614334565b9350613a558185602086016143a9565b613a5e816143d5565b9093019392505050565b6000613a75601183614334565b7f496d7065726d61783a2045585049524544000000000000000000000000000000815260200192915050565b6000613aae601d83614334565b7f496d7065726d61783a20464143544f52595f414c52454144595f534554000000815260200192915050565b6000613ae7601f83614334565b7f5374616b65644c50546f6b656e3a204d494e545f414d4f554e545f5a45524f00815260200192915050565b6000613b20600c83614334565b7f2173616665417070726f76650000000000000000000000000000000000000000815260200192915050565b6000613b59602483614334565b7f5374616b65644c50546f6b656e3a20494e53554646494349454e545f5245534581527f5256455300000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000613bb8600283612074565b7f1901000000000000000000000000000000000000000000000000000000000000815260020192915050565b6000613bf1601b83614334565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000613c2a602183614334565b7f5374616b65644c50546f6b656e3a2052454445454d5f414d4f554e545f5a455281527f4f00000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000613c89601b83614334565b7f496d7065726d61783a20494e56414c49445f5349474e41545552450000000000815260200192915050565b6000613cc2601683614334565b7f5374616b65644c50546f6b656e3a205341464531313200000000000000000000815260200192915050565b6000613cfb605283612074565b7f454950373132446f6d61696e28737472696e67206e616d652c737472696e672081527f76657273696f6e2c75696e7432353620636861696e49642c616464726573732060208201527f766572696679696e67436f6e7472616374290000000000000000000000000000604082015260520192915050565b6000613d80602183614334565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81527f7700000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000613ddf600d83614334565b7f21736166655472616e7366657200000000000000000000000000000000000000815260200192915050565b6000613e18602083614334565b7f5374616b65644c50546f6b656e3a20494e53554646494349454e545f43415348815260200192915050565b6000613e51602283614334565b7f5374616b65644c50546f6b656e3a20464143544f52595f414c52454144595f5381527f4554000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000613eb0601983614334565b7f496d7065726d61783a205452414e534645525f4641494c454400000000000000815260200192915050565b6000613ee9601383614334565b7f496d7065726d61783a205245454e544552454400000000000000000000000000815260200192915050565b61396d8161434d565b61396d81614379565b61396d81614382565b6000610b6482846139f8565b6000613f4782613bab565b9150613f5382856139e7565b602082019150613f6382846139e7565b5060200192915050565b6000610a2982613cee565b60208101610a298284613973565b60408101613f948285613964565b610b646020830184613973565b6101008101613fb0828b613973565b613fbd602083018a613973565b613fca60408301896139de565b613fd760608301886139de565b613fe46080830187613a27565b613ff160a0830186613a27565b613ffe60c0830185613964565b61400b60e08301846139de565b9998505050505050505050565b604081016140268285613973565b610b6460208301846139de565b60208101610a2982846139d5565b60208101610a2982846139de565b60c0810161405d82896139de565b61406a6020830188613973565b6140776040830187613973565b61408460608301866139de565b61409160808301856139de565b6131ab60a08301846139de565b60a081016140ac82886139de565b6140b960208301876139de565b6140c660408301866139de565b6140d360608301856139de565b6130d46080830184613973565b608081016140ee82876139de565b6140fb6020830186613f27565b61410860408301856139de565b61411560608301846139de565b95945050505050565b60208082528101610b648184613a30565b60208082528101610a2981613a68565b60208082528101610a2981613aa1565b60208082528101610a2981613ada565b60208082528101610a2981613b13565b60208082528101610a2981613b4c565b60208082528101610a2981613be4565b60208082528101610a2981613c1d565b60208082528101610a2981613c7c565b60208082528101610a2981613cb5565b60208082528101610a2981613d73565b60208082528101610a2981613dd2565b60208082528101610a2981613e0b565b60208082528101610a2981613e44565b60208082528101610a2981613ea3565b60208082528101610a2981613edc565b6060810161422d8286613f15565b61423a6020830185613f15565b61359a6040830184613f1e565b6040810161425582856139de565b610b646020830184613964565b6040810161427082856139de565b610b646020830184613a27565b60a0810161428b82886139de565b6142986020830187613a27565b81810360408301526142aa818661397c565b90506142b96060830185613964565b6130d460808301846139de565b6040810161402682856139de565b60208101610a298284613f27565b60405181810167ffffffffffffffff8111828210171561430157600080fd5b604052919050565b600067ffffffffffffffff82111561432057600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b6000610a2982614360565b151590565b6dffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b63ffffffff1690565b60ff1690565b6000610a298261439e565b6000610a2982610beb565b6000610a298261433d565b60005b838110156143c45781810151838201526020016143ac565b838111156129c45750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b6144068161433d565b811461441157600080fd5b50565b61440681614348565b61440681610beb565b6144068161434d565b61440681614379565b6144068161438256fea365627a7a72315820a8674e2164fde5da5b792c8ff856056502841baca972a40d8c2c8a6b8c1ad3826c6578706572696d656e74616cf564736f6c63430005100040
Deployed Bytecode
0x6080604052600436106102a05760003560e01c806370a082311161016e578063d1af0c7d116100cb578063e9d60d9f1161007f578063f887ea4011610064578063f887ea40146106f2578063fdb5a03e14610707578063fff6cae91461071c576102a0565b8063e9d60d9f146106bd578063f1068454146106dd576102a0565b8063d505accf116100b0578063d505accf14610668578063dd62ed3e14610688578063e8bea167146106a8576102a0565b8063d1af0c7d1461063e578063d21220a714610653576102a0565b8063ad5c464811610122578063ba9a7a5611610107578063ba9a7a56146105f4578063bc25cf7714610609578063c45a015514610629576102a0565b8063ad5c4648146105ca578063ad7a672f146105df576102a0565b806395a2251f1161015357806395a2251f1461057557806395d89b4114610595578063a9059cbb146105aa576102a0565b806370a08231146105355780637ecebe0014610555576102a0565b80633644e5151161021c5780635909c0d5116101d05780636a627842116101b55780636a627842146104eb5780636c2a3bc51461050b5780636f307dc314610520576102a0565b80635909c0d5146104c15780635a3d5493146104d6576102a0565b80633d18b912116102015780633d18b912146104805780634a5d316c14610495578063575a86b2146104ac576102a0565b80633644e515146104565780633ba0b9a91461046b576102a0565b80630dfe16811161027357806323b872dd1161025857806323b872dd146103ff57806330adf81f1461041f578063313ce56714610434576102a0565b80630dfe1681146103bb57806318160ddd146103dd576102a0565b806306fdde031461032a5780630902f1ac14610355578063095ea7b3146103795780630a641063146103a6575b601254604080517fd0e30db00000000000000000000000000000000000000000000000000000000081529051479273ffffffffffffffffffffffffffffffffffffffff169163d0e30db091849160048082019260009290919082900301818588803b15801561030e57600080fd5b505af1158015610322573d6000803e3d6000fd5b505050505050005b34801561033657600080fd5b5061033f610731565b60405161034c919061411e565b60405180910390f35b34801561036157600080fd5b5061036a6107dd565b60405161034c9392919061421f565b34801561038557600080fd5b506103996103943660046136e3565b610a18565b60405161034c9190614033565b3480156103b257600080fd5b50610399610a2f565b3480156103c757600080fd5b506103d0610a34565b60405161034c9190613f78565b3480156103e957600080fd5b506103f2610a50565b60405161034c9190614041565b34801561040b57600080fd5b5061039961041a3660046135fa565b610a56565b34801561042b57600080fd5b506103f2610b6b565b34801561044057600080fd5b50610449610b8f565b60405161034c91906142d4565b34801561046257600080fd5b506103f2610b98565b34801561047757600080fd5b506103f2610b9e565b34801561048c57600080fd5b506103f2610bee565b3480156104a157600080fd5b506104aa610c99565b005b3480156104b857600080fd5b506103d0610d15565b3480156104cd57600080fd5b506103f2610d31565b3480156104e257600080fd5b506103f2610dd9565b3480156104f757600080fd5b506103f261050636600461357c565b610e44565b34801561051757600080fd5b506103f261120a565b34801561052c57600080fd5b506103d0611215565b34801561054157600080fd5b506103f261055036600461357c565b611231565b34801561056157600080fd5b506103f261057036600461357c565b611243565b34801561058157600080fd5b506103f261059036600461357c565b611255565b3480156105a157600080fd5b5061033f611477565b3480156105b657600080fd5b506103996105c53660046136e3565b6114ef565b3480156105d657600080fd5b506103d06114fc565b3480156105eb57600080fd5b506103f2611518565b34801561060057600080fd5b506103f261151e565b34801561061557600080fd5b506104aa61062436600461357c565b611524565b34801561063557600080fd5b506103d061167a565b34801561064a57600080fd5b506103d0611696565b34801561065f57600080fd5b506103d06116b2565b34801561067457600080fd5b506104aa610683366004613647565b6116ce565b34801561069457600080fd5b506103f26106a33660046135c0565b611712565b3480156106b457600080fd5b5061033f61172f565b3480156106c957600080fd5b506104aa6106d83660046137fc565b611768565b3480156106e957600080fd5b506103f26119b1565b3480156106fe57600080fd5b506103d06119b7565b34801561071357600080fd5b506104aa6119d3565b34801561072857600080fd5b506104aa611f25565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156107d55780601f106107aa576101008083540402835291602001916107d5565b820191906000526020600020905b8154815290600101906020018083116107b857829003601f168201915b505050505081565b6000806000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561084a57600080fd5b505afa15801561085e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610882919081019061379b565b600354929550909350915061089657610a13565b600a54600854604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916318160ddd916004808301926020929190829003018186803b15801561090457600080fd5b505afa158015610918573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061093c91908101906137de565b905061097661097182610965856dffffffffffffffffffffffffffff8a1663ffffffff611f9116565b9063ffffffff611fe516565b612027565b945061099f61097182610965856dffffffffffffffffffffffffffff891663ffffffff611f9116565b93506064856dffffffffffffffffffffffffffff161180156109d157506064846dffffffffffffffffffffffffffff16115b610a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061416f565b60405180910390fd5b50505b909192565b6000610a25338484612079565b5060015b92915050565b600181565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610b5557604080518082018252601e81527f496d7065726d61783a205452414e534645525f4e4f545f414c4c4f574544000060208083019190915273ffffffffffffffffffffffffffffffffffffffff87166000908152600582528381203382529091529190912054610b2391849063ffffffff6120ee16565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602090815260408083203384529091529020555b610b60848484612134565b5060015b9392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60025460ff1681565b60065481565b600354600a5460009190811580610bb3575080155b15610bca57670de0b6b3a764000092505050610beb565b610be68261096583670de0b6b3a764000063ffffffff611f9116565b925050505b90565b600b5460009060ff16610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061420f565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055333214610c6157600080fd5b610c69612243565b9050600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590565b60095473ffffffffffffffffffffffffffffffffffffffff1615610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061413f565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b60105473ffffffffffffffffffffffffffffffffffffffff1681565b600854604080517f5909c0d5000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635909c0d5916004808301926020929190829003018186803b158015610d9c57600080fd5b505afa158015610db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dd491908101906137de565b905090565b600854604080517f5a3d5493000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635a3d5493916004808301926020929190829003018186803b158015610d9c57600080fd5b600b5460009060ff16610e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061420f565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600854600090610ed09073ffffffffffffffffffffffffffffffffffffffff166124c7565b601054600c546040517f93f1a40b00000000000000000000000000000000000000000000000000000000815292935060009273ffffffffffffffffffffffffffffffffffffffff909216916393f1a40b91610f2f913090600401614247565b60806040518083038186803b158015610f4757600080fd5b505afa158015610f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f7f91908101906138ef565b5050601054600c546040517fe2bbb15800000000000000000000000000000000000000000000000000000000815293945073ffffffffffffffffffffffffffffffffffffffff9091169263e2bbb1589250610fdf919086906004016142c6565b600060405180830381600087803b158015610ff957600080fd5b505af115801561100d573d6000803e3d6000fd5b5050601054600c546040517f93f1a40b0000000000000000000000000000000000000000000000000000000081526000945073ffffffffffffffffffffffffffffffffffffffff90921692506393f1a40b9161106e91903090600401614247565b60806040518083038186803b15801561108657600080fd5b505afa15801561109a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110be91908101906138ef565b50505090506110f66110ce610b9e565b610965670de0b6b3a76400006110ea858763ffffffff61256c16565b9063ffffffff611f9116565b93506003546000141561112457611115846103e863ffffffff61256c16565b935061112460006103e86125ae565b6000841161115e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061414f565b61116885856125ae565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee85876040516111c79291906142c6565b60405180910390a35050506111da612662565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055919050565b66470de4df82000081565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205481565b60076020526000908152604090205481565b600b5460009060ff16611294576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061420f565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055306000908152600460205260409020546112f0670de0b6b3a76400006109656112e3610b9e565b849063ffffffff611f9116565b91506000821161132c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061418f565b600a54821115611368576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07906141df565b6113723082612753565b601054600c546040517f441a3e7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9092169163441a3e70916113cb9186906004016142c6565b600060405180830381600087803b1580156113e557600080fd5b505af11580156113f9573d6000803e3d6000fd5b505050506114078383612810565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3f693fff038bb8a046aa76d9516190ac7444f7d69cf952c4cbdc086fdef2d6fc84846040516114669291906142c6565b60405180910390a3506111da612662565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156107d55780601f106107aa576101008083540402835291602001916107d5565b6000610a25338484612134565b60125473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b6103e881565b600b5460ff16611560576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061420f565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600a546008546040517f70a0823100000000000000000000000000000000000000000000000000000000815261164c9284926116479273ffffffffffffffffffffffffffffffffffffffff909116906370a08231906115eb903090600401613f78565b60206040518083038186803b15801561160357600080fd5b505afa158015611617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061163b91908101906137de565b9063ffffffff61256c16565b612810565b50600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60115473ffffffffffffffffffffffffffffffffffffffff1681565b600e5473ffffffffffffffffffffffffffffffffffffffff1681565b6116fe878787878787877f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96129ca565b611709878787612079565b50505050505050565b600560209081526000928352604080842090915290825290205481565b6040518060400160405280600381526020017f303234000000000000000000000000000000000000000000000000000000000081525081565b60095473ffffffffffffffffffffffffffffffffffffffff16156117b8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07906141ef565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055604080518082018252601181527f5374616b656420556e69737761702056320000000000000000000000000000006020808301919091528251808401909352600b83527f53544b442d554e492d56320000000000000000000000000000000000000000009083015261185391612b95565b600c889055600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8a811691909117909255600d80548216898416179055600e80548216888416179055600f805482168784161790556010805482168684161790556011805482168584169081179091556012805490921692841692909217905561191990857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612c83565b61196073ffffffffffffffffffffffffffffffffffffffff8216857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612c8316565b6119a773ffffffffffffffffffffffffffffffffffffffff8816847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612c8316565b5050505050505050565b600c5481565b600f5473ffffffffffffffffffffffffffffffffffffffff1681565b600b5460ff16611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061420f565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055333214611a4357600080fd5b6000611a4d612243565b905080611a5a5750611ef0565b6000670de0b6b3a7640000611a7c8366470de4df82000063ffffffff611f9116565b81611a8357fe5b6011549190049150611ab29073ffffffffffffffffffffffffffffffffffffffff16338363ffffffff612dad16565b601154600d54600091829173ffffffffffffffffffffffffffffffffffffffff90811691161480611b005750601154600e5473ffffffffffffffffffffffffffffffffffffffff9081169116145b15611b7a57601154600d5473ffffffffffffffffffffffffffffffffffffffff908116911614611b4f57600e54600d5473ffffffffffffffffffffffffffffffffffffffff9182169116611b70565b600d54600e5473ffffffffffffffffffffffffffffffffffffffff91821691165b9092509050611c9b565b601154601254611bb39173ffffffffffffffffffffffffffffffffffffffff9081169116611bae878763ffffffff61256c16565b612ed0565b601254600d5473ffffffffffffffffffffffffffffffffffffffff90811691161480611bfc5750601254600e5473ffffffffffffffffffffffffffffffffffffffff9081169116145b15611c4b57601254600d5473ffffffffffffffffffffffffffffffffffffffff908116911614611b4f57600e54600d5473ffffffffffffffffffffffffffffffffffffffff9182169116611b70565b601254600d54611c789173ffffffffffffffffffffffffffffffffffffffff9081169116611bae826124c7565b5050600d54600e5473ffffffffffffffffffffffffffffffffffffffff91821691165b6000611cbc8373ffffffffffffffffffffffffffffffffffffffff166124c7565b905060008111611cc857fe5b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611d3357600080fd5b505afa158015611d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d6b919081019061379b565b50600d546dffffffffffffffffffffffffffff92831694509116915060009073ffffffffffffffffffffffffffffffffffffffff878116911614611daf5781611db1565b825b90506000611dbf858361305d565b9050611dcc878783612ed0565b6000611e078888611de3898663ffffffff61256c16565b611e028b73ffffffffffffffffffffffffffffffffffffffff166124c7565b6130de565b601054600c546040517fe2bbb15800000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff9091169163e2bbb15891611e639185906004016142c6565b600060405180830381600087803b158015611e7d57600080fd5b505af1158015611e91573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fc003f45bc224d116b6d079100d4ab57a5b9633244c47a5a92a176c5b79a85f288b8b604051611edd9291906142c6565b60405180910390a2505050505050505050505b611ef8612662565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600b5460ff16611f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061420f565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611ef8612662565b600082611fa057506000610a29565b82820282848281611fad57fe5b0414610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07906141bf565b6000610b6483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506131b6565b60006e0100000000000000000000000000008210612071576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07906141af565b50805b919050565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526005602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906120e1908590614041565b60405180910390a3505050565b6000818484111561212c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07919061411e565b505050900390565b604080518082018252601b81527f496d7065726d61783a205452414e534645525f544f4f5f48494748000000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff86166000908152600490915291909120546121a291839063ffffffff6120ee16565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526004602052604080822093909355908416815220546121e4908263ffffffff61320716565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526004602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906120e1908590614041565b601054600c546040517f441a3e7000000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163441a3e709161229e91908590600401614262565b600060405180830381600087803b1580156122b857600080fd5b505af11580156122cc573d6000803e3d6000fd5b5050601054600c546040517feff8976b0000000000000000000000000000000000000000000000000000000081526060945073ffffffffffffffffffffffffffffffffffffffff909216925063eff8976b9161232b9190600401614041565b60006040518083038186803b15801561234357600080fd5b505afa158015612357573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261239d9190810190613713565b905060005b81518160ff16101561249e576000828260ff16815181106123bf57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663f7c618c16040518163ffffffff1660e01b815260040160206040518083038186803b15801561240c57600080fd5b505afa158015612420573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061244491908101906135a2565b905060006124678273ffffffffffffffffffffffffffffffffffffffff166124c7565b905080156124945760115461249490839073ffffffffffffffffffffffffffffffffffffffff1683612ed0565b50506001016123a2565b506011546124c19073ffffffffffffffffffffffffffffffffffffffff166124c7565b91505090565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319061251c903090600401613f78565b60206040518083038186803b15801561253457600080fd5b505afa158015612548573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a2991908101906137de565b6000610b6483836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f77008152506120ee565b6003546125c1908263ffffffff61320716565b60035573ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260409020546125fa908263ffffffff61320716565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600460205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612656908590614041565b60405180910390a35050565b601054600c546040517f93f1a40b00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff16916393f1a40b916126bd91903090600401614247565b60806040518083038186803b1580156126d557600080fd5b505afa1580156126e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061270d91908101906138ef565b505050905080600a819055507f8a0df8ef054fae2c3d2d19a7b322e864870cc9fd3cb07fb9526309c596244bf4816040516127489190614041565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054612789908263ffffffff61256c16565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600460205260409020556003546127c2908263ffffffff61256c16565b60035560405160009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612656908590614041565b600854604080518082018252601981527f7472616e7366657228616464726573732c75696e7432353629000000000000006020909101525160009160609173ffffffffffffffffffffffffffffffffffffffff909116907fa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b906128999087908790602401614018565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516129229190613f30565b6000604051808303816000865af19150503d806000811461295f576040519150601f19603f3d011682016040523d82523d6000602084013e612964565b606091505b509150915081801561298e57508051158061298e57508080602001905161298e919081019061377d565b6129c4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07906141ff565b50505050565b42851015612a04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061412f565b60065473ffffffffffffffffffffffffffffffffffffffff891660009081526007602090815260408083208054600181019091559051929392612a529286928e928e928e92918e910161404f565b60405160208183030381529060405280519060200120604051602001612a79929190613f3c565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051612ab694939291906140e0565b6020604051602081039080840390855afa158015612ad8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590612b5357508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061419f565b50505050505050505050565b8151612ba890600090602085019061339d565b508051612bbc90600190602084019061339d565b506040514690612bcb90613f6d565b6040805191829003822085516020808801919091208484018452600185527f3100000000000000000000000000000000000000000000000000000000000000948201949094529151612c459391927fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc691869130910161409e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120600655505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663095ea7b38585604051602401612cb6929190614018565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612d049190613f30565b6000604051808303816000865af19150503d8060008114612d41576040519150601f19603f3d011682016040523d82523d6000602084013e612d46565b606091505b5091509150818015612d70575080511580612d70575080806020019051612d70919081019061377d565b612da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061415f565b5050505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612de0929190614018565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612e2e9190613f30565b6000604051808303816000865af19150503d8060008114612e6b576040519150601f19603f3d011682016040523d82523d6000602084013e612e70565b606091505b5091509150818015612e9a575080511580612e9a575080806020019051612e9a919081019061377d565b612da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07906141cf565b60408051600280825260608083018452926020830190803883390190505090508381600081518110612efe57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281600181518110612f4657fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612f8a8483613246565b600f546040517f38ed173900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906338ed173990612fe990859060009086903090429060040161427d565b600060405180830381600087803b15801561300357600080fd5b505af1158015613017573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612da69190810190613748565b6000806130726107cd8463ffffffff611f9116565b90506000613090610f946110ea8681896103e863ffffffff611f9116565b905060006130bc6130b7836130ab868063ffffffff611f9116565b9063ffffffff61320716565b61334c565b90506130d46107ca610965838663ffffffff61256c16565b9695505050505050565b60006130ea8584613246565b6130f48483613246565b600f546040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e8e3370090613159908890889088908890600090819030904290600401613fa1565b606060405180830381600087803b15801561317357600080fd5b505af1158015613187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131ab91908101906138ac565b979650505050505050565b600081836131f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a07919061411e565b5060008385816131fd57fe5b0495945050505050565b600082820183811015610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a079061417f565b600f546040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff8086169263dd62ed3e926132a1923092911690600401613f86565b60206040518083038186803b1580156132b957600080fd5b505afa1580156132cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132f191908101906137de565b106132fb57613348565b600f546133489073ffffffffffffffffffffffffffffffffffffffff84811691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612c8316565b5050565b6000600382111561338f575080600160028204015b818110156133895780915060028182858161337857fe5b04018161338157fe5b049050613361565b50612074565b811561207457506001919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106133de57805160ff191683800117855561340b565b8280016001018555821561340b579182015b8281111561340b5782518255916020019190600101906133f0565b5061341792915061341b565b5090565b610beb91905b808211156134175760008155600101613421565b8035610a29816143fd565b8051610a29816143fd565b600082601f83011261345c57600080fd5b815161346f61346a82614309565b6142e2565b9150818183526020840193506020810190508385602084028201111561349457600080fd5b60005b838110156134c057816134aa8882613440565b8452506020928301929190910190600101613497565b5050505092915050565b600082601f8301126134db57600080fd5b81516134e961346a82614309565b9150818183526020840193506020810190508385602084028201111561350e57600080fd5b60005b838110156134c05781613524888261355b565b8452506020928301929190910190600101613511565b8051610a2981614414565b8035610a298161441d565b8051610a2981614426565b8051610a298161441d565b8051610a298161442f565b8035610a2981614438565b60006020828403121561358e57600080fd5b600061359a8484613435565b949350505050565b6000602082840312156135b457600080fd5b600061359a8484613440565b600080604083850312156135d357600080fd5b60006135df8585613435565b92505060206135f085828601613435565b9150509250929050565b60008060006060848603121561360f57600080fd5b600061361b8686613435565b935050602061362c86828701613435565b925050604061363d86828701613545565b9150509250925092565b600080600080600080600060e0888a03121561366257600080fd5b600061366e8a8a613435565b975050602061367f8a828b01613435565b96505060406136908a828b01613545565b95505060606136a18a828b01613545565b94505060806136b28a828b01613571565b93505060a06136c38a828b01613545565b92505060c06136d48a828b01613545565b91505092959891949750929550565b600080604083850312156136f657600080fd5b60006137028585613435565b92505060206135f085828601613545565b60006020828403121561372557600080fd5b815167ffffffffffffffff81111561373c57600080fd5b61359a8482850161344b565b60006020828403121561375a57600080fd5b815167ffffffffffffffff81111561377157600080fd5b61359a848285016134ca565b60006020828403121561378f57600080fd5b600061359a848461353a565b6000806000606084860312156137b057600080fd5b60006137bc8686613550565b93505060206137cd86828701613550565b925050604061363d86828701613566565b6000602082840312156137f057600080fd5b600061359a848461355b565b600080600080600080600080610100898b03121561381957600080fd5b60006138258b8b613545565b98505060206138368b828c01613435565b97505060406138478b828c01613435565b96505060606138588b828c01613435565b95505060806138698b828c01613435565b94505060a061387a8b828c01613435565b93505060c061388b8b828c01613435565b92505060e061389c8b828c01613435565b9150509295985092959890939650565b6000806000606084860312156138c157600080fd5b60006138cd868661355b565b93505060206138de8682870161355b565b925050604061363d8682870161355b565b6000806000806080858703121561390557600080fd5b6000613911878761355b565b94505060206139228782880161355b565b93505060406139338782880161355b565b92505060606139448782880161355b565b91505092959194509250565b600061395c8383613973565b505060200190565b61396d81614388565b82525050565b61396d8161433d565b600061398782614330565b6139918185614334565b935061399c8361432a565b8060005b838110156139ca5781516139b48882613950565b97506139bf8361432a565b9250506001016139a0565b509495945050505050565b61396d81614348565b61396d81610beb565b61396d6139f382610beb565b610beb565b6000613a0382614330565b613a0d8185612074565b9350613a1d8185602086016143a9565b9290920192915050565b61396d81614393565b6000613a3b82614330565b613a458185614334565b9350613a558185602086016143a9565b613a5e816143d5565b9093019392505050565b6000613a75601183614334565b7f496d7065726d61783a2045585049524544000000000000000000000000000000815260200192915050565b6000613aae601d83614334565b7f496d7065726d61783a20464143544f52595f414c52454144595f534554000000815260200192915050565b6000613ae7601f83614334565b7f5374616b65644c50546f6b656e3a204d494e545f414d4f554e545f5a45524f00815260200192915050565b6000613b20600c83614334565b7f2173616665417070726f76650000000000000000000000000000000000000000815260200192915050565b6000613b59602483614334565b7f5374616b65644c50546f6b656e3a20494e53554646494349454e545f5245534581527f5256455300000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000613bb8600283612074565b7f1901000000000000000000000000000000000000000000000000000000000000815260020192915050565b6000613bf1601b83614334565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000613c2a602183614334565b7f5374616b65644c50546f6b656e3a2052454445454d5f414d4f554e545f5a455281527f4f00000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000613c89601b83614334565b7f496d7065726d61783a20494e56414c49445f5349474e41545552450000000000815260200192915050565b6000613cc2601683614334565b7f5374616b65644c50546f6b656e3a205341464531313200000000000000000000815260200192915050565b6000613cfb605283612074565b7f454950373132446f6d61696e28737472696e67206e616d652c737472696e672081527f76657273696f6e2c75696e7432353620636861696e49642c616464726573732060208201527f766572696679696e67436f6e7472616374290000000000000000000000000000604082015260520192915050565b6000613d80602183614334565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81527f7700000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000613ddf600d83614334565b7f21736166655472616e7366657200000000000000000000000000000000000000815260200192915050565b6000613e18602083614334565b7f5374616b65644c50546f6b656e3a20494e53554646494349454e545f43415348815260200192915050565b6000613e51602283614334565b7f5374616b65644c50546f6b656e3a20464143544f52595f414c52454144595f5381527f4554000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000613eb0601983614334565b7f496d7065726d61783a205452414e534645525f4641494c454400000000000000815260200192915050565b6000613ee9601383614334565b7f496d7065726d61783a205245454e544552454400000000000000000000000000815260200192915050565b61396d8161434d565b61396d81614379565b61396d81614382565b6000610b6482846139f8565b6000613f4782613bab565b9150613f5382856139e7565b602082019150613f6382846139e7565b5060200192915050565b6000610a2982613cee565b60208101610a298284613973565b60408101613f948285613964565b610b646020830184613973565b6101008101613fb0828b613973565b613fbd602083018a613973565b613fca60408301896139de565b613fd760608301886139de565b613fe46080830187613a27565b613ff160a0830186613a27565b613ffe60c0830185613964565b61400b60e08301846139de565b9998505050505050505050565b604081016140268285613973565b610b6460208301846139de565b60208101610a2982846139d5565b60208101610a2982846139de565b60c0810161405d82896139de565b61406a6020830188613973565b6140776040830187613973565b61408460608301866139de565b61409160808301856139de565b6131ab60a08301846139de565b60a081016140ac82886139de565b6140b960208301876139de565b6140c660408301866139de565b6140d360608301856139de565b6130d46080830184613973565b608081016140ee82876139de565b6140fb6020830186613f27565b61410860408301856139de565b61411560608301846139de565b95945050505050565b60208082528101610b648184613a30565b60208082528101610a2981613a68565b60208082528101610a2981613aa1565b60208082528101610a2981613ada565b60208082528101610a2981613b13565b60208082528101610a2981613b4c565b60208082528101610a2981613be4565b60208082528101610a2981613c1d565b60208082528101610a2981613c7c565b60208082528101610a2981613cb5565b60208082528101610a2981613d73565b60208082528101610a2981613dd2565b60208082528101610a2981613e0b565b60208082528101610a2981613e44565b60208082528101610a2981613ea3565b60208082528101610a2981613edc565b6060810161422d8286613f15565b61423a6020830185613f15565b61359a6040830184613f1e565b6040810161425582856139de565b610b646020830184613964565b6040810161427082856139de565b610b646020830184613a27565b60a0810161428b82886139de565b6142986020830187613a27565b81810360408301526142aa818661397c565b90506142b96060830185613964565b6130d460808301846139de565b6040810161402682856139de565b60208101610a298284613f27565b60405181810167ffffffffffffffff8111828210171561430157600080fd5b604052919050565b600067ffffffffffffffff82111561432057600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b6000610a2982614360565b151590565b6dffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b63ffffffff1690565b60ff1690565b6000610a298261439e565b6000610a2982610beb565b6000610a298261433d565b60005b838110156143c45781810151838201526020016143ac565b838111156129c45750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b6144068161433d565b811461441157600080fd5b50565b61440681614348565b61440681610beb565b6144068161434d565b61440681614379565b6144068161438256fea365627a7a72315820a8674e2164fde5da5b792c8ff856056502841baca972a40d8c2c8a6b8c1ad3826c6578706572696d656e74616cf564736f6c63430005100040
Deployed Bytecode Sourcemap
25536:7736:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26872:4;;26866:36;;;;;;;;26840:21;;26872:4;;;26866:19;;26840:21;;26866:36;;;;;26822:15;;26866:36;;;;;;;;26840:21;26872:4;26866:36;;;5:2:-1;;;;30:1;27;20:12;5:2;26866:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26866:36:0;;;;;26788:119;25536:7736;6938:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6938:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;32103:736;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32103:736:0;;;:::i;:::-;;;;;;;;;;8621:132;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8621:132:0;;;;;;;;:::i;:::-;;;;;;;;25629:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25629:43:0;;;:::i;25753:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25753:21:0;;;:::i;:::-;;;;;;;;7014:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7014:23:0;;;:::i;:::-;;;;;;;;8887:299;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8887:299:0;;;;;;;;:::i;9863:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9863:108:0;;;:::i;6984:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6984:26:0;;;:::i;:::-;;;;;;;;7154:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7154:31:0;;;:::i;13995:287::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13995:287:0;;;:::i;30388:127::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30388:127:0;;;:::i;13705:130::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13705:130:0;;;:::i;:::-;;25828:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25828:25:0;;;:::i;32842:130::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32842:130:0;;;:::i;32975:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32975:130:0;;;:::i;27207:890::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27207:890:0;;;;;;;;:::i;25911:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25911:49:0;;;:::i;13276:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13276:25:0;;;:::i;7041:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7041:41:0;;;;;;;;:::i;7189:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7189:38:0;;;;;;;;:::i;28170:562::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28170:562:0;;;;;;;;:::i;6960:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6960:20:0;;;:::i;8758:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8758:124:0;;;;;;;;:::i;25888:19::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25888:19:0;;;:::i;13331:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13331:24:0;;;:::i;13359:45::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13359:45:0;;;:::i;15564:138::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15564:138:0;;;;;;;;:::i;13305:22::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13305:22:0;;;:::i;25857:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25857:27:0;;;:::i;25778:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25778:21:0;;;:::i;9975:235::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9975:235:0;;;;;;;;:::i;7086:61::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7086:61:0;;;;;;;;:::i;25676:48::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25676:48:0;;;:::i;26044:738::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26044:738:0;;;;;;;;:::i;25731:18::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25731:18:0;;;:::i;25803:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25803:21:0;;;:::i;30520:1535::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30520:1535:0;;;:::i;15753:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15753:47:0;;;:::i;6938:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32103:736::-;32149:16;32167;32185:25;32275:10;;;;;;;;;;;32260:38;;;:40;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32260:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32260:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;32260:40:0;;;;;;;;;32374:11;;32217:83;;-1:-1:-1;32217:83:0;;-1:-1:-1;32217:83:0;-1:-1:-1;32370:69:0;;32392:47;;32370:69;32528:12;;32583:10;;32568:40;;;;;;;;32504:21;;32583:10;;;32568:38;;:40;;;;;;;;;;;;;;32583:10;32568:40;;;5:2:-1;;;;30:1;27;20:12;5:2;32568:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32568:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;32568:40:0;;;;;;;;;32545:63;-1:-1:-1;32624:54:0;32632:45;32545:63;32632:27;:13;:27;;;;:17;:27;:::i;:::-;:31;:45;:31;:45;:::i;:::-;32624:7;:54::i;:::-;32613:65;-1:-1:-1;32694:54:0;32702:45;32734:12;32702:27;:13;:27;;;;:17;:27;:::i;32694:54::-;32683:65;;32772:3;32761:8;:14;;;:32;;;;;32790:3;32779:8;:14;;;32761:32;32753:81;;;;;;;;;;;;;;;;;;;;;;32103:736;;;;;;:::o;8621:132::-;8685:4;8696:36;8705:10;8717:7;8726:5;8696:8;:36::i;:::-;-1:-1:-1;8744:4:0;8621:132;;;;;:::o;25629:43::-;25668:4;25629:43;:::o;25753:21::-;;;;;;:::o;7014:23::-;;;;:::o;8887:299::-;8980:15;;;8965:4;8980:15;;;:9;:15;;;;;;;;8996:10;8980:27;;;;;;;;9016:2;8980:39;8976:159;;9057:72;;;;;;;;;;;;;;;;;;;;:15;;;-1:-1:-1;9057:15:0;;;:9;:15;;;;;9073:10;9057:27;;;;;;;;;;:72;;9089:5;;9057:72;:31;:72;:::i;:::-;9027:15;;;;;;;:9;:15;;;;;;;;9043:10;9027:27;;;;;;;:102;8976:159;9139:26;9149:4;9155:2;9159:5;9139:9;:26::i;:::-;-1:-1:-1;9177:4:0;8887:299;;;;;;:::o;9863:108::-;9905:66;9863:108;:::o;6984:26::-;;;;;;:::o;7154:31::-;;;;:::o;13995:287::-;14069:11;;14121:12;;14035:4;;14069:11;14157:17;;;:39;;-1:-1:-1;14178:18:0;;14157:39;14153:71;;;13268:4;14198:26;;;;;;14153:71;14236:41;14264:12;14236:23;:13;14254:4;14236:23;:17;:23;:::i;:41::-;14229:48;;;;13995:287;;:::o;30388:127::-;16411:11;;30440:7;;16411:11;;16403:43;;;;;;;;;;;;;;16451:11;:19;;;;;;30462:10;30476:9;30462:23;30454:32;;;;;;30498:12;:10;:12::i;:::-;30491:19;;16481:11;:18;;;;16495:4;16481:18;;;30388:127;:::o;13705:130::-;13750:7;;:21;:7;:21;13742:63;;;;;;;;;;;;;;13810:7;:20;;;;13820:10;13810:20;;;13705:130::o;25828:25::-;;;;;;:::o;32842:130::-;32933:10;;32918:49;;;;;;;;32897:7;;32933:10;;;32918:47;;:49;;;;;;;;;;;;;;32933:10;32918:49;;;5:2:-1;;;;30:1;27;20:12;5:2;32918:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32918:49:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;32918:49:0;;;;;;;;;32911:56;;32842:130;:::o;32975:::-;33066:10;;33051:49;;;;;;;;33030:7;;33066:10;;;33051:47;;:49;;;;;;;;;;;;;;33066:10;33051:49;;;5:2:-1;;;;30:1;27;20:12;27207:890:0;16411:11;;27275:15;;16411:11;;16403:43;;;;;;;;;;;;;;16451:11;:19;;;;;;27315:10;;16465:5;;27315:22;;:10;;:20;:22::i;:::-;27474:10;;27495:3;;27459:55;;;;;27297:40;;-1:-1:-1;27425:27:0;;27474:10;;;;;27459:35;;:55;;27508:4;;27459:55;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27459:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27459:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;27459:55:0;;;;;;;;;-1:-1:-1;;27534:10:0;;27554:3;;27519:51;;;;;27424:90;;-1:-1:-1;27534:10:0;;;;;27519:34;;-1:-1:-1;27519:51:0;;27554:3;27559:10;;27519:51;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27519:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;27624:10:0;;27645:3;;27609:55;;;;;27576:26;;-1:-1:-1;27624:10:0;;;;;-1:-1:-1;27609:35:0;;:55;;27645:3;27658:4;;27609:55;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27609:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27609:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;27609:55:0;;;;;;;;;27575:89;;;;;27682:73;27740:14;:12;:14::i;:::-;27682:53;27730:4;27682:43;:18;27705:19;27682:43;:22;:43;:::i;:::-;:47;:53;:47;:53;:::i;:73::-;27669:86;;27765:11;;27780:1;27765:16;27762:180;;;27861:33;:10;13400:4;27861:33;:14;:33;:::i;:::-;27848:46;;27900:36;27914:1;13400:4;27900:5;:36::i;:::-;27967:1;27954:10;:14;27946:58;;;;;;;;;;;;;;28009:25;28015:6;28023:10;28009:5;:25::i;:::-;28061:6;28044:48;;28049:10;28044:48;;;28069:10;28081;28044:48;;;;;;;;;;;;;;;;16579:1;;;16585:9;:7;:9::i;:::-;16481:11;:18;;;;16495:4;16481:18;;;27207:890;;-1:-1:-1;27207:890:0:o;25911:49::-;25953:7;25911:49;:::o;13276:25::-;;;;;;:::o;7041:41::-;;;;;;;;;;;;;:::o;7189:38::-;;;;;;;;;;;;;:::o;28170:562::-;16411:11;;28242:17;;16411:11;;16403:43;;;;;;;;;;;;;;16451:11;:19;;;;;;28304:4;16465:5;28286:24;;;:9;:24;;;;;;28330:42;28367:4;28330:32;28347:14;:12;:14::i;:::-;28330:12;;:32;:16;:32;:::i;:42::-;28315:57;;28402:1;28387:12;:16;28379:62;;;;;;;;;;;;;;28470:12;;28454;:28;;28446:73;;;;;;;;;;;;;;28524:34;28538:4;28545:12;28524:5;:34::i;:::-;28578:10;;28599:3;;28563:54;;;;;28578:10;;;;;28563:35;;:54;;28604:12;;28563:54;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28563:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28563:54:0;;;;28622:37;28636:8;28646:12;28622:13;:37::i;:::-;28688:8;28669:56;;28676:10;28669:56;;;28698:12;28712;28669:56;;;;;;;;;;;;;;;;16579:1;16585:9;:7;:9::i;6960:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8758:124;8818:4;8829:32;8839:10;8851:2;8855:5;8829:9;:32::i;25888:19::-;;;;;;:::o;13331:24::-;;;;:::o;13359:45::-;13400:4;13359:45;:::o;15564:138::-;16411:11;;;;16403:43;;;;;;;;;;;;;;16451:11;:19;;;;;;15683:12;;15642:10;;15635:43;;;;;15617:80;;15631:2;;15635:61;;15642:10;;;;;15635:28;;:43;;15672:4;;15635:43;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15635:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15635:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15635:43:0;;;;;;;;;:47;:61;:47;:61;:::i;:::-;15617:13;:80::i;:::-;-1:-1:-1;16481:11:0;:18;;;;16495:4;16481:18;;;15564:138::o;13305:22::-;;;;;;:::o;25857:27::-;;;;;;:::o;25778:21::-;;;;;;:::o;9975:235::-;10095:74;10111:5;10118:7;10127:5;10134:8;10144:1;10147;10150;9905:66;10095:15;:74::i;:::-;10174:31;10183:5;10190:7;10199:5;10174:8;:31::i;:::-;9975:235;;;;;;;:::o;7086:61::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;25676:48::-;;;;;;;;;;;;;;;;;;;:::o;26044:738::-;26260:7;;:21;:7;:21;26252:68;;;;;;;;;;;;;;26345:7;:20;;;;26355:10;26345:20;;;26370:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:44::i;:::-;26419:3;:10;;;26434;:24;;;;;;;;;;;;;;;;;26463:6;:16;;;;;;;;;;26484:6;:16;;;;;;;;;;26505:6;:16;;;;;;;;;;26526:10;:24;;;;;;;;;;26555:12;:28;;;;;;;;;;;;;26588:4;:12;;;;;;;;;;;;;;26605:56;;26505:16;-1:-1:-1;26605:25:0;:56::i;:::-;26666:48;:17;;;26692:7;26710:2;26666:48;:17;:48;:::i;:::-;26719:58;:23;;;26751:11;26773:2;26719:58;:23;:58;:::i;:::-;26044:738;;;;;;;;:::o;25731:18::-;;;;:::o;25803:21::-;;;;;;:::o;30520:1535::-;16411:11;;;;16403:43;;;;;;;;;;;;;;16451:11;:19;;;;;;30582:10;30596:9;30582:23;30574:32;;;;;;30648:14;30665:12;:10;:12::i;:::-;30648:29;-1:-1:-1;30686:11:0;30682:24;;30699:7;;;30682:24;30757:14;30804:4;30774:27;:6;25953:7;30774:27;:10;:27;:::i;:::-;:34;;;;;30813:12;;30774:34;;;;-1:-1:-1;30813:45:0;;:12;;30839:10;30774:34;30813:45;:25;:45;:::i;:::-;30979:12;;30969:6;;30927:14;;;;30979:12;30969:6;;;30979:12;;30969:22;;:48;;-1:-1:-1;31005:12:0;;30995:6;;31005:12;30995:6;;;31005:12;;30995:22;30969:48;30965:481;;;31054:12;;31044:6;;31054:12;31044:6;;;31054:12;;31044:22;:60;;31089:6;;31097;;31089;;;;;31097;31044:60;;;31070:6;;31078;;31070;;;;;31078;31044:60;31025:79;;-1:-1:-1;31025:79:0;-1:-1:-1;30965:481:0;;;31150:12;;31164:4;;31125:64;;31150:12;;;;;31164:4;31170:18;:6;31181;31170:18;:10;:18;:::i;:::-;31125:24;:64::i;:::-;31209:4;;31199:6;;31209:4;31199:6;;;31209:4;;31199:14;;:32;;-1:-1:-1;31227:4:0;;31217:6;;31227:4;31217:6;;;31227:4;;31217:14;31199:32;31195:246;;;31270:4;;31260:6;;31270:4;31260:6;;;31270:4;;31260:14;:52;;31297:6;;31305;;31297;;;;;31305;31260:52;;31195:246;31361:4;;31367:6;;31336:56;;31361:4;;;;;31367:6;31375:16;31361:4;31375:14;:16::i;31336:56::-;-1:-1:-1;;31419:6:0;;31427;;31419;;;;;31427;31195:246;31499:20;31522:18;:6;:16;;;:18::i;:::-;31499:41;;31567:1;31552:12;:16;31545:24;;;;31575:10;31587;31617;;;;;;;;;;;31602:38;;;:40;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31602:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31602:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;31602:40:0;;;;;;;;;-1:-1:-1;31676:6:0;;31574:68;;;;;-1:-1:-1;31574:68:0;;;-1:-1:-1;31647:16:0;;31676:6;31666:16;;;31676:6;;31666:16;:26;;31690:2;31666:26;;;31685:2;31666:26;31647:45;;31697:18;31718:40;31735:12;31749:8;31718:16;:40::i;:::-;31697:61;;31763:52;31788:6;31796;31804:10;31763:24;:52::i;:::-;31820:17;31840:78;31853:6;31861;31869:28;:12;31886:10;31869:28;:16;:28;:::i;:::-;31899:18;:6;:16;;;:18::i;:::-;31840:12;:78::i;:::-;31969:10;;31989:3;;31954:50;;;;;31820:98;;-1:-1:-1;31969:10:0;;;;;31954:34;;:50;;31820:98;;31954:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31954:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31954:50:0;;;;32023:10;32014:36;;;32035:6;32043;32014:36;;;;;;;;;;;;;;;;16579:1;;;;;;;;;;;16585:9;:7;:9::i;:::-;16481:11;:18;;;;16495:4;16481:18;;;30520:1535::o;15753:47::-;16411:11;;;;16403:43;;;;;;;;;;;;;;16451:11;:19;;;;;;16585:9;:7;:9::i;2785:471::-;2843:7;3088:6;3084:47;;-1:-1:-1;3118:1:0;3111:8;;3084:47;3155:5;;;3159:1;3155;:5;:1;3179:5;;;;;:10;3171:56;;;;;;;;;;;;;4443:132;4501:7;4528:39;4532:1;4535;4528:39;;;;;;;;;;;;;;;;;:3;:39::i;33135:134::-;33183:7;33209:6;33205:1;:10;33197:45;;;;;;;;;;;;;;-1:-1:-1;33262:1:0;33135:134;;;;:::o;8226:154::-;8301:16;;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;;:33;;;8344:31;;;;;8329:5;;8344:31;;;;;;;;;;8226:154;;;:::o;2350:192::-;2436:7;2472:12;2464:6;;;;2456:29;;;;;;;;;;;;;;;-1:-1:-1;;;2508:5:0;;;2350:192::o;8385:231::-;8474:57;;;;;;;;;;;;;;;;;;;;:15;;;-1:-1:-1;8474:15:0;;;:9;:15;;;;;;;;:57;;8494:5;;8474:57;:19;:57;:::i;:::-;8456:15;;;;;;;;:9;:15;;;;;;:75;;;;8552:13;;;;;;;:24;;8570:5;8552:24;:17;:24;:::i;:::-;8536:13;;;;;;;;:9;:13;;;;;;;:40;;;;8586:25;;;;;;;;;;8605:5;;8586:25;;29907:475;29976:10;;29997:3;;29961:43;;;;;29947:7;;29976:10;;;29961:35;;:43;;29997:3;29947:7;;29961:43;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29961:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;30053:10:0;;30079:3;;30038:45;;;;;30009:26;;-1:-1:-1;30053:10:0;;;;;-1:-1:-1;30038:40:0;;:45;;30079:3;30038:45;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30038:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30038:45:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;30038:45:0;80:15:-1;;;97:9;76:31;65:43;;120:4;113:20;30038:45:0;;;;;;;;;30009:74;-1:-1:-1;30093:7:0;30088:254;30110:9;:16;30106:1;:20;;;30088:254;;;30139:13;30172:9;30182:1;30172:12;;;;;;;;;;;;;;;;30155:42;;;:44;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30155:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30155:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30155:44:0;;;;;;;;;30139:60;;30205:17;30225;:5;:15;;;:17::i;:::-;30205:37;-1:-1:-1;30252:13:0;;30248:89;;30306:12;;30274:56;;30299:5;;30306:12;;30320:9;30274:24;:56::i;:::-;-1:-1:-1;;30128:3:0;;30088:254;;;-1:-1:-1;30353:12:0;;:24;;:12;;:22;:24::i;:::-;30346:31;;;29907:475;:::o;23066:138::-;23150:46;;;;;23123:7;;23150:31;;;;;;:46;;23190:4;;23150:46;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23150:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23150:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23150:46:0;;;;;;;;1924:137;1982:7;2009:44;2013:1;2016;2009:44;;;;;;;;;;;;;;;;;:3;:44::i;7848:180::-;7915:11;;:22;;7931:5;7915:22;:15;:22;:::i;:::-;7901:11;:36;7958:13;;;;;;;:9;:13;;;;;;:24;;7976:5;7958:24;:17;:24;:::i;:::-;7942:13;;;;;;;:9;:13;;;;;;:40;;;;7992:31;;7942:13;;;7992:31;;;;8017:5;;7992:31;;;;;;;;;;7848:180;;:::o;26949:184::-;27026:10;;27047:3;;27011:55;;;;;26983:21;;27026:10;;;27011:35;;:55;;27047:3;27060:4;;27011:55;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27011:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27011:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;27011:55:0;;;;;;;;;26982:84;;;;;27086:13;27071:12;:28;;;;27109:19;27114:13;27109:19;;;;;;;;;;;;;;;26949:184;:::o;8033:188::-;8106:15;;;;;;;:9;:15;;;;;;:26;;8126:5;8106:26;:19;:26;:::i;:::-;8088:15;;;;;;;:9;:15;;;;;:44;8151:11;;:22;;8167:5;8151:22;:15;:22;:::i;:::-;8137:11;:36;8183:33;;8206:1;;8183:33;;;;;;;;8210:5;;8183:33;;15998:264;16096:10;;15958:34;;;;;;;;;;;;;;;;;16112:44;16061:12;;16075:17;;16096:10;;;;;15948:45;;16112:44;;16145:2;;16149:6;;16112:44;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;16112:44:0;;;49:4:-1;25:18;;61:17;;16112:44:0;182:15:-1;16112:44:0;;;;179:29:-1;;;;160:49;;;16096:61:0;;;;16112:44;16096:61;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;16060:97:0;;;;16170:7;:57;;;;-1:-1:-1;16182:11:0;;:16;;:44;;;16213:4;16202:24;;;;;;;;;;;;;;16162:95;;;;;;;;;;;;;;15998:264;;;;:::o;9192:564::-;9359:15;9347:8;:27;;9339:57;;;;;;;;;;;;;;9473:16;;9550:13;;;9401:14;9550:13;;;:6;:13;;;;;;;;:15;;;;;;;;9506:70;;9401:14;;9473:16;9506:70;;9517:8;;9527:5;;9534:7;;9543:5;;9550:15;9567:8;;9506:70;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9506:70:0;;;9496:81;;;;;;9433:150;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9433:150:0;;;9418:170;;;;;;9401:187;;9593:24;9620:26;9630:6;9638:1;9641;9644;9620:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;9620:26:0;;;;;;-1:-1:-1;;9659:30:0;;;;;;;:59;;;9713:5;9693:25;;:16;:25;;;9659:59;9651:99;;;;;;;;;;;;;;9192:564;;;;;;;;;;:::o;7416:427::-;7492:12;;;;:4;;:12;;;;;:::i;:::-;-1:-1:-1;7509:16:0;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;7640:95:0;;7573:7;;7640:95;;;;;;;;;;;;;;7742:23;;;;;;;;;;7782:10;;;;;;;;;;;;;;;;7623:210;;;;7640:95;;7772:21;;7800:7;;7822:4;;7623:210;;;;;;;22:32:-1;26:21;;;22:32;6:49;;7623:210:0;;;7608:230;;49:4:-1;7608:230:0;;;;7589:16;:249;-1:-1:-1;;;7416:427:0:o;23363:343::-;23513:12;23527:17;23548:5;:10;;23582;23594:2;23598:5;23559:45;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;23559:45:0;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;23559:45:0;23548:57;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;23512:93:0;;;;23624:7;:57;;;;-1:-1:-1;23636:11:0;;:16;;:44;;;23667:4;23656:24;;;;;;;;;;;;;;23616:82;;;;;;;;;;;;;;23363:343;;;;;:::o;23714:346::-;23866:12;23880:17;23901:5;:10;;23935;23947:2;23951:5;23912:45;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;23912:45:0;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;23912:45:0;23901:57;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;23865:93:0;;;;23977:7;:57;;;;-1:-1:-1;23989:11:0;;:16;;:44;;;24020:4;24009:24;;;;;;;;;;;;;;23969:83;;;;;;;;;;;;;29240:335;29363:16;;;29377:1;29363:16;;;29339:21;29363:16;;;;;29339:21;29363:16;;;;;105:10:-1;29363:16:0;88:34:-1;136:17;;-1:-1;29363:16:0;29339:40;;29402:7;29384:4;29389:1;29384:7;;;;;;;;;;;;;:26;;;;;;;;;;;29433:8;29415:4;29420:1;29415:7;;;;;;;;;;;;;:27;;;;;;;;;;;29447:30;29461:7;29470:6;29447:13;:30::i;:::-;29501:6;;29482:88;;;;;29501:6;;;;;29482:51;;:88;;29534:6;;29501;;29545:4;;29559;;29566:3;;29482:88;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29482:88:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29482:88:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;29482:88:0;80:15:-1;;;97:9;76:31;65:43;;120:4;113:20;29482:88:0;;;;;;;;28762:273;28846:7;;28872:27;28880:4;28890:8;28872:27;:17;:27;:::i;:::-;28860:39;-1:-1:-1;28904:9:0;28916:41;28952:4;28916:31;28938:8;28916:31;:7;28928:4;28916:17;:11;:17;:::i;:41::-;28904:53;-1:-1:-1;28962:9:0;28974:26;28984:15;28904:53;28984:8;28990:1;;28984:8;:5;:8;:::i;:::-;:12;:15;:12;:15;:::i;:::-;28974:9;:26::i;:::-;28962:38;-1:-1:-1;29012:18:0;29025:4;29012:8;28962:38;29018:1;29012:8;:5;:8;:::i;:18::-;29005:25;28762:273;-1:-1:-1;;;;;;28762:273:0:o;29581:320::-;29687:17;29711:30;29725:6;29733:7;29711:13;:30::i;:::-;29746;29760:6;29768:7;29746:13;:30::i;:::-;29816:6;;29797:99;;;;;29816:6;;;;;29797:39;;:99;;29837:6;;29845;;29853:7;;29862;;29816:6;;;;29885:4;;29892:3;;29797:99;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29797:99:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29797:99:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;29797:99:0;;;;;;;;;29781:115;29581:320;-1:-1:-1;;;;;;;29581:320:0:o;5063:345::-;5149:7;5251:12;5244:5;5236:28;;;;;;;;;;;;;;;;5275:9;5291:1;5287;:5;;;;;;;5063:345;-1:-1:-1;;;;;5063:345:0:o;1031:181::-;1089:7;1121:5;;;1145:6;;;;1137:46;;;;;;;;;;;;;29041:193;29152:6;;29113:46;;;;;29163:6;;29113:23;;;;;;;:46;;29145:4;;29152:6;;;29113:46;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29113:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29113:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;29113:46:0;;;;;;;;;:56;29109:69;;29171:7;;29109:69;29208:6;;29182:47;;29208:6;29182:17;;;;29208:6;29225:2;29182:47;:17;:47;:::i;:::-;29041:193;;:::o;25108:303::-;25153:6;25180:1;25176;:5;25172:232;;;-1:-1:-1;25202:1:0;25235;25231;25227:5;;:9;25251:92;25262:1;25258;:5;25251:92;;;25288:1;25284:5;;25326:1;25321;25317;25313;:5;;;;;;:9;25312:15;;;;;;25308:19;;25251:92;;;25172:232;;;;25364:6;;25360:44;;-1:-1:-1;25391:1:0;25108:303;;;:::o;25536:7736::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25536:7736:0;;;-1:-1:-1;25536:7736:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;5:130:-1;72:20;;97:33;72:20;97:33;;142:134;220:13;;238:33;220:13;238:33;;301:722;;429:3;422:4;414:6;410:17;406:27;396:2;;447:1;444;437:12;396:2;477:6;471:13;499:80;514:64;571:6;514:64;;;499:80;;;490:89;;596:5;621:6;614:5;607:21;651:4;643:6;639:17;629:27;;673:4;668:3;664:14;657:21;;726:6;773:3;765:4;757:6;753:17;748:3;744:27;741:36;738:2;;;790:1;787;780:12;738:2;815:1;800:217;825:6;822:1;819:13;800:217;;;883:3;905:48;949:3;937:10;905:48;;;893:61;;-1:-1;977:4;968:14;;;;996;;;;;847:1;840:9;800:217;;;804:14;389:634;;;;;;;;1049:722;;1177:3;1170:4;1162:6;1158:17;1154:27;1144:2;;1195:1;1192;1185:12;1144:2;1225:6;1219:13;1247:80;1262:64;1319:6;1262:64;;1247:80;1238:89;;1344:5;1369:6;1362:5;1355:21;1399:4;1391:6;1387:17;1377:27;;1421:4;1416:3;1412:14;1405:21;;1474:6;1521:3;1513:4;1505:6;1501:17;1496:3;1492:27;1489:36;1486:2;;;1538:1;1535;1528:12;1486:2;1563:1;1548:217;1573:6;1570:1;1567:13;1548:217;;;1631:3;1653:48;1697:3;1685:10;1653:48;;;1641:61;;-1:-1;1725:4;1716:14;;;;1744;;;;;1595:1;1588:9;1548:217;;1779:128;1854:13;;1872:30;1854:13;1872:30;;1914:130;1981:20;;2006:33;1981:20;2006:33;;2051:134;2129:13;;2147:33;2129:13;2147:33;;2329:134;2407:13;;2425:33;2407:13;2425:33;;2470:132;2547:13;;2565:32;2547:13;2565:32;;2609:126;2674:20;;2699:31;2674:20;2699:31;;2742:241;;2846:2;2834:9;2825:7;2821:23;2817:32;2814:2;;;2862:1;2859;2852:12;2814:2;2897:1;2914:53;2959:7;2939:9;2914:53;;;2904:63;2808:175;-1:-1;;;;2808:175;2990:263;;3105:2;3093:9;3084:7;3080:23;3076:32;3073:2;;;3121:1;3118;3111:12;3073:2;3156:1;3173:64;3229:7;3209:9;3173:64;;3260:366;;;3381:2;3369:9;3360:7;3356:23;3352:32;3349:2;;;3397:1;3394;3387:12;3349:2;3432:1;3449:53;3494:7;3474:9;3449:53;;;3439:63;;3411:97;3539:2;3557:53;3602:7;3593:6;3582:9;3578:22;3557:53;;;3547:63;;3518:98;3343:283;;;;;;3633:491;;;;3771:2;3759:9;3750:7;3746:23;3742:32;3739:2;;;3787:1;3784;3777:12;3739:2;3822:1;3839:53;3884:7;3864:9;3839:53;;;3829:63;;3801:97;3929:2;3947:53;3992:7;3983:6;3972:9;3968:22;3947:53;;;3937:63;;3908:98;4037:2;4055:53;4100:7;4091:6;4080:9;4076:22;4055:53;;;4045:63;;4016:98;3733:391;;;;;;4131:991;;;;;;;;4335:3;4323:9;4314:7;4310:23;4306:33;4303:2;;;4352:1;4349;4342:12;4303:2;4387:1;4404:53;4449:7;4429:9;4404:53;;;4394:63;;4366:97;4494:2;4512:53;4557:7;4548:6;4537:9;4533:22;4512:53;;;4502:63;;4473:98;4602:2;4620:53;4665:7;4656:6;4645:9;4641:22;4620:53;;;4610:63;;4581:98;4710:2;4728:53;4773:7;4764:6;4753:9;4749:22;4728:53;;;4718:63;;4689:98;4818:3;4837:51;4880:7;4871:6;4860:9;4856:22;4837:51;;;4827:61;;4797:97;4925:3;4944:53;4989:7;4980:6;4969:9;4965:22;4944:53;;;4934:63;;4904:99;5034:3;5053:53;5098:7;5089:6;5078:9;5074:22;5053:53;;;5043:63;;5013:99;4297:825;;;;;;;;;;;5129:366;;;5250:2;5238:9;5229:7;5225:23;5221:32;5218:2;;;5266:1;5263;5256:12;5218:2;5301:1;5318:53;5363:7;5343:9;5318:53;;;5308:63;;5280:97;5408:2;5426:53;5471:7;5462:6;5451:9;5447:22;5426:53;;5502:392;;5642:2;5630:9;5621:7;5617:23;5613:32;5610:2;;;5658:1;5655;5648:12;5610:2;5693:24;;5737:18;5726:30;;5723:2;;;5769:1;5766;5759:12;5723:2;5789:89;5870:7;5861:6;5850:9;5846:22;5789:89;;5901:392;;6041:2;6029:9;6020:7;6016:23;6012:32;6009:2;;;6057:1;6054;6047:12;6009:2;6092:24;;6136:18;6125:30;;6122:2;;;6168:1;6165;6158:12;6122:2;6188:89;6269:7;6260:6;6249:9;6245:22;6188:89;;6300:257;;6412:2;6400:9;6391:7;6387:23;6383:32;6380:2;;;6428:1;6425;6418:12;6380:2;6463:1;6480:61;6533:7;6513:9;6480:61;;6564:533;;;;6712:2;6700:9;6691:7;6687:23;6683:32;6680:2;;;6728:1;6725;6718:12;6680:2;6763:1;6780:64;6836:7;6816:9;6780:64;;;6770:74;;6742:108;6881:2;6899:64;6955:7;6946:6;6935:9;6931:22;6899:64;;;6889:74;;6860:109;7000:2;7018:63;7073:7;7064:6;7053:9;7049:22;7018:63;;7104:263;;7219:2;7207:9;7198:7;7194:23;7190:32;7187:2;;;7235:1;7232;7225:12;7187:2;7270:1;7287:64;7343:7;7323:9;7287:64;;7374:1121;;;;;;;;;7597:3;7585:9;7576:7;7572:23;7568:33;7565:2;;;7614:1;7611;7604:12;7565:2;7649:1;7666:53;7711:7;7691:9;7666:53;;;7656:63;;7628:97;7756:2;7774:53;7819:7;7810:6;7799:9;7795:22;7774:53;;;7764:63;;7735:98;7864:2;7882:53;7927:7;7918:6;7907:9;7903:22;7882:53;;;7872:63;;7843:98;7972:2;7990:53;8035:7;8026:6;8015:9;8011:22;7990:53;;;7980:63;;7951:98;8080:3;8099:53;8144:7;8135:6;8124:9;8120:22;8099:53;;;8089:63;;8059:99;8189:3;8208:53;8253:7;8244:6;8233:9;8229:22;8208:53;;;8198:63;;8168:99;8298:3;8317:53;8362:7;8353:6;8342:9;8338:22;8317:53;;;8307:63;;8277:99;8407:3;8426:53;8471:7;8462:6;8451:9;8447:22;8426:53;;;8416:63;;8386:99;7559:936;;;;;;;;;;;;8502:535;;;;8651:2;8639:9;8630:7;8626:23;8622:32;8619:2;;;8667:1;8664;8657:12;8619:2;8702:1;8719:64;8775:7;8755:9;8719:64;;;8709:74;;8681:108;8820:2;8838:64;8894:7;8885:6;8874:9;8870:22;8838:64;;;8828:74;;8799:109;8939:2;8957:64;9013:7;9004:6;8993:9;8989:22;8957:64;;9044:672;;;;;9210:3;9198:9;9189:7;9185:23;9181:33;9178:2;;;9227:1;9224;9217:12;9178:2;9262:1;9279:64;9335:7;9315:9;9279:64;;;9269:74;;9241:108;9380:2;9398:64;9454:7;9445:6;9434:9;9430:22;9398:64;;;9388:74;;9359:109;9499:2;9517:64;9573:7;9564:6;9553:9;9549:22;9517:64;;;9507:74;;9478:109;9618:2;9636:64;9692:7;9683:6;9672:9;9668:22;9636:64;;;9626:74;;9597:109;9172:544;;;;;;;;9724:173;;9811:46;9853:3;9845:6;9811:46;;;-1:-1;;9886:4;9877:14;;9804:93;9905:142;9996:45;10035:5;9996:45;;;9991:3;9984:58;9978:69;;;10054:103;10127:24;10145:5;10127:24;;10315:690;;10460:54;10508:5;10460:54;;;10527:86;10606:6;10601:3;10527:86;;;10520:93;;10634:56;10684:5;10634:56;;;10710:7;10738:1;10723:260;10748:6;10745:1;10742:13;10723:260;;;10815:6;10809:13;10836:63;10895:3;10880:13;10836:63;;;10829:70;;10916:60;10969:6;10916:60;;;10906:70;-1:-1;;10770:1;10763:9;10723:260;;;-1:-1;10996:3;;10439:566;-1:-1;;;;;10439:566;11013:104;11090:21;11105:5;11090:21;;11124:113;11207:24;11225:5;11207:24;;11244:152;11345:45;11365:24;11383:5;11365:24;;;11345:45;;11403:356;;11531:38;11563:5;11531:38;;;11581:88;11662:6;11657:3;11581:88;;;11574:95;;11674:52;11719:6;11714:3;11707:4;11700:5;11696:16;11674:52;;;11738:16;;;;;11511:248;-1:-1;;11511:248;11766:142;11857:45;11896:5;11857:45;;11915:347;;12027:39;12060:5;12027:39;;;12078:71;12142:6;12137:3;12078:71;;;12071:78;;12154:52;12199:6;12194:3;12187:4;12180:5;12176:16;12154:52;;;12227:29;12249:6;12227:29;;;12218:39;;;;12007:255;-1:-1;;;12007:255;12616:317;;12776:67;12840:2;12835:3;12776:67;;;12876:19;12856:40;;12924:2;12915:12;;12762:171;-1:-1;;12762:171;12942:329;;13102:67;13166:2;13161:3;13102:67;;;13202:31;13182:52;;13262:2;13253:12;;13088:183;-1:-1;;13088:183;13280:331;;13440:67;13504:2;13499:3;13440:67;;;13540:33;13520:54;;13602:2;13593:12;;13426:185;-1:-1;;13426:185;13620:312;;13780:67;13844:2;13839:3;13780:67;;;13880:14;13860:35;;13923:2;13914:12;;13766:166;-1:-1;;13766:166;13941:373;;14101:67;14165:2;14160:3;14101:67;;;14201:34;14181:55;;14270:6;14265:2;14256:12;;14249:28;14305:2;14296:12;;14087:227;-1:-1;;14087:227;14323:398;;14501:84;14583:1;14578:3;14501:84;;;14618:66;14598:87;;14713:1;14704:11;;14487:234;-1:-1;;14487:234;14730:327;;14890:67;14954:2;14949:3;14890:67;;;14990:29;14970:50;;15048:2;15039:12;;14876:181;-1:-1;;14876:181;15066:370;;15226:67;15290:2;15285:3;15226:67;;;15326:34;15306:55;;15395:3;15390:2;15381:12;;15374:25;15427:2;15418:12;;15212:224;-1:-1;;15212:224;15445:327;;15605:67;15669:2;15664:3;15605:67;;;15705:29;15685:50;;15763:2;15754:12;;15591:181;-1:-1;;15591:181;15781:322;;15941:67;16005:2;16000:3;15941:67;;;16041:24;16021:45;;16094:2;16085:12;;15927:176;-1:-1;;15927:176;16112:492;;16290:85;16372:2;16367:3;16290:85;;;16408:34;16388:55;;16477:34;16472:2;16463:12;;16456:56;16546:20;16541:2;16532:12;;16525:42;16595:2;16586:12;;16276:328;-1:-1;;16276:328;16613:370;;16773:67;16837:2;16832:3;16773:67;;;16873:34;16853:55;;16942:3;16937:2;16928:12;;16921:25;16974:2;16965:12;;16759:224;-1:-1;;16759:224;16992:313;;17152:67;17216:2;17211:3;17152:67;;;17252:15;17232:36;;17296:2;17287:12;;17138:167;-1:-1;;17138:167;17314:332;;17474:67;17538:2;17533:3;17474:67;;;17574:34;17554:55;;17637:2;17628:12;;17460:186;-1:-1;;17460:186;17655:371;;17815:67;17879:2;17874:3;17815:67;;;17915:34;17895:55;;17984:4;17979:2;17970:12;;17963:26;18017:2;18008:12;;17801:225;-1:-1;;17801:225;18035:325;;18195:67;18259:2;18254:3;18195:67;;;18295:27;18275:48;;18351:2;18342:12;;18181:179;-1:-1;;18181:179;18369:319;;18529:67;18593:2;18588:3;18529:67;;;18629:21;18609:42;;18679:2;18670:12;;18515:173;-1:-1;;18515:173;18696:113;18779:24;18797:5;18779:24;;18936:110;19017:23;19034:5;19017:23;;19053:107;19132:22;19148:5;19132:22;;19167:262;;19311:93;19400:3;19391:6;19311:93;;19436:650;;19691:148;19835:3;19691:148;;;19684:155;;19850:75;19921:3;19912:6;19850:75;;;19947:2;19942:3;19938:12;19931:19;;19961:75;20032:3;20023:6;19961:75;;;-1:-1;20058:2;20049:12;;19672:414;-1:-1;;19672:414;20093:372;;20292:148;20436:3;20292:148;;20472:213;20590:2;20575:18;;20604:71;20579:9;20648:6;20604:71;;20692:340;20846:2;20831:18;;20860:79;20835:9;20912:6;20860:79;;;20950:72;21018:2;21007:9;21003:18;20994:6;20950:72;;21039:1043;21377:3;21362:19;;21392:71;21366:9;21436:6;21392:71;;;21474:72;21542:2;21531:9;21527:18;21518:6;21474:72;;;21557;21625:2;21614:9;21610:18;21601:6;21557:72;;;21640;21708:2;21697:9;21693:18;21684:6;21640:72;;;21723:81;21799:3;21788:9;21784:19;21775:6;21723:81;;;21815;21891:3;21880:9;21876:19;21867:6;21815:81;;;21907;21983:3;21972:9;21968:19;21959:6;21907:81;;;21999:73;22067:3;22056:9;22052:19;22043:6;21999:73;;;21348:734;;;;;;;;;;;;22089:324;22235:2;22220:18;;22249:71;22224:9;22293:6;22249:71;;;22331:72;22399:2;22388:9;22384:18;22375:6;22331:72;;22420:201;22532:2;22517:18;;22546:65;22521:9;22584:6;22546:65;;22628:213;22746:2;22731:18;;22760:71;22735:9;22804:6;22760:71;;22848:771;23106:3;23091:19;;23121:71;23095:9;23165:6;23121:71;;;23203:72;23271:2;23260:9;23256:18;23247:6;23203:72;;;23286;23354:2;23343:9;23339:18;23330:6;23286:72;;;23369;23437:2;23426:9;23422:18;23413:6;23369:72;;;23452:73;23520:3;23509:9;23505:19;23496:6;23452:73;;;23536;23604:3;23593:9;23589:19;23580:6;23536:73;;23626:659;23856:3;23841:19;;23871:71;23845:9;23915:6;23871:71;;;23953:72;24021:2;24010:9;24006:18;23997:6;23953:72;;;24036;24104:2;24093:9;24089:18;24080:6;24036:72;;;24119;24187:2;24176:9;24172:18;24163:6;24119:72;;;24202:73;24270:3;24259:9;24255:19;24246:6;24202:73;;24292:539;24490:3;24475:19;;24505:71;24479:9;24549:6;24505:71;;;24587:68;24651:2;24640:9;24636:18;24627:6;24587:68;;;24666:72;24734:2;24723:9;24719:18;24710:6;24666:72;;;24749;24817:2;24806:9;24802:18;24793:6;24749:72;;;24461:370;;;;;;;;24838:293;24972:2;24986:47;;;24957:18;;25047:74;24957:18;25107:6;25047:74;;25446:407;25637:2;25651:47;;;25622:18;;25712:131;25622:18;25712:131;;25860:407;26051:2;26065:47;;;26036:18;;26126:131;26036:18;26126:131;;26274:407;26465:2;26479:47;;;26450:18;;26540:131;26450:18;26540:131;;26688:407;26879:2;26893:47;;;26864:18;;26954:131;26864:18;26954:131;;27102:407;27293:2;27307:47;;;27278:18;;27368:131;27278:18;27368:131;;27516:407;27707:2;27721:47;;;27692:18;;27782:131;27692:18;27782:131;;27930:407;28121:2;28135:47;;;28106:18;;28196:131;28106:18;28196:131;;28344:407;28535:2;28549:47;;;28520:18;;28610:131;28520:18;28610:131;;28758:407;28949:2;28963:47;;;28934:18;;29024:131;28934:18;29024:131;;29172:407;29363:2;29377:47;;;29348:18;;29438:131;29348:18;29438:131;;29586:407;29777:2;29791:47;;;29762:18;;29852:131;29762:18;29852:131;;30000:407;30191:2;30205:47;;;30176:18;;30266:131;30176:18;30266:131;;30414:407;30605:2;30619:47;;;30590:18;;30680:131;30590:18;30680:131;;30828:407;31019:2;31033:47;;;31004:18;;31094:131;31004:18;31094:131;;31242:407;31433:2;31447:47;;;31418:18;;31508:131;31418:18;31508:131;;31656:431;31828:2;31813:18;;31842:71;31817:9;31886:6;31842:71;;;31924:72;31992:2;31981:9;31977:18;31968:6;31924:72;;;32007:70;32073:2;32062:9;32058:18;32049:6;32007:70;;32314:340;32468:2;32453:18;;32482:71;32457:9;32526:6;32482:71;;;32564:80;32640:2;32629:9;32625:18;32616:6;32564:80;;32661:340;32815:2;32800:18;;32829:71;32804:9;32873:6;32829:71;;;32911:80;32987:2;32976:9;32972:18;32963:6;32911:80;;33008:839;33304:3;33289:19;;33319:71;33293:9;33363:6;33319:71;;;33401:80;33477:2;33466:9;33462:18;33453:6;33401:80;;;33529:9;33523:4;33519:20;33514:2;33503:9;33499:18;33492:48;33554:108;33657:4;33648:6;33554:108;;;33546:116;;33673:80;33749:2;33738:9;33734:18;33725:6;33673:80;;;33764:73;33832:3;33821:9;33817:19;33808:6;33764:73;;33854:324;34000:2;33985:18;;34014:71;33989:9;34058:6;34014:71;;34185:205;34299:2;34284:18;;34313:67;34288:9;34353:6;34313:67;;34397:256;34459:2;34453:9;34485:17;;;34560:18;34545:34;;34581:22;;;34542:62;34539:2;;;34617:1;34614;34607:12;34539:2;34633;34626:22;34437:216;;-1:-1;34437:216;34660:304;;34819:18;34811:6;34808:30;34805:2;;;34851:1;34848;34841:12;34805:2;-1:-1;34886:4;34874:17;;;34939:15;;34742:222;35282:151;35406:4;35397:14;;35354:79;35440:137;35543:12;;35514:63;36082:178;36200:19;;;36249:4;36240:14;;36193:67;36747:91;;36809:24;36827:5;36809:24;;36845:85;36911:13;36904:21;;36887:43;37016:109;37089:30;37078:42;;37061:64;37132:121;37205:42;37194:54;;37177:76;37339:88;37411:10;37400:22;;37383:44;37434:81;37505:4;37494:16;;37477:38;37522:129;;37609:37;37640:5;37609:37;;37658:116;;37745:24;37763:5;37745:24;;37781:121;;37860:37;37891:5;37860:37;;38025:268;38090:1;38097:101;38111:6;38108:1;38105:13;38097:101;;;38178:11;;;38172:18;38159:11;;;38152:39;38133:2;38126:10;38097:101;;;38213:6;38210:1;38207:13;38204:2;;;-1:-1;;38278:1;38260:16;;38253:27;38074:219;38382:97;38470:2;38450:14;38466:7;38446:28;;38430:49;38487:117;38556:24;38574:5;38556:24;;;38549:5;38546:35;38536:2;;38595:1;38592;38585:12;38536:2;38530:74;;38611:111;38677:21;38692:5;38677:21;;38729:117;38798:24;38816:5;38798:24;;38853:117;38922:24;38940:5;38922:24;;39101:115;39169:23;39186:5;39169:23;;39223:113;39290:22;39306:5;39290:22;
Swarm Source
bzzr://a8674e2164fde5da5b792c8ff856056502841baca972a40d8c2c8a6b8c1ad382
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$10.84
Net Worth in MOVR
Token Allocations
ETH
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| MOVR | 100.00% | $2,292.59 | 0.00472881 | $10.84 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.