Overview
S Balance
0 S
S Value
-More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
ThickALMGaugeEquivalentFarmland
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-01-01 */ /** *Submitted for verification at basescan.org on 2024-06-23 */ /** *Submitted for verification at basescan.org on 2024-02-10 */ /** *Submitted for verification at ftmscan.com on 2024-01-21 */ /** FFFFF TTTTTTT M M GGGGG U U RRRRR U U FF TTT M M M M G U U RR R U U FFFFF TTT M M M G GGG U U RRRRR U U FF TTT M M M O G G U U RR R U U FF TTT M M GGGGG UUUU RR RRR UUUU Contact us at: https://discord.com/invite/QpyfMarNrV https://t.me/FTM1337 Community Mediums: https://medium.com/@ftm1337 https://twitter.com/ftm1337 ▀█▀░█░█░█░█▀░█▄▀ ░█░░█▀█░█░█▄░█▀▄ Thick Liquidity Protocol > Network agnostic Decentralized Exchange for ERC20 tokens Thick Contributors: - Uniswap.org - 543#3017 (Sam, @i543), ftm.guru, Eliteness.network * Thick DEX : Concentrated Liquidity DEX * ⇢ https://eliteness.network/thick * * Equalizer : A Prominent Liquidity Hub on Fantom & Base! * ⇢ https://equalizer.exchange * * Equalizer Contributors: * - Synthetix Network * - Curve Finance * - Andre Cronje, Solidly.Exchange * - 543 (Sam), ftm.guru, Eliteness.netowork & Equalizer.exchange * * * Version: v3.3.4 * - Using Universal PriceGuru instead of Local TvlGuru * - Publicize _guardCounter as interactions * * * Version: v3.3.1 * - Thick DEX's ALM's Gauge-Equivalent Farmland * - Supports Proxy pattern * - Initializable * - Bug Fix * - Enable Enhanced Griefing Protection (EGPE) override * - Use 0 as default for APR & TVL * - Reject new rewards in absence of depositors. * * * * **************************************************************************** * IMPORTANT SAFETY DISCLOSURE : Proxied Usage * **************************************************************************** * * This Contract is RECOMMENEDED for use with an EIP1167 non-upgradable proxy. * - ERC1167 * - "Clones" * - NON-UPGRADABLE * - Immutable once deployed * - Admins CANT edit contract code. * - Admins DONT have hard rug powers. * - Cheaper to deploy * - Deployement costs ~70k gas * - Initialization costs ~300k gas * - Additional Setup costs may vary based on configs * - HOW TO VERIFY? * - Ensure the "Proxy pattern" is marked as "Minimal", "Clone" or "EIP-1167" on the Explorer! * - Check if "implementation" contract is verfied on the Explorer! * - Check if "implementation" has real source code which is not a proxy! * * * This Contract can be used but is NOT recommeneded for use with EIP1967 unless really necessary. * - ERC1967 * - "UUPS" Universal Upgradable Proxy Standard * - UPGRADABLE * - NOT Immutable! * - Admins CAN edit contract code! * - Admins DO have hard rug powers! Make sure the admins are trustworthy! * - Expensive to deploy * - Deployement costs ~700k gas * - Initialization costs ~300k gas * - Additional Setup costs may vary based on configs * - HOW TO VERIFY? * - Ensure the "Proxy pattern" is marked as "Transparent", "UUPS" or "EIP-1967"! * - Check if "implementation" contract is verfied on the Explorer! * - Check if "implementation" has real source code which is not a proxy! * **************************************************************************** **************************************************************************** * * * Version: v3.0.4 * - Fertilizer Gauge-Equivalent Farmland * * Version: v3.0.3 * * Version: v3.0.0 * - Split `baseReward` * - veRewards Split Ratio * - SplitLockTime * - Gauge Receipts (ERC20) Tracker * * * SPDX-License-Identifier: UNLICENSED */ /** *v1.5.5 *0xf438b2fdf46ea176ebf99ec7852c4699e8e38b1f *Submitted for verification at FtmScan.com on 2023-03-27 */ pragma solidity 0.8.9; //ftm.guru's Universal On-chain TVL Calculator //Source: https://ftm.guru/rawdata/tvl ///interface ITVL { //Using Version = v7 ///function p_lpt_coin_usd(address lp) external view returns(uint256); ///function p_lpt_usd(address u,address lp) external view returns(uint256); ///function p_t_coin_usd(address lp) external view returns(uint256); ///function p_t_e_coin_usd(address lp) external view returns(uint256); ///function p_glp_usd(address m, uint256 md, bool mx, address t, uint256 td) external view returns(uint256); ///function tvlOf_glp_usd(address q, address m, uint256 md, bool mx, address t, uint256 td) external view returns(uint256); ///} // File: contracts/interfaces/IGaugeFactory.sol ///interface IGaugeFactory { ///function createGauge(address, address, address, bool, address[] memory) external returns (address); ///} // File: contracts/interfaces/IVotingEscrow.sol interface IVotingEscrow { function token() external view returns (address); function team() external returns (address); function voter() external returns (address); function create_lock_for(uint, uint, address) external returns (uint); } // File: contracts/interfaces/IVoter.sol interface IVoter { function _ve() external view returns (address); function protocolFeesTaker() external view returns (address); function protocolFeesPerMillion() external view returns (uint); function distribute(address _gauge) external; function bribes(address _gauge) external view returns (address); } // File: contracts/interfaces/IPair.sol interface IPair { function claimFees() external;// returns (uint, uint); function transferFrom(address src, address dst, uint amount) external returns (bool); } // File: contracts/interfaces/IERC20.sol interface IERC20 { function totalSupply() external view returns (uint256); function transfer(address recipient, uint amount) external returns (bool); function symbol() external view returns (string memory); function name() external view returns (string memory); function decimals() external view returns (uint8); function balanceOf(address) external view returns (uint); function transferFrom(address sender, address recipient, uint amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); } // File: contracts/interfaces/IBribe.sol interface IBribe { function notifyRewardAmount(address token, uint amount) external; function left(address token) external view returns (uint); function rewardsListLength() external view returns (uint); function rewards(uint) external view returns (address); } // File: contracts/interfaces/IPrice.sol interface IPriceGuru { function getAssetPrice(address) external view returns (uint); } library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * > It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. */ function isContract(address account) internal view returns (bool) { // This method relies in 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; } } library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } contract ReentrancyGuard { /// @dev counter to allow mutex lock with only one SSTORE operation uint256 public interactions; /** /// constructor is useless in our initializable pattern. /// we set it up in the outermost initialization constructor () { // The counter starts at one to prevent changing it from zero to a non-zero // value, which is a more expensive operation. _guardCounter = 1; } **/ /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { interactions += 1; uint256 localCounter = interactions; _; require(localCounter == interactions, "RG!"); } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SE0" //"SafeERC20: non-zero to non-zero" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SE1"); //SafeERC20: non-contract // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SE2"); //low-level call fail if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SE3"); //SafeERC20: !success } } } library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "+OF"); // 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, "-OF"); // subtraction overflow uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "*OF"); // multiplication overflow return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "/0"); // division by zero uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "%0"); // modulo by zero" return a % b; } } contract ThickALMGaugeEquivalentFarmland is ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; /* ========== STATE VARIABLES ========== */ struct Reward { address rewardsDistributor; uint256 rewardsDuration; uint256 periodFinish; uint256 rewardRate; uint256 lastUpdateTime; uint256 rewardPerTokenStored; } // Initializer bool internal _initialized; // Constants IERC20 public stake; IVotingEscrow public ve; IVoter public voter; //bool public isForPair; address public baseReward; bool public paused; mapping(address => Reward) public rewardData; address[] public rewardTokens; address[] public bribeTokens; address public gauge; IBribe public bribe; // user -> reward token -> amount mapping(address => mapping(address => uint256)) public userRewardPerTokenPaid; mapping(address => mapping(address => uint256)) public rewards; mapping(address => bool) public isReward; mapping(address => bool) public isBribeToken; uint256 private _totalSupply; mapping(address => uint256) private _balances; address public feeTaker; uint256 public splitRatio; //per million uint256 public splitLocktime; mapping(address => uint) public payouts; mapping(address => uint) public payoutsNotified; mapping(address => mapping(address => uint)) public earnings; mapping(address => uint) public totalFeesPayouts; address public manager; address public tradeFeesCollector; /* mapping(address => address) public TvlGuru; mapping(address => bytes) public TvlPriceFeed; */ IPriceGuru public PriceGuru; ////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// /* ========== CONSTRUCTOR ========== */ function initialize( address _stake, address _gauge, address __ve, // "_"ve exists, use "__"ve //address _voter //bool _forPair, //address[] memory _allowedRewardTokens address _priceGuru ) external { // The counter starts at one to prevent changing it from zero to a non-zero // value, which is a more expensive operation. // Also, += uses 1 Read + 1 Write. interactions = 1; require(!_initialized,"init!"); _initialized = true; stake = IERC20(_stake); ve = IVotingEscrow(__ve); voter = IVoter(IVotingEscrow(__ve).voter()); gauge = _gauge; bribe = IBribe(voter.bribes(_gauge)); //isForPair = _forPair; address _baseReward = ve.token(); baseReward = _baseReward; splitLocktime = 26 weeks; ///for (uint i; i < _allowedRewardTokens.length; i++) { /// if (_allowedRewardTokens[i] != address(0)) { /// isReward[_allowedRewardTokens[i]] = true; /// rewardTokens.push(_allowedRewardTokens[i]); /// rewardData[_allowedRewardTokens[i]].rewardsDistributor = _voter; /// rewardData[_allowedRewardTokens[i]].rewardsDuration = 7 days; /// } ///} isReward[_baseReward] = true; rewardTokens.push(_baseReward); rewardData[_baseReward].rewardsDistributor = address(voter); rewardData[_baseReward].rewardsDuration = 7 days; ////skip: ve.team() must manually `addBribeTokens()` IERC20(_baseReward).approve(address(__ve), type(uint256).max); manager = msg.sender; PriceGuru = IPriceGuru(_priceGuru); } /* ========== VIEWS ========== */ function name() external view returns (string memory) { return string(abi.encodePacked("Equalizer V3 Gauge for ", stake.name())); } function symbol() external view returns (string memory) { return string(abi.encodePacked("E3.G:", stake.symbol())); } function decimals() external view returns (uint256) { return stake.decimals(); } function totalSupply() external view returns (uint256) { return _totalSupply; } function balanceOf(address account) external view returns (uint256) { return _balances[account]; } function lastTimeRewardApplicable(address _rewardsToken) public view returns (uint256) { return Math.min(block.timestamp, rewardData[_rewardsToken].periodFinish); } function rewardPerToken(address _rewardsToken) public view returns (uint256) { if (_totalSupply == 0) { return rewardData[_rewardsToken].rewardPerTokenStored; } return rewardData[_rewardsToken].rewardPerTokenStored.add( lastTimeRewardApplicable(_rewardsToken).sub(rewardData[_rewardsToken].lastUpdateTime).mul(rewardData[_rewardsToken].rewardRate).mul(1e18).div(_totalSupply) ); } /// @param account 1 /// @param _rewardsToken 2 function earnedBy(address account, address _rewardsToken) public view returns (uint256) { return _balances[account].mul(rewardPerToken(_rewardsToken).sub(userRewardPerTokenPaid[account][_rewardsToken])).div(1e18).add(rewards[account][_rewardsToken]); } /// Backwards compatible view with 3qu471738 <= v1.3 /// @param _rewardsToken 1 /// @param account 2 function earned(address _rewardsToken, address account) public view returns (uint256) { return earnedBy(account, _rewardsToken); } function getRewardForDuration(address _rewardsToken) external view returns (uint256) { return rewardData[_rewardsToken].rewardRate.mul(rewardData[_rewardsToken].rewardsDuration); } function left(address _rewardsToken) external view returns (uint) { if (block.timestamp >= rewardData[_rewardsToken].periodFinish) return 0; uint256 remaining = rewardData[_rewardsToken].periodFinish.sub(block.timestamp); return remaining.mul(rewardData[_rewardsToken].rewardRate); } function rewardsListLength() external view returns (uint) { return rewardTokens.length; } function bribesListLength() external view returns (uint) { return bribeTokens.length; } /* ========== BACKWARDS-COMPATIBLE VIEW FUNCTIONS ========== */ function _ve() external view returns (address) { return address(ve); } function periodFinish(address _tkn) external view returns (uint) { return rewardData[_tkn].periodFinish; } function rewardRate(address _tkn) external view returns (uint) { return rewardData[_tkn].rewardRate; } function lastUpdateTime(address _tkn) external view returns (uint) { return rewardData[_tkn].lastUpdateTime; } /* ========== MUTATIVE FUNCTIONS ========== */ function setRewardsDistributor(address _rewardsToken, address _rewardsDistributor) external onlyOwner { rewardData[_rewardsToken].rewardsDistributor = _rewardsDistributor; } function deposit(uint256 amount) public nonReentrant notPaused updateReward(msg.sender) { require(amount > 0, "0a"); // Cannot stake 0 _totalSupply = _totalSupply.add(amount); _balances[msg.sender] = _balances[msg.sender].add(amount); stake.safeTransferFrom(msg.sender, address(this), amount); emit Deposit(msg.sender, amount); emit Transfer(address(0), msg.sender, amount); //_claimFees(); } function depositAll() external { deposit(stake.balanceOf(msg.sender)); } function depositFor(address _user, uint256 amount) public nonReentrant notPaused updateReward(_user) { require(amount > 0, "0a"); // Cannot stake 0 _totalSupply = _totalSupply.add(amount); _balances[_user] = _balances[_user].add(amount); stake.safeTransferFrom(msg.sender, address(this), amount); emit Deposit(_user, amount); emit Transfer(address(0), _user, amount); //_claimFees(); } function depositAllFor(address _user) external { depositFor(_user, stake.balanceOf(msg.sender)); } function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) { require(amount > 0, "0a"); // Cannot withdraw 0 _totalSupply = _totalSupply.sub(amount); _balances[msg.sender] = _balances[msg.sender].sub(amount); stake.safeTransfer(msg.sender, amount); emit Withdrawn(msg.sender, amount); emit Transfer(msg.sender, address(0), amount); //_claimFees(); } function withdrawAll() external { withdraw(_balances[msg.sender]); } function exit() external { withdraw(_balances[msg.sender]); getReward(); } function getReward() public nonReentrant updateReward(msg.sender) { for (uint i; i < rewardTokens.length; i++) { address _rewardsToken = rewardTokens[i]; uint256 _reward = rewards[msg.sender][_rewardsToken]; _sendReward(msg.sender, _rewardsToken, _reward); } _claimFees(); } function getReward(address account, address[] memory tokens) external { require(msg.sender == account || msg.sender == address(voter), "!auth"); //un-authorized claim voter.distribute(gauge); _getReward(account, tokens); } function _getReward(address account, address[] memory _tokens) internal nonReentrant updateReward(account) { for (uint i; i < _tokens.length; i++) { address _rewardsToken = _tokens[i]; uint256 _reward = rewards[account][_rewardsToken]; _sendReward(account, _rewardsToken, _reward); } _claimFees(); } function _sendReward(address _acc, address _toke, uint _rew) internal { if (_rew > 0) { rewards[_acc][_toke] = 0; if(_toke == baseReward) { uint _spr = splitRatio; if(_spr > 0) { uint _toLock = ( _rew.mul(_spr) ).div(1e6); ve.create_lock_for(_toLock, splitLocktime, _acc); IERC20(_toke).safeTransfer(_acc, _rew.sub(_toLock)); } else { IERC20(_toke).safeTransfer(_acc, _rew); } } else { IERC20(_toke).safeTransfer(_acc, _rew); } emit ClaimRewards(_toke, _acc, _rew); payouts[_toke] += _rew; earnings[_acc][_toke] += _rew; } } function notifyRewardAmount(address _rewardsToken, uint256 _reward) external nonReentrant updateReward(address(0)) { require(_rewardsToken != address(stake), "!!stk"); // Can't distribute staked token as reward! require(isReward[_rewardsToken], "!RT" ); // Not a reward! require(_totalSupply>0, "0TS"); // Reject new rewards in absence of depositors. /// The old pattern to get force collection of fees at least once a week during emission distribution to this gauge /// & distribute it to voters over the next week via the (external) Bribe _claimFees(); /// Support feeOnTransfer tokens like ELITE etc. uint rtbb = IERC20(_rewardsToken).balanceOf(address(this)); // handle the transfer of reward tokens via `transferFrom` to reduce the number // of transactions required and ensure correctness of the reward amount IERC20(_rewardsToken).safeTransferFrom(msg.sender, address(this), _reward); uint rtba = IERC20(_rewardsToken).balanceOf(address(this)); _reward = rtba - rtbb; require(_reward > 0, "0r"); // Reward amount must be greater than 0! if (block.timestamp >= rewardData[_rewardsToken].periodFinish) { rewardData[_rewardsToken].rewardRate = _reward.div(rewardData[_rewardsToken].rewardsDuration); } else { //Advanced/Enhanced Griefing Protection Enabled for Unknown reward adders uint _oldRewardRate = rewardData[_rewardsToken].rewardRate; uint256 remaining = rewardData[_rewardsToken].periodFinish.sub(block.timestamp); uint256 leftover = remaining.mul(rewardData[_rewardsToken].rewardRate); rewardData[_rewardsToken].rewardRate = _reward.add(leftover).div(rewardData[_rewardsToken].rewardsDuration); if( msg.sender!=address(voter) && msg.sender!=rewardData[_rewardsToken].rewardsDistributor && msg.sender!=ve.team() && msg.sender!=manager ) { require( ( rewardData[_rewardsToken].rewardRate >= _oldRewardRate || _reward > leftover ), "EGPE" // Enhanced Griefing Protection Enabled! ); } } rewardData[_rewardsToken].lastUpdateTime = block.timestamp; rewardData[_rewardsToken].periodFinish = block.timestamp.add(rewardData[_rewardsToken].rewardsDuration); emit RewardAdded(_rewardsToken, msg.sender, _reward); payoutsNotified[_rewardsToken] += _reward; } function claimFees() external nonReentrant returns (uint claimed0, uint claimed1) { return _claimFees(); } function _claimFees() internal returns (uint claimed0, uint claimed1) { uint _pfpm = voter.protocolFeesPerMillion(); address _pft = _pfpm > 0 ? voter.protocolFeesTaker() : address(0); /// Equa7izer v1.5: Support Custom pools to be Gaugable ////if (!isForPair) { /// For non-official/external/independent gauges only /// If compatible, the claimed fees should be notified to Bribe /// Else, this contract will hold the fees & ve.team() can rescue() uint _bn = bribeTokens.length; IERC20[] memory _brews = new IERC20[](_bn); uint[] memory _brewbals = new uint[](_bn); for(uint _n; _n < _bn; _n++) { _brews[_n] = IERC20( bribeTokens[_n] ); /// Record current balance to protect gauge deposits & rewards. /// Also Support feeOnTransfer tokens like ELITE etc. /// Also makes sure a bribe-reward isnt 'killed' or uninitialized. _brewbals[_n] = address(_brews[_n]) == address(0) ? 0 : _brews[_n].balanceOf(address(this)); } try IPair(tradeFeesCollector).claimFees() { //// try IPair(address(stake)).claimFees() { /// if call succeeds, gauge will have a surplus of extra tokens which can be sent to bribes /// useful in cases of non-equa1izer lps, like conc., weighted or multi-token Liquidity pools for(uint _n = 0; _n < _bn; _n++) { /// Don't trigger bribes for 0x00 rewards uint _a = address(_brews[_n]) == address(0) ? 0 : _brews[_n].balanceOf(address(this)); /// Trigger only when a token balance increases when we try IPair(stake).claimFees() /// because there could possibly be an overlap between rewardTokens & bribeTokens if(_a > _brewbals[_n]) { ///Protocol Fees if( ( (_a - _brewbals[_n]) * _pfpm) / 1e6 > 0) { _brews[_n].transfer(_pft, ( (_a.sub(_brewbals[_n])) * _pfpm) / 1e6 ); emit ProtocolFees(msg.sender,_pft,address(_brews[_n]),((_a.sub(_brewbals[_n])) * _pfpm) / 1e6); _a = _brews[_n].balanceOf(address(this)); } ///Normal Fees -> Bribe if (feeTaker == address(0)) { bribe.notifyRewardAmount( address(_brews[_n]), (_a.sub(_brewbals[_n])) ); emit ClaimFees(msg.sender, address(bribe), address(_brews[_n]), (_a - _brewbals[_n]) ); totalFeesPayouts[ address(_brews[_n]) ] += (_a - _brewbals[_n]); } ///Re-channeled Fees -> FeesTaker else { _brews[_n].transfer(feeTaker, (_a.sub(_brewbals[_n])) ); emit ClaimFees(msg.sender, feeTaker, address(_brews[_n]), (_a - _brewbals[_n]) ); totalFeesPayouts[ address(_brews[_n]) ] += (_a - _brewbals[_n]); } } /// else: we dont have any fees here ser! } return (0, 0); } catch { /// if call fails, do nothing (much). return (0, 0); } } //else: /// For actual Protocol gauges, created by Voter, for E9ua1izer Factory Pairs /// Skipped } /* ========== RESTRICTED FUNCTIONS ========== */ function addReward(address _rewardsToken, address _rewardsDistributor, uint256 _rewardsDuration) public onlyOwner { require( isReward[_rewardsToken] == false && rewardData[_rewardsToken].rewardsDuration == 0 , "AI" // Already Initialized! ); require( _rewardsToken != address(stake), "!!stk"); // Cannot reward staking token! rewardTokens.push(_rewardsToken); isReward[_rewardsToken] = true; rewardData[_rewardsToken].rewardsDistributor = _rewardsDistributor; rewardData[_rewardsToken].rewardsDuration = _rewardsDuration; } /// This can break claims of rewards! /// Useful during a platform-wide upgrade (optional) function rescue(uint _amt, address _token, address _to) external onlyOwner { if(_token == address(stake)) { /// totalSupply marks the sum of all user deposits. /// surplus checks for any additional holdings that are not user-deposits /// Helps rescue of extra rewards from single-side same-token staking. uint _surplus = (stake.balanceOf(address(this))).sub(_totalSupply); require( _amt <= _surplus, "!!stk"); // Rescuing User Deposits Prohibited! } IERC20(_token).transfer(_to, _amt); emit Recovered(_token, _amt); } function setRewardsDuration(address _rewardsToken, uint256 _rewardsDuration) external onlyOwner { require( block.timestamp > rewardData[_rewardsToken].periodFinish, "RPa" // Reward period still active ); require(_rewardsDuration > 0, "0d"); // Reward duration must be non-zero rewardData[_rewardsToken].rewardsDuration = _rewardsDuration; emit RewardsDurationUpdated(_rewardsToken, rewardData[_rewardsToken].rewardsDuration); } function addBribeToken(address _t) public onlyOwner { require(isBribeToken[_t] == false, "BTa"); // Bribe Token already Active! require( _t != address(stake), "!!stk"); // Cannot bribe staking token! IERC20(_t).approve(address(bribe), type(uint256).max); bribeTokens.push(_t); isBribeToken[_t] = true; emit BribeTokenSet(_t, address(bribe), true); } function removeBribeToken(address _t) public onlyOwner { require(isBribeToken[_t] == true, "BTi"); // Bribe Token Inactive! IERC20(_t).approve(address(bribe), 0); uint _bl = bribeTokens.length; if(bribeTokens[_bl-1]==_t) { bribeTokens.pop(); isBribeToken[_t] = false; } else { for(uint i; i < bribeTokens.length - 1; i++) { if(bribeTokens[i]==_t) { bribeTokens[i] = bribeTokens[_bl-1]; bribeTokens.pop(); isBribeToken[_t] = false; } } } emit BribeTokenSet(_t, address(bribe), false); } function addBribeTokens(address[] memory _tks) external onlyOwner { for(uint _j; _j < _tks.length; _j++) { addBribeToken(_tks[_j]); } } function removeBribeTokens(address[] memory _tks) external onlyOwner { for(uint _j; _j < _tks.length; _j++) { removeBribeToken(_tks[_j]); } } /// When feeTaker is set, all Fees Claims go to it instead of going to the Bribe. /// Useful during a platform-wide upgrade (optional) function setFeeTaker(address _ft) external onlyOwner { feeTaker = _ft; } function setPaused(bool _b) external onlyOwner { paused = _b; } function setBribe(address _b) external { require(msg.sender==address(voter), "Who U"); // Un-authorized! address _ob = address(bribe); for(uint i;i<bribeTokens.length;i++) { address _rt = bribeTokens[i]; IERC20(_rt).approve(_ob, 0); // revoke old-bribe allowances IERC20(_rt).approve(_b, type(uint256).max); // approve new bribe } bribe = IBribe(_b); } function setSplitParameters(uint256 _sr, uint256 _st) external onlyOwner { require(_sr<=1e6, "+SR"); // SR: Must be under a million! splitRatio = _sr; splitLocktime = _st; } function setTradeFeesCollector(address _tfc) external onlyOwner { tradeFeesCollector = _tfc; } function setGauge(address _g) external onlyOwner { gauge = _g; } function setManager(address _m) external onlyOwner { manager = _m; } /* ========== Tvl Guru ========== */ function getAssetPrice(address _a) public view returns(uint256) { /* address _tg = TvlGuru[_a]; if(_tg==address(0)) return(0); ( , bytes memory _tt) = address(_tg).staticcall(TvlPriceFeed[_a]); return abi.decode(_tt, (uint256)); */ return PriceGuru.getAssetPrice(_a); } /* function setTvlGuru(address _a, address _t, bytes memory _b) external onlyOwner { TvlGuru[_a] = _t; TvlPriceFeed[_a] = _b; } */ function setPriceGuru(address _p) external onlyOwner { PriceGuru = IPriceGuru(_p); } function tvl() public view returns (uint _tvl) { uint _pt = getAssetPrice(address(stake)); _tvl = (_totalSupply * _pt) / 1e18; for(uint i; i<rewardTokens.length; i++) { _pt = getAssetPrice(rewardTokens[i]); _tvl += ( IERC20(rewardTokens[i]).balanceOf(address(this)) * _pt) / 1e18; } } function tvlDeposits() public view returns (uint _tvl) { uint _pt = getAssetPrice(address(stake)); _tvl = (_totalSupply * _pt) / 1e18; } function apr() public view returns(uint _apr) { uint _pt = getAssetPrice(address(stake)); uint _tvl = (_totalSupply * _pt) / 1e18; uint _roi; for(uint i; i<rewardTokens.length; i++) { Reward memory _rdt = rewardData[ rewardTokens[i] ]; uint _pf = _rdt.periodFinish; if(_pf > block.timestamp) { uint _rr = _rdt.rewardRate; uint _pt = getAssetPrice(rewardTokens[i]); _roi += (_rr * _pt * 365 * 24 * 60 * 60) / 1e18; } } _apr = _tvl == 0 ? 0 : (_roi * 1e18 * 100) / _tvl ; } function apr(uint i) public view returns(uint _apr) { uint _pt = getAssetPrice(address(stake)); uint _tvl = (_totalSupply * _pt) / 1e18; Reward memory _rdt = rewardData[ rewardTokens[i] ]; uint _pf = _rdt.periodFinish; uint _roi; if(_pf > block.timestamp) { uint _rr = _rdt.rewardRate; uint _pt = getAssetPrice(rewardTokens[i]); _roi = _rr * _pt * 365 * 86400 / 1e18; } _apr = _tvl == 0 ? 0 : (_roi * 1e18 * 100) / _tvl ; } function aprs() public view returns(uint[] memory) { uint _pt = getAssetPrice(address(stake)); uint _tvl = (_totalSupply * _pt) / 1e18; uint[] memory _aprs = new uint[](rewardTokens.length); for(uint i; i<rewardTokens.length; i++) { Reward memory _rdt = rewardData[ rewardTokens[i] ]; uint _pf = _rdt.periodFinish; uint _roi; if(_pf > block.timestamp) { uint _rr = _rdt.rewardRate; uint _pt = getAssetPrice(rewardTokens[i]); _roi = _rr * _pt * 365 * 86400 / 1e18; } _aprs[i] = _tvl == 0 ? 0 : (_roi * 1e18 * 100) / _tvl ; } return _aprs; } /* ========== MODIFIERS ========== */ modifier updateReward(address account) { for (uint i; i < rewardTokens.length; i++) { address token = rewardTokens[i]; rewardData[token].rewardPerTokenStored = rewardPerToken(token); rewardData[token].lastUpdateTime = lastTimeRewardApplicable(token); if (account != address(0)) { rewards[account][token] = earnedBy(account, token); userRewardPerTokenPaid[account][token] = rewardData[token].rewardPerTokenStored; } } _; } modifier onlyOwner { require(msg.sender==ve.team() || msg.sender==manager, "!TEAM"); // Only ve.team! _; } modifier notPaused { require(!paused, "PAUSE"); // Paused _; } /* ========== EVENTS ========== */ event RewardAdded(address indexed token, address indexed notifier, uint256 reward); event Deposit(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event Transfer(address indexed from, address indexed to, uint256 amount); event ClaimRewards(address indexed token, address indexed user, uint256 reward); event RewardsDurationUpdated(address indexed token, uint256 newDuration); event Recovered(address indexed token, uint256 amount); event BribeTokenSet(address indexed token, address indexed bribe, bool indexed active); event ProtocolFees(address indexed initiator, address indexed taker, address indexed token, uint amount); event ClaimFees(address indexed initiator, address indexed beneficiary, address indexed token, uint amount); } /* /// Old v3.0.x Factory pattern // File: contracts/factories/GaugeFactory.sol contract ThickALMGaugeFactory { address public lastGauge; event GaugeCreated(address indexed maker, address indexed pool, address g, address b); function createGauge( address _wrapper, address _gauge, address _ve //bool isPair, //address[] memory _allowedRewards ) external returns (address) { GaugeEquivalent gauge = new GaugeEquivalent( _wrapper, _gauge, _ve //msg.sender, //isPair, //_allowedRewards ); lastGauge = address(gauge); emit GaugeCreated(msg.sender, _f_token, address(gauge), _bribe); return lastGauge; } } */
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"bribe","type":"address"},{"indexed":true,"internalType":"bool","name":"active","type":"bool"}],"name":"BribeTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"taker","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProtocolFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"notifier","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"PriceGuru","outputs":[{"internalType":"contract IPriceGuru","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_t","type":"address"}],"name":"addBribeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tks","type":"address[]"}],"name":"addBribeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsDistributor","type":"address"},{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"apr","outputs":[{"internalType":"uint256","name":"_apr","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"apr","outputs":[{"internalType":"uint256","name":"_apr","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aprs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseReward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bribe","outputs":[{"internalType":"contract IBribe","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bribeTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bribesListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimFees","outputs":[{"internalType":"uint256","name":"claimed0","type":"uint256"},{"internalType":"uint256","name":"claimed1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"depositAllFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"earnedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"earnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_a","type":"address"}],"name":"getAssetPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stake","type":"address"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"__ve","type":"address"},{"internalType":"address","name":"_priceGuru","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interactions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBribeToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tkn","type":"address"}],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"left","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"uint256","name":"_reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"payouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"payoutsNotified","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tkn","type":"address"}],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_t","type":"address"}],"name":"removeBribeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tks","type":"address[]"}],"name":"removeBribeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amt","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardData","outputs":[{"internalType":"address","name":"rewardsDistributor","type":"address"},{"internalType":"uint256","name":"rewardsDuration","type":"uint256"},{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tkn","type":"address"}],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_b","type":"address"}],"name":"setBribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ft","type":"address"}],"name":"setFeeTaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_g","type":"address"}],"name":"setGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_m","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_b","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_p","type":"address"}],"name":"setPriceGuru","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsDistributor","type":"address"}],"name":"setRewardsDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sr","type":"uint256"},{"internalType":"uint256","name":"_st","type":"uint256"}],"name":"setSplitParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tfc","type":"address"}],"name":"setTradeFeesCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"splitLocktime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"splitRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stake","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalFeesPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeFeesCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tvl","outputs":[{"internalType":"uint256","name":"_tvl","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tvlDeposits","outputs":[{"internalType":"uint256","name":"_tvl","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ve","outputs":[{"internalType":"contract IVotingEscrow","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"contract IVoter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50615b6480620000216000396000f3fe608060405234801561001057600080fd5b50600436106104545760003560e01c80635c59f3bb11610241578063b66503cf1161013b578063de5f6268116100c3578063e9fad8ee11610087578063e9fad8ee14610abb578063f122977714610ac3578063f2d03be114610ad6578063f5ae224014610ae9578063f8c8765e14610afc57600080fd5b8063de5f626814610a65578063e5328e0614610a6d578063e688639614610a75578063e70b9e2714610a7d578063e81defce14610aa857600080fd5b8063d0ebdbe71161010a578063d0ebdbe7146109d3578063d0ed26ae146109e6578063d294f093146109f9578063da09d19d14610a16578063dd50120514610a4257600080fd5b8063b66503cf14610992578063b6b55f25146109a5578063bcd11014146109b8578063c0e19e37146109cb57600080fd5b80637c4661d0116101c95780638f27f1041161018d5780638f27f1041461094957806395d89b411461095157806399bcc05214610959578063a6f19c841461096c578063b3596f071461097f57600080fd5b80637c4661d0146108f5578063853828b6146109085780638a501100146109105780638dd598fb146109235780638e08bfc01461093457600080fd5b80637035ab98116102105780637035ab981461086857806370a0823114610893578063749f1044146108bc57806376ad03bc146108cf5780637bb7bed1146108e257600080fd5b80635c59f3bb146108185780635c975abb14610821578063638634ee1461083557806365bcfbe71461084857600080fd5b80632f4f21e21161035257806346c96aac116102da57806352f184051161029e57806352f18405146107c45780635557cc61146107d757806355a68ed3146107ea57806357ded9c9146107fd5780635a6e6eab1461080557600080fd5b806346c96aac146106d4578063481c6a75146106e757806348e5d9f8146106fa5780634d5ce0381461077e5780634ec5908d146107b157600080fd5b806337d0208c1161032157806337d0208c1461067b5780633a4b66f11461068e5780633d18b912146106a65780633f695b45146106ae57806345797e67146106c157600080fd5b80632f4f21e21461063a5780633010d8ef1461064d57806331279d3d14610660578063313ce5671461067357600080fd5b80631c04530c116103e05780632627a49c116103a45780632627a49c146105b45780632af2cecc146105bd5780632ce9aead146105e85780632e1a7d4d146106145780632f3c2a451461062757600080fd5b80631c04530c146105245780631f8507161461054f578063211dc32d14610562578063221ca18c146105755780632378bea6146105a157600080fd5b8063102a7ad411610427578063102a7ad4146104c357806315ae92f7146104d657806316c38b3c146104f657806318160ddd146105095780631a0442511461051157600080fd5b8063023df7671461045957806306fdde031461046e5780630a91a2c41461048c5780630efeb2fb146104a3575b600080fd5b61046c610467366004615485565b610b0f565b005b610476610d83565b60405161048391906154ce565b60405180910390f35b61049560125481565b604051908152602001610483565b6104956104b1366004615485565b60146020526000908152604090205481565b6104956104d1366004615501565b610e31565b6104956104e4366004615485565b60166020526000908152604090205481565b61046c610504366004615548565b610ecc565b600e54610495565b61046c61051f366004615485565b610fb7565b601954610537906001600160a01b031681565b6040516001600160a01b039091168152602001610483565b600254610537906001600160a01b031681565b610495610570366004615501565b6110a6565b610495610583366004615485565b6001600160a01b031660009081526005602052604090206003015490565b61046c6105af366004615565565b6110b2565b61049560005481565b6104956105cb366004615501565b601560209081526000928352604080842090915290825290205481565b6104956105f6366004615485565b6001600160a01b031660009081526005602052604090206004015490565b61046c610622366004615591565b611260565b61046c610635366004615485565b611483565b61046c610648366004615565565b611572565b61046c61065b366004615485565b6117f9565b61046c61066e36600461566f565b611881565b610495611941565b600954610537906001600160a01b031681565b6001546105379061010090046001600160a01b031681565b61046c6119cf565b61046c6106bc366004615501565b611b88565b61046c6106cf3660046156bf565b611c83565b600354610537906001600160a01b031681565b601754610537906001600160a01b031681565b610747610708366004615485565b60056020819052600091825260409091208054600182015460028301546003840154600485015494909501546001600160a01b03909316949193909286565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610483565b6107a161078c366004615485565b600c6020526000908152604090205460ff1681565b6040519015158152602001610483565b61046c6107bf366004615485565b611d94565b61046c6107d23660046156e1565b611e83565b61046c6107e5366004615485565b611f90565b61046c6107f8366004615485565b612348565b610495612437565b61046c6108133660046156e1565b612606565b61049560115481565b6004546107a190600160a01b900460ff1681565b610495610843366004615485565b612713565b610495610856366004615485565b60136020526000908152604090205481565b610495610876366004615501565b600a60209081526000928352604080842090915290825290205481565b6104956108a1366004615485565b6001600160a01b03166000908152600f602052604090205490565b601054610537906001600160a01b031681565b600454610537906001600160a01b031681565b6105376108f0366004615591565b61273a565b601854610537906001600160a01b031681565b61046c612764565b61046c61091e366004615716565b61277f565b6002546001600160a01b0316610537565b61093c6129df565b6040516104839190615758565b600754610495565b610476612bdf565b610495610967366004615485565b612c79565b600854610537906001600160a01b031681565b61049561098d366004615485565b612cfa565b61046c6109a0366004615565565b612d78565b61046c6109b3366004615591565b6133d7565b6104956109c6366004615485565b613612565b61049561363e565b61046c6109e1366004615485565b613686565b61046c6109f436600461579c565b613775565b610a0161396a565b60408051928352602083019190915201610483565b610495610a24366004615485565b6001600160a01b031660009081526005602052604090206002015490565b6107a1610a50366004615485565b600d6020526000908152604090205460ff1681565b61046c6139b9565b610495613a3b565b600654610495565b610495610a8b366004615501565b600b60209081526000928352604080842090915290825290205481565b61046c610ab6366004615485565b613b7c565b61046c613d35565b610495610ad1366004615485565b613d56565b610495610ae4366004615591565b613dfa565b610537610af7366004615591565b613f70565b61046c610b0a3660046157dd565b613f80565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b5f57600080fd5b505af1158015610b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b979190615839565b6001600160a01b0316336001600160a01b03161480610bc057506017546001600160a01b031633145b610be55760405162461bcd60e51b8152600401610bdc90615856565b60405180910390fd5b6001600160a01b0381166000908152600d602052604090205460ff1615610c345760405162461bcd60e51b815260206004820152600360248201526242546160e81b6044820152606401610bdc565b6001546001600160a01b03828116610100909204161415610c675760405162461bcd60e51b8152600401610bdc90615875565b60095460405163095ea7b360e01b81526001600160a01b038381169263095ea7b392610c9d929091169060001990600401615894565b602060405180830381600087803b158015610cb757600080fd5b505af1158015610ccb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cef91906158ad565b506007805460018082019092557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b038481169182179092556000818152600d6020526040808220805460ff19168617905560095490519316927f6f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d059190a450565b606060018054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015610dd157600080fd5b505afa158015610de5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e0d91908101906158ca565b604051602001610e1d919061595e565b604051602081830303815290604052905090565b6001600160a01b038083166000818152600b6020908152604080832094861680845294825280832054938352600a825280832094835293905291822054610ec39190610ebd90670de0b6b3a764000090610eb790610e9890610e9289613d56565b906142e9565b6001600160a01b0389166000908152600f602052604090205490614335565b90614390565b906143d2565b90505b92915050565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f1c57600080fd5b505af1158015610f30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f549190615839565b6001600160a01b0316336001600160a01b03161480610f7d57506017546001600160a01b031633145b610f995760405162461bcd60e51b8152600401610bdc90615856565b60048054911515600160a01b0260ff60a01b19909216919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561100757600080fd5b505af115801561101b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103f9190615839565b6001600160a01b0316336001600160a01b0316148061106857506017546001600160a01b031633145b6110845760405162461bcd60e51b8152600401610bdc90615856565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6000610ec38284610e31565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561110257600080fd5b505af1158015611116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113a9190615839565b6001600160a01b0316336001600160a01b0316148061116357506017546001600160a01b031633145b61117f5760405162461bcd60e51b8152600401610bdc90615856565b6001600160a01b03821660009081526005602052604090206002015442116111cf5760405162461bcd60e51b815260206004820152600360248201526252506160e81b6044820152606401610bdc565b600081116112045760405162461bcd60e51b81526020600482015260026024820152610c1960f21b6044820152606401610bdc565b6001600160a01b03821660008181526005602052604090819020600101839055517fad2f86b01ed93b4b3a150d448c61a4f5d8d38075d3c0c64cc0a26fd6e1f49545906112549084815260200190565b60405180910390a25050565b600160008082825461127291906159b9565b9091555050600080549033905b6006548110156113745760006006828154811061129e5761129e6159d1565b6000918252602090912001546001600160a01b031690506112be81613d56565b6001600160a01b038216600090815260056020819052604090912001556112e481612713565b6001600160a01b03808316600090815260056020526040902060040191909155831615611361576113158382610e31565b6001600160a01b038085166000818152600b602090815260408083209487168084529482528083209590955560058082528583200154928252600a815284822093825292909252919020555b508061136c816159e7565b91505061127f565b50600083116113955760405162461bcd60e51b8152600401610bdc90615a02565b600e546113a290846142e9565b600e55336000908152600f60205260409020546113bf90846142e9565b336000818152600f60205260409020919091556001546113ef916101009091046001600160a01b03169085614417565b60405183815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a350600054811461147f5760405162461bcd60e51b8152600401610bdc90615a1e565b5050565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114d357600080fd5b505af11580156114e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150b9190615839565b6001600160a01b0316336001600160a01b0316148061153457506017546001600160a01b031633145b6115505760405162461bcd60e51b8152600401610bdc90615856565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b600160008082825461158491906159b9565b9091555050600054600454600160a01b900460ff16156115ce5760405162461bcd60e51b8152602060048201526005602482015264504155534560d81b6044820152606401610bdc565b8260005b6006548110156116c7576000600682815481106115f1576115f16159d1565b6000918252602090912001546001600160a01b0316905061161181613d56565b6001600160a01b0382166000908152600560208190526040909120015561163781612713565b6001600160a01b038083166000908152600560205260409020600401919091558316156116b4576116688382610e31565b6001600160a01b038085166000818152600b602090815260408083209487168084529482528083209590955560058082528583200154928252600a815284822093825292909252919020555b50806116bf816159e7565b9150506115d2565b50600083116116e85760405162461bcd60e51b8152600401610bdc90615a02565b600e546116f590846143d2565b600e556001600160a01b0384166000908152600f602052604090205461171b90846143d2565b6001600160a01b038086166000908152600f602052604090209190915560015461174e916101009091041633308661446d565b836001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8460405161178991815260200190565b60405180910390a26040518381526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35060005481146117f45760405162461bcd60e51b8152600401610bdc90615a1e565b505050565b6001546040516370a0823160e01b815233600482015261187e9183916101009091046001600160a01b0316906370a082319060240160206040518083038186803b15801561184657600080fd5b505afa15801561185a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106489190615a3b565b50565b336001600160a01b03831614806118a257506003546001600160a01b031633145b6118d65760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b6044820152606401610bdc565b6003546008546040516363453ae160e01b81526001600160a01b0391821660048201529116906363453ae190602401600060405180830381600087803b15801561191f57600080fd5b505af1158015611933573d6000803e3d6000fd5b5050505061147f82826144ab565b600060018054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561198f57600080fd5b505afa1580156119a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c79190615a54565b60ff16905090565b60016000808282546119e191906159b9565b9091555050600080549033905b600654811015611ae357600060068281548110611a0d57611a0d6159d1565b6000918252602090912001546001600160a01b03169050611a2d81613d56565b6001600160a01b03821660009081526005602081905260409091200155611a5381612713565b6001600160a01b03808316600090815260056020526040902060040191909155831615611ad057611a848382610e31565b6001600160a01b038085166000818152600b602090815260408083209487168084529482528083209590955560058082528583200154928252600a815284822093825292909252919020555b5080611adb816159e7565b9150506119ee565b5060005b600654811015611b5b57600060068281548110611b0657611b066159d1565b600091825260208083209091015433808452600b835260408085206001600160a01b03909316808652929093529190922054919250611b46908383614662565b50508080611b53906159e7565b915050611ae7565b50611b6461485c565b505050600054811461187e5760405162461bcd60e51b8152600401610bdc90615a1e565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611bd857600080fd5b505af1158015611bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c109190615839565b6001600160a01b0316336001600160a01b03161480611c3957506017546001600160a01b031633145b611c555760405162461bcd60e51b8152600401610bdc90615856565b6001600160a01b03918216600090815260056020526040902080546001600160a01b03191691909216179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611cd357600080fd5b505af1158015611ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0b9190615839565b6001600160a01b0316336001600160a01b03161480611d3457506017546001600160a01b031633145b611d505760405162461bcd60e51b8152600401610bdc90615856565b620f4240821115611d895760405162461bcd60e51b815260206004820152600360248201526215a9a960e91b6044820152606401610bdc565b601191909155601255565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611de457600080fd5b505af1158015611df8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1c9190615839565b6001600160a01b0316336001600160a01b03161480611e4557506017546001600160a01b031633145b611e615760405162461bcd60e51b8152600401610bdc90615856565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611ed357600080fd5b505af1158015611ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0b9190615839565b6001600160a01b0316336001600160a01b03161480611f3457506017546001600160a01b031633145b611f505760405162461bcd60e51b8152600401610bdc90615856565b60005b815181101561147f57611f7e828281518110611f7157611f716159d1565b6020026020010151610b0f565b80611f88816159e7565b915050611f53565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611fe057600080fd5b505af1158015611ff4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120189190615839565b6001600160a01b0316336001600160a01b0316148061204157506017546001600160a01b031633145b61205d5760405162461bcd60e51b8152600401610bdc90615856565b6001600160a01b0381166000908152600d602052604090205460ff1615156001146120b05760405162461bcd60e51b815260206004820152600360248201526242546960e81b6044820152606401610bdc565b60095460405163095ea7b360e01b81526001600160a01b038381169263095ea7b3926120e59290911690600090600401615894565b602060405180830381600087803b1580156120ff57600080fd5b505af1158015612113573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213791906158ad565b5060078054906001600160a01b03831690612153600184615a77565b81548110612163576121636159d1565b6000918252602090912001546001600160a01b031614156121d657600780548061218f5761218f615a8e565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0384168252600d905260409020805460ff19169055612306565b60005b6007546121e890600190615a77565b81101561230457826001600160a01b03166007828154811061220c5761220c6159d1565b6000918252602090912001546001600160a01b031614156122f2576007612234600184615a77565b81548110612244576122446159d1565b600091825260209091200154600780546001600160a01b039092169183908110612270576122706159d1565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060078054806122af576122af615a8e565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0385168252600d905260409020805460ff191690555b806122fc816159e7565b9150506121d9565b505b6009546040516000916001600160a01b0390811691908516907f6f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d05908490a45050565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561239857600080fd5b505af11580156123ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d09190615839565b6001600160a01b0316336001600160a01b031614806123f957506017546001600160a01b031633145b6124155760405162461bcd60e51b8152600401610bdc90615856565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60008061245660018054906101000a90046001600160a01b0316612cfa565b90506000670de0b6b3a764000082600e546124719190615aa4565b61247b9190615ac3565b90506000805b6006548110156125c757600060056000600684815481106124a4576124a46159d1565b60009182526020808320909101546001600160a01b039081168452838201949094526040928301909120825160c08101845281549094168452600181015491840191909152600281015491830182905260038101546060840152600481015460808401526005015460a0830152909150428111156125b25760008260600151905060006125576006868154811061253d5761253d6159d1565b6000918252602090912001546001600160a01b0316612cfa565b9050670de0b6b3a764000061256c8284615aa4565b6125789061016d615aa4565b612583906018615aa4565b61258e90603c615aa4565b61259990603c615aa4565b6125a39190615ac3565b6125ad90876159b9565b955050505b505080806125bf906159e7565b915050612481565b5081156125fb57816125e182670de0b6b3a7640000615aa4565b6125ec906064615aa4565b6125f69190615ac3565b6125fe565b60005b935050505090565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561265657600080fd5b505af115801561266a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268e9190615839565b6001600160a01b0316336001600160a01b031614806126b757506017546001600160a01b031633145b6126d35760405162461bcd60e51b8152600401610bdc90615856565b60005b815181101561147f576127018282815181106126f4576126f46159d1565b6020026020010151611f90565b8061270b816159e7565b9150506126d6565b6001600160a01b038116600090815260056020526040812060020154610ec690429061533b565b6006818154811061274a57600080fd5b6000918252602090912001546001600160a01b0316905081565b336000908152600f602052604090205461277d90611260565b565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156127cf57600080fd5b505af11580156127e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128079190615839565b6001600160a01b0316336001600160a01b0316148061283057506017546001600160a01b031633145b61284c5760405162461bcd60e51b8152600401610bdc90615856565b6001546001600160a01b0383811661010090920416141561291657600e546001546040516370a0823160e01b81523060048201526000926128f29290916101009091046001600160a01b0316906370a082319060240160206040518083038186803b1580156128ba57600080fd5b505afa1580156128ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e929190615a3b565b9050808411156129145760405162461bcd60e51b8152600401610bdc90615875565b505b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906129449084908790600401615894565b602060405180830381600087803b15801561295e57600080fd5b505af1158015612972573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061299691906158ad565b50816001600160a01b03167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28846040516129d291815260200190565b60405180910390a2505050565b606060006129ff60018054906101000a90046001600160a01b0316612cfa565b90506000670de0b6b3a764000082600e54612a1a9190615aa4565b612a249190615ac3565b60065490915060009067ffffffffffffffff811115612a4557612a456155aa565b604051908082528060200260200182016040528015612a6e578160200160208202803683370190505b50905060005b600654811015612bd75760006005600060068481548110612a9757612a976159d1565b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220835160c08101855281549095168552600181015491850191909152600281015492840183905260038101546060850152600481015460808501526005015460a08401529192509042821115612b6d576000836060015190506000612b306006878154811061253d5761253d6159d1565b9050670de0b6b3a7640000612b458284615aa4565b612b519061016d615aa4565b612b5e9062015180615aa4565b612b689190615ac3565b925050505b8515612ba05785612b8682670de0b6b3a7640000615aa4565b612b91906064615aa4565b612b9b9190615ac3565b612ba3565b60005b858581518110612bb557612bb56159d1565b6020026020010181815250505050508080612bcf906159e7565b915050612a74565b509392505050565b606060018054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015612c2d57600080fd5b505afa158015612c41573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c6991908101906158ca565b604051602001610e1d9190615ae5565b6001600160a01b0381166000908152600560205260408120600201544210612ca357506000919050565b6001600160a01b038216600090815260056020526040812060020154612cc990426142e9565b6001600160a01b038416600090815260056020526040902060030154909150612cf3908290614335565b9392505050565b60195460405163b3596f0760e01b81526001600160a01b038381166004830152600092169063b3596f079060240160206040518083038186803b158015612d4057600080fd5b505afa158015612d54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec69190615a3b565b6001600080828254612d8a91906159b9565b90915550506000805490805b600654811015612e8b57600060068281548110612db557612db56159d1565b6000918252602090912001546001600160a01b03169050612dd581613d56565b6001600160a01b03821660009081526005602081905260409091200155612dfb81612713565b6001600160a01b03808316600090815260056020526040902060040191909155831615612e7857612e2c8382610e31565b6001600160a01b038085166000818152600b602090815260408083209487168084529482528083209590955560058082528583200154928252600a815284822093825292909252919020555b5080612e83816159e7565b915050612d96565b506001546001600160a01b03858116610100909204161415612ebf5760405162461bcd60e51b8152600401610bdc90615875565b6001600160a01b0384166000908152600c602052604090205460ff16612f0d5760405162461bcd60e51b815260206004820152600360248201526208549560ea1b6044820152606401610bdc565b6000600e5411612f455760405162461bcd60e51b815260206004820152600360248201526230545360e81b6044820152606401610bdc565b612f4d61485c565b50506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a082319060240160206040518083038186803b158015612f9157600080fd5b505afa158015612fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc99190615a3b565b9050612fe06001600160a01b03861633308761446d565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b15801561302257600080fd5b505afa158015613036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305a9190615a3b565b90506130668282615a77565b94506000851161309d5760405162461bcd60e51b8152602060048201526002602482015261183960f11b6044820152606401610bdc565b6001600160a01b0386166000908152600560205260409020600201544210613107576001600160a01b0386166000908152600560205260409020600101546130e6908690614390565b6001600160a01b038716600090815260056020526040902060030155613300565b6001600160a01b0386166000908152600560205260408120600381015460029091015490919061313790426142e9565b6001600160a01b03891660009081526005602052604081206003015491925090613162908390614335565b6001600160a01b038a1660009081526005602052604090206001015490915061318f90610eb78a846143d2565b6001600160a01b038a8116600090815260056020526040902060039081019290925590541633148015906131dd57506001600160a01b03898116600090815260056020526040902054163314155b80156132825750600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561323457600080fd5b505af1158015613248573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326c9190615839565b6001600160a01b0316336001600160a01b031614155b801561329957506017546001600160a01b03163314155b156132fc576001600160a01b038916600090815260056020526040902060030154831115806132c757508088115b6132fc5760405162461bcd60e51b8152600401610bdc906020808252600490820152634547504560e01b604082015260600190565b5050505b6001600160a01b0386166000908152600560205260409020426004820181905560019091015461333091906143d2565b6001600160a01b038716600081815260056020908152604091829020600201939093555187815233927f0f7cde3c0518e1cc590491be5861d70a2e333f7e65af2e1ebd91a3c9a3cc638d910160405180910390a36001600160a01b038616600090815260146020526040812080548792906133ac9084906159b9565b9250508190555050505060005481146117f45760405162461bcd60e51b8152600401610bdc90615a1e565b60016000808282546133e991906159b9565b9091555050600054600454600160a01b900460ff16156134335760405162461bcd60e51b8152602060048201526005602482015264504155534560d81b6044820152606401610bdc565b3360005b60065481101561352c57600060068281548110613456576134566159d1565b6000918252602090912001546001600160a01b0316905061347681613d56565b6001600160a01b0382166000908152600560208190526040909120015561349c81612713565b6001600160a01b03808316600090815260056020526040902060040191909155831615613519576134cd8382610e31565b6001600160a01b038085166000818152600b602090815260408083209487168084529482528083209590955560058082528583200154928252600a815284822093825292909252919020555b5080613524816159e7565b915050613437565b506000831161354d5760405162461bcd60e51b8152600401610bdc90615a02565b600e5461355a90846143d2565b600e55336000908152600f602052604090205461357790846143d2565b336000818152600f60205260409020919091556001546135a8916101009091046001600160a01b031690308661446d565b60405183815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a260405183815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611455565b6001600160a01b03811660009081526005602052604081206001810154600390910154610ec691614335565b60008061365d60018054906101000a90046001600160a01b0316612cfa565b9050670de0b6b3a764000081600e546136769190615aa4565b6136809190615ac3565b91505090565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156136d657600080fd5b505af11580156136ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370e9190615839565b6001600160a01b0316336001600160a01b0316148061373757506017546001600160a01b031633145b6137535760405162461bcd60e51b8152600401610bdc90615856565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156137c557600080fd5b505af11580156137d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137fd9190615839565b6001600160a01b0316336001600160a01b0316148061382657506017546001600160a01b031633145b6138425760405162461bcd60e51b8152600401610bdc90615856565b6001600160a01b0383166000908152600c602052604090205460ff1615801561388457506001600160a01b038316600090815260056020526040902060010154155b6138b55760405162461bcd60e51b8152602060048201526002602482015261414960f01b6044820152606401610bdc565b6001546001600160a01b038481166101009092041614156138e85760405162461bcd60e51b8152600401610bdc90615875565b6006805460018181019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b039586166001600160a01b031991821681179092556000918252600c60209081526040808420805460ff19168617905560059091529091208054949095169316929092178355910155565b600080600160008082825461397f91906159b9565b909155505060005461398f61485c565b9250925060005481146139b45760405162461bcd60e51b8152600401610bdc90615a1e565b509091565b6001546040516370a0823160e01b815233600482015261277d9161010090046001600160a01b0316906370a082319060240160206040518083038186803b158015613a0357600080fd5b505afa158015613a17573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b39190615a3b565b600080613a5a60018054906101000a90046001600160a01b0316612cfa565b9050670de0b6b3a764000081600e54613a739190615aa4565b613a7d9190615ac3565b915060005b600654811015613b7757613aa26006828154811061253d5761253d6159d1565b9150670de0b6b3a76400008260068381548110613ac157613ac16159d1565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015613b0d57600080fd5b505afa158015613b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b459190615a3b565b613b4f9190615aa4565b613b599190615ac3565b613b6390846159b9565b925080613b6f816159e7565b915050613a82565b505090565b6003546001600160a01b03163314613bbe5760405162461bcd60e51b815260206004820152600560248201526457686f205560d81b6044820152606401610bdc565b6009546001600160a01b031660005b600754811015613d1157600060078281548110613bec57613bec6159d1565b600091825260208220015460405163095ea7b360e01b81526001600160a01b039091169250829163095ea7b391613c27918791600401615894565b602060405180830381600087803b158015613c4157600080fd5b505af1158015613c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7991906158ad565b5060405163095ea7b360e01b81526001600160a01b0382169063095ea7b390613caa90879060001990600401615894565b602060405180830381600087803b158015613cc457600080fd5b505af1158015613cd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cfc91906158ad565b50508080613d09906159e7565b915050613bcd565b5050600980546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600f6020526040902054613d4e90611260565b61277d6119cf565b6000600e5460001415613d8357506001600160a01b03166000908152600560208190526040909120015490565b600e546001600160a01b03831660009081526005602052604090206003810154600490910154610ec692613dd7929091610eb791670de0b6b3a764000091613dd191908290610e928b612713565b90614335565b6001600160a01b03841660009081526005602081905260409091200154906143d2565b600080613e1960018054906101000a90046001600160a01b0316612cfa565b90506000670de0b6b3a764000082600e54613e349190615aa4565b613e3e9190615ac3565b905060006005600060068781548110613e5957613e596159d1565b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220835160c08101855281549095168552600181015491850191909152600281015492840183905260038101546060850152600481015460808501526005015460a08401529192509042821115613f2f576000836060015190506000613ef260068a8154811061253d5761253d6159d1565b9050670de0b6b3a7640000613f078284615aa4565b613f139061016d615aa4565b613f209062015180615aa4565b613f2a9190615ac3565b925050505b8315613f625783613f4882670de0b6b3a7640000615aa4565b613f53906064615aa4565b613f5d9190615ac3565b613f65565b60005b979650505050505050565b6007818154811061274a57600080fd5b600160008190555460ff1615613fc05760405162461bcd60e51b8152602060048201526005602482015264696e69742160d81b6044820152606401610bdc565b600180546001600160a01b03808716610100026001600160a81b0319909216919091178217909155600280549184166001600160a01b031990921682179055604080516311b25aab60e21b815290516346c96aac916004808201926020929091908290030181600087803b15801561403757600080fd5b505af115801561404b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061406f9190615839565b600380546001600160a01b039283166001600160a01b03199182168117909255600880549387169390911683179055604051635462ecad60e11b815260048101929092529063a8c5d95a9060240160206040518083038186803b1580156140d557600080fd5b505afa1580156140e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061410d9190615839565b600980546001600160a01b0319166001600160a01b0392831617905560025460408051637e062a3560e11b81529051600093929092169163fc0c546a91600480820192602092909190829003018186803b15801561416a57600080fd5b505afa15801561417e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141a29190615839565b600480546001600160a01b03199081166001600160a01b03848116918217845562eff1006012556000828152600c60209081526040808320805460ff19166001908117909155600680548083019091557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180548816871790556003546005909352928190208054929094169190951617825562093a80910155905163095ea7b360e01b81529293509163095ea7b3916142629187916000199101615894565b602060405180830381600087803b15801561427c57600080fd5b505af1158015614290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b491906158ad565b505060178054336001600160a01b031991821617909155601980549091166001600160a01b0392909216919091179055505050565b6000828211156143215760405162461bcd60e51b815260206004820152600360248201526216a7a360e91b6044820152606401610bdc565b600061432d8385615a77565b949350505050565b60008261434457506000610ec6565b60006143508385615aa4565b90508261435d8583615ac3565b14610ec35760405162461bcd60e51b81526020600482015260036024820152621527a360e91b6044820152606401610bdc565b60008082116143c65760405162461bcd60e51b815260206004820152600260248201526102f360f41b6044820152606401610bdc565b600061432d8385615ac3565b6000806143df83856159b9565b905083811015610ec35760405162461bcd60e51b815260206004820152600360248201526215a7a360e91b6044820152606401610bdc565b6117f48363a9059cbb60e01b8484604051602401614436929190615894565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152615351565b6040516001600160a01b03808516602483015283166044820152606481018290526144a59085906323b872dd60e01b90608401614436565b50505050565b60016000808282546144bd91906159b9565b9091555050600080549083905b6006548110156145bf576000600682815481106144e9576144e96159d1565b6000918252602090912001546001600160a01b0316905061450981613d56565b6001600160a01b0382166000908152600560208190526040909120015561452f81612713565b6001600160a01b038083166000908152600560205260409020600401919091558316156145ac576145608382610e31565b6001600160a01b038085166000818152600b602090815260408083209487168084529482528083209590955560058082528583200154928252600a815284822093825292909252919020555b50806145b7816159e7565b9150506144ca565b5060005b83518110156146355760008482815181106145e0576145e06159d1565b6020908102919091018101516001600160a01b038089166000908152600b8452604080822092841682529190935290912054909150614620878383614662565b5050808061462d906159e7565b9150506145c3565b5061463e61485c565b50505060005481146117f45760405162461bcd60e51b8152600401610bdc90615a1e565b80156117f4576001600160a01b038084166000908152600b602090815260408083208685168085529252822091909155600454909116141561478d5760115480156147735760006146ba620f4240610eb78585614335565b60025460125460405163d4e54c3b60e01b81526004810184905260248101919091526001600160a01b03888116604483015292935091169063d4e54c3b90606401602060405180830381600087803b15801561471557600080fd5b505af1158015614729573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061474d9190615a3b565b5061476d8561475c85846142e9565b6001600160a01b0387169190614417565b50614787565b6147876001600160a01b0384168584614417565b506147a1565b6147a16001600160a01b0383168483614417565b826001600160a01b0316826001600160a01b03167f9aa05b3d70a9e3e2f004f039648839560576334fb45c81f91b6db03ad9e2efc9836040516147e691815260200190565b60405180910390a36001600160a01b038216600090815260136020526040812080548392906148169084906159b9565b90915550506001600160a01b038084166000908152601560209081526040808320938616835292905290812080548392906148529084906159b9565b9091555050505050565b6000806000600360009054906101000a90046001600160a01b03166001600160a01b0316633f6678256040518163ffffffff1660e01b815260040160206040518083038186803b1580156148af57600080fd5b505afa1580156148c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148e79190615a3b565b905060008082116148f957600061497f565b600360009054906101000a90046001600160a01b03166001600160a01b03166313416d996040518163ffffffff1660e01b815260040160206040518083038186803b15801561494757600080fd5b505afa15801561495b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061497f9190615839565b60075490915060008167ffffffffffffffff8111156149a0576149a06155aa565b6040519080825280602002602001820160405280156149c9578160200160208202803683370190505b50905060008267ffffffffffffffff8111156149e7576149e76155aa565b604051908082528060200260200182016040528015614a10578160200160208202803683370190505b50905060005b83811015614b805760078181548110614a3157614a316159d1565b9060005260206000200160009054906101000a90046001600160a01b0316838281518110614a6157614a616159d1565b60200260200101906001600160a01b031690816001600160a01b03168152505060006001600160a01b0316838281518110614a9e57614a9e6159d1565b60200260200101516001600160a01b031614614b4e57828181518110614ac657614ac66159d1565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015614b1157600080fd5b505afa158015614b25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b499190615a3b565b614b51565b60005b828281518110614b6357614b636159d1565b602090810291909101015280614b78816159e7565b915050614a16565b50601860009054906101000a90046001600160a01b03166001600160a01b031663d294f0936040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614bd157600080fd5b505af1925050508015614be2575060015b614bf55750600096879650945050505050565b60005b8381101561532b576000806001600160a01b0316848381518110614c1e57614c1e6159d1565b60200260200101516001600160a01b031614614cce57838281518110614c4657614c466159d1565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015614c9157600080fd5b505afa158015614ca5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cc99190615a3b565b614cd1565b60005b9050828281518110614ce557614ce56159d1565b6020026020010151811115615318576000620f424088858581518110614d0d57614d0d6159d1565b602002602001015184614d209190615a77565b614d2a9190615aa4565b614d349190615ac3565b1115614f5e57838281518110614d4c57614d4c6159d1565b60200260200101516001600160a01b031663a9059cbb87620f42408a614d94888881518110614d7d57614d7d6159d1565b6020026020010151876142e990919063ffffffff16565b614d9e9190615aa4565b614da89190615ac3565b6040518363ffffffff1660e01b8152600401614dc5929190615894565b602060405180830381600087803b158015614ddf57600080fd5b505af1158015614df3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e1791906158ad565b50838281518110614e2a57614e2a6159d1565b60200260200101516001600160a01b0316866001600160a01b0316336001600160a01b03167f78c0b7f8dc279098cd35e7f6ed62faef6b268eb5f31ece1326f32e1bc1d5a048620f42408b614ea1898981518110614e8a57614e8a6159d1565b6020026020010151886142e990919063ffffffff16565b614eab9190615aa4565b614eb59190615ac3565b60405190815260200160405180910390a4838281518110614ed857614ed86159d1565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015614f2357600080fd5b505afa158015614f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f5b9190615a3b565b90505b6010546001600160a01b031661513a5760095484516001600160a01b039091169063b66503cf90869085908110614f9757614f976159d1565b6020026020010151614fcb868681518110614fb457614fb46159d1565b6020026020010151856142e990919063ffffffff16565b6040518363ffffffff1660e01b8152600401614fe8929190615894565b600060405180830381600087803b15801561500257600080fd5b505af1158015615016573d6000803e3d6000fd5b5050505083828151811061502c5761502c6159d1565b60200260200101516001600160a01b0316600960009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b03167fee447878094bcc87bd81b55e4831b5e9e3d095866fce10f4f7e4caa64ea7a558868681518110615099576150996159d1565b6020026020010151856150ac9190615a77565b60405190815260200160405180910390a48282815181106150cf576150cf6159d1565b6020026020010151816150e29190615a77565b601660008685815181106150f8576150f86159d1565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461512f91906159b9565b909155506153189050565b83828151811061514c5761514c6159d1565b60200260200101516001600160a01b031663a9059cbb601060009054906101000a90046001600160a01b031661518d868681518110614fb457614fb46159d1565b6040518363ffffffff1660e01b81526004016151aa929190615894565b602060405180830381600087803b1580156151c457600080fd5b505af11580156151d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151fc91906158ad565b5083828151811061520f5761520f6159d1565b60200260200101516001600160a01b0316601060009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b03167fee447878094bcc87bd81b55e4831b5e9e3d095866fce10f4f7e4caa64ea7a55886868151811061527c5761527c6159d1565b60200260200101518561528f9190615a77565b60405190815260200160405180910390a48282815181106152b2576152b26159d1565b6020026020010151816152c59190615a77565b601660008685815181106152db576152db6159d1565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461531291906159b9565b90915550505b5080615323816159e7565b915050614bf8565b5060009788975095505050505050565b600081831061534a5781610ec3565b5090919050565b6001600160a01b0382163b61538e5760405162461bcd60e51b815260206004820152600360248201526253453160e81b6044820152606401610bdc565b600080836001600160a01b0316836040516153a99190615b12565b6000604051808303816000865af19150503d80600081146153e6576040519150601f19603f3d011682016040523d82523d6000602084013e6153eb565b606091505b5091509150816154235760405162461bcd60e51b815260206004820152600360248201526229a29960e91b6044820152606401610bdc565b8051156144a5578080602001905181019061543e91906158ad565b6144a55760405162461bcd60e51b815260206004820152600360248201526253453360e81b6044820152606401610bdc565b6001600160a01b038116811461187e57600080fd5b60006020828403121561549757600080fd5b8135610ec381615470565b60005b838110156154bd5781810151838201526020016154a5565b838111156144a55750506000910152565b60208152600082518060208401526154ed8160408501602087016154a2565b601f01601f19169190910160400192915050565b6000806040838503121561551457600080fd5b823561551f81615470565b9150602083013561552f81615470565b809150509250929050565b801515811461187e57600080fd5b60006020828403121561555a57600080fd5b8135610ec38161553a565b6000806040838503121561557857600080fd5b823561558381615470565b946020939093013593505050565b6000602082840312156155a357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156155e9576155e96155aa565b604052919050565b600082601f83011261560257600080fd5b8135602067ffffffffffffffff82111561561e5761561e6155aa565b8160051b61562d8282016155c0565b928352848101820192828101908785111561564757600080fd5b83870192505b84831015613f6557823561566081615470565b8252918301919083019061564d565b6000806040838503121561568257600080fd5b823561568d81615470565b9150602083013567ffffffffffffffff8111156156a957600080fd5b6156b5858286016155f1565b9150509250929050565b600080604083850312156156d257600080fd5b50508035926020909101359150565b6000602082840312156156f357600080fd5b813567ffffffffffffffff81111561570a57600080fd5b61432d848285016155f1565b60008060006060848603121561572b57600080fd5b83359250602084013561573d81615470565b9150604084013561574d81615470565b809150509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561579057835183529284019291840191600101615774565b50909695505050505050565b6000806000606084860312156157b157600080fd5b83356157bc81615470565b925060208401356157cc81615470565b929592945050506040919091013590565b600080600080608085870312156157f357600080fd5b84356157fe81615470565b9350602085013561580e81615470565b9250604085013561581e81615470565b9150606085013561582e81615470565b939692955090935050565b60006020828403121561584b57600080fd5b8151610ec381615470565b602080825260059082015264215445414d60d81b604082015260600190565b602080825260059082015264212173746b60d81b604082015260600190565b6001600160a01b03929092168252602082015260400190565b6000602082840312156158bf57600080fd5b8151610ec38161553a565b6000602082840312156158dc57600080fd5b815167ffffffffffffffff808211156158f457600080fd5b818401915084601f83011261590857600080fd5b81518181111561591a5761591a6155aa565b61592d601f8201601f19166020016155c0565b915080825285602082850101111561594457600080fd5b6159558160208401602086016154a2565b50949350505050565b7f457175616c697a657220563320476175676520666f72200000000000000000008152600082516159968160178501602087016154a2565b9190910160170192915050565b634e487b7160e01b600052601160045260246000fd5b600082198211156159cc576159cc6159a3565b500190565b634e487b7160e01b600052603260045260246000fd5b60006000198214156159fb576159fb6159a3565b5060010190565b602080825260029082015261306160f01b604082015260600190565b60208082526003908201526252472160e81b604082015260600190565b600060208284031215615a4d57600080fd5b5051919050565b600060208284031215615a6657600080fd5b815160ff81168114610ec357600080fd5b600082821015615a8957615a896159a3565b500390565b634e487b7160e01b600052603160045260246000fd5b6000816000190483118215151615615abe57615abe6159a3565b500290565b600082615ae057634e487b7160e01b600052601260045260246000fd5b500490565b64229997239d60d91b815260008251615b058160058501602087016154a2565b9190910160050192915050565b60008251615b248184602087016154a2565b919091019291505056fea2646970667358221220c91c96eee68ef93c8cdffa42a90b933f6ca00f28a053914192e606163adf651764736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106104545760003560e01c80635c59f3bb11610241578063b66503cf1161013b578063de5f6268116100c3578063e9fad8ee11610087578063e9fad8ee14610abb578063f122977714610ac3578063f2d03be114610ad6578063f5ae224014610ae9578063f8c8765e14610afc57600080fd5b8063de5f626814610a65578063e5328e0614610a6d578063e688639614610a75578063e70b9e2714610a7d578063e81defce14610aa857600080fd5b8063d0ebdbe71161010a578063d0ebdbe7146109d3578063d0ed26ae146109e6578063d294f093146109f9578063da09d19d14610a16578063dd50120514610a4257600080fd5b8063b66503cf14610992578063b6b55f25146109a5578063bcd11014146109b8578063c0e19e37146109cb57600080fd5b80637c4661d0116101c95780638f27f1041161018d5780638f27f1041461094957806395d89b411461095157806399bcc05214610959578063a6f19c841461096c578063b3596f071461097f57600080fd5b80637c4661d0146108f5578063853828b6146109085780638a501100146109105780638dd598fb146109235780638e08bfc01461093457600080fd5b80637035ab98116102105780637035ab981461086857806370a0823114610893578063749f1044146108bc57806376ad03bc146108cf5780637bb7bed1146108e257600080fd5b80635c59f3bb146108185780635c975abb14610821578063638634ee1461083557806365bcfbe71461084857600080fd5b80632f4f21e21161035257806346c96aac116102da57806352f184051161029e57806352f18405146107c45780635557cc61146107d757806355a68ed3146107ea57806357ded9c9146107fd5780635a6e6eab1461080557600080fd5b806346c96aac146106d4578063481c6a75146106e757806348e5d9f8146106fa5780634d5ce0381461077e5780634ec5908d146107b157600080fd5b806337d0208c1161032157806337d0208c1461067b5780633a4b66f11461068e5780633d18b912146106a65780633f695b45146106ae57806345797e67146106c157600080fd5b80632f4f21e21461063a5780633010d8ef1461064d57806331279d3d14610660578063313ce5671461067357600080fd5b80631c04530c116103e05780632627a49c116103a45780632627a49c146105b45780632af2cecc146105bd5780632ce9aead146105e85780632e1a7d4d146106145780632f3c2a451461062757600080fd5b80631c04530c146105245780631f8507161461054f578063211dc32d14610562578063221ca18c146105755780632378bea6146105a157600080fd5b8063102a7ad411610427578063102a7ad4146104c357806315ae92f7146104d657806316c38b3c146104f657806318160ddd146105095780631a0442511461051157600080fd5b8063023df7671461045957806306fdde031461046e5780630a91a2c41461048c5780630efeb2fb146104a3575b600080fd5b61046c610467366004615485565b610b0f565b005b610476610d83565b60405161048391906154ce565b60405180910390f35b61049560125481565b604051908152602001610483565b6104956104b1366004615485565b60146020526000908152604090205481565b6104956104d1366004615501565b610e31565b6104956104e4366004615485565b60166020526000908152604090205481565b61046c610504366004615548565b610ecc565b600e54610495565b61046c61051f366004615485565b610fb7565b601954610537906001600160a01b031681565b6040516001600160a01b039091168152602001610483565b600254610537906001600160a01b031681565b610495610570366004615501565b6110a6565b610495610583366004615485565b6001600160a01b031660009081526005602052604090206003015490565b61046c6105af366004615565565b6110b2565b61049560005481565b6104956105cb366004615501565b601560209081526000928352604080842090915290825290205481565b6104956105f6366004615485565b6001600160a01b031660009081526005602052604090206004015490565b61046c610622366004615591565b611260565b61046c610635366004615485565b611483565b61046c610648366004615565565b611572565b61046c61065b366004615485565b6117f9565b61046c61066e36600461566f565b611881565b610495611941565b600954610537906001600160a01b031681565b6001546105379061010090046001600160a01b031681565b61046c6119cf565b61046c6106bc366004615501565b611b88565b61046c6106cf3660046156bf565b611c83565b600354610537906001600160a01b031681565b601754610537906001600160a01b031681565b610747610708366004615485565b60056020819052600091825260409091208054600182015460028301546003840154600485015494909501546001600160a01b03909316949193909286565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610483565b6107a161078c366004615485565b600c6020526000908152604090205460ff1681565b6040519015158152602001610483565b61046c6107bf366004615485565b611d94565b61046c6107d23660046156e1565b611e83565b61046c6107e5366004615485565b611f90565b61046c6107f8366004615485565b612348565b610495612437565b61046c6108133660046156e1565b612606565b61049560115481565b6004546107a190600160a01b900460ff1681565b610495610843366004615485565b612713565b610495610856366004615485565b60136020526000908152604090205481565b610495610876366004615501565b600a60209081526000928352604080842090915290825290205481565b6104956108a1366004615485565b6001600160a01b03166000908152600f602052604090205490565b601054610537906001600160a01b031681565b600454610537906001600160a01b031681565b6105376108f0366004615591565b61273a565b601854610537906001600160a01b031681565b61046c612764565b61046c61091e366004615716565b61277f565b6002546001600160a01b0316610537565b61093c6129df565b6040516104839190615758565b600754610495565b610476612bdf565b610495610967366004615485565b612c79565b600854610537906001600160a01b031681565b61049561098d366004615485565b612cfa565b61046c6109a0366004615565565b612d78565b61046c6109b3366004615591565b6133d7565b6104956109c6366004615485565b613612565b61049561363e565b61046c6109e1366004615485565b613686565b61046c6109f436600461579c565b613775565b610a0161396a565b60408051928352602083019190915201610483565b610495610a24366004615485565b6001600160a01b031660009081526005602052604090206002015490565b6107a1610a50366004615485565b600d6020526000908152604090205460ff1681565b61046c6139b9565b610495613a3b565b600654610495565b610495610a8b366004615501565b600b60209081526000928352604080842090915290825290205481565b61046c610ab6366004615485565b613b7c565b61046c613d35565b610495610ad1366004615485565b613d56565b610495610ae4366004615591565b613dfa565b610537610af7366004615591565b613f70565b61046c610b0a3660046157dd565b613f80565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b5f57600080fd5b505af1158015610b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b979190615839565b6001600160a01b0316336001600160a01b03161480610bc057506017546001600160a01b031633145b610be55760405162461bcd60e51b8152600401610bdc90615856565b60405180910390fd5b6001600160a01b0381166000908152600d602052604090205460ff1615610c345760405162461bcd60e51b815260206004820152600360248201526242546160e81b6044820152606401610bdc565b6001546001600160a01b03828116610100909204161415610c675760405162461bcd60e51b8152600401610bdc90615875565b60095460405163095ea7b360e01b81526001600160a01b038381169263095ea7b392610c9d929091169060001990600401615894565b602060405180830381600087803b158015610cb757600080fd5b505af1158015610ccb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cef91906158ad565b506007805460018082019092557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b038481169182179092556000818152600d6020526040808220805460ff19168617905560095490519316927f6f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d059190a450565b606060018054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015610dd157600080fd5b505afa158015610de5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e0d91908101906158ca565b604051602001610e1d919061595e565b604051602081830303815290604052905090565b6001600160a01b038083166000818152600b6020908152604080832094861680845294825280832054938352600a825280832094835293905291822054610ec39190610ebd90670de0b6b3a764000090610eb790610e9890610e9289613d56565b906142e9565b6001600160a01b0389166000908152600f602052604090205490614335565b90614390565b906143d2565b90505b92915050565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f1c57600080fd5b505af1158015610f30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f549190615839565b6001600160a01b0316336001600160a01b03161480610f7d57506017546001600160a01b031633145b610f995760405162461bcd60e51b8152600401610bdc90615856565b60048054911515600160a01b0260ff60a01b19909216919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561100757600080fd5b505af115801561101b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103f9190615839565b6001600160a01b0316336001600160a01b0316148061106857506017546001600160a01b031633145b6110845760405162461bcd60e51b8152600401610bdc90615856565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6000610ec38284610e31565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561110257600080fd5b505af1158015611116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113a9190615839565b6001600160a01b0316336001600160a01b0316148061116357506017546001600160a01b031633145b61117f5760405162461bcd60e51b8152600401610bdc90615856565b6001600160a01b03821660009081526005602052604090206002015442116111cf5760405162461bcd60e51b815260206004820152600360248201526252506160e81b6044820152606401610bdc565b600081116112045760405162461bcd60e51b81526020600482015260026024820152610c1960f21b6044820152606401610bdc565b6001600160a01b03821660008181526005602052604090819020600101839055517fad2f86b01ed93b4b3a150d448c61a4f5d8d38075d3c0c64cc0a26fd6e1f49545906112549084815260200190565b60405180910390a25050565b600160008082825461127291906159b9565b9091555050600080549033905b6006548110156113745760006006828154811061129e5761129e6159d1565b6000918252602090912001546001600160a01b031690506112be81613d56565b6001600160a01b038216600090815260056020819052604090912001556112e481612713565b6001600160a01b03808316600090815260056020526040902060040191909155831615611361576113158382610e31565b6001600160a01b038085166000818152600b602090815260408083209487168084529482528083209590955560058082528583200154928252600a815284822093825292909252919020555b508061136c816159e7565b91505061127f565b50600083116113955760405162461bcd60e51b8152600401610bdc90615a02565b600e546113a290846142e9565b600e55336000908152600f60205260409020546113bf90846142e9565b336000818152600f60205260409020919091556001546113ef916101009091046001600160a01b03169085614417565b60405183815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a350600054811461147f5760405162461bcd60e51b8152600401610bdc90615a1e565b5050565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114d357600080fd5b505af11580156114e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150b9190615839565b6001600160a01b0316336001600160a01b0316148061153457506017546001600160a01b031633145b6115505760405162461bcd60e51b8152600401610bdc90615856565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b600160008082825461158491906159b9565b9091555050600054600454600160a01b900460ff16156115ce5760405162461bcd60e51b8152602060048201526005602482015264504155534560d81b6044820152606401610bdc565b8260005b6006548110156116c7576000600682815481106115f1576115f16159d1565b6000918252602090912001546001600160a01b0316905061161181613d56565b6001600160a01b0382166000908152600560208190526040909120015561163781612713565b6001600160a01b038083166000908152600560205260409020600401919091558316156116b4576116688382610e31565b6001600160a01b038085166000818152600b602090815260408083209487168084529482528083209590955560058082528583200154928252600a815284822093825292909252919020555b50806116bf816159e7565b9150506115d2565b50600083116116e85760405162461bcd60e51b8152600401610bdc90615a02565b600e546116f590846143d2565b600e556001600160a01b0384166000908152600f602052604090205461171b90846143d2565b6001600160a01b038086166000908152600f602052604090209190915560015461174e916101009091041633308661446d565b836001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8460405161178991815260200190565b60405180910390a26040518381526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35060005481146117f45760405162461bcd60e51b8152600401610bdc90615a1e565b505050565b6001546040516370a0823160e01b815233600482015261187e9183916101009091046001600160a01b0316906370a082319060240160206040518083038186803b15801561184657600080fd5b505afa15801561185a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106489190615a3b565b50565b336001600160a01b03831614806118a257506003546001600160a01b031633145b6118d65760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b6044820152606401610bdc565b6003546008546040516363453ae160e01b81526001600160a01b0391821660048201529116906363453ae190602401600060405180830381600087803b15801561191f57600080fd5b505af1158015611933573d6000803e3d6000fd5b5050505061147f82826144ab565b600060018054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561198f57600080fd5b505afa1580156119a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c79190615a54565b60ff16905090565b60016000808282546119e191906159b9565b9091555050600080549033905b600654811015611ae357600060068281548110611a0d57611a0d6159d1565b6000918252602090912001546001600160a01b03169050611a2d81613d56565b6001600160a01b03821660009081526005602081905260409091200155611a5381612713565b6001600160a01b03808316600090815260056020526040902060040191909155831615611ad057611a848382610e31565b6001600160a01b038085166000818152600b602090815260408083209487168084529482528083209590955560058082528583200154928252600a815284822093825292909252919020555b5080611adb816159e7565b9150506119ee565b5060005b600654811015611b5b57600060068281548110611b0657611b066159d1565b600091825260208083209091015433808452600b835260408085206001600160a01b03909316808652929093529190922054919250611b46908383614662565b50508080611b53906159e7565b915050611ae7565b50611b6461485c565b505050600054811461187e5760405162461bcd60e51b8152600401610bdc90615a1e565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611bd857600080fd5b505af1158015611bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c109190615839565b6001600160a01b0316336001600160a01b03161480611c3957506017546001600160a01b031633145b611c555760405162461bcd60e51b8152600401610bdc90615856565b6001600160a01b03918216600090815260056020526040902080546001600160a01b03191691909216179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611cd357600080fd5b505af1158015611ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0b9190615839565b6001600160a01b0316336001600160a01b03161480611d3457506017546001600160a01b031633145b611d505760405162461bcd60e51b8152600401610bdc90615856565b620f4240821115611d895760405162461bcd60e51b815260206004820152600360248201526215a9a960e91b6044820152606401610bdc565b601191909155601255565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611de457600080fd5b505af1158015611df8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1c9190615839565b6001600160a01b0316336001600160a01b03161480611e4557506017546001600160a01b031633145b611e615760405162461bcd60e51b8152600401610bdc90615856565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611ed357600080fd5b505af1158015611ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0b9190615839565b6001600160a01b0316336001600160a01b03161480611f3457506017546001600160a01b031633145b611f505760405162461bcd60e51b8152600401610bdc90615856565b60005b815181101561147f57611f7e828281518110611f7157611f716159d1565b6020026020010151610b0f565b80611f88816159e7565b915050611f53565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611fe057600080fd5b505af1158015611ff4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120189190615839565b6001600160a01b0316336001600160a01b0316148061204157506017546001600160a01b031633145b61205d5760405162461bcd60e51b8152600401610bdc90615856565b6001600160a01b0381166000908152600d602052604090205460ff1615156001146120b05760405162461bcd60e51b815260206004820152600360248201526242546960e81b6044820152606401610bdc565b60095460405163095ea7b360e01b81526001600160a01b038381169263095ea7b3926120e59290911690600090600401615894565b602060405180830381600087803b1580156120ff57600080fd5b505af1158015612113573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213791906158ad565b5060078054906001600160a01b03831690612153600184615a77565b81548110612163576121636159d1565b6000918252602090912001546001600160a01b031614156121d657600780548061218f5761218f615a8e565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0384168252600d905260409020805460ff19169055612306565b60005b6007546121e890600190615a77565b81101561230457826001600160a01b03166007828154811061220c5761220c6159d1565b6000918252602090912001546001600160a01b031614156122f2576007612234600184615a77565b81548110612244576122446159d1565b600091825260209091200154600780546001600160a01b039092169183908110612270576122706159d1565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060078054806122af576122af615a8e565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0385168252600d905260409020805460ff191690555b806122fc816159e7565b9150506121d9565b505b6009546040516000916001600160a01b0390811691908516907f6f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d05908490a45050565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561239857600080fd5b505af11580156123ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d09190615839565b6001600160a01b0316336001600160a01b031614806123f957506017546001600160a01b031633145b6124155760405162461bcd60e51b8152600401610bdc90615856565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60008061245660018054906101000a90046001600160a01b0316612cfa565b90506000670de0b6b3a764000082600e546124719190615aa4565b61247b9190615ac3565b90506000805b6006548110156125c757600060056000600684815481106124a4576124a46159d1565b60009182526020808320909101546001600160a01b039081168452838201949094526040928301909120825160c08101845281549094168452600181015491840191909152600281015491830182905260038101546060840152600481015460808401526005015460a0830152909150428111156125b25760008260600151905060006125576006868154811061253d5761253d6159d1565b6000918252602090912001546001600160a01b0316612cfa565b9050670de0b6b3a764000061256c8284615aa4565b6125789061016d615aa4565b612583906018615aa4565b61258e90603c615aa4565b61259990603c615aa4565b6125a39190615ac3565b6125ad90876159b9565b955050505b505080806125bf906159e7565b915050612481565b5081156125fb57816125e182670de0b6b3a7640000615aa4565b6125ec906064615aa4565b6125f69190615ac3565b6125fe565b60005b935050505090565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561265657600080fd5b505af115801561266a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268e9190615839565b6001600160a01b0316336001600160a01b031614806126b757506017546001600160a01b031633145b6126d35760405162461bcd60e51b8152600401610bdc90615856565b60005b815181101561147f576127018282815181106126f4576126f46159d1565b6020026020010151611f90565b8061270b816159e7565b9150506126d6565b6001600160a01b038116600090815260056020526040812060020154610ec690429061533b565b6006818154811061274a57600080fd5b6000918252602090912001546001600160a01b0316905081565b336000908152600f602052604090205461277d90611260565b565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156127cf57600080fd5b505af11580156127e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128079190615839565b6001600160a01b0316336001600160a01b0316148061283057506017546001600160a01b031633145b61284c5760405162461bcd60e51b8152600401610bdc90615856565b6001546001600160a01b0383811661010090920416141561291657600e546001546040516370a0823160e01b81523060048201526000926128f29290916101009091046001600160a01b0316906370a082319060240160206040518083038186803b1580156128ba57600080fd5b505afa1580156128ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e929190615a3b565b9050808411156129145760405162461bcd60e51b8152600401610bdc90615875565b505b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906129449084908790600401615894565b602060405180830381600087803b15801561295e57600080fd5b505af1158015612972573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061299691906158ad565b50816001600160a01b03167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28846040516129d291815260200190565b60405180910390a2505050565b606060006129ff60018054906101000a90046001600160a01b0316612cfa565b90506000670de0b6b3a764000082600e54612a1a9190615aa4565b612a249190615ac3565b60065490915060009067ffffffffffffffff811115612a4557612a456155aa565b604051908082528060200260200182016040528015612a6e578160200160208202803683370190505b50905060005b600654811015612bd75760006005600060068481548110612a9757612a976159d1565b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220835160c08101855281549095168552600181015491850191909152600281015492840183905260038101546060850152600481015460808501526005015460a08401529192509042821115612b6d576000836060015190506000612b306006878154811061253d5761253d6159d1565b9050670de0b6b3a7640000612b458284615aa4565b612b519061016d615aa4565b612b5e9062015180615aa4565b612b689190615ac3565b925050505b8515612ba05785612b8682670de0b6b3a7640000615aa4565b612b91906064615aa4565b612b9b9190615ac3565b612ba3565b60005b858581518110612bb557612bb56159d1565b6020026020010181815250505050508080612bcf906159e7565b915050612a74565b509392505050565b606060018054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015612c2d57600080fd5b505afa158015612c41573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c6991908101906158ca565b604051602001610e1d9190615ae5565b6001600160a01b0381166000908152600560205260408120600201544210612ca357506000919050565b6001600160a01b038216600090815260056020526040812060020154612cc990426142e9565b6001600160a01b038416600090815260056020526040902060030154909150612cf3908290614335565b9392505050565b60195460405163b3596f0760e01b81526001600160a01b038381166004830152600092169063b3596f079060240160206040518083038186803b158015612d4057600080fd5b505afa158015612d54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec69190615a3b565b6001600080828254612d8a91906159b9565b90915550506000805490805b600654811015612e8b57600060068281548110612db557612db56159d1565b6000918252602090912001546001600160a01b03169050612dd581613d56565b6001600160a01b03821660009081526005602081905260409091200155612dfb81612713565b6001600160a01b03808316600090815260056020526040902060040191909155831615612e7857612e2c8382610e31565b6001600160a01b038085166000818152600b602090815260408083209487168084529482528083209590955560058082528583200154928252600a815284822093825292909252919020555b5080612e83816159e7565b915050612d96565b506001546001600160a01b03858116610100909204161415612ebf5760405162461bcd60e51b8152600401610bdc90615875565b6001600160a01b0384166000908152600c602052604090205460ff16612f0d5760405162461bcd60e51b815260206004820152600360248201526208549560ea1b6044820152606401610bdc565b6000600e5411612f455760405162461bcd60e51b815260206004820152600360248201526230545360e81b6044820152606401610bdc565b612f4d61485c565b50506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a082319060240160206040518083038186803b158015612f9157600080fd5b505afa158015612fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc99190615a3b565b9050612fe06001600160a01b03861633308761446d565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b15801561302257600080fd5b505afa158015613036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305a9190615a3b565b90506130668282615a77565b94506000851161309d5760405162461bcd60e51b8152602060048201526002602482015261183960f11b6044820152606401610bdc565b6001600160a01b0386166000908152600560205260409020600201544210613107576001600160a01b0386166000908152600560205260409020600101546130e6908690614390565b6001600160a01b038716600090815260056020526040902060030155613300565b6001600160a01b0386166000908152600560205260408120600381015460029091015490919061313790426142e9565b6001600160a01b03891660009081526005602052604081206003015491925090613162908390614335565b6001600160a01b038a1660009081526005602052604090206001015490915061318f90610eb78a846143d2565b6001600160a01b038a8116600090815260056020526040902060039081019290925590541633148015906131dd57506001600160a01b03898116600090815260056020526040902054163314155b80156132825750600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561323457600080fd5b505af1158015613248573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326c9190615839565b6001600160a01b0316336001600160a01b031614155b801561329957506017546001600160a01b03163314155b156132fc576001600160a01b038916600090815260056020526040902060030154831115806132c757508088115b6132fc5760405162461bcd60e51b8152600401610bdc906020808252600490820152634547504560e01b604082015260600190565b5050505b6001600160a01b0386166000908152600560205260409020426004820181905560019091015461333091906143d2565b6001600160a01b038716600081815260056020908152604091829020600201939093555187815233927f0f7cde3c0518e1cc590491be5861d70a2e333f7e65af2e1ebd91a3c9a3cc638d910160405180910390a36001600160a01b038616600090815260146020526040812080548792906133ac9084906159b9565b9250508190555050505060005481146117f45760405162461bcd60e51b8152600401610bdc90615a1e565b60016000808282546133e991906159b9565b9091555050600054600454600160a01b900460ff16156134335760405162461bcd60e51b8152602060048201526005602482015264504155534560d81b6044820152606401610bdc565b3360005b60065481101561352c57600060068281548110613456576134566159d1565b6000918252602090912001546001600160a01b0316905061347681613d56565b6001600160a01b0382166000908152600560208190526040909120015561349c81612713565b6001600160a01b03808316600090815260056020526040902060040191909155831615613519576134cd8382610e31565b6001600160a01b038085166000818152600b602090815260408083209487168084529482528083209590955560058082528583200154928252600a815284822093825292909252919020555b5080613524816159e7565b915050613437565b506000831161354d5760405162461bcd60e51b8152600401610bdc90615a02565b600e5461355a90846143d2565b600e55336000908152600f602052604090205461357790846143d2565b336000818152600f60205260409020919091556001546135a8916101009091046001600160a01b031690308661446d565b60405183815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a260405183815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611455565b6001600160a01b03811660009081526005602052604081206001810154600390910154610ec691614335565b60008061365d60018054906101000a90046001600160a01b0316612cfa565b9050670de0b6b3a764000081600e546136769190615aa4565b6136809190615ac3565b91505090565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156136d657600080fd5b505af11580156136ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370e9190615839565b6001600160a01b0316336001600160a01b0316148061373757506017546001600160a01b031633145b6137535760405162461bcd60e51b8152600401610bdc90615856565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156137c557600080fd5b505af11580156137d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137fd9190615839565b6001600160a01b0316336001600160a01b0316148061382657506017546001600160a01b031633145b6138425760405162461bcd60e51b8152600401610bdc90615856565b6001600160a01b0383166000908152600c602052604090205460ff1615801561388457506001600160a01b038316600090815260056020526040902060010154155b6138b55760405162461bcd60e51b8152602060048201526002602482015261414960f01b6044820152606401610bdc565b6001546001600160a01b038481166101009092041614156138e85760405162461bcd60e51b8152600401610bdc90615875565b6006805460018181019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b039586166001600160a01b031991821681179092556000918252600c60209081526040808420805460ff19168617905560059091529091208054949095169316929092178355910155565b600080600160008082825461397f91906159b9565b909155505060005461398f61485c565b9250925060005481146139b45760405162461bcd60e51b8152600401610bdc90615a1e565b509091565b6001546040516370a0823160e01b815233600482015261277d9161010090046001600160a01b0316906370a082319060240160206040518083038186803b158015613a0357600080fd5b505afa158015613a17573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b39190615a3b565b600080613a5a60018054906101000a90046001600160a01b0316612cfa565b9050670de0b6b3a764000081600e54613a739190615aa4565b613a7d9190615ac3565b915060005b600654811015613b7757613aa26006828154811061253d5761253d6159d1565b9150670de0b6b3a76400008260068381548110613ac157613ac16159d1565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015613b0d57600080fd5b505afa158015613b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b459190615a3b565b613b4f9190615aa4565b613b599190615ac3565b613b6390846159b9565b925080613b6f816159e7565b915050613a82565b505090565b6003546001600160a01b03163314613bbe5760405162461bcd60e51b815260206004820152600560248201526457686f205560d81b6044820152606401610bdc565b6009546001600160a01b031660005b600754811015613d1157600060078281548110613bec57613bec6159d1565b600091825260208220015460405163095ea7b360e01b81526001600160a01b039091169250829163095ea7b391613c27918791600401615894565b602060405180830381600087803b158015613c4157600080fd5b505af1158015613c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7991906158ad565b5060405163095ea7b360e01b81526001600160a01b0382169063095ea7b390613caa90879060001990600401615894565b602060405180830381600087803b158015613cc457600080fd5b505af1158015613cd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cfc91906158ad565b50508080613d09906159e7565b915050613bcd565b5050600980546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600f6020526040902054613d4e90611260565b61277d6119cf565b6000600e5460001415613d8357506001600160a01b03166000908152600560208190526040909120015490565b600e546001600160a01b03831660009081526005602052604090206003810154600490910154610ec692613dd7929091610eb791670de0b6b3a764000091613dd191908290610e928b612713565b90614335565b6001600160a01b03841660009081526005602081905260409091200154906143d2565b600080613e1960018054906101000a90046001600160a01b0316612cfa565b90506000670de0b6b3a764000082600e54613e349190615aa4565b613e3e9190615ac3565b905060006005600060068781548110613e5957613e596159d1565b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220835160c08101855281549095168552600181015491850191909152600281015492840183905260038101546060850152600481015460808501526005015460a08401529192509042821115613f2f576000836060015190506000613ef260068a8154811061253d5761253d6159d1565b9050670de0b6b3a7640000613f078284615aa4565b613f139061016d615aa4565b613f209062015180615aa4565b613f2a9190615ac3565b925050505b8315613f625783613f4882670de0b6b3a7640000615aa4565b613f53906064615aa4565b613f5d9190615ac3565b613f65565b60005b979650505050505050565b6007818154811061274a57600080fd5b600160008190555460ff1615613fc05760405162461bcd60e51b8152602060048201526005602482015264696e69742160d81b6044820152606401610bdc565b600180546001600160a01b03808716610100026001600160a81b0319909216919091178217909155600280549184166001600160a01b031990921682179055604080516311b25aab60e21b815290516346c96aac916004808201926020929091908290030181600087803b15801561403757600080fd5b505af115801561404b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061406f9190615839565b600380546001600160a01b039283166001600160a01b03199182168117909255600880549387169390911683179055604051635462ecad60e11b815260048101929092529063a8c5d95a9060240160206040518083038186803b1580156140d557600080fd5b505afa1580156140e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061410d9190615839565b600980546001600160a01b0319166001600160a01b0392831617905560025460408051637e062a3560e11b81529051600093929092169163fc0c546a91600480820192602092909190829003018186803b15801561416a57600080fd5b505afa15801561417e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141a29190615839565b600480546001600160a01b03199081166001600160a01b03848116918217845562eff1006012556000828152600c60209081526040808320805460ff19166001908117909155600680548083019091557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180548816871790556003546005909352928190208054929094169190951617825562093a80910155905163095ea7b360e01b81529293509163095ea7b3916142629187916000199101615894565b602060405180830381600087803b15801561427c57600080fd5b505af1158015614290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b491906158ad565b505060178054336001600160a01b031991821617909155601980549091166001600160a01b0392909216919091179055505050565b6000828211156143215760405162461bcd60e51b815260206004820152600360248201526216a7a360e91b6044820152606401610bdc565b600061432d8385615a77565b949350505050565b60008261434457506000610ec6565b60006143508385615aa4565b90508261435d8583615ac3565b14610ec35760405162461bcd60e51b81526020600482015260036024820152621527a360e91b6044820152606401610bdc565b60008082116143c65760405162461bcd60e51b815260206004820152600260248201526102f360f41b6044820152606401610bdc565b600061432d8385615ac3565b6000806143df83856159b9565b905083811015610ec35760405162461bcd60e51b815260206004820152600360248201526215a7a360e91b6044820152606401610bdc565b6117f48363a9059cbb60e01b8484604051602401614436929190615894565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152615351565b6040516001600160a01b03808516602483015283166044820152606481018290526144a59085906323b872dd60e01b90608401614436565b50505050565b60016000808282546144bd91906159b9565b9091555050600080549083905b6006548110156145bf576000600682815481106144e9576144e96159d1565b6000918252602090912001546001600160a01b0316905061450981613d56565b6001600160a01b0382166000908152600560208190526040909120015561452f81612713565b6001600160a01b038083166000908152600560205260409020600401919091558316156145ac576145608382610e31565b6001600160a01b038085166000818152600b602090815260408083209487168084529482528083209590955560058082528583200154928252600a815284822093825292909252919020555b50806145b7816159e7565b9150506144ca565b5060005b83518110156146355760008482815181106145e0576145e06159d1565b6020908102919091018101516001600160a01b038089166000908152600b8452604080822092841682529190935290912054909150614620878383614662565b5050808061462d906159e7565b9150506145c3565b5061463e61485c565b50505060005481146117f45760405162461bcd60e51b8152600401610bdc90615a1e565b80156117f4576001600160a01b038084166000908152600b602090815260408083208685168085529252822091909155600454909116141561478d5760115480156147735760006146ba620f4240610eb78585614335565b60025460125460405163d4e54c3b60e01b81526004810184905260248101919091526001600160a01b03888116604483015292935091169063d4e54c3b90606401602060405180830381600087803b15801561471557600080fd5b505af1158015614729573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061474d9190615a3b565b5061476d8561475c85846142e9565b6001600160a01b0387169190614417565b50614787565b6147876001600160a01b0384168584614417565b506147a1565b6147a16001600160a01b0383168483614417565b826001600160a01b0316826001600160a01b03167f9aa05b3d70a9e3e2f004f039648839560576334fb45c81f91b6db03ad9e2efc9836040516147e691815260200190565b60405180910390a36001600160a01b038216600090815260136020526040812080548392906148169084906159b9565b90915550506001600160a01b038084166000908152601560209081526040808320938616835292905290812080548392906148529084906159b9565b9091555050505050565b6000806000600360009054906101000a90046001600160a01b03166001600160a01b0316633f6678256040518163ffffffff1660e01b815260040160206040518083038186803b1580156148af57600080fd5b505afa1580156148c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148e79190615a3b565b905060008082116148f957600061497f565b600360009054906101000a90046001600160a01b03166001600160a01b03166313416d996040518163ffffffff1660e01b815260040160206040518083038186803b15801561494757600080fd5b505afa15801561495b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061497f9190615839565b60075490915060008167ffffffffffffffff8111156149a0576149a06155aa565b6040519080825280602002602001820160405280156149c9578160200160208202803683370190505b50905060008267ffffffffffffffff8111156149e7576149e76155aa565b604051908082528060200260200182016040528015614a10578160200160208202803683370190505b50905060005b83811015614b805760078181548110614a3157614a316159d1565b9060005260206000200160009054906101000a90046001600160a01b0316838281518110614a6157614a616159d1565b60200260200101906001600160a01b031690816001600160a01b03168152505060006001600160a01b0316838281518110614a9e57614a9e6159d1565b60200260200101516001600160a01b031614614b4e57828181518110614ac657614ac66159d1565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015614b1157600080fd5b505afa158015614b25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b499190615a3b565b614b51565b60005b828281518110614b6357614b636159d1565b602090810291909101015280614b78816159e7565b915050614a16565b50601860009054906101000a90046001600160a01b03166001600160a01b031663d294f0936040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614bd157600080fd5b505af1925050508015614be2575060015b614bf55750600096879650945050505050565b60005b8381101561532b576000806001600160a01b0316848381518110614c1e57614c1e6159d1565b60200260200101516001600160a01b031614614cce57838281518110614c4657614c466159d1565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015614c9157600080fd5b505afa158015614ca5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cc99190615a3b565b614cd1565b60005b9050828281518110614ce557614ce56159d1565b6020026020010151811115615318576000620f424088858581518110614d0d57614d0d6159d1565b602002602001015184614d209190615a77565b614d2a9190615aa4565b614d349190615ac3565b1115614f5e57838281518110614d4c57614d4c6159d1565b60200260200101516001600160a01b031663a9059cbb87620f42408a614d94888881518110614d7d57614d7d6159d1565b6020026020010151876142e990919063ffffffff16565b614d9e9190615aa4565b614da89190615ac3565b6040518363ffffffff1660e01b8152600401614dc5929190615894565b602060405180830381600087803b158015614ddf57600080fd5b505af1158015614df3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e1791906158ad565b50838281518110614e2a57614e2a6159d1565b60200260200101516001600160a01b0316866001600160a01b0316336001600160a01b03167f78c0b7f8dc279098cd35e7f6ed62faef6b268eb5f31ece1326f32e1bc1d5a048620f42408b614ea1898981518110614e8a57614e8a6159d1565b6020026020010151886142e990919063ffffffff16565b614eab9190615aa4565b614eb59190615ac3565b60405190815260200160405180910390a4838281518110614ed857614ed86159d1565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015614f2357600080fd5b505afa158015614f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f5b9190615a3b565b90505b6010546001600160a01b031661513a5760095484516001600160a01b039091169063b66503cf90869085908110614f9757614f976159d1565b6020026020010151614fcb868681518110614fb457614fb46159d1565b6020026020010151856142e990919063ffffffff16565b6040518363ffffffff1660e01b8152600401614fe8929190615894565b600060405180830381600087803b15801561500257600080fd5b505af1158015615016573d6000803e3d6000fd5b5050505083828151811061502c5761502c6159d1565b60200260200101516001600160a01b0316600960009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b03167fee447878094bcc87bd81b55e4831b5e9e3d095866fce10f4f7e4caa64ea7a558868681518110615099576150996159d1565b6020026020010151856150ac9190615a77565b60405190815260200160405180910390a48282815181106150cf576150cf6159d1565b6020026020010151816150e29190615a77565b601660008685815181106150f8576150f86159d1565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461512f91906159b9565b909155506153189050565b83828151811061514c5761514c6159d1565b60200260200101516001600160a01b031663a9059cbb601060009054906101000a90046001600160a01b031661518d868681518110614fb457614fb46159d1565b6040518363ffffffff1660e01b81526004016151aa929190615894565b602060405180830381600087803b1580156151c457600080fd5b505af11580156151d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151fc91906158ad565b5083828151811061520f5761520f6159d1565b60200260200101516001600160a01b0316601060009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b03167fee447878094bcc87bd81b55e4831b5e9e3d095866fce10f4f7e4caa64ea7a55886868151811061527c5761527c6159d1565b60200260200101518561528f9190615a77565b60405190815260200160405180910390a48282815181106152b2576152b26159d1565b6020026020010151816152c59190615a77565b601660008685815181106152db576152db6159d1565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461531291906159b9565b90915550505b5080615323816159e7565b915050614bf8565b5060009788975095505050505050565b600081831061534a5781610ec3565b5090919050565b6001600160a01b0382163b61538e5760405162461bcd60e51b815260206004820152600360248201526253453160e81b6044820152606401610bdc565b600080836001600160a01b0316836040516153a99190615b12565b6000604051808303816000865af19150503d80600081146153e6576040519150601f19603f3d011682016040523d82523d6000602084013e6153eb565b606091505b5091509150816154235760405162461bcd60e51b815260206004820152600360248201526229a29960e91b6044820152606401610bdc565b8051156144a5578080602001905181019061543e91906158ad565b6144a55760405162461bcd60e51b815260206004820152600360248201526253453360e81b6044820152606401610bdc565b6001600160a01b038116811461187e57600080fd5b60006020828403121561549757600080fd5b8135610ec381615470565b60005b838110156154bd5781810151838201526020016154a5565b838111156144a55750506000910152565b60208152600082518060208401526154ed8160408501602087016154a2565b601f01601f19169190910160400192915050565b6000806040838503121561551457600080fd5b823561551f81615470565b9150602083013561552f81615470565b809150509250929050565b801515811461187e57600080fd5b60006020828403121561555a57600080fd5b8135610ec38161553a565b6000806040838503121561557857600080fd5b823561558381615470565b946020939093013593505050565b6000602082840312156155a357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156155e9576155e96155aa565b604052919050565b600082601f83011261560257600080fd5b8135602067ffffffffffffffff82111561561e5761561e6155aa565b8160051b61562d8282016155c0565b928352848101820192828101908785111561564757600080fd5b83870192505b84831015613f6557823561566081615470565b8252918301919083019061564d565b6000806040838503121561568257600080fd5b823561568d81615470565b9150602083013567ffffffffffffffff8111156156a957600080fd5b6156b5858286016155f1565b9150509250929050565b600080604083850312156156d257600080fd5b50508035926020909101359150565b6000602082840312156156f357600080fd5b813567ffffffffffffffff81111561570a57600080fd5b61432d848285016155f1565b60008060006060848603121561572b57600080fd5b83359250602084013561573d81615470565b9150604084013561574d81615470565b809150509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561579057835183529284019291840191600101615774565b50909695505050505050565b6000806000606084860312156157b157600080fd5b83356157bc81615470565b925060208401356157cc81615470565b929592945050506040919091013590565b600080600080608085870312156157f357600080fd5b84356157fe81615470565b9350602085013561580e81615470565b9250604085013561581e81615470565b9150606085013561582e81615470565b939692955090935050565b60006020828403121561584b57600080fd5b8151610ec381615470565b602080825260059082015264215445414d60d81b604082015260600190565b602080825260059082015264212173746b60d81b604082015260600190565b6001600160a01b03929092168252602082015260400190565b6000602082840312156158bf57600080fd5b8151610ec38161553a565b6000602082840312156158dc57600080fd5b815167ffffffffffffffff808211156158f457600080fd5b818401915084601f83011261590857600080fd5b81518181111561591a5761591a6155aa565b61592d601f8201601f19166020016155c0565b915080825285602082850101111561594457600080fd5b6159558160208401602086016154a2565b50949350505050565b7f457175616c697a657220563320476175676520666f72200000000000000000008152600082516159968160178501602087016154a2565b9190910160170192915050565b634e487b7160e01b600052601160045260246000fd5b600082198211156159cc576159cc6159a3565b500190565b634e487b7160e01b600052603260045260246000fd5b60006000198214156159fb576159fb6159a3565b5060010190565b602080825260029082015261306160f01b604082015260600190565b60208082526003908201526252472160e81b604082015260600190565b600060208284031215615a4d57600080fd5b5051919050565b600060208284031215615a6657600080fd5b815160ff81168114610ec357600080fd5b600082821015615a8957615a896159a3565b500390565b634e487b7160e01b600052603160045260246000fd5b6000816000190483118215151615615abe57615abe6159a3565b500290565b600082615ae057634e487b7160e01b600052601260045260246000fd5b500490565b64229997239d60d91b815260008251615b058160058501602087016154a2565b9190910160050192915050565b60008251615b248184602087016154a2565b919091019291505056fea2646970667358221220c91c96eee68ef93c8cdffa42a90b933f6ca00f28a053914192e606163adf651764736f6c63430008090033
Deployed Bytecode Sourcemap
15958:27449:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35698:408;;;;;;:::i;:::-;;:::i;:::-;;20137:145;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17249:28;;;;;;;;;1199:25:1;;;1187:2;1172:18;17249:28:0;1053:177:1;17332:47:0;;;;;;:::i;:::-;;;;;;;;;;;;;;21472:266;;;;;;:::i;:::-;;:::i;17453:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;37436:77;;;;;;:::i;:::-;;:::i;20531:93::-;20604:12;;20531:93;;38183:107;;;;;;:::i;:::-;;:::i;17698:27::-;;;;;-1:-1:-1;;;;;17698:27:0;;;;;;-1:-1:-1;;;;;2179:32:1;;;2161:51;;2149:2;2134:18;17698:27:0;1997:221:1;16470:23:0;;;;;-1:-1:-1;;;;;16470:23:0;;;21862:144;;;;;;:::i;:::-;;:::i;23050:116::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23131:16:0;23107:4;23131:16;;;:10;:16;;;;;:27;;;;23050:116;35187:503;;;;;;:::i;:::-;;:::i;8847:27::-;;;;;;17386:60;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;23174:124;;;;;;:::i;:::-;-1:-1:-1;;;;;23259:16:0;23235:4;23259:16;;;:10;:16;;;;;:31;;;;23174:124;24698:437;;;;;;:::i;:::-;;:::i;39012:99::-;;;;;;:::i;:::-;;:::i;24117:453::-;;;;;;:::i;:::-;;:::i;24578:112::-;;;;;;:::i;:::-;;:::i;25695:254::-;;;;;;:::i;:::-;;:::i;20429:94::-;;;:::i;16764:19::-;;;;;-1:-1:-1;;;;;16764:19:0;;;16444;;;;;;;;-1:-1:-1;;;;;16444:19:0;;;25340:347;;;:::i;23360:187::-;;;;;;:::i;:::-;;:::i;37970:205::-;;;;;;:::i;:::-;;:::i;16500:19::-;;;;;-1:-1:-1;;;;;16500:19:0;;;17510:22;;;;;-1:-1:-1;;;;;17510:22:0;;;16615:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16615:44:0;;;;;;;;;;;;;;-1:-1:-1;;;;;6079:32:1;;;6061:51;;6143:2;6128:18;;6121:34;;;;6171:18;;;6164:34;;;;6229:2;6214:18;;6207:34;6272:3;6257:19;;6250:35;6099:3;6301:19;;6294:35;6048:3;6033:19;16615:44:0;5774:561:1;16984:40:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6505:14:1;;6498:22;6480:41;;6468:2;6453:18;16984:40:0;6340:187:1;37342:86:0;;;;;;:::i;:::-;;:::i;36833:171::-;;;;;;:::i;:::-;;:::i;36114:711::-;;;;;;:::i;:::-;;:::i;38298:77::-;;;;;;:::i;:::-;;:::i;39647:678::-;;;:::i;37012:177::-;;;;;;:::i;:::-;;:::i;17203:25::-;;;;;;16590:18;;;;;-1:-1:-1;;;16590:18:0;;;;;;20752:178;;;;;;:::i;:::-;;:::i;17286:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;16831:77;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;20632:112;;;;;;:::i;:::-;-1:-1:-1;;;;;20718:18:0;20691:7;20718:18;;;:9;:18;;;;;;;20632:112;17173:23;;;;;-1:-1:-1;;;;;17173:23:0;;;16556:25;;;;;-1:-1:-1;;;;;16556:25:0;;;16666:29;;;;;;:::i;:::-;;:::i;17539:33::-;;;;;-1:-1:-1;;;;;17539:33:0;;;25143:82;;;:::i;34556:623::-;;;;;;:::i;:::-;;:::i;22830:84::-;22903:2;;-1:-1:-1;;;;;22903:2:0;22830:84;;40921:770;;;:::i;:::-;;;;;;;:::i;22650:101::-;22725:11;:18;22650:101;;20290:131;;;:::i;22216:315::-;;;;;;:::i;:::-;;:::i;16737:20::-;;;;;-1:-1:-1;;;;;16737:20:0;;;38516:319;;;;;;:::i;:::-;;:::i;27177:2673::-;;;;;;:::i;:::-;;:::i;23555:460::-;;;;;;:::i;:::-;;:::i;22014:194::-;;;;;;:::i;:::-;;:::i;39480:159::-;;;:::i;38383:81::-;;;;;;:::i;:::-;;:::i;33817:630::-;;;;;;:::i;:::-;;:::i;29858:120::-;;;:::i;:::-;;;;8618:25:1;;;8674:2;8659:18;;8652:34;;;;8591:18;29858:120:0;8444:248:1;22922:120:0;;;;;;:::i;:::-;-1:-1:-1;;;;;23005:16:0;22981:4;23005:16;;;:10;:16;;;;;:29;;;;22922:120;17031:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24023:86;;;:::i;39119:353::-;;;:::i;22539:103::-;22615:12;:19;22539:103;;16915:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;37521:441;;;;;;:::i;:::-;;:::i;25233:97::-;;;:::i;20938:468::-;;;;;;:::i;:::-;;:::i;40333:580::-;;;;;;:::i;:::-;;:::i;16702:28::-;;;;;;:::i;:::-;;:::i;18307:1781::-;;;;;;:::i;:::-;;:::i;35698:408::-;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;35769:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;;::::1;;:25;35761:41;;;::::0;-1:-1:-1;;;35761:41:0;;10164:2:1;35761:41:0::1;::::0;::::1;10146:21:1::0;10203:1;10183:18;;;10176:29;-1:-1:-1;;;10221:18:1;;;10214:33;10264:18;;35761:41:0::1;9962:326:1::0;35761:41:0::1;35867:5;::::0;-1:-1:-1;;;;;35853:20:0;;::::1;35867:5;::::0;;::::1;;35853:20;;35844:39;;;;-1:-1:-1::0;;;35844:39:0::1;;;;;;;:::i;:::-;35952:5;::::0;35925:53:::1;::::0;-1:-1:-1;;;35925:53:0;;-1:-1:-1;;;;;35925:18:0;;::::1;::::0;::::1;::::0;:53:::1;::::0;35952:5;;::::1;::::0;-1:-1:-1;;35960:17:0;35925:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;35989:11:0::1;:20:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;35989:20:0::1;-1:-1:-1::0;;;;;35989:20:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;36020:16:0;;;:12:::1;35989:20;36020:16:::0;;;;;:23;;-1:-1:-1;;36020:23:0::1;::::0;::::1;::::0;;36085:5:::1;::::0;36059:39;;36085:5;::::1;::::0;36059:39:::1;::::0;-1:-1:-1;36059:39:0::1;35698:408:::0;:::o;20137:145::-;20176:13;20260:5;;;;;;;;-1:-1:-1;;;;;20260:5:0;-1:-1:-1;;;;;20260:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20260:12:0;;;;;;;;;;;;:::i;:::-;20216:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;20202:72;;20137:145;:::o;21472:266::-;-1:-1:-1;;;;;21698:16:0;;;21551:7;21698:16;;;:7;:16;;;;;;;;:31;;;;;;;;;;;;;21635;;;:22;:31;;;;;:46;;;;;;;;;;21578:152;;21698:31;21578:115;;21688:4;;21578:105;;21601:81;;:29;21715:13;21601:14;:29::i;:::-;:33;;:81::i;:::-;-1:-1:-1;;;;;21578:18:0;;;;;;:9;:18;;;;;;;:22;:105::i;:::-;:109;;:115::i;:::-;:119;;:152::i;:::-;21571:159;;21472:266;;;;;:::o;37436:77::-;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;37494:6:::1;:11:::0;;;::::1;;-1:-1:-1::0;;;37494:11:0::1;-1:-1:-1::0;;;;37494:11:0;;::::1;::::0;;;::::1;::::0;;37436:77::o;38183:107::-;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;38257:18:::1;:25:::0;;-1:-1:-1;;;;;;38257:25:0::1;-1:-1:-1::0;;;;;38257:25:0;;;::::1;::::0;;;::::1;::::0;;38183:107::o;21862:144::-;21939:7;21966:32;21975:7;21984:13;21966:8;:32::i;35187:503::-;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35334:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;:38:::1;;::::0;35316:15:::1;:56;35294:139;;;::::0;-1:-1:-1;;;35294:139:0;;12515:2:1;35294:139:0::1;::::0;::::1;12497:21:1::0;12554:1;12534:18;;;12527:29;-1:-1:-1;;;12572:18:1;;;12565:33;12615:18;;35294:139:0::1;12313:326:1::0;35294:139:0::1;35471:1;35452:16;:20;35444:35;;;::::0;-1:-1:-1;;;35444:35:0;;12846:2:1;35444:35:0::1;::::0;::::1;12828:21:1::0;12885:1;12865:18;;;12858:29;-1:-1:-1;;;12903:18:1;;;12896:32;12945:18;;35444:35:0::1;12644:325:1::0;35444:35:0::1;-1:-1:-1::0;;;;;35526:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;;;:41:::1;;:60:::0;;;35602:80;::::1;::::0;::::1;::::0;35570:16;1199:25:1;;1187:2;1172:18;;1053:177;35602:80:0::1;;;;;;;;35187:503:::0;;:::o;24698:437::-;9644:1;9628:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;9656:20:0;9679:12;;;24765:10:::1;::::0;41796:483:::1;41813:12;:19:::0;41809:23;::::1;41796:483;;;41854:13;41870:12;41883:1;41870:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;41870:15:0::1;::::0;-1:-1:-1;41941:21:0::1;41870:15:::0;41941:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;41900:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:38:::1;:62:::0;42012:31:::1;41911:5:::0;42012:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;41977:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;42062:21;::::1;::::0;42058:210:::1;;42130:24;42139:7;42148:5;42130:8;:24::i;:::-;-1:-1:-1::0;;;;;42104:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;42214:10:::1;:17:::0;;;;;;:38:::1;::::0;42173:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;42058:210:::1;-1:-1:-1::0;41834:3:0;::::1;::::0;::::1;:::i;:::-;;;;41796:483;;;;24805:1:::2;24796:6;:10;24788:25;;;;-1:-1:-1::0;;;24788:25:0::2;;;;;;;:::i;:::-;24860:12;::::0;:24:::2;::::0;24877:6;24860:16:::2;:24::i;:::-;24845:12;:39:::0;24929:10:::2;24919:21;::::0;;;:9:::2;:21;::::0;;;;;:33:::2;::::0;24945:6;24919:25:::2;:33::i;:::-;24905:10;24895:21;::::0;;;:9:::2;:21;::::0;;;;:57;;;;24963:5:::2;::::0;:38:::2;::::0;:5:::2;::::0;;::::2;-1:-1:-1::0;;;;;24963:5:0::2;::::0;24994:6;24963:18:::2;:38::i;:::-;25017:29;::::0;1199:25:1;;;25027:10:0::2;::::0;25017:29:::2;::::0;1187:2:1;1172:18;25017:29:0::2;;;;;;;25062:40;::::0;1199:25:1;;;25091:1:0::2;::::0;25071:10:::2;::::0;25062:40:::2;::::0;1187:2:1;1172:18;25062:40:0::2;;;;;;;;9702:1:::1;9738:12:::0;;9722;:28;9714:44;;;;-1:-1:-1;;;9714:44:0;;;;;;;:::i;:::-;9617:149;24698:437;:::o;39012:99::-;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;39077:9:::1;:26:::0;;-1:-1:-1;;;;;;39077:26:0::1;-1:-1:-1::0;;;;;39077:26:0;;;::::1;::::0;;;::::1;::::0;;39012:99::o;24117:453::-;9644:1;9628:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;9656:20:0;9679:12;42482:6:::1;::::0;-1:-1:-1;;;42482:6:0;::::1;;;42481:7;42473:25;;;::::0;-1:-1:-1;;;42473:25:0;;14374:2:1;42473:25:0::1;::::0;::::1;14356:21:1::0;14413:1;14393:18;;;14386:29;-1:-1:-1;;;14431:18:1;;;14424:35;14476:18;;42473:25:0::1;14172:328:1::0;42473:25:0::1;24211:5:::2;41801:6;41796:483;41813:12;:19:::0;41809:23;::::2;41796:483;;;41854:13;41870:12;41883:1;41870:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;41870:15:0::2;::::0;-1:-1:-1;41941:21:0::2;41870:15:::0;41941:14:::2;:21::i;:::-;-1:-1:-1::0;;;;;41900:17:0;::::2;;::::0;;;:10:::2;:17;::::0;;;;;;;:38:::2;:62:::0;42012:31:::2;41911:5:::0;42012:24:::2;:31::i;:::-;-1:-1:-1::0;;;;;41977:17:0;;::::2;;::::0;;;:10:::2;:17;::::0;;;;:32:::2;;:66:::0;;;;42062:21;::::2;::::0;42058:210:::2;;42130:24;42139:7;42148:5;42130:8;:24::i;:::-;-1:-1:-1::0;;;;;42104:16:0;;::::2;;::::0;;;:7:::2;:16;::::0;;;;;;;:23;;::::2;::::0;;;;;;;;;:50;;;;42214:10:::2;:17:::0;;;;;;:38:::2;::::0;42173:31;;;:22:::2;:31:::0;;;;;:38;;;;;;;;;;:79;42058:210:::2;-1:-1:-1::0;41834:3:0;::::2;::::0;::::2;:::i;:::-;;;;41796:483;;;;24246:1:::3;24237:6;:10;24229:25;;;;-1:-1:-1::0;;;24229:25:0::3;;;;;;;:::i;:::-;24298:12;::::0;:24:::3;::::0;24315:6;24298:16:::3;:24::i;:::-;24283:12;:39:::0;-1:-1:-1;;;;;24352:16:0;::::3;;::::0;;;:9:::3;:16;::::0;;;;;:28:::3;::::0;24373:6;24352:20:::3;:28::i;:::-;-1:-1:-1::0;;;;;24333:16:0;;::::3;;::::0;;;:9:::3;:16;::::0;;;;:47;;;;24391:5:::3;::::0;:57:::3;::::0;:5:::3;::::0;;::::3;;24414:10;24434:4;24441:6:::0;24391:22:::3;:57::i;:::-;24472:5;-1:-1:-1::0;;;;;24464:22:0::3;;24479:6;24464:22;;;;1199:25:1::0;;1187:2;1172:18;;1053:177;24464:22:0::3;;;;;;;;24502:35;::::0;1199:25:1;;;-1:-1:-1;;;;;24502:35:0;::::3;::::0;24519:1:::3;::::0;24502:35:::3;::::0;1187:2:1;1172:18;24502:35:0::3;;;;;;;42519:1:::2;9738:12:::0;;9722;:28;9714:44;;;;-1:-1:-1;;;9714:44:0;;;;;;;:::i;:::-;9617:149;24117:453;;:::o;24578:112::-;24654:5;;:27;;-1:-1:-1;;;24654:27:0;;24670:10;24654:27;;;2161:51:1;24636:46:0;;24647:5;;24654;;;;-1:-1:-1;;;;;24654:5:0;;:15;;2134:18:1;;24654:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24636:46::-;24578:112;:::o;25695:254::-;25784:10;-1:-1:-1;;;;;25784:21:0;;;;:53;;-1:-1:-1;25831:5:0;;-1:-1:-1;;;;;25831:5:0;25809:10;:28;25784:53;25776:71;;;;-1:-1:-1;;;25776:71:0;;14896:2:1;25776:71:0;;;14878:21:1;14935:1;14915:18;;;14908:29;-1:-1:-1;;;14953:18:1;;;14946:35;14998:18;;25776:71:0;14694:328:1;25776:71:0;25880:5;;25897;;25880:23;;-1:-1:-1;;;25880:23:0;;-1:-1:-1;;;;;25897:5:0;;;25880:23;;;2161:51:1;25880:5:0;;;:16;;2134:18:1;;25880:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25914:27;25925:7;25934:6;25914:10;:27::i;20429:94::-;20472:7;20499:5;;;;;;;;-1:-1:-1;;;;;20499:5:0;-1:-1:-1;;;;;20499:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20492:23;;;;20429:94;:::o;25340:347::-;9644:1;9628:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;9656:20:0;9679:12;;;25394:10:::1;::::0;41796:483:::1;41813:12;:19:::0;41809:23;::::1;41796:483;;;41854:13;41870:12;41883:1;41870:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;41870:15:0::1;::::0;-1:-1:-1;41941:21:0::1;41870:15:::0;41941:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;41900:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:38:::1;:62:::0;42012:31:::1;41911:5:::0;42012:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;41977:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;42062:21;::::1;::::0;42058:210:::1;;42130:24;42139:7;42148:5;42130:8;:24::i;:::-;-1:-1:-1::0;;;;;42104:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;42214:10:::1;:17:::0;;;;;;:38:::1;::::0;42173:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;42058:210:::1;-1:-1:-1::0;41834:3:0;::::1;::::0;::::1;:::i;:::-;;;;41796:483;;;;25424:6:::2;25419:238;25436:12;:19:::0;25432:23;::::2;25419:238;;;25477:21;25501:12;25514:1;25501:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;;::::2;::::0;25557:10:::2;25549:19:::0;;;:7:::2;:19:::0;;;;;;-1:-1:-1;;;;;25501:15:0;;::::2;25549:34:::0;;;;;;;;;;;;25501:15;;-1:-1:-1;25598:47:0::2;::::0;25501:15;25549:34;25598:11:::2;:47::i;:::-;25462:195;;25457:3;;;;;:::i;:::-;;;;25419:238;;;;25667:12;:10;:12::i;:::-;;;9702:1:::1;9738:12:::0;;9722;:28;9714:44;;;;-1:-1:-1;;;9714:44:0;;;;;;;:::i;23360:187::-;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23473:25:0;;::::1;;::::0;;;:10:::1;:25;::::0;;;;:66;;-1:-1:-1;;;;;;23473:66:0::1;::::0;;;::::1;;::::0;;23360:187::o;37970:205::-;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;38067:3:::1;38062;:8;;38054:24;;;::::0;-1:-1:-1;;;38054:24:0;;15507:2:1;38054:24:0::1;::::0;::::1;15489:21:1::0;15546:1;15526:18;;;15519:29;-1:-1:-1;;;15564:18:1;;;15557:33;15607:18;;38054:24:0::1;15305:326:1::0;38054:24:0::1;38121:10;:16:::0;;;;38148:13:::1;:19:::0;37970:205::o;37342:86::-;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;37406:8:::1;:14:::0;;-1:-1:-1;;;;;;37406:14:0::1;-1:-1:-1::0;;;;;37406:14:0;;;::::1;::::0;;;::::1;::::0;;37342:86::o;36833:171::-;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;36914:7:::1;36910:87;36928:4;:11;36923:2;:16;36910:87;;;36962:23;36976:4;36981:2;36976:8;;;;;;;;:::i;:::-;;;;;;;36962:13;:23::i;:::-;36941:4:::0;::::1;::::0;::::1;:::i;:::-;;;;36910:87;;36114:711:::0;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36188:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;;::::1;;:24;;:16:::0;:24:::1;36180:40;;;::::0;-1:-1:-1;;;36180:40:0;;15838:2:1;36180:40:0::1;::::0;::::1;15820:21:1::0;15877:1;15857:18;;;15850:29;-1:-1:-1;;;15895:18:1;;;15888:33;15938:18;;36180:40:0::1;15636:326:1::0;36180:40:0::1;36283:5;::::0;36256:37:::1;::::0;-1:-1:-1;;;36256:37:0;;-1:-1:-1;;;;;36256:18:0;;::::1;::::0;::::1;::::0;:37:::1;::::0;36283:5;;::::1;::::0;::::1;::::0;36256:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;36315:11:0::1;:18:::0;;;-1:-1:-1;;;;;36347:22:0;::::1;::::0;36359:5:::1;36363:1;36315:18:::0;36359:5:::1;:::i;:::-;36347:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;36347:18:0::1;:22;36344:418;;;36386:11;:17;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;36386:17:0;;;;;-1:-1:-1;;;;;;36386:17:0::1;::::0;;;;;;;;-1:-1:-1;;;;;36418:16:0;::::1;::::0;;:12:::1;:16:::0;;;;;:24;;-1:-1:-1;;36418:24:0::1;::::0;;36344:418:::1;;;36488:6;36484:267;36500:11;:18:::0;:22:::1;::::0;36521:1:::1;::::0;36500:22:::1;:::i;:::-;36496:1;:26;36484:267;;;36567:2;-1:-1:-1::0;;;;;36551:18:0::1;:11;36563:1;36551:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;36551:14:0::1;:18;36548:188;;;36611:11;36623:5;36627:1;36623:3:::0;:5:::1;:::i;:::-;36611:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;36594:11:::1;:14:::0;;-1:-1:-1;;;;;36611:18:0;;::::1;::::0;36606:1;;36594:14;::::1;;;;;:::i;:::-;;;;;;;;;:35;;;;;-1:-1:-1::0;;;;;36594:35:0::1;;;;;-1:-1:-1::0;;;;;36594:35:0::1;;;;;;36652:11;:17;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;36652:17:0;;;;;-1:-1:-1;;;;;;36652:17:0::1;::::0;;;;;;;;-1:-1:-1;;;;;36692:16:0;::::1;::::0;;:12:::1;:16:::0;;;;;:24;;-1:-1:-1;;36692:24:0::1;::::0;;36548:188:::1;36524:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36484:267;;;;36344:418;36803:5;::::0;36777:40:::1;::::0;36811:5:::1;::::0;-1:-1:-1;;;;;36803:5:0;;::::1;::::0;36777:40;;::::1;::::0;::::1;::::0;36811:5;;36777:40:::1;36169:656;36114:711:::0;:::o;38298:77::-;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;38357:5:::1;:10:::0;;-1:-1:-1;;;;;;38357:10:0::1;-1:-1:-1::0;;;;;38357:10:0;;;::::1;::::0;;;::::1;::::0;;38298:77::o;39647:678::-;39682:9;39704:8;39715:29;39737:5;;;;;;;;-1:-1:-1;;;;;39737:5:0;39715:13;:29::i;:::-;39704:40;;39755:9;39790:4;39783:3;39768:12;;:18;;;;:::i;:::-;39767:27;;;;:::i;:::-;39755:39;;39807:9;39833:6;39829:387;39843:12;:19;39841:21;;39829:387;;;39884:18;39905:10;:29;39917:12;39930:1;39917:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;39917:15:0;;;39905:29;;;;;;;;;;;;;;;;39884:50;;;;;;;;;;;;;;39917:15;39884:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40001:15:0;39995:21;;39992:213;;;40037:8;40048:4;:15;;;40037:26;;40082:8;40093:30;40107:12;40120:1;40107:15;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;40107:15:0;40093:13;:30::i;:::-;40082:41;-1:-1:-1;40185:4:0;40151:9;40082:41;40151:3;:9;:::i;:::-;:15;;40163:3;40151:15;:::i;:::-;:20;;40169:2;40151:20;:::i;:::-;:25;;40174:2;40151:25;:::i;:::-;:30;;40179:2;40151:30;:::i;:::-;40150:39;;;;:::i;:::-;40142:47;;;;:::i;:::-;;;40018:187;;39992:213;39869:347;;39864:3;;;;;:::i;:::-;;;;39829:387;;;-1:-1:-1;40245:9:0;;:62;;40303:4;40282:11;:4;40289;40282:11;:::i;:::-;:17;;40296:3;40282:17;:::i;:::-;40281:26;;;;:::i;:::-;40245:62;;;40267:1;40245:62;40228:79;;39693:632;;;39647:678;:::o;37012:177::-;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;37096:7:::1;37092:90;37110:4;:11;37105:2;:16;37092:90;;;37144:26;37161:4;37166:2;37161:8;;;;;;;;:::i;:::-;;;;;;;37144:16;:26::i;:::-;37123:4:::0;::::1;::::0;::::1;:::i;:::-;;;;37092:90;;20752:178:::0;-1:-1:-1;;;;;20883:25:0;;20830:7;20883:25;;;:10;:25;;;;;:38;;;20857:65;;20866:15;;20857:8;:65::i;16666:29::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16666:29:0;;-1:-1:-1;16666:29:0;:::o;25143:82::-;25205:10;25195:21;;;;:9;:21;;;;;;25186:31;;:8;:31::i;:::-;25143:82::o;34556:623::-;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;34663:5:::1;::::0;-1:-1:-1;;;;;34645:24:0;;::::1;34663:5;::::0;;::::1;;34645:24;34642:446;;;34975:12;::::0;34939:5:::1;::::0;:30:::1;::::0;-1:-1:-1;;;34939:30:0;;34963:4:::1;34939:30;::::0;::::1;2161:51:1::0;-1:-1:-1;;34938:50:0::1;::::0;34975:12;;34939:5:::1;::::0;;::::1;-1:-1:-1::0;;;;;34939:5:0::1;::::0;:15:::1;::::0;2134:18:1;;34939:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34938:50::-;34922:66;;35020:8;35012:4;:16;;35003:35;;;;-1:-1:-1::0;;;35003:35:0::1;;;;;;;:::i;:::-;34671:417;34642:446;35098:34;::::0;-1:-1:-1;;;35098:34:0;;-1:-1:-1;;;;;35098:23:0;::::1;::::0;::::1;::::0;:34:::1;::::0;35122:3;;35127:4;;35098:34:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35158:6;-1:-1:-1::0;;;;;35148:23:0::1;;35166:4;35148:23;;;;1199:25:1::0;;1187:2;1172:18;;1053:177;35148:23:0::1;;;;;;;;34556:623:::0;;;:::o;40921:770::-;40957:13;40983:8;40994:29;41016:5;;;;;;;;-1:-1:-1;;;;;41016:5:0;40994:13;:29::i;:::-;40983:40;;41034:9;41069:4;41062:3;41047:12;;:18;;;;:::i;:::-;41046:27;;;;:::i;:::-;41117:12;:19;41034:39;;-1:-1:-1;41084:19:0;;41106:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41106:31:0;;41084:53;;41152:6;41148:513;41162:12;:19;41160:21;;41148:513;;;41203:18;41224:10;:29;41236:12;41249:1;41236:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41236:15:0;;;41224:29;;;;;;;;;;;;;;;41203:50;;;;;;;;;;;;;;41236:15;41203:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41203:50:0;41344:15;41338:21;;41335:203;;;41380:8;41391:4;:15;;;41380:26;;41425:8;41436:30;41450:12;41463:1;41450:15;;;;;;;;:::i;41436:30::-;41425:41;-1:-1:-1;41518:4:0;41492:9;41425:41;41492:3;:9;:::i;:::-;:15;;41504:3;41492:15;:::i;:::-;:23;;41510:5;41492:23;:::i;:::-;:30;;;;:::i;:::-;41485:37;;41361:177;;41335:203;41574:9;;:64;;41634:4;41613:11;:4;41620;41613:11;:::i;:::-;:17;;41627:3;41613:17;:::i;:::-;41612:26;;;;:::i;:::-;41574:64;;;41597:1;41574:64;41552:5;41558:1;41552:8;;;;;;;;:::i;:::-;;;;;;:86;;;;;41188:473;;;41183:3;;;;;:::i;:::-;;;;41148:513;;;-1:-1:-1;41678:5:0;40921:770;-1:-1:-1;;;40921:770:0:o;20290:131::-;20331:13;20397:5;;;;;;;;-1:-1:-1;;;;;20397:5:0;-1:-1:-1;;;;;20397:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20397:14:0;;;;;;;;;;;;:::i;:::-;20371:41;;;;;;;;:::i;22216:315::-;-1:-1:-1;;;;;22316:25:0;;22276:4;22316:25;;;:10;:25;;;;;:38;;;22297:15;:57;22293:71;;-1:-1:-1;22363:1:0;;22216:315;-1:-1:-1;22216:315:0:o;22293:71::-;-1:-1:-1;;;;;22395:25:0;;22375:17;22395:25;;;:10;:25;;;;;:38;;;:59;;22438:15;22395:42;:59::i;:::-;-1:-1:-1;;;;;22486:25:0;;;;;;:10;:25;;;;;:36;;;22375:79;;-1:-1:-1;22472:51:0;;22375:79;;22472:13;:51::i;:::-;22465:58;22216:315;-1:-1:-1;;;22216:315:0:o;38516:319::-;38800:9;;:27;;-1:-1:-1;;;38800:27:0;;-1:-1:-1;;;;;2179:32:1;;;38800:27:0;;;2161:51:1;38571:7:0;;38800:9;;:23;;2134:18:1;;38800:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27177:2673::-;9644:1;9628:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;9656:20:0;9679:12;;;9656:20;41796:483:::1;41813:12;:19:::0;41809:23;::::1;41796:483;;;41854:13;41870:12;41883:1;41870:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;41870:15:0::1;::::0;-1:-1:-1;41941:21:0::1;41870:15:::0;41941:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;41900:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:38:::1;:62:::0;42012:31:::1;41911:5:::0;42012:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;41977:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;42062:21;::::1;::::0;42058:210:::1;;42130:24;42139:7;42148:5;42130:8;:24::i;:::-;-1:-1:-1::0;;;;;42104:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;42214:10:::1;:17:::0;;;;;;:38:::1;::::0;42173:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;42058:210:::1;-1:-1:-1::0;41834:3:0;::::1;::::0;::::1;:::i;:::-;;;;41796:483;;;-1:-1:-1::0;27336:5:0::2;::::0;-1:-1:-1;;;;;27311:31:0;;::::2;27336:5;::::0;;::::2;;27311:31;;27303:49;;;;-1:-1:-1::0;;;27303:49:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27415:23:0;::::2;;::::0;;;:8:::2;:23;::::0;;;;;::::2;;27407:40;;;::::0;-1:-1:-1;;;27407:40:0;;17540:2:1;27407:40:0::2;::::0;::::2;17522:21:1::0;17579:1;17559:18;;;17552:29;-1:-1:-1;;;17597:18:1;;;17590:33;17640:18;;27407:40:0::2;17338:326:1::0;27407:40:0::2;27496:1;27483:12;;:14;27475:30;;;::::0;-1:-1:-1;;;27475:30:0;;17871:2:1;27475:30:0::2;::::0;::::2;17853:21:1::0;17910:1;17890:18;;;17883:29;-1:-1:-1;;;17928:18:1;;;17921:33;17971:18;;27475:30:0::2;17669:326:1::0;27475:30:0::2;27773:12;:10;:12::i;:::-;-1:-1:-1::0;;27868:46:0::2;::::0;-1:-1:-1;;;27868:46:0;;27908:4:::2;27868:46;::::0;::::2;2161:51:1::0;27856:9:0::2;::::0;-1:-1:-1;;;;;27868:31:0;::::2;::::0;::::2;::::0;2134:18:1;;27868:46:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27856:58:::0;-1:-1:-1;28095:74:0::2;-1:-1:-1::0;;;;;28095:38:0;::::2;28134:10;28154:4;28161:7:::0;28095:38:::2;:74::i;:::-;28192:46;::::0;-1:-1:-1;;;28192:46:0;;28232:4:::2;28192:46;::::0;::::2;2161:51:1::0;28180:9:0::2;::::0;-1:-1:-1;;;;;28192:31:0;::::2;::::0;::::2;::::0;2134:18:1;;28192:46:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28180:58:::0;-1:-1:-1;28259:11:0::2;28266:4:::0;28180:58;28259:11:::2;:::i;:::-;28249:21;;28299:1;28289:7;:11;28281:26;;;::::0;-1:-1:-1;;;28281:26:0;;18202:2:1;28281:26:0::2;::::0;::::2;18184:21:1::0;18241:1;18221:18;;;18214:29;-1:-1:-1;;;18259:18:1;;;18252:32;18301:18;;28281:26:0::2;18000:325:1::0;28281:26:0::2;-1:-1:-1::0;;;;;28384:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:38:::2;;::::0;28365:15:::2;:57;28361:1182;;-1:-1:-1::0;;;;;28490:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:41:::2;;::::0;28478:54:::2;::::0;:7;;:11:::2;:54::i;:::-;-1:-1:-1::0;;;;;28439:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:36:::2;;:93:::0;28361:1182:::2;;;-1:-1:-1::0;;;;;28674:25:0;::::2;28652:19;28674:25:::0;;;:10:::2;:25;::::0;;;;:36:::2;::::0;::::2;::::0;28745:38:::2;::::0;;::::2;::::0;28674:36;;28652:19;28745:59:::2;::::0;28788:15:::2;28745:42;:59::i;:::-;-1:-1:-1::0;;;;;28852:25:0;::::2;28819:16;28852:25:::0;;;:10:::2;:25;::::0;;;;:36:::2;;::::0;28725:79;;-1:-1:-1;28819:16:0;28838:51:::2;::::0;28725:79;;28838:13:::2;:51::i;:::-;-1:-1:-1::0;;;;;28969:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:41:::2;;::::0;28819:70;;-1:-1:-1;28943:68:0::2;::::0;:21:::2;:7:::0;28819:70;28943:11:::2;:21::i;:68::-;-1:-1:-1::0;;;;;28904:25:0;;::::2;;::::0;;;:10:::2;:25;::::0;;;;:36:::2;::::0;;::::2;:107:::0;;;;29067:5;;::::2;29047:10;:26;::::0;::::2;::::0;:103:::2;;-1:-1:-1::0;;;;;;29106:25:0;;::::2;;::::0;;;:10:::2;:25;::::0;;;;:44;::::2;29094:10;:56;;29047:103;:145;;;;;29183:2;;;;;;;;;-1:-1:-1::0;;;;;29183:2:0::2;-1:-1:-1::0;;;;;29183:7:0::2;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29171:21:0::2;:10;-1:-1:-1::0;;;;;29171:21:0::2;;;29047:145;:185;;;;-1:-1:-1::0;29225:7:0::2;::::0;-1:-1:-1;;;;;29225:7:0::2;29213:10;:19;;29047:185;29026:506;;;-1:-1:-1::0;;;;;29324:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:36:::2;;::::0;:54;-1:-1:-1;29324:54:0::2;::::0;:101:::2;;;29417:8;29407:7;:18;29324:101;29267:249;;;;-1:-1:-1::0;;;29267:249:0::2;;;;;;18532:2:1::0;18514:21;;;18571:1;18551:18;;;18544:29;-1:-1:-1;;;18604:2:1;18589:18;;18582:34;18648:2;18633:18;;18330:327;29267:249:0::2;28550:993;;;28361:1182;-1:-1:-1::0;;;;;29555:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;29598:15:::2;29555:40;::::0;::::2;:58:::0;;;29685:41:::2;::::0;;::::2;::::0;29665:62:::2;::::0;29598:15;29665:19:::2;:62::i;:::-;-1:-1:-1::0;;;;;29624:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;;;;;:38:::2;;:103:::0;;;;29743:47;1199:25:1;;;29770:10:0::2;::::0;29743:47:::2;::::0;1172:18:1;29743:47:0::2;;;;;;;-1:-1:-1::0;;;;;29801:30:0;::::2;;::::0;;;:15:::2;:30;::::0;;;;:41;;29835:7;;29801:30;:41:::2;::::0;29835:7;;29801:41:::2;:::i;:::-;;;;;;;;27292:2558;;9702:1:::1;9738:12:::0;;9722;:28;9714:44;;;;-1:-1:-1;;;9714:44:0;;;;;;;:::i;23555:460::-;9644:1;9628:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;9656:20:0;9679:12;42482:6:::1;::::0;-1:-1:-1;;;42482:6:0;::::1;;;42481:7;42473:25;;;::::0;-1:-1:-1;;;42473:25:0;;14374:2:1;42473:25:0::1;::::0;::::1;14356:21:1::0;14413:1;14393:18;;;14386:29;-1:-1:-1;;;14431:18:1;;;14424:35;14476:18;;42473:25:0::1;14172:328:1::0;42473:25:0::1;23631:10:::2;41801:6;41796:483;41813:12;:19:::0;41809:23;::::2;41796:483;;;41854:13;41870:12;41883:1;41870:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;41870:15:0::2;::::0;-1:-1:-1;41941:21:0::2;41870:15:::0;41941:14:::2;:21::i;:::-;-1:-1:-1::0;;;;;41900:17:0;::::2;;::::0;;;:10:::2;:17;::::0;;;;;;;:38:::2;:62:::0;42012:31:::2;41911:5:::0;42012:24:::2;:31::i;:::-;-1:-1:-1::0;;;;;41977:17:0;;::::2;;::::0;;;:10:::2;:17;::::0;;;;:32:::2;;:66:::0;;;;42062:21;::::2;::::0;42058:210:::2;;42130:24;42139:7;42148:5;42130:8;:24::i;:::-;-1:-1:-1::0;;;;;42104:16:0;;::::2;;::::0;;;:7:::2;:16;::::0;;;;;;;:23;;::::2;::::0;;;;;;;;;:50;;;;42214:10:::2;:17:::0;;;;;;:38:::2;::::0;42173:31;;;:22:::2;:31:::0;;;;;:38;;;;;;;;;;:79;42058:210:::2;-1:-1:-1::0;41834:3:0;::::2;::::0;::::2;:::i;:::-;;;;41796:483;;;;23671:1:::3;23662:6;:10;23654:25;;;;-1:-1:-1::0;;;23654:25:0::3;;;;;;;:::i;:::-;23723:12;::::0;:24:::3;::::0;23740:6;23723:16:::3;:24::i;:::-;23708:12;:39:::0;23792:10:::3;23782:21;::::0;;;:9:::3;:21;::::0;;;;;:33:::3;::::0;23808:6;23782:25:::3;:33::i;:::-;23768:10;23758:21;::::0;;;:9:::3;:21;::::0;;;;:57;;;;23826:5:::3;::::0;:57:::3;::::0;:5:::3;::::0;;::::3;-1:-1:-1::0;;;;;23826:5:0::3;::::0;23869:4:::3;23876:6:::0;23826:22:::3;:57::i;:::-;23899:27;::::0;1199:25:1;;;23907:10:0::3;::::0;23899:27:::3;::::0;1187:2:1;1172:18;23899:27:0::3;;;;;;;23942:40;::::0;1199:25:1;;;23963:10:0::3;::::0;23959:1:::3;::::0;23942:40:::3;::::0;1187:2:1;1172:18;23942:40:0::3;1053:177:1::0;22014:194:0;-1:-1:-1;;;;;22158:25:0;;22090:7;22158:25;;;:10;:25;;;;;:41;;;;22117:36;;;;;:83;;:40;:83::i;39480:159::-;39524:9;39546:8;39557:29;39579:5;;;;;;;;-1:-1:-1;;;;;39579:5:0;39557:13;:29::i;:::-;39546:40;;39627:4;39620:3;39605:12;;:18;;;;:::i;:::-;39604:27;;;;:::i;:::-;39597:34;;39535:104;39480:159;:::o;38383:81::-;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;38444:7:::1;:12:::0;;-1:-1:-1;;;;;;38444:12:0::1;-1:-1:-1::0;;;;;38444:12:0;;;::::1;::::0;;;::::1;::::0;;38383:81::o;33817:630::-;42356:2;;;;;;;;;-1:-1:-1;;;;;42356:2:0;-1:-1:-1;;;;;42356:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42344:21:0;:10;-1:-1:-1;;;;;42344:21:0;;:44;;;-1:-1:-1;42381:7:0;;-1:-1:-1;;;;;42381:7:0;42369:10;:19;42344:44;42336:62;;;;-1:-1:-1;;;42336:62:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33964:23:0;::::1;;::::0;;;:8:::1;:23;::::0;;;;;::::1;;:32;::::0;::::1;:95;;-1:-1:-1::0;;;;;;34013:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;:41:::1;;::::0;:46;33964:95:::1;33942:172;;;::::0;-1:-1:-1;;;33942:172:0;;18864:2:1;33942:172:0::1;::::0;::::1;18846:21:1::0;18903:1;18883:18;;;18876:29;-1:-1:-1;;;18921:18:1;;;18914:32;18963:18;;33942:172:0::1;18662:325:1::0;33942:172:0::1;34159:5;::::0;-1:-1:-1;;;;;34134:31:0;;::::1;34159:5;::::0;;::::1;;34134:31;;34125:50;;;;-1:-1:-1::0;;;34125:50:0::1;;;;;;;:::i;:::-;34218:12;:32:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;34218:32:0;;::::1;-1:-1:-1::0;;;;;;34218:32:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;34261:23:0;;;:8:::1;34218:32;34261:23:::0;;;;;;;:30;;-1:-1:-1;;34261:30:0::1;::::0;::::1;::::0;;34302:10:::1;:25:::0;;;;;;:66;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;34379:41;::::1;:60:::0;33817:630::o;29858:120::-;29910:13;29925;9644:1;9628:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;9656:20:0;9679:12;29958::::1;:10;:12::i;:::-;29951:19;;;;9738:12:::0;;9722;:28;9714:44;;;;-1:-1:-1;;;9714:44:0;;;;;;;:::i;:::-;9617:149;29858:120;;:::o;24023:86::-;24073:5;;:27;;-1:-1:-1;;;24073:27:0;;24089:10;24073:27;;;2161:51:1;24065:36:0;;24073:5;;;-1:-1:-1;;;;;24073:5:0;;:15;;2134:18:1;;24073:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39119:353::-;39155:9;39177:8;39188:29;39210:5;;;;;;;;-1:-1:-1;;;;;39210:5:0;39188:13;:29::i;:::-;39177:40;;39258:4;39251:3;39236:12;;:18;;;;:::i;:::-;39235:27;;;;:::i;:::-;39228:34;;39279:6;39275:190;39289:12;:19;39287:21;;39275:190;;;39336:30;39350:12;39363:1;39350:15;;;;;;;;:::i;39336:30::-;39330:36;;39449:4;39442:3;39398:12;39411:1;39398:15;;;;;;;;:::i;:::-;;;;;;;;;;;39391:48;;-1:-1:-1;;;39391:48:0;;39433:4;39391:48;;;2161:51:1;-1:-1:-1;;;;;39398:15:0;;;;39391:33;;2134:18:1;;39391:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;39389:64;;;;:::i;:::-;39381:72;;;;:::i;:::-;;-1:-1:-1;39310:3:0;;;;:::i;:::-;;;;39275:190;;;;39166:306;39119:353;:::o;37521:441::-;37599:5;;-1:-1:-1;;;;;37599:5:0;37579:10;:26;37571:44;;;;-1:-1:-1;;;37571:44:0;;19194:2:1;37571:44:0;;;19176:21:1;19233:1;19213:18;;;19206:29;-1:-1:-1;;;19251:18:1;;;19244:35;19296:18;;37571:44:0;18992:328:1;37571:44:0;37666:5;;-1:-1:-1;;;;;37666:5:0;37644:11;37683:243;37696:11;:18;37694:20;;37683:243;;;37735:11;37749;37761:1;37749:14;;;;;;;;:::i;:::-;;;;;;;;;;37778:27;;-1:-1:-1;;;37778:27:0;;-1:-1:-1;;;;;37749:14:0;;;;-1:-1:-1;37749:14:0;;37778:19;;:27;;37798:3;;37778:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;37851:42:0;;-1:-1:-1;;;37851:42:0;;-1:-1:-1;;;;;37851:19:0;;;;;:42;;37871:2;;-1:-1:-1;;37875:17:0;37851:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37720:206;37715:3;;;;;:::i;:::-;;;;37683:243;;;-1:-1:-1;;37936:5:0;:18;;-1:-1:-1;;;;;;37936:18:0;-1:-1:-1;;;;;37936:18:0;;;;;;;;;;37521:441::o;25233:97::-;25288:10;25278:21;;;;:9;:21;;;;;;25269:31;;:8;:31::i;:::-;25311:11;:9;:11::i;20938:468::-;21006:7;21030:12;;21046:1;21030:17;21026:103;;;-1:-1:-1;;;;;;21071:25:0;;;;;:10;:25;;;;;;;;:46;;;20938:468::o;21026:103::-;21370:12;;-1:-1:-1;;;;;21318:25:0;;;;;;:10;:25;;;;;:36;;;;21272:40;;;;;21159:239;;21228:155;;21370:12;;21228:137;;21360:4;;21228:127;;21318:36;21228:127;;:39;21329:13;21228:24;:39::i;:85::-;:89;;:127::i;:155::-;-1:-1:-1;;;;;21159:25:0;;;;;;:10;:25;;;;;;;;:46;;;:50;:239::i;40333:580::-;40374:9;40396:8;40407:29;40429:5;;;;;;;;-1:-1:-1;;;;;40429:5:0;40407:13;:29::i;:::-;40396:40;;40447:9;40482:4;40475:3;40460:12;;:18;;;;:::i;:::-;40459:27;;;;:::i;:::-;40447:39;;40497:18;40518:10;:29;40530:12;40543:1;40530:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;40530:15:0;;;40518:29;;;;;;;;;;;;;;;40497:50;;;;;;;;;;;;;;40530:15;40497:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40497:50:0;40626:15;40620:21;;40617:187;;;40658:8;40669:4;:15;;;40658:26;;40699:8;40710:30;40724:12;40737:1;40724:15;;;;;;;;:::i;40710:30::-;40699:41;-1:-1:-1;40788:4:0;40762:9;40699:41;40762:3;:9;:::i;:::-;:15;;40774:3;40762:15;:::i;:::-;:23;;40780:5;40762:23;:::i;:::-;:30;;;;:::i;:::-;40755:37;;40643:161;;40617:187;40833:9;;:62;;40891:4;40870:11;:4;40877;40870:11;:::i;:::-;:17;;40884:3;40870:17;:::i;:::-;40869:26;;;;:::i;:::-;40833:62;;;40855:1;40833:62;40816:79;40333:580;-1:-1:-1;;;;;;;40333:580:0:o;16702:28::-;;;;;;;;;;;;18307:1781;18788:1;18773:12;:16;;;18811:12;;;18810:13;18802:30;;;;-1:-1:-1;;;18802:30:0;;19527:2:1;18802:30:0;;;19509:21:1;19566:1;19546:18;;;19539:29;-1:-1:-1;;;19584:18:1;;;19577:35;19629:18;;18802:30:0;19325:328:1;18802:30:0;18858:4;18843:19;;-1:-1:-1;;;;;18875:22:0;;;18843:19;18875:22;-1:-1:-1;;;;;;18875:22:0;;;;;;;;;;;;18908:2;:24;;;;;-1:-1:-1;;;;;;18908:24:0;;;;;;;18958:27;;;-1:-1:-1;;;18958:27:0;;;;:25;;:27;;;;;;;;;;;;;;;18843:12;18908:24;18958:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18943:5;:43;;-1:-1:-1;;;;;18943:43:0;;;-1:-1:-1;;;;;;18943:43:0;;;;;;;;18997:5;:14;;;;;;;;;;;;;19037:20;;-1:-1:-1;;;19037:20:0;;;;;2161:51:1;;;;18943:43:0;19037:12;;2134:18:1;;19037:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19022:5;:36;;-1:-1:-1;;;;;;19022:36:0;-1:-1:-1;;;;;19022:36:0;;;;;;19124:2;;:10;;;-1:-1:-1;;;19124:10:0;;;;-1:-1:-1;;19124:2:0;;;;;:8;;:10;;;;;;;;;;;;;;;:2;:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19145;:24;;-1:-1:-1;;;;;;19145:24:0;;;-1:-1:-1;;;;;19145:24:0;;;;;;;;19196:8;19180:13;:24;-1:-1:-1;19668:21:0;;;:8;:21;;;;;;;;:28;;-1:-1:-1;;19668:28:0;-1:-1:-1;19668:28:0;;;;;;19707:12;:30;;;;;;;;;;;;;;;;;;19801:5;;19748:10;:23;;;;;;;:59;;19801:5;;;;19748:59;;;;;;;19860:6;19818:39;;:48;19941:61;;-1:-1:-1;;;19941:61:0;;19145:24;;-1:-1:-1;19145:24:0;19941:27;;:61;;19977:4;;-1:-1:-1;;;19941:61:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;20015:7:0;:20;;20025:10;-1:-1:-1;;;;;;20015:20:0;;;;;;;20046:9;:34;;;;;-1:-1:-1;;;;;20046:34:0;;;;;;;;;;-1:-1:-1;;;18307:1781:0:o;13649:181::-;13707:7;13740:1;13735;:6;;13727:22;;;;-1:-1:-1;;;13727:22:0;;19860:2:1;13727:22:0;;;19842:21:1;19899:1;19879:18;;;19872:29;-1:-1:-1;;;19917:18:1;;;19910:33;19960:18;;13727:22:0;19658:326:1;13727:22:0;13784:9;13796:5;13800:1;13796;:5;:::i;:::-;13784:17;13649:181;-1:-1:-1;;;;13649:181:0:o;14081:467::-;14139:7;14383:6;14379:47;;-1:-1:-1;14413:1:0;14406:8;;14379:47;14438:9;14450:5;14454:1;14450;:5;:::i;:::-;14438:17;-1:-1:-1;14483:1:0;14474:5;14478:1;14438:17;14474:5;:::i;:::-;:10;14466:26;;;;-1:-1:-1;;;14466:26:0;;20191:2:1;14466:26:0;;;20173:21:1;20230:1;20210:18;;;20203:29;-1:-1:-1;;;20248:18:1;;;20241:33;20291:18;;14466:26:0;19989:326:1;15016:329:0;15074:7;15173:1;15169;:5;15161:20;;;;-1:-1:-1;;;15161:20:0;;20522:2:1;15161:20:0;;;20504:21:1;20561:1;20541:18;;;20534:29;-1:-1:-1;;;20579:18:1;;;20572:32;20621:18;;15161:20:0;20320:325:1;15161:20:0;15212:9;15224:5;15228:1;15224;:5;:::i;13196:178::-;13254:7;;13286:5;13290:1;13286;:5;:::i;:::-;13274:17;;13315:1;13310;:6;;13302:22;;;;-1:-1:-1;;;13302:22:0;;20852:2:1;13302:22:0;;;20834:21:1;20891:1;20871:18;;;20864:29;-1:-1:-1;;;20909:18:1;;;20902:33;20952:18;;13302:22:0;20650:326:1;9867:176:0;9950:85;9969:5;9999:23;;;10024:2;10028:5;9976:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;9976:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;9976:58:0;-1:-1:-1;;;;;;9976:58:0;;;;;;;;;;9950:18;:85::i;10051:204::-;10178:68;;-1:-1:-1;;;;;21239:15:1;;;10178:68:0;;;21221:34:1;21291:15;;21271:18;;;21264:43;21323:18;;;21316:34;;;10152:95:0;;10171:5;;-1:-1:-1;;;10201:27:0;21156:18:1;;10178:68:0;20981:375:1;10152:95:0;10051:204;;;;:::o;25957:370::-;9644:1;9628:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;9656:20:0;9679:12;;;26055:7;;41796:483:::1;41813:12;:19:::0;41809:23;::::1;41796:483;;;41854:13;41870:12;41883:1;41870:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;41870:15:0::1;::::0;-1:-1:-1;41941:21:0::1;41870:15:::0;41941:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;41900:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:38:::1;:62:::0;42012:31:::1;41911:5:::0;42012:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;41977:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;42062:21;::::1;::::0;42058:210:::1;;42130:24;42139:7;42148:5;42130:8;:24::i;:::-;-1:-1:-1::0;;;;;42104:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;42214:10:::1;:17:::0;;;;;;:38:::1;::::0;42173:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;42058:210:::1;-1:-1:-1::0;41834:3:0;::::1;::::0;::::1;:::i;:::-;;;;41796:483;;;;26080:6:::2;26075:222;26092:7;:14;26088:1;:18;26075:222;;;26128:21;26152:7;26160:1;26152:10;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;-1:-1:-1;;;;;26195:16:0;;::::2;26177:15;26195:16:::0;;;:7:::2;:16:::0;;;;;;:31;;::::2;::::0;;;;;;;;;;26152:10;;-1:-1:-1;26241:44:0::2;26203:7:::0;26152:10;26195:31;26241:11:::2;:44::i;:::-;26113:184;;26108:3;;;;;:::i;:::-;;;;26075:222;;;;26307:12;:10;:12::i;:::-;;;9702:1:::1;9738:12:::0;;9722;:28;9714:44;;;;-1:-1:-1;;;9714:44:0;;;;;;;:::i;26335:834::-;26420:8;;26416:746;;-1:-1:-1;;;;;26445:13:0;;;26468:1;26445:13;;;:7;:13;;;;;;;;:20;;;;;;;;;;:24;;;;26496:10;;;;;26487:19;26484:535;;;26536:10;;26568:8;;26565:347;;26601:12;26616:27;26639:3;26618:14;:4;26627;26618:8;:14::i;26616:27::-;26666:2;;26694:13;;26666:48;;-1:-1:-1;;;26666:48:0;;;;;21563:25:1;;;21604:18;;;21597:34;;;;-1:-1:-1;;;;;21667:32:1;;;21647:18;;;21640:60;26601:42:0;;-1:-1:-1;26666:2:0;;;:18;;21536::1;;26666:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;26737:51:0;26764:4;26770:17;:4;26779:7;26770:8;:17::i;:::-;-1:-1:-1;;;;;26737:26:0;;;:51;:26;:51::i;:::-;26578:230;26565:347;;;26854:38;-1:-1:-1;;;;;26854:26:0;;26881:4;26887;26854:26;:38::i;:::-;26508:419;26484:535;;;26965:38;-1:-1:-1;;;;;26965:26:0;;26992:4;26998;26965:26;:38::i;:::-;27058:4;-1:-1:-1;;;;;27038:31:0;27051:5;-1:-1:-1;;;;;27038:31:0;;27064:4;27038:31;;;;1199:25:1;;1187:2;1172:18;;1053:177;27038:31:0;;;;;;;;-1:-1:-1;;;;;27084:14:0;;;;;;:7;:14;;;;;:22;;27102:4;;27084:14;:22;;27102:4;;27084:22;:::i;:::-;;;;-1:-1:-1;;;;;;;27121:14:0;;;;;;;:8;:14;;;;;;;;:21;;;;;;;;;;;:29;;27146:4;;27121:14;:29;;27146:4;;27121:29;:::i;:::-;;;;-1:-1:-1;;26335:834:0;;;:::o;29986:3765::-;30026:13;30041;30068:10;30081:5;;;;;;;;;-1:-1:-1;;;;;30081:5:0;-1:-1:-1;;;;;30081:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30068:43;;30122:12;30145:1;30137:5;:9;:50;;30185:1;30137:50;;;30149:5;;;;;;;;;-1:-1:-1;;;;;30149:5:0;-1:-1:-1;;;;;30149:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30534:11;:18;30122:65;;-1:-1:-1;30523:8:0;30534:18;30589:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30589:17:0;;30564:42;;30618:23;30655:3;30644:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30644:15:0;;30618:41;;30675:7;30671:490;30689:3;30684:2;:8;30671:490;;;30737:11;30749:2;30737:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30737:15:0;30716:6;30723:2;30716:10;;;;;;;;:::i;:::-;;;;;;:38;-1:-1:-1;;;;;30716:38:0;;;-1:-1:-1;;;;;30716:38:0;;;;;31068:1;-1:-1:-1;;;;;31037:33:0;31045:6;31052:2;31045:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;31037:33:0;;:111;;31113:6;31120:2;31113:10;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;-1:-1:-1;;;31113:35:0;;31142:4;31113:35;;;2161:51:1;-1:-1:-1;;;;;31113:20:0;;;;;;2134:18:1;;31113:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31037:111;;;31091:1;31037:111;31003:9;31013:2;31003:13;;;;;;;;:::i;:::-;;;;;;;;;;:145;30694:4;;;;:::i;:::-;;;;30671:490;;;;31182:18;;;;;;;;;-1:-1:-1;;;;;31182:18:0;-1:-1:-1;;;;;31176:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31172:2432;;-1:-1:-1;33583:1:0;;;;-1:-1:-1;29986:3765:0;-1:-1:-1;;;;;29986:3765:0:o;31172:2432::-;31515:7;31511:1923;31533:3;31528:2;:8;31511:1923;;;31630:7;31693:1;-1:-1:-1;;;;;31662:33:0;31670:6;31677:2;31670:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;31662:33:0;;:119;;31746:6;31753:2;31746:10;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;-1:-1:-1;;;31746:35:0;;31775:4;31746:35;;;2161:51:1;-1:-1:-1;;;;;31746:20:0;;;;;;2134:18:1;;31746:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31662:119;;;31720:1;31662:119;31630:151;;32021:9;32031:2;32021:13;;;;;;;;:::i;:::-;;;;;;;32016:2;:18;32013:1339;;;32149:1;32143:3;32134:5;32117:9;32127:2;32117:13;;;;;;;;:::i;:::-;;;;;;;32112:2;:18;;;;:::i;:::-;32111:28;;;;:::i;:::-;32109:37;;;;:::i;:::-;:41;32105:370;;;32183:6;32190:2;32183:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32183:19:0;;32203:4;32246:3;32237:5;32212:21;32219:9;32229:2;32219:13;;;;;;;;:::i;:::-;;;;;;;32212:2;:6;;:21;;;;:::i;:::-;32211:31;;;;:::i;:::-;32209:40;;;;:::i;:::-;32183:68;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32324:6;32331:2;32324:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32287:89:0;32311:4;-1:-1:-1;;;;;32287:89:0;32300:10;-1:-1:-1;;;;;32287:89:0;;32372:3;32363:5;32338:21;32345:9;32355:2;32345:13;;;;;;;;:::i;:::-;;;;;;;32338:2;:6;;:21;;;;:::i;:::-;32337:31;;;;:::i;:::-;32336:39;;;;:::i;:::-;32287:89;;1199:25:1;;;1187:2;1172:18;32287:89:0;;;;;;;32412:6;32419:2;32412:10;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;-1:-1:-1;;;32412:35:0;;32441:4;32412:35;;;2161:51:1;-1:-1:-1;;;;;32412:20:0;;;;;;2134:18:1;;32412:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32407:40;;32105:370;32554:8;;-1:-1:-1;;;;;32554:8:0;32550:779;;32609:5;;32643:10;;-1:-1:-1;;;;;32609:5:0;;;;:24;;32643:6;;32650:2;;32643:10;;;;;;:::i;:::-;;;;;;;32657:21;32664:9;32674:2;32664:13;;;;;;;;:::i;:::-;;;;;;;32657:2;:6;;:21;;;;:::i;:::-;32609:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32763:6;32770:2;32763:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32717:81:0;32747:5;;;;;;;;;-1:-1:-1;;;;;32747:5:0;-1:-1:-1;;;;;32717:81:0;32727:10;-1:-1:-1;;;;;32717:81:0;;32782:9;32792:2;32782:13;;;;;;;;:::i;:::-;;;;;;;32777:2;:18;;;;:::i;:::-;32717:81;;1199:25:1;;;1187:2;1172:18;32717:81:0;;;;;;;32878:9;32888:2;32878:13;;;;;;;;:::i;:::-;;;;;;;32873:2;:18;;;;:::i;:::-;32829:16;:39;32855:6;32862:2;32855:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32829:39:0;-1:-1:-1;;;;;32829:39:0;;;;;;;;;;;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;32550:779:0;;-1:-1:-1;32550:779:0;;33041:6;33048:2;33041:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;33041:19:0;;33061:8;;;;;;;;;-1:-1:-1;;;;;33061:8:0;33072:21;33079:9;33089:2;33079:13;;;;;;;;:::i;33072:21::-;33041:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33172:6;33179:2;33172:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;33132:75:0;33154:8;;;;;;;;;-1:-1:-1;;;;;33154:8:0;-1:-1:-1;;;;;33132:75:0;33142:10;-1:-1:-1;;;;;33132:75:0;;33191:9;33201:2;33191:13;;;;;;;;:::i;:::-;;;;;;;33186:2;:18;;;;:::i;:::-;33132:75;;1199:25:1;;;1187:2;1172:18;33132:75:0;;;;;;;33287:9;33297:2;33287:13;;;;;;;;:::i;:::-;;;;;;;33282:2;:18;;;;:::i;:::-;33238:16;:39;33264:6;33271:2;33264:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;33238:39:0;-1:-1:-1;;;;;33238:39:0;;;;;;;;;;;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;32550:779:0;-1:-1:-1;31538:4:0;;;;:::i;:::-;;;;31511:1923;;;-1:-1:-1;33460:1:0;;;;-1:-1:-1;29986:3765:0;-1:-1:-1;;;;;;29986:3765:0:o;8317:106::-;8375:7;8406:1;8402;:5;:13;;8414:1;8402:13;;;-1:-1:-1;8410:1:0;;8317:106;-1:-1:-1;8317:106:0:o;11846:1088::-;-1:-1:-1;;;;;12450:25:0;;7985:20;12442:43;;;;-1:-1:-1;;;12442:43:0;;21913:2:1;12442:43:0;;;21895:21:1;21952:1;21932:18;;;21925:29;-1:-1:-1;;;21970:18:1;;;21963:33;22013:18;;12442:43:0;21711:326:1;12442:43:0;12585:12;12599:23;12634:5;-1:-1:-1;;;;;12626:19:0;12646:4;12626:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12584:67;;;;12670:7;12662:23;;;;-1:-1:-1;;;12662:23:0;;22523:2:1;12662:23:0;;;22505:21:1;22562:1;22542:18;;;22535:29;-1:-1:-1;;;22580:18:1;;;22573:33;22623:18;;12662:23:0;22321:326:1;12662:23:0;12724:17;;:21;12720:207;;12866:10;12855:30;;;;;;;;;;;;:::i;:::-;12847:46;;;;-1:-1:-1;;;12847:46:0;;22854:2:1;12847:46:0;;;22836:21:1;22893:1;22873:18;;;22866:29;-1:-1:-1;;;22911:18:1;;;22904:33;22954:18;;12847:46:0;22652:326:1;14:131;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:258::-;474:1;484:113;498:6;495:1;492:13;484:113;;;574:11;;;568:18;555:11;;;548:39;520:2;513:10;484:113;;;615:6;612:1;609:13;606:48;;;-1:-1:-1;;650:1:1;632:16;;625:27;402:258::o;665:383::-;814:2;803:9;796:21;777:4;846:6;840:13;889:6;884:2;873:9;869:18;862:34;905:66;964:6;959:2;948:9;944:18;939:2;931:6;927:15;905:66;:::i;:::-;1032:2;1011:15;-1:-1:-1;;1007:29:1;992:45;;;;1039:2;988:54;;665:383;-1:-1:-1;;665:383:1:o;1235:388::-;1303:6;1311;1364:2;1352:9;1343:7;1339:23;1335:32;1332:52;;;1380:1;1377;1370:12;1332:52;1419:9;1406:23;1438:31;1463:5;1438:31;:::i;:::-;1488:5;-1:-1:-1;1545:2:1;1530:18;;1517:32;1558:33;1517:32;1558:33;:::i;:::-;1610:7;1600:17;;;1235:388;;;;;:::o;1628:118::-;1714:5;1707:13;1700:21;1693:5;1690:32;1680:60;;1736:1;1733;1726:12;1751:241;1807:6;1860:2;1848:9;1839:7;1835:23;1831:32;1828:52;;;1876:1;1873;1866:12;1828:52;1915:9;1902:23;1934:28;1956:5;1934:28;:::i;2451:315::-;2519:6;2527;2580:2;2568:9;2559:7;2555:23;2551:32;2548:52;;;2596:1;2593;2586:12;2548:52;2635:9;2622:23;2654:31;2679:5;2654:31;:::i;:::-;2704:5;2756:2;2741:18;;;;2728:32;;-1:-1:-1;;;2451:315:1:o;2771:180::-;2830:6;2883:2;2871:9;2862:7;2858:23;2854:32;2851:52;;;2899:1;2896;2889:12;2851:52;-1:-1:-1;2922:23:1;;2771:180;-1:-1:-1;2771:180:1:o;2956:127::-;3017:10;3012:3;3008:20;3005:1;2998:31;3048:4;3045:1;3038:15;3072:4;3069:1;3062:15;3088:275;3159:2;3153:9;3224:2;3205:13;;-1:-1:-1;;3201:27:1;3189:40;;3259:18;3244:34;;3280:22;;;3241:62;3238:88;;;3306:18;;:::i;:::-;3342:2;3335:22;3088:275;;-1:-1:-1;3088:275:1:o;3368:787::-;3422:5;3475:3;3468:4;3460:6;3456:17;3452:27;3442:55;;3493:1;3490;3483:12;3442:55;3529:6;3516:20;3555:4;3578:18;3574:2;3571:26;3568:52;;;3600:18;;:::i;:::-;3646:2;3643:1;3639:10;3669:28;3693:2;3689;3685:11;3669:28;:::i;:::-;3731:15;;;3801;;;3797:24;;;3762:12;;;;3833:15;;;3830:35;;;3861:1;3858;3851:12;3830:35;3897:2;3889:6;3885:15;3874:26;;3909:217;3925:6;3920:3;3917:15;3909:217;;;4005:3;3992:17;4022:31;4047:5;4022:31;:::i;:::-;4066:18;;3942:12;;;;4104;;;;3909:217;;4160:483;4253:6;4261;4314:2;4302:9;4293:7;4289:23;4285:32;4282:52;;;4330:1;4327;4320:12;4282:52;4369:9;4356:23;4388:31;4413:5;4388:31;:::i;:::-;4438:5;-1:-1:-1;4494:2:1;4479:18;;4466:32;4521:18;4510:30;;4507:50;;;4553:1;4550;4543:12;4507:50;4576:61;4629:7;4620:6;4609:9;4605:22;4576:61;:::i;:::-;4566:71;;;4160:483;;;;;:::o;5092:248::-;5160:6;5168;5221:2;5209:9;5200:7;5196:23;5192:32;5189:52;;;5237:1;5234;5227:12;5189:52;-1:-1:-1;;5260:23:1;;;5330:2;5315:18;;;5302:32;;-1:-1:-1;5092:248:1:o;6532:348::-;6616:6;6669:2;6657:9;6648:7;6644:23;6640:32;6637:52;;;6685:1;6682;6675:12;6637:52;6725:9;6712:23;6758:18;6750:6;6747:30;6744:50;;;6790:1;6787;6780:12;6744:50;6813:61;6866:7;6857:6;6846:9;6842:22;6813:61;:::i;6885:456::-;6962:6;6970;6978;7031:2;7019:9;7010:7;7006:23;7002:32;6999:52;;;7047:1;7044;7037:12;6999:52;7083:9;7070:23;7060:33;;7143:2;7132:9;7128:18;7115:32;7156:31;7181:5;7156:31;:::i;:::-;7206:5;-1:-1:-1;7263:2:1;7248:18;;7235:32;7276:33;7235:32;7276:33;:::i;:::-;7328:7;7318:17;;;6885:456;;;;;:::o;7346:632::-;7517:2;7569:21;;;7639:13;;7542:18;;;7661:22;;;7488:4;;7517:2;7740:15;;;;7714:2;7699:18;;;7488:4;7783:169;7797:6;7794:1;7791:13;7783:169;;;7858:13;;7846:26;;7927:15;;;;7892:12;;;;7819:1;7812:9;7783:169;;;-1:-1:-1;7969:3:1;;7346:632;-1:-1:-1;;;;;;7346:632:1:o;7983:456::-;8060:6;8068;8076;8129:2;8117:9;8108:7;8104:23;8100:32;8097:52;;;8145:1;8142;8135:12;8097:52;8184:9;8171:23;8203:31;8228:5;8203:31;:::i;:::-;8253:5;-1:-1:-1;8310:2:1;8295:18;;8282:32;8323:33;8282:32;8323:33;:::i;:::-;7983:456;;8375:7;;-1:-1:-1;;;8429:2:1;8414:18;;;;8401:32;;7983:456::o;8697:671::-;8783:6;8791;8799;8807;8860:3;8848:9;8839:7;8835:23;8831:33;8828:53;;;8877:1;8874;8867:12;8828:53;8916:9;8903:23;8935:31;8960:5;8935:31;:::i;:::-;8985:5;-1:-1:-1;9042:2:1;9027:18;;9014:32;9055:33;9014:32;9055:33;:::i;:::-;9107:7;-1:-1:-1;9166:2:1;9151:18;;9138:32;9179:33;9138:32;9179:33;:::i;:::-;9231:7;-1:-1:-1;9290:2:1;9275:18;;9262:32;9303:33;9262:32;9303:33;:::i;:::-;8697:671;;;;-1:-1:-1;8697:671:1;;-1:-1:-1;;8697:671:1:o;9373:251::-;9443:6;9496:2;9484:9;9475:7;9471:23;9467:32;9464:52;;;9512:1;9509;9502:12;9464:52;9544:9;9538:16;9563:31;9588:5;9563:31;:::i;9629:328::-;9831:2;9813:21;;;9870:1;9850:18;;;9843:29;-1:-1:-1;;;9903:2:1;9888:18;;9881:35;9948:2;9933:18;;9629:328::o;10293:::-;10495:2;10477:21;;;10534:1;10514:18;;;10507:29;-1:-1:-1;;;10567:2:1;10552:18;;10545:35;10612:2;10597:18;;10293:328::o;10626:274::-;-1:-1:-1;;;;;10818:32:1;;;;10800:51;;10882:2;10867:18;;10860:34;10788:2;10773:18;;10626:274::o;10905:245::-;10972:6;11025:2;11013:9;11004:7;11000:23;10996:32;10993:52;;;11041:1;11038;11031:12;10993:52;11073:9;11067:16;11092:28;11114:5;11092:28;:::i;11155:706::-;11235:6;11288:2;11276:9;11267:7;11263:23;11259:32;11256:52;;;11304:1;11301;11294:12;11256:52;11337:9;11331:16;11366:18;11407:2;11399:6;11396:14;11393:34;;;11423:1;11420;11413:12;11393:34;11461:6;11450:9;11446:22;11436:32;;11506:7;11499:4;11495:2;11491:13;11487:27;11477:55;;11528:1;11525;11518:12;11477:55;11557:2;11551:9;11579:2;11575;11572:10;11569:36;;;11585:18;;:::i;:::-;11627:53;11670:2;11651:13;;-1:-1:-1;;11647:27:1;11676:2;11643:36;11627:53;:::i;:::-;11614:66;;11703:2;11696:5;11689:17;11743:7;11738:2;11733;11729;11725:11;11721:20;11718:33;11715:53;;;11764:1;11761;11754:12;11715:53;11777:54;11828:2;11823;11816:5;11812:14;11807:2;11803;11799:11;11777:54;:::i;:::-;-1:-1:-1;11850:5:1;11155:706;-1:-1:-1;;;;11155:706:1:o;11866:442::-;12128:25;12123:3;12116:38;12098:3;12183:6;12177:13;12199:62;12254:6;12249:2;12244:3;12240:12;12233:4;12225:6;12221:17;12199:62;:::i;:::-;12281:16;;;;12299:2;12277:25;;11866:442;-1:-1:-1;;11866:442:1:o;12974:127::-;13035:10;13030:3;13026:20;13023:1;13016:31;13066:4;13063:1;13056:15;13090:4;13087:1;13080:15;13106:128;13146:3;13177:1;13173:6;13170:1;13167:13;13164:39;;;13183:18;;:::i;:::-;-1:-1:-1;13219:9:1;;13106:128::o;13239:127::-;13300:10;13295:3;13291:20;13288:1;13281:31;13331:4;13328:1;13321:15;13355:4;13352:1;13345:15;13371:135;13410:3;-1:-1:-1;;13431:17:1;;13428:43;;;13451:18;;:::i;:::-;-1:-1:-1;13498:1:1;13487:13;;13371:135::o;13511:325::-;13713:2;13695:21;;;13752:1;13732:18;;;13725:29;-1:-1:-1;;;13785:2:1;13770:18;;13763:32;13827:2;13812:18;;13511:325::o;13841:326::-;14043:2;14025:21;;;14082:1;14062:18;;;14055:29;-1:-1:-1;;;14115:2:1;14100:18;;14093:33;14158:2;14143:18;;13841:326::o;14505:184::-;14575:6;14628:2;14616:9;14607:7;14603:23;14599:32;14596:52;;;14644:1;14641;14634:12;14596:52;-1:-1:-1;14667:16:1;;14505:184;-1:-1:-1;14505:184:1:o;15027:273::-;15095:6;15148:2;15136:9;15127:7;15123:23;15119:32;15116:52;;;15164:1;15161;15154:12;15116:52;15196:9;15190:16;15246:4;15239:5;15235:16;15228:5;15225:27;15215:55;;15266:1;15263;15256:12;16254:125;16294:4;16322:1;16319;16316:8;16313:34;;;16327:18;;:::i;:::-;-1:-1:-1;16364:9:1;;16254:125::o;16384:127::-;16445:10;16440:3;16436:20;16433:1;16426:31;16476:4;16473:1;16466:15;16500:4;16497:1;16490:15;16516:168;16556:7;16622:1;16618;16614:6;16610:14;16607:1;16604:21;16599:1;16592:9;16585:17;16581:45;16578:71;;;16629:18;;:::i;:::-;-1:-1:-1;16669:9:1;;16516:168::o;16689:217::-;16729:1;16755;16745:132;;16799:10;16794:3;16790:20;16787:1;16780:31;16834:4;16831:1;16824:15;16862:4;16859:1;16852:15;16745:132;-1:-1:-1;16891:9:1;;16689:217::o;16911:422::-;-1:-1:-1;;;17168:3:1;17161:20;17143:3;17210:6;17204:13;17226:61;17280:6;17276:1;17271:3;17267:11;17260:4;17252:6;17248:17;17226:61;:::i;:::-;17307:16;;;;17325:1;17303:24;;16911:422;-1:-1:-1;;16911:422:1:o;22042:274::-;22171:3;22209:6;22203:13;22225:53;22271:6;22266:3;22259:4;22251:6;22247:17;22225:53;:::i;:::-;22294:16;;;;;22042:274;-1:-1:-1;;22042:274:1:o
Swarm Source
ipfs://c91c96eee68ef93c8cdffa42a90b933f6ca00f28a053914192e606163adf6517
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.