Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 18225699 | 355 days ago | IN | 0 ETH | 0.04329796 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Safemoon
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-09-27 */ // SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.11; library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @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 subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting 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) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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; } } library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } } abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer {} function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } interface ISafemoon { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function migrate(address account, uint256 amount) external; function isMigrationStarted() external view returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint256); function createPair( address tokenA, address tokenB, address to ) external returns (address pair); } interface IUniswapV2Router01 { function factory() external pure returns (address); function routerTrade() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); } interface IUniswapV2Router02 is IUniswapV2Router01 {} interface ISafeSwapTradeRouter { struct Trade { uint256 amountIn; uint256 amountOut; address[] path; address payable to; uint256 deadline; } function setRouter(address _router) external; function setFeePercent(uint256 _feePercent) external; function sePercent(uint256 _percent) external; function addFfsWhitelist(address _wl) external; function removeFfsWhitelist(address _wl) external; function setFeeJar(address _feeJar) external; function swapExactTokensForETHAndFeeAmount(Trade calldata trade) external payable; function swapTokensForExactETHAndFeeAmount(Trade calldata trade) external payable; function swapExactETHForTokensWithFeeAmount(Trade calldata trade, uint256 _feeAmount) external payable; function swapETHForExactTokensWithFeeAmount(Trade calldata trade, uint256 _feeAmount) external payable; function swapExactTokensForTokensWithFeeAmount(Trade calldata trade) external payable; function swapTokensForExactTokensWithFeeAmount(Trade calldata trade) external payable; function getSwapFee( uint256 amountIn, uint256 _amountOut, address tokenA, address tokenB ) external view returns (uint256 _fee); function getFees( address[] memory _path, uint256 _amountIn, address _address ) external view returns ( uint256 totalBNBFee, uint256 dexFee, uint256 tokenAFee, uint256 tokenBFee ); function getSwapFees(uint256 amountIn, address[] memory path) external view returns (uint256 _fees); } contract Safemoon is ISafemoon, Initializable, ContextUpgradeable, OwnableUpgradeable { using SafeMathUpgradeable for uint256; using AddressUpgradeable for address; struct FeeTier { uint256 ecoSystemFee; uint256 liquidityFee; uint256 taxFee; uint256 ownerFee; uint256 burnFee; address ecoSystem; address owner; } struct FeeValues { uint256 rAmount; uint256 rTransferAmount; uint256 rFee; uint256 tTransferAmount; uint256 tEchoSystem; uint256 tLiquidity; uint256 tFee; uint256 tOwner; uint256 tBurn; } struct tFeeValues { uint256 tTransferAmount; uint256 tEchoSystem; uint256 tLiquidity; uint256 tFee; uint256 tOwner; uint256 tBurn; } mapping(address => uint256) private _rOwned; mapping(address => uint256) private _tOwned; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _isExcluded; mapping(address => bool) private _isBlacklisted; mapping(address => uint256) private _accountsTier; address[] private _excluded; uint256 private constant MAX = ~uint256(0); uint256 private _tTotal; uint256 private _rTotal; uint256 private _tFeeTotal; uint256 private _maxFee; string private _name; string private _symbol; uint8 private _decimals; FeeTier public _defaultFees; FeeTier private _previousFees; FeeTier private _emptyFees; FeeTier[] private feeTiers; IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; address public WBNB; address private migration; address private _initializerAccount; address public _burnAddress; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled; uint256 public _maxTxAmount; uint256 private numTokensSellToAddToLiquidity; bool private _upgraded; event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap); modifier lockTheSwap() { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } modifier lockUpgrade() { require(!_upgraded, "Safemoon: Already upgraded"); _; _upgraded = true; } modifier checkTierIndex(uint256 _index) { require(feeTiers.length > _index, "Safemoon: Invalid tier index"); _; } modifier preventBlacklisted(address _account, string memory errorMsg) { require(!_isBlacklisted[_account], errorMsg); _; } modifier isRouter(address _sender) { { uint32 size; assembly { size := extcodesize(_sender) } if (size > 0) { uint256 senderTier = _accountsTier[_sender]; if (senderTier == 0) { IUniswapV2Router02 _routerCheck = IUniswapV2Router02(_sender); try _routerCheck.factory() returns (address factory) { _accountsTier[_sender] = 1; } catch {} } } } _; } uint256 public numTokensToCollectBNB; uint256 public numOfBnbToSwapAndEvolve; bool inSwapAndEvolve; bool public swapAndEvolveEnabled; /** * @dev * We create 2 variables _rTotalExcluded and _tTotalExcluded that store total t and r excluded * So for any actions such as add, remove exclude wallet or increase, decrease exclude amount, we will update * _rTotalExcluded and _tTotalExcluded * and in _getCurrentSupply() function, we remove for loop by using _rTotalExcluded and _tTotalExcluded * But this contract using proxy pattern, so when we upgrade contract, * we need to call updateTotalExcluded() to init value of _rTotalExcluded and _tTotalExcluded */ uint256 private _rTotalExcluded; uint256 private _tTotalExcluded; mapping(address => bool) public listIgnoreCollectBNBAddresses; // list pairs addresses that not call collectBNB function address public bridgeBurnAddress; mapping(address => bool) public whitelistMint; bool public isPaused; mapping(address => bool) public whitelistPause; mapping(address => bool) public isSFMPair; event SwapAndEvolveEnabledUpdated(bool enabled); event SwapAndEvolve(uint256 bnbSwapped, uint256 tokenReceived, uint256 bnbIntoLiquidity); event AddIgnoreCollectBNBAddress(address ignoreAddress); event RemoveIgnoreCollectBNBAddress(address ignoreAddress); event WhitelistPause(address user, bool value); event SetSFMPair(address pair, bool value); event PauseContract(bool value); modifier onlyWhitelistMint() { require(whitelistMint[msg.sender], "Invalid"); _; } modifier whenNotPaused() { require(!isPaused || whitelistPause[msg.sender], "Paused"); _; } function initialize() public initializer { __Context_init_unchained(); __Ownable_init_unchained(); __Safemoon_v2_init_unchained(); } function __Safemoon_v2_init_unchained() internal initializer { _name = "SafeMoon"; _symbol = "SFM"; _decimals = 9; _tTotal = 1000000 * 10**6 * 10**9; _rTotal = (MAX - (MAX % _tTotal)); _maxFee = 1000; // swapAndLiquifyEnabled = true; _maxTxAmount = 5000 * 10**6 * 10**9; numTokensSellToAddToLiquidity = 500 * 10**6 * 10**9; _burnAddress = 0x000000000000000000000000000000000000dEaD; _initializerAccount = _msgSender(); _rOwned[_initializerAccount] = _rTotal; //exclude owner and this contract from fee _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; // __Safemoon_tiers_init(); emit Transfer(address(0), _msgSender(), _tTotal); } function initRouterAndPair(address _router) external onlyOwner { uniswapV2Router = IUniswapV2Router02(_router); WBNB = uniswapV2Router.WETH(); // Create a uniswap pair for this new token uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), WBNB, address(this)); } function __Safemoon_tiers_init() internal initializer { _defaultFees = _addTier(0, 500, 500, 0, 0, address(0), address(0)); _addTier(50, 50, 100, 0, 0, address(0), address(0)); _addTier(50, 50, 100, 100, 0, address(0), address(0)); _addTier(100, 125, 125, 150, 0, address(0), address(0)); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { if (_isExcluded[account]) return _tOwned[account]; return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override whenNotPaused returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "BEP20: transfer amount exceeds allowance") ); return true; } function isExcludedFromReward(address account) public view returns (bool) { return _isExcluded[account]; } function totalFees() public view returns (uint256) { return _tFeeTotal; } function reflectionFromTokenInTiers( uint256 tAmount, uint256 _tierIndex, bool deductTransferFee ) public view returns (uint256) { require(tAmount <= _tTotal, "Amount must be less than supply"); if (!deductTransferFee) { FeeValues memory _values = _getValues(tAmount, _tierIndex); return _values.rAmount; } else { FeeValues memory _values = _getValues(tAmount, _tierIndex); return _values.rTransferAmount; } } function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns (uint256) { return reflectionFromTokenInTiers(tAmount, 0, deductTransferFee); } function tokenFromReflection(uint256 rAmount) public view returns (uint256) { require(rAmount <= _rTotal, "Amount must be less than total reflections"); uint256 currentRate = _getRate(); return rAmount.div(currentRate); } // we update _rTotalExcluded and _tTotalExcluded when add, remove wallet from excluded list // or when increase, decrease exclude value function excludeFromReward(address account) public onlyOwner { require(!_isExcluded[account], "Invalid"); if (_rOwned[account] > 0) { _tOwned[account] = tokenFromReflection(_rOwned[account]); _tTotalExcluded = _tTotalExcluded.add(_tOwned[account]); _rTotalExcluded = _rTotalExcluded.add(_rOwned[account]); } _isExcluded[account] = true; _excluded.push(account); } // we update _rTotalExcluded and _tTotalExcluded when add, remove wallet from excluded list // or when increase, decrease exclude value function includeInReward(address account) external onlyOwner { require(_isExcluded[account], "Invalid"); for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _rOwned[account] = _tOwned[account] * _getRate(); _tTotalExcluded = _tTotalExcluded.sub(_tOwned[account]); _rTotalExcluded = _rTotalExcluded.sub(_rOwned[account]); _tOwned[account] = 0; _isExcluded[account] = false; _excluded.pop(); break; } } } function excludeFromFee(address account) public onlyOwner { _isExcludedFromFee[account] = true; } function includeInFee(address account) public onlyOwner { _isExcludedFromFee[account] = false; } function whitelistAddress(address _account, uint256 _tierIndex) public onlyOwner checkTierIndex(_tierIndex) preventBlacklisted(_account, "Safemoon: Selected account is in blacklist") { require(_account != address(0), "Safemoon: Invalid address"); _accountsTier[_account] = _tierIndex; } function excludeWhitelistedAddress(address _account) public onlyOwner { require(_account != address(0), "Safemoon: Invalid address"); require(_accountsTier[_account] > 0, "Safemoon: Account is not in whitelist"); _accountsTier[_account] = 0; } function accountTier(address _account) public view returns (FeeTier memory) { return feeTiers[_accountsTier[_account]]; } function isWhitelisted(address _account) public view returns (bool) { return _accountsTier[_account] > 0; } function checkFees(FeeTier memory _tier) internal view returns (FeeTier memory) { uint256 _fees = _tier.ecoSystemFee.add(_tier.liquidityFee).add(_tier.taxFee).add(_tier.ownerFee).add( _tier.burnFee ); require(_fees <= _maxFee, "Safemoon: Fees exceeded max limitation"); return _tier; } function checkFeesChanged( FeeTier memory _tier, uint256 _oldFee, uint256 _newFee ) internal view { uint256 _fees = _tier .ecoSystemFee .add(_tier.liquidityFee) .add(_tier.taxFee) .add(_tier.ownerFee) .add(_tier.burnFee) .sub(_oldFee) .add(_newFee); require(_fees <= _maxFee, "Safemoon: Fees exceeded max limitation"); } function setEcoSystemFeePercent(uint256 _tierIndex, uint256 _ecoSystemFee) external onlyOwner checkTierIndex(_tierIndex) { FeeTier memory tier = feeTiers[_tierIndex]; checkFeesChanged(tier, tier.ecoSystemFee, _ecoSystemFee); feeTiers[_tierIndex].ecoSystemFee = _ecoSystemFee; if (_tierIndex == 0) { _defaultFees.ecoSystemFee = _ecoSystemFee; } } function setLiquidityFeePercent(uint256 _tierIndex, uint256 _liquidityFee) external onlyOwner checkTierIndex(_tierIndex) { FeeTier memory tier = feeTiers[_tierIndex]; checkFeesChanged(tier, tier.liquidityFee, _liquidityFee); feeTiers[_tierIndex].liquidityFee = _liquidityFee; if (_tierIndex == 0) { _defaultFees.liquidityFee = _liquidityFee; } } function setTaxFeePercent(uint256 _tierIndex, uint256 _taxFee) external onlyOwner checkTierIndex(_tierIndex) { FeeTier memory tier = feeTiers[_tierIndex]; checkFeesChanged(tier, tier.taxFee, _taxFee); feeTiers[_tierIndex].taxFee = _taxFee; if (_tierIndex == 0) { _defaultFees.taxFee = _taxFee; } } function setOwnerFeePercent(uint256 _tierIndex, uint256 _ownerFee) external onlyOwner checkTierIndex(_tierIndex) { FeeTier memory tier = feeTiers[_tierIndex]; checkFeesChanged(tier, tier.ownerFee, _ownerFee); feeTiers[_tierIndex].ownerFee = _ownerFee; if (_tierIndex == 0) { _defaultFees.ownerFee = _ownerFee; } } function setBurnFeePercent(uint256 _tierIndex, uint256 _burnFee) external onlyOwner checkTierIndex(_tierIndex) { FeeTier memory tier = feeTiers[_tierIndex]; checkFeesChanged(tier, tier.burnFee, _burnFee); feeTiers[_tierIndex].burnFee = _burnFee; if (_tierIndex == 0) { _defaultFees.burnFee = _burnFee; } } function setEcoSystemFeeAddress(uint256 _tierIndex, address _ecoSystem) external onlyOwner checkTierIndex(_tierIndex) { require(_ecoSystem != address(0), "Safemoon: Address Zero is not allowed"); excludeFromReward(_ecoSystem); feeTiers[_tierIndex].ecoSystem = _ecoSystem; if (_tierIndex == 0) { _defaultFees.ecoSystem = _ecoSystem; } } function setOwnerFeeAddress(uint256 _tierIndex, address _owner) external onlyOwner checkTierIndex(_tierIndex) { require(_owner != address(0), "Safemoon: Address Zero is not allowed"); excludeFromReward(_owner); feeTiers[_tierIndex].owner = _owner; if (_tierIndex == 0) { _defaultFees.owner = _owner; } } function addTier( uint256 _ecoSystemFee, uint256 _liquidityFee, uint256 _taxFee, uint256 _ownerFee, uint256 _burnFee, address _ecoSystem, address _owner ) public onlyOwner { _addTier(_ecoSystemFee, _liquidityFee, _taxFee, _ownerFee, _burnFee, _ecoSystem, _owner); } function _addTier( uint256 _ecoSystemFee, uint256 _liquidityFee, uint256 _taxFee, uint256 _ownerFee, uint256 _burnFee, address _ecoSystem, address _owner ) internal returns (FeeTier memory) { FeeTier memory _newTier = checkFees( FeeTier(_ecoSystemFee, _liquidityFee, _taxFee, _ownerFee, _burnFee, _ecoSystem, _owner) ); excludeFromReward(_ecoSystem); excludeFromReward(_owner); feeTiers.push(_newTier); return _newTier; } function feeTier(uint256 _tierIndex) public view checkTierIndex(_tierIndex) returns (FeeTier memory) { return feeTiers[_tierIndex]; } function blacklistAddress(address account) public onlyOwner { _isBlacklisted[account] = true; _accountsTier[account] = 0; } function unBlacklistAddress(address account) public onlyOwner { _isBlacklisted[account] = false; } function updateRouterAndPair(address _uniswapV2Router, address _uniswapV2Pair) public onlyOwner { uniswapV2Router = IUniswapV2Router02(_uniswapV2Router); uniswapV2Pair = _uniswapV2Pair; WBNB = uniswapV2Router.WETH(); } function setDefaultSettings() external onlyOwner { swapAndLiquifyEnabled = false; swapAndEvolveEnabled = true; } function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner { _maxTxAmount = _tTotal.mul(maxTxPercent).div(10**4); } function setSwapAndEvolveEnabled(bool _enabled) public onlyOwner { swapAndEvolveEnabled = _enabled; emit SwapAndEvolveEnabledUpdated(_enabled); } //to receive BNB from uniswapV2Router when swapping receive() external payable {} function _reflectFee(uint256 rFee, uint256 tFee) private { _rTotal = _rTotal.sub(rFee); _tFeeTotal = _tFeeTotal.add(tFee); } function _getValues(uint256 tAmount, uint256 _tierIndex) private view returns (FeeValues memory) { tFeeValues memory tValues = _getTValues(tAmount, _tierIndex); uint256 tTransferFee = tValues.tLiquidity.add(tValues.tEchoSystem).add(tValues.tOwner).add(tValues.tBurn); (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues( tAmount, tValues.tFee, tTransferFee, _getRate() ); return FeeValues( rAmount, rTransferAmount, rFee, tValues.tTransferAmount, tValues.tEchoSystem, tValues.tLiquidity, tValues.tFee, tValues.tOwner, tValues.tBurn ); } function _getTValues(uint256 tAmount, uint256 _tierIndex) private view returns (tFeeValues memory) { FeeTier memory tier = feeTiers[_tierIndex]; tFeeValues memory tValues = tFeeValues( 0, calculateFee(tAmount, tier.ecoSystemFee), calculateFee(tAmount, tier.liquidityFee), calculateFee(tAmount, tier.taxFee), calculateFee(tAmount, tier.ownerFee), calculateFee(tAmount, tier.burnFee) ); tValues.tTransferAmount = tAmount .sub(tValues.tEchoSystem) .sub(tValues.tFee) .sub(tValues.tLiquidity) .sub(tValues.tOwner) .sub(tValues.tBurn); return tValues; } function _getRValues( uint256 tAmount, uint256 tFee, uint256 tTransferFee, uint256 currentRate ) private pure returns ( uint256, uint256, uint256 ) { uint256 rAmount = tAmount.mul(currentRate); uint256 rFee = tFee.mul(currentRate); uint256 rTransferFee = tTransferFee.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rFee).sub(rTransferFee); return (rAmount, rTransferAmount, rFee); } function _getRate() private view returns (uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() private view returns (uint256, uint256) { if (_rTotalExcluded > _rTotal || _tTotalExcluded > _tTotal) { return (_rTotal, _tTotal); } uint256 rSupply = _rTotal.sub(_rTotalExcluded); uint256 tSupply = _tTotal.sub(_tTotalExcluded); if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal); return (rSupply, tSupply); } function calculateFee(uint256 _amount, uint256 _fee) private pure returns (uint256) { if (_fee == 0) return 0; return _amount.mul(_fee).div(10**4); } function removeAllFee() private { _previousFees = feeTiers[0]; feeTiers[0] = _emptyFees; } function restoreAllFee() private { feeTiers[0] = _previousFees; } function isExcludedFromFee(address account) public view returns (bool) { return _isExcludedFromFee[account]; } function isBlacklisted(address account) public view returns (bool) { return _isBlacklisted[account]; } function _approve( address owner, address spender, uint256 amount ) private preventBlacklisted(owner, "Safemoon: Owner address is blacklisted") preventBlacklisted(spender, "Safemoon: Spender address is blacklisted") { require(owner != address(0), "BEP20: approve from the zero address"); require(spender != address(0), "BEP20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer( address from, address to, uint256 amount ) private preventBlacklisted(_msgSender(), "Safemoon: Address is blacklisted") preventBlacklisted(from, "Safemoon: From address is blacklisted") preventBlacklisted(to, "Safemoon: To address is blacklisted") isRouter(_msgSender()) { require(from != address(0), "BEP20: transfer from the zero address"); require(to != address(0), "BEP20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); require(_canAction(from, to), "Paused"); if (from != owner() && to != owner()) require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount."); // is the token balance of this contract address over the min number of // tokens that we need to initiate a swap + liquidity lock? // also, don't get caught in a circular liquidity event. // also, don't swap & liquify if sender is uniswap pair. uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance >= _maxTxAmount) { contractTokenBalance = _maxTxAmount; } bool overMinTokenBalance = contractTokenBalance >= numTokensToCollectBNB; if ( overMinTokenBalance && !inSwapAndLiquify && swapAndEvolveEnabled && !_isInCollectBNBWhitelist(from) && !_isInCollectBNBWhitelist(to) ) { contractTokenBalance = numTokensToCollectBNB; collectBNB(contractTokenBalance); } //indicates if fee should be deducted from transfer bool takeFee = true; //if any account belongs to _isExcludedFromFee account then remove the fee if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) { takeFee = false; } uint256 tierIndex = 0; if (takeFee) { tierIndex = _accountsTier[from]; if (_msgSender() != from) { tierIndex = _accountsTier[_msgSender()]; } } //transfer amount, it will take tax, burn, liquidity fee _tokenTransfer(from, to, amount, tierIndex, takeFee); } function _canAction(address from, address to) private view returns (bool) { if (!isPaused) { return true; } if (whitelistPause[from] && whitelistPause[to]) { return true; } if (whitelistPause[from] && !isSFMPair[from]) { return true; } return false; } function collectBNB(uint256 contractTokenBalance) private lockTheSwap { swapTokensForBnb(contractTokenBalance); } function swapTokensForBnb(uint256 tokenAmount) private { // generate the uniswap pair path of token -> wbnb address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); ISafeSwapTradeRouter tradeRouter = ISafeSwapTradeRouter(uniswapV2Router.routerTrade()); // _approve(address(this), address(uniswapV2Router), tokenAmount); // get feeAmount uint256 feeAmount = tradeRouter.getSwapFees(tokenAmount, path); // (, uint256 feeAmount, uint256 tokenAFee, ) = tradeRouter.getFees(path, tokenAmount, address(this)); _approve(address(this), address(uniswapV2Router), tokenAmount); _approve(address(this), address(tradeRouter), tokenAmount); ISafeSwapTradeRouter.Trade memory trade = ISafeSwapTradeRouter.Trade({ amountIn: tokenAmount, amountOut: 0, path: path, to: payable(address(this)), deadline: block.timestamp }); tradeRouter.swapExactTokensForETHAndFeeAmount{ value: feeAmount }(trade); } function swapAndEvolve() public onlyOwner lockTheSwap { // split the contract balance into halves uint256 contractBnbBalance = address(this).balance; require(contractBnbBalance >= numOfBnbToSwapAndEvolve, "BNB balance is not reach for S&E Threshold"); contractBnbBalance = numOfBnbToSwapAndEvolve; uint256 half = contractBnbBalance.div(2); uint256 otherHalf = contractBnbBalance.sub(half); // capture the contract's current BNB balance. // this is so that we can capture exactly the amount of BNB that the // swap creates, and not make the liquidity event include any BNB that // has been manually sent to the contract uint256 initialBalance = ISafemoon(address(this)).balanceOf(msg.sender); // swap BNB for Tokens swapBnbForTokens(half); // how much BNB did we just swap into? uint256 newBalance = ISafemoon(address(this)).balanceOf(msg.sender); uint256 swapeedToken = newBalance.sub(initialBalance); _approve(msg.sender, address(this), swapeedToken); ISafemoon(address(this)).transferFrom(msg.sender, address(this), swapeedToken); // add liquidity to uniswap addLiquidity(swapeedToken, otherHalf); emit SwapAndEvolve(half, swapeedToken, otherHalf); } function swapBnbForTokens(uint256 bnbAmount) private { // generate the uniswap pair path of token -> wbnb address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(this); ISafeSwapTradeRouter tradeRouter = ISafeSwapTradeRouter(uniswapV2Router.routerTrade()); _approve(owner(), address(uniswapV2Router), bnbAmount); // get feeAmount uint256 feeAmount = tradeRouter.getSwapFees(bnbAmount, path); ISafeSwapTradeRouter.Trade memory trade = ISafeSwapTradeRouter.Trade({ amountIn: bnbAmount, amountOut: 0, path: path, to: payable(owner()), deadline: block.timestamp }); tradeRouter.swapExactETHForTokensWithFeeAmount{ value: bnbAmount + feeAmount }(trade, feeAmount); } function addLiquidity(uint256 tokenAmount, uint256 bnbAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{ value: bnbAmount }( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable owner(), block.timestamp ); } //this method is responsible for taking all fee, if takeFee is true function _tokenTransfer( address sender, address recipient, uint256 amount, uint256 tierIndex, bool takeFee ) private { if (!takeFee) removeAllFee(); if (!_isExcluded[sender] && !_isExcluded[recipient]) { _transferStandard(sender, recipient, amount, tierIndex); } else if (_isExcluded[sender] && !_isExcluded[recipient]) { _transferFromExcluded(sender, recipient, amount, tierIndex); } else if (!_isExcluded[sender] && _isExcluded[recipient]) { _transferToExcluded(sender, recipient, amount, tierIndex); } else if (_isExcluded[sender] && _isExcluded[recipient]) { _transferBothExcluded(sender, recipient, amount, tierIndex); } if (!takeFee) restoreAllFee(); } // we update _rTotalExcluded and _tTotalExcluded when add, remove wallet from excluded list // or when increase, decrease exclude value function _transferBothExcluded( address sender, address recipient, uint256 tAmount, uint256 tierIndex ) private { FeeValues memory _values = _getValues(tAmount, tierIndex); _tOwned[sender] = _tOwned[sender].sub(tAmount); // _rOwned[sender] = _rOwned[sender].sub(_values.rAmount); _tOwned[recipient] = _tOwned[recipient].add(_values.tTransferAmount); // _rOwned[recipient] = _rOwned[recipient].add(_values.rTransferAmount); if (_values.tTransferAmount > tAmount) { uint256 tmpValue = _values.tTransferAmount - tAmount; _tTotalExcluded = _tTotalExcluded.add(tmpValue); } else { uint256 tmpValue = tAmount - _values.tTransferAmount; _tTotalExcluded = _tTotalExcluded.sub(tmpValue); } if (_values.rTransferAmount > _values.rAmount) { uint256 tmpValue = _values.rTransferAmount - _values.rAmount; _rTotalExcluded = _rTotalExcluded.add(tmpValue); } else { uint256 tmpValue = _values.rAmount - _values.rTransferAmount; _rTotalExcluded = _rTotalExcluded.sub(tmpValue); } // _tTotalExcluded = _tTotalExcluded.add(_values.tTransferAmount).sub(tAmount); // _rTotalExcluded = _rTotalExcluded.add(_values.rTransferAmount).sub(_values.rAmount); _takeFees(sender, _values, tierIndex); _reflectFee(_values.rFee, _values.tFee); emit Transfer(sender, recipient, _values.tTransferAmount); } function _transferStandard( address sender, address recipient, uint256 tAmount, uint256 tierIndex ) private { FeeValues memory _values = _getValues(tAmount, tierIndex); _rOwned[sender] = _rOwned[sender].sub(_values.rAmount); _rOwned[recipient] = _rOwned[recipient].add(_values.rTransferAmount); _takeFees(sender, _values, tierIndex); _reflectFee(_values.rFee, _values.tFee); emit Transfer(sender, recipient, _values.tTransferAmount); } // we update _rTotalExcluded and _tTotalExcluded when add, remove wallet from excluded list // or when increase, decrease exclude value function _transferToExcluded( address sender, address recipient, uint256 tAmount, uint256 tierIndex ) private { FeeValues memory _values = _getValues(tAmount, tierIndex); _rOwned[sender] = _rOwned[sender].sub(_values.rAmount); _tOwned[recipient] = _tOwned[recipient].add(_values.tTransferAmount); // _rOwned[recipient] = _rOwned[recipient].add(_values.rTransferAmount); _tTotalExcluded = _tTotalExcluded.add(_values.tTransferAmount); _rTotalExcluded = _rTotalExcluded.add(_values.rTransferAmount); _takeFees(sender, _values, tierIndex); _reflectFee(_values.rFee, _values.tFee); emit Transfer(sender, recipient, _values.tTransferAmount); } // we update _rTotalExcluded and _tTotalExcluded when add, remove wallet from excluded list // or when increase, decrease exclude value function _transferFromExcluded( address sender, address recipient, uint256 tAmount, uint256 tierIndex ) private { FeeValues memory _values = _getValues(tAmount, tierIndex); _tOwned[sender] = _tOwned[sender].sub(tAmount); // _rOwned[sender] = _rOwned[sender].sub(_values.rAmount); _rOwned[recipient] = _rOwned[recipient].add(_values.rTransferAmount); _tTotalExcluded = _tTotalExcluded.sub(tAmount); _rTotalExcluded = _rTotalExcluded.sub(_values.rAmount); _takeFees(sender, _values, tierIndex); _reflectFee(_values.rFee, _values.tFee); emit Transfer(sender, recipient, _values.tTransferAmount); } function _takeFees( address sender, FeeValues memory values, uint256 tierIndex ) private { _takeFee(sender, values.tLiquidity, address(this)); _takeFee(sender, values.tEchoSystem, feeTiers[tierIndex].ecoSystem); _takeFee(sender, values.tOwner, feeTiers[tierIndex].owner); _takeBurn(sender, values.tBurn); } // we update _rTotalExcluded and _tTotalExcluded when add, remove wallet from excluded list // or when increase, decrease exclude value function _takeFee( address sender, uint256 tAmount, address recipient ) private { if (recipient == address(0)) return; if (tAmount == 0) return; uint256 currentRate = _getRate(); uint256 rAmount = tAmount.mul(currentRate); _rOwned[recipient] = _rOwned[recipient].add(rAmount); if (_isExcluded[recipient]) { _tOwned[recipient] = _tOwned[recipient].add(tAmount); _tTotalExcluded = _tTotalExcluded.add(tAmount); _rTotalExcluded = _rTotalExcluded.add(rAmount); } emit Transfer(sender, recipient, tAmount); } // we update _rTotalExcluded and _tTotalExcluded when add, remove wallet from excluded list // or when increase, decrease exclude value function _takeBurn(address sender, uint256 _amount) private { if (_amount == 0) return; _tOwned[_burnAddress] = _tOwned[_burnAddress].add(_amount); uint256 _rAmount = _amount * _getRate(); _rOwned[_burnAddress] = _rOwned[_burnAddress].add(_rAmount); if (_isExcluded[_burnAddress]) { _rTotalExcluded = _rTotalExcluded.add(_rAmount); _tTotalExcluded = _tTotalExcluded.add(_amount); } emit Transfer(sender, _burnAddress, _amount); } function setMigrationAddress(address _migration) public onlyOwner { migration = _migration; } function isMigrationStarted() external view override returns (bool) { return migration != address(0); } function migrate(address account, uint256 amount) external override preventBlacklisted(account, "Safemoon: Migrated account is blacklisted") { require(migration != address(0), "Safemoon: Migration is not started"); require(_msgSender() == migration, "Safemoon: Not Allowed"); _migrate(account, amount); } function _migrate(address account, uint256 amount) private { require(account != address(0), "BEP20: mint to the zero address"); _tokenTransfer(_initializerAccount, account, amount, 0, false); } function feeTiersLength() public view returns (uint256) { return feeTiers.length; } function updateBurnAddress(address _newBurnAddress) external onlyOwner { _burnAddress = _newBurnAddress; excludeFromReward(_newBurnAddress); } function withdrawToken(address _token, uint256 _amount) public onlyOwner { ISafemoon(_token).transfer(msg.sender, _amount); } function setNumberOfTokenToCollectBNB(uint256 _numToken) public onlyOwner { numTokensToCollectBNB = _numToken; } function setNumOfBnbToSwapAndEvolve(uint256 _numBnb) public onlyOwner { numOfBnbToSwapAndEvolve = _numBnb; } function withdrawBnb(uint256 _amount) public onlyOwner { payable(msg.sender).transfer(_amount); } function addListIgnoreCollectBNBOnTransferAddresses(address[] calldata _addresses) external onlyOwner { uint256 len = _addresses.length; for (uint256 i = 0; i < len; i++) { address addr = _addresses[i]; if (listIgnoreCollectBNBAddresses[addr]) continue; listIgnoreCollectBNBAddresses[addr] = true; emit AddIgnoreCollectBNBAddress(addr); } } function removeListIgnoreCollectBNBOnTransferAddresses(address[] calldata _addresses) external onlyOwner { uint256 len = _addresses.length; for (uint256 i = 0; i < len; i++) { address addr = _addresses[i]; if (!listIgnoreCollectBNBAddresses[addr]) continue; listIgnoreCollectBNBAddresses[addr] = false; emit RemoveIgnoreCollectBNBAddress(addr); } } function _isInCollectBNBWhitelist(address _addr) private view returns (bool) { return listIgnoreCollectBNBAddresses[_addr]; } function setBridgeBurnAddress(address _burn) public onlyOwner { bridgeBurnAddress = _burn; } function setWhitelistMintBurn(address _wl, bool value) public onlyOwner { whitelistMint[_wl] = value; } function mint(address user, uint256 amount) public whenNotPaused onlyWhitelistMint { if (msg.sender != owner()) { require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount."); } _tokenTransfer(bridgeBurnAddress, user, amount, 0, false); } function burn(uint256 amount) public whenNotPaused onlyWhitelistMint { if (msg.sender != owner()) { require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount."); } _tokenTransfer(msg.sender, bridgeBurnAddress, amount, 0, false); } function setWhitelistPause(address user, bool value) public onlyOwner { whitelistPause[user] = value; emit WhitelistPause(user, value); } function setPause(bool value) public onlyOwner { isPaused = value; } function setSFMPair(address pair, bool value) public onlyOwner { isSFMPair[pair] = value; emit SetSFMPair(pair, value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ignoreAddress","type":"address"}],"name":"AddIgnoreCollectBNBAddress","type":"event"},{"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":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"PauseContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ignoreAddress","type":"address"}],"name":"RemoveIgnoreCollectBNBAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetSFMPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bnbSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bnbIntoLiquidity","type":"uint256"}],"name":"SwapAndEvolve","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndEvolveEnabledUpdated","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"WhitelistPause","type":"event"},{"inputs":[],"name":"WBNB","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_defaultFees","outputs":[{"internalType":"uint256","name":"ecoSystemFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"taxFee","type":"uint256"},{"internalType":"uint256","name":"ownerFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"address","name":"ecoSystem","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"accountTier","outputs":[{"components":[{"internalType":"uint256","name":"ecoSystemFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"taxFee","type":"uint256"},{"internalType":"uint256","name":"ownerFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"address","name":"ecoSystem","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct Safemoon.FeeTier","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addListIgnoreCollectBNBOnTransferAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ecoSystemFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_taxFee","type":"uint256"},{"internalType":"uint256","name":"_ownerFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"address","name":"_ecoSystem","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"addTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bridgeBurnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"excludeWhitelistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tierIndex","type":"uint256"}],"name":"feeTier","outputs":[{"components":[{"internalType":"uint256","name":"ecoSystemFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"taxFee","type":"uint256"},{"internalType":"uint256","name":"ownerFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"address","name":"ecoSystem","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct Safemoon.FeeTier","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTiersLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"initRouterAndPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMigrationStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSFMPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"listIgnoreCollectBNBAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numOfBnbToSwapAndEvolve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensToCollectBNB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"uint256","name":"_tierIndex","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromTokenInTiers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeListIgnoreCollectBNBOnTransferAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_burn","type":"address"}],"name":"setBridgeBurnAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tierIndex","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"setBurnFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setDefaultSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tierIndex","type":"uint256"},{"internalType":"address","name":"_ecoSystem","type":"address"}],"name":"setEcoSystemFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tierIndex","type":"uint256"},{"internalType":"uint256","name":"_ecoSystemFee","type":"uint256"}],"name":"setEcoSystemFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tierIndex","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_migration","type":"address"}],"name":"setMigrationAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numBnb","type":"uint256"}],"name":"setNumOfBnbToSwapAndEvolve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numToken","type":"uint256"}],"name":"setNumberOfTokenToCollectBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tierIndex","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwnerFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tierIndex","type":"uint256"},{"internalType":"uint256","name":"_ownerFee","type":"uint256"}],"name":"setOwnerFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setSFMPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndEvolveEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tierIndex","type":"uint256"},{"internalType":"uint256","name":"_taxFee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wl","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setWhitelistMintBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setWhitelistPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndEvolve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndEvolveEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unBlacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newBurnAddress","type":"address"}],"name":"updateBurnAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniswapV2Router","type":"address"},{"internalType":"address","name":"_uniswapV2Pair","type":"address"}],"name":"updateRouterAndPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_tierIndex","type":"uint256"}],"name":"whitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawBnb","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50615f5980620000216000396000f3fe60806040526004361061046c5760003560e01c8063674a31121161024a578063bd3900c011610139578063dd62ed3e116100b6578063f2fde38b1161007a578063f2fde38b14610ee7578063f3290d7514610f07578063f3bf2f6114610f27578063fe575a8714610f47578063fff3e1ba14610f8057600080fd5b8063dd62ed3e14610dc5578063dfd66cb314610e0b578063ea2f0b3714610e87578063ee28088114610ea7578063f2d58c2314610ec757600080fd5b8063d0124920116100fd578063d012492014610d15578063d40cf65914610d45578063d543dbeb14610d65578063d66329b014610d85578063dbc914c714610da557600080fd5b8063bd3900c014610c65578063bedb86fb14610c85578063bf26646914610ca5578063bf610d7e14610cc5578063c4f8414614610cf557600080fd5b80638af319c7116101c757806395d89b411161018b57806395d89b4114610bd65780639e281a9814610beb578063a9059cbb14610c0b578063ad68ebf714610c2b578063b187bd2614610c4b57600080fd5b80638af319c714610b435780638d50d49914610b635780638da5cb5b14610b785780638dd9500214610b965780638fc3d4b814610bb657600080fd5b80637ed948f71161020e5780637ed948f714610a8f578063810315b914610aaf5780638129fc1c14610adf57806388f8202014610af45780638abec60614610b2d57600080fd5b8063674a311214610a045780636bd89cdd14610a2457806370a0823114610a44578063715018a614610a645780637d1db4a514610a7957600080fd5b80633685d4191161036657806349bd5a5e116102e35780635342acb4116102a75780635342acb41461095657806355724b3a1461098f57806360d0eb73146109ae5780636130d38f146109ce5780636531c58c146109ee57600080fd5b806349bd5a5e146108b55780634a581829146108d55780634a74bb02146108f55780634ffc14251461091657806352390c021461093657600080fd5b806342966c681161032a57806342966c6814610815578063437823ec146108355780634549b03914610855578063459c979b146108755780634732a7dc1461089557600080fd5b80633685d4191461075d57806339aa1bba1461077d5780633af32abf1461079d57806340b28c2f146107d557806340c10f19146107f557600080fd5b8063200c7295116103f457806330b263ba116103b857806330b263ba146106bb578063313ce567146106db57806332c2d90c146106fd57806332e6cd411461071d57806334dd8da91461073d57600080fd5b8063200c72951461060b57806323b872dd1461062b5780632d8381191461064b5780632f3aaeb21461066b578063301273341461069b57600080fd5b806313114a9d1161043b57806313114a9d14610514578063132af75c14610529578063140c57591461053e5780631694505e146105be57806318160ddd146105f657600080fd5b806306fdde0314610478578063095ea7b3146104a357806310844953146104d357806311b32601146104f557600080fd5b3661047357005b600080fd5b34801561048457600080fd5b5061048d610fa0565b60405161049a9190615680565b60405180910390f35b3480156104af57600080fd5b506104c36104be3660046156ea565b611032565b604051901515815260200161049a565b3480156104df57600080fd5b506104f36104ee366004615716565b611090565b005b34801561050157600080fd5b506089545b60405190815260200161049a565b34801561052057600080fd5b50606f54610506565b34801561053557600080fd5b506104f3611199565b34801561054a57600080fd5b5061055e610559366004615733565b6111e1565b60405161049a9190815181526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0808301516001600160a01b039081169183019190915260c092830151169181019190915260e00190565b3480156105ca57600080fd5b50608a546105de906001600160a01b031681565b6040516001600160a01b03909116815260200161049a565b34801561060257600080fd5b50606d54610506565b34801561061757600080fd5b506104f36106263660046156ea565b611295565b34801561063757600080fd5b506104c361064636600461574c565b6113aa565b34801561065757600080fd5b50610506610666366004615733565b611414565b34801561067757600080fd5b506104c3610686366004615716565b609c6020526000908152604090205460ff1681565b3480156106a757600080fd5b5061055e6106b6366004615716565b611491565b3480156106c757600080fd5b506104f36106d636600461578d565b61153a565b3480156106e757600080fd5b5060735460405160ff909116815260200161049a565b34801561070957600080fd5b506104f36107183660046157bd565b611652565b34801561072957600080fd5b506099546105de906001600160a01b031681565b34801561074957600080fd5b506104f36107583660046157da565b6116cf565b34801561076957600080fd5b506104f3610778366004615716565b611724565b34801561078957600080fd5b506104f361079836600461578d565b611946565b3480156107a957600080fd5b506104c36107b8366004615716565b6001600160a01b03166000908152606b6020526040902054151590565b3480156107e157600080fd5b506104f36107f0366004615813565b611a57565b34801561080157600080fd5b506104f36108103660046156ea565b611b32565b34801561082157600080fd5b506104f3610830366004615733565b611bec565b34801561084157600080fd5b506104f3610850366004615716565b611caa565b34801561086157600080fd5b50610506610870366004615841565b611cf8565b34801561088157600080fd5b506104f3610890366004615733565b611d06565b3480156108a157600080fd5b506104f36108b0366004615716565b611d5d565b3480156108c157600080fd5b50608b546105de906001600160a01b031681565b3480156108e157600080fd5b506104f36108f03660046157da565b611da9565b34801561090157600080fd5b50608f546104c390600160a81b900460ff1681565b34801561092257600080fd5b506104f3610931366004615866565b611e37565b34801561094257600080fd5b506104f3610951366004615716565b611e7a565b34801561096257600080fd5b506104c3610971366004615716565b6001600160a01b031660009081526068602052604090205460ff1690565b34801561099b57600080fd5b506095546104c390610100900460ff1681565b3480156109ba57600080fd5b50608d546001600160a01b031615156104c3565b3480156109da57600080fd5b506104f36109e93660046157da565b611fd6565b3480156109fa57600080fd5b5061050660935481565b348015610a1057600080fd5b506104f3610a1f366004615733565b61205c565b348015610a3057600080fd5b506104f3610a3f366004615716565b61208b565b348015610a5057600080fd5b50610506610a5f366004615716565b6120d9565b348015610a7057600080fd5b506104f3612138565b348015610a8557600080fd5b5061050660905481565b348015610a9b57600080fd5b506104f3610aaa3660046158cf565b6121ac565b348015610abb57600080fd5b506104c3610aca366004615716565b609d6020526000908152604090205460ff1681565b348015610aeb57600080fd5b506104f361229b565b348015610b0057600080fd5b506104c3610b0f366004615716565b6001600160a01b031660009081526069602052604090205460ff1690565b348015610b3957600080fd5b5061050660945481565b348015610b4f57600080fd5b506104f3610b5e3660046158cf565b612328565b348015610b6f57600080fd5b506104f3612418565b348015610b8457600080fd5b506033546001600160a01b03166105de565b348015610ba257600080fd5b50608c546105de906001600160a01b031681565b348015610bc257600080fd5b506104f3610bd136600461578d565b612698565b348015610be257600080fd5b5061048d6127ac565b348015610bf757600080fd5b506104f3610c063660046156ea565b6127bb565b348015610c1757600080fd5b506104c3610c263660046156ea565b612856565b348015610c3757600080fd5b506104f3610c463660046156ea565b612863565b348015610c5757600080fd5b50609b546104c39060ff1681565b348015610c7157600080fd5b50608f546105de906001600160a01b031681565b348015610c9157600080fd5b506104f3610ca03660046157bd565b612982565b348015610cb157600080fd5b50610506610cc03660046158f4565b6129bf565b348015610cd157600080fd5b506104c3610ce0366004615716565b609a6020526000908152604090205460ff1681565b348015610d0157600080fd5b506104f3610d10366004615716565b612a47565b348015610d2157600080fd5b506104c3610d30366004615716565b60986020526000908152604090205460ff1681565b348015610d5157600080fd5b506104f3610d60366004615716565b612a93565b348015610d7157600080fd5b506104f3610d80366004615733565b612ade565b348015610d9157600080fd5b506104f3610da036600461578d565b612b2f565b348015610db157600080fd5b506104f3610dc036600461592d565b612c43565b348015610dd157600080fd5b50610506610de0366004615813565b6001600160a01b03918216600090815260676020908152604080832093909416825291909152205490565b348015610e1757600080fd5b50607454607554607654607754607854607954607a54610e469695949392916001600160a01b03908116911687565b60408051978852602088019690965294860193909352606085019190915260808401526001600160a01b0390811660a08401521660c082015260e00161049a565b348015610e9357600080fd5b506104f3610ea2366004615716565b612d33565b348015610eb357600080fd5b506104f3610ec2366004615716565b612d7e565b348015610ed357600080fd5b506104f3610ee236600461578d565b612f46565b348015610ef357600080fd5b506104f3610f02366004615716565b613058565b348015610f1357600080fd5b506104f3610f22366004615716565b613143565b348015610f3357600080fd5b506104f3610f4236600461592d565b61319c565b348015610f5357600080fd5b506104c3610f62366004615716565b6001600160a01b03166000908152606a602052604090205460ff1690565b348015610f8c57600080fd5b506104f3610f9b366004615733565b613290565b606060718054610faf906159a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdb906159a2565b80156110285780601f10610ffd57610100808354040283529160200191611028565b820191906000526020600020905b81548152906001019060200180831161100b57829003601f168201915b5050505050905090565b609b5460009060ff1615806110565750336000908152609c602052604090205460ff165b61107b5760405162461bcd60e51b8152600401611072906159d7565b60405180910390fd5b6110863384846132bf565b5060015b92915050565b6033546001600160a01b031633146110ba5760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03811661110c5760405162461bcd60e51b8152602060048201526019602482015278536166656d6f6f6e3a20496e76616c6964206164647265737360381b6044820152606401611072565b6001600160a01b0381166000908152606b602052604090205461117f5760405162461bcd60e51b815260206004820152602560248201527f536166656d6f6f6e3a204163636f756e74206973206e6f7420696e2077686974604482015264195b1a5cdd60da1b6064820152608401611072565b6001600160a01b03166000908152606b6020526040812055565b6033546001600160a01b031633146111c35760405162461bcd60e51b8152600401611072906159f7565b608f805460ff60a81b191690556095805461ff001916610100179055565b6111e9615598565b6089548290811061120c5760405162461bcd60e51b815260040161107290615a2c565b6089838154811061121f5761121f615a63565b60009182526020918290206040805160e081018252600790930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260058201546001600160a01b0390811660a083015260069092015490911660c082015291505b50919050565b6033546001600160a01b031633146112bf5760405162461bcd60e51b8152600401611072906159f7565b608954819081106112e25760405162461bcd60e51b815260040161107290615a2c565b826040518060600160405280602a8152602001615efa602a91396001600160a01b0382166000908152606a6020526040902054819060ff16156113385760405162461bcd60e51b81526004016110729190615680565b506001600160a01b03851661138b5760405162461bcd60e51b8152602060048201526019602482015278536166656d6f6f6e3a20496e76616c6964206164647265737360381b6044820152606401611072565b5050506001600160a01b039091166000908152606b6020526040902055565b60006113b7848484613495565b611409843361140485604051806060016040528060288152602001615e40602891396001600160a01b038a166000908152606760209081526040808320338452909152902054919061394e565b6132bf565b5060015b9392505050565b6000606e5482111561147b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401611072565b6000611485613985565b905061140d83826139a8565b611499615598565b6001600160a01b0382166000908152606b60205260409020546089805490919081106114c7576114c7615a63565b60009182526020918290206040805160e081018252600790930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260058201546001600160a01b0390811660a083015260069092015490911660c082015292915050565b6033546001600160a01b031633146115645760405162461bcd60e51b8152600401611072906159f7565b608954829081106115875760405162461bcd60e51b815260040161107290615a2c565b60006089848154811061159c5761159c615a63565b60009182526020918290206040805160e0810182526007909302909101805483526001810154938301939093526002830154908201819052600383015460608301526004830154608083015260058301546001600160a01b0390811660a084015260069093015490921660c0820152915061161990829085613a03565b826089858154811061162d5761162d615a63565b60009182526020909120600260079092020101558361164c5760768390555b50505050565b6033546001600160a01b0316331461167c5760405162461bcd60e51b8152600401611072906159f7565b609580548215156101000261ff00199091161790556040517ef279ea7539cc7cc5311702e24242fe836f7f94e8e329be09530ade3dd254c3906116c490831515815260200190565b60405180910390a150565b6033546001600160a01b031633146116f95760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03919091166000908152609a60205260409020805460ff1916911515919091179055565b6033546001600160a01b0316331461174e5760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03811660009081526069602052604090205460ff166117865760405162461bcd60e51b815260040161107290615a79565b60005b606c5481101561194257816001600160a01b0316606c82815481106117b0576117b0615a63565b6000918252602090912001546001600160a01b0316141561193057606c80546117db90600190615ab0565b815481106117eb576117eb615a63565b600091825260209091200154606c80546001600160a01b03909216918390811061181757611817615a63565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061184d613985565b6001600160a01b0383166000908152606660205260409020546118709190615ac7565b6001600160a01b0383166000908152606560209081526040808320939093556066905220546097546118a191613a70565b6097556001600160a01b0382166000908152606560205260409020546096546118c991613a70565b6096556001600160a01b038216600090815260666020908152604080832083905560699091529020805460ff19169055606c80548061190a5761190a615ae6565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b8061193a81615afc565b915050611789565b5050565b6033546001600160a01b031633146119705760405162461bcd60e51b8152600401611072906159f7565b608954829081106119935760405162461bcd60e51b815260040161107290615a2c565b6000608984815481106119a8576119a8615a63565b60009182526020918290206040805160e08101825260079093029091018054808452600182015494840194909452600281015491830191909152600381015460608301526004810154608083015260058101546001600160a01b0390811660a08401526006909101541660c08201529150611a2590829085613a03565b8260898581548110611a3957611a39615a63565b60009182526020909120600790910201558361164c57505060745550565b6033546001600160a01b03163314611a815760405162461bcd60e51b8152600401611072906159f7565b608a80546001600160a01b038085166001600160a01b03199283168117909355608b805491851691909216179055604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015611aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0e9190615b17565b608c80546001600160a01b0319166001600160a01b03929092169190911790555050565b609b5460ff161580611b535750336000908152609c602052604090205460ff165b611b6f5760405162461bcd60e51b8152600401611072906159d7565b336000908152609a602052604090205460ff16611b9e5760405162461bcd60e51b815260040161107290615a79565b6033546001600160a01b03163314611bd257609054811115611bd25760405162461bcd60e51b815260040161107290615b34565b609954611942906001600160a01b03168383600080613acc565b609b5460ff161580611c0d5750336000908152609c602052604090205460ff165b611c295760405162461bcd60e51b8152600401611072906159d7565b336000908152609a602052604090205460ff16611c585760405162461bcd60e51b815260040161107290615a79565b6033546001600160a01b03163314611c8c57609054811115611c8c5760405162461bcd60e51b815260040161107290615b34565b609954611ca79033906001600160a01b031683600080613acc565b50565b6033546001600160a01b03163314611cd45760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03166000908152606860205260409020805460ff19166001179055565b600061140d836000846129bf565b6033546001600160a01b03163314611d305760405162461bcd60e51b8152600401611072906159f7565b604051339082156108fc029083906000818181858888f19350505050158015611942573d6000803e3d6000fd5b6033546001600160a01b03163314611d875760405162461bcd60e51b8152600401611072906159f7565b608d80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314611dd35760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b0382166000818152609c6020908152604091829020805460ff19168515159081179091558251938452908301527fe5532272281c5b79ae737a18f13faaf65c6d39fbebe8e5d5c9d842475d5d36fb91015b60405180910390a15050565b6033546001600160a01b03163314611e615760405162461bcd60e51b8152600401611072906159f7565b611e7087878787878787613c3a565b5050505050505050565b6033546001600160a01b03163314611ea45760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03811660009081526069602052604090205460ff1615611edd5760405162461bcd60e51b815260040161107290615a79565b6001600160a01b03811660009081526065602052604090205415611f70576001600160a01b038116600090815260656020526040902054611f1d90611414565b6001600160a01b0382166000908152606660205260409020819055609754611f4491613e0e565b6097556001600160a01b038116600090815260656020526040902054609654611f6c91613e0e565b6096555b6001600160a01b03166000818152606960205260408120805460ff19166001908117909155606c805491820181559091527f2b4a51ab505fc96a0952efda2ba61bcd3078d4c02c39a186ec16f21883fbe0160180546001600160a01b0319169091179055565b6033546001600160a01b031633146120005760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b0382166000818152609d6020908152604091829020805460ff19168515159081179091558251938452908301527f7bbec7f46aba5f3c18434ab4aba04fa47673a668c615724e7344386e8b62e02c9101611e2b565b6033546001600160a01b031633146120865760405162461bcd60e51b8152600401611072906159f7565b609355565b6033546001600160a01b031633146120b55760405162461bcd60e51b8152600401611072906159f7565b608f80546001600160a01b0319166001600160a01b038316179055611ca781611e7a565b6001600160a01b03811660009081526069602052604081205460ff161561211657506001600160a01b031660009081526066602052604090205490565b6001600160a01b03821660009081526065602052604090205461108a90611414565b6033546001600160a01b031633146121625760405162461bcd60e51b8152600401611072906159f7565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b031633146121d65760405162461bcd60e51b8152600401611072906159f7565b608954829081106121f95760405162461bcd60e51b815260040161107290615a2c565b6001600160a01b03821661221f5760405162461bcd60e51b815260040161107290615b7c565b61222882611e7a565b816089848154811061223c5761223c615a63565b906000526020600020906007020160050160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550826000141561229657607980546001600160a01b0319166001600160a01b0384161790555b505050565b600054610100900460ff16806122b05750303b155b806122be575060005460ff16155b6122da5760405162461bcd60e51b815260040161107290615bc1565b600054610100900460ff161580156122fc576000805461ffff19166101011790555b612304613e6d565b61230c613ee1565b612314613f99565b8015611ca7576000805461ff001916905550565b6033546001600160a01b031633146123525760405162461bcd60e51b8152600401611072906159f7565b608954829081106123755760405162461bcd60e51b815260040161107290615a2c565b6001600160a01b03821661239b5760405162461bcd60e51b815260040161107290615b7c565b6123a482611e7a565b81608984815481106123b8576123b8615a63565b906000526020600020906007020160060160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550826000141561229657607a80546001600160a01b0384166001600160a01b0319909116179055505050565b6033546001600160a01b031633146124425760405162461bcd60e51b8152600401611072906159f7565b608f805460ff60a01b1916600160a01b17905560945447908110156124bc5760405162461bcd60e51b815260206004820152602a60248201527f424e422062616c616e6365206973206e6f7420726561636820666f722053264560448201526908151a1c995cda1bdb1960b21b6064820152608401611072565b5060945460006124cd8260026139a8565b905060006124db8383613a70565b6040516370a0823160e01b815233600482015290915060009030906370a0823190602401602060405180830381865afa15801561251c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125409190615c0f565b905061254b83614170565b6040516370a0823160e01b815233600482015260009030906370a0823190602401602060405180830381865afa158015612589573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ad9190615c0f565b905060006125bb8284613a70565b90506125c83330836132bf565b6040516323b872dd60e01b8152336004820152306024820181905260448201839052906323b872dd906064016020604051808303816000875af1158015612613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126379190615c28565b506126428185614419565b60408051868152602081018390529081018590527f08261edc7b257da79c22afdc1c7064b198c7abe8fdd21070ac0b55e0351804a39060600160405180910390a15050608f805460ff60a01b1916905550505050565b6033546001600160a01b031633146126c25760405162461bcd60e51b8152600401611072906159f7565b608954829081106126e55760405162461bcd60e51b815260040161107290615a2c565b6000608984815481106126fa576126fa615a63565b60009182526020918290206040805160e0810182526007909302909101805483526001810154938301939093526002830154908201526003820154606082015260048201546080820181905260058301546001600160a01b0390811660a084015260069093015490921660c0820152915061277790829085613a03565b826089858154811061278b5761278b615a63565b60009182526020909120600460079092020101558361164c57505060785550565b606060728054610faf906159a2565b6033546001600160a01b031633146127e55760405162461bcd60e51b8152600401611072906159f7565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015612832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122969190615c28565b6000611086338484613495565b81604051806060016040528060298152602001615ed1602991396001600160a01b0382166000908152606a6020526040902054819060ff16156128b95760405162461bcd60e51b81526004016110729190615680565b50608d546001600160a01b031661291d5760405162461bcd60e51b815260206004820152602260248201527f536166656d6f6f6e3a204d6967726174696f6e206973206e6f74207374617274604482015261195960f21b6064820152608401611072565b608d546001600160a01b0316336001600160a01b0316146129785760405162461bcd60e51b815260206004820152601560248201527414d859995b5bdbdb8e88139bdd08105b1b1bddd959605a1b6044820152606401611072565b61164c84846144e7565b6033546001600160a01b031633146129ac5760405162461bcd60e51b8152600401611072906159f7565b609b805460ff1916911515919091179055565b6000606d54841115612a135760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401611072565b81612a2e576000612a248585614557565b51915061140d9050565b6000612a3a8585614557565b60200151915061140d9050565b6033546001600160a01b03163314612a715760405162461bcd60e51b8152600401611072906159f7565b609980546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314612abd5760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03166000908152606a60205260409020805460ff19169055565b6033546001600160a01b03163314612b085760405162461bcd60e51b8152600401611072906159f7565b612b29612710612b2383606d5461466a90919063ffffffff16565b906139a8565b60905550565b6033546001600160a01b03163314612b595760405162461bcd60e51b8152600401611072906159f7565b60895482908110612b7c5760405162461bcd60e51b815260040161107290615a2c565b600060898481548110612b9157612b91615a63565b60009182526020918290206040805160e0810182526007909302909101805483526001810154938301939093526002830154908201526003820154606082018190526004830154608083015260058301546001600160a01b0390811660a084015260069093015490921660c08201529150612c0e90829085613a03565b8260898581548110612c2257612c22615a63565b60009182526020909120600360079092020101558361164c57505060775550565b6033546001600160a01b03163314612c6d5760405162461bcd60e51b8152600401611072906159f7565b8060005b8181101561164c576000848483818110612c8d57612c8d615a63565b9050602002016020810190612ca29190615716565b6001600160a01b03811660009081526098602052604090205490915060ff16612ccb5750612d21565b6001600160a01b038116600081815260986020908152604091829020805460ff1916905590519182527fe2c466310358d7b1b0084cd125246685e6901a43cb196a7231cac996791f037f910160405180910390a1505b80612d2b81615afc565b915050612c71565b6033546001600160a01b03163314612d5d5760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03166000908152606860205260409020805460ff19169055565b6033546001600160a01b03163314612da85760405162461bcd60e51b8152600401611072906159f7565b608a80546001600160a01b0319166001600160a01b038316908117909155604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015612e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e259190615b17565b608c80546001600160a01b0319166001600160a01b03928316179055608a546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa158015612e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea79190615b17565b608c54604051630edef2e760e31b815230600482018190526001600160a01b03928316602483015260448201529116906376f79738906064016020604051808303816000875af1158015612eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f239190615b17565b608b80546001600160a01b0319166001600160a01b039290921691909117905550565b6033546001600160a01b03163314612f705760405162461bcd60e51b8152600401611072906159f7565b60895482908110612f935760405162461bcd60e51b815260040161107290615a2c565b600060898481548110612fa857612fa8615a63565b60009182526020918290206040805160e0810182526007909302909101805483526001810154938301849052600281015491830191909152600381015460608301526004810154608083015260058101546001600160a01b0390811660a08401526006909101541660c0820152915061302390829085613a03565b826089858154811061303757613037615a63565b60009182526020909120600160079092020101558361164c57505060755550565b6033546001600160a01b031633146130825760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b0381166130e75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611072565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461316d5760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03166000908152606a60209081526040808320805460ff19166001179055606b909152812055565b6033546001600160a01b031633146131c65760405162461bcd60e51b8152600401611072906159f7565b8060005b8181101561164c5760008484838181106131e6576131e6615a63565b90506020020160208101906131fb9190615716565b6001600160a01b03811660009081526098602052604090205490915060ff1615613225575061327e565b6001600160a01b038116600081815260986020908152604091829020805460ff1916600117905590519182527fcf9d8a4ed16c4e921c6462e01033caab94999c1064e6926f765455d51fae70e4910160405180910390a1505b8061328881615afc565b9150506131ca565b6033546001600160a01b031633146132ba5760405162461bcd60e51b8152600401611072906159f7565b609455565b82604051806060016040528060268152602001615e8b602691396001600160a01b0382166000908152606a6020526040902054819060ff16156133155760405162461bcd60e51b81526004016110729190615680565b5083604051806060016040528060288152602001615e18602891396001600160a01b0382166000908152606a6020526040902054819060ff161561336c5760405162461bcd60e51b81526004016110729190615680565b506001600160a01b0387166133cf5760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611072565b6001600160a01b0386166134305760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611072565b6001600160a01b038781166000818152606760209081526040808320948b168084529482529182902089905590518881527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60408051808201825260208082527f536166656d6f6f6e3a204164647265737320697320626c61636b6c697374656481830152336000818152606a90925292902054819060ff16156134fa5760405162461bcd60e51b81526004016110729190615680565b5084604051806060016040528060258152602001615df3602591396001600160a01b0382166000908152606a6020526040902054819060ff16156135515760405162461bcd60e51b81526004016110729190615680565b5085604051806060016040528060238152602001615e68602391396001600160a01b0382166000908152606a6020526040902054819060ff16156135a85760405162461bcd60e51b81526004016110729190615680565b5033803b63ffffffff811615613660576001600160a01b0382166000908152606b60205260409020548061365e576000839050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613635575060408051601f3d908101601f1916820190925261363291810190615b17565b60015b61363e5761365c565b506001600160a01b0384166000908152606b60205260409020600190555b505b505b506001600160a01b038a166136c55760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401611072565b6001600160a01b0389166137275760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401611072565b600088116137895760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401611072565b6137938a8a6146e9565b6137af5760405162461bcd60e51b8152600401611072906159d7565b6033546001600160a01b038b81169116148015906137db57506033546001600160a01b038a8116911614155b15613802576090548811156138025760405162461bcd60e51b815260040161107290615b34565b600061380d306120d9565b9050609054811061381d57506090545b6093548110801590819061383b5750608f54600160a01b900460ff16155b801561384e5750609554610100900460ff165b801561387357506001600160a01b038c1660009081526098602052604090205460ff16155b801561389857506001600160a01b038b1660009081526098602052604090205460ff16155b156138ab5760935491506138ab826147a2565b6001600160a01b038c1660009081526068602052604090205460019060ff16806138ed57506001600160a01b038c1660009081526068602052604090205460ff165b156138f6575060005b6000811561393157506001600160a01b038d166000818152606b60205260409020549033146139315750336000908152606b60205260409020545b61393e8e8e8e8486613acc565b5050505050505050505050505050565b600081848411156139725760405162461bcd60e51b81526004016110729190615680565b5061397d8385615ab0565b949350505050565b60008060006139926147ce565b90925090506139a182826139a8565b9250505090565b60008082116139f95760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401611072565b61140d8284615c5b565b6000613a4c82613a4085613a468860800151613a408a60600151613a408c60400151613a408e602001518f60000151613e0e90919063ffffffff16565b90613e0e565b90613a70565b905060705481111561164c5760405162461bcd60e51b815260040161107290615c6f565b600082821115613ac25760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401611072565b61140d8284615ab0565b80613ad957613ad9614864565b6001600160a01b03851660009081526069602052604090205460ff16158015613b1b57506001600160a01b03841660009081526069602052604090205460ff16155b15613b3157613b2c85858585614972565b613c26565b6001600160a01b03851660009081526069602052604090205460ff168015613b7257506001600160a01b03841660009081526069602052604090205460ff16155b15613b8357613b2c85858585614a58565b6001600160a01b03851660009081526069602052604090205460ff16158015613bc457506001600160a01b03841660009081526069602052604090205460ff165b15613bd557613b2c85858585614b0a565b6001600160a01b03851660009081526069602052604090205460ff168015613c1557506001600160a01b03841660009081526069602052604090205460ff165b15613c2657613c2685858585614bb8565b80613c3357613c33614d03565b5050505050565b613c42615598565b6000613c916040518060e001604052808b81526020018a8152602001898152602001888152602001878152602001866001600160a01b03168152602001856001600160a01b0316815250614d19565b9050613c9c84611e7a565b613ca583611e7a565b6089805460018101825560009190915281517f5bfa74c743914028161ae645d300d90bbdc659f169ca1469ec86b4960f7266cb60079092029182015560208201517f5bfa74c743914028161ae645d300d90bbdc659f169ca1469ec86b4960f7266cc82015560408201517f5bfa74c743914028161ae645d300d90bbdc659f169ca1469ec86b4960f7266cd82015560608201517f5bfa74c743914028161ae645d300d90bbdc659f169ca1469ec86b4960f7266ce82015560808201517f5bfa74c743914028161ae645d300d90bbdc659f169ca1469ec86b4960f7266cf82015560a08201517f5bfa74c743914028161ae645d300d90bbdc659f169ca1469ec86b4960f7266d0820180546001600160a01b03199081166001600160a01b039384161790915560c08401517f5bfa74c743914028161ae645d300d90bbdc659f169ca1469ec86b4960f7266d190930180549091169290911691909117905598975050505050505050565b600080613e1b8385615cb5565b90508381101561140d5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611072565b600054610100900460ff1680613e825750303b155b80613e90575060005460ff16155b613eac5760405162461bcd60e51b815260040161107290615bc1565b600054610100900460ff16158015612314576000805461ffff19166101011790558015611ca7576000805461ff001916905550565b600054610100900460ff1680613ef65750303b155b80613f04575060005460ff16155b613f205760405162461bcd60e51b815260040161107290615bc1565b600054610100900460ff16158015613f42576000805461ffff19166101011790555b603380546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611ca7576000805461ff001916905550565b600054610100900460ff1680613fae5750303b155b80613fbc575060005460ff16155b613fd85760405162461bcd60e51b815260040161107290615bc1565b600054610100900460ff16158015613ffa576000805461ffff19166101011790555b6040805180820190915260088082526729b0b332a6b7b7b760c11b6020909201918252614029916071916155e7565b506040805180820190915260038082526253464d60e81b6020909201918252614054916072916155e7565b506073805460ff19166009179055683635c9adc5dea00000606d81905561407d90600019615ccd565b61408990600019615ab0565b606e556103e8607055674563918244f400006090556706f05b59d3b20000609155608f80546001600160a01b03191661dead1790556140c53390565b608e80546001600160a01b0319166001600160a01b03928316908117909155606e5460009182526065602090815260408084209290925560335490931682526068909252818120805460ff199081166001908117909255308352929091208054909216179055614133614d81565b606d546040519081523390600090600080516020615eb18339815191529060200160405180910390a38015611ca7576000805461ff001916905550565b6040805160028082526060820183526000926020830190803683375050608a54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156141da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141fe9190615b17565b8160008151811061421157614211615a63565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061424557614245615a63565b6001600160a01b03928316602091820292909201810191909152608a546040805163c6b06e2d60e01b81529051600094929092169263c6b06e2d926004808401938290030181865afa15801561429f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142c39190615b17565b90506142ec6142da6033546001600160a01b031690565b608a546001600160a01b0316856132bf565b604051632254285d60e11b81526000906001600160a01b038316906344a850ba9061431d9087908790600401615d25565b602060405180830381865afa15801561433a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061435e9190615c0f565b905060006040518060a00160405280868152602001600081526020018581526020016143926033546001600160a01b031690565b6001600160a01b03168152602001428152509050826001600160a01b031663a351408783876143c19190615cb5565b83856040518463ffffffff1660e01b81526004016143e0929190615d8f565b6000604051808303818588803b1580156143f957600080fd5b505af115801561440d573d6000803e3d6000fd5b50505050505050505050565b608a546144319030906001600160a01b0316846132bf565b608a546001600160a01b031663f305d71982308560008061445a6033546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156144c2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613c339190615db1565b6001600160a01b03821661453d5760405162461bcd60e51b815260206004820152601f60248201527f42455032303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401611072565b608e54611942906001600160a01b03168383600080613acc565b6145a66040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60006145b28484614ea1565b905060006145e18260a00151613a408460800151613a4086602001518760400151613e0e90919063ffffffff16565b905060008060006145ff888660600151866145fa613985565b61500c565b92509250925060405180610120016040528084815260200183815260200182815260200186600001518152602001866020015181526020018660400151815260200186606001518152602001866080015181526020018660a001518152509550505050505092915050565b6000826146795750600061108a565b60006146858385615ac7565b9050826146928583615c5b565b1461140d5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611072565b609b5460009060ff166146fe5750600161108a565b6001600160a01b0383166000908152609c602052604090205460ff16801561473e57506001600160a01b0382166000908152609c602052604090205460ff165b1561474b5750600161108a565b6001600160a01b0383166000908152609c602052604090205460ff16801561478c57506001600160a01b0383166000908152609d602052604090205460ff16155b156147995750600161108a565b50600092915050565b608f805460ff60a01b1916600160a01b1790556147be8161505c565b50608f805460ff60a01b19169055565b600080606e5460965411806147e65750606d54609754115b156147f7575050606e54606d549091565b6000614810609654606e54613a7090919063ffffffff16565b9050600061482b609754606d54613a7090919063ffffffff16565b9050614844606d54606e546139a890919063ffffffff16565b82101561485b57606e54606d549350935050509091565b90939092509050565b608960008154811061487857614878615a63565b6000918252602082206007909102018054607b556001810154607c556002810154607d556003810154607e556004810154607f556005810154608080546001600160a01b03199081166001600160a01b039384161790915560069092015460818054909316911617905560898054608292906148f6576148f6615a63565b6000918252602090912082546007909202019081556001808301549082015560028083015490820155600380830154908201556004808301549082015560058083015490820180546001600160a01b03199081166001600160a01b03938416179091556006938401549390920180549092169216919091179055565b600061497e8383614557565b80516001600160a01b0387166000908152606560205260409020549192506149a69190613a70565b6001600160a01b03808716600090815260656020908152604080832094909455840151918716815291909120546149dc91613e0e565b6001600160a01b038516600090815260656020526040902055614a0085828461528a565b614a1281604001518260c00151615324565b836001600160a01b0316856001600160a01b0316600080516020615eb18339815191528360600151604051614a4991815260200190565b60405180910390a35050505050565b6000614a648383614557565b6001600160a01b038616600090815260666020526040902054909150614a8a9084613a70565b6001600160a01b03808716600090815260666020908152604080832094909455848101519288168252606590529190912054614ac591613e0e565b6001600160a01b038516600090815260656020526040902055609754614aeb9084613a70565b6097558051609654614afc91613a70565b609655614a0085828461528a565b6000614b168383614557565b80516001600160a01b038716600090815260656020526040902054919250614b3e9190613a70565b6001600160a01b0380871660009081526065602090815260408083209490945560608501519288168252606690529190912054614b7a91613e0e565b6001600160a01b0385166000908152606660205260409020556060810151609754614ba491613e0e565b6097556020810151609654614afc91613e0e565b6000614bc48383614557565b6001600160a01b038616600090815260666020526040902054909150614bea9084613a70565b6001600160a01b0380871660009081526066602052604080822093909355606084015191871681529190912054614c2091613e0e565b6001600160a01b0385166000908152606660205260409020556060810151831015614c70576000838260600151614c579190615ab0565b609754909150614c679082613e0e565b60975550614c97565b6000816060015184614c829190615ab0565b609754909150614c929082613a70565b609755505b805160208201511115614cd05780516020820151600091614cb791615ab0565b609654909150614cc79082613e0e565b60965550614cf8565b60208101518151600091614ce391615ab0565b609654909150614cf39082613a70565b609655505b614a0085828461528a565b607b60896000815481106148f6576148f6615a63565b614d21615598565b6000614d568360800151613a408560600151613a408760400151613a4089602001518a60000151613e0e90919063ffffffff16565b9050607054811115614d7a5760405162461bcd60e51b815260040161107290615c6f565b5090919050565b600054610100900460ff1680614d965750303b155b80614da4575060005460ff16155b614dc05760405162461bcd60e51b815260040161107290615bc1565b600054610100900460ff16158015614de2576000805461ffff19166101011790555b614df660006101f480600080600080613c3a565b8051607455602081015160755560408101516076556060810151607755608081015160785560a0810151607980546001600160a01b03199081166001600160a01b039384161790915560c090920151607a80549093169116179055614e6360328060646000808080613c3a565b50614e776032806064806000806000613c3a565b50614e8c6064607d8060966000806000613c3a565b508015611ca7576000805461ff001916905550565b614eda6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600060898381548110614eef57614eef615a63565b600091825260208083206040805160e081018252600790940290910180548452600181015484840152600281015484830152600381015460608501526004810154608085015260058101546001600160a01b0390811660a08601526006909101541660c080850191909152815190810190915283815282519294509190820190614f7a908890615348565b8152602001614f8d878560200151615348565b8152602001614fa0878560400151615348565b8152602001614fb3878560600151615348565b8152602001614fc6878560800151615348565b81525090506150028160a00151613a468360800151613a468560400151613a468760600151613a4689602001518e613a7090919063ffffffff16565b8152949350505050565b600080808061501b888661466a565b90506000615029888761466a565b90506000615037888861466a565b9050600061504982613a468686613a70565b939b939a50919850919650505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061509157615091615a63565b6001600160a01b03928316602091820292909201810191909152608a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156150ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061510e9190615b17565b8160018151811061512157615121615a63565b6001600160a01b03928316602091820292909201810191909152608a546040805163c6b06e2d60e01b81529051600094929092169263c6b06e2d926004808401938290030181865afa15801561517b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061519f9190615b17565b90506000816001600160a01b03166344a850ba85856040518363ffffffff1660e01b81526004016151d1929190615d25565b602060405180830381865afa1580156151ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152129190615c0f565b608a5490915061522d9030906001600160a01b0316866132bf565b6152383083866132bf565b6040805160a081018252858152600060208201528082018590523060608201524260808201529051623aa70160e61b81526001600160a01b03841690630ea9c0409084906143e0908590600401615ddf565b615299838360a0015130615367565b6152d7838360800151608984815481106152b5576152b5615a63565b60009182526020909120600560079092020101546001600160a01b0316615367565b615315838360e00151608984815481106152f3576152f3615a63565b60009182526020909120600660079092020101546001600160a01b0316615367565b6122968383610100015161547f565b606e546153319083613a70565b606e55606f546153419082613e0e565b606f555050565b6000816153575750600061108a565b61140d612710612b23858561466a565b6001600160a01b03811661537a57505050565b8161538457505050565b600061538e613985565b9050600061539c848361466a565b6001600160a01b0384166000908152606560205260409020549091506153c29082613e0e565b6001600160a01b03841660009081526065602090815260408083209390935560699052205460ff161561544c576001600160a01b0383166000908152606660205260409020546154129085613e0e565b6001600160a01b0384166000908152606660205260409020556097546154389085613e0e565b6097556096546154489082613e0e565b6096555b826001600160a01b0316856001600160a01b0316600080516020615eb183398151915286604051614a4991815260200190565b80615488575050565b608f546001600160a01b03166000908152606660205260409020546154ad9082613e0e565b608f546001600160a01b03166000908152606660205260408120919091556154d3613985565b6154dd9083615ac7565b608f546001600160a01b03166000908152606560205260409020549091506155059082613e0e565b608f80546001600160a01b03908116600090815260656020908152604080832095909555925490911681526069909152205460ff16156155605760965461554c9082613e0e565b60965560975461555c9083613e0e565b6097555b608f546040518381526001600160a01b0391821691851690600080516020615eb18339815191529060200160405180910390a3505050565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b8280546155f3906159a2565b90600052602060002090601f016020900481019282615615576000855561565b565b82601f1061562e57805160ff191683800117855561565b565b8280016001018555821561565b579182015b8281111561565b578251825591602001919060010190615640565b5061566792915061566b565b5090565b5b80821115615667576000815560010161566c565b600060208083528351808285015260005b818110156156ad57858101830151858201604001528201615691565b818111156156bf576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611ca757600080fd5b600080604083850312156156fd57600080fd5b8235615708816156d5565b946020939093013593505050565b60006020828403121561572857600080fd5b813561140d816156d5565b60006020828403121561574557600080fd5b5035919050565b60008060006060848603121561576157600080fd5b833561576c816156d5565b9250602084013561577c816156d5565b929592945050506040919091013590565b600080604083850312156157a057600080fd5b50508035926020909101359150565b8015158114611ca757600080fd5b6000602082840312156157cf57600080fd5b813561140d816157af565b600080604083850312156157ed57600080fd5b82356157f8816156d5565b91506020830135615808816157af565b809150509250929050565b6000806040838503121561582657600080fd5b8235615831816156d5565b91506020830135615808816156d5565b6000806040838503121561585457600080fd5b823591506020830135615808816157af565b600080600080600080600060e0888a03121561588157600080fd5b873596506020880135955060408801359450606088013593506080880135925060a08801356158af816156d5565b915060c08801356158bf816156d5565b8091505092959891949750929550565b600080604083850312156158e257600080fd5b823591506020830135615808816156d5565b60008060006060848603121561590957600080fd5b83359250602084013591506040840135615922816157af565b809150509250925092565b6000806020838503121561594057600080fd5b823567ffffffffffffffff8082111561595857600080fd5b818501915085601f83011261596c57600080fd5b81358181111561597b57600080fd5b8660208260051b850101111561599057600080fd5b60209290920196919550909350505050565b600181811c908216806159b657607f821691505b6020821081141561128f57634e487b7160e01b600052602260045260246000fd5b60208082526006908201526514185d5cd95960d21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601c908201527f536166656d6f6f6e3a20496e76616c6964207469657220696e64657800000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260079082015266125b9d985b1a5960ca1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015615ac257615ac2615a9a565b500390565b6000816000190483118215151615615ae157615ae1615a9a565b500290565b634e487b7160e01b600052603160045260246000fd5b6000600019821415615b1057615b10615a9a565b5060010190565b600060208284031215615b2957600080fd5b815161140d816156d5565b60208082526028908201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546040820152673c20b6b7bab73a1760c11b606082015260800190565b60208082526025908201527f536166656d6f6f6e3a2041646472657373205a65726f206973206e6f7420616c6040820152641b1bddd95960da1b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600060208284031215615c2157600080fd5b5051919050565b600060208284031215615c3a57600080fd5b815161140d816157af565b634e487b7160e01b600052601260045260246000fd5b600082615c6a57615c6a615c45565b500490565b60208082526026908201527f536166656d6f6f6e3a2046656573206578636565646564206d6178206c696d696040820152653a30ba34b7b760d11b606082015260800190565b60008219821115615cc857615cc8615a9a565b500190565b600082615cdc57615cdc615c45565b500690565b600081518084526020808501945080840160005b83811015615d1a5781516001600160a01b031687529582019590820190600101615cf5565b509495945050505050565b82815260406020820152600061397d6040830184615ce1565b80518252602081015160208301526000604082015160a06040850152615d6760a0850182615ce1565b6060848101516001600160a01b03169086015260809384015193909401929092525090919050565b604081526000615da26040830185615d3e565b90508260208301529392505050565b600080600060608486031215615dc657600080fd5b8351925060208401519150604084015190509250925092565b60208152600061140d6020830184615d3e56fe536166656d6f6f6e3a2046726f6d206164647265737320697320626c61636b6c6973746564536166656d6f6f6e3a205370656e646572206164647265737320697320626c61636b6c697374656442455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365536166656d6f6f6e3a20546f206164647265737320697320626c61636b6c6973746564536166656d6f6f6e3a204f776e6572206164647265737320697320626c61636b6c6973746564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef536166656d6f6f6e3a204d69677261746564206163636f756e7420697320626c61636b6c6973746564536166656d6f6f6e3a2053656c6563746564206163636f756e7420697320696e20626c61636b6c697374a2646970667358221220729582b9058cb51bd82c681e8482e727a56a45479d0e70351fdddb44b32a091464736f6c634300080b0033
Deployed Bytecode
0x60806040526004361061046c5760003560e01c8063674a31121161024a578063bd3900c011610139578063dd62ed3e116100b6578063f2fde38b1161007a578063f2fde38b14610ee7578063f3290d7514610f07578063f3bf2f6114610f27578063fe575a8714610f47578063fff3e1ba14610f8057600080fd5b8063dd62ed3e14610dc5578063dfd66cb314610e0b578063ea2f0b3714610e87578063ee28088114610ea7578063f2d58c2314610ec757600080fd5b8063d0124920116100fd578063d012492014610d15578063d40cf65914610d45578063d543dbeb14610d65578063d66329b014610d85578063dbc914c714610da557600080fd5b8063bd3900c014610c65578063bedb86fb14610c85578063bf26646914610ca5578063bf610d7e14610cc5578063c4f8414614610cf557600080fd5b80638af319c7116101c757806395d89b411161018b57806395d89b4114610bd65780639e281a9814610beb578063a9059cbb14610c0b578063ad68ebf714610c2b578063b187bd2614610c4b57600080fd5b80638af319c714610b435780638d50d49914610b635780638da5cb5b14610b785780638dd9500214610b965780638fc3d4b814610bb657600080fd5b80637ed948f71161020e5780637ed948f714610a8f578063810315b914610aaf5780638129fc1c14610adf57806388f8202014610af45780638abec60614610b2d57600080fd5b8063674a311214610a045780636bd89cdd14610a2457806370a0823114610a44578063715018a614610a645780637d1db4a514610a7957600080fd5b80633685d4191161036657806349bd5a5e116102e35780635342acb4116102a75780635342acb41461095657806355724b3a1461098f57806360d0eb73146109ae5780636130d38f146109ce5780636531c58c146109ee57600080fd5b806349bd5a5e146108b55780634a581829146108d55780634a74bb02146108f55780634ffc14251461091657806352390c021461093657600080fd5b806342966c681161032a57806342966c6814610815578063437823ec146108355780634549b03914610855578063459c979b146108755780634732a7dc1461089557600080fd5b80633685d4191461075d57806339aa1bba1461077d5780633af32abf1461079d57806340b28c2f146107d557806340c10f19146107f557600080fd5b8063200c7295116103f457806330b263ba116103b857806330b263ba146106bb578063313ce567146106db57806332c2d90c146106fd57806332e6cd411461071d57806334dd8da91461073d57600080fd5b8063200c72951461060b57806323b872dd1461062b5780632d8381191461064b5780632f3aaeb21461066b578063301273341461069b57600080fd5b806313114a9d1161043b57806313114a9d14610514578063132af75c14610529578063140c57591461053e5780631694505e146105be57806318160ddd146105f657600080fd5b806306fdde0314610478578063095ea7b3146104a357806310844953146104d357806311b32601146104f557600080fd5b3661047357005b600080fd5b34801561048457600080fd5b5061048d610fa0565b60405161049a9190615680565b60405180910390f35b3480156104af57600080fd5b506104c36104be3660046156ea565b611032565b604051901515815260200161049a565b3480156104df57600080fd5b506104f36104ee366004615716565b611090565b005b34801561050157600080fd5b506089545b60405190815260200161049a565b34801561052057600080fd5b50606f54610506565b34801561053557600080fd5b506104f3611199565b34801561054a57600080fd5b5061055e610559366004615733565b6111e1565b60405161049a9190815181526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0808301516001600160a01b039081169183019190915260c092830151169181019190915260e00190565b3480156105ca57600080fd5b50608a546105de906001600160a01b031681565b6040516001600160a01b03909116815260200161049a565b34801561060257600080fd5b50606d54610506565b34801561061757600080fd5b506104f36106263660046156ea565b611295565b34801561063757600080fd5b506104c361064636600461574c565b6113aa565b34801561065757600080fd5b50610506610666366004615733565b611414565b34801561067757600080fd5b506104c3610686366004615716565b609c6020526000908152604090205460ff1681565b3480156106a757600080fd5b5061055e6106b6366004615716565b611491565b3480156106c757600080fd5b506104f36106d636600461578d565b61153a565b3480156106e757600080fd5b5060735460405160ff909116815260200161049a565b34801561070957600080fd5b506104f36107183660046157bd565b611652565b34801561072957600080fd5b506099546105de906001600160a01b031681565b34801561074957600080fd5b506104f36107583660046157da565b6116cf565b34801561076957600080fd5b506104f3610778366004615716565b611724565b34801561078957600080fd5b506104f361079836600461578d565b611946565b3480156107a957600080fd5b506104c36107b8366004615716565b6001600160a01b03166000908152606b6020526040902054151590565b3480156107e157600080fd5b506104f36107f0366004615813565b611a57565b34801561080157600080fd5b506104f36108103660046156ea565b611b32565b34801561082157600080fd5b506104f3610830366004615733565b611bec565b34801561084157600080fd5b506104f3610850366004615716565b611caa565b34801561086157600080fd5b50610506610870366004615841565b611cf8565b34801561088157600080fd5b506104f3610890366004615733565b611d06565b3480156108a157600080fd5b506104f36108b0366004615716565b611d5d565b3480156108c157600080fd5b50608b546105de906001600160a01b031681565b3480156108e157600080fd5b506104f36108f03660046157da565b611da9565b34801561090157600080fd5b50608f546104c390600160a81b900460ff1681565b34801561092257600080fd5b506104f3610931366004615866565b611e37565b34801561094257600080fd5b506104f3610951366004615716565b611e7a565b34801561096257600080fd5b506104c3610971366004615716565b6001600160a01b031660009081526068602052604090205460ff1690565b34801561099b57600080fd5b506095546104c390610100900460ff1681565b3480156109ba57600080fd5b50608d546001600160a01b031615156104c3565b3480156109da57600080fd5b506104f36109e93660046157da565b611fd6565b3480156109fa57600080fd5b5061050660935481565b348015610a1057600080fd5b506104f3610a1f366004615733565b61205c565b348015610a3057600080fd5b506104f3610a3f366004615716565b61208b565b348015610a5057600080fd5b50610506610a5f366004615716565b6120d9565b348015610a7057600080fd5b506104f3612138565b348015610a8557600080fd5b5061050660905481565b348015610a9b57600080fd5b506104f3610aaa3660046158cf565b6121ac565b348015610abb57600080fd5b506104c3610aca366004615716565b609d6020526000908152604090205460ff1681565b348015610aeb57600080fd5b506104f361229b565b348015610b0057600080fd5b506104c3610b0f366004615716565b6001600160a01b031660009081526069602052604090205460ff1690565b348015610b3957600080fd5b5061050660945481565b348015610b4f57600080fd5b506104f3610b5e3660046158cf565b612328565b348015610b6f57600080fd5b506104f3612418565b348015610b8457600080fd5b506033546001600160a01b03166105de565b348015610ba257600080fd5b50608c546105de906001600160a01b031681565b348015610bc257600080fd5b506104f3610bd136600461578d565b612698565b348015610be257600080fd5b5061048d6127ac565b348015610bf757600080fd5b506104f3610c063660046156ea565b6127bb565b348015610c1757600080fd5b506104c3610c263660046156ea565b612856565b348015610c3757600080fd5b506104f3610c463660046156ea565b612863565b348015610c5757600080fd5b50609b546104c39060ff1681565b348015610c7157600080fd5b50608f546105de906001600160a01b031681565b348015610c9157600080fd5b506104f3610ca03660046157bd565b612982565b348015610cb157600080fd5b50610506610cc03660046158f4565b6129bf565b348015610cd157600080fd5b506104c3610ce0366004615716565b609a6020526000908152604090205460ff1681565b348015610d0157600080fd5b506104f3610d10366004615716565b612a47565b348015610d2157600080fd5b506104c3610d30366004615716565b60986020526000908152604090205460ff1681565b348015610d5157600080fd5b506104f3610d60366004615716565b612a93565b348015610d7157600080fd5b506104f3610d80366004615733565b612ade565b348015610d9157600080fd5b506104f3610da036600461578d565b612b2f565b348015610db157600080fd5b506104f3610dc036600461592d565b612c43565b348015610dd157600080fd5b50610506610de0366004615813565b6001600160a01b03918216600090815260676020908152604080832093909416825291909152205490565b348015610e1757600080fd5b50607454607554607654607754607854607954607a54610e469695949392916001600160a01b03908116911687565b60408051978852602088019690965294860193909352606085019190915260808401526001600160a01b0390811660a08401521660c082015260e00161049a565b348015610e9357600080fd5b506104f3610ea2366004615716565b612d33565b348015610eb357600080fd5b506104f3610ec2366004615716565b612d7e565b348015610ed357600080fd5b506104f3610ee236600461578d565b612f46565b348015610ef357600080fd5b506104f3610f02366004615716565b613058565b348015610f1357600080fd5b506104f3610f22366004615716565b613143565b348015610f3357600080fd5b506104f3610f4236600461592d565b61319c565b348015610f5357600080fd5b506104c3610f62366004615716565b6001600160a01b03166000908152606a602052604090205460ff1690565b348015610f8c57600080fd5b506104f3610f9b366004615733565b613290565b606060718054610faf906159a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdb906159a2565b80156110285780601f10610ffd57610100808354040283529160200191611028565b820191906000526020600020905b81548152906001019060200180831161100b57829003601f168201915b5050505050905090565b609b5460009060ff1615806110565750336000908152609c602052604090205460ff165b61107b5760405162461bcd60e51b8152600401611072906159d7565b60405180910390fd5b6110863384846132bf565b5060015b92915050565b6033546001600160a01b031633146110ba5760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03811661110c5760405162461bcd60e51b8152602060048201526019602482015278536166656d6f6f6e3a20496e76616c6964206164647265737360381b6044820152606401611072565b6001600160a01b0381166000908152606b602052604090205461117f5760405162461bcd60e51b815260206004820152602560248201527f536166656d6f6f6e3a204163636f756e74206973206e6f7420696e2077686974604482015264195b1a5cdd60da1b6064820152608401611072565b6001600160a01b03166000908152606b6020526040812055565b6033546001600160a01b031633146111c35760405162461bcd60e51b8152600401611072906159f7565b608f805460ff60a81b191690556095805461ff001916610100179055565b6111e9615598565b6089548290811061120c5760405162461bcd60e51b815260040161107290615a2c565b6089838154811061121f5761121f615a63565b60009182526020918290206040805160e081018252600790930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260058201546001600160a01b0390811660a083015260069092015490911660c082015291505b50919050565b6033546001600160a01b031633146112bf5760405162461bcd60e51b8152600401611072906159f7565b608954819081106112e25760405162461bcd60e51b815260040161107290615a2c565b826040518060600160405280602a8152602001615efa602a91396001600160a01b0382166000908152606a6020526040902054819060ff16156113385760405162461bcd60e51b81526004016110729190615680565b506001600160a01b03851661138b5760405162461bcd60e51b8152602060048201526019602482015278536166656d6f6f6e3a20496e76616c6964206164647265737360381b6044820152606401611072565b5050506001600160a01b039091166000908152606b6020526040902055565b60006113b7848484613495565b611409843361140485604051806060016040528060288152602001615e40602891396001600160a01b038a166000908152606760209081526040808320338452909152902054919061394e565b6132bf565b5060015b9392505050565b6000606e5482111561147b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401611072565b6000611485613985565b905061140d83826139a8565b611499615598565b6001600160a01b0382166000908152606b60205260409020546089805490919081106114c7576114c7615a63565b60009182526020918290206040805160e081018252600790930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260058201546001600160a01b0390811660a083015260069092015490911660c082015292915050565b6033546001600160a01b031633146115645760405162461bcd60e51b8152600401611072906159f7565b608954829081106115875760405162461bcd60e51b815260040161107290615a2c565b60006089848154811061159c5761159c615a63565b60009182526020918290206040805160e0810182526007909302909101805483526001810154938301939093526002830154908201819052600383015460608301526004830154608083015260058301546001600160a01b0390811660a084015260069093015490921660c0820152915061161990829085613a03565b826089858154811061162d5761162d615a63565b60009182526020909120600260079092020101558361164c5760768390555b50505050565b6033546001600160a01b0316331461167c5760405162461bcd60e51b8152600401611072906159f7565b609580548215156101000261ff00199091161790556040517ef279ea7539cc7cc5311702e24242fe836f7f94e8e329be09530ade3dd254c3906116c490831515815260200190565b60405180910390a150565b6033546001600160a01b031633146116f95760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03919091166000908152609a60205260409020805460ff1916911515919091179055565b6033546001600160a01b0316331461174e5760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03811660009081526069602052604090205460ff166117865760405162461bcd60e51b815260040161107290615a79565b60005b606c5481101561194257816001600160a01b0316606c82815481106117b0576117b0615a63565b6000918252602090912001546001600160a01b0316141561193057606c80546117db90600190615ab0565b815481106117eb576117eb615a63565b600091825260209091200154606c80546001600160a01b03909216918390811061181757611817615a63565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061184d613985565b6001600160a01b0383166000908152606660205260409020546118709190615ac7565b6001600160a01b0383166000908152606560209081526040808320939093556066905220546097546118a191613a70565b6097556001600160a01b0382166000908152606560205260409020546096546118c991613a70565b6096556001600160a01b038216600090815260666020908152604080832083905560699091529020805460ff19169055606c80548061190a5761190a615ae6565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b8061193a81615afc565b915050611789565b5050565b6033546001600160a01b031633146119705760405162461bcd60e51b8152600401611072906159f7565b608954829081106119935760405162461bcd60e51b815260040161107290615a2c565b6000608984815481106119a8576119a8615a63565b60009182526020918290206040805160e08101825260079093029091018054808452600182015494840194909452600281015491830191909152600381015460608301526004810154608083015260058101546001600160a01b0390811660a08401526006909101541660c08201529150611a2590829085613a03565b8260898581548110611a3957611a39615a63565b60009182526020909120600790910201558361164c57505060745550565b6033546001600160a01b03163314611a815760405162461bcd60e51b8152600401611072906159f7565b608a80546001600160a01b038085166001600160a01b03199283168117909355608b805491851691909216179055604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015611aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0e9190615b17565b608c80546001600160a01b0319166001600160a01b03929092169190911790555050565b609b5460ff161580611b535750336000908152609c602052604090205460ff165b611b6f5760405162461bcd60e51b8152600401611072906159d7565b336000908152609a602052604090205460ff16611b9e5760405162461bcd60e51b815260040161107290615a79565b6033546001600160a01b03163314611bd257609054811115611bd25760405162461bcd60e51b815260040161107290615b34565b609954611942906001600160a01b03168383600080613acc565b609b5460ff161580611c0d5750336000908152609c602052604090205460ff165b611c295760405162461bcd60e51b8152600401611072906159d7565b336000908152609a602052604090205460ff16611c585760405162461bcd60e51b815260040161107290615a79565b6033546001600160a01b03163314611c8c57609054811115611c8c5760405162461bcd60e51b815260040161107290615b34565b609954611ca79033906001600160a01b031683600080613acc565b50565b6033546001600160a01b03163314611cd45760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03166000908152606860205260409020805460ff19166001179055565b600061140d836000846129bf565b6033546001600160a01b03163314611d305760405162461bcd60e51b8152600401611072906159f7565b604051339082156108fc029083906000818181858888f19350505050158015611942573d6000803e3d6000fd5b6033546001600160a01b03163314611d875760405162461bcd60e51b8152600401611072906159f7565b608d80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314611dd35760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b0382166000818152609c6020908152604091829020805460ff19168515159081179091558251938452908301527fe5532272281c5b79ae737a18f13faaf65c6d39fbebe8e5d5c9d842475d5d36fb91015b60405180910390a15050565b6033546001600160a01b03163314611e615760405162461bcd60e51b8152600401611072906159f7565b611e7087878787878787613c3a565b5050505050505050565b6033546001600160a01b03163314611ea45760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03811660009081526069602052604090205460ff1615611edd5760405162461bcd60e51b815260040161107290615a79565b6001600160a01b03811660009081526065602052604090205415611f70576001600160a01b038116600090815260656020526040902054611f1d90611414565b6001600160a01b0382166000908152606660205260409020819055609754611f4491613e0e565b6097556001600160a01b038116600090815260656020526040902054609654611f6c91613e0e565b6096555b6001600160a01b03166000818152606960205260408120805460ff19166001908117909155606c805491820181559091527f2b4a51ab505fc96a0952efda2ba61bcd3078d4c02c39a186ec16f21883fbe0160180546001600160a01b0319169091179055565b6033546001600160a01b031633146120005760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b0382166000818152609d6020908152604091829020805460ff19168515159081179091558251938452908301527f7bbec7f46aba5f3c18434ab4aba04fa47673a668c615724e7344386e8b62e02c9101611e2b565b6033546001600160a01b031633146120865760405162461bcd60e51b8152600401611072906159f7565b609355565b6033546001600160a01b031633146120b55760405162461bcd60e51b8152600401611072906159f7565b608f80546001600160a01b0319166001600160a01b038316179055611ca781611e7a565b6001600160a01b03811660009081526069602052604081205460ff161561211657506001600160a01b031660009081526066602052604090205490565b6001600160a01b03821660009081526065602052604090205461108a90611414565b6033546001600160a01b031633146121625760405162461bcd60e51b8152600401611072906159f7565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b031633146121d65760405162461bcd60e51b8152600401611072906159f7565b608954829081106121f95760405162461bcd60e51b815260040161107290615a2c565b6001600160a01b03821661221f5760405162461bcd60e51b815260040161107290615b7c565b61222882611e7a565b816089848154811061223c5761223c615a63565b906000526020600020906007020160050160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550826000141561229657607980546001600160a01b0319166001600160a01b0384161790555b505050565b600054610100900460ff16806122b05750303b155b806122be575060005460ff16155b6122da5760405162461bcd60e51b815260040161107290615bc1565b600054610100900460ff161580156122fc576000805461ffff19166101011790555b612304613e6d565b61230c613ee1565b612314613f99565b8015611ca7576000805461ff001916905550565b6033546001600160a01b031633146123525760405162461bcd60e51b8152600401611072906159f7565b608954829081106123755760405162461bcd60e51b815260040161107290615a2c565b6001600160a01b03821661239b5760405162461bcd60e51b815260040161107290615b7c565b6123a482611e7a565b81608984815481106123b8576123b8615a63565b906000526020600020906007020160060160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550826000141561229657607a80546001600160a01b0384166001600160a01b0319909116179055505050565b6033546001600160a01b031633146124425760405162461bcd60e51b8152600401611072906159f7565b608f805460ff60a01b1916600160a01b17905560945447908110156124bc5760405162461bcd60e51b815260206004820152602a60248201527f424e422062616c616e6365206973206e6f7420726561636820666f722053264560448201526908151a1c995cda1bdb1960b21b6064820152608401611072565b5060945460006124cd8260026139a8565b905060006124db8383613a70565b6040516370a0823160e01b815233600482015290915060009030906370a0823190602401602060405180830381865afa15801561251c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125409190615c0f565b905061254b83614170565b6040516370a0823160e01b815233600482015260009030906370a0823190602401602060405180830381865afa158015612589573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ad9190615c0f565b905060006125bb8284613a70565b90506125c83330836132bf565b6040516323b872dd60e01b8152336004820152306024820181905260448201839052906323b872dd906064016020604051808303816000875af1158015612613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126379190615c28565b506126428185614419565b60408051868152602081018390529081018590527f08261edc7b257da79c22afdc1c7064b198c7abe8fdd21070ac0b55e0351804a39060600160405180910390a15050608f805460ff60a01b1916905550505050565b6033546001600160a01b031633146126c25760405162461bcd60e51b8152600401611072906159f7565b608954829081106126e55760405162461bcd60e51b815260040161107290615a2c565b6000608984815481106126fa576126fa615a63565b60009182526020918290206040805160e0810182526007909302909101805483526001810154938301939093526002830154908201526003820154606082015260048201546080820181905260058301546001600160a01b0390811660a084015260069093015490921660c0820152915061277790829085613a03565b826089858154811061278b5761278b615a63565b60009182526020909120600460079092020101558361164c57505060785550565b606060728054610faf906159a2565b6033546001600160a01b031633146127e55760405162461bcd60e51b8152600401611072906159f7565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015612832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122969190615c28565b6000611086338484613495565b81604051806060016040528060298152602001615ed1602991396001600160a01b0382166000908152606a6020526040902054819060ff16156128b95760405162461bcd60e51b81526004016110729190615680565b50608d546001600160a01b031661291d5760405162461bcd60e51b815260206004820152602260248201527f536166656d6f6f6e3a204d6967726174696f6e206973206e6f74207374617274604482015261195960f21b6064820152608401611072565b608d546001600160a01b0316336001600160a01b0316146129785760405162461bcd60e51b815260206004820152601560248201527414d859995b5bdbdb8e88139bdd08105b1b1bddd959605a1b6044820152606401611072565b61164c84846144e7565b6033546001600160a01b031633146129ac5760405162461bcd60e51b8152600401611072906159f7565b609b805460ff1916911515919091179055565b6000606d54841115612a135760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401611072565b81612a2e576000612a248585614557565b51915061140d9050565b6000612a3a8585614557565b60200151915061140d9050565b6033546001600160a01b03163314612a715760405162461bcd60e51b8152600401611072906159f7565b609980546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314612abd5760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03166000908152606a60205260409020805460ff19169055565b6033546001600160a01b03163314612b085760405162461bcd60e51b8152600401611072906159f7565b612b29612710612b2383606d5461466a90919063ffffffff16565b906139a8565b60905550565b6033546001600160a01b03163314612b595760405162461bcd60e51b8152600401611072906159f7565b60895482908110612b7c5760405162461bcd60e51b815260040161107290615a2c565b600060898481548110612b9157612b91615a63565b60009182526020918290206040805160e0810182526007909302909101805483526001810154938301939093526002830154908201526003820154606082018190526004830154608083015260058301546001600160a01b0390811660a084015260069093015490921660c08201529150612c0e90829085613a03565b8260898581548110612c2257612c22615a63565b60009182526020909120600360079092020101558361164c57505060775550565b6033546001600160a01b03163314612c6d5760405162461bcd60e51b8152600401611072906159f7565b8060005b8181101561164c576000848483818110612c8d57612c8d615a63565b9050602002016020810190612ca29190615716565b6001600160a01b03811660009081526098602052604090205490915060ff16612ccb5750612d21565b6001600160a01b038116600081815260986020908152604091829020805460ff1916905590519182527fe2c466310358d7b1b0084cd125246685e6901a43cb196a7231cac996791f037f910160405180910390a1505b80612d2b81615afc565b915050612c71565b6033546001600160a01b03163314612d5d5760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03166000908152606860205260409020805460ff19169055565b6033546001600160a01b03163314612da85760405162461bcd60e51b8152600401611072906159f7565b608a80546001600160a01b0319166001600160a01b038316908117909155604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015612e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e259190615b17565b608c80546001600160a01b0319166001600160a01b03928316179055608a546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa158015612e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea79190615b17565b608c54604051630edef2e760e31b815230600482018190526001600160a01b03928316602483015260448201529116906376f79738906064016020604051808303816000875af1158015612eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f239190615b17565b608b80546001600160a01b0319166001600160a01b039290921691909117905550565b6033546001600160a01b03163314612f705760405162461bcd60e51b8152600401611072906159f7565b60895482908110612f935760405162461bcd60e51b815260040161107290615a2c565b600060898481548110612fa857612fa8615a63565b60009182526020918290206040805160e0810182526007909302909101805483526001810154938301849052600281015491830191909152600381015460608301526004810154608083015260058101546001600160a01b0390811660a08401526006909101541660c0820152915061302390829085613a03565b826089858154811061303757613037615a63565b60009182526020909120600160079092020101558361164c57505060755550565b6033546001600160a01b031633146130825760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b0381166130e75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611072565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461316d5760405162461bcd60e51b8152600401611072906159f7565b6001600160a01b03166000908152606a60209081526040808320805460ff19166001179055606b909152812055565b6033546001600160a01b031633146131c65760405162461bcd60e51b8152600401611072906159f7565b8060005b8181101561164c5760008484838181106131e6576131e6615a63565b90506020020160208101906131fb9190615716565b6001600160a01b03811660009081526098602052604090205490915060ff1615613225575061327e565b6001600160a01b038116600081815260986020908152604091829020805460ff1916600117905590519182527fcf9d8a4ed16c4e921c6462e01033caab94999c1064e6926f765455d51fae70e4910160405180910390a1505b8061328881615afc565b9150506131ca565b6033546001600160a01b031633146132ba5760405162461bcd60e51b8152600401611072906159f7565b609455565b82604051806060016040528060268152602001615e8b602691396001600160a01b0382166000908152606a6020526040902054819060ff16156133155760405162461bcd60e51b81526004016110729190615680565b5083604051806060016040528060288152602001615e18602891396001600160a01b0382166000908152606a6020526040902054819060ff161561336c5760405162461bcd60e51b81526004016110729190615680565b506001600160a01b0387166133cf5760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611072565b6001600160a01b0386166134305760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611072565b6001600160a01b038781166000818152606760209081526040808320948b168084529482529182902089905590518881527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60408051808201825260208082527f536166656d6f6f6e3a204164647265737320697320626c61636b6c697374656481830152336000818152606a90925292902054819060ff16156134fa5760405162461bcd60e51b81526004016110729190615680565b5084604051806060016040528060258152602001615df3602591396001600160a01b0382166000908152606a6020526040902054819060ff16156135515760405162461bcd60e51b81526004016110729190615680565b5085604051806060016040528060238152602001615e68602391396001600160a01b0382166000908152606a6020526040902054819060ff16156135a85760405162461bcd60e51b81526004016110729190615680565b5033803b63ffffffff811615613660576001600160a01b0382166000908152606b60205260409020548061365e576000839050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613635575060408051601f3d908101601f1916820190925261363291810190615b17565b60015b61363e5761365c565b506001600160a01b0384166000908152606b60205260409020600190555b505b505b506001600160a01b038a166136c55760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401611072565b6001600160a01b0389166137275760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401611072565b600088116137895760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401611072565b6137938a8a6146e9565b6137af5760405162461bcd60e51b8152600401611072906159d7565b6033546001600160a01b038b81169116148015906137db57506033546001600160a01b038a8116911614155b15613802576090548811156138025760405162461bcd60e51b815260040161107290615b34565b600061380d306120d9565b9050609054811061381d57506090545b6093548110801590819061383b5750608f54600160a01b900460ff16155b801561384e5750609554610100900460ff165b801561387357506001600160a01b038c1660009081526098602052604090205460ff16155b801561389857506001600160a01b038b1660009081526098602052604090205460ff16155b156138ab5760935491506138ab826147a2565b6001600160a01b038c1660009081526068602052604090205460019060ff16806138ed57506001600160a01b038c1660009081526068602052604090205460ff165b156138f6575060005b6000811561393157506001600160a01b038d166000818152606b60205260409020549033146139315750336000908152606b60205260409020545b61393e8e8e8e8486613acc565b5050505050505050505050505050565b600081848411156139725760405162461bcd60e51b81526004016110729190615680565b5061397d8385615ab0565b949350505050565b60008060006139926147ce565b90925090506139a182826139a8565b9250505090565b60008082116139f95760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401611072565b61140d8284615c5b565b6000613a4c82613a4085613a468860800151613a408a60600151613a408c60400151613a408e602001518f60000151613e0e90919063ffffffff16565b90613e0e565b90613a70565b905060705481111561164c5760405162461bcd60e51b815260040161107290615c6f565b600082821115613ac25760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401611072565b61140d8284615ab0565b80613ad957613ad9614864565b6001600160a01b03851660009081526069602052604090205460ff16158015613b1b57506001600160a01b03841660009081526069602052604090205460ff16155b15613b3157613b2c85858585614972565b613c26565b6001600160a01b03851660009081526069602052604090205460ff168015613b7257506001600160a01b03841660009081526069602052604090205460ff16155b15613b8357613b2c85858585614a58565b6001600160a01b03851660009081526069602052604090205460ff16158015613bc457506001600160a01b03841660009081526069602052604090205460ff165b15613bd557613b2c85858585614b0a565b6001600160a01b03851660009081526069602052604090205460ff168015613c1557506001600160a01b03841660009081526069602052604090205460ff165b15613c2657613c2685858585614bb8565b80613c3357613c33614d03565b5050505050565b613c42615598565b6000613c916040518060e001604052808b81526020018a8152602001898152602001888152602001878152602001866001600160a01b03168152602001856001600160a01b0316815250614d19565b9050613c9c84611e7a565b613ca583611e7a565b6089805460018101825560009190915281517f5bfa74c743914028161ae645d300d90bbdc659f169ca1469ec86b4960f7266cb60079092029182015560208201517f5bfa74c743914028161ae645d300d90bbdc659f169ca1469ec86b4960f7266cc82015560408201517f5bfa74c743914028161ae645d300d90bbdc659f169ca1469ec86b4960f7266cd82015560608201517f5bfa74c743914028161ae645d300d90bbdc659f169ca1469ec86b4960f7266ce82015560808201517f5bfa74c743914028161ae645d300d90bbdc659f169ca1469ec86b4960f7266cf82015560a08201517f5bfa74c743914028161ae645d300d90bbdc659f169ca1469ec86b4960f7266d0820180546001600160a01b03199081166001600160a01b039384161790915560c08401517f5bfa74c743914028161ae645d300d90bbdc659f169ca1469ec86b4960f7266d190930180549091169290911691909117905598975050505050505050565b600080613e1b8385615cb5565b90508381101561140d5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611072565b600054610100900460ff1680613e825750303b155b80613e90575060005460ff16155b613eac5760405162461bcd60e51b815260040161107290615bc1565b600054610100900460ff16158015612314576000805461ffff19166101011790558015611ca7576000805461ff001916905550565b600054610100900460ff1680613ef65750303b155b80613f04575060005460ff16155b613f205760405162461bcd60e51b815260040161107290615bc1565b600054610100900460ff16158015613f42576000805461ffff19166101011790555b603380546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611ca7576000805461ff001916905550565b600054610100900460ff1680613fae5750303b155b80613fbc575060005460ff16155b613fd85760405162461bcd60e51b815260040161107290615bc1565b600054610100900460ff16158015613ffa576000805461ffff19166101011790555b6040805180820190915260088082526729b0b332a6b7b7b760c11b6020909201918252614029916071916155e7565b506040805180820190915260038082526253464d60e81b6020909201918252614054916072916155e7565b506073805460ff19166009179055683635c9adc5dea00000606d81905561407d90600019615ccd565b61408990600019615ab0565b606e556103e8607055674563918244f400006090556706f05b59d3b20000609155608f80546001600160a01b03191661dead1790556140c53390565b608e80546001600160a01b0319166001600160a01b03928316908117909155606e5460009182526065602090815260408084209290925560335490931682526068909252818120805460ff199081166001908117909255308352929091208054909216179055614133614d81565b606d546040519081523390600090600080516020615eb18339815191529060200160405180910390a38015611ca7576000805461ff001916905550565b6040805160028082526060820183526000926020830190803683375050608a54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156141da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141fe9190615b17565b8160008151811061421157614211615a63565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061424557614245615a63565b6001600160a01b03928316602091820292909201810191909152608a546040805163c6b06e2d60e01b81529051600094929092169263c6b06e2d926004808401938290030181865afa15801561429f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142c39190615b17565b90506142ec6142da6033546001600160a01b031690565b608a546001600160a01b0316856132bf565b604051632254285d60e11b81526000906001600160a01b038316906344a850ba9061431d9087908790600401615d25565b602060405180830381865afa15801561433a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061435e9190615c0f565b905060006040518060a00160405280868152602001600081526020018581526020016143926033546001600160a01b031690565b6001600160a01b03168152602001428152509050826001600160a01b031663a351408783876143c19190615cb5565b83856040518463ffffffff1660e01b81526004016143e0929190615d8f565b6000604051808303818588803b1580156143f957600080fd5b505af115801561440d573d6000803e3d6000fd5b50505050505050505050565b608a546144319030906001600160a01b0316846132bf565b608a546001600160a01b031663f305d71982308560008061445a6033546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156144c2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613c339190615db1565b6001600160a01b03821661453d5760405162461bcd60e51b815260206004820152601f60248201527f42455032303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401611072565b608e54611942906001600160a01b03168383600080613acc565b6145a66040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60006145b28484614ea1565b905060006145e18260a00151613a408460800151613a4086602001518760400151613e0e90919063ffffffff16565b905060008060006145ff888660600151866145fa613985565b61500c565b92509250925060405180610120016040528084815260200183815260200182815260200186600001518152602001866020015181526020018660400151815260200186606001518152602001866080015181526020018660a001518152509550505050505092915050565b6000826146795750600061108a565b60006146858385615ac7565b9050826146928583615c5b565b1461140d5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611072565b609b5460009060ff166146fe5750600161108a565b6001600160a01b0383166000908152609c602052604090205460ff16801561473e57506001600160a01b0382166000908152609c602052604090205460ff165b1561474b5750600161108a565b6001600160a01b0383166000908152609c602052604090205460ff16801561478c57506001600160a01b0383166000908152609d602052604090205460ff16155b156147995750600161108a565b50600092915050565b608f805460ff60a01b1916600160a01b1790556147be8161505c565b50608f805460ff60a01b19169055565b600080606e5460965411806147e65750606d54609754115b156147f7575050606e54606d549091565b6000614810609654606e54613a7090919063ffffffff16565b9050600061482b609754606d54613a7090919063ffffffff16565b9050614844606d54606e546139a890919063ffffffff16565b82101561485b57606e54606d549350935050509091565b90939092509050565b608960008154811061487857614878615a63565b6000918252602082206007909102018054607b556001810154607c556002810154607d556003810154607e556004810154607f556005810154608080546001600160a01b03199081166001600160a01b039384161790915560069092015460818054909316911617905560898054608292906148f6576148f6615a63565b6000918252602090912082546007909202019081556001808301549082015560028083015490820155600380830154908201556004808301549082015560058083015490820180546001600160a01b03199081166001600160a01b03938416179091556006938401549390920180549092169216919091179055565b600061497e8383614557565b80516001600160a01b0387166000908152606560205260409020549192506149a69190613a70565b6001600160a01b03808716600090815260656020908152604080832094909455840151918716815291909120546149dc91613e0e565b6001600160a01b038516600090815260656020526040902055614a0085828461528a565b614a1281604001518260c00151615324565b836001600160a01b0316856001600160a01b0316600080516020615eb18339815191528360600151604051614a4991815260200190565b60405180910390a35050505050565b6000614a648383614557565b6001600160a01b038616600090815260666020526040902054909150614a8a9084613a70565b6001600160a01b03808716600090815260666020908152604080832094909455848101519288168252606590529190912054614ac591613e0e565b6001600160a01b038516600090815260656020526040902055609754614aeb9084613a70565b6097558051609654614afc91613a70565b609655614a0085828461528a565b6000614b168383614557565b80516001600160a01b038716600090815260656020526040902054919250614b3e9190613a70565b6001600160a01b0380871660009081526065602090815260408083209490945560608501519288168252606690529190912054614b7a91613e0e565b6001600160a01b0385166000908152606660205260409020556060810151609754614ba491613e0e565b6097556020810151609654614afc91613e0e565b6000614bc48383614557565b6001600160a01b038616600090815260666020526040902054909150614bea9084613a70565b6001600160a01b0380871660009081526066602052604080822093909355606084015191871681529190912054614c2091613e0e565b6001600160a01b0385166000908152606660205260409020556060810151831015614c70576000838260600151614c579190615ab0565b609754909150614c679082613e0e565b60975550614c97565b6000816060015184614c829190615ab0565b609754909150614c929082613a70565b609755505b805160208201511115614cd05780516020820151600091614cb791615ab0565b609654909150614cc79082613e0e565b60965550614cf8565b60208101518151600091614ce391615ab0565b609654909150614cf39082613a70565b609655505b614a0085828461528a565b607b60896000815481106148f6576148f6615a63565b614d21615598565b6000614d568360800151613a408560600151613a408760400151613a4089602001518a60000151613e0e90919063ffffffff16565b9050607054811115614d7a5760405162461bcd60e51b815260040161107290615c6f565b5090919050565b600054610100900460ff1680614d965750303b155b80614da4575060005460ff16155b614dc05760405162461bcd60e51b815260040161107290615bc1565b600054610100900460ff16158015614de2576000805461ffff19166101011790555b614df660006101f480600080600080613c3a565b8051607455602081015160755560408101516076556060810151607755608081015160785560a0810151607980546001600160a01b03199081166001600160a01b039384161790915560c090920151607a80549093169116179055614e6360328060646000808080613c3a565b50614e776032806064806000806000613c3a565b50614e8c6064607d8060966000806000613c3a565b508015611ca7576000805461ff001916905550565b614eda6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600060898381548110614eef57614eef615a63565b600091825260208083206040805160e081018252600790940290910180548452600181015484840152600281015484830152600381015460608501526004810154608085015260058101546001600160a01b0390811660a08601526006909101541660c080850191909152815190810190915283815282519294509190820190614f7a908890615348565b8152602001614f8d878560200151615348565b8152602001614fa0878560400151615348565b8152602001614fb3878560600151615348565b8152602001614fc6878560800151615348565b81525090506150028160a00151613a468360800151613a468560400151613a468760600151613a4689602001518e613a7090919063ffffffff16565b8152949350505050565b600080808061501b888661466a565b90506000615029888761466a565b90506000615037888861466a565b9050600061504982613a468686613a70565b939b939a50919850919650505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061509157615091615a63565b6001600160a01b03928316602091820292909201810191909152608a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156150ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061510e9190615b17565b8160018151811061512157615121615a63565b6001600160a01b03928316602091820292909201810191909152608a546040805163c6b06e2d60e01b81529051600094929092169263c6b06e2d926004808401938290030181865afa15801561517b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061519f9190615b17565b90506000816001600160a01b03166344a850ba85856040518363ffffffff1660e01b81526004016151d1929190615d25565b602060405180830381865afa1580156151ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152129190615c0f565b608a5490915061522d9030906001600160a01b0316866132bf565b6152383083866132bf565b6040805160a081018252858152600060208201528082018590523060608201524260808201529051623aa70160e61b81526001600160a01b03841690630ea9c0409084906143e0908590600401615ddf565b615299838360a0015130615367565b6152d7838360800151608984815481106152b5576152b5615a63565b60009182526020909120600560079092020101546001600160a01b0316615367565b615315838360e00151608984815481106152f3576152f3615a63565b60009182526020909120600660079092020101546001600160a01b0316615367565b6122968383610100015161547f565b606e546153319083613a70565b606e55606f546153419082613e0e565b606f555050565b6000816153575750600061108a565b61140d612710612b23858561466a565b6001600160a01b03811661537a57505050565b8161538457505050565b600061538e613985565b9050600061539c848361466a565b6001600160a01b0384166000908152606560205260409020549091506153c29082613e0e565b6001600160a01b03841660009081526065602090815260408083209390935560699052205460ff161561544c576001600160a01b0383166000908152606660205260409020546154129085613e0e565b6001600160a01b0384166000908152606660205260409020556097546154389085613e0e565b6097556096546154489082613e0e565b6096555b826001600160a01b0316856001600160a01b0316600080516020615eb183398151915286604051614a4991815260200190565b80615488575050565b608f546001600160a01b03166000908152606660205260409020546154ad9082613e0e565b608f546001600160a01b03166000908152606660205260408120919091556154d3613985565b6154dd9083615ac7565b608f546001600160a01b03166000908152606560205260409020549091506155059082613e0e565b608f80546001600160a01b03908116600090815260656020908152604080832095909555925490911681526069909152205460ff16156155605760965461554c9082613e0e565b60965560975461555c9083613e0e565b6097555b608f546040518381526001600160a01b0391821691851690600080516020615eb18339815191529060200160405180910390a3505050565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b8280546155f3906159a2565b90600052602060002090601f016020900481019282615615576000855561565b565b82601f1061562e57805160ff191683800117855561565b565b8280016001018555821561565b579182015b8281111561565b578251825591602001919060010190615640565b5061566792915061566b565b5090565b5b80821115615667576000815560010161566c565b600060208083528351808285015260005b818110156156ad57858101830151858201604001528201615691565b818111156156bf576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611ca757600080fd5b600080604083850312156156fd57600080fd5b8235615708816156d5565b946020939093013593505050565b60006020828403121561572857600080fd5b813561140d816156d5565b60006020828403121561574557600080fd5b5035919050565b60008060006060848603121561576157600080fd5b833561576c816156d5565b9250602084013561577c816156d5565b929592945050506040919091013590565b600080604083850312156157a057600080fd5b50508035926020909101359150565b8015158114611ca757600080fd5b6000602082840312156157cf57600080fd5b813561140d816157af565b600080604083850312156157ed57600080fd5b82356157f8816156d5565b91506020830135615808816157af565b809150509250929050565b6000806040838503121561582657600080fd5b8235615831816156d5565b91506020830135615808816156d5565b6000806040838503121561585457600080fd5b823591506020830135615808816157af565b600080600080600080600060e0888a03121561588157600080fd5b873596506020880135955060408801359450606088013593506080880135925060a08801356158af816156d5565b915060c08801356158bf816156d5565b8091505092959891949750929550565b600080604083850312156158e257600080fd5b823591506020830135615808816156d5565b60008060006060848603121561590957600080fd5b83359250602084013591506040840135615922816157af565b809150509250925092565b6000806020838503121561594057600080fd5b823567ffffffffffffffff8082111561595857600080fd5b818501915085601f83011261596c57600080fd5b81358181111561597b57600080fd5b8660208260051b850101111561599057600080fd5b60209290920196919550909350505050565b600181811c908216806159b657607f821691505b6020821081141561128f57634e487b7160e01b600052602260045260246000fd5b60208082526006908201526514185d5cd95960d21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601c908201527f536166656d6f6f6e3a20496e76616c6964207469657220696e64657800000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260079082015266125b9d985b1a5960ca1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015615ac257615ac2615a9a565b500390565b6000816000190483118215151615615ae157615ae1615a9a565b500290565b634e487b7160e01b600052603160045260246000fd5b6000600019821415615b1057615b10615a9a565b5060010190565b600060208284031215615b2957600080fd5b815161140d816156d5565b60208082526028908201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546040820152673c20b6b7bab73a1760c11b606082015260800190565b60208082526025908201527f536166656d6f6f6e3a2041646472657373205a65726f206973206e6f7420616c6040820152641b1bddd95960da1b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600060208284031215615c2157600080fd5b5051919050565b600060208284031215615c3a57600080fd5b815161140d816157af565b634e487b7160e01b600052601260045260246000fd5b600082615c6a57615c6a615c45565b500490565b60208082526026908201527f536166656d6f6f6e3a2046656573206578636565646564206d6178206c696d696040820152653a30ba34b7b760d11b606082015260800190565b60008219821115615cc857615cc8615a9a565b500190565b600082615cdc57615cdc615c45565b500690565b600081518084526020808501945080840160005b83811015615d1a5781516001600160a01b031687529582019590820190600101615cf5565b509495945050505050565b82815260406020820152600061397d6040830184615ce1565b80518252602081015160208301526000604082015160a06040850152615d6760a0850182615ce1565b6060848101516001600160a01b03169086015260809384015193909401929092525090919050565b604081526000615da26040830185615d3e565b90508260208301529392505050565b600080600060608486031215615dc657600080fd5b8351925060208401519150604084015190509250925092565b60208152600061140d6020830184615d3e56fe536166656d6f6f6e3a2046726f6d206164647265737320697320626c61636b6c6973746564536166656d6f6f6e3a205370656e646572206164647265737320697320626c61636b6c697374656442455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365536166656d6f6f6e3a20546f206164647265737320697320626c61636b6c6973746564536166656d6f6f6e3a204f776e6572206164647265737320697320626c61636b6c6973746564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef536166656d6f6f6e3a204d69677261746564206163636f756e7420697320626c61636b6c6973746564536166656d6f6f6e3a2053656c6563746564206163636f756e7420697320696e20626c61636b6c697374a2646970667358221220729582b9058cb51bd82c681e8482e727a56a45479d0e70351fdddb44b32a091464736f6c634300080b0033
Deployed Bytecode Sourcemap
23377:39711:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30248:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31160:175;;;;;;;;;;-1:-1:-1;31160:175:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;31160:175:0;1072:187:1;34994:275:0;;;;;;;;;;-1:-1:-1;34994:275:0;;;;;:::i;:::-;;:::i;:::-;;60009:97;;;;;;;;;;-1:-1:-1;60083:8:0;:15;60009:97;;;1662:25:1;;;1650:2;1635:18;60009:97:0;1516:177:1;31876:87:0;;;;;;;;;;-1:-1:-1;31945:10:0;;31876:87;;40823:135;;;;;;;;;;;;;:::i;40136:147::-;;;;;;;;;;-1:-1:-1;40136:147:0;;;;;:::i;:::-;;:::i;:::-;;;;;;2098:13:1;;2080:32;;2168:4;2156:17;;;2150:24;2128:20;;;2121:54;2231:4;2219:17;;;2213:24;2191:20;;;2184:54;2294:4;2282:17;;;2276:24;2254:20;;;2247:54;2357:4;2345:17;;;2339:24;2317:20;;;2310:54;2411:4;2399:17;;;2393:24;-1:-1:-1;;;;;2493:21:1;;;2471:20;;;2464:51;;;;2575:4;2563:17;;;2557:24;2553:33;2531:20;;;2524:63;;;;2067:3;2052:19;;1883:710;25095:41:0;;;;;;;;;;-1:-1:-1;25095:41:0;;;;-1:-1:-1;;;;;25095:41:0;;;;;;-1:-1:-1;;;;;2788:32:1;;;2770:51;;2758:2;2743:18;25095:41:0;2598:229:1;30525:95:0;;;;;;;;;;-1:-1:-1;30605:7:0;;30525:95;;34636:350;;;;;;;;;;-1:-1:-1;34636:350:0;;;;;:::i;:::-;;:::i;31343:397::-;;;;;;;;;;-1:-1:-1;31343:397:0;;;;;:::i;:::-;;:::i;32704:253::-;;;;;;;;;;-1:-1:-1;32704:253:0;;;;;:::i;:::-;;:::i;27791:46::-;;;;;;;;;;-1:-1:-1;27791:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;35277:135;;;;;;;;;;-1:-1:-1;35277:135:0;;;;;:::i;:::-;;:::i;37270:360::-;;;;;;;;;;-1:-1:-1;37270:360:0;;;;;:::i;:::-;;:::i;30434:83::-;;;;;;;;;;-1:-1:-1;30500:9:0;;30434:83;;30500:9;;;;3688:36:1;;3676:2;3661:18;30434:83:0;3546:184:1;41110:168:0;;;;;;;;;;-1:-1:-1;41110:168:0;;;;;:::i;:::-;;:::i;27673:32::-;;;;;;;;;;-1:-1:-1;27673:32:0;;;;-1:-1:-1;;;;;27673:32:0;;;61954:117;;;;;;;;;;-1:-1:-1;61954:117:0;;;;;:::i;:::-;;:::i;33719:672::-;;;;;;;;;;-1:-1:-1;33719:672:0;;;;;:::i;:::-;;:::i;36374:440::-;;;;;;;;;;-1:-1:-1;36374:440:0;;;;;:::i;:::-;;:::i;35420:121::-;;;;;;;;;;-1:-1:-1;35420:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;35506:23:0;35482:4;35506:23;;;:13;:23;;;;;;:27;;;35420:121;40565:250;;;;;;;;;;-1:-1:-1;40565:250:0;;;;;:::i;:::-;;:::i;62079:298::-;;;;;;;;;;-1:-1:-1;62079:298:0;;;;;:::i;:::-;;:::i;62385:290::-;;;;;;;;;;-1:-1:-1;62385:290:0;;;;;:::i;:::-;;:::i;34399:111::-;;;;;;;;;;-1:-1:-1;34399:111:0;;;;;:::i;:::-;;:::i;32513:183::-;;;;;;;;;;-1:-1:-1;32513:183:0;;;;;:::i;:::-;;:::i;60698:111::-;;;;;;;;;;-1:-1:-1;60698:111:0;;;;;:::i;:::-;;:::i;59167:107::-;;;;;;;;;;-1:-1:-1;59167:107:0;;;;;:::i;:::-;;:::i;25143:28::-;;;;;;;;;;-1:-1:-1;25143:28:0;;;;-1:-1:-1;;;;;25143:28:0;;;62683:160;;;;;;;;;;-1:-1:-1;62683:160:0;;;;;:::i;:::-;;:::i;25342:33::-;;;;;;;;;;-1:-1:-1;25342:33:0;;;;-1:-1:-1;;;25342:33:0;;;;;;39210:347;;;;;;;;;;-1:-1:-1;39210:347:0;;;;;:::i;:::-;;:::i;33111:454::-;;;;;;;;;;-1:-1:-1;33111:454:0;;;;;:::i;:::-;;:::i;44695:124::-;;;;;;;;;;-1:-1:-1;44695:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;44784:27:0;44760:4;44784:27;;;:18;:27;;;;;;;;;44695:124;26853:32;;;;;;;;;;-1:-1:-1;26853:32:0;;;;;;;;;;;59282:117;;;;;;;;;;-1:-1:-1;59368:9:0;;-1:-1:-1;;;;;59368:9:0;:23;;59282:117;;62941:144;;;;;;;;;;-1:-1:-1;62941:144:0;;;;;:::i;:::-;;:::i;26736:36::-;;;;;;;;;;;;;;;;60434:126;;;;;;;;;;-1:-1:-1;60434:126:0;;;;;:::i;:::-;;:::i;60114:165::-;;;;;;;;;;-1:-1:-1;60114:165:0;;;;;:::i;:::-;;:::i;30628:198::-;;;;;;;;;;-1:-1:-1;30628:198:0;;;;;:::i;:::-;;:::i;17066:148::-;;;;;;;;;;;;;:::i;25384:27::-;;;;;;;;;;;;;;;;38398:430;;;;;;;;;;-1:-1:-1;38398:430:0;;;;;:::i;:::-;;:::i;27844:41::-;;;;;;;;;;-1:-1:-1;27844:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28547:164;;;;;;;;;;;;;:::i;31748:120::-;;;;;;;;;;-1:-1:-1;31748:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;31840:20:0;31816:4;31840:20;;;:11;:20;;;;;;;;;31748:120;26779:38;;;;;;;;;;;;;;;;38836:366;;;;;;;;;;-1:-1:-1;38836:366:0;;;;;:::i;:::-;;:::i;49503:1356::-;;;;;;;;;;;;;:::i;16415:87::-;;;;;;;;;;-1:-1:-1;16488:6:0;;-1:-1:-1;;;;;16488:6:0;16415:87;;25178:19;;;;;;;;;;-1:-1:-1;25178:19:0;;;;-1:-1:-1;;;;;25178:19:0;;;38022:368;;;;;;;;;;-1:-1:-1;38022:368:0;;;;;:::i;:::-;;:::i;30339:87::-;;;;;;;;;;;;;:::i;60287:139::-;;;;;;;;;;-1:-1:-1;60287:139:0;;;;;:::i;:::-;;:::i;30834:167::-;;;;;;;;;;-1:-1:-1;30834:167:0;;;;;:::i;:::-;;:::i;59407:368::-;;;;;;;;;;-1:-1:-1;59407:368:0;;;;;:::i;:::-;;:::i;27764:20::-;;;;;;;;;;-1:-1:-1;27764:20:0;;;;;;;;25278:27;;;;;;;;;;-1:-1:-1;25278:27:0;;;;-1:-1:-1;;;;;25278:27:0;;;62851:82;;;;;;;;;;-1:-1:-1;62851:82:0;;;;;:::i;:::-;;:::i;31971:534::-;;;;;;;;;;-1:-1:-1;31971:534:0;;;;;:::i;:::-;;:::i;27712:45::-;;;;;;;;;;-1:-1:-1;27712:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;61840:106;;;;;;;;;;-1:-1:-1;61840:106:0;;;;;:::i;:::-;;:::i;27547:61::-;;;;;;;;;;-1:-1:-1;27547:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40445:112;;;;;;;;;;-1:-1:-1;40445:112:0;;;;;:::i;:::-;;:::i;40966:136::-;;;;;;;;;;-1:-1:-1;40966:136:0;;;;;:::i;:::-;;:::i;37638:376::-;;;;;;;;;;-1:-1:-1;37638:376:0;;;;;:::i;:::-;;:::i;61251:434::-;;;;;;;;;;-1:-1:-1;61251:434:0;;;;;:::i;:::-;;:::i;31009:143::-;;;;;;;;;;-1:-1:-1;31009:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;31117:18:0;;;31090:7;31117:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;31009:143;24955:27;;;;;;;;;;-1:-1:-1;24955:27:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24955:27:0;;;;;;;;;;;7780:25:1;;;7836:2;7821:18;;7814:34;;;;7864:18;;;7857:34;;;;7922:2;7907:18;;7900:34;;;;7965:3;7950:19;;7943:35;-1:-1:-1;;;;;8053:15:1;;;8005:3;8032:19;;8025:44;8106:15;8100:3;8085:19;;8078:44;7767:3;7752:19;24955:27:0;7465:663:1;34518:110:0;;;;;;;;;;-1:-1:-1;34518:110:0;;;;;:::i;:::-;;:::i;29563:338::-;;;;;;;;;;-1:-1:-1;29563:338:0;;;;;:::i;:::-;;:::i;36822:440::-;;;;;;;;;;-1:-1:-1;36822:440:0;;;;;:::i;:::-;;:::i;17369:244::-;;;;;;;;;;-1:-1:-1;17369:244:0;;;;;:::i;:::-;;:::i;40291:146::-;;;;;;;;;;-1:-1:-1;40291:146:0;;;;;:::i;:::-;;:::i;60817:426::-;;;;;;;;;;-1:-1:-1;60817:426:0;;;;;:::i;:::-;;:::i;44827:116::-;;;;;;;;;;-1:-1:-1;44827:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;44912:23:0;44888:4;44912:23;;;:14;:23;;;;;;;;;44827:116;60568:122;;;;;;;;;;-1:-1:-1;60568:122:0;;;;;:::i;:::-;;:::i;30248:83::-;30285:13;30318:5;30311:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30248:83;:::o;31160:175::-;28470:8;;31249:4;;28470:8;;28469:9;;:39;;-1:-1:-1;28497:10:0;28482:26;;;;:14;:26;;;;;;;;28469:39;28461:58;;;;-1:-1:-1;;;28461:58:0;;;;;;;:::i;:::-;;;;;;;;;31266:39:::1;15397:10:::0;31289:7:::1;31298:6;31266:8;:39::i;:::-;-1:-1:-1::0;31323:4:0::1;28530:1;31160:175:::0;;;;:::o;34994:275::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35083:22:0;::::1;35075:60;;;::::0;-1:-1:-1;;;35075:60:0;;9415:2:1;35075:60:0::1;::::0;::::1;9397:21:1::0;9454:2;9434:18;;;9427:30;-1:-1:-1;;;9473:18:1;;;9466:55;9538:18;;35075:60:0::1;9213:349:1::0;35075:60:0::1;-1:-1:-1::0;;;;;35154:23:0;::::1;35180:1;35154:23:::0;;;:13:::1;:23;::::0;;;;;35146:77:::1;;;::::0;-1:-1:-1;;;35146:77:0;;9769:2:1;35146:77:0::1;::::0;::::1;9751:21:1::0;9808:2;9788:18;;;9781:30;9847:34;9827:18;;;9820:62;-1:-1:-1;;;9898:18:1;;;9891:35;9943:19;;35146:77:0::1;9567:401:1::0;35146:77:0::1;-1:-1:-1::0;;;;;35234:23:0::1;35260:1;35234:23:::0;;;:13:::1;:23;::::0;;;;:27;34994:275::o;40823:135::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;40883:21:::1;:29:::0;;-1:-1:-1;;;;40883:29:0::1;::::0;;40923:20:::1;:27:::0;;-1:-1:-1;;40923:27:0::1;40883:29;40923:27;::::0;;40823:135::o;40136:147::-;40221:14;;:::i;:::-;25890:8;:15;40200:10;;25890:24;-1:-1:-1;25882:65:0;;;;-1:-1:-1;;;25882:65:0;;;;;;;:::i;:::-;40255:8:::1;40264:10;40255:20;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;40248:27:::1;::::0;;::::1;::::0;::::1;::::0;;40255:20:::1;::::0;;::::1;::::0;;::::1;40248:27:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;40248:27:0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;;-1:-1:-1;25958:1:0::1;40136:147:::0;;;;:::o;34636:350::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;25890:8:::1;:15:::0;34759:10;;25890:24;-1:-1:-1;25882:65:0::1;;;;-1:-1:-1::0;;;25882:65:0::1;;;;;;;:::i;:::-;34799:8:::2;25975:145;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;26065:24:0;::::2;;::::0;;;:14:::2;:24;::::0;;;;;26091:8;;26065:24:::2;;26064:25;26056:44;;;;-1:-1:-1::0;;;26056:44:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;34879:22:0;::::3;34871:60;;;::::0;-1:-1:-1;;;34871:60:0;;9415:2:1;34871:60:0::3;::::0;::::3;9397:21:1::0;9454:2;9434:18;;;9427:30;-1:-1:-1;;;9473:18:1;;;9466:55;9538:18;;34871:60:0::3;9213:349:1::0;34871:60:0::3;-1:-1:-1::0;;;;;;;;34942:23:0;;::::3;;::::0;;;:13:::3;:23;::::0;;;;:36;34636:350::o;31343:397::-;31475:4;31492:36;31502:6;31510:9;31521:6;31492:9;:36::i;:::-;31539:171;31562:6;15397:10;31610:89;31648:6;31610:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31610:19:0;;;;;;:11;:19;;;;;;;;15397:10;31610:33;;;;;;;;;;:37;:89::i;:::-;31539:8;:171::i;:::-;-1:-1:-1;31728:4:0;31343:397;;;;;;:::o;32704:253::-;32771:7;32810;;32799;:18;;32791:73;;;;-1:-1:-1;;;32791:73:0;;10664:2:1;32791:73:0;;;10646:21:1;10703:2;10683:18;;;10676:30;10742:34;10722:18;;;10715:62;-1:-1:-1;;;10793:18:1;;;10786:40;10843:19;;32791:73:0;10462:406:1;32791:73:0;32875:19;32897:10;:8;:10::i;:::-;32875:32;-1:-1:-1;32925:24:0;:7;32875:32;32925:11;:24::i;35277:135::-;35337:14;;:::i;:::-;-1:-1:-1;;;;;35380:23:0;;;;;;:13;:23;;;;;;35371:8;:33;;:8;;35380:23;35371:33;;;;;;:::i;:::-;;;;;;;;;;35364:40;;;;;;;;35371:33;;;;;;;35364:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35364:40:0;;;;;;;;;;;;;;;;;;;;35277:135;-1:-1:-1;;35277:135:0:o;37270:360::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;25890:8:::1;:15:::0;37367:10;;25890:24;-1:-1:-1;25882:65:0::1;;;;-1:-1:-1::0;;;25882:65:0::1;;;;;;;:::i;:::-;37390:19:::2;37412:8;37421:10;37412:20;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;37390:42:::2;::::0;;::::2;::::0;::::2;::::0;;37412:20:::2;::::0;;::::2;::::0;;::::2;37390:42:::0;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;-1:-1:-1;;;;;37390:42:0;;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;;-1:-1:-1;37443:44:0::2;::::0;37390:42;;37479:7;37443:16:::2;:44::i;:::-;37528:7;37498:8;37507:10;37498:20;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:27:::2;:20;::::0;;::::2;;:27;:37:::0;37550:15;37546:77:::2;;37582:19:::0;:29;;;37546:77:::2;37379:251;16706:1:::1;37270:360:::0;;:::o;41110:168::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;41186:20:::1;:31:::0;;;::::1;;;;-1:-1:-1::0;;41186:31:0;;::::1;;::::0;;41233:37:::1;::::0;::::1;::::0;::::1;::::0;41209:8;1237:14:1;1230:22;1212:41;;1200:2;1185:18;;1072:187;41233:37:0::1;;;;;;;;41110:168:::0;:::o;61954:117::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62037:18:0;;;::::1;;::::0;;;:13:::1;:18;::::0;;;;:26;;-1:-1:-1;;62037:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61954:117::o;33719:672::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33799:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;33791:40;;;;-1:-1:-1::0;;;33791:40:0::1;;;;;;;:::i;:::-;33847:9;33842:542;33866:9;:16:::0;33862:20;::::1;33842:542;;;33924:7;-1:-1:-1::0;;;;;33908:23:0::1;:9;33918:1;33908:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;33908:12:0::1;:23;33904:469;;;33967:9;33977:16:::0;;:20:::1;::::0;33996:1:::1;::::0;33977:20:::1;:::i;:::-;33967:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;33952:9:::1;:12:::0;;-1:-1:-1;;;;;33967:31:0;;::::1;::::0;33962:1;;33952:12;::::1;;;;;:::i;:::-;;;;;;;;;:46;;;;;-1:-1:-1::0;;;;;33952:46:0::1;;;;;-1:-1:-1::0;;;;;33952:46:0::1;;;;;;34055:10;:8;:10::i;:::-;-1:-1:-1::0;;;;;34036:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;:29:::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;;;;34017:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:48;;;;34122:7:::1;:16:::0;;;;34102:15:::1;::::0;:37:::1;::::0;:19:::1;:37::i;:::-;34084:15;:55:::0;-1:-1:-1;;;;;34196:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;34176:15:::1;::::0;:37:::1;::::0;:19:::1;:37::i;:::-;34158:15;:55:::0;-1:-1:-1;;;;;34232:16:0;::::1;34251:1;34232:16:::0;;;:7:::1;:16;::::0;;;;;;;:20;;;34271:11:::1;:20:::0;;;;;:28;;-1:-1:-1;;34271:28:0::1;::::0;;34318:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;34318:15:0;;;;;-1:-1:-1;;;;;;34318:15:0::1;::::0;;;;;33842:542:::1;33719:672:::0;:::o;33904:469::-:1;33884:3:::0;::::1;::::0;::::1;:::i;:::-;;;;33842:542;;;;33719:672:::0;:::o;36374:440::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;25890:8:::1;:15:::0;36510:10;;25890:24;-1:-1:-1;25882:65:0::1;;;;-1:-1:-1::0;;;25882:65:0::1;;;;;;;:::i;:::-;36538:19:::2;36560:8;36569:10;36560:20;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;36538:42:::2;::::0;;::::2;::::0;::::2;::::0;;36560:20:::2;::::0;;::::2;::::0;;::::2;36538:42:::0;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;-1:-1:-1;;;;;36538:42:0;;::::2;::::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;-1:-1:-1;36591:56:0::2;::::0;36538:42;;36633:13;36591:16:::2;:56::i;:::-;36694:13;36658:8;36667:10;36658:20;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:49:::0;36722:15;36718:89:::2;;-1:-1:-1::0;;36754:12:0::2;:41:::0;-1:-1:-1;36374:440:0:o;40565:250::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;40672:15:::1;:54:::0;;-1:-1:-1;;;;;40672:54:0;;::::1;-1:-1:-1::0;;;;;;40672:54:0;;::::1;::::0;::::1;::::0;;;40737:13:::1;:30:::0;;;;::::1;::::0;;;::::1;;::::0;;40785:22:::1;::::0;;-1:-1:-1;;;40785:22:0;;;;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;40672:54;40785:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40778:4;:29:::0;;-1:-1:-1;;;;;;40778:29:0::1;-1:-1:-1::0;;;;;40778:29:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;40565:250:0:o;62079:298::-;28470:8;;;;28469:9;;:39;;-1:-1:-1;28497:10:0;28482:26;;;;:14;:26;;;;;;;;28469:39;28461:58;;;;-1:-1:-1;;;28461:58:0;;;;;;;:::i;:::-;28374:10:::1;28360:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;28352:45;;;;-1:-1:-1::0;;;28352:45:0::1;;;;;;;:::i;:::-;16488:6:::0;;-1:-1:-1;;;;;16488:6:0;62177:10:::2;:21;62173:129;;62233:12;;62223:6;:22;;62215:75;;;;-1:-1:-1::0;;;62215:75:0::2;;;;;;;:::i;:::-;62327:17;::::0;62312:57:::2;::::0;-1:-1:-1;;;;;62327:17:0::2;62346:4:::0;62352:6;62327:17:::2;::::0;62312:14:::2;:57::i;62385:290::-:0;28470:8;;;;28469:9;;:39;;-1:-1:-1;28497:10:0;28482:26;;;;:14;:26;;;;;;;;28469:39;28461:58;;;;-1:-1:-1;;;28461:58:0;;;;;;;:::i;:::-;28374:10:::1;28360:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;28352:45;;;;-1:-1:-1::0;;;28352:45:0::1;;;;;;;:::i;:::-;16488:6:::0;;-1:-1:-1;;;;;16488:6:0;62469:10:::2;:21;62465:129;;62525:12;;62515:6;:22;;62507:75;;;;-1:-1:-1::0;;;62507:75:0::2;;;;;;;:::i;:::-;62631:17;::::0;62604:63:::2;::::0;62619:10:::2;::::0;-1:-1:-1;;;;;62631:17:0::2;62650:6:::0;62631:17:::2;::::0;62604:14:::2;:63::i;:::-;62385:290:::0;:::o;34399:111::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34468:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;34468:34:0::1;34498:4;34468:34;::::0;;34399:111::o;32513:183::-;32604:7;32631:57;32658:7;32667:1;32670:17;32631:26;:57::i;60698:111::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;60764:37:::1;::::0;60772:10:::1;::::0;60764:37;::::1;;;::::0;60793:7;;60764:37:::1;::::0;;;60793:7;60772:10;60764:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;59167:107:::0;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;59244:9:::1;:22:::0;;-1:-1:-1;;;;;;59244:22:0::1;-1:-1:-1::0;;;;;59244:22:0;;;::::1;::::0;;;::::1;::::0;;59167:107::o;62683:160::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62764:20:0;::::1;;::::0;;;:14:::1;:20;::::0;;;;;;;;:28;;-1:-1:-1;;62764:28:0::1;::::0;::::1;;::::0;;::::1;::::0;;;62808:27;;12748:51:1;;;12815:18;;;12808:50;62808:27:0::1;::::0;12721:18:1;62808:27:0::1;;;;;;;;62683:160:::0;;:::o;39210:347::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;39461:88:::1;39470:13;39485;39500:7;39509:9;39520:8;39530:10;39542:6;39461:8;:88::i;:::-;;39210:347:::0;;;;;;;:::o;33111:454::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33192:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;33191:21;33183:41;;;;-1:-1:-1::0;;;33183:41:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33239:16:0;::::1;33258:1;33239:16:::0;;;:7:::1;:16;::::0;;;;;:20;33235:249:::1;;-1:-1:-1::0;;;;;33315:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;33295:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;33276:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;;;33365:15:::1;::::0;:37:::1;::::0;:19:::1;:37::i;:::-;33347:15;:55:::0;-1:-1:-1;;;;;33455:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;33435:15:::1;::::0;:37:::1;::::0;:19:::1;:37::i;:::-;33417:15;:55:::0;33235:249:::1;-1:-1:-1::0;;;;;33496:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;33496:27:0::1;33519:4;33496:27:::0;;::::1;::::0;;;33534:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;33534:23:0::1;::::0;;::::1;::::0;;33111:454::o;62941:144::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63015:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;;;;:23;;-1:-1:-1;;63015:23:0::1;::::0;::::1;;::::0;;::::1;::::0;;;63054;;12748:51:1;;;12815:18;;;12808:50;63054:23:0::1;::::0;12721:18:1;63054:23:0::1;12580:284:1::0;60434:126:0;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;60519:21:::1;:33:::0;60434:126::o;60114:165::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;60196:12:::1;:30:::0;;-1:-1:-1;;;;;;60196:30:0::1;-1:-1:-1::0;;;;;60196:30:0;::::1;;::::0;;60237:34:::1;60196:30:::0;60237:17:::1;:34::i;30628:198::-:0;-1:-1:-1;;;;;30718:20:0;;30694:7;30718:20;;;:11;:20;;;;;;;;30714:49;;;-1:-1:-1;;;;;;30747:16:0;;;;;:7;:16;;;;;;;30628:198::o;30714:49::-;-1:-1:-1;;;;;30801:16:0;;;;;;:7;:16;;;;;;30781:37;;:19;:37::i;17066:148::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;17157:6:::1;::::0;17136:40:::1;::::0;17173:1:::1;::::0;-1:-1:-1;;;;;17157:6:0::1;::::0;17136:40:::1;::::0;17173:1;;17136:40:::1;17187:6;:19:::0;;-1:-1:-1;;;;;;17187:19:0::1;::::0;;17066:148::o;38398:430::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;25890:8:::1;:15:::0;38531:10;;25890:24;-1:-1:-1;25882:65:0::1;;;;-1:-1:-1::0;;;25882:65:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38567:24:0;::::2;38559:74;;;;-1:-1:-1::0;;;38559:74:0::2;;;;;;;:::i;:::-;38644:29;38662:10;38644:17;:29::i;:::-;38717:10;38684:8;38693:10;38684:20;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;;:43;;;;;-1:-1:-1::0;;;;;38684:43:0::2;;;;;-1:-1:-1::0;;;;;38684:43:0::2;;;;;;38742:10;38756:1;38742:15;38738:83;;;38774:22:::0;:35;;-1:-1:-1;;;;;;38774:35:0::2;-1:-1:-1::0;;;;;38774:35:0;::::2;;::::0;;38738:83:::2;16706:1:::1;38398:430:::0;;:::o;28547:164::-;14485:13;;;;;;;;:33;;-1:-1:-1;15052:4:0;7975:20;8023:8;14502:16;14485:50;;;-1:-1:-1;14523:12:0;;;;14522:13;14485:50;14477:109;;;;-1:-1:-1;;;14477:109:0;;;;;;;:::i;:::-;14599:19;14622:13;;;;;;14621:14;14646:101;;;;14681:13;:20;;-1:-1:-1;;14716:19:0;;;;;14646:101;28599:26:::1;:24;:26::i;:::-;28636;:24;:26::i;:::-;28673:30;:28;:30::i;:::-;14777:14:::0;14773:68;;;14824:5;14808:21;;-1:-1:-1;;14808:21:0;;;14466:382;28547:164::o;38836:366::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;25890:8:::1;:15:::0;38934:10;;25890:24;-1:-1:-1;25882:65:0::1;;;;-1:-1:-1::0;;;25882:65:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38965:20:0;::::2;38957:70;;;;-1:-1:-1::0;;;38957:70:0::2;;;;;;;:::i;:::-;39038:25;39056:6;39038:17;:25::i;:::-;39103:6;39074:8;39083:10;39074:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;;:35;;;;;-1:-1:-1::0;;;;;39074:35:0::2;;;;;-1:-1:-1::0;;;;;39074:35:0::2;;;;;;39124:10;39138:1;39124:15;39120:75;;;39156:18:::0;:27;;-1:-1:-1;;;;;39156:27:0;::::2;-1:-1:-1::0;;;;;;39156:27:0;;::::2;;::::0;;16706:1:::1;38836:366:::0;;:::o;49503:1356::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;25607:16:::1;:23:::0;;-1:-1:-1;;;;25607:23:0::1;-1:-1:-1::0;;;25607:23:0::1;::::0;;49710::::2;::::0;49648:21:::2;::::0;49688:45;::::2;;49680:100;;;::::0;-1:-1:-1;;;49680:100:0;;13892:2:1;49680:100:0::2;::::0;::::2;13874:21:1::0;13931:2;13911:18;;;13904:30;13970:34;13950:18;;;13943:62;-1:-1:-1;;;14021:18:1;;;14014:40;14071:19;;49680:100:0::2;13690:406:1::0;49680:100:0::2;-1:-1:-1::0;49814:23:0::2;::::0;49850:12:::2;49865:25;49814:23:::0;49888:1:::2;49865:22;:25::i;:::-;49850:40:::0;-1:-1:-1;49901:17:0::2;49921:28;:18:::0;49850:40;49921:22:::2;:28::i;:::-;50252:46;::::0;-1:-1:-1;;;50252:46:0;;50287:10:::2;50252:46;::::0;::::2;2770:51:1::0;49901:48:0;;-1:-1:-1;50227:22:0::2;::::0;50270:4:::2;::::0;50252:34:::2;::::0;2743:18:1;;50252:46:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50227:71;;50341:22;50358:4;50341:16;:22::i;:::-;50445:46;::::0;-1:-1:-1;;;50445:46:0;;50480:10:::2;50445:46;::::0;::::2;2770:51:1::0;50424:18:0::2;::::0;50463:4:::2;::::0;50445:34:::2;::::0;2743:18:1;;50445:46:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50424:67:::0;-1:-1:-1;50502:20:0::2;50525:30;50424:67:::0;50540:14;50525::::2;:30::i;:::-;50502:53;;50568:49;50577:10;50597:4;50604:12;50568:8;:49::i;:::-;50628:78;::::0;-1:-1:-1;;;50628:78:0;;50666:10:::2;50628:78;::::0;::::2;14530:34:1::0;50646:4:0::2;14580:18:1::0;;;14573:43;;;14632:18;;;14625:34;;;50646:4:0;50628:37:::2;::::0;14465:18:1;;50628:78:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50754:37;50767:12;50781:9;50754:12;:37::i;:::-;50807:44;::::0;;15122:25:1;;;15178:2;15163:18;;15156:34;;;15206:18;;;15199:34;;;50807:44:0::2;::::0;15110:2:1;15095:18;50807:44:0::2;;;;;;;-1:-1:-1::0;;25653:16:0::1;:24:::0;;-1:-1:-1;;;;25653:24:0::1;::::0;;-1:-1:-1;;;;49503:1356:0:o;38022:368::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;25890:8:::1;:15:::0;38121:10;;25890:24;-1:-1:-1;25882:65:0::1;;;;-1:-1:-1::0;;;25882:65:0::1;;;;;;;:::i;:::-;38144:19:::2;38166:8;38175:10;38166:20;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;38144:42:::2;::::0;;::::2;::::0;::::2;::::0;;38166:20:::2;::::0;;::::2;::::0;;::::2;38144:42:::0;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;::::2;::::0;-1:-1:-1;;;;;38144:42:0;;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;;-1:-1:-1;38197:46:0::2;::::0;38144:42;;38234:8;38197:16:::2;:46::i;:::-;38285:8;38254;38263:10;38254:20;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:28:::2;:20;::::0;;::::2;;:28;:39:::0;38308:15;38304:79:::2;;-1:-1:-1::0;;38340:20:0;:31;-1:-1:-1;38022:368:0:o;30339:87::-;30378:13;30411:7;30404:14;;;;;:::i;60287:139::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;60371:47:::1;::::0;-1:-1:-1;;;60371:47:0;;60398:10:::1;60371:47;::::0;::::1;15418:51:1::0;15485:18;;;15478:34;;;-1:-1:-1;;;;;60371:26:0;::::1;::::0;::::1;::::0;15391:18:1;;60371:47:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30834:167::-:0;30912:4;30929:42;15397:10;30953:9;30964:6;30929:9;:42::i;59407:368::-;59521:7;25975:145;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26065:24:0;;;;;;:14;:24;;;;;;26091:8;;26065:24;;26064:25;26056:44;;;;-1:-1:-1;;;26056:44:0;;;;;;;;:::i;:::-;-1:-1:-1;59599:9:0::1;::::0;-1:-1:-1;;;;;59599:9:0::1;59591:70;;;::::0;-1:-1:-1;;;59591:70:0;;15725:2:1;59591:70:0::1;::::0;::::1;15707:21:1::0;15764:2;15744:18;;;15737:30;15803:34;15783:18;;;15776:62;-1:-1:-1;;;15854:18:1;;;15847:32;15896:19;;59591:70:0::1;15523:398:1::0;59591:70:0::1;59696:9;::::0;-1:-1:-1;;;;;59696:9:0::1;15397:10:::0;-1:-1:-1;;;;;59680:25:0::1;;59672:59;;;::::0;-1:-1:-1;;;59672:59:0;;16128:2:1;59672:59:0::1;::::0;::::1;16110:21:1::0;16167:2;16147:18;;;16140:30;-1:-1:-1;;;16186:18:1;;;16179:51;16247:18;;59672:59:0::1;15926:345:1::0;59672:59:0::1;59742:25;59751:7;59760:6;59742:8;:25::i;62851:82::-:0;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;62909:8:::1;:16:::0;;-1:-1:-1;;62909:16:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62851:82::o;31971:534::-;32123:7;32162;;32151;:18;;32143:62;;;;-1:-1:-1;;;32143:62:0;;16478:2:1;32143:62:0;;;16460:21:1;16517:2;16497:18;;;16490:30;16556:33;16536:18;;;16529:61;16607:18;;32143:62:0;16276:355:1;32143:62:0;32221:17;32216:282;;32255:24;32282:31;32293:7;32302:10;32282;:31::i;:::-;32335:15;;-1:-1:-1;32328:22:0;;-1:-1:-1;32328:22:0;32216:282;32383:24;32410:31;32421:7;32430:10;32410;:31::i;:::-;32463:23;;;;-1:-1:-1;32456:30:0;;-1:-1:-1;32456:30:0;61840:106;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;61913:17:::1;:25:::0;;-1:-1:-1;;;;;;61913:25:0::1;-1:-1:-1::0;;;;;61913:25:0;;;::::1;::::0;;;::::1;::::0;;61840:106::o;40445:112::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40518:23:0::1;40544:5;40518:23:::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;40518:31:0::1;::::0;;40445:112::o;40966:136::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;41058:36:::1;41088:5;41058:25;41070:12;41058:7;;:11;;:25;;;;:::i;:::-;:29:::0;::::1;:36::i;:::-;41043:12;:51:::0;-1:-1:-1;40966:136:0:o;37638:376::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;25890:8:::1;:15:::0;37739:10;;25890:24;-1:-1:-1;25882:65:0::1;;;;-1:-1:-1::0;;;25882:65:0::1;;;;;;;:::i;:::-;37762:19:::2;37784:8;37793:10;37784:20;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;37762:42:::2;::::0;;::::2;::::0;::::2;::::0;;37784:20:::2;::::0;;::::2;::::0;;::::2;37762:42:::0;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;-1:-1:-1;;;;;37762:42:0;;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;;-1:-1:-1;37815:48:0::2;::::0;37762:42;;37853:9;37815:16:::2;:48::i;:::-;37906:9;37874:8;37883:10;37874:20;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:29:::2;:20;::::0;;::::2;;:29;:41:::0;37930:15;37926:81:::2;;-1:-1:-1::0;;37962:21:0;:33;-1:-1:-1;37638:376:0:o;61251:434::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;61381:10;61367:11:::1;61409:269;61433:3;61429:1;:7;61409:269;;;61458:12;61473:10;;61484:1;61473:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61506:35:0;::::1;;::::0;;;:29:::1;:35;::::0;;;;;61458:28;;-1:-1:-1;61506:35:0::1;;61501:50;;61543:8;;;61501:50;-1:-1:-1::0;;;;;61568:35:0;::::1;61606:5;61568:35:::0;;;:29:::1;:35;::::0;;;;;;;;:43;;-1:-1:-1;;61568:43:0::1;::::0;;61631:35;;2770:51:1;;;61631:35:0::1;::::0;2743:18:1;61631:35:0::1;;;;;;;61443:235;61409:269;61438:3:::0;::::1;::::0;::::1;:::i;:::-;;;;61409:269;;34518:110:::0;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34585:27:0::1;34615:5;34585:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;34585:35:0::1;::::0;;34518:110::o;29563:338::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;29637:15:::1;:45:::0;;-1:-1:-1;;;;;;29637:45:0::1;-1:-1:-1::0;;;;;29637:45:0;::::1;::::0;;::::1;::::0;;;29700:22:::1;::::0;;-1:-1:-1;;;29700:22:0;;;;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;29637:45;29700:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29693:4;:29:::0;;-1:-1:-1;;;;;;29693:29:0::1;-1:-1:-1::0;;;;;29693:29:0;;::::1;;::::0;;29820:15:::1;::::0;:25:::1;::::0;;-1:-1:-1;;;29820:25:0;;;;:15;;;::::1;::::0;:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:25:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29873:4;::::0;29802:91:::1;::::0;-1:-1:-1;;;29802:91:0;;29866:4:::1;29802:91;::::0;::::1;16876:34:1::0;;;-1:-1:-1;;;;;29873:4:0;;::::1;16926:18:1::0;;;16919:43;16978:18;;;16971:43;29802:55:0;::::1;::::0;::::1;::::0;16811:18:1;;29802:91:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29786:13;:107:::0;;-1:-1:-1;;;;;;29786:107:0::1;-1:-1:-1::0;;;;;29786:107:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;29563:338:0:o;36822:440::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;25890:8:::1;:15:::0;36958:10;;25890:24;-1:-1:-1;25882:65:0::1;;;;-1:-1:-1::0;;;25882:65:0::1;;;;;;;:::i;:::-;36986:19:::2;37008:8;37017:10;37008:20;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;36986:42:::2;::::0;;::::2;::::0;::::2;::::0;;37008:20:::2;::::0;;::::2;::::0;;::::2;36986:42:::0;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;-1:-1:-1;;;;;36986:42:0;;::::2;::::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;-1:-1:-1;37039:56:0::2;::::0;36986:42;;37081:13;37039:16:::2;:56::i;:::-;37142:13;37106:8;37115:10;37106:20;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:33:::2;:20;::::0;;::::2;;:33;:49:::0;37170:15;37166:89:::2;;-1:-1:-1::0;;37202:25:0;:41;-1:-1:-1;36822:440:0:o;17369:244::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17458:22:0;::::1;17450:73;;;::::0;-1:-1:-1;;;17450:73:0;;17227:2:1;17450:73:0::1;::::0;::::1;17209:21:1::0;17266:2;17246:18;;;17239:30;17305:34;17285:18;;;17278:62;-1:-1:-1;;;17356:18:1;;;17349:36;17402:19;;17450:73:0::1;17025:402:1::0;17450:73:0::1;17560:6;::::0;17539:38:::1;::::0;-1:-1:-1;;;;;17539:38:0;;::::1;::::0;17560:6:::1;::::0;17539:38:::1;::::0;17560:6:::1;::::0;17539:38:::1;17588:6;:17:::0;;-1:-1:-1;;;;;;17588:17:0::1;-1:-1:-1::0;;;;;17588:17:0;;;::::1;::::0;;;::::1;::::0;;17369:244::o;40291:146::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40362:23:0::1;;::::0;;;:14:::1;:23;::::0;;;;;;;:30;;-1:-1:-1;;40362:30:0::1;40388:4;40362:30;::::0;;40403:13:::1;:22:::0;;;;;:26;40291:146::o;60817:426::-;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;60944:10;60930:11:::1;60972:264;60996:3;60992:1;:7;60972:264;;;61021:12;61036:10;;61047:1;61036:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61068:35:0;::::1;;::::0;;;:29:::1;:35;::::0;;;;;61021:28;;-1:-1:-1;61068:35:0::1;;61064:49;;;61105:8;;;61064:49;-1:-1:-1::0;;;;;61130:35:0;::::1;;::::0;;;:29:::1;:35;::::0;;;;;;;;:42;;-1:-1:-1;;61130:42:0::1;61168:4;61130:42;::::0;;61192:32;;2770:51:1;;;61192:32:0::1;::::0;2743:18:1;61192:32:0::1;;;;;;;61006:230;60972:264;61001:3:::0;::::1;::::0;::::1;:::i;:::-;;;;60972:264;;60568:122:::0;16488:6;;-1:-1:-1;;;;;16488:6:0;15397:10;16635:23;16627:68;;;;-1:-1:-1;;;16627:68:0;;;;;;;:::i;:::-;60649:23:::1;:33:::0;60568:122::o;44951:543::-;45096:5;25975:145;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26065:24:0;;;;;;:14;:24;;;;;;26091:8;;26065:24;;26064:25;26056:44;;;;-1:-1:-1;;;26056:44:0;;;;;;;;:::i;:::-;;45173:7:::1;25975:145;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;26065:24:0;::::1;;::::0;;;:14:::1;:24;::::0;;;;;26091:8;;26065:24:::1;;26064:25;26056:44;;;;-1:-1:-1::0;;;26056:44:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;45250:19:0;::::2;45242:68;;;::::0;-1:-1:-1;;;45242:68:0;;17634:2:1;45242:68:0::2;::::0;::::2;17616:21:1::0;17673:2;17653:18;;;17646:30;17712:34;17692:18;;;17685:62;-1:-1:-1;;;17763:18:1;;;17756:34;17807:19;;45242:68:0::2;17432:400:1::0;45242:68:0::2;-1:-1:-1::0;;;;;45329:21:0;::::2;45321:68;;;::::0;-1:-1:-1;;;45321:68:0;;18039:2:1;45321:68:0::2;::::0;::::2;18021:21:1::0;18078:2;18058:18;;;18051:30;18117:34;18097:18;;;18090:62;-1:-1:-1;;;18168:18:1;;;18161:32;18210:19;;45321:68:0::2;17837:398:1::0;45321:68:0::2;-1:-1:-1::0;;;;;45402:18:0;;::::2;;::::0;;;:11:::2;:18;::::0;;;;;;;:27;;::::2;::::0;;;;;;;;;;:36;;;45454:32;;1662:25:1;;;45454:32:0::2;::::0;1635:18:1;45454:32:0::2;;;;;;;26111:1:::1;;44951:543:::0;;;;;:::o;45502:2343::-;25975:145;;;;;;;;;;;;;;;;;15397:10;-1:-1:-1;26065:24:0;;;:14;:24;;;;;;;25975:145;;26065:24;;26064:25;26056:44;;;;-1:-1:-1;;;26056:44:0;;;;;;;;:::i;:::-;;45720:4:::1;25975:145;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;26065:24:0;::::1;;::::0;;;:14:::1;:24;::::0;;;;;26091:8;;26065:24:::1;;26064:25;26056:44;;;;-1:-1:-1::0;;;26056:44:0::1;;;;;;;;:::i;:::-;;45795:2:::2;25975:145;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;26065:24:0;::::2;;::::0;;;:14:::2;:24;::::0;;;;;26091:8;;26065:24:::2;;26064:25;26056:44;;;;-1:-1:-1::0;;;26056:44:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;15397:10:0;26251:20;::::3;26304:8;::::0;::::3;::::0;26300:396:::3;;-1:-1:-1::0;;;;;26354:22:0;::::3;26333:18;26354:22:::0;;;:13:::3;:22;::::0;;;;;26399:15;26395:286:::3;;26439:31;26492:7;26439:61;;26527:12;-1:-1:-1::0;;;;;26527:20:0::3;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;26527:22:0::3;::::0;;::::3;;::::0;;::::3;-1:-1:-1::0;;26527:22:0::3;::::0;::::3;::::0;;;::::3;::::0;;::::3;::::0;::::3;:::i;:::-;;;26523:139;;;;;-1:-1:-1::0;;;;;;26603:22:0;::::3;;::::0;;;:13:::3;:22;::::0;;;;26628:1:::3;26603:26:::0;;26523:139:::3;26416:265;26395:286;26314:382;26300:396;-1:-1:-1::0;;;;;;45894:18:0;::::4;45886:68;;;::::0;-1:-1:-1;;;45886:68:0;;18442:2:1;45886:68:0::4;::::0;::::4;18424:21:1::0;18481:2;18461:18;;;18454:30;18520:34;18500:18;;;18493:62;-1:-1:-1;;;18571:18:1;;;18564:35;18616:19;;45886:68:0::4;18240:401:1::0;45886:68:0::4;-1:-1:-1::0;;;;;45973:16:0;::::4;45965:64;;;::::0;-1:-1:-1;;;45965:64:0;;18848:2:1;45965:64:0::4;::::0;::::4;18830:21:1::0;18887:2;18867:18;;;18860:30;18926:34;18906:18;;;18899:62;-1:-1:-1;;;18977:18:1;;;18970:33;19020:19;;45965:64:0::4;18646:399:1::0;45965:64:0::4;46057:1;46048:6;:10;46040:64;;;::::0;-1:-1:-1;;;46040:64:0;;19252:2:1;46040:64:0::4;::::0;::::4;19234:21:1::0;19291:2;19271:18;;;19264:30;19330:34;19310:18;;;19303:62;-1:-1:-1;;;19381:18:1;;;19374:39;19430:19;;46040:64:0::4;19050:405:1::0;46040:64:0::4;46123:20;46134:4;46140:2;46123:10;:20::i;:::-;46115:39;;;;-1:-1:-1::0;;;46115:39:0::4;;;;;;;:::i;:::-;16488:6:::0;;-1:-1:-1;;;;;46171:15:0;;::::4;16488:6:::0;;46171:15:::4;::::0;::::4;::::0;:32:::4;;-1:-1:-1::0;16488:6:0;;-1:-1:-1;;;;;46190:13:0;;::::4;16488:6:::0;;46190:13:::4;;46171:32;46167:126;;;46236:12;;46226:6;:22;;46218:75;;;;-1:-1:-1::0;;;46218:75:0::4;;;;;;;:::i;:::-;46588:28;46619:24;46637:4;46619:9;:24::i;:::-;46588:55;;46684:12;;46660:20;:36;46656:104;;-1:-1:-1::0;46736:12:0::4;::::0;46656:104:::4;46823:21;::::0;46799:45;::::4;::::0;::::4;::::0;;;46873:53:::4;;-1:-1:-1::0;46910:16:0::4;::::0;-1:-1:-1;;;46910:16:0;::::4;;;46909:17;46873:53;:90;;;;-1:-1:-1::0;46943:20:0::4;::::0;::::4;::::0;::::4;;;46873:90;:138;;;;-1:-1:-1::0;;;;;;61788:36:0;;61764:4;61788:36;;;:29;:36;;;;;;;;46980:31:::4;46873:138;:184;;;;-1:-1:-1::0;;;;;;61788:36:0;;61764:4;61788:36;;;:29;:36;;;;;;;;47028:29:::4;46873:184;46855:332;;;47107:21;;47084:44;;47143:32;47154:20;47143:10;:32::i;:::-;-1:-1:-1::0;;;;;47380:24:0;::::4;47260:12;47380:24:::0;;;:18:::4;:24;::::0;;;;;47275:4:::4;::::0;47380:24:::4;;::::0;:50:::4;;-1:-1:-1::0;;;;;;47408:22:0;::::4;;::::0;;;:18:::4;:22;::::0;;;;;::::4;;47380:50;47376:98;;;-1:-1:-1::0;47457:5:0::4;47376:98;47486:17;47524:7;47520:187;;;-1:-1:-1::0;;;;;;47560:19:0;::::4;;::::0;;;:13:::4;:19;::::0;;;;;;15397:10;47600:20:::4;47596:100;;-1:-1:-1::0;15397:10:0;47653:27:::4;::::0;;;:13:::4;:27;::::0;;;;;47596:100:::4;47785:52;47800:4;47806:2;47810:6;47818:9;47829:7;47785:14;:52::i;:::-;45875:1970;;;;26111:1:::3;::::2;;::::1;;45502:2343:::0;;;;;:::o;5032:200::-;5152:7;5188:12;5180:6;;;;5172:29;;;;-1:-1:-1;;;5172:29:0;;;;;;;;:::i;:::-;-1:-1:-1;5219:5:0;5223:1;5219;:5;:::i;:::-;5212:12;5032:200;-1:-1:-1;;;;5032:200:0:o;43702:164::-;43744:7;43765:15;43782;43801:19;:17;:19::i;:::-;43764:56;;-1:-1:-1;43764:56:0;-1:-1:-1;43838:20:0;43764:56;;43838:11;:20::i;:::-;43831:27;;;;43702:164;:::o;3782:153::-;3840:7;3872:1;3868;:5;3860:44;;;;-1:-1:-1;;;3860:44:0;;19662:2:1;3860:44:0;;;19644:21:1;19701:2;19681:18;;;19674:30;19740:28;19720:18;;;19713:56;19786:18;;3860:44:0;19460:350:1;3860:44:0;3922:5;3926:1;3922;:5;:::i;35898:468::-;36039:13;36055:223;36270:7;36055:196;36243:7;36055:169;36210:5;:13;;;36055:136;36176:5;:14;;;36055:102;36144:5;:12;;;36055:70;36106:5;:18;;;36055:5;:32;;;:50;;:70;;;;:::i;:::-;:88;;:102::i;:169::-;:187;;:196::i;:223::-;36039:239;;36308:7;;36299:5;:16;;36291:67;;;;-1:-1:-1;;;36291:67:0;;;;;;;:::i;2667:158::-;2725:7;2758:1;2753;:6;;2745:49;;;;-1:-1:-1;;;2745:49:0;;20681:2:1;2745:49:0;;;20663:21:1;20720:2;20700:18;;;20693:30;20759:32;20739:18;;;20732:60;20809:18;;2745:49:0;20479:354:1;2745:49:0;2812:5;2816:1;2812;:5;:::i;52343:833::-;52527:7;52522:28;;52536:14;:12;:14::i;:::-;-1:-1:-1;;;;;52568:19:0;;;;;;:11;:19;;;;;;;;52567:20;:47;;;;-1:-1:-1;;;;;;52592:22:0;;;;;;:11;:22;;;;;;;;52591:23;52567:47;52563:564;;;52631:55;52649:6;52657:9;52668:6;52676:9;52631:17;:55::i;:::-;52563:564;;;-1:-1:-1;;;;;52708:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;52732:22:0;;;;;;:11;:22;;;;;;;;52731:23;52708:46;52704:423;;;52771:59;52793:6;52801:9;52812:6;52820:9;52771:21;:59::i;52704:423::-;-1:-1:-1;;;;;52853:19:0;;;;;;:11;:19;;;;;;;;52852:20;:46;;;;-1:-1:-1;;;;;;52876:22:0;;;;;;:11;:22;;;;;;;;52852:46;52848:279;;;52915:57;52935:6;52943:9;52954:6;52962:9;52915:19;:57::i;52848:279::-;-1:-1:-1;;;;;52994:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;53017:22:0;;;;;;:11;:22;;;;;;;;52994:45;52990:137;;;53056:59;53078:6;53086:9;53097:6;53105:9;53056:21;:59::i;:::-;53144:7;53139:29;;53153:15;:13;:15::i;:::-;52343:833;;;;;:::o;39565:563::-;39807:14;;:::i;:::-;39834:23;39860:122;39884:87;;;;;;;;39892:13;39884:87;;;;39907:13;39884:87;;;;39922:7;39884:87;;;;39931:9;39884:87;;;;39942:8;39884:87;;;;39952:10;-1:-1:-1;;;;;39884:87:0;;;;;39964:6;-1:-1:-1;;;;;39884:87:0;;;;39860:9;:122::i;:::-;39834:148;;39993:29;40011:10;39993:17;:29::i;:::-;40033:25;40051:6;40033:17;:25::i;:::-;40069:8;:23;;;;;;;-1:-1:-1;40069:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;40069:23:0;;;-1:-1:-1;;;;;40069:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39565:563;-1:-1:-1;;;;;;;;39565:563:0:o;2205:179::-;2263:7;;2295:5;2299:1;2295;:5;:::i;:::-;2283:17;;2324:1;2319;:6;;2311:46;;;;-1:-1:-1;;;2311:46:0;;21173:2:1;2311:46:0;;;21155:21:1;21212:2;21192:18;;;21185:30;21251:29;21231:18;;;21224:57;21298:18;;2311:46:0;20971:351:1;15234:59:0;14485:13;;;;;;;;:33;;-1:-1:-1;15052:4:0;7975:20;8023:8;14502:16;14485:50;;;-1:-1:-1;14523:12:0;;;;14522:13;14485:50;14477:109;;;;-1:-1:-1;;;14477:109:0;;;;;;;:::i;:::-;14599:19;14622:13;;;;;;14621:14;14646:101;;;;14681:13;:20;;-1:-1:-1;;14716:19:0;;;;;14773:68;;;;14824:5;14808:21;;-1:-1:-1;;14808:21:0;;;14466:382;15234:59::o;16138:196::-;14485:13;;;;;;;;:33;;-1:-1:-1;15052:4:0;7975:20;8023:8;14502:16;14485:50;;;-1:-1:-1;14523:12:0;;;;14522:13;14485:50;14477:109;;;;-1:-1:-1;;;14477:109:0;;;;;;;:::i;:::-;14599:19;14622:13;;;;;;14621:14;14646:101;;;;14681:13;:20;;-1:-1:-1;;14716:19:0;;;;;14646:101;16249:6:::1;:18:::0;;-1:-1:-1;;;;;;16249:18:0::1;15397:10:::0;16249:18;;::::1;::::0;;;16283:43:::1;::::0;15397:10;;16206:17:::1;::::0;16283:43:::1;::::0;16206:17;;16283:43:::1;16195:139;14777:14:::0;14773:68;;;14824:5;14808:21;;-1:-1:-1;;14808:21:0;;;14466:382;16138:196::o;28719:836::-;14485:13;;;;;;;;:33;;-1:-1:-1;15052:4:0;7975:20;8023:8;14502:16;14485:50;;;-1:-1:-1;14523:12:0;;;;14522:13;14485:50;14477:109;;;;-1:-1:-1;;;14477:109:0;;;;;;;:::i;:::-;14599:19;14622:13;;;;;;14621:14;14646:101;;;;14681:13;:20;;-1:-1:-1;;14716:19:0;;;;;14646:101;28791:18:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;28791:18:0::1;::::0;;::::1;::::0;;;::::1;::::0;:5:::1;::::0;:18:::1;:::i;:::-;-1:-1:-1::0;28820:15:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;28820:15:0::1;::::0;;::::1;::::0;;;::::1;::::0;:7:::1;::::0;:15:::1;:::i;:::-;-1:-1:-1::0;28846:9:0::1;:13:::0;;-1:-1:-1;;28846:13:0::1;28858:1;28846:13;::::0;;28882:23:::1;28872:7;:33:::0;;;28934:13:::1;::::0;-1:-1:-1;;28934:13:0::1;:::i;:::-;28927:21;::::0;-1:-1:-1;;28927:21:0::1;:::i;:::-;28916:7;:33:::0;28970:4:::1;28960:7;:14:::0;29046:20:::1;29031:12;:35:::0;29109:19:::1;29077:29;:51:::0;29141:12:::1;:57:::0;;-1:-1:-1;;;;;;29141:57:0::1;29156:42;29141:57;::::0;;29231:12:::1;15397:10:::0;;15301:115;29231:12:::1;29209:19;:34:::0;;-1:-1:-1;;;;;;29209:34:0::1;-1:-1:-1::0;;;;;29209:34:0;;::::1;::::0;;::::1;::::0;;;29285:7:::1;::::0;-1:-1:-1;29254:28:0;;;:7:::1;:28;::::0;;;;;;;:38;;;;16488:6;;;;;29355:27;;:18:::1;:27:::0;;;;;;:34;;-1:-1:-1;;29355:34:0;;::::1;-1:-1:-1::0;29355:34:0;;::::1;::::0;;;29427:4:::1;29400:33:::0;;;;;;:40;;;;::::1;;::::0;;29463:23:::1;:21;:23::i;:::-;29539:7;::::0;29504:43:::1;::::0;1662:25:1;;;15397:10:0;;29521:1:::1;::::0;-1:-1:-1;;;;;;;;;;;29504:43:0;1650:2:1;1635:18;29504:43:0::1;;;;;;;14777:14:::0;14773:68;;;14824:5;14808:21;;-1:-1:-1;;14808:21:0;;;14466:382;28719:836::o;50867:872::-;51015:16;;;51029:1;51015:16;;;;;;;;50991:21;;51015:16;;;;;;;;-1:-1:-1;;51052:15:0;;:22;;;-1:-1:-1;;;51052:22:0;;;;50991:40;;-1:-1:-1;;;;;;51052:15:0;;;;:20;;-1:-1:-1;51052:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51042:4;51047:1;51042:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;51042:32:0;;;-1:-1:-1;;;;;51042:32:0;;;;;51103:4;51085;51090:1;51085:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51085:23:0;;;:7;;;;;;;;;;:23;;;;51177:15;;:29;;;-1:-1:-1;;;51177:29:0;;;;51121:32;;51177:15;;;;;:27;;:29;;;;;;;;;;:15;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51121:86;;51218:54;51227:7;16488:6;;-1:-1:-1;;;;;16488:6:0;;16415:87;51227:7;51244:15;;-1:-1:-1;;;;;51244:15:0;51262:9;51218:8;:54::i;:::-;51331:40;;-1:-1:-1;;;51331:40:0;;51311:17;;-1:-1:-1;;;;;51331:23:0;;;;;:40;;51355:9;;51366:4;;51331:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51311:60;;51382:39;51424:200;;;;;;;;51476:9;51424:200;;;;51511:1;51424:200;;;;51533:4;51424:200;;;;51564:7;16488:6;;-1:-1:-1;;;;;16488:6:0;;16415:87;51564:7;-1:-1:-1;;;;;51424:200:0;;;;;51597:15;51424:200;;;51382:242;;51635:11;-1:-1:-1;;;;;51635:46:0;;51702:9;51690;:21;;;;:::i;:::-;51714:5;51721:9;51635:96;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50920:819;;;;50867:872;:::o;51747:515::-;51927:15;;51895:62;;51912:4;;-1:-1:-1;;;;;51927:15:0;51945:11;51895:8;:62::i;:::-;52000:15;;-1:-1:-1;;;;;52000:15:0;:31;52040:9;52074:4;52094:11;52000:15;;52206:7;16488:6;;-1:-1:-1;;;;;16488:6:0;;16415:87;52206:7;52000:254;;;;;;-1:-1:-1;;;;;;52000:254:0;;;-1:-1:-1;;;;;23548:15:1;;;52000:254:0;;;23530:34:1;23580:18;;;23573:34;;;;23623:18;;;23616:34;;;;23666:18;;;23659:34;23730:15;;;23709:19;;;23702:44;52228:15:0;23762:19:1;;;23755:35;23464:19;;52000:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;59783:218::-;-1:-1:-1;;;;;59861:21:0;;59853:65;;;;-1:-1:-1;;;59853:65:0;;24314:2:1;59853:65:0;;;24296:21:1;24353:2;24333:18;;;24326:30;24392:33;24372:18;;;24365:61;24443:18;;59853:65:0;24112:355:1;59853:65:0;59946:19;;59931:62;;-1:-1:-1;;;;;59946:19:0;59967:7;59976:6;59946:19;;59931:14;:62::i;41535:836::-;41614:16;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41614:16:0;41643:25;41671:32;41683:7;41692:10;41671:11;:32::i;:::-;41643:60;;41714:20;41737:82;41805:7;:13;;;41737:63;41785:7;:14;;;41737:43;41760:7;:19;;;41737:7;:18;;;:22;;:43;;;;:::i;:82::-;41714:105;;41831:15;41848:23;41873:12;41889:123;41915:7;41937;:12;;;41964;41991:10;:8;:10::i;:::-;41889:11;:123::i;:::-;41830:182;;;;;;42043:320;;;;;;;;42071:7;42043:320;;;;42097:15;42043:320;;;;42131:4;42043:320;;;;42154:7;:23;;;42043:320;;;;42196:7;:19;;;42043:320;;;;42234:7;:18;;;42043:320;;;;42271:7;:12;;;42043:320;;;;42302:7;:14;;;42043:320;;;;42335:7;:13;;;42043:320;;;42023:340;;;;;;;41535:836;;;;:::o;3084:220::-;3142:7;3166:6;3162:20;;-1:-1:-1;3181:1:0;3174:8;;3162:20;3193:9;3205:5;3209:1;3205;:5;:::i;:::-;3193:17;-1:-1:-1;3238:1:0;3229:5;3233:1;3193:17;3229:5;:::i;:::-;:10;3221:56;;;;-1:-1:-1;;;3221:56:0;;24674:2:1;3221:56:0;;;24656:21:1;24713:2;24693:18;;;24686:30;24752:34;24732:18;;;24725:62;-1:-1:-1;;;24803:18:1;;;24796:31;24844:19;;3221:56:0;24472:397:1;47853:358:0;47943:8;;47921:4;;47943:8;;47938:53;;-1:-1:-1;47975:4:0;47968:11;;47938:53;-1:-1:-1;;;;;48005:20:0;;;;;;:14;:20;;;;;;;;:42;;;;-1:-1:-1;;;;;;48029:18:0;;;;;;:14;:18;;;;;;;;48005:42;48001:86;;;-1:-1:-1;48071:4:0;48064:11;;48001:86;-1:-1:-1;;;;;48101:20:0;;;;;;:14;:20;;;;;;;;:40;;;;-1:-1:-1;;;;;;48126:15:0;;;;;;:9;:15;;;;;;;;48125:16;48101:40;48097:84;;;-1:-1:-1;48165:4:0;48158:11;;48097:84;-1:-1:-1;48198:5:0;47853:358;;;;:::o;48219:127::-;25607:16;:23;;-1:-1:-1;;;;25607:23:0;-1:-1:-1;;;25607:23:0;;;48300:38:::1;48317:20:::0;48300:16:::1;:38::i;:::-;-1:-1:-1::0;25653:16:0;:24;;-1:-1:-1;;;;25653:24:0;;;48219:127::o;43874:425::-;43925:7;43934;43976;;43958:15;;:25;:54;;;;44005:7;;43987:15;;:25;43958:54;43954:112;;;-1:-1:-1;;44037:7:0;;44046;;44037;;43874:425::o;43954:112::-;44076:15;44094:28;44106:15;;44094:7;;:11;;:28;;;;:::i;:::-;44076:46;;44133:15;44151:28;44163:15;;44151:7;;:11;;:28;;;;:::i;:::-;44133:46;;44206:20;44218:7;;44206;;:11;;:20;;;;:::i;:::-;44196:7;:30;44192:61;;;44236:7;;44245;;44228:25;;;;;;43874:425;;:::o;44192:61::-;44274:7;;44283;;-1:-1:-1;43874:425:0;-1:-1:-1;43874:425:0:o;44487:113::-;44546:8;44555:1;44546:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;44530:27;;:13;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44530:27:0;;;-1:-1:-1;;;;;44530:27:0;;;;;;;;;;;;;;;;;;;;;;;44568:8;:11;;44582:10;;44546:11;44568;;;;:::i;:::-;;;;;;;;;:24;;:11;;;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44568:24:0;;;-1:-1:-1;;;;;44568:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44487:113::o;54935:535::-;55095:24;55122:30;55133:7;55142:9;55122:10;:30::i;:::-;55201:15;;-1:-1:-1;;;;;55181:15:0;;55201;55181;;;:7;:15;;;;;;55095:57;;-1:-1:-1;55181:36:0;;:15;:19;:36::i;:::-;-1:-1:-1;;;;;55163:15:0;;;;;;;:7;:15;;;;;;;;:54;;;;55272:23;;;55249:18;;;;;;;;;;:47;;:22;:47::i;:::-;-1:-1:-1;;;;;55228:18:0;;;;;;:7;:18;;;;;:68;55307:37;55317:6;55325:7;55334:9;55307;:37::i;:::-;55355:39;55367:7;:12;;;55381:7;:12;;;55355:11;:39::i;:::-;55427:9;-1:-1:-1;;;;;55410:52:0;55419:6;-1:-1:-1;;;;;55410:52:0;-1:-1:-1;;;;;;;;;;;55438:7:0;:23;;;55410:52;;;;1662:25:1;;1650:2;1635:18;;1516:177;55410:52:0;;;;;;;;55084:386;54935:535;;;;:::o;56552:730::-;56716:24;56743:30;56754:7;56763:9;56743:10;:30::i;:::-;-1:-1:-1;;;;;56802:15:0;;;;;;:7;:15;;;;;;56716:57;;-1:-1:-1;56802:28:0;;56822:7;56802:19;:28::i;:::-;-1:-1:-1;;;;;56784:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;56960:23;;;;56937:18;;;;;:7;:18;;;;;;;:47;;:22;:47::i;:::-;-1:-1:-1;;;;;56916:18:0;;;;;;:7;:18;;;;;:68;57013:15;;:28;;57033:7;57013:19;:28::i;:::-;56995:15;:46;57090:15;;57070;;:36;;:19;:36::i;:::-;57052:15;:54;57119:37;57129:6;57137:7;57146:9;57119;:37::i;55624:774::-;55786:24;55813:30;55824:7;55833:9;55813:10;:30::i;:::-;55892:15;;-1:-1:-1;;;;;55872:15:0;;55892;55872;;;:7;:15;;;;;;55786:57;;-1:-1:-1;55872:36:0;;:15;:19;:36::i;:::-;-1:-1:-1;;;;;55854:15:0;;;;;;;:7;:15;;;;;;;;:54;;;;55963:23;;;;55940:18;;;;;:7;:18;;;;;;;:47;;:22;:47::i;:::-;-1:-1:-1;;;;;55919:18:0;;;;;;:7;:18;;;;;:68;56125:23;;;;56105:15;;:44;;:19;:44::i;:::-;56087:15;:62;56198:23;;;;56178:15;;:44;;:19;:44::i;53330:1597::-;53494:24;53521:30;53532:7;53541:9;53521:10;:30::i;:::-;-1:-1:-1;;;;;53580:15:0;;;;;;:7;:15;;;;;;53494:57;;-1:-1:-1;53580:28:0;;53600:7;53580:19;:28::i;:::-;-1:-1:-1;;;;;53562:15:0;;;;;;;:7;:15;;;;;;:46;;;;53738:23;;;;53715:18;;;;;;;;;;:47;;:22;:47::i;:::-;-1:-1:-1;;;;;53694:18:0;;;;;;:7;:18;;;;;:68;53868:23;;;;:33;-1:-1:-1;53864:327:0;;;53918:16;53963:7;53937;:23;;;:33;;;;:::i;:::-;54003:15;;53918:52;;-1:-1:-1;54003:29:0;;53918:52;54003:19;:29::i;:::-;53985:15;:47;-1:-1:-1;53864:327:0;;;54065:16;54094:7;:23;;;54084:7;:33;;;;:::i;:::-;54150:15;;54065:52;;-1:-1:-1;54150:29:0;;54065:52;54150:19;:29::i;:::-;54132:15;:47;-1:-1:-1;53864:327:0;54231:15;;54205:23;;;;:41;54201:351;;;54308:15;;54282:23;;;;54263:16;;54282:41;;;:::i;:::-;54356:15;;54263:60;;-1:-1:-1;54356:29:0;;54263:60;54356:19;:29::i;:::-;54338:15;:47;-1:-1:-1;54201:351:0;;;54455:23;;;;54437:15;;54418:16;;54437:41;;;:::i;:::-;54511:15;;54418:60;;-1:-1:-1;54511:29:0;;54418:60;54511:19;:29::i;:::-;54493:15;:47;-1:-1:-1;54201:351:0;54764:37;54774:6;54782:7;54791:9;54764;:37::i;44608:79::-;44666:13;44652:8;44661:1;44652:11;;;;;;;;:::i;35549:341::-;35613:14;;:::i;:::-;35640:13;35656:123;35755:5;:13;;;35656:80;35721:5;:14;;;35656:60;35703:5;:12;;;35656:42;35679:5;:18;;;35656:5;:18;;;:22;;:42;;;;:::i;:123::-;35640:139;;35807:7;;35798:5;:16;;35790:67;;;;-1:-1:-1;;;35790:67:0;;;;;;;:::i;:::-;-1:-1:-1;35877:5:0;;35549:341;-1:-1:-1;35549:341:0:o;29909:331::-;14485:13;;;;;;;;:33;;-1:-1:-1;15052:4:0;7975:20;8023:8;14502:16;14485:50;;;-1:-1:-1;14523:12:0;;;;14522:13;14485:50;14477:109;;;;-1:-1:-1;;;14477:109:0;;;;;;;:::i;:::-;14599:19;14622:13;;;;;;14621:14;14646:101;;;;14681:13;:20;;-1:-1:-1;;14716:19:0;;;;;14646:101;29989:51:::1;29998:1;30001:3;30006::::0;30011:1:::1;30014::::0;30025::::1;30037::::0;29989:8:::1;:51::i;:::-;29974:66:::0;;:12:::1;:66:::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;29974:66:0;;::::1;-1:-1:-1::0;;;;;29974:66:0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;;::::0;;30051:51:::1;30060:2;::::0;30068:3:::1;-1:-1:-1::0;;;;30051:8:0::1;:51::i;:::-;;30113:53;30122:2;30126::::0;30130:3:::1;30135::::0;30140:1:::1;30151::::0;30163::::1;30113:8;:53::i;:::-;;30177:55;30186:3;30191;30196::::0;30201::::1;30206:1;30217::::0;30229::::1;30177:8;:55::i;:::-;;14777:14:::0;14773:68;;;14824:5;14808:21;;-1:-1:-1;;14808:21:0;;;14466:382;29909:331::o;42379:745::-;42459:17;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42459:17:0;42489:19;42511:8;42520:10;42511:20;;;;;;;;:::i;:::-;;;;;;;;;42489:42;;;;;;;;42511:20;;;;;;;42489:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42489:42:0;;;;;;;;;;;;;;;;;;;;;42570:297;;;;;;;;;;;42633:17;;42489:42;;-1:-1:-1;42570:297:0;;;;;42611:40;;42624:7;;42611:12;:40::i;:::-;42570:297;;;;42666:40;42679:7;42688:4;:17;;;42666:12;:40::i;:::-;42570:297;;;;42721:34;42734:7;42743:4;:11;;;42721:12;:34::i;:::-;42570:297;;;;42770:36;42783:7;42792:4;:13;;;42770:12;:36::i;:::-;42570:297;;;;42821:35;42834:7;42843:4;:12;;;42821;:35::i;:::-;42570:297;;;42542:325;;42906:183;43075:7;:13;;;42906:150;43041:7;:14;;;42906:116;43003:7;:18;;;42906:78;42971:7;:12;;;42906:46;42932:7;:19;;;42906:7;:25;;:46;;;;:::i;:183::-;42880:209;;;42379:745;-1:-1:-1;;;;42379:745:0:o;43132:562::-;43333:7;;;;43430:24;:7;43442:11;43430;:24::i;:::-;43412:42;-1:-1:-1;43465:12:0;43480:21;:4;43489:11;43480:8;:21::i;:::-;43465:36;-1:-1:-1;43512:20:0;43535:29;:12;43552:11;43535:16;:29::i;:::-;43512:52;-1:-1:-1;43575:23:0;43601:35;43512:52;43601:17;:7;43613:4;43601:11;:17::i;:35::-;43655:7;;;;-1:-1:-1;43681:4:0;;-1:-1:-1;43132:562:0;;-1:-1:-1;;;;;;;43132:562:0:o;48354:1141::-;48504:16;;;48518:1;48504:16;;;;;;;;48480:21;;48504:16;;;;;;;;;;-1:-1:-1;48504:16:0;48480:40;;48549:4;48531;48536:1;48531:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48531:23:0;;;:7;;;;;;;;;;:23;;;;48575:15;;:22;;;-1:-1:-1;;;48575:22:0;;;;:15;;;;;:20;;:22;;;;;48531:7;;48575:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48565:4;48570:1;48565:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48565:32:0;;;:7;;;;;;;;;;:32;;;;48666:15;;:29;;;-1:-1:-1;;;48666:29:0;;;;48610:32;;48666:15;;;;;:27;;:29;;;;;;;;;;:15;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48610:86;;48818:17;48838:11;-1:-1:-1;;;;;48838:23:0;;48862:11;48875:4;48838:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49044:15;;48818:62;;-1:-1:-1;49012:62:0;;49029:4;;-1:-1:-1;;;;;49044:15:0;49062:11;49012:8;:62::i;:::-;49085:58;49102:4;49117:11;49131;49085:8;:58::i;:::-;49196:208;;;;;;;;;;;49154:39;49196:208;;;;;;;;;;49346:4;49196:208;;;;49377:15;49196:208;;;;49415:72;;-1:-1:-1;;;49415:72:0;;-1:-1:-1;;;;;49415:45:0;;;;;49469:9;;49415:72;;49196:208;;49415:72;;;:::i;57290:379::-;57422:50;57431:6;57439;:17;;;57466:4;57422:8;:50::i;:::-;57483:67;57492:6;57500;:18;;;57520:8;57529:9;57520:19;;;;;;;;:::i;:::-;;;;;;;;;:29;:19;;;;;:29;;-1:-1:-1;;;;;57520:29:0;57483:8;:67::i;:::-;57561:58;57570:6;57578;:13;;;57593:8;57602:9;57593:19;;;;;;;;:::i;:::-;;;;;;;;;:25;:19;;;;;:25;;-1:-1:-1;;;;;57593:25:0;57561:8;:58::i;:::-;57630:31;57640:6;57648;:12;;;57630:9;:31::i;41380:147::-;41458:7;;:17;;41470:4;41458:11;:17::i;:::-;41448:7;:27;41499:10;;:20;;41514:4;41499:14;:20::i;:::-;41486:10;:33;-1:-1:-1;;41380:147:0:o;44307:172::-;44382:7;44406:9;44402:23;;-1:-1:-1;44424:1:0;44417:8;;44402:23;44443:28;44465:5;44443:17;:7;44455:4;44443:11;:17::i;57823:657::-;-1:-1:-1;;;;;57950:23:0;;57946:36;;57823:657;;;:::o;57946:36::-;57996:12;57992:25;;57823:657;;;:::o;57992:25::-;58029:19;58051:10;:8;:10::i;:::-;58029:32;-1:-1:-1;58072:15:0;58090:24;:7;58029:32;58090:11;:24::i;:::-;-1:-1:-1;;;;;58146:18:0;;;;;;:7;:18;;;;;;58072:42;;-1:-1:-1;58146:31:0;;58072:42;58146:22;:31::i;:::-;-1:-1:-1;;;;;58125:18:0;;;;;;:7;:18;;;;;;;;:52;;;;58194:11;:22;;;;;;58190:229;;;-1:-1:-1;;;;;58254:18:0;;;;;;:7;:18;;;;;;:31;;58277:7;58254:22;:31::i;:::-;-1:-1:-1;;;;;58233:18:0;;;;;;:7;:18;;;;;:52;58318:15;;:28;;58338:7;58318:19;:28::i;:::-;58300:15;:46;58379:15;;:28;;58399:7;58379:19;:28::i;:::-;58361:15;:46;58190:229;58453:9;-1:-1:-1;;;;;58436:36:0;58445:6;-1:-1:-1;;;;;58436:36:0;-1:-1:-1;;;;;;;;;;;58464:7:0;58436:36;;;;1662:25:1;;1650:2;1635:18;;1516:177;58634:525:0;58709:12;58705:25;;58634:525;;:::o;58705:25::-;58772:12;;-1:-1:-1;;;;;58772:12:0;58764:21;;;;:7;:21;;;;;;:34;;58790:7;58764:25;:34::i;:::-;58748:12;;-1:-1:-1;;;;;58748:12:0;58740:21;;;;:7;:21;;;;;:58;;;;58838:10;:8;:10::i;:::-;58828:20;;:7;:20;:::i;:::-;58891:12;;-1:-1:-1;;;;;58891:12:0;58883:21;;;;:7;:21;;;;;;58809:39;;-1:-1:-1;58883:35:0;;58809:39;58883:25;:35::i;:::-;58867:12;;;-1:-1:-1;;;;;58867:12:0;;;58859:21;;;;:7;:21;;;;;;;;:59;;;;58945:12;;;;;58933:25;;:11;:25;;;;;;;58929:166;;;58993:15;;:29;;59013:8;58993:19;:29::i;:::-;58975:15;:47;59055:15;;:28;;59075:7;59055:19;:28::i;:::-;59037:15;:46;58929:166;59129:12;;59112:39;;1662:25:1;;;-1:-1:-1;;;;;59129:12:0;;;;59112:39;;;-1:-1:-1;;;;;;;;;;;59112:39:0;1650:2:1;1635:18;59112:39:0;;;;;;;58694:465;58634:525;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:597:1;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1264:247::-;1323:6;1376:2;1364:9;1355:7;1351:23;1347:32;1344:52;;;1392:1;1389;1382:12;1344:52;1431:9;1418:23;1450:31;1475:5;1450:31;:::i;1698:180::-;1757:6;1810:2;1798:9;1789:7;1785:23;1781:32;1778:52;;;1826:1;1823;1816:12;1778:52;-1:-1:-1;1849:23:1;;1698:180;-1:-1:-1;1698:180:1:o;2832:456::-;2909:6;2917;2925;2978:2;2966:9;2957:7;2953:23;2949:32;2946:52;;;2994:1;2991;2984:12;2946:52;3033:9;3020:23;3052:31;3077:5;3052:31;:::i;:::-;3102:5;-1:-1:-1;3159:2:1;3144:18;;3131:32;3172:33;3131:32;3172:33;:::i;:::-;2832:456;;3224:7;;-1:-1:-1;;;3278:2:1;3263:18;;;;3250:32;;2832:456::o;3293:248::-;3361:6;3369;3422:2;3410:9;3401:7;3397:23;3393:32;3390:52;;;3438:1;3435;3428:12;3390:52;-1:-1:-1;;3461:23:1;;;3531:2;3516:18;;;3503:32;;-1:-1:-1;3293:248:1:o;3735:118::-;3821:5;3814:13;3807:21;3800:5;3797:32;3787:60;;3843:1;3840;3833:12;3858:241;3914:6;3967:2;3955:9;3946:7;3942:23;3938:32;3935:52;;;3983:1;3980;3973:12;3935:52;4022:9;4009:23;4041:28;4063:5;4041:28;:::i;4312:382::-;4377:6;4385;4438:2;4426:9;4417:7;4413:23;4409:32;4406:52;;;4454:1;4451;4444:12;4406:52;4493:9;4480:23;4512:31;4537:5;4512:31;:::i;:::-;4562:5;-1:-1:-1;4619:2:1;4604:18;;4591:32;4632:30;4591:32;4632:30;:::i;:::-;4681:7;4671:17;;;4312:382;;;;;:::o;4699:388::-;4767:6;4775;4828:2;4816:9;4807:7;4803:23;4799:32;4796:52;;;4844:1;4841;4834:12;4796:52;4883:9;4870:23;4902:31;4927:5;4902:31;:::i;:::-;4952:5;-1:-1:-1;5009:2:1;4994:18;;4981:32;5022:33;4981:32;5022:33;:::i;5092:309::-;5157:6;5165;5218:2;5206:9;5197:7;5193:23;5189:32;5186:52;;;5234:1;5231;5224:12;5186:52;5270:9;5257:23;5247:33;;5330:2;5319:9;5315:18;5302:32;5343:28;5365:5;5343:28;:::i;5406:732::-;5519:6;5527;5535;5543;5551;5559;5567;5620:3;5608:9;5599:7;5595:23;5591:33;5588:53;;;5637:1;5634;5627:12;5588:53;5673:9;5660:23;5650:33;;5730:2;5719:9;5715:18;5702:32;5692:42;;5781:2;5770:9;5766:18;5753:32;5743:42;;5832:2;5821:9;5817:18;5804:32;5794:42;;5883:3;5872:9;5868:19;5855:33;5845:43;;5938:3;5927:9;5923:19;5910:33;5952:31;5977:5;5952:31;:::i;:::-;6002:5;-1:-1:-1;6059:3:1;6044:19;;6031:33;6073;6031;6073;:::i;:::-;6125:7;6115:17;;;5406:732;;;;;;;;;;:::o;6143:315::-;6211:6;6219;6272:2;6260:9;6251:7;6247:23;6243:32;6240:52;;;6288:1;6285;6278:12;6240:52;6324:9;6311:23;6301:33;;6384:2;6373:9;6369:18;6356:32;6397:31;6422:5;6397:31;:::i;6463:377::-;6537:6;6545;6553;6606:2;6594:9;6585:7;6581:23;6577:32;6574:52;;;6622:1;6619;6612:12;6574:52;6658:9;6645:23;6635:33;;6715:2;6704:9;6700:18;6687:32;6677:42;;6769:2;6758:9;6754:18;6741:32;6782:28;6804:5;6782:28;:::i;:::-;6829:5;6819:15;;;6463:377;;;;;:::o;6845:615::-;6931:6;6939;6992:2;6980:9;6971:7;6967:23;6963:32;6960:52;;;7008:1;7005;6998:12;6960:52;7048:9;7035:23;7077:18;7118:2;7110:6;7107:14;7104:34;;;7134:1;7131;7124:12;7104:34;7172:6;7161:9;7157:22;7147:32;;7217:7;7210:4;7206:2;7202:13;7198:27;7188:55;;7239:1;7236;7229:12;7188:55;7279:2;7266:16;7305:2;7297:6;7294:14;7291:34;;;7321:1;7318;7311:12;7291:34;7374:7;7369:2;7359:6;7356:1;7352:14;7348:2;7344:23;7340:32;7337:45;7334:65;;;7395:1;7392;7385:12;7334:65;7426:2;7418:11;;;;;7448:6;;-1:-1:-1;6845:615:1;;-1:-1:-1;;;;6845:615:1:o;8133:380::-;8212:1;8208:12;;;;8255;;;8276:61;;8330:4;8322:6;8318:17;8308:27;;8276:61;8383:2;8375:6;8372:14;8352:18;8349:38;8346:161;;;8429:10;8424:3;8420:20;8417:1;8410:31;8464:4;8461:1;8454:15;8492:4;8489:1;8482:15;8518:329;8720:2;8702:21;;;8759:1;8739:18;;;8732:29;-1:-1:-1;;;8792:2:1;8777:18;;8770:36;8838:2;8823:18;;8518:329::o;8852:356::-;9054:2;9036:21;;;9073:18;;;9066:30;9132:34;9127:2;9112:18;;9105:62;9199:2;9184:18;;8852:356::o;9973:352::-;10175:2;10157:21;;;10214:2;10194:18;;;10187:30;10253;10248:2;10233:18;;10226:58;10316:2;10301:18;;9973:352::o;10330:127::-;10391:10;10386:3;10382:20;10379:1;10372:31;10422:4;10419:1;10412:15;10446:4;10443:1;10436:15;10873:330;11075:2;11057:21;;;11114:1;11094:18;;;11087:29;-1:-1:-1;;;11147:2:1;11132:18;;11125:37;11194:2;11179:18;;10873:330::o;11208:127::-;11269:10;11264:3;11260:20;11257:1;11250:31;11300:4;11297:1;11290:15;11324:4;11321:1;11314:15;11340:125;11380:4;11408:1;11405;11402:8;11399:34;;;11413:18;;:::i;:::-;-1:-1:-1;11450:9:1;;11340:125::o;11470:168::-;11510:7;11576:1;11572;11568:6;11564:14;11561:1;11558:21;11553:1;11546:9;11539:17;11535:45;11532:71;;;11583:18;;:::i;:::-;-1:-1:-1;11623:9:1;;11470:168::o;11643:127::-;11704:10;11699:3;11695:20;11692:1;11685:31;11735:4;11732:1;11725:15;11759:4;11756:1;11749:15;11775:135;11814:3;-1:-1:-1;;11835:17:1;;11832:43;;;11855:18;;:::i;:::-;-1:-1:-1;11902:1:1;11891:13;;11775:135::o;11915:251::-;11985:6;12038:2;12026:9;12017:7;12013:23;12009:32;12006:52;;;12054:1;12051;12044:12;12006:52;12086:9;12080:16;12105:31;12130:5;12105:31;:::i;12171:404::-;12373:2;12355:21;;;12412:2;12392:18;;;12385:30;12451:34;12446:2;12431:18;;12424:62;-1:-1:-1;;;12517:2:1;12502:18;;12495:38;12565:3;12550:19;;12171:404::o;12869:401::-;13071:2;13053:21;;;13110:2;13090:18;;;13083:30;13149:34;13144:2;13129:18;;13122:62;-1:-1:-1;;;13215:2:1;13200:18;;13193:35;13260:3;13245:19;;12869:401::o;13275:410::-;13477:2;13459:21;;;13516:2;13496:18;;;13489:30;13555:34;13550:2;13535:18;;13528:62;-1:-1:-1;;;13621:2:1;13606:18;;13599:44;13675:3;13660:19;;13275:410::o;14101:184::-;14171:6;14224:2;14212:9;14203:7;14199:23;14195:32;14192:52;;;14240:1;14237;14230:12;14192:52;-1:-1:-1;14263:16:1;;14101:184;-1:-1:-1;14101:184:1:o;14670:245::-;14737:6;14790:2;14778:9;14769:7;14765:23;14761:32;14758:52;;;14806:1;14803;14796:12;14758:52;14838:9;14832:16;14857:28;14879:5;14857:28;:::i;19815:127::-;19876:10;19871:3;19867:20;19864:1;19857:31;19907:4;19904:1;19897:15;19931:4;19928:1;19921:15;19947:120;19987:1;20013;20003:35;;20018:18;;:::i;:::-;-1:-1:-1;20052:9:1;;19947:120::o;20072:402::-;20274:2;20256:21;;;20313:2;20293:18;;;20286:30;20352:34;20347:2;20332:18;;20325:62;-1:-1:-1;;;20418:2:1;20403:18;;20396:36;20464:3;20449:19;;20072:402::o;20838:128::-;20878:3;20909:1;20905:6;20902:1;20899:13;20896:39;;;20915:18;;:::i;:::-;-1:-1:-1;20951:9:1;;20838:128::o;21327:112::-;21359:1;21385;21375:35;;21390:18;;:::i;:::-;-1:-1:-1;21424:9:1;;21327:112::o;21576:461::-;21629:3;21667:5;21661:12;21694:6;21689:3;21682:19;21720:4;21749:2;21744:3;21740:12;21733:19;;21786:2;21779:5;21775:14;21807:1;21817:195;21831:6;21828:1;21825:13;21817:195;;;21896:13;;-1:-1:-1;;;;;21892:39:1;21880:52;;21952:12;;;;21987:15;;;;21928:1;21846:9;21817:195;;;-1:-1:-1;22028:3:1;;21576:461;-1:-1:-1;;;;;21576:461:1:o;22042:332::-;22249:6;22238:9;22231:25;22292:2;22287;22276:9;22272:18;22265:30;22212:4;22312:56;22364:2;22353:9;22349:18;22341:6;22312:56;:::i;22379:479::-;22463:5;22457:12;22452:3;22445:25;22519:4;22512:5;22508:16;22502:23;22495:4;22490:3;22486:14;22479:47;22427:3;22572:4;22565:5;22561:16;22555:23;22610:4;22603;22598:3;22594:14;22587:28;22636:58;22688:4;22683:3;22679:14;22665:12;22636:58;:::i;:::-;22747:4;22736:16;;;22730:23;-1:-1:-1;;;;;22726:49:1;22710:14;;;22703:73;22825:4;22814:16;;;22808:23;22792:14;;;;22785:47;;;;-1:-1:-1;22624:70:1;;22379:479;-1:-1:-1;22379:479:1:o;22863:321::-;23064:2;23053:9;23046:21;23027:4;23084:51;23131:2;23120:9;23116:18;23108:6;23084:51;:::i;:::-;23076:59;;23171:6;23166:2;23155:9;23151:18;23144:34;22863:321;;;;;:::o;23801:306::-;23889:6;23897;23905;23958:2;23946:9;23937:7;23933:23;23929:32;23926:52;;;23974:1;23971;23964:12;23926:52;24003:9;23997:16;23987:26;;24053:2;24042:9;24038:18;24032:25;24022:35;;24097:2;24086:9;24082:18;24076:25;24066:35;;23801:306;;;;;:::o;24874:250::-;25047:2;25036:9;25029:21;25010:4;25067:51;25114:2;25103:9;25099:18;25091:6;25067:51;:::i
Swarm Source
ipfs://729582b9058cb51bd82c681e8482e727a56a45479d0e70351fdddb44b32a0914
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.