Source Code
Overview
DEV Balance
0 DEV
More Info
ContractCreator
Multichain Info
N/A
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
4834710 | 543 days ago | 0 DEV | ||||
4834710 | 543 days ago | 0 DEV | ||||
4834705 | 543 days ago | 0 DEV | ||||
4834689 | 543 days ago | 0 DEV | ||||
4834321 | 543 days ago | 0 DEV | ||||
4834321 | 543 days ago | 0 DEV | ||||
4834317 | 543 days ago | 0 DEV | ||||
4833233 | 543 days ago | 0 DEV | ||||
4833233 | 543 days ago | 0 DEV | ||||
4833160 | 543 days ago | 0 DEV | ||||
4833078 | 543 days ago | 0 DEV | ||||
4833078 | 543 days ago | 0 DEV | ||||
4833065 | 543 days ago | 0 DEV | ||||
4591591 | 583 days ago | 0 DEV | ||||
4591588 | 583 days ago | 0 DEV | ||||
4591585 | 583 days ago | 0 DEV | ||||
4591585 | 583 days ago | 0 DEV | ||||
4591585 | 583 days ago | 0 DEV | ||||
4591585 | 583 days ago | 0 DEV | ||||
4591345 | 583 days ago | 0 DEV | ||||
4591342 | 583 days ago | 0 DEV | ||||
4591339 | 583 days ago | 0 DEV | ||||
4591339 | 583 days ago | 0 DEV | ||||
4591339 | 583 days ago | 0 DEV | ||||
4591339 | 583 days ago | 0 DEV |
Loading...
Loading
Contract Name:
Lido
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at moonbase.moonscan.io on 2023-05-29 */ pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } interface IAuthManager { function has(bytes32 role, address member) external view returns (bool); function add(bytes32 role, address member) external; function remove(bytes32 role, address member) external; } interface IController { function newSubAccount(uint16 index, bytes32 accountId, address paraAddress) external; function deleteSubAccount(address paraAddress) external; function nominate(bytes32[] calldata _validators) external; function bond(bytes32 controller, uint256 amount) external; function bondExtra(uint256 amount) external; function unbond(uint256 amount) external; function withdrawUnbonded(uint32 slashingSpans) external; function rebond(uint256 amount, uint256 unbondingChunks) external; function chill() external; function transferToParachain(uint256 amount) external; function transferToRelaychain(uint256 amount) external; } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } interface ILedger { function initialize( bytes32 _stashAccount, bytes32 controllerAccount, address vKSM, address controller, uint128 minNominatorBalance, address lido, uint128 _minimumBalance, uint256 _maxUnlockingChunks ) external; function pushData(uint64 eraId, Types.OracleData calldata staking) external; function nominate(bytes32[] calldata validators) external; function chill() external; function status() external view returns (Types.LedgerStatus); function isEmpty() external view returns (bool); function stashAccount() external view returns (bytes32); function totalBalance() external view returns (uint128); function setRelaySpecs(uint128 minNominatorBalance, uint128 minimumBalance, uint256 _maxUnlockingChunks) external; function cachedTotalBalance() external view returns (uint128); function transferDownwardBalance() external view returns (uint128); } interface ILedgerFactory { function createLedger( bytes32 _stashAccount, bytes32 _controllerAccount, address _vKSM, address _controller, uint128 _minNominatorBalance, uint128 _minimumBalance, uint256 _maxUnlockingChunks ) external returns (address); } interface IOracleMaster { function addLedger(address ledger) external; function removeLedger(address ledger) external; function getOracle(address ledger) view external returns (address); function eraId() view external returns (uint64); function setLido(address lido) external; } interface IWithdrawal { // total virtual xcKSM amount on contract function totalVirtualXcKSMAmount() external returns (uint256); // stKSM(xcKSM) virtual amount for batch function batchVirtualXcKSMAmount() external returns (uint256); // Set stKSM contract address, allowed to only once function setStKSM(address _stKSM) external; // Returns total virtual xcKSM balance of contract for which losses can be applied function totalBalanceForLosses() external view returns (uint256); // Returns total xcKSM balance of contract which waiting for claim function pendingForClaiming() external view returns (uint256); // Burn pool shares from first element of queue and move index for allow claiming. After that add new batch function newEra() external; // Mint equal amount of pool shares for user. Adjust current amount of virtual xcKSM on Withdrawal contract. // Burn shares on LIDO side function redeem(address _from, uint256 _amount) external; // Returns available for claiming xcKSM amount for user function claim(address _holder) external returns (uint256); // Apply losses to current stKSM shares on this contract function ditributeLosses(uint256 _losses) external; // Check available for claim xcKSM balance for user function getRedeemStatus(address _holder) external view returns(uint256 _waiting, uint256 _available); function claimForcefullyUnbonded(address _holder, uint256 _amount) external; } /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } abstract contract stKSM is IERC20, Pausable { /** * @dev stKSM balances are dynamic and are calculated based on the accounts' shares * and the total amount of KSM controlled by the protocol. Account shares aren't * normalized, so the contract also stores the sum of all shares to calculate * each account's token balance which equals to: * * shares[account] * _getTotalPooledKSM() / _getTotalShares() */ mapping (address => uint256) private shares; /** * @dev Allowances are nominated in tokens, not token shares. */ mapping (address => mapping (address => uint256)) private allowances; /** * @dev Storage position used for holding the total amount of shares in existence. */ uint256 internal totalShares; /** * @return the amount of tokens in existence. * * @dev Always equals to `_getTotalPooledKSM()` since token amount * is pegged to the total amount of KSM controlled by the protocol. */ function totalSupply() public view override returns (uint256) { return _getTotalPooledKSM(); } /** * @return the entire amount of KSMs controlled by the protocol. * * @dev The sum of all KSM balances in the protocol. */ function getTotalPooledKSM() public view returns (uint256) { return _getTotalPooledKSM(); } /** * @return the amount of tokens owned by the `_account`. * * @dev Balances are dynamic and equal the `_account`'s share in the amount of the * total KSM controlled by the protocol. See `sharesOf`. */ function balanceOf(address _account) public view override returns (uint256) { return getPooledKSMByShares(_sharesOf(_account)); } /** * @notice Moves `_amount` tokens from the caller's account to the `_recipient` account. * * @return a boolean value indicating whether the operation succeeded. * Emits a `Transfer` event. * * Requirements: * * - `_recipient` cannot be the zero address. * - the caller must have a balance of at least `_amount`. * - the contract must not be paused. * * @dev The `_amount` argument is the amount of tokens, not shares. */ function transfer(address _recipient, uint256 _amount) public override returns (bool) { _transfer(msg.sender, _recipient, _amount); return true; } /** * @return the remaining number of tokens that `_spender` is allowed to spend * on behalf of `_owner` through `transferFrom`. This is zero by default. * * @dev This value changes when `approve` or `transferFrom` is called. */ function allowance(address _owner, address _spender) public view override returns (uint256) { return allowances[_owner][_spender]; } /** * @notice Sets `_amount` as the allowance of `_spender` over the caller's tokens. * * @return a boolean value indicating whether the operation succeeded. * Emits an `Approval` event. * * Requirements: * * - `_spender` cannot be the zero address. * - the contract must not be paused. * * @dev The `_amount` argument is the amount of tokens, not shares. */ function approve(address _spender, uint256 _amount) public override returns (bool) { _approve(msg.sender, _spender, _amount); return true; } /** * @notice Moves `_amount` tokens from `_sender` to `_recipient` using the * allowance mechanism. `_amount` is then deducted from the caller's * allowance. * * @return a boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. * Emits an `Approval` event indicating the updated allowance. * * Requirements: * * - `_sender` and `_recipient` cannot be the zero addresses. * - `_sender` must have a balance of at least `_amount`. * - the caller must have allowance for `_sender`'s tokens of at least `_amount`. * - the contract must not be paused. * * @dev The `_amount` argument is the amount of tokens, not shares. */ function transferFrom(address _sender, address _recipient, uint256 _amount) public override returns (bool) { uint256 currentAllowance = allowances[_sender][msg.sender]; require(currentAllowance >= _amount, "TRANSFER_AMOUNT_EXCEEDS_ALLOWANCE"); _transfer(_sender, _recipient, _amount); _approve(_sender, msg.sender, currentAllowance -_amount); return true; } /** * @notice Atomically increases the allowance granted to `_spender` by the caller by `_addedValue`. * * This is an alternative to `approve` that can be used as a mitigation for * problems described in: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol#L42 * Emits an `Approval` event indicating the updated allowance. * * Requirements: * * - `_spender` cannot be the the zero address. * - the contract must not be paused. */ function increaseAllowance(address _spender, uint256 _addedValue) public returns (bool) { _approve(msg.sender, _spender, allowances[msg.sender][_spender] + _addedValue); return true; } /** * @notice Atomically decreases the allowance granted to `_spender` by the caller by `_subtractedValue`. * * This is an alternative to `approve` that can be used as a mitigation for * problems described in: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol#L42 * Emits an `Approval` event indicating the updated allowance. * * Requirements: * * - `_spender` cannot be the zero address. * - `_spender` must have allowance for the caller of at least `_subtractedValue`. * - the contract must not be paused. */ function decreaseAllowance(address _spender, uint256 _subtractedValue) public returns (bool) { uint256 currentAllowance = allowances[msg.sender][_spender]; require(currentAllowance >= _subtractedValue, "DECREASED_ALLOWANCE_BELOW_ZERO"); _approve(msg.sender, _spender, currentAllowance-_subtractedValue); return true; } /** * @return the total amount of shares in existence. * * @dev The sum of all accounts' shares can be an arbitrary number, therefore * it is necessary to store it in order to calculate each account's relative share. */ function getTotalShares() public view returns (uint256) { return _getTotalShares(); } /** * @return the amount of shares owned by `_account`. */ function sharesOf(address _account) public view returns (uint256) { return _sharesOf(_account); } /** * @return the amount of shares that corresponds to `_ethAmount` protocol-controlled KSM. */ function getSharesByPooledKSM(uint256 _amount) public view returns (uint256) { uint256 totalPooledKSM = _getTotalPooledKSM(); if (totalPooledKSM == 0) { return 0; } else { return _amount * _getTotalShares() / totalPooledKSM; } } /** * @return the amount of KSM that corresponds to `_sharesAmount` token shares. */ function getPooledKSMByShares(uint256 _sharesAmount) public view returns (uint256) { uint256 _totalShares = _getTotalShares(); if (totalShares == 0) { return 0; } else { return _sharesAmount * _getTotalPooledKSM() / _totalShares; } } /** * @return the total amount (in wei) of KSM controlled by the protocol. * @dev This is used for calaulating tokens from shares and vice versa. * @dev This function is required to be implemented in a derived contract. */ function _getTotalPooledKSM() internal view virtual returns (uint256); /** * @notice Moves `_amount` tokens from `_sender` to `_recipient`. * Emits a `Transfer` event. */ function _transfer(address _sender, address _recipient, uint256 _amount) internal { uint256 _sharesToTransfer = getSharesByPooledKSM(_amount); _transferShares(_sender, _recipient, _sharesToTransfer); emit Transfer(_sender, _recipient, _amount); } /** * @notice Sets `_amount` as the allowance of `_spender` over the `_owner` s tokens. * * Emits an `Approval` event. * * Requirements: * * - `_owner` cannot be the zero address. * - `_spender` cannot be the zero address. * - the contract must not be paused. */ function _approve(address _owner, address _spender, uint256 _amount) internal whenNotPaused { require(_owner != address(0), "APPROVE_FROM_ZERO_ADDRESS"); require(_spender != address(0), "APPROVE_TO_ZERO_ADDRESS"); allowances[_owner][_spender] = _amount; emit Approval(_owner, _spender, _amount); } /** * @return the total amount of shares in existence. */ function _getTotalShares() internal view returns (uint256) { return totalShares; } /** * @return the amount of shares owned by `_account`. */ function _sharesOf(address _account) internal view returns (uint256) { return shares[_account]; } /** * @notice Moves `_sharesAmount` shares from `_sender` to `_recipient`. * * Requirements: * * - `_sender` cannot be the zero address. * - `_recipient` cannot be the zero address. * - `_sender` must hold at least `_sharesAmount` shares. * - the contract must not be paused. */ function _transferShares(address _sender, address _recipient, uint256 _sharesAmount) internal whenNotPaused { require(_sender != address(0), "TRANSFER_FROM_THE_ZERO_ADDRESS"); require(_recipient != address(0), "TRANSFER_TO_THE_ZERO_ADDRESS"); uint256 currentSenderShares = shares[_sender]; require(_sharesAmount <= currentSenderShares, "TRANSFER_AMOUNT_EXCEEDS_BALANCE"); shares[_sender] = currentSenderShares - _sharesAmount; shares[_recipient] = shares[_recipient] + _sharesAmount; } /** * @notice Creates `_sharesAmount` shares and assigns them to `_recipient`, increasing the total amount of shares. * @dev This doesn't increase the token total supply. * * Requirements: * * - `_recipient` cannot be the zero address. * - the contract must not be paused. */ function _mintShares(address _recipient, uint256 _sharesAmount) internal whenNotPaused returns (uint256 newTotalShares) { require(_recipient != address(0), "MINT_TO_THE_ZERO_ADDRESS"); newTotalShares = _getTotalShares() + _sharesAmount; totalShares = newTotalShares; shares[_recipient] = shares[_recipient] + _sharesAmount; // Notice: we're not emitting a Transfer event from the zero address here since shares mint // works by taking the amount of tokens corresponding to the minted shares from all other // token holders, proportionally to their share. The total supply of the token doesn't change // as the result. This is equivalent to performing a send from each other token holder's // address to `address`, but we cannot reflect this as it would require sending an unbounded // number of events. } /** * @notice Destroys `_sharesAmount` shares from `_account`'s holdings, decreasing the total amount of shares. * @dev This doesn't decrease the token total supply. * * Requirements: * * - `_account` cannot be the zero address. * - `_account` must hold at least `_sharesAmount` shares. * - the contract must not be paused. */ function _burnShares(address _account, uint256 _sharesAmount) internal whenNotPaused returns (uint256 newTotalShares) { require(_account != address(0), "BURN_FROM_THE_ZERO_ADDRESS"); uint256 accountShares = shares[_account]; require(_sharesAmount <= accountShares, "BURN_AMOUNT_EXCEEDS_BALANCE"); newTotalShares = _getTotalShares() - _sharesAmount; totalShares = newTotalShares; shares[_account] = accountShares - _sharesAmount; // Notice: we're not emitting a Transfer event to the zero address here since shares burn // works by redistributing the amount of tokens corresponding to the burned shares between // all other token holders. The total supply of the token doesn't change as the result. // This is equivalent to performing a send from `address` to each other token holder address, // but we cannot reflect this as it would require sending an unbounded number of events. } } contract Lido is stKSM, Initializable { using SafeCast for uint256; // Records a deposit made by a user event Deposited(address indexed sender, uint256 amount); // Created redeem order event Redeemed(address indexed receiver, uint256 amount); // Claimed vKSM tokens back event Claimed(address indexed receiver, uint256 amount); // Fee was updated event FeeSet(uint16 fee, uint16 feeOperatorsBP, uint16 feeTreasuryBP, uint16 feeDevelopersBP); // Rewards distributed event Rewards(address ledger, uint256 rewards, uint256 balance); // Losses distributed event Losses(address ledger, uint256 losses, uint256 balance); // Added new ledger event LedgerAdd( address addr, bytes32 stashAccount, bytes32 controllerAccount ); // Ledger removed event LedgerRemove( address addr ); // Ledger disabled event LedgerDisable( address addr ); // Ledger paused event LedgerPaused( address addr ); // Ledger resumed event LedgerResumed( address addr ); // Referral program event Referral( address userAddr, address referralAddr, uint256 amount, uint256 shares ); // sum of all deposits and rewards uint256 public fundRaisedBalance; // haven't executed buffrered deposits: // // this is the amount of funds that must either sent to the ledgers // or rebalanced to buffered redeems uint256 public bufferedDeposits; // haven't executed buffrered redeems: // this is the amount of funds that should be sent to the WITHDRAWAL contract uint256 public bufferedRedeems; // this is the active stake on the ledger = [ledgerBorrow] - unbonded funds - free funds mapping(address => uint256) public ledgerStake; // this is the total amount of funds in the ledger = active stake + unbonded funds + free funds mapping(address => uint256) public ledgerBorrow; // Disabled ledgers address[] private disabledLedgers; // Enabled ledgers address[] private enabledLedgers; // Cap for deposits for v1 uint256 public depositCap; // vKSM precompile IERC20 private VKSM; // controller address private CONTROLLER; // auth manager contract address address public AUTH_MANAGER; // Maximum number of ledgers uint256 private MAX_LEDGERS_AMOUNT; // oracle master contract address public ORACLE_MASTER; // relay spec Types.RelaySpec private RELAY_SPEC; // developers fund address private developers; // treasury fund address private treasury; // ledger beacon address public LEDGER_BEACON; // ledger factory address private LEDGER_FACTORY; // withdrawal contract address private WITHDRAWAL; // Max allowable difference for oracle reports uint128 public MAX_ALLOWABLE_DIFFERENCE; // Ledger address by stash account id mapping(bytes32 => address) private ledgerByStash; // Map to check ledger existence by address mapping(address => bool) private ledgerByAddress; // Map to check ledger paused to redeem state mapping(address => bool) private pausedledgers; /* fee interest in basis points. It's packed uint256 consist of three uint16 (total_fee, treasury_fee, developers_fee). where total_fee = treasury_fee + developers_fee + 3000 (3% operators fee) */ Types.Fee private FEE; // default interest value in base points. uint16 internal constant DEFAULT_DEVELOPERS_FEE = 200; uint16 internal constant DEFAULT_OPERATORS_FEE = 0; uint16 internal constant DEFAULT_TREASURY_FEE = 800; // Missing member index uint256 internal constant MEMBER_NOT_FOUND = type(uint256).max; // Spec manager role bytes32 internal constant ROLE_SPEC_MANAGER = keccak256("ROLE_SPEC_MANAGER"); // Beacon manager role bytes32 internal constant ROLE_BEACON_MANAGER = keccak256("ROLE_BEACON_MANAGER"); // Pause manager role bytes32 internal constant ROLE_PAUSE_MANAGER = keccak256("ROLE_PAUSE_MANAGER"); // Fee manager role bytes32 internal constant ROLE_FEE_MANAGER = keccak256("ROLE_FEE_MANAGER"); // Ledger manager role bytes32 internal constant ROLE_LEDGER_MANAGER = keccak256("ROLE_LEDGER_MANAGER"); // Stake manager role bytes32 internal constant ROLE_STAKE_MANAGER = keccak256("ROLE_STAKE_MANAGER"); // Treasury manager role bytes32 internal constant ROLE_TREASURY = keccak256("ROLE_SET_TREASURY"); // Developers address change role bytes32 internal constant ROLE_DEVELOPERS = keccak256("ROLE_SET_DEVELOPERS"); // Token name string internal _name; // Token symbol string internal _symbol; // Token decimals uint8 internal _decimals; // Flag indicating redeem availability bool private isRedeemDisabled; // Flag indicating if unbond is forced bool private isUnbondForced; // Allow function calls only from member with specific role modifier auth(bytes32 role) { require(IAuthManager(AUTH_MANAGER).has(role, msg.sender), "LIDO: UNAUTHORIZED"); _; } // Allow call to redeem only when it's enabled modifier redeemEnabled() { require(!isRedeemDisabled, "LIDO: REDEEM_DISABLED"); _; } modifier redeemDisabled() { require(isRedeemDisabled, "LIDO: REDEEM_ENABLED"); _; } /** * @return the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @return the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @return the number of decimals for getting user representation of a token amount. */ function decimals() public view returns (uint8) { return _decimals; } /** * @notice setting token parameters */ // NOTE: function was removed from Lido, because it can be called only once to set parameters and after that // it is unnecessary in the code. It was removed to decrease contract bytecode size // function setTokenInfo(string memory __name, string memory __symbol, uint8 __decimals) external { // require(bytes(__name).length > 0, "LIDO: EMPTY_NAME"); // require(bytes(__symbol).length > 0, "LIDO: EMPTY_SYMBOL"); // require(__decimals > 0, "LIDO: ZERO_DECIMALS"); // require(bytes(_name).length == 0, "LIDO: NAME_SETTED"); // _name = __name; // _symbol = __symbol; // _decimals = __decimals; // } /** * @notice Initialize lido contract. * @param _authManager - auth manager contract address * @param _vKSM - vKSM contract address * @param _controller - relay controller address * @param _developers - devs address * @param _treasury - treasury address * @param _oracleMaster - oracle master address * @param _withdrawal - withdrawal address * @param _depositCap - cap for deposits * @param _maxAllowableDifference - max allowable difference for oracle reports */ function initialize( address _authManager, address _vKSM, address _controller, address _developers, address _treasury, address _oracleMaster, address _withdrawal, uint256 _depositCap, uint128 _maxAllowableDifference ) external initializer { require(_depositCap > 0, "LIDO: ZERO_CAP"); require(_vKSM != address(0), "LIDO: INCORRECT_VKSM_ADDRESS"); require(_oracleMaster != address(0), "LIDO: INCORRECT_ORACLE_MASTER_ADDRESS"); require(_withdrawal != address(0), "LIDO: INCORRECT_WITHDRAWAL_ADDRESS"); require(_authManager != address(0), "LIDO: INCORRECT_AUTHMANAGER_ADDRESS"); require(_controller != address(0), "LIDO: INCORRECT_CONTROLLER_ADDRESS"); VKSM = IERC20(_vKSM); CONTROLLER = _controller; AUTH_MANAGER = _authManager; depositCap = _depositCap; MAX_LEDGERS_AMOUNT = 200; Types.Fee memory _fee; _fee.total = DEFAULT_OPERATORS_FEE + DEFAULT_DEVELOPERS_FEE + DEFAULT_TREASURY_FEE; _fee.operators = DEFAULT_OPERATORS_FEE; _fee.developers = DEFAULT_DEVELOPERS_FEE; _fee.treasury = DEFAULT_TREASURY_FEE; FEE = _fee; treasury = _treasury; developers =_developers; ORACLE_MASTER = _oracleMaster; IOracleMaster(ORACLE_MASTER).setLido(address(this)); WITHDRAWAL = _withdrawal; IWithdrawal(WITHDRAWAL).setStKSM(address(this)); MAX_ALLOWABLE_DIFFERENCE = _maxAllowableDifference; } /** * @notice Set treasury address to '_treasury' */ function setTreasury(address _treasury) external auth(ROLE_TREASURY) { require(_treasury != address(0), "LIDO: INCORRECT_TREASURY_ADDRESS"); treasury = _treasury; } /** * @notice Set deposit cap to new value */ function setDepositCap(uint256 _depositCap) external auth(ROLE_PAUSE_MANAGER) { require(_depositCap > 0, "LIDO: INCORRECT_NEW_CAP"); depositCap = _depositCap; } /** * @notice Set ledger beacon address to '_ledgerBeacon' */ function setLedgerBeacon(address _ledgerBeacon) external auth(ROLE_BEACON_MANAGER) { require(_ledgerBeacon != address(0), "LIDO: INCORRECT_BEACON_ADDRESS"); LEDGER_BEACON = _ledgerBeacon; } function setMaxAllowableDifference(uint128 _maxAllowableDifference) external auth(ROLE_BEACON_MANAGER) { require(_maxAllowableDifference > 0, "LIDO: INCORRECT_MAX_ALLOWABLE_DIFFERENCE"); MAX_ALLOWABLE_DIFFERENCE = _maxAllowableDifference; } /** * @notice Set ledger factory address to '_ledgerFactory' */ function setLedgerFactory(address _ledgerFactory) external auth(ROLE_BEACON_MANAGER) { require(_ledgerFactory != address(0), "LIDO: INCORRECT_FACTORY_ADDRESS"); LEDGER_FACTORY = _ledgerFactory; } /** * @notice Set developers address to '_developers' */ function setDevelopers(address _developers) external auth(ROLE_DEVELOPERS) { require(_developers != address(0), "LIDO: INCORRECT_DEVELOPERS_ADDRESS"); developers = _developers; } /** * @notice Set relay chain spec, allowed to call only by ROLE_SPEC_MANAGER * @dev if some params are changed function will iterate over oracles and ledgers, be careful * @param _relaySpec - new relaychain spec */ function setRelaySpec(Types.RelaySpec calldata _relaySpec) external auth(ROLE_SPEC_MANAGER) { require(_relaySpec.maxValidatorsPerLedger > 0, "LIDO: BAD_MAX_VALIDATORS_PER_LEDGER"); require(_relaySpec.maxUnlockingChunks > 0, "LIDO: BAD_MAX_UNLOCKING_CHUNKS"); RELAY_SPEC = _relaySpec; _updateLedgerRelaySpecs(_relaySpec.minNominatorBalance, _relaySpec.ledgerMinimumActiveBalance, _relaySpec.maxUnlockingChunks); } /** * @notice Set new lido fee, allowed to call only by ROLE_FEE_MANAGER * @param _feeOperators - Operators percentage in basis points. It's always 3% * @param _feeTreasury - Treasury fund percentage in basis points * @param _feeDevelopers - Developers percentage in basis points */ function setFee(uint16 _feeOperators, uint16 _feeTreasury, uint16 _feeDevelopers) external auth(ROLE_FEE_MANAGER) { Types.Fee memory _fee; _fee.total = _feeTreasury + _feeOperators + _feeDevelopers; require(_fee.total <= 10000 && (_feeTreasury > 0 || _feeDevelopers > 0) && _feeOperators < 10000, "LIDO: FEE_DONT_ADD_UP"); emit FeeSet(_fee.total, _feeOperators, _feeTreasury, _feeDevelopers); _fee.developers = _feeDevelopers; _fee.operators = _feeOperators; _fee.treasury = _feeTreasury; FEE = _fee; } /** * @notice Sets isRedeemDisabled flag, allowed to call only by ROLE_BEACON_MANAGER * @param _isRedeemDisabled - new value for the isRedeemDisabled flag */ function setIsRedeemDisabled(bool _isRedeemDisabled) external auth(ROLE_BEACON_MANAGER) { isRedeemDisabled = _isRedeemDisabled; } /** * @notice Sets isUnbondForced flag and bufferedRedeems value in a forced manner, * @notice allowed to call only by ROLE_BEACON_MANAGER * @dev used to indicate the start of the forced unbond proccess * @param _isUnbondForced - new isUnbondForced value * @param _bufferedRedeems - new bufferedRedeems value */ function setUnbondForcedStarted(bool _isUnbondForced, uint256 _bufferedRedeems) external redeemDisabled auth(ROLE_BEACON_MANAGER) { require(_bufferedRedeems <= fundRaisedBalance, "LIDO: VALUE_TOO_BIG"); isUnbondForced = _isUnbondForced; bufferedRedeems = _bufferedRedeems; } /** * @notice Return unbonded tokens amount for user * @param _holder - user account for whom need to calculate unbonding * @return waiting - amount of tokens which are not unbonded yet * @return unbonded - amount of token which unbonded and ready to claim */ function getUnbonded(address _holder) external view returns (uint256 waiting, uint256 unbonded) { return IWithdrawal(WITHDRAWAL).getRedeemStatus(_holder); } /** * @notice Return relay chain stash account addresses * @return Array of bytes32 relaychain stash accounts */ function getStashAccounts() public view returns (bytes32[] memory) { bytes32[] memory _stashes = new bytes32[](enabledLedgers.length + disabledLedgers.length); for (uint i = 0; i < enabledLedgers.length + disabledLedgers.length; i++) { address ledgerAddr = i < enabledLedgers.length ? enabledLedgers[i] : disabledLedgers[i - enabledLedgers.length]; _stashes[i] = bytes32(ILedger(ledgerAddr).stashAccount()); } return _stashes; } /** * @notice Return ledger contract addresses * @dev Each ledger contract linked with single stash account on the relaychain side * @return Array of ledger contract addresses */ function getLedgerAddresses() public view returns (address[] memory) { address[] memory _ledgers = new address[](enabledLedgers.length + disabledLedgers.length); for (uint i = 0; i < enabledLedgers.length + disabledLedgers.length; i++) { _ledgers[i] = i < enabledLedgers.length ? enabledLedgers[i] : disabledLedgers[i - enabledLedgers.length]; } return _ledgers; } /** * @notice Return ledger address by stash account id * @dev If ledger not found function returns ZERO address * @param _stashAccount - relaychain stash account id * @return Linked ledger contract address */ function findLedger(bytes32 _stashAccount) external view returns (address) { return ledgerByStash[_stashAccount]; } /** * @notice Stop pool routine operations (deposit, redeem, claimUnbonded), * allowed to call only by ROLE_PAUSE_MANAGER */ function pause() external auth(ROLE_PAUSE_MANAGER) { _pause(); } /** * @notice Resume pool routine operations (deposit, redeem, claimUnbonded), * allowed to call only by ROLE_PAUSE_MANAGER */ function resume() external auth(ROLE_PAUSE_MANAGER) { _unpause(); } /** * @notice Add new ledger, allowed to call only by ROLE_LEDGER_MANAGER * @dev That function deploys new ledger for provided stash account * Also method triggers rebalancing stakes accross ledgers, recommended to carefully calculate share value to avoid significant rebalancing. * @param _stashAccount - relaychain stash account id * @param _controllerAccount - controller account id for given stash * @return created ledger address */ function addLedger( bytes32 _stashAccount, bytes32 _controllerAccount, uint16 _index ) external auth(ROLE_LEDGER_MANAGER) returns(address) { require(LEDGER_BEACON != address(0), "LIDO: UNSPECIFIED_LEDGER_BEACON"); require(LEDGER_FACTORY != address(0), "LIDO: UNSPECIFIED_LEDGER_FACTORY"); require(ORACLE_MASTER != address(0), "LIDO: NO_ORACLE_MASTER"); require(enabledLedgers.length + disabledLedgers.length < MAX_LEDGERS_AMOUNT, "LIDO: LEDGERS_POOL_LIMIT"); require(ledgerByStash[_stashAccount] == address(0), "LIDO: STASH_ALREADY_EXISTS"); address ledger = ILedgerFactory(LEDGER_FACTORY).createLedger( _stashAccount, _controllerAccount, address(VKSM), CONTROLLER, RELAY_SPEC.minNominatorBalance, RELAY_SPEC.ledgerMinimumActiveBalance, RELAY_SPEC.maxUnlockingChunks ); enabledLedgers.push(ledger); ledgerByStash[_stashAccount] = ledger; ledgerByAddress[ledger] = true; IOracleMaster(ORACLE_MASTER).addLedger(ledger); IController(CONTROLLER).newSubAccount(_index, _stashAccount, ledger); emit LedgerAdd(ledger, _stashAccount, _controllerAccount); return ledger; } /** * @notice Disable ledger, allowed to call only by ROLE_LEDGER_MANAGER * @dev That method put ledger to "draining" mode, after ledger drained it can be removed * @param _ledgerAddress - target ledger address */ function disableLedger(address _ledgerAddress) external auth(ROLE_LEDGER_MANAGER) { _disableLedger(_ledgerAddress); } /** * @notice Disable ledger and pause all redeems for that ledger, allowed to call only by ROLE_LEDGER_MANAGER * @dev That method pause all stake changes for ledger * @param _ledgerAddress - target ledger address */ function emergencyPauseLedger(address _ledgerAddress) external auth(ROLE_LEDGER_MANAGER) { _disableLedger(_ledgerAddress); pausedledgers[_ledgerAddress] = true; emit LedgerPaused(_ledgerAddress); } /** * @notice Allow redeems from paused ledger, allowed to call only by ROLE_LEDGER_MANAGER * @param _ledgerAddress - target ledger address */ function resumeLedger(address _ledgerAddress) external auth(ROLE_LEDGER_MANAGER) { require(pausedledgers[_ledgerAddress], "LIDO: LEDGER_NOT_PAUSED"); delete pausedledgers[_ledgerAddress]; emit LedgerResumed(_ledgerAddress); } /** * @notice Nominate on behalf of gived array of stash accounts, allowed to call only by ROLE_STAKE_MANAGER * @dev Method spawns xcm call to relaychain * @param _stashAccounts - target stash accounts id * @param _validators - validators set to be nominated */ function nominateBatch(bytes32[] calldata _stashAccounts, bytes32[][] calldata _validators) external auth(ROLE_STAKE_MANAGER) { require(_stashAccounts.length == _validators.length, "LIDO: INCORRECT_INPUT"); for (uint256 i = 0; i < _stashAccounts.length; ++i) { require(ledgerByStash[_stashAccounts[i]] != address(0), "LIDO: UNKNOWN_STASH_ACCOUNT"); require(_validators[i].length <= RELAY_SPEC.maxValidatorsPerLedger, "LIDO: VALIDATORS_AMOUNT_TOO_BIG"); ILedger(ledgerByStash[_stashAccounts[i]]).nominate(_validators[i]); } } function deposit(uint256 _amount) external returns (uint256) { return _deposit(_amount); } function deposit(uint256 _amount, address _referral) external returns (uint256) { uint256 shares = _deposit(_amount); emit Referral(msg.sender, _referral, _amount, shares); return shares; } /** * @notice Deposit vKSM tokens to the pool and recieve stKSM(liquid staked tokens) instead. User should approve tokens before executing this call. * @dev Method accoumulate vKSMs on contract * @param _amount - amount of vKSM tokens to be deposited */ function _deposit(uint256 _amount) internal whenNotPaused returns (uint256) { require(fundRaisedBalance + _amount < depositCap, "LIDO: DEPOSITS_EXCEED_CAP"); VKSM.transferFrom(msg.sender, address(this), _amount); require(_amount != 0, "LIDO: ZERO_DEPOSIT"); uint256 shares = getSharesByPooledKSM(_amount); if (shares == 0) { // totalPooledKSM is 0: either the first-ever deposit or complete slashing // assume that shares correspond to KSM as 1-to-1 shares = _amount; } fundRaisedBalance += _amount; bufferedDeposits += _amount; _mintShares(msg.sender, shares); _emitTransferAfterMintingShares(msg.sender, shares); emit Deposited(msg.sender, _amount); return shares; } /** * @notice Create request to redeem vKSM in exchange of stKSM. stKSM will be instantly burned and created claim order, (see `getUnbonded` method). User can have up to 20 redeem requests in parallel. * @param _amount - amount of stKSM tokens to be redeemed */ function redeem(uint256 _amount) external whenNotPaused redeemEnabled { uint256 _shares = getSharesByPooledKSM(_amount); require(_shares > 0, "LIDO: AMOUNT_TOO_LOW"); require(_shares <= _sharesOf(msg.sender), "LIDO: REDEEM_AMOUNT_EXCEEDS_BALANCE"); _burnShares(msg.sender, _shares); fundRaisedBalance -= _amount; bufferedRedeems += _amount; IWithdrawal(WITHDRAWAL).redeem(msg.sender, _amount); // emit event about burning (compatible with ERC20) emit Transfer(msg.sender, address(0), _amount); // lido event about redeemed emit Redeemed(msg.sender, _amount); } /** * @notice Claim all unbonded tokens at this point of time. Executed redeem requests will be removed and approproate amount of vKSM transferred to calling account. */ function claimUnbonded() external whenNotPaused { uint256 amount = IWithdrawal(WITHDRAWAL).claim(msg.sender); emit Claimed(msg.sender, amount); } /** * @notice Claim all vKSM tokens which were forcefully unbonded. Burns stKSM shares */ function claimForcefullyUnbonded() external whenNotPaused { require(isUnbondForced, "LIDO: UNBOND_NOT_FORCED"); uint256 sharesToBurn = _sharesOf(msg.sender); require(sharesToBurn > 0, "LIDO: NOTHING_TO_CLAIM"); uint256 tokensToClaim = getPooledKSMByShares(sharesToBurn); fundRaisedBalance -= tokensToClaim; _burnShares(msg.sender, sharesToBurn); IWithdrawal(WITHDRAWAL).claimForcefullyUnbonded(msg.sender, tokensToClaim); emit Claimed(msg.sender, tokensToClaim); } /** * @notice Distribute rewards earned by ledger, allowed to call only by ledger */ function distributeRewards(uint256 _totalRewards, uint256 _ledgerBalance) external { require(ledgerByAddress[msg.sender], "LIDO: NOT_FROM_LEDGER"); Types.Fee memory _fee = FEE; // it's `feeDevelopers` + `feeTreasure` uint256 _feeDevTreasure = uint256(_fee.developers + _fee.treasury); assert(_feeDevTreasure>0); fundRaisedBalance += _totalRewards; ledgerStake[msg.sender] += _totalRewards; ledgerBorrow[msg.sender] += _totalRewards; uint256 _rewards = _totalRewards * _feeDevTreasure / uint256(10000 - _fee.operators); uint256 denom = _getTotalPooledKSM() - _rewards; uint256 shares2mint = _getTotalPooledKSM(); if (denom > 0) shares2mint = _rewards * _getTotalShares() / denom; _mintShares(treasury, shares2mint); uint256 _devShares = shares2mint * uint256(_fee.developers) / _feeDevTreasure; _transferShares(treasury, developers, _devShares); _emitTransferAfterMintingShares(developers, _devShares); _emitTransferAfterMintingShares(treasury, shares2mint - _devShares); emit Rewards(msg.sender, _totalRewards, _ledgerBalance); } /** * @notice Distribute lossed by ledger, allowed to call only by ledger */ function distributeLosses(uint256 _totalLosses, uint256 _ledgerBalance) external { require(ledgerByAddress[msg.sender], "LIDO: NOT_FROM_LEDGER"); uint256 _batchXcKSMBalance = IWithdrawal(WITHDRAWAL).batchVirtualXcKSMAmount(); uint256 withdrawalBalance = IWithdrawal(WITHDRAWAL).totalBalanceForLosses(); uint256 withdrawalPendingForClaiming = IWithdrawal(WITHDRAWAL).pendingForClaiming(); uint256 withdrawalVKSMBalance = VKSM.balanceOf(WITHDRAWAL); // NOTE: VKSM balance that was "fasttracked" to Withdrawal can't receive slash uint256 virtualWithdrawalBalance = 0; if (withdrawalBalance + withdrawalPendingForClaiming > withdrawalVKSMBalance) { // NOTE: protection from ddos virtualWithdrawalBalance = withdrawalBalance - (withdrawalVKSMBalance - withdrawalPendingForClaiming); } // lidoPart = _totalLosses * lido_xcKSM_balance / sum_xcKSM_balance uint256 lidoPart = (_totalLosses * fundRaisedBalance) / (fundRaisedBalance + virtualWithdrawalBalance); uint256 lidoPartLedger = (_totalLosses * (fundRaisedBalance + _batchXcKSMBalance)) / (fundRaisedBalance + virtualWithdrawalBalance); fundRaisedBalance -= lidoPart; if ((_totalLosses - lidoPart) > 0) { uint256 losses = _totalLosses - lidoPart; // NOTE: bufferedRedeems shoud be reduced because of losses distribution // bufferedRedeems === batchVirtualXcKSMAmount in withdrawal bufferedRedeems -= losses * bufferedRedeems / virtualWithdrawalBalance; IWithdrawal(WITHDRAWAL).ditributeLosses(losses); } // edge case when loss can be more than stake ledgerStake[msg.sender] -= ledgerStake[msg.sender] >= lidoPartLedger ? lidoPartLedger : ledgerStake[msg.sender]; ledgerBorrow[msg.sender] -= _totalLosses; emit Losses(msg.sender, _totalLosses, _ledgerBalance); } /** * @notice Transfer vKSM from ledger to LIDO. Can be called only from ledger * @param _amount - amount of vKSM that should be transfered * @param _excess - excess of vKSM that was transfered */ function transferFromLedger(uint256 _amount, uint256 _excess) external { require(ledgerByAddress[msg.sender], "LIDO: NOT_FROM_LEDGER"); if (_excess > 0) { // some donations VKSM.transferFrom(msg.sender, treasury, _excess); } ledgerBorrow[msg.sender] -= _amount; VKSM.transferFrom(msg.sender, WITHDRAWAL, _amount); } /** * @notice Transfer vKSM from LIDO to ledger. Can be called only from ledger * @param _amount - amount of transfered vKSM */ function transferToLedger(uint256 _amount) external { require(ledgerByAddress[msg.sender], "LIDO: NOT_FROM_LEDGER"); require(ledgerBorrow[msg.sender] + _amount <= ledgerStake[msg.sender], "LIDO: LEDGER_NOT_ENOUGH_STAKE"); ledgerBorrow[msg.sender] += _amount; VKSM.transfer(msg.sender, _amount); } /** * @notice Flush stakes, allowed to call only by oracle master * @dev This method distributes buffered stakes between ledgers by soft manner */ function flushStakes() external { require(msg.sender == ORACLE_MASTER, "LIDO: NOT_FROM_ORACLE_MASTER"); IWithdrawal(WITHDRAWAL).newEra(); _softRebalanceStakes(); } /** * @notice Rebalance stake accross ledgers by soft manner. */ function _softRebalanceStakes() internal { uint256 totalStakeExcess = 0; for (uint256 i = 0; i < enabledLedgers.length + disabledLedgers.length; ++i) { address ledgerAddr = i < enabledLedgers.length ? enabledLedgers[i] : disabledLedgers[i - enabledLedgers.length]; // consider an incorrect case when our records about the ledger are wrong: // the ledger's active stake > the ledger's total amount of funds if (ledgerStake[ledgerAddr] > ledgerBorrow[ledgerAddr]) { uint256 ledgerStakeExcess = ledgerStake[ledgerAddr] - ledgerBorrow[ledgerAddr]; // new total stake excess <= the amount of funds that won't be sent to the ledgers if (totalStakeExcess + ledgerStakeExcess <= VKSM.balanceOf(address(this)) - bufferedDeposits) { totalStakeExcess += ledgerStakeExcess; // correcting the ledger's active stake record ledgerStake[ledgerAddr] -= ledgerStakeExcess; } } } // the amount of funds to be sent to the ledgers should decrease the ledgers' stake excess bufferedDeposits += totalStakeExcess; if (bufferedDeposits > 0 || bufferedRedeems > 0) { // first try to distribute redeems accross disabled ledgers if (disabledLedgers.length > 0 && bufferedRedeems > 0) { bufferedRedeems = _processDisabledLedgers(bufferedRedeems); } // NOTE: if we have deposits and redeems in one era we need to send all possible xcKSMs to Withdrawal if (bufferedDeposits > 0 && bufferedRedeems > 0) { uint256 maxImmediateTransfer = bufferedDeposits > bufferedRedeems ? bufferedRedeems : bufferedDeposits; bufferedDeposits -= maxImmediateTransfer; bufferedRedeems -= maxImmediateTransfer; VKSM.transfer(WITHDRAWAL, maxImmediateTransfer); } // distribute remaining stakes and redeems accross enabled if (enabledLedgers.length > 0) { int256 stake = bufferedDeposits.toInt256() - bufferedRedeems.toInt256(); if (stake != 0) { _processEnabled(stake); } bufferedDeposits = 0; bufferedRedeems = 0; } } } /** * @notice Spread redeems accross disabled ledgers * @return remainingRedeems - redeems amount which didn't distributed */ function _processDisabledLedgers(uint256 redeems) internal returns(uint256 remainingRedeems) { uint256 disabledLength = disabledLedgers.length; assert(disabledLength > 0); uint256 stakesSum = 0; uint256 actualRedeems = 0; for (uint256 i = 0; i < disabledLength; ++i) { if (!pausedledgers[disabledLedgers[i]]) { stakesSum += ledgerStake[disabledLedgers[i]]; } } if (stakesSum == 0) return redeems; for (uint256 i = 0; i < disabledLength; ++i) { if (!pausedledgers[disabledLedgers[i]]) { uint256 currentStake = ledgerStake[disabledLedgers[i]]; uint256 decrement = redeems * currentStake / stakesSum; decrement = decrement > currentStake ? currentStake : decrement; ledgerStake[disabledLedgers[i]] = currentStake - decrement; actualRedeems += decrement; } } return redeems - actualRedeems; } /** * @notice Distribute stakes and redeems accross enabled ledgers with relaxation * @dev this function should never mix bond/unbond */ function _processEnabled(int256 _stake) internal { uint256 ledgersLength = enabledLedgers.length; assert(ledgersLength > 0); int256[] memory diffs = new int256[](ledgersLength); address[] memory ledgersCache = new address[](ledgersLength); int256[] memory ledgerStakesCache = new int256[](ledgersLength); // NOTE: cache can't be used, because it can be changed or not in algorithm uint256[] memory ledgerStakePrevious = new uint256[](ledgersLength); int256 activeDiffsSum = 0; int256 totalChange = 0; int256 preciseDiffSum = 0; uint256 targetStake = 0; { if (isUnbondForced && isRedeemDisabled) { require(bufferedRedeems == fundRaisedBalance, "LIDO: BUFFERED_REDEEMS_SET_INCORRECTLY"); targetStake = 0; } else { targetStake = getTotalPooledKSM() / ledgersLength; } int256 diff = 0; for (uint256 i = 0; i < ledgersLength; ++i) { ledgersCache[i] = enabledLedgers[i]; ledgerStakesCache[i] = int256(ledgerStake[ledgersCache[i]]); ledgerStakePrevious[i] = ledgerStake[ledgersCache[i]]; diff = int256(targetStake) - int256(ledgerStakesCache[i]); if (_stake * diff > 0) { activeDiffsSum += diff; } diffs[i] = diff; preciseDiffSum += diff; } } if (preciseDiffSum == 0 || activeDiffsSum == 0) { return; } int8 direction = 1; if (activeDiffsSum < 0) { direction = -1; activeDiffsSum = -activeDiffsSum; } for (uint256 i = 0; i < ledgersLength; ++i) { diffs[i] *= direction; if (diffs[i] > 0) { int256 change = diffs[i] * _stake / activeDiffsSum; int256 newStake = ledgerStakesCache[i] + change; ledgerStake[ledgersCache[i]] = uint256(newStake); ledgerStakesCache[i] = newStake; totalChange += change; } } { int256 remaining = _stake - totalChange; if (remaining > 0) { // just add to first ledger ledgerStake[ledgersCache[0]] += uint256(remaining); } else if (remaining < 0) { for (uint256 i = 0; i < ledgersLength && remaining < 0; ++i) { uint256 stake = uint256(ledgerStakesCache[i]); if (stake > 0) { uint256 decrement = stake > uint256(-remaining) ? uint256(-remaining) : stake; ledgerStake[ledgersCache[i]] -= decrement; remaining += int256(decrement); } } } } // NOTE: this check used to catch cases when one user redeem some funds and another deposit in next era // so ledgers stake would increase and they return less xcKSMs and remaining funds would be locked on Lido uint256 freeToTransferFunds = 0; for (uint256 i = 0; i < ledgersLength; ++i) { // NOTE: protection from double sending of funds uint256 updatedLedgerBorrow = ledgerBorrow[ledgersCache[i]] - uint256(ILedger(ledgersCache[i]).transferDownwardBalance()); if ( // NOTE: this means that we wait transfer from ledger updatedLedgerBorrow > ledgerStakePrevious[i] && // NOTE: and new deposits increase ledger stake ledgerStake[ledgersCache[i]] > ledgerStakePrevious[i] ) { freeToTransferFunds += ledgerStake[ledgersCache[i]] > updatedLedgerBorrow ? updatedLedgerBorrow - ledgerStakePrevious[i] : ledgerStake[ledgersCache[i]] - ledgerStakePrevious[i]; } } if (freeToTransferFunds > 0) { VKSM.transfer(WITHDRAWAL, uint256(freeToTransferFunds)); } } /** * @notice Set new minimum balance for ledger * @param _minNominatorBalance - new minimum nominator balance * @param _minimumBalance - new minimum active balance for ledger * @param _maxUnlockingChunks - new maximum unlocking chunks */ function _updateLedgerRelaySpecs(uint128 _minNominatorBalance, uint128 _minimumBalance, uint256 _maxUnlockingChunks) internal { for (uint i = 0; i < enabledLedgers.length + disabledLedgers.length; i++) { address ledgerAddress = i < enabledLedgers.length ? enabledLedgers[i] : disabledLedgers[i - enabledLedgers.length]; ILedger(ledgerAddress).setRelaySpecs(_minNominatorBalance, _minimumBalance, _maxUnlockingChunks); } } /** * @notice Disable ledger * @dev That method put ledger to "draining" mode, after ledger drained it can be removed * @param _ledgerAddress - target ledger address */ function _disableLedger(address _ledgerAddress) internal { require(ledgerByAddress[_ledgerAddress], "LIDO: LEDGER_NOT_FOUND"); uint256 ledgerIdx = _findLedger(_ledgerAddress, true); require(ledgerIdx != type(uint256).max, "LIDO: LEDGER_NOT_ENABLED"); address lastLedger = enabledLedgers[enabledLedgers.length - 1]; enabledLedgers[ledgerIdx] = lastLedger; enabledLedgers.pop(); disabledLedgers.push(_ledgerAddress); emit LedgerDisable(_ledgerAddress); } /** * @notice Emits an {Transfer} event where from is 0 address. Indicates mint events. */ function _emitTransferAfterMintingShares(address _to, uint256 _sharesAmount) internal { emit Transfer(address(0), _to, getPooledKSMByShares(_sharesAmount)); } /** * @notice Returns amount of total pooled tokens by contract. * @return amount of pooled vKSM in contract */ function _getTotalPooledKSM() internal view override returns (uint256) { return fundRaisedBalance; } /** * @notice Returns enabled or disabled ledger index by given address * @return enabled or disabled ledger index or uint256_max if not found */ function _findLedger(address _ledgerAddress, bool _enabled) internal view returns(uint256) { uint256 length = _enabled ? enabledLedgers.length : disabledLedgers.length; for (uint256 i = 0; i < length; ++i) { address ledgerAddress = _enabled ? enabledLedgers[i] : disabledLedgers[i]; if (ledgerAddress == _ledgerAddress) { return i; } } return type(uint256).max; } } /** * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits. */ function toUint8(uint256 value) internal pure returns (uint8) { require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v3.1._ */ function toInt128(int256 value) internal pure returns (int128) { require(value >= -2**127 && value < 2**127, "SafeCast: value doesn\'t fit in 128 bits"); return int128(value); } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v3.1._ */ function toInt64(int256 value) internal pure returns (int64) { require(value >= -2**63 && value < 2**63, "SafeCast: value doesn\'t fit in 64 bits"); return int64(value); } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v3.1._ */ function toInt32(int256 value) internal pure returns (int32) { require(value >= -2**31 && value < 2**31, "SafeCast: value doesn\'t fit in 32 bits"); return int32(value); } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v3.1._ */ function toInt16(int256 value) internal pure returns (int16) { require(value >= -2**15 && value < 2**15, "SafeCast: value doesn\'t fit in 16 bits"); return int16(value); } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits. * * _Available since v3.1._ */ function toInt8(int256 value) internal pure returns (int8) { require(value >= -2**7 && value < 2**7, "SafeCast: value doesn\'t fit in 8 bits"); return int8(value); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. */ function toInt256(uint256 value) internal pure returns (int256) { require(value < 2**255, "SafeCast: value doesn't fit in an int256"); return int256(value); } } interface Types { struct Fee{ uint16 total; uint16 operators; uint16 developers; uint16 treasury; } struct Stash { bytes32 stashAccount; uint64 eraId; } enum LedgerStatus { // bonded but not participate in staking Idle, // participate as nominator Nominator, // participate as validator Validator, // not bonded not participate in staking None } struct UnlockingChunk { uint128 balance; uint64 era; } struct OracleData { bytes32 stashAccount; bytes32 controllerAccount; LedgerStatus stakeStatus; // active part of stash balance uint128 activeBalance; // locked for stake stash balance. uint128 totalBalance; // totalBalance = activeBalance + sum(unlocked.balance) UnlockingChunk[] unlocking; uint32[] claimedRewards; // stash account balance. It includes locked (totalBalance) balance assigned // to a controller. uint128 stashBalance; // slashing spans for ledger uint32 slashingSpans; } struct RelaySpec { uint16 maxValidatorsPerLedger; uint128 minNominatorBalance; uint128 ledgerMinimumActiveBalance; uint256 maxUnlockingChunks; } }
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"fee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"feeOperatorsBP","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"feeTreasuryBP","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"feeDevelopersBP","type":"uint16"}],"name":"FeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bytes32","name":"stashAccount","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"controllerAccount","type":"bytes32"}],"name":"LedgerAdd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"LedgerDisable","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"LedgerPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"LedgerRemove","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"LedgerResumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ledger","type":"address"},{"indexed":false,"internalType":"uint256","name":"losses","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"Losses","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Redeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"address","name":"referralAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Referral","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ledger","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewards","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"Rewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"AUTH_MANAGER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEDGER_BEACON","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ALLOWABLE_DIFFERENCE","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_MASTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_stashAccount","type":"bytes32"},{"internalType":"bytes32","name":"_controllerAccount","type":"bytes32"},{"internalType":"uint16","name":"_index","type":"uint16"}],"name":"addLedger","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bufferedDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bufferedRedeems","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimForcefullyUnbonded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimUnbonded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_referral","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ledgerAddress","type":"address"}],"name":"disableLedger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalLosses","type":"uint256"},{"internalType":"uint256","name":"_ledgerBalance","type":"uint256"}],"name":"distributeLosses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalRewards","type":"uint256"},{"internalType":"uint256","name":"_ledgerBalance","type":"uint256"}],"name":"distributeRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ledgerAddress","type":"address"}],"name":"emergencyPauseLedger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_stashAccount","type":"bytes32"}],"name":"findLedger","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flushStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fundRaisedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLedgerAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sharesAmount","type":"uint256"}],"name":"getPooledKSMByShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getSharesByPooledKSM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStashAccounts","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalPooledKSM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getUnbonded","outputs":[{"internalType":"uint256","name":"waiting","type":"uint256"},{"internalType":"uint256","name":"unbonded","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_authManager","type":"address"},{"internalType":"address","name":"_vKSM","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_developers","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_oracleMaster","type":"address"},{"internalType":"address","name":"_withdrawal","type":"address"},{"internalType":"uint256","name":"_depositCap","type":"uint256"},{"internalType":"uint128","name":"_maxAllowableDifference","type":"uint128"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ledgerBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ledgerStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_stashAccounts","type":"bytes32[]"},{"internalType":"bytes32[][]","name":"_validators","type":"bytes32[][]"}],"name":"nominateBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ledgerAddress","type":"address"}],"name":"resumeLedger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositCap","type":"uint256"}],"name":"setDepositCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_developers","type":"address"}],"name":"setDevelopers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_feeOperators","type":"uint16"},{"internalType":"uint16","name":"_feeTreasury","type":"uint16"},{"internalType":"uint16","name":"_feeDevelopers","type":"uint16"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isRedeemDisabled","type":"bool"}],"name":"setIsRedeemDisabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ledgerBeacon","type":"address"}],"name":"setLedgerBeacon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ledgerFactory","type":"address"}],"name":"setLedgerFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_maxAllowableDifference","type":"uint128"}],"name":"setMaxAllowableDifference","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"maxValidatorsPerLedger","type":"uint16"},{"internalType":"uint128","name":"minNominatorBalance","type":"uint128"},{"internalType":"uint128","name":"ledgerMinimumActiveBalance","type":"uint128"},{"internalType":"uint256","name":"maxUnlockingChunks","type":"uint256"}],"internalType":"struct Types.RelaySpec","name":"_relaySpec","type":"tuple"}],"name":"setRelaySpec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isUnbondForced","type":"bool"},{"internalType":"uint256","name":"_bufferedRedeems","type":"uint256"}],"name":"setUnbondForcedStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sharesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_excess","type":"uint256"}],"name":"transferFromLedger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferToLedger","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506000805460ff19169055615e61806200002b6000396000f3fe608060405234801561001057600080fd5b50600436106102a95760003560e01c8063046f7da2146102ae57806306fdde03146102b8578063095ea7b3146102d657806318160ddd146102f95780631a813a3c1461030f5780631ab81cba146103175780631d55fde41461032a57806323b872dd1461033f578063240359bc14610352578063251bc88b14610388578063313ce5671461039b57806338dee1d3146103b057806339509351146103c35780633ca3bca3146103d65780633fd2c16a146103e957806341c262c5146103fc578063473764731461040f57806348c696c0146104225780634fe28e3a1461042b5780635c975abb1461043e5780635e442a9b146104495780635f3f2cac1461046957806361f9c3da1461047c57806363ca402d1461048f5780636a92b586146104a25780636e553f65146104cd57806370a08231146104e057806373ece435146104f357806377c96574146105065780638456cb591461052e57806386651203146105365780638ab476bf1461054957806395d89b411461055c5780639e0c970414610564578063a1e206c714610577578063a457c2d71461058a578063a9042441146102f9578063a9059cbb1461059d578063b09f5320146105b0578063b31207f2146105b9578063b6b55f25146105cc578063cdd8f598146105df578063d0564dce146105f2578063d4a486d0146105fa578063d5002f2e1461060d578063db006a7514610615578063dbd5edc714610628578063dd62ed3e14610631578063df1979561461066a578063df6c39fb1461067f578063e100610714610692578063e40b9255146106a5578063ec70d800146106ae578063f0f44260146106c1578063f1447195146106d4578063f339a70d146106f4578063f5eb42dc14610707578063f7eba4201461071a578063fa597e071461072d575b600080fd5b6102b6610735565b005b6102c06107e6565b6040516102cd919061535a565b60405180910390f35b6102e96102e43660046153c4565b610878565b60405190151581526020016102cd565b61030161088f565b6040519081526020016102cd565b6102b661089f565b6102b66103253660046153f0565b61095f565b610332610aba565b6040516102cd919061540d565b6102e961034d366004615451565b610c36565b61037b610360366004615492565b6000908152601b60205260409020546001600160a01b031690565b6040516102cd91906154ab565b6102b66103963660046154cd565b610cde565b60215460405160ff90911681526020016102cd565b6102b66103be3660046154eb565b610e32565b6102e96103d13660046153c4565b610fe2565b6102b66103e4366004615512565b611019565b60115461037b906001600160a01b031681565b6102b661040a366004615610565b6114c2565b6102b661041d3660046153f0565b61178e565b61030160075481565b61037b61043936600461568b565b6118a4565b60005460ff166102e9565b6103016104573660046153f0565b60096020526000908152604090205481565b6102b66104773660046156c4565b611d4c565b6102b661048a3660046156e1565b611e76565b61030161049d366004615492565b611fce565b601a546104b5906001600160801b031681565b6040516001600160801b0390911681526020016102cd565b6103016104db366004615703565b612015565b6103016104ee3660046153f0565b61207b565b6102b6610501366004615733565b612089565b6105196105143660046153f0565b612293565b604080519283526020830191909152016102cd565b6102b6612311565b6102b6610544366004615492565b6123b6565b6102b66105573660046153f0565b6124a3565b6102c06125d6565b6102b66105723660046156e1565b6125e5565b600f5461037b906001600160a01b031681565b6102e96105983660046153c4565b612a01565b6102e96105ab3660046153c4565b612a8e565b61030160065481565b6103016105c7366004615492565b612a9b565b6103016105da366004615492565b612ac1565b6102b66105ed3660046153f0565b612acc565b6102b6612bc5565b6102b6610608366004615773565b612d4c565b610301612e04565b6102b6610623366004615492565b612e0f565b610301600c5481565b61030161063f366004615790565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b610672613031565b6040516102cd91906157be565b6102b661068d3660046156e1565b61314c565b6102b66106a0366004615492565b61338b565b61030160055481565b60175461037b906001600160a01b031681565b6102b66106cf3660046153f0565b6134c8565b6103016106e23660046153f0565b60086020526000908152604090205481565b6102b66107023660046153f0565b6135f0565b6103016107153660046153f0565b613696565b6102b66107283660046153f0565b6136a1565b6102b66137b7565b600f54604051633bfc46cb60e21b8152600080516020615dec833981519152916001600160a01b03169063eff11b2c9061077590849033906004016157ff565b602060405180830381865afa158015610792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b69190615816565b6107db5760405162461bcd60e51b81526004016107d290615833565b60405180910390fd5b6107e3613882565b50565b6060601f80546107f59061585f565b80601f01602080910402602001604051908101604052809291908181526020018280546108219061585f565b801561086e5780601f106108435761010080835404028352916020019161086e565b820191906000526020600020905b81548152906001019060200180831161085157829003601f168201915b5050505050905090565b600061088533848461390f565b5060015b92915050565b600061089a60055490565b905090565b60005460ff16156108c25760405162461bcd60e51b81526004016107d290615894565b601954604051630f41a04d60e11b81526000916001600160a01b031690631e83409a906108f39033906004016154ab565b6020604051808303816000875af1158015610912573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093691906158be565b6040518181529091503390600080516020615dcc8339815191529060200160405180910390a250565b600f54604051633bfc46cb60e21b8152600080516020615d8c833981519152916001600160a01b03169063eff11b2c9061099f90849033906004016157ff565b602060405180830381865afa1580156109bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e09190615816565b6109fc5760405162461bcd60e51b81526004016107d290615833565b6001600160a01b0382166000908152601d602052604090205460ff16610a5e5760405162461bcd60e51b815260206004820152601760248201527613125113ce8813115111d15497d393d517d4105554d151604a1b60448201526064016107d2565b6001600160a01b0382166000908152601d602052604090819020805460ff19169055517f8c097d4c8d964b147a04f3a822a31e3aa5a9104dc7db3dde0166a248b8f106c590610aae9084906154ab565b60405180910390a15050565b600a54600b54606091600091610ad091906158ed565b6001600160401b03811115610ae757610ae7615905565b604051908082528060200260200182016040528015610b10578160200160208202803683370190505b50905060005b600a54600b54610b2691906158ed565b811015610c3057600b546000908210610b7357600b54600a90610b49908461591b565b81548110610b5957610b59615932565b6000918252602090912001546001600160a01b0316610b9c565b600b8281548110610b8657610b86615932565b6000918252602090912001546001600160a01b03165b9050806001600160a01b031663231aebf26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0091906158be565b838381518110610c1257610c12615932565b60209081029190910101525080610c2881615948565b915050610b16565b50919050565b6001600160a01b038316600090815260026020908152604080832033845290915281205482811015610cb45760405162461bcd60e51b815260206004820152602160248201527f5452414e534645525f414d4f554e545f455843454544535f414c4c4f57414e436044820152604560f81b60648201526084016107d2565b610cbf858585613a35565b610cd38533610cce868561591b565b61390f565b506001949350505050565b602154610100900460ff16610d2c5760405162461bcd60e51b815260206004820152601460248201527313125113ce8814915111515357d153905093115160621b60448201526064016107d2565b600f54604051633bfc46cb60e21b8152600080516020615dac833981519152916001600160a01b03169063eff11b2c90610d6c90849033906004016157ff565b602060405180830381865afa158015610d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dad9190615816565b610dc95760405162461bcd60e51b81526004016107d290615833565b600554821115610e115760405162461bcd60e51b81526020600482015260136024820152724c49444f3a2056414c55455f544f4f5f42494760681b60448201526064016107d2565b5060218054921515620100000262ff00001990931692909217909155600755565b600f54604051633bfc46cb60e21b81527f2c204f3ef59cc164f843cf6919920470e37721ba425db7893d02e60cfd0bafdc916001600160a01b03169063eff11b2c90610e8490849033906004016157ff565b602060405180830381865afa158015610ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec59190615816565b610ee15760405162461bcd60e51b81526004016107d290615833565b6000610ef06020840184615963565b61ffff1611610f4d5760405162461bcd60e51b815260206004820152602360248201527f4c49444f3a204241445f4d41585f56414c494441544f52535f5045525f4c454460448201526223a2a960e91b60648201526084016107d2565b6000826060013511610fa15760405162461bcd60e51b815260206004820152601e60248201527f4c49444f3a204241445f4d41585f554e4c4f434b494e475f4348554e4b53000060448201526064016107d2565b816012610fae8282615980565b50610fde9050610fc460408401602085016156c4565b610fd460608501604086016156c4565b8460600135613a8e565b5050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610885918590610cce9086906158ed565b600454610100900460ff1680611032575060045460ff16155b6110955760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107d2565b600454610100900460ff161580156110b7576004805461ffff19166101011790555b600083116110f85760405162461bcd60e51b815260206004820152600e60248201526d04c49444f3a205a45524f5f4341560941b60448201526064016107d2565b6001600160a01b03891661114d5760405162461bcd60e51b815260206004820152601c60248201527b4c49444f3a20494e434f52524543545f564b534d5f4144445245535360201b60448201526064016107d2565b6001600160a01b0385166111b15760405162461bcd60e51b815260206004820152602560248201527f4c49444f3a20494e434f52524543545f4f5241434c455f4d41535445525f4144604482015264445245535360d81b60648201526084016107d2565b6001600160a01b0384166112125760405162461bcd60e51b815260206004820152602260248201527f4c49444f3a20494e434f52524543545f5749544844524157414c5f4144445245604482015261535360f01b60648201526084016107d2565b6001600160a01b038a166112745760405162461bcd60e51b815260206004820152602360248201527f4c49444f3a20494e434f52524543545f415554484d414e414745525f4144445260448201526245535360e81b60648201526084016107d2565b6001600160a01b0388166112d55760405162461bcd60e51b815260206004820152602260248201527f4c49444f3a20494e434f52524543545f434f4e54524f4c4c45525f4144445245604482015261535360f01b60648201526084016107d2565b600d80546001600160a01b03808c166001600160a01b031992831617909255600e80548b8416908316179055600f8054928d1692909116919091179055600c83905560c8601055611324615333565b61032061133360c86000615a0d565b61133d9190615a0d565b61ffff168082526000602083015260c86040808401919091526103206060840152601e805465ffffffffffff1916909217601960231b1761ffff60301b1916601960351b17909155601680546001600160a01b03199081166001600160a01b038b8116919091179092556015805482168c84161790556011805490911691891691821790559051637d774e3160e01b8152637d774e31906113e29030906004016154ab565b600060405180830381600087803b1580156113fc57600080fd5b505af1158015611410573d6000803e3d6000fd5b5050601980546001600160a01b0319166001600160a01b03891690811790915560405163015cda1760e41b81529092506315cda17091506114559030906004016154ab565b600060405180830381600087803b15801561146f57600080fd5b505af1158015611483573d6000803e3d6000fd5b5050601a80546001600160801b0319166001600160801b0387161790555050811590506114b6576004805461ff00191690555b50505050505050505050565b600f54604051633bfc46cb60e21b81527fdefdc47e8c8311059971baa7eda778fd22d6ea93a75a917e77534b8ce74fe4f9916001600160a01b03169063eff11b2c9061151490849033906004016157ff565b602060405180830381865afa158015611531573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115559190615816565b6115715760405162461bcd60e51b81526004016107d290615833565b8382146115b85760405162461bcd60e51b815260206004820152601560248201527413125113ce88125390d3d4949150d517d253941555605a1b60448201526064016107d2565b60005b84811015611786576000601b818888858181106115da576115da615932565b60209081029290920135835250810191909152604001600020546001600160a01b031614156116495760405162461bcd60e51b815260206004820152601b60248201527a13125113ce88155392d393d5d397d4d51054d217d050d0d3d55395602a1b60448201526064016107d2565b60125461ffff1684848381811061166257611662615932565b90506020028101906116749190615a33565b905011156116c45760405162461bcd60e51b815260206004820152601f60248201527f4c49444f3a2056414c494441544f52535f414d4f554e545f544f4f5f4249470060448201526064016107d2565b601b60008787848181106116da576116da615932565b60209081029290920135835250810191909152604001600020546001600160a01b031663f5330e9685858481811061171457611714615932565b90506020028101906117269190615a33565b6040518363ffffffff1660e01b8152600401611743929190615a7c565b600060405180830381600087803b15801561175d57600080fd5b505af1158015611771573d6000803e3d6000fd5b505050508061177f90615948565b90506115bb565b505050505050565b600f54604051633bfc46cb60e21b8152600080516020615dac833981519152916001600160a01b03169063eff11b2c906117ce90849033906004016157ff565b602060405180830381865afa1580156117eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180f9190615816565b61182b5760405162461bcd60e51b81526004016107d290615833565b6001600160a01b0382166118815760405162461bcd60e51b815260206004820152601e60248201527f4c49444f3a20494e434f52524543545f424541434f4e5f41444452455353000060448201526064016107d2565b50601780546001600160a01b0319166001600160a01b0392909216919091179055565b600f54604051633bfc46cb60e21b8152600091600080516020615d8c833981519152916001600160a01b039091169063eff11b2c906118e990849033906004016157ff565b602060405180830381865afa158015611906573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192a9190615816565b6119465760405162461bcd60e51b81526004016107d290615833565b6017546001600160a01b031661199e5760405162461bcd60e51b815260206004820152601f60248201527f4c49444f3a20554e5350454349464945445f4c45444745525f424541434f4e0060448201526064016107d2565b6018546001600160a01b03166119f65760405162461bcd60e51b815260206004820181905260248201527f4c49444f3a20554e5350454349464945445f4c45444745525f464143544f525960448201526064016107d2565b6011546001600160a01b0316611a475760405162461bcd60e51b81526020600482015260166024820152752624a2279d102727afa7a920a1a622afa6a0a9aa22a960511b60448201526064016107d2565b601054600a54600b54611a5a91906158ed565b10611aa25760405162461bcd60e51b815260206004820152601860248201527713125113ce8813115111d15494d7d413d3d317d31253525560421b60448201526064016107d2565b6000858152601b60205260409020546001600160a01b031615611b045760405162461bcd60e51b815260206004820152601a6024820152794c49444f3a2053544153485f414c52454144595f45584953545360301b60448201526064016107d2565b601854600d54600e5460125460135460145460405163776aecef60e11b8152600481018c9052602481018b90526001600160a01b0395861660448201529385166064850152620100009092046001600160801b0390811660848501521660a483015260c4820152600092919091169063eed5d9de9060e4016020604051808303816000875af1158015611b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbf9190615ab8565b600b805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b038085166001600160a01b0319928316811790935560008b8152601b6020908152604080832080549095168617909455938152601c90935291819020805460ff191690931790925560115491516327c13a6b60e21b81529293501690639f04e9ac90611c669084906004016154ab565b600060405180830381600087803b158015611c8057600080fd5b505af1158015611c94573d6000803e3d6000fd5b5050600e54604051639632acf760e01b815261ffff88166004820152602481018a90526001600160a01b0385811660448301529091169250639632acf79150606401600060405180830381600087803b158015611cf057600080fd5b505af1158015611d04573d6000803e3d6000fd5b505050507f4522989a180263bb7fbc1471718de7bdd69a5d36b5d29511958afa11d2e9da04818787604051611d3b93929190615ad5565b60405180910390a195945050505050565b600f54604051633bfc46cb60e21b8152600080516020615dac833981519152916001600160a01b03169063eff11b2c90611d8c90849033906004016157ff565b602060405180830381865afa158015611da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcd9190615816565b611de95760405162461bcd60e51b81526004016107d290615833565b6000826001600160801b031611611e535760405162461bcd60e51b815260206004820152602860248201527f4c49444f3a20494e434f52524543545f4d41585f414c4c4f5741424c455f444960448201526746464552454e434560c01b60648201526084016107d2565b50601a80546001600160801b0319166001600160801b0392909216919091179055565b336000908152601c602052604090205460ff16611ea55760405162461bcd60e51b81526004016107d290615af6565b8015611f2957600d546016546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92611ee4923392909116908690600401615b25565b6020604051808303816000875af1158015611f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f279190615816565b505b3360009081526009602052604081208054849290611f4890849061591b565b9091555050600d546019546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92611f86923392909116908790600401615b25565b6020604051808303816000875af1158015611fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc99190615816565b505050565b600080611fda60035490565b905060035460001415611ff05750600092915050565b80611ffa60055490565b6120049085615b49565b61200e9190615b7e565b9392505050565b60008061202184613ba5565b604080513381526001600160a01b0386166020820152908101869052606081018290529091507f90f46099733ed637df811df4fcc5cae4961192ca04f36da9ab64b4dd8dc9b7f59060800160405180910390a19392505050565b600061088961049d83613d73565b600f54604051633bfc46cb60e21b81527f0fc26914248bb9568b0afb008dd993637f6fb6bdc9598c222c68a21e90ca53c1916001600160a01b03169063eff11b2c906120db90849033906004016157ff565b602060405180830381865afa1580156120f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211c9190615816565b6121385760405162461bcd60e51b81526004016107d290615833565b612140615333565b8261214b8686615a0d565b6121559190615a0d565b61ffff168082526127101080159061217f575060008461ffff16118061217f575060008361ffff16115b801561219057506127108561ffff16105b6121d45760405162461bcd60e51b815260206004820152601560248201527404c49444f3a204645455f444f4e545f4144445f555605c1b60448201526064016107d2565b80516040805161ffff92831681528783166020820152868316818301529185166060830152517fb01998f6d1382c5b6c7a4b477769ce2ffbbb91adc291994665b24def9a47e4509181900360800190a161ffff9283166040820181905294831660208201819052938316606082018190529051601e80549190941663ffffffff1990911617620100009094029390931763ffffffff60201b1916600160201b90940261ffff60301b191693909317600160301b90920291909117905550565b601954604051630aff799160e41b815260009182916001600160a01b039091169063aff79910906122c89086906004016154ab565b6040805180830381865afa1580156122e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123089190615b92565b91509150915091565b600f54604051633bfc46cb60e21b8152600080516020615dec833981519152916001600160a01b03169063eff11b2c9061235190849033906004016157ff565b602060405180830381865afa15801561236e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123929190615816565b6123ae5760405162461bcd60e51b81526004016107d290615833565b6107e3613d8e565b600f54604051633bfc46cb60e21b8152600080516020615dec833981519152916001600160a01b03169063eff11b2c906123f690849033906004016157ff565b602060405180830381865afa158015612413573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124379190615816565b6124535760405162461bcd60e51b81526004016107d290615833565b6000821161249d5760405162461bcd60e51b815260206004820152601760248201527604c49444f3a20494e434f52524543545f4e45575f43415604c1b60448201526064016107d2565b50600c55565b600f54604051633bfc46cb60e21b81527fbd1ecc6a842ff1f2601eedd75a87543c45753bbba85c665c9f8870558fb3a2cf916001600160a01b03169063eff11b2c906124f590849033906004016157ff565b602060405180830381865afa158015612512573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125369190615816565b6125525760405162461bcd60e51b81526004016107d290615833565b6001600160a01b0382166125b35760405162461bcd60e51b815260206004820152602260248201527f4c49444f3a20494e434f52524543545f444556454c4f504552535f4144445245604482015261535360f01b60648201526084016107d2565b50601580546001600160a01b0319166001600160a01b0392909216919091179055565b6060602080546107f59061585f565b336000908152601c602052604090205460ff166126145760405162461bcd60e51b81526004016107d290615af6565b60195460408051633908530160e01b815290516000926001600160a01b0316916339085301916004808301926020929190829003018187875af115801561265f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268391906158be565b90506000601960009054906101000a90046001600160a01b03166001600160a01b031663036ec0666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fe91906158be565b90506000601960009054906101000a90046001600160a01b03166001600160a01b0316633dbfe6cb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612755573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277991906158be565b600d546019546040516370a0823160e01b81529293506000926001600160a01b03928316926370a08231926127b3929116906004016154ab565b602060405180830381865afa1580156127d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f491906158be565b905060008161280384866158ed565b111561282057612813838361591b565b61281d908561591b565b90505b60008160055461283091906158ed565b60055461283d908a615b49565b6128479190615b7e565b905060008260055461285991906158ed565b8760055461286791906158ed565b612871908b615b49565b61287b9190615b7e565b9050816005600082825461288f919061591b565b90915550600090506128a1838b61591b565b11156129445760006128b3838b61591b565b905083600754826128c49190615b49565b6128ce9190615b7e565b600760008282546128df919061591b565b90915550506019546040516313d6d8db60e21b8152600481018390526001600160a01b0390911690634f5b636c90602401600060405180830381600087803b15801561292a57600080fd5b505af115801561293e573d6000803e3d6000fd5b50505050505b336000908152600860205260409020548111156129705733600090815260086020526040902054612972565b805b336000908152600860205260408120805490919061299190849061591b565b909155505033600090815260096020526040812080548b92906129b590849061591b565b90915550506040517f28457ba4ae46aeb68ba5c1a1c15506fb3212bfff27da04dee70b81023a9ebc04906129ee9033908c908c90615ad5565b60405180910390a1505050505050505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015612a755760405162461bcd60e51b815260206004820152601e60248201527f4445435245415345445f414c4c4f57414e43455f42454c4f575f5a45524f000060448201526064016107d2565b612a843385610cce868561591b565b5060019392505050565b6000610885338484613a35565b600080612aa760055490565b905080612ab75750600092915050565b80611ffa60035490565b600061088982613ba5565b600f54604051633bfc46cb60e21b8152600080516020615d8c833981519152916001600160a01b03169063eff11b2c90612b0c90849033906004016157ff565b602060405180830381865afa158015612b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4d9190615816565b612b695760405162461bcd60e51b81526004016107d290615833565b612b7282613de6565b6001600160a01b0382166000908152601d602052604090819020805460ff19166001179055517fe5526d35f0db491e3e7690717b21c8148a1b5eef07240279db75404df228a59390610aae9084906154ab565b60005460ff1615612be85760405162461bcd60e51b81526004016107d290615894565b60215462010000900460ff16612c3a5760405162461bcd60e51b815260206004820152601760248201527613125113ce8815539093d39117d393d517d193d490d151604a1b60448201526064016107d2565b6000612c4533613d73565b905060008111612c905760405162461bcd60e51b81526020600482015260166024820152754c49444f3a204e4f5448494e475f544f5f434c41494d60501b60448201526064016107d2565b6000612c9b82611fce565b90508060056000828254612caf919061591b565b90915550612cbf90503383613fdb565b50601954604051635f99a1b360e01b81526001600160a01b0390911690635f99a1b390612cf29033908590600401615bb6565b600060405180830381600087803b158015612d0c57600080fd5b505af1158015612d20573d6000803e3d6000fd5b5050604051838152339250600080516020615dcc83398151915291506020015b60405180910390a25050565b600f54604051633bfc46cb60e21b8152600080516020615dac833981519152916001600160a01b03169063eff11b2c90612d8c90849033906004016157ff565b602060405180830381865afa158015612da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dcd9190615816565b612de95760405162461bcd60e51b81526004016107d290615833565b50602180549115156101000261ff0019909216919091179055565b600061089a60035490565b60005460ff1615612e325760405162461bcd60e51b81526004016107d290615894565b602154610100900460ff1615612e825760405162461bcd60e51b815260206004820152601560248201527413125113ce8814915111515357d11254d050931151605a1b60448201526064016107d2565b6000612e8d82612a9b565b905060008111612ed65760405162461bcd60e51b81526020600482015260146024820152734c49444f3a20414d4f554e545f544f4f5f4c4f5760601b60448201526064016107d2565b612edf33613d73565b811115612f3a5760405162461bcd60e51b815260206004820152602360248201527f4c49444f3a2052454445454d5f414d4f554e545f455843454544535f42414c416044820152624e434560e81b60648201526084016107d2565b612f443382613fdb565b508160056000828254612f57919061591b565b925050819055508160076000828254612f7091906158ed565b90915550506019546040516301e9a69560e41b81526001600160a01b0390911690631e9a695090612fa79033908690600401615bb6565b600060405180830381600087803b158015612fc157600080fd5b505af1158015612fd5573d6000803e3d6000fd5b505060405184815260009250339150600080516020615e0c8339815191529060200160405180910390a360405182815233907f4896181ff8f4543cc00db9fe9b6fb7e6f032b7eb772c72ab1ec1b4d2e03b936990602001612d40565b600a54600b5460609160009161304791906158ed565b6001600160401b0381111561305e5761305e615905565b604051908082528060200260200182016040528015613087578160200160208202803683370190505b50905060005b600a54600b5461309d91906158ed565b811015610c3057600b5481106130e757600b54600a906130bd908361591b565b815481106130cd576130cd615932565b6000918252602090912001546001600160a01b0316613110565b600b81815481106130fa576130fa615932565b6000918252602090912001546001600160a01b03165b82828151811061312257613122615932565b6001600160a01b03909216602092830291909101909101528061314481615948565b91505061308d565b336000908152601c602052604090205460ff1661317b5760405162461bcd60e51b81526004016107d290615af6565b60408051608081018252601e5461ffff808216835262010000820481166020840152600160201b82048116938301849052600160301b909104166060820181905290916000916131ca91615a0d565b61ffff169050600081116131e0576131e0615bcf565b83600560008282546131f291906158ed565b909155505033600090815260086020526040812080548692906132169084906158ed565b9091555050336000908152600960205260408120805486929061323a9084906158ed565b9091555050602082015160009061325390612710615be5565b61ffff166132618387615b49565b61326b9190615b7e565b905060008161327960055490565b613283919061591b565b9050600061329060055490565b905081156132b957816132a260035490565b6132ac9085615b49565b6132b69190615b7e565b90505b6016546132cf906001600160a01b031682614101565b50600084866040015161ffff16836132e79190615b49565b6132f19190615b7e565b601654601554919250613311916001600160a01b039182169116836141d7565b601554613327906001600160a01b03168261436a565b601654613346906001600160a01b0316613341838561591b565b61436a565b7f61953b03ced70bb23c53b5a7058e431e3db88cf84a72660faea0849b785c43bd33898960405161337993929190615ad5565b60405180910390a15050505050505050565b336000908152601c602052604090205460ff166133ba5760405162461bcd60e51b81526004016107d290615af6565b336000908152600860209081526040808320546009909252909120546133e19083906158ed565b111561342f5760405162461bcd60e51b815260206004820152601d60248201527f4c49444f3a204c45444745525f4e4f545f454e4f5547485f5354414b4500000060448201526064016107d2565b336000908152600960205260408120805483929061344e9084906158ed565b9091555050600d5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906134859033908590600401615bb6565b6020604051808303816000875af11580156134a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fde9190615816565b600f54604051633bfc46cb60e21b81527fe6f5d3a94b3b2e5137a1b6bff43c8dde49b099cd4958238240e4ab304e4a2b68916001600160a01b03169063eff11b2c9061351a90849033906004016157ff565b602060405180830381865afa158015613537573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355b9190615816565b6135775760405162461bcd60e51b81526004016107d290615833565b6001600160a01b0382166135cd5760405162461bcd60e51b815260206004820181905260248201527f4c49444f3a20494e434f52524543545f54524541535552595f4144445245535360448201526064016107d2565b50601680546001600160a01b0319166001600160a01b0392909216919091179055565b600f54604051633bfc46cb60e21b8152600080516020615d8c833981519152916001600160a01b03169063eff11b2c9061363090849033906004016157ff565b602060405180830381865afa15801561364d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136719190615816565b61368d5760405162461bcd60e51b81526004016107d290615833565b610fde82613de6565b600061088982613d73565b600f54604051633bfc46cb60e21b8152600080516020615dac833981519152916001600160a01b03169063eff11b2c906136e190849033906004016157ff565b602060405180830381865afa1580156136fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137229190615816565b61373e5760405162461bcd60e51b81526004016107d290615833565b6001600160a01b0382166137945760405162461bcd60e51b815260206004820152601f60248201527f4c49444f3a20494e434f52524543545f464143544f52595f414444524553530060448201526064016107d2565b50601880546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b031633146138105760405162461bcd60e51b815260206004820152601c60248201527b2624a2279d102727aa2fa32927a6afa7a920a1a622afa6a0a9aa22a960211b60448201526064016107d2565b601960009054906101000a90046001600160a01b03166001600160a01b0316637b2077276040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561386057600080fd5b505af1158015613874573d6000803e3d6000fd5b505050506138806143a3565b565b60005460ff166138cb5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107d2565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405161390591906154ab565b60405180910390a1565b60005460ff16156139325760405162461bcd60e51b81526004016107d290615894565b6001600160a01b0383166139845760405162461bcd60e51b8152602060048201526019602482015278415050524f56455f46524f4d5f5a45524f5f4144445245535360381b60448201526064016107d2565b6001600160a01b0382166139d45760405162461bcd60e51b8152602060048201526017602482015276415050524f56455f544f5f5a45524f5f4144445245535360481b60448201526064016107d2565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000613a4082612a9b565b9050613a4d8484836141d7565b826001600160a01b0316846001600160a01b0316600080516020615e0c83398151915284604051613a8091815260200190565b60405180910390a350505050565b60005b600a54600b54613aa191906158ed565b811015613b9f57600b546000908210613aee57600b54600a90613ac4908461591b565b81548110613ad457613ad4615932565b6000918252602090912001546001600160a01b0316613b17565b600b8281548110613b0157613b01615932565b6000918252602090912001546001600160a01b03165b60405163416acf8b60e11b81526001600160801b03808816600483015286166024820152604481018590529091506001600160a01b038216906382d59f1690606401600060405180830381600087803b158015613b7357600080fd5b505af1158015613b87573d6000803e3d6000fd5b50505050508080613b9790615948565b915050613a91565b50505050565b6000805460ff1615613bc95760405162461bcd60e51b81526004016107d290615894565b600c5482600554613bda91906158ed565b10613c235760405162461bcd60e51b815260206004820152601960248201527804c49444f3a204445504f534954535f4558434545445f43415603c1b60448201526064016107d2565b600d546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90613c5790339030908790600401615b25565b6020604051808303816000875af1158015613c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c9a9190615816565b5081613cdd5760405162461bcd60e51b815260206004820152601260248201527113125113ce8816915493d7d1115413d4d25560721b60448201526064016107d2565b6000613ce883612a9b565b905080613cf25750815b8260056000828254613d0491906158ed565b925050819055508260066000828254613d1d91906158ed565b90915550613d2d90503382614101565b50613d38338261436a565b60405183815233907f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c49060200160405180910390a292915050565b6001600160a01b031660009081526001602052604090205490565b60005460ff1615613db15760405162461bcd60e51b81526004016107d290615894565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586138f83390565b6001600160a01b0381166000908152601c602052604090205460ff16613e475760405162461bcd60e51b815260206004820152601660248201527513125113ce8813115111d15497d393d517d193d5539160521b60448201526064016107d2565b6000613e548260016146ea565b9050600019811415613ea35760405162461bcd60e51b815260206004820152601860248201527713125113ce8813115111d15497d393d517d153905093115160421b60448201526064016107d2565b600b805460009190613eb79060019061591b565b81548110613ec757613ec7615932565b600091825260209091200154600b80546001600160a01b039092169250829184908110613ef657613ef6615932565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600b805480613f3557613f35615c08565b600082815260208120600019908301810180546001600160a01b03199081169091559201909255600a805460018101825592527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a890910180549091166001600160a01b0385161790556040517f85accaad76657cef23e292273789ae7a13d87db42feff1d70d4056c20d78d07190613fce9085906154ab565b60405180910390a1505050565b6000805460ff1615613fff5760405162461bcd60e51b81526004016107d290615894565b6001600160a01b0383166140525760405162461bcd60e51b815260206004820152601a6024820152794255524e5f46524f4d5f5448455f5a45524f5f4144445245535360301b60448201526064016107d2565b6001600160a01b038316600090815260016020526040902054808311156140b95760405162461bcd60e51b815260206004820152601b60248201527a4255524e5f414d4f554e545f455843454544535f42414c414e434560281b60448201526064016107d2565b826140c360035490565b6140cd919061591b565b600381905591506140de838261591b565b6001600160a01b0390941660009081526001602052604090209390935592915050565b6000805460ff16156141255760405162461bcd60e51b81526004016107d290615894565b6001600160a01b0383166141765760405162461bcd60e51b81526020600482015260186024820152774d494e545f544f5f5448455f5a45524f5f4144445245535360401b60448201526064016107d2565b8161418060035490565b61418a91906158ed565b60038190556001600160a01b0384166000908152600160205260409020549091506141b69083906158ed565b6001600160a01b039093166000908152600160205260409020929092555090565b60005460ff16156141fa5760405162461bcd60e51b81526004016107d290615894565b6001600160a01b0383166142505760405162461bcd60e51b815260206004820152601e60248201527f5452414e534645525f46524f4d5f5448455f5a45524f5f41444452455353000060448201526064016107d2565b6001600160a01b0382166142a55760405162461bcd60e51b815260206004820152601c60248201527b5452414e534645525f544f5f5448455f5a45524f5f4144445245535360201b60448201526064016107d2565b6001600160a01b0383166000908152600160205260409020548082111561430e5760405162461bcd60e51b815260206004820152601f60248201527f5452414e534645525f414d4f554e545f455843454544535f42414c414e43450060448201526064016107d2565b614318828261591b565b6001600160a01b0380861660009081526001602052604080822093909355908516815220546143489083906158ed565b6001600160a01b03909316600090815260016020526040902092909255505050565b6001600160a01b0382166000600080516020615e0c83398151915261438e84611fce565b60405190815260200160405180910390a35050565b6000805b600a54600b546143b791906158ed565b81101561456b57600b54600090821061440457600b54600a906143da908461591b565b815481106143ea576143ea615932565b6000918252602090912001546001600160a01b031661442d565b600b828154811061441757614417615932565b6000918252602090912001546001600160a01b03165b6001600160a01b038116600090815260096020908152604080832054600890925290912054919250101561455a576001600160a01b0381166000908152600960209081526040808320546008909252822054614489919061591b565b600654600d546040516370a0823160e01b815292935090916001600160a01b03909116906370a08231906144c19030906004016154ab565b602060405180830381865afa1580156144de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061450291906158be565b61450c919061591b565b61451682866158ed565b116145585761452581856158ed565b6001600160a01b03831660009081526008602052604081208054929650839290919061455290849061591b565b90915550505b505b5061456481615948565b90506143a7565b50806006600082825461457e91906158ed565b909155505060065415158061459557506000600754115b156107e357600a54158015906145ad57506000600754115b156145c1576145bd6007546147ab565b6007555b60006006541180156145d557506000600754115b156146a1576000600754600654116145ef576006546145f3565b6007545b90508060066000828254614607919061591b565b925050819055508060076000828254614620919061591b565b9091555050600d5460195460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb9261465b929116908590600401615bb6565b6020604051808303816000875af115801561467a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061469e9190615816565b50505b600b54156107e35760006146b66007546149a6565b6146c16006546149a6565b6146cb9190615c1e565b905080156146dc576146dc81614a10565b506000600681905560075550565b600080826146fa57600a546146fe565b600b545b905060005b8181101561479f5760008461473f57600a828154811061472557614725615932565b6000918252602090912001546001600160a01b0316614768565b600b828154811061475257614752615932565b6000918252602090912001546001600160a01b03165b9050856001600160a01b0316816001600160a01b0316141561478e575091506108899050565b5061479881615948565b9050614703565b50600019949350505050565b600a54600090806147be576147be615bcf565b60008060005b8381101561486857601d6000600a83815481106147e3576147e3615932565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff166148585760086000600a838154811061482657614826615932565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461485590846158ed565b92505b61486181615948565b90506147c4565b50816148775750929392505050565b60005b8381101561499257601d6000600a838154811061489957614899615932565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1661498257600060086000600a84815481106148de576148de615932565b60009182526020808320909101546001600160a01b03168352820192909252604001812054915084614910838a615b49565b61491a9190615b7e565b9050818111614929578061492b565b815b9050614937818361591b565b60086000600a868154811061494e5761494e615932565b60009182526020808320909101546001600160a01b0316835282019290925260400190205561497d81856158ed565b935050505b61498b81615948565b905061487a565b5061499d818661591b565b95945050505050565b6000600160ff1b8210614a0c5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016107d2565b5090565b600b5480614a2057614a20615bcf565b6000816001600160401b03811115614a3a57614a3a615905565b604051908082528060200260200182016040528015614a63578160200160208202803683370190505b5090506000826001600160401b03811115614a8057614a80615905565b604051908082528060200260200182016040528015614aa9578160200160208202803683370190505b5090506000836001600160401b03811115614ac657614ac6615905565b604051908082528060200260200182016040528015614aef578160200160208202803683370190505b5090506000846001600160401b03811115614b0c57614b0c615905565b604051908082528060200260200182016040528015614b35578160200160208202803683370190505b509050600080600080602160029054906101000a900460ff168015614b615750602154610100900460ff165b15614bd05760055460075414614bc85760405162461bcd60e51b815260206004820152602660248201527f4c49444f3a2042554646455245445f52454445454d535f5345545f494e434f52604482015265524543544c5960d01b60648201526084016107d2565b506000614be6565b88614bd961088f565b614be39190615b7e565b90505b6000805b8a811015614d8f57600b8181548110614c0557614c05615932565b9060005260206000200160009054906101000a90046001600160a01b0316898281518110614c3557614c35615932565b60200260200101906001600160a01b031690816001600160a01b031681525050600860008a8381518110614c6b57614c6b615932565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054888281518110614ca657614ca6615932565b602002602001018181525050600860008a8381518110614cc857614cc8615932565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054878281518110614d0357614d03615932565b602002602001018181525050878181518110614d2157614d21615932565b602002602001015183614d349190615c1e565b91506000614d42838e615c5d565b1315614d5557614d528287615ce2565b95505b818a8281518110614d6857614d68615932565b6020908102919091010152614d7d8285615ce2565b9350614d8881615948565b9050614bea565b5050811580614d9c575083155b15614dad5750505050505050505050565b60016000851215614dc85750600019614dc585615d23565b94505b60005b8a811015614f02578160000b8a8281518110614de957614de9615932565b60200260200101818151614dfd9190615c5d565b90525089516000908b9083908110614e1757614e17615932565b60200260200101511315614ef2576000868d8c8481518110614e3b57614e3b615932565b6020026020010151614e4d9190615c5d565b614e579190615d40565b90506000818a8481518110614e6e57614e6e615932565b6020026020010151614e809190615ce2565b905080600860008d8681518110614e9957614e99615932565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550808a8481518110614ed857614ed8615932565b6020908102919091010152614eed8288615ce2565b965050505b614efb81615948565b9050614dcb565b506000614f0f858d615c1e565b90506000811315614f745780600860008b600081518110614f3257614f32615932565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000828254614f6991906158ed565b909155506150529050565b60008112156150525760005b8b81108015614f8f5750600082125b15615050576000898281518110614fa857614fa8615932565b60200260200101519050600081111561503f576000614fc684615d23565b8211614fd25781614fdb565b614fdb84615d23565b905080600860008e8681518110614ff457614ff4615932565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461502b919061591b565b9091555061503b90508185615ce2565b9350505b5061504981615948565b9050614f80565b505b506000805b8b8110156152a35760008a828151811061507357615073615932565b60200260200101516001600160a01b031663a5baabf06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156150b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150dc9190615d6e565b6001600160801b0316600960008d85815181106150fb576150fb615932565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461512e919061591b565b905088828151811061514257615142615932565b6020026020010151811180156151ae575088828151811061516557615165615932565b6020026020010151600860008d858151811061518357615183615932565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054115b156152925780600860008d85815181106151ca576151ca615932565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054116152605788828151811061520a5761520a615932565b6020026020010151600860008d858151811061522857615228615932565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461525b919061591b565b615285565b88828151811061527257615272615932565b602002602001015181615285919061591b565b61528f90846158ed565b92505b5061529c81615948565b9050615057565b50801561532557600d5460195460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926152e0929116908590600401615bb6565b6020604051808303816000875af11580156152ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153239190615816565b505b505050505050505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b600060208083528351808285015260005b818110156153875785810183015185820160400152820161536b565b81811115615399576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146107e357600080fd5b600080604083850312156153d757600080fd5b82356153e2816153af565b946020939093013593505050565b60006020828403121561540257600080fd5b813561200e816153af565b6020808252825182820181905260009190848201906040850190845b8181101561544557835183529284019291840191600101615429565b50909695505050505050565b60008060006060848603121561546657600080fd5b8335615471816153af565b92506020840135615481816153af565b929592945050506040919091013590565b6000602082840312156154a457600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80151581146107e357600080fd5b600080604083850312156154e057600080fd5b82356153e2816154bf565b600060808284031215610c3057600080fd5b6001600160801b03811681146107e357600080fd5b60008060008060008060008060006101208a8c03121561553157600080fd5b893561553c816153af565b985060208a013561554c816153af565b975060408a013561555c816153af565b965060608a013561556c816153af565b955060808a013561557c816153af565b945060a08a013561558c816153af565b935060c08a013561559c816153af565b925060e08a013591506101008a01356155b4816154fd565b809150509295985092959850929598565b60008083601f8401126155d757600080fd5b5081356001600160401b038111156155ee57600080fd5b6020830191508360208260051b850101111561560957600080fd5b9250929050565b6000806000806040858703121561562657600080fd5b84356001600160401b038082111561563d57600080fd5b615649888389016155c5565b9096509450602087013591508082111561566257600080fd5b5061566f878288016155c5565b95989497509550505050565b61ffff811681146107e357600080fd5b6000806000606084860312156156a057600080fd5b833592506020840135915060408401356156b98161567b565b809150509250925092565b6000602082840312156156d657600080fd5b813561200e816154fd565b600080604083850312156156f457600080fd5b50508035926020909101359150565b6000806040838503121561571657600080fd5b823591506020830135615728816153af565b809150509250929050565b60008060006060848603121561574857600080fd5b83356157538161567b565b925060208401356157638161567b565b915060408401356156b98161567b565b60006020828403121561578557600080fd5b813561200e816154bf565b600080604083850312156157a357600080fd5b82356157ae816153af565b91506020830135615728816153af565b6020808252825182820181905260009190848201906040850190845b818110156154455783516001600160a01b0316835292840192918401916001016157da565b9182526001600160a01b0316602082015260400190565b60006020828403121561582857600080fd5b815161200e816154bf565b60208082526012908201527113125113ce8815539055551213d49256915160721b604082015260600190565b600181811c9082168061587357607f821691505b60208210811415610c3057634e487b7160e01b600052602260045260246000fd5b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6000602082840312156158d057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115615900576159006158d7565b500190565b634e487b7160e01b600052604160045260246000fd5b60008282101561592d5761592d6158d7565b500390565b634e487b7160e01b600052603260045260246000fd5b600060001982141561595c5761595c6158d7565b5060010190565b60006020828403121561597557600080fd5b813561200e8161567b565b813561598b8161567b565b61ffff8116905081548161ffff19821617835560208401356159ac816154fd565b6001600160901b03199190911690911760109190911b62010000600160901b03161781556001810160408301356159e2816154fd565b81546001600160801b0319166001600160801b03919091161790556060919091013560029190910155565b600061ffff808316818516808303821115615a2a57615a2a6158d7565b01949350505050565b6000808335601e19843603018112615a4a57600080fd5b8301803591506001600160401b03821115615a6457600080fd5b6020019150600581901b360382131561560957600080fd5b6020808252810182905260006001600160fb1b03831115615a9c57600080fd5b8260051b80856040850137600092016040019182525092915050565b600060208284031215615aca57600080fd5b815161200e816153af565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252601590820152742624a2279d102727aa2fa32927a6afa622a223a2a960591b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6000816000190483118215151615615b6357615b636158d7565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615b8d57615b8d615b68565b500490565b60008060408385031215615ba557600080fd5b505080516020909101519092909150565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052600160045260246000fd5b600061ffff83811690831681811015615c0057615c006158d7565b039392505050565b634e487b7160e01b600052603160045260246000fd5b60008083128015600160ff1b850184121615615c3c57615c3c6158d7565b6001600160ff1b0384018313811615615c5757615c576158d7565b50500390565b60006001600160ff1b0381841382841380821686840486111615615c8357615c836158d7565b600160ff1b6000871282811687830589121615615ca257615ca26158d7565b60008712925087820587128484161615615cbe57615cbe6158d7565b87850587128184161615615cd457615cd46158d7565b505050929093029392505050565b600080821280156001600160ff1b0384900385131615615d0457615d046158d7565b600160ff1b8390038412811615615d1d57615d1d6158d7565b50500190565b6000600160ff1b821415615d3957615d396158d7565b5060000390565b600082615d4f57615d4f615b68565b600160ff1b821460001984141615615d6957615d696158d7565b500590565b600060208284031215615d8057600080fd5b815161200e816154fd56fe585c6e254ec74f8e72b5cff099811ed8721d9039f710d9a1cb67eed6c74aa8279336eb28e461adb6ba7e620f5006a6952a65a21a4db92c2edb104bf7f1c38c63d8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426ad76e3374742c17bd14ffaf46cd349ec292baf7d8425512fa8fe132557a4c967bddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d121a6c6aa8ff56232ce49a2146199d43ec0e6548a229d5e808a0acf0129c87064736f6c634300080a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a95760003560e01c8063046f7da2146102ae57806306fdde03146102b8578063095ea7b3146102d657806318160ddd146102f95780631a813a3c1461030f5780631ab81cba146103175780631d55fde41461032a57806323b872dd1461033f578063240359bc14610352578063251bc88b14610388578063313ce5671461039b57806338dee1d3146103b057806339509351146103c35780633ca3bca3146103d65780633fd2c16a146103e957806341c262c5146103fc578063473764731461040f57806348c696c0146104225780634fe28e3a1461042b5780635c975abb1461043e5780635e442a9b146104495780635f3f2cac1461046957806361f9c3da1461047c57806363ca402d1461048f5780636a92b586146104a25780636e553f65146104cd57806370a08231146104e057806373ece435146104f357806377c96574146105065780638456cb591461052e57806386651203146105365780638ab476bf1461054957806395d89b411461055c5780639e0c970414610564578063a1e206c714610577578063a457c2d71461058a578063a9042441146102f9578063a9059cbb1461059d578063b09f5320146105b0578063b31207f2146105b9578063b6b55f25146105cc578063cdd8f598146105df578063d0564dce146105f2578063d4a486d0146105fa578063d5002f2e1461060d578063db006a7514610615578063dbd5edc714610628578063dd62ed3e14610631578063df1979561461066a578063df6c39fb1461067f578063e100610714610692578063e40b9255146106a5578063ec70d800146106ae578063f0f44260146106c1578063f1447195146106d4578063f339a70d146106f4578063f5eb42dc14610707578063f7eba4201461071a578063fa597e071461072d575b600080fd5b6102b6610735565b005b6102c06107e6565b6040516102cd919061535a565b60405180910390f35b6102e96102e43660046153c4565b610878565b60405190151581526020016102cd565b61030161088f565b6040519081526020016102cd565b6102b661089f565b6102b66103253660046153f0565b61095f565b610332610aba565b6040516102cd919061540d565b6102e961034d366004615451565b610c36565b61037b610360366004615492565b6000908152601b60205260409020546001600160a01b031690565b6040516102cd91906154ab565b6102b66103963660046154cd565b610cde565b60215460405160ff90911681526020016102cd565b6102b66103be3660046154eb565b610e32565b6102e96103d13660046153c4565b610fe2565b6102b66103e4366004615512565b611019565b60115461037b906001600160a01b031681565b6102b661040a366004615610565b6114c2565b6102b661041d3660046153f0565b61178e565b61030160075481565b61037b61043936600461568b565b6118a4565b60005460ff166102e9565b6103016104573660046153f0565b60096020526000908152604090205481565b6102b66104773660046156c4565b611d4c565b6102b661048a3660046156e1565b611e76565b61030161049d366004615492565b611fce565b601a546104b5906001600160801b031681565b6040516001600160801b0390911681526020016102cd565b6103016104db366004615703565b612015565b6103016104ee3660046153f0565b61207b565b6102b6610501366004615733565b612089565b6105196105143660046153f0565b612293565b604080519283526020830191909152016102cd565b6102b6612311565b6102b6610544366004615492565b6123b6565b6102b66105573660046153f0565b6124a3565b6102c06125d6565b6102b66105723660046156e1565b6125e5565b600f5461037b906001600160a01b031681565b6102e96105983660046153c4565b612a01565b6102e96105ab3660046153c4565b612a8e565b61030160065481565b6103016105c7366004615492565b612a9b565b6103016105da366004615492565b612ac1565b6102b66105ed3660046153f0565b612acc565b6102b6612bc5565b6102b6610608366004615773565b612d4c565b610301612e04565b6102b6610623366004615492565b612e0f565b610301600c5481565b61030161063f366004615790565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b610672613031565b6040516102cd91906157be565b6102b661068d3660046156e1565b61314c565b6102b66106a0366004615492565b61338b565b61030160055481565b60175461037b906001600160a01b031681565b6102b66106cf3660046153f0565b6134c8565b6103016106e23660046153f0565b60086020526000908152604090205481565b6102b66107023660046153f0565b6135f0565b6103016107153660046153f0565b613696565b6102b66107283660046153f0565b6136a1565b6102b66137b7565b600f54604051633bfc46cb60e21b8152600080516020615dec833981519152916001600160a01b03169063eff11b2c9061077590849033906004016157ff565b602060405180830381865afa158015610792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b69190615816565b6107db5760405162461bcd60e51b81526004016107d290615833565b60405180910390fd5b6107e3613882565b50565b6060601f80546107f59061585f565b80601f01602080910402602001604051908101604052809291908181526020018280546108219061585f565b801561086e5780601f106108435761010080835404028352916020019161086e565b820191906000526020600020905b81548152906001019060200180831161085157829003601f168201915b5050505050905090565b600061088533848461390f565b5060015b92915050565b600061089a60055490565b905090565b60005460ff16156108c25760405162461bcd60e51b81526004016107d290615894565b601954604051630f41a04d60e11b81526000916001600160a01b031690631e83409a906108f39033906004016154ab565b6020604051808303816000875af1158015610912573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093691906158be565b6040518181529091503390600080516020615dcc8339815191529060200160405180910390a250565b600f54604051633bfc46cb60e21b8152600080516020615d8c833981519152916001600160a01b03169063eff11b2c9061099f90849033906004016157ff565b602060405180830381865afa1580156109bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e09190615816565b6109fc5760405162461bcd60e51b81526004016107d290615833565b6001600160a01b0382166000908152601d602052604090205460ff16610a5e5760405162461bcd60e51b815260206004820152601760248201527613125113ce8813115111d15497d393d517d4105554d151604a1b60448201526064016107d2565b6001600160a01b0382166000908152601d602052604090819020805460ff19169055517f8c097d4c8d964b147a04f3a822a31e3aa5a9104dc7db3dde0166a248b8f106c590610aae9084906154ab565b60405180910390a15050565b600a54600b54606091600091610ad091906158ed565b6001600160401b03811115610ae757610ae7615905565b604051908082528060200260200182016040528015610b10578160200160208202803683370190505b50905060005b600a54600b54610b2691906158ed565b811015610c3057600b546000908210610b7357600b54600a90610b49908461591b565b81548110610b5957610b59615932565b6000918252602090912001546001600160a01b0316610b9c565b600b8281548110610b8657610b86615932565b6000918252602090912001546001600160a01b03165b9050806001600160a01b031663231aebf26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0091906158be565b838381518110610c1257610c12615932565b60209081029190910101525080610c2881615948565b915050610b16565b50919050565b6001600160a01b038316600090815260026020908152604080832033845290915281205482811015610cb45760405162461bcd60e51b815260206004820152602160248201527f5452414e534645525f414d4f554e545f455843454544535f414c4c4f57414e436044820152604560f81b60648201526084016107d2565b610cbf858585613a35565b610cd38533610cce868561591b565b61390f565b506001949350505050565b602154610100900460ff16610d2c5760405162461bcd60e51b815260206004820152601460248201527313125113ce8814915111515357d153905093115160621b60448201526064016107d2565b600f54604051633bfc46cb60e21b8152600080516020615dac833981519152916001600160a01b03169063eff11b2c90610d6c90849033906004016157ff565b602060405180830381865afa158015610d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dad9190615816565b610dc95760405162461bcd60e51b81526004016107d290615833565b600554821115610e115760405162461bcd60e51b81526020600482015260136024820152724c49444f3a2056414c55455f544f4f5f42494760681b60448201526064016107d2565b5060218054921515620100000262ff00001990931692909217909155600755565b600f54604051633bfc46cb60e21b81527f2c204f3ef59cc164f843cf6919920470e37721ba425db7893d02e60cfd0bafdc916001600160a01b03169063eff11b2c90610e8490849033906004016157ff565b602060405180830381865afa158015610ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec59190615816565b610ee15760405162461bcd60e51b81526004016107d290615833565b6000610ef06020840184615963565b61ffff1611610f4d5760405162461bcd60e51b815260206004820152602360248201527f4c49444f3a204241445f4d41585f56414c494441544f52535f5045525f4c454460448201526223a2a960e91b60648201526084016107d2565b6000826060013511610fa15760405162461bcd60e51b815260206004820152601e60248201527f4c49444f3a204241445f4d41585f554e4c4f434b494e475f4348554e4b53000060448201526064016107d2565b816012610fae8282615980565b50610fde9050610fc460408401602085016156c4565b610fd460608501604086016156c4565b8460600135613a8e565b5050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610885918590610cce9086906158ed565b600454610100900460ff1680611032575060045460ff16155b6110955760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107d2565b600454610100900460ff161580156110b7576004805461ffff19166101011790555b600083116110f85760405162461bcd60e51b815260206004820152600e60248201526d04c49444f3a205a45524f5f4341560941b60448201526064016107d2565b6001600160a01b03891661114d5760405162461bcd60e51b815260206004820152601c60248201527b4c49444f3a20494e434f52524543545f564b534d5f4144445245535360201b60448201526064016107d2565b6001600160a01b0385166111b15760405162461bcd60e51b815260206004820152602560248201527f4c49444f3a20494e434f52524543545f4f5241434c455f4d41535445525f4144604482015264445245535360d81b60648201526084016107d2565b6001600160a01b0384166112125760405162461bcd60e51b815260206004820152602260248201527f4c49444f3a20494e434f52524543545f5749544844524157414c5f4144445245604482015261535360f01b60648201526084016107d2565b6001600160a01b038a166112745760405162461bcd60e51b815260206004820152602360248201527f4c49444f3a20494e434f52524543545f415554484d414e414745525f4144445260448201526245535360e81b60648201526084016107d2565b6001600160a01b0388166112d55760405162461bcd60e51b815260206004820152602260248201527f4c49444f3a20494e434f52524543545f434f4e54524f4c4c45525f4144445245604482015261535360f01b60648201526084016107d2565b600d80546001600160a01b03808c166001600160a01b031992831617909255600e80548b8416908316179055600f8054928d1692909116919091179055600c83905560c8601055611324615333565b61032061133360c86000615a0d565b61133d9190615a0d565b61ffff168082526000602083015260c86040808401919091526103206060840152601e805465ffffffffffff1916909217601960231b1761ffff60301b1916601960351b17909155601680546001600160a01b03199081166001600160a01b038b8116919091179092556015805482168c84161790556011805490911691891691821790559051637d774e3160e01b8152637d774e31906113e29030906004016154ab565b600060405180830381600087803b1580156113fc57600080fd5b505af1158015611410573d6000803e3d6000fd5b5050601980546001600160a01b0319166001600160a01b03891690811790915560405163015cda1760e41b81529092506315cda17091506114559030906004016154ab565b600060405180830381600087803b15801561146f57600080fd5b505af1158015611483573d6000803e3d6000fd5b5050601a80546001600160801b0319166001600160801b0387161790555050811590506114b6576004805461ff00191690555b50505050505050505050565b600f54604051633bfc46cb60e21b81527fdefdc47e8c8311059971baa7eda778fd22d6ea93a75a917e77534b8ce74fe4f9916001600160a01b03169063eff11b2c9061151490849033906004016157ff565b602060405180830381865afa158015611531573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115559190615816565b6115715760405162461bcd60e51b81526004016107d290615833565b8382146115b85760405162461bcd60e51b815260206004820152601560248201527413125113ce88125390d3d4949150d517d253941555605a1b60448201526064016107d2565b60005b84811015611786576000601b818888858181106115da576115da615932565b60209081029290920135835250810191909152604001600020546001600160a01b031614156116495760405162461bcd60e51b815260206004820152601b60248201527a13125113ce88155392d393d5d397d4d51054d217d050d0d3d55395602a1b60448201526064016107d2565b60125461ffff1684848381811061166257611662615932565b90506020028101906116749190615a33565b905011156116c45760405162461bcd60e51b815260206004820152601f60248201527f4c49444f3a2056414c494441544f52535f414d4f554e545f544f4f5f4249470060448201526064016107d2565b601b60008787848181106116da576116da615932565b60209081029290920135835250810191909152604001600020546001600160a01b031663f5330e9685858481811061171457611714615932565b90506020028101906117269190615a33565b6040518363ffffffff1660e01b8152600401611743929190615a7c565b600060405180830381600087803b15801561175d57600080fd5b505af1158015611771573d6000803e3d6000fd5b505050508061177f90615948565b90506115bb565b505050505050565b600f54604051633bfc46cb60e21b8152600080516020615dac833981519152916001600160a01b03169063eff11b2c906117ce90849033906004016157ff565b602060405180830381865afa1580156117eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180f9190615816565b61182b5760405162461bcd60e51b81526004016107d290615833565b6001600160a01b0382166118815760405162461bcd60e51b815260206004820152601e60248201527f4c49444f3a20494e434f52524543545f424541434f4e5f41444452455353000060448201526064016107d2565b50601780546001600160a01b0319166001600160a01b0392909216919091179055565b600f54604051633bfc46cb60e21b8152600091600080516020615d8c833981519152916001600160a01b039091169063eff11b2c906118e990849033906004016157ff565b602060405180830381865afa158015611906573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192a9190615816565b6119465760405162461bcd60e51b81526004016107d290615833565b6017546001600160a01b031661199e5760405162461bcd60e51b815260206004820152601f60248201527f4c49444f3a20554e5350454349464945445f4c45444745525f424541434f4e0060448201526064016107d2565b6018546001600160a01b03166119f65760405162461bcd60e51b815260206004820181905260248201527f4c49444f3a20554e5350454349464945445f4c45444745525f464143544f525960448201526064016107d2565b6011546001600160a01b0316611a475760405162461bcd60e51b81526020600482015260166024820152752624a2279d102727afa7a920a1a622afa6a0a9aa22a960511b60448201526064016107d2565b601054600a54600b54611a5a91906158ed565b10611aa25760405162461bcd60e51b815260206004820152601860248201527713125113ce8813115111d15494d7d413d3d317d31253525560421b60448201526064016107d2565b6000858152601b60205260409020546001600160a01b031615611b045760405162461bcd60e51b815260206004820152601a6024820152794c49444f3a2053544153485f414c52454144595f45584953545360301b60448201526064016107d2565b601854600d54600e5460125460135460145460405163776aecef60e11b8152600481018c9052602481018b90526001600160a01b0395861660448201529385166064850152620100009092046001600160801b0390811660848501521660a483015260c4820152600092919091169063eed5d9de9060e4016020604051808303816000875af1158015611b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbf9190615ab8565b600b805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b038085166001600160a01b0319928316811790935560008b8152601b6020908152604080832080549095168617909455938152601c90935291819020805460ff191690931790925560115491516327c13a6b60e21b81529293501690639f04e9ac90611c669084906004016154ab565b600060405180830381600087803b158015611c8057600080fd5b505af1158015611c94573d6000803e3d6000fd5b5050600e54604051639632acf760e01b815261ffff88166004820152602481018a90526001600160a01b0385811660448301529091169250639632acf79150606401600060405180830381600087803b158015611cf057600080fd5b505af1158015611d04573d6000803e3d6000fd5b505050507f4522989a180263bb7fbc1471718de7bdd69a5d36b5d29511958afa11d2e9da04818787604051611d3b93929190615ad5565b60405180910390a195945050505050565b600f54604051633bfc46cb60e21b8152600080516020615dac833981519152916001600160a01b03169063eff11b2c90611d8c90849033906004016157ff565b602060405180830381865afa158015611da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcd9190615816565b611de95760405162461bcd60e51b81526004016107d290615833565b6000826001600160801b031611611e535760405162461bcd60e51b815260206004820152602860248201527f4c49444f3a20494e434f52524543545f4d41585f414c4c4f5741424c455f444960448201526746464552454e434560c01b60648201526084016107d2565b50601a80546001600160801b0319166001600160801b0392909216919091179055565b336000908152601c602052604090205460ff16611ea55760405162461bcd60e51b81526004016107d290615af6565b8015611f2957600d546016546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92611ee4923392909116908690600401615b25565b6020604051808303816000875af1158015611f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f279190615816565b505b3360009081526009602052604081208054849290611f4890849061591b565b9091555050600d546019546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92611f86923392909116908790600401615b25565b6020604051808303816000875af1158015611fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc99190615816565b505050565b600080611fda60035490565b905060035460001415611ff05750600092915050565b80611ffa60055490565b6120049085615b49565b61200e9190615b7e565b9392505050565b60008061202184613ba5565b604080513381526001600160a01b0386166020820152908101869052606081018290529091507f90f46099733ed637df811df4fcc5cae4961192ca04f36da9ab64b4dd8dc9b7f59060800160405180910390a19392505050565b600061088961049d83613d73565b600f54604051633bfc46cb60e21b81527f0fc26914248bb9568b0afb008dd993637f6fb6bdc9598c222c68a21e90ca53c1916001600160a01b03169063eff11b2c906120db90849033906004016157ff565b602060405180830381865afa1580156120f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211c9190615816565b6121385760405162461bcd60e51b81526004016107d290615833565b612140615333565b8261214b8686615a0d565b6121559190615a0d565b61ffff168082526127101080159061217f575060008461ffff16118061217f575060008361ffff16115b801561219057506127108561ffff16105b6121d45760405162461bcd60e51b815260206004820152601560248201527404c49444f3a204645455f444f4e545f4144445f555605c1b60448201526064016107d2565b80516040805161ffff92831681528783166020820152868316818301529185166060830152517fb01998f6d1382c5b6c7a4b477769ce2ffbbb91adc291994665b24def9a47e4509181900360800190a161ffff9283166040820181905294831660208201819052938316606082018190529051601e80549190941663ffffffff1990911617620100009094029390931763ffffffff60201b1916600160201b90940261ffff60301b191693909317600160301b90920291909117905550565b601954604051630aff799160e41b815260009182916001600160a01b039091169063aff79910906122c89086906004016154ab565b6040805180830381865afa1580156122e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123089190615b92565b91509150915091565b600f54604051633bfc46cb60e21b8152600080516020615dec833981519152916001600160a01b03169063eff11b2c9061235190849033906004016157ff565b602060405180830381865afa15801561236e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123929190615816565b6123ae5760405162461bcd60e51b81526004016107d290615833565b6107e3613d8e565b600f54604051633bfc46cb60e21b8152600080516020615dec833981519152916001600160a01b03169063eff11b2c906123f690849033906004016157ff565b602060405180830381865afa158015612413573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124379190615816565b6124535760405162461bcd60e51b81526004016107d290615833565b6000821161249d5760405162461bcd60e51b815260206004820152601760248201527604c49444f3a20494e434f52524543545f4e45575f43415604c1b60448201526064016107d2565b50600c55565b600f54604051633bfc46cb60e21b81527fbd1ecc6a842ff1f2601eedd75a87543c45753bbba85c665c9f8870558fb3a2cf916001600160a01b03169063eff11b2c906124f590849033906004016157ff565b602060405180830381865afa158015612512573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125369190615816565b6125525760405162461bcd60e51b81526004016107d290615833565b6001600160a01b0382166125b35760405162461bcd60e51b815260206004820152602260248201527f4c49444f3a20494e434f52524543545f444556454c4f504552535f4144445245604482015261535360f01b60648201526084016107d2565b50601580546001600160a01b0319166001600160a01b0392909216919091179055565b6060602080546107f59061585f565b336000908152601c602052604090205460ff166126145760405162461bcd60e51b81526004016107d290615af6565b60195460408051633908530160e01b815290516000926001600160a01b0316916339085301916004808301926020929190829003018187875af115801561265f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268391906158be565b90506000601960009054906101000a90046001600160a01b03166001600160a01b031663036ec0666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fe91906158be565b90506000601960009054906101000a90046001600160a01b03166001600160a01b0316633dbfe6cb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612755573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277991906158be565b600d546019546040516370a0823160e01b81529293506000926001600160a01b03928316926370a08231926127b3929116906004016154ab565b602060405180830381865afa1580156127d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f491906158be565b905060008161280384866158ed565b111561282057612813838361591b565b61281d908561591b565b90505b60008160055461283091906158ed565b60055461283d908a615b49565b6128479190615b7e565b905060008260055461285991906158ed565b8760055461286791906158ed565b612871908b615b49565b61287b9190615b7e565b9050816005600082825461288f919061591b565b90915550600090506128a1838b61591b565b11156129445760006128b3838b61591b565b905083600754826128c49190615b49565b6128ce9190615b7e565b600760008282546128df919061591b565b90915550506019546040516313d6d8db60e21b8152600481018390526001600160a01b0390911690634f5b636c90602401600060405180830381600087803b15801561292a57600080fd5b505af115801561293e573d6000803e3d6000fd5b50505050505b336000908152600860205260409020548111156129705733600090815260086020526040902054612972565b805b336000908152600860205260408120805490919061299190849061591b565b909155505033600090815260096020526040812080548b92906129b590849061591b565b90915550506040517f28457ba4ae46aeb68ba5c1a1c15506fb3212bfff27da04dee70b81023a9ebc04906129ee9033908c908c90615ad5565b60405180910390a1505050505050505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015612a755760405162461bcd60e51b815260206004820152601e60248201527f4445435245415345445f414c4c4f57414e43455f42454c4f575f5a45524f000060448201526064016107d2565b612a843385610cce868561591b565b5060019392505050565b6000610885338484613a35565b600080612aa760055490565b905080612ab75750600092915050565b80611ffa60035490565b600061088982613ba5565b600f54604051633bfc46cb60e21b8152600080516020615d8c833981519152916001600160a01b03169063eff11b2c90612b0c90849033906004016157ff565b602060405180830381865afa158015612b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4d9190615816565b612b695760405162461bcd60e51b81526004016107d290615833565b612b7282613de6565b6001600160a01b0382166000908152601d602052604090819020805460ff19166001179055517fe5526d35f0db491e3e7690717b21c8148a1b5eef07240279db75404df228a59390610aae9084906154ab565b60005460ff1615612be85760405162461bcd60e51b81526004016107d290615894565b60215462010000900460ff16612c3a5760405162461bcd60e51b815260206004820152601760248201527613125113ce8815539093d39117d393d517d193d490d151604a1b60448201526064016107d2565b6000612c4533613d73565b905060008111612c905760405162461bcd60e51b81526020600482015260166024820152754c49444f3a204e4f5448494e475f544f5f434c41494d60501b60448201526064016107d2565b6000612c9b82611fce565b90508060056000828254612caf919061591b565b90915550612cbf90503383613fdb565b50601954604051635f99a1b360e01b81526001600160a01b0390911690635f99a1b390612cf29033908590600401615bb6565b600060405180830381600087803b158015612d0c57600080fd5b505af1158015612d20573d6000803e3d6000fd5b5050604051838152339250600080516020615dcc83398151915291506020015b60405180910390a25050565b600f54604051633bfc46cb60e21b8152600080516020615dac833981519152916001600160a01b03169063eff11b2c90612d8c90849033906004016157ff565b602060405180830381865afa158015612da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dcd9190615816565b612de95760405162461bcd60e51b81526004016107d290615833565b50602180549115156101000261ff0019909216919091179055565b600061089a60035490565b60005460ff1615612e325760405162461bcd60e51b81526004016107d290615894565b602154610100900460ff1615612e825760405162461bcd60e51b815260206004820152601560248201527413125113ce8814915111515357d11254d050931151605a1b60448201526064016107d2565b6000612e8d82612a9b565b905060008111612ed65760405162461bcd60e51b81526020600482015260146024820152734c49444f3a20414d4f554e545f544f4f5f4c4f5760601b60448201526064016107d2565b612edf33613d73565b811115612f3a5760405162461bcd60e51b815260206004820152602360248201527f4c49444f3a2052454445454d5f414d4f554e545f455843454544535f42414c416044820152624e434560e81b60648201526084016107d2565b612f443382613fdb565b508160056000828254612f57919061591b565b925050819055508160076000828254612f7091906158ed565b90915550506019546040516301e9a69560e41b81526001600160a01b0390911690631e9a695090612fa79033908690600401615bb6565b600060405180830381600087803b158015612fc157600080fd5b505af1158015612fd5573d6000803e3d6000fd5b505060405184815260009250339150600080516020615e0c8339815191529060200160405180910390a360405182815233907f4896181ff8f4543cc00db9fe9b6fb7e6f032b7eb772c72ab1ec1b4d2e03b936990602001612d40565b600a54600b5460609160009161304791906158ed565b6001600160401b0381111561305e5761305e615905565b604051908082528060200260200182016040528015613087578160200160208202803683370190505b50905060005b600a54600b5461309d91906158ed565b811015610c3057600b5481106130e757600b54600a906130bd908361591b565b815481106130cd576130cd615932565b6000918252602090912001546001600160a01b0316613110565b600b81815481106130fa576130fa615932565b6000918252602090912001546001600160a01b03165b82828151811061312257613122615932565b6001600160a01b03909216602092830291909101909101528061314481615948565b91505061308d565b336000908152601c602052604090205460ff1661317b5760405162461bcd60e51b81526004016107d290615af6565b60408051608081018252601e5461ffff808216835262010000820481166020840152600160201b82048116938301849052600160301b909104166060820181905290916000916131ca91615a0d565b61ffff169050600081116131e0576131e0615bcf565b83600560008282546131f291906158ed565b909155505033600090815260086020526040812080548692906132169084906158ed565b9091555050336000908152600960205260408120805486929061323a9084906158ed565b9091555050602082015160009061325390612710615be5565b61ffff166132618387615b49565b61326b9190615b7e565b905060008161327960055490565b613283919061591b565b9050600061329060055490565b905081156132b957816132a260035490565b6132ac9085615b49565b6132b69190615b7e565b90505b6016546132cf906001600160a01b031682614101565b50600084866040015161ffff16836132e79190615b49565b6132f19190615b7e565b601654601554919250613311916001600160a01b039182169116836141d7565b601554613327906001600160a01b03168261436a565b601654613346906001600160a01b0316613341838561591b565b61436a565b7f61953b03ced70bb23c53b5a7058e431e3db88cf84a72660faea0849b785c43bd33898960405161337993929190615ad5565b60405180910390a15050505050505050565b336000908152601c602052604090205460ff166133ba5760405162461bcd60e51b81526004016107d290615af6565b336000908152600860209081526040808320546009909252909120546133e19083906158ed565b111561342f5760405162461bcd60e51b815260206004820152601d60248201527f4c49444f3a204c45444745525f4e4f545f454e4f5547485f5354414b4500000060448201526064016107d2565b336000908152600960205260408120805483929061344e9084906158ed565b9091555050600d5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906134859033908590600401615bb6565b6020604051808303816000875af11580156134a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fde9190615816565b600f54604051633bfc46cb60e21b81527fe6f5d3a94b3b2e5137a1b6bff43c8dde49b099cd4958238240e4ab304e4a2b68916001600160a01b03169063eff11b2c9061351a90849033906004016157ff565b602060405180830381865afa158015613537573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355b9190615816565b6135775760405162461bcd60e51b81526004016107d290615833565b6001600160a01b0382166135cd5760405162461bcd60e51b815260206004820181905260248201527f4c49444f3a20494e434f52524543545f54524541535552595f4144445245535360448201526064016107d2565b50601680546001600160a01b0319166001600160a01b0392909216919091179055565b600f54604051633bfc46cb60e21b8152600080516020615d8c833981519152916001600160a01b03169063eff11b2c9061363090849033906004016157ff565b602060405180830381865afa15801561364d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136719190615816565b61368d5760405162461bcd60e51b81526004016107d290615833565b610fde82613de6565b600061088982613d73565b600f54604051633bfc46cb60e21b8152600080516020615dac833981519152916001600160a01b03169063eff11b2c906136e190849033906004016157ff565b602060405180830381865afa1580156136fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137229190615816565b61373e5760405162461bcd60e51b81526004016107d290615833565b6001600160a01b0382166137945760405162461bcd60e51b815260206004820152601f60248201527f4c49444f3a20494e434f52524543545f464143544f52595f414444524553530060448201526064016107d2565b50601880546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b031633146138105760405162461bcd60e51b815260206004820152601c60248201527b2624a2279d102727aa2fa32927a6afa7a920a1a622afa6a0a9aa22a960211b60448201526064016107d2565b601960009054906101000a90046001600160a01b03166001600160a01b0316637b2077276040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561386057600080fd5b505af1158015613874573d6000803e3d6000fd5b505050506138806143a3565b565b60005460ff166138cb5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107d2565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405161390591906154ab565b60405180910390a1565b60005460ff16156139325760405162461bcd60e51b81526004016107d290615894565b6001600160a01b0383166139845760405162461bcd60e51b8152602060048201526019602482015278415050524f56455f46524f4d5f5a45524f5f4144445245535360381b60448201526064016107d2565b6001600160a01b0382166139d45760405162461bcd60e51b8152602060048201526017602482015276415050524f56455f544f5f5a45524f5f4144445245535360481b60448201526064016107d2565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000613a4082612a9b565b9050613a4d8484836141d7565b826001600160a01b0316846001600160a01b0316600080516020615e0c83398151915284604051613a8091815260200190565b60405180910390a350505050565b60005b600a54600b54613aa191906158ed565b811015613b9f57600b546000908210613aee57600b54600a90613ac4908461591b565b81548110613ad457613ad4615932565b6000918252602090912001546001600160a01b0316613b17565b600b8281548110613b0157613b01615932565b6000918252602090912001546001600160a01b03165b60405163416acf8b60e11b81526001600160801b03808816600483015286166024820152604481018590529091506001600160a01b038216906382d59f1690606401600060405180830381600087803b158015613b7357600080fd5b505af1158015613b87573d6000803e3d6000fd5b50505050508080613b9790615948565b915050613a91565b50505050565b6000805460ff1615613bc95760405162461bcd60e51b81526004016107d290615894565b600c5482600554613bda91906158ed565b10613c235760405162461bcd60e51b815260206004820152601960248201527804c49444f3a204445504f534954535f4558434545445f43415603c1b60448201526064016107d2565b600d546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90613c5790339030908790600401615b25565b6020604051808303816000875af1158015613c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c9a9190615816565b5081613cdd5760405162461bcd60e51b815260206004820152601260248201527113125113ce8816915493d7d1115413d4d25560721b60448201526064016107d2565b6000613ce883612a9b565b905080613cf25750815b8260056000828254613d0491906158ed565b925050819055508260066000828254613d1d91906158ed565b90915550613d2d90503382614101565b50613d38338261436a565b60405183815233907f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c49060200160405180910390a292915050565b6001600160a01b031660009081526001602052604090205490565b60005460ff1615613db15760405162461bcd60e51b81526004016107d290615894565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586138f83390565b6001600160a01b0381166000908152601c602052604090205460ff16613e475760405162461bcd60e51b815260206004820152601660248201527513125113ce8813115111d15497d393d517d193d5539160521b60448201526064016107d2565b6000613e548260016146ea565b9050600019811415613ea35760405162461bcd60e51b815260206004820152601860248201527713125113ce8813115111d15497d393d517d153905093115160421b60448201526064016107d2565b600b805460009190613eb79060019061591b565b81548110613ec757613ec7615932565b600091825260209091200154600b80546001600160a01b039092169250829184908110613ef657613ef6615932565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600b805480613f3557613f35615c08565b600082815260208120600019908301810180546001600160a01b03199081169091559201909255600a805460018101825592527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a890910180549091166001600160a01b0385161790556040517f85accaad76657cef23e292273789ae7a13d87db42feff1d70d4056c20d78d07190613fce9085906154ab565b60405180910390a1505050565b6000805460ff1615613fff5760405162461bcd60e51b81526004016107d290615894565b6001600160a01b0383166140525760405162461bcd60e51b815260206004820152601a6024820152794255524e5f46524f4d5f5448455f5a45524f5f4144445245535360301b60448201526064016107d2565b6001600160a01b038316600090815260016020526040902054808311156140b95760405162461bcd60e51b815260206004820152601b60248201527a4255524e5f414d4f554e545f455843454544535f42414c414e434560281b60448201526064016107d2565b826140c360035490565b6140cd919061591b565b600381905591506140de838261591b565b6001600160a01b0390941660009081526001602052604090209390935592915050565b6000805460ff16156141255760405162461bcd60e51b81526004016107d290615894565b6001600160a01b0383166141765760405162461bcd60e51b81526020600482015260186024820152774d494e545f544f5f5448455f5a45524f5f4144445245535360401b60448201526064016107d2565b8161418060035490565b61418a91906158ed565b60038190556001600160a01b0384166000908152600160205260409020549091506141b69083906158ed565b6001600160a01b039093166000908152600160205260409020929092555090565b60005460ff16156141fa5760405162461bcd60e51b81526004016107d290615894565b6001600160a01b0383166142505760405162461bcd60e51b815260206004820152601e60248201527f5452414e534645525f46524f4d5f5448455f5a45524f5f41444452455353000060448201526064016107d2565b6001600160a01b0382166142a55760405162461bcd60e51b815260206004820152601c60248201527b5452414e534645525f544f5f5448455f5a45524f5f4144445245535360201b60448201526064016107d2565b6001600160a01b0383166000908152600160205260409020548082111561430e5760405162461bcd60e51b815260206004820152601f60248201527f5452414e534645525f414d4f554e545f455843454544535f42414c414e43450060448201526064016107d2565b614318828261591b565b6001600160a01b0380861660009081526001602052604080822093909355908516815220546143489083906158ed565b6001600160a01b03909316600090815260016020526040902092909255505050565b6001600160a01b0382166000600080516020615e0c83398151915261438e84611fce565b60405190815260200160405180910390a35050565b6000805b600a54600b546143b791906158ed565b81101561456b57600b54600090821061440457600b54600a906143da908461591b565b815481106143ea576143ea615932565b6000918252602090912001546001600160a01b031661442d565b600b828154811061441757614417615932565b6000918252602090912001546001600160a01b03165b6001600160a01b038116600090815260096020908152604080832054600890925290912054919250101561455a576001600160a01b0381166000908152600960209081526040808320546008909252822054614489919061591b565b600654600d546040516370a0823160e01b815292935090916001600160a01b03909116906370a08231906144c19030906004016154ab565b602060405180830381865afa1580156144de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061450291906158be565b61450c919061591b565b61451682866158ed565b116145585761452581856158ed565b6001600160a01b03831660009081526008602052604081208054929650839290919061455290849061591b565b90915550505b505b5061456481615948565b90506143a7565b50806006600082825461457e91906158ed565b909155505060065415158061459557506000600754115b156107e357600a54158015906145ad57506000600754115b156145c1576145bd6007546147ab565b6007555b60006006541180156145d557506000600754115b156146a1576000600754600654116145ef576006546145f3565b6007545b90508060066000828254614607919061591b565b925050819055508060076000828254614620919061591b565b9091555050600d5460195460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb9261465b929116908590600401615bb6565b6020604051808303816000875af115801561467a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061469e9190615816565b50505b600b54156107e35760006146b66007546149a6565b6146c16006546149a6565b6146cb9190615c1e565b905080156146dc576146dc81614a10565b506000600681905560075550565b600080826146fa57600a546146fe565b600b545b905060005b8181101561479f5760008461473f57600a828154811061472557614725615932565b6000918252602090912001546001600160a01b0316614768565b600b828154811061475257614752615932565b6000918252602090912001546001600160a01b03165b9050856001600160a01b0316816001600160a01b0316141561478e575091506108899050565b5061479881615948565b9050614703565b50600019949350505050565b600a54600090806147be576147be615bcf565b60008060005b8381101561486857601d6000600a83815481106147e3576147e3615932565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff166148585760086000600a838154811061482657614826615932565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461485590846158ed565b92505b61486181615948565b90506147c4565b50816148775750929392505050565b60005b8381101561499257601d6000600a838154811061489957614899615932565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1661498257600060086000600a84815481106148de576148de615932565b60009182526020808320909101546001600160a01b03168352820192909252604001812054915084614910838a615b49565b61491a9190615b7e565b9050818111614929578061492b565b815b9050614937818361591b565b60086000600a868154811061494e5761494e615932565b60009182526020808320909101546001600160a01b0316835282019290925260400190205561497d81856158ed565b935050505b61498b81615948565b905061487a565b5061499d818661591b565b95945050505050565b6000600160ff1b8210614a0c5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016107d2565b5090565b600b5480614a2057614a20615bcf565b6000816001600160401b03811115614a3a57614a3a615905565b604051908082528060200260200182016040528015614a63578160200160208202803683370190505b5090506000826001600160401b03811115614a8057614a80615905565b604051908082528060200260200182016040528015614aa9578160200160208202803683370190505b5090506000836001600160401b03811115614ac657614ac6615905565b604051908082528060200260200182016040528015614aef578160200160208202803683370190505b5090506000846001600160401b03811115614b0c57614b0c615905565b604051908082528060200260200182016040528015614b35578160200160208202803683370190505b509050600080600080602160029054906101000a900460ff168015614b615750602154610100900460ff165b15614bd05760055460075414614bc85760405162461bcd60e51b815260206004820152602660248201527f4c49444f3a2042554646455245445f52454445454d535f5345545f494e434f52604482015265524543544c5960d01b60648201526084016107d2565b506000614be6565b88614bd961088f565b614be39190615b7e565b90505b6000805b8a811015614d8f57600b8181548110614c0557614c05615932565b9060005260206000200160009054906101000a90046001600160a01b0316898281518110614c3557614c35615932565b60200260200101906001600160a01b031690816001600160a01b031681525050600860008a8381518110614c6b57614c6b615932565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054888281518110614ca657614ca6615932565b602002602001018181525050600860008a8381518110614cc857614cc8615932565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054878281518110614d0357614d03615932565b602002602001018181525050878181518110614d2157614d21615932565b602002602001015183614d349190615c1e565b91506000614d42838e615c5d565b1315614d5557614d528287615ce2565b95505b818a8281518110614d6857614d68615932565b6020908102919091010152614d7d8285615ce2565b9350614d8881615948565b9050614bea565b5050811580614d9c575083155b15614dad5750505050505050505050565b60016000851215614dc85750600019614dc585615d23565b94505b60005b8a811015614f02578160000b8a8281518110614de957614de9615932565b60200260200101818151614dfd9190615c5d565b90525089516000908b9083908110614e1757614e17615932565b60200260200101511315614ef2576000868d8c8481518110614e3b57614e3b615932565b6020026020010151614e4d9190615c5d565b614e579190615d40565b90506000818a8481518110614e6e57614e6e615932565b6020026020010151614e809190615ce2565b905080600860008d8681518110614e9957614e99615932565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550808a8481518110614ed857614ed8615932565b6020908102919091010152614eed8288615ce2565b965050505b614efb81615948565b9050614dcb565b506000614f0f858d615c1e565b90506000811315614f745780600860008b600081518110614f3257614f32615932565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000828254614f6991906158ed565b909155506150529050565b60008112156150525760005b8b81108015614f8f5750600082125b15615050576000898281518110614fa857614fa8615932565b60200260200101519050600081111561503f576000614fc684615d23565b8211614fd25781614fdb565b614fdb84615d23565b905080600860008e8681518110614ff457614ff4615932565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461502b919061591b565b9091555061503b90508185615ce2565b9350505b5061504981615948565b9050614f80565b505b506000805b8b8110156152a35760008a828151811061507357615073615932565b60200260200101516001600160a01b031663a5baabf06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156150b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150dc9190615d6e565b6001600160801b0316600960008d85815181106150fb576150fb615932565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461512e919061591b565b905088828151811061514257615142615932565b6020026020010151811180156151ae575088828151811061516557615165615932565b6020026020010151600860008d858151811061518357615183615932565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054115b156152925780600860008d85815181106151ca576151ca615932565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054116152605788828151811061520a5761520a615932565b6020026020010151600860008d858151811061522857615228615932565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461525b919061591b565b615285565b88828151811061527257615272615932565b602002602001015181615285919061591b565b61528f90846158ed565b92505b5061529c81615948565b9050615057565b50801561532557600d5460195460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926152e0929116908590600401615bb6565b6020604051808303816000875af11580156152ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153239190615816565b505b505050505050505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b600060208083528351808285015260005b818110156153875785810183015185820160400152820161536b565b81811115615399576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146107e357600080fd5b600080604083850312156153d757600080fd5b82356153e2816153af565b946020939093013593505050565b60006020828403121561540257600080fd5b813561200e816153af565b6020808252825182820181905260009190848201906040850190845b8181101561544557835183529284019291840191600101615429565b50909695505050505050565b60008060006060848603121561546657600080fd5b8335615471816153af565b92506020840135615481816153af565b929592945050506040919091013590565b6000602082840312156154a457600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80151581146107e357600080fd5b600080604083850312156154e057600080fd5b82356153e2816154bf565b600060808284031215610c3057600080fd5b6001600160801b03811681146107e357600080fd5b60008060008060008060008060006101208a8c03121561553157600080fd5b893561553c816153af565b985060208a013561554c816153af565b975060408a013561555c816153af565b965060608a013561556c816153af565b955060808a013561557c816153af565b945060a08a013561558c816153af565b935060c08a013561559c816153af565b925060e08a013591506101008a01356155b4816154fd565b809150509295985092959850929598565b60008083601f8401126155d757600080fd5b5081356001600160401b038111156155ee57600080fd5b6020830191508360208260051b850101111561560957600080fd5b9250929050565b6000806000806040858703121561562657600080fd5b84356001600160401b038082111561563d57600080fd5b615649888389016155c5565b9096509450602087013591508082111561566257600080fd5b5061566f878288016155c5565b95989497509550505050565b61ffff811681146107e357600080fd5b6000806000606084860312156156a057600080fd5b833592506020840135915060408401356156b98161567b565b809150509250925092565b6000602082840312156156d657600080fd5b813561200e816154fd565b600080604083850312156156f457600080fd5b50508035926020909101359150565b6000806040838503121561571657600080fd5b823591506020830135615728816153af565b809150509250929050565b60008060006060848603121561574857600080fd5b83356157538161567b565b925060208401356157638161567b565b915060408401356156b98161567b565b60006020828403121561578557600080fd5b813561200e816154bf565b600080604083850312156157a357600080fd5b82356157ae816153af565b91506020830135615728816153af565b6020808252825182820181905260009190848201906040850190845b818110156154455783516001600160a01b0316835292840192918401916001016157da565b9182526001600160a01b0316602082015260400190565b60006020828403121561582857600080fd5b815161200e816154bf565b60208082526012908201527113125113ce8815539055551213d49256915160721b604082015260600190565b600181811c9082168061587357607f821691505b60208210811415610c3057634e487b7160e01b600052602260045260246000fd5b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6000602082840312156158d057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115615900576159006158d7565b500190565b634e487b7160e01b600052604160045260246000fd5b60008282101561592d5761592d6158d7565b500390565b634e487b7160e01b600052603260045260246000fd5b600060001982141561595c5761595c6158d7565b5060010190565b60006020828403121561597557600080fd5b813561200e8161567b565b813561598b8161567b565b61ffff8116905081548161ffff19821617835560208401356159ac816154fd565b6001600160901b03199190911690911760109190911b62010000600160901b03161781556001810160408301356159e2816154fd565b81546001600160801b0319166001600160801b03919091161790556060919091013560029190910155565b600061ffff808316818516808303821115615a2a57615a2a6158d7565b01949350505050565b6000808335601e19843603018112615a4a57600080fd5b8301803591506001600160401b03821115615a6457600080fd5b6020019150600581901b360382131561560957600080fd5b6020808252810182905260006001600160fb1b03831115615a9c57600080fd5b8260051b80856040850137600092016040019182525092915050565b600060208284031215615aca57600080fd5b815161200e816153af565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252601590820152742624a2279d102727aa2fa32927a6afa622a223a2a960591b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6000816000190483118215151615615b6357615b636158d7565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615b8d57615b8d615b68565b500490565b60008060408385031215615ba557600080fd5b505080516020909101519092909150565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052600160045260246000fd5b600061ffff83811690831681811015615c0057615c006158d7565b039392505050565b634e487b7160e01b600052603160045260246000fd5b60008083128015600160ff1b850184121615615c3c57615c3c6158d7565b6001600160ff1b0384018313811615615c5757615c576158d7565b50500390565b60006001600160ff1b0381841382841380821686840486111615615c8357615c836158d7565b600160ff1b6000871282811687830589121615615ca257615ca26158d7565b60008712925087820587128484161615615cbe57615cbe6158d7565b87850587128184161615615cd457615cd46158d7565b505050929093029392505050565b600080821280156001600160ff1b0384900385131615615d0457615d046158d7565b600160ff1b8390038412811615615d1d57615d1d6158d7565b50500190565b6000600160ff1b821415615d3957615d396158d7565b5060000390565b600082615d4f57615d4f615b68565b600160ff1b821460001984141615615d6957615d696158d7565b500590565b600060208284031215615d8057600080fd5b815161200e816154fd56fe585c6e254ec74f8e72b5cff099811ed8721d9039f710d9a1cb67eed6c74aa8279336eb28e461adb6ba7e620f5006a6952a65a21a4db92c2edb104bf7f1c38c63d8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426ad76e3374742c17bd14ffaf46cd349ec292baf7d8425512fa8fe132557a4c967bddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d121a6c6aa8ff56232ce49a2146199d43ec0e6548a229d5e808a0acf0129c87064736f6c634300080a0033
Deployed Bytecode Sourcemap
24860:39365:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40798:81;;;:::i;:::-;;30604:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15028:163;;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;15028:163:0;1072:187:1;12718:108:0;;;:::i;:::-;;;1410:25:1;;;1398:2;1383:18;12718:108:0;1264:177:1;47605:168:0;;;:::i;43769:257::-;;;;;;:::i;:::-;;:::i;38850:518::-;;;:::i;:::-;;;;;;;:::i;15963:409::-;;;;;;:::i;:::-;;:::i;40267:129::-;;;;;;:::i;:::-;40333:7;40360:28;;;:13;:28;;;;;;-1:-1:-1;;;;;40360:28:0;;40267:129;;;;;;;;:::i;37925:316::-;;;;;;:::i;:::-;;:::i;31004:83::-;31070:9;;31004:83;;31070:9;;;;3768:36:1;;3756:2;3741:18;31004:83:0;3626:184:1;35878:457:0;;;;;;:::i;:::-;;:::i;16937:207::-;;;;;;:::i;:::-;;:::i;32362:1598::-;;;;;;:::i;:::-;;:::i;27438:28::-;;;;;-1:-1:-1;;;;;27438:28:0;;;44326:602;;;;;;:::i;:::-;;:::i;34560:212::-;;;;;;:::i;:::-;;:::i;26607:30::-;;;;;;41382:1359;;;;;;:::i;:::-;;:::i;10494:86::-;10541:4;10565:7;;;10494:86;;26896:47;;;;;;:::i;:::-;;;;;;;;;;;;;;34780:263;;;;;;:::i;:::-;;:::i;52116:382::-;;;;;;:::i;:::-;;:::i;19240:300::-;;;;;;:::i;:::-;;:::i;27887:39::-;;;;;-1:-1:-1;;;;;27887:39:0;;;;;;-1:-1:-1;;;;;8004:32:1;;;7986:51;;7974:2;7959:18;27887:39:0;7840:203:1;45048:221:0;;;;;;:::i;:::-;;:::i;13339:143::-;;;;;;:::i;:::-;;:::i;36656:584::-;;;;;;:::i;:::-;;:::i;38539:170::-;;;;;;:::i;:::-;;:::i;:::-;;;;9070:25:1;;;9126:2;9111:18;;9104:34;;;;9043:18;38539:170:0;8896:248:1;40557:78:0;;;:::i;34292:183::-;;;;;;:::i;:::-;;:::i;35428:201::-;;;;;;:::i;:::-;;:::i;30801:87::-;;;:::i;49853:2033::-;;;;;;:::i;:::-;;:::i;27294:27::-;;;;;-1:-1:-1;;;;;27294:27:0;;;17798:359;;;;;;:::i;:::-;;:::i;13997:169::-;;;;;;:::i;:::-;;:::i;26440:31::-;;;;;;18835:295;;;;;;:::i;:::-;;:::i;44936:104::-;;;;;;:::i;:::-;;:::i;43369:229::-;;;;;;:::i;:::-;;:::i;47886:547::-;;;:::i;37426:143::-;;;;;;:::i;:::-;;:::i;18420:99::-;;;:::i;46725:672::-;;;;;;:::i;:::-;;:::i;27116:25::-;;;;;;14438:146;;;;;;:::i;:::-;-1:-1:-1;;;;;14548:18:0;;;14521:7;14548:18;;;:10;:18;;;;;;;;:28;;;;;;;;;;;;;14438:146;39580:439;;;:::i;:::-;;;;;;;:::i;48541:1212::-;;;;;;:::i;:::-;;:::i;52654:339::-;;;;;;:::i;:::-;;:::i;26231:32::-;;;;;;27673:28;;;;;-1:-1:-1;;;;;27673:28:0;;;34036:187;;;;;;:::i;:::-;;:::i;26740:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;42988:131;;;;;;:::i;:::-;;:::i;18603:111::-;;;;;;:::i;:::-;;:::i;35130:218::-;;;;;;:::i;:::-;;:::i;53168:197::-;;;:::i;40798:81::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;-1:-1:-1;;;;;;;;;;;29121:31:0;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;29121:31;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;;;;;;;;;40861:10:::1;:8;:10::i;:::-;40798:81:::0;:::o;30604:83::-;30641:13;30674:5;30667:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30604:83;:::o;15028:163::-;15105:4;15122:39;15131:10;15143:8;15153:7;15122:8;:39::i;:::-;-1:-1:-1;15179:4:0;15028:163;;;;;:::o;12718:108::-;12771:7;12798:20;63563:17;;;63474:114;12798:20;12791:27;;12718:108;:::o;47605:168::-;10541:4;10565:7;;;10819:9;10811:38;;;;-1:-1:-1;;;10811:38:0;;;;;;;:::i;:::-;47693:10:::1;::::0;47681:41:::1;::::0;-1:-1:-1;;;47681:41:0;;47664:14:::1;::::0;-1:-1:-1;;;;;47693:10:0::1;::::0;47681:29:::1;::::0;:41:::1;::::0;47711:10:::1;::::0;47681:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47738:27;::::0;1410:25:1;;;47664:58:0;;-1:-1:-1;47746:10:0::1;::::0;-1:-1:-1;;;;;;;;;;;47738:27:0;1398:2:1;1383:18;47738:27:0::1;;;;;;;47653:120;47605:168::o:0;43769:257::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;-1:-1:-1;;;;;;;;;;;29345:32:0;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;29345:32;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43869:29:0;::::1;;::::0;;;:13:::1;:29;::::0;;;;;::::1;;43861:65;;;::::0;-1:-1:-1;;;43861:65:0;;12448:2:1;43861:65:0::1;::::0;::::1;12430:21:1::0;12487:2;12467:18;;;12460:30;-1:-1:-1;;;12506:18:1;;;12499:53;12569:18;;43861:65:0::1;12246:347:1::0;43861:65:0::1;-1:-1:-1::0;;;;;43944:29:0;::::1;;::::0;;;:13:::1;:29;::::0;;;;;;43937:36;;-1:-1:-1;;43937:36:0::1;::::0;;43989:29;::::1;::::0;::::1;::::0;43958:14;;43989:29:::1;:::i;:::-;;;;;;;;43769:257:::0;;:::o;38850:518::-;38994:15;:22;38970:14;:21;38899:16;;38928:25;;38970:46;;38994:22;38970:46;:::i;:::-;-1:-1:-1;;;;;38956:61:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38956:61:0;;38928:89;;39035:6;39030:303;39075:15;:22;39051:14;:21;:46;;39075:22;39051:46;:::i;:::-;39047:1;:50;39030:303;;;39144:14;:21;39119:18;;39140:25;;:107;;39225:14;:21;39205:15;;39221:25;;:1;:25;:::i;:::-;39205:42;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;39205:42:0;39140:107;;;39185:14;39200:1;39185:17;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;39185:17:0;39140:107;39119:128;;39294:10;-1:-1:-1;;;;;39286:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39264:8;39273:1;39264:11;;;;;;;;:::i;:::-;;;;;;;;;;:57;-1:-1:-1;39099:3:0;;;;:::i;:::-;;;;39030:303;;;-1:-1:-1;39352:8:0;38850:518;-1:-1:-1;38850:518:0:o;15963:409::-;-1:-1:-1;;;;;16108:19:0;;16064:4;16108:19;;;:10;:19;;;;;;;;16128:10;16108:31;;;;;;;;16158:27;;;;16150:73;;;;-1:-1:-1;;;16150:73:0;;13788:2:1;16150:73:0;;;13770:21:1;13827:2;13807:18;;;13800:30;13866:34;13846:18;;;13839:62;-1:-1:-1;;;13917:18:1;;;13910:31;13958:19;;16150:73:0;13586:397:1;16150:73:0;16236:39;16246:7;16255:10;16267:7;16236:9;:39::i;:::-;16286:56;16295:7;16304:10;16316:25;16334:7;16316:16;:25;:::i;:::-;16286:8;:56::i;:::-;-1:-1:-1;16360:4:0;;15963:409;-1:-1:-1;;;;15963:409:0:o;37925:316::-;30478:16;;;;;;;30470:49;;;;-1:-1:-1;;;30470:49:0;;14190:2:1;30470:49:0;;;14172:21:1;14229:2;14209:18;;;14202:30;-1:-1:-1;;;14248:18:1;;;14241:50;14308:18;;30470:49:0;13988:344:1;30470:49:0;30180:12:::1;::::0;30167:48:::1;::::0;-1:-1:-1;;;30167:48:0;;-1:-1:-1;;;;;;;;;;;29006:32:0;-1:-1:-1;;;;;30180:12:0::1;::::0;30167:30:::1;::::0;:48:::1;::::0;29006:32;;30204:10:::1;::::0;30167:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1::0;;;30159:79:0::1;;;;;;;:::i;:::-;38102:17:::2;;38082:16;:37;;38074:69;;;::::0;-1:-1:-1;;;38074:69:0;;14539:2:1;38074:69:0::2;::::0;::::2;14521:21:1::0;14578:2;14558:18;;;14551:30;-1:-1:-1;;;14597:18:1;;;14590:49;14656:18;;38074:69:0::2;14337:343:1::0;38074:69:0::2;-1:-1:-1::0;38156:14:0::2;:32:::0;;;::::2;;::::0;::::2;-1:-1:-1::0;;38156:32:0;;::::2;::::0;;;::::2;::::0;;;38199:15:::2;:34:::0;37925:316::o;35878:457::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;28891:30;;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;28891:30;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;36025:1:::1;35989:33;;::::0;::::1;:10:::0;:33:::1;:::i;:::-;:37;;;35981:85;;;::::0;-1:-1:-1;;;35981:85:0;;15137:2:1;35981:85:0::1;::::0;::::1;15119:21:1::0;15176:2;15156:18;;;15149:30;15215:34;15195:18;;;15188:62;-1:-1:-1;;;15266:18:1;;;15259:33;15309:19;;35981:85:0::1;14935:399:1::0;35981:85:0::1;36117:1;36085:10;:29;;;:33;36077:76;;;::::0;-1:-1:-1;;;36077:76:0;;15541:2:1;36077:76:0::1;::::0;::::1;15523:21:1::0;15580:2;15560:18;;;15553:30;15619:32;15599:18;;;15592:60;15669:18;;36077:76:0::1;15339:354:1::0;36077:76:0::1;36179:10:::0;36166::::1;:23;36179:10:::0;36166;:23:::1;:::i;:::-;-1:-1:-1::0;36202:125:0::1;::::0;-1:-1:-1;36226:30:0::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;36258:37;::::0;;;::::1;::::0;::::1;;:::i;:::-;36297:10;:29;;;36202:23;:125::i;:::-;35878:457:::0;;:::o;16937:207::-;17045:10;17019:4;17067:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;17067:32:0;;;;;;;;;;17019:4;;17036:78;;17057:8;;17067:46;;17102:11;;17067:46;:::i;32362:1598::-;9160:13;;;;;;;;:30;;-1:-1:-1;9178:12:0;;;;9177:13;9160:30;9152:89;;;;-1:-1:-1;;;9152:89:0;;16764:2:1;9152:89:0;;;16746:21:1;16803:2;16783:18;;;16776:30;16842:34;16822:18;;;16815:62;-1:-1:-1;;;16893:18:1;;;16886:44;16947:19;;9152:89:0;16562:410:1;9152:89:0;9277:13;;;;;;;9276:14;9301:101;;;;9336:13;:20;;-1:-1:-1;;9371:19:0;;;;;9301:101;32720:1:::1;32706:11;:15;32698:42;;;::::0;-1:-1:-1;;;32698:42:0;;17179:2:1;32698:42:0::1;::::0;::::1;17161:21:1::0;17218:2;17198:18;;;17191:30;-1:-1:-1;;;17237:18:1;;;17230:44;17291:18;;32698:42:0::1;16977:338:1::0;32698:42:0::1;-1:-1:-1::0;;;;;32759:19:0;::::1;32751:60;;;::::0;-1:-1:-1;;;32751:60:0;;17522:2:1;32751:60:0::1;::::0;::::1;17504:21:1::0;17561:2;17541:18;;;17534:30;-1:-1:-1;;;17580:18:1;;;17573:58;17648:18;;32751:60:0::1;17320:352:1::0;32751:60:0::1;-1:-1:-1::0;;;;;32830:27:0;::::1;32822:77;;;::::0;-1:-1:-1;;;32822:77:0;;17879:2:1;32822:77:0::1;::::0;::::1;17861:21:1::0;17918:2;17898:18;;;17891:30;17957:34;17937:18;;;17930:62;-1:-1:-1;;;18008:18:1;;;18001:35;18053:19;;32822:77:0::1;17677:401:1::0;32822:77:0::1;-1:-1:-1::0;;;;;32918:25:0;::::1;32910:72;;;::::0;-1:-1:-1;;;32910:72:0;;18285:2:1;32910:72:0::1;::::0;::::1;18267:21:1::0;18324:2;18304:18;;;18297:30;18363:34;18343:18;;;18336:62;-1:-1:-1;;;18414:18:1;;;18407:32;18456:19;;32910:72:0::1;18083:398:1::0;32910:72:0::1;-1:-1:-1::0;;;;;33001:26:0;::::1;32993:74;;;::::0;-1:-1:-1;;;32993:74:0;;18688:2:1;32993:74:0::1;::::0;::::1;18670:21:1::0;18727:2;18707:18;;;18700:30;18766:34;18746:18;;;18739:62;-1:-1:-1;;;18817:18:1;;;18810:33;18860:19;;32993:74:0::1;18486:399:1::0;32993:74:0::1;-1:-1:-1::0;;;;;33086:25:0;::::1;33078:72;;;::::0;-1:-1:-1;;;33078:72:0;;19092:2:1;33078:72:0::1;::::0;::::1;19074:21:1::0;19131:2;19111:18;;;19104:30;19170:34;19150:18;;;19143:62;-1:-1:-1;;;19221:18:1;;;19214:32;19263:19;;33078:72:0::1;18890:398:1::0;33078:72:0::1;33163:4;:20:::0;;-1:-1:-1;;;;;33163:20:0;;::::1;-1:-1:-1::0;;;;;;33163:20:0;;::::1;;::::0;;;33194:10:::1;:24:::0;;;;::::1;::::0;;::::1;;::::0;;33229:12:::1;:27:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;33269:10:::1;:24:::0;;;33327:3:::1;33306:18;:24:::0;33341:21:::1;;:::i;:::-;28707:3;33386:46;28592:3;28651:1;33386:46;:::i;:::-;:69;;;;:::i;:::-;33373:82;;::::0;;;:10:::1;33466:14;::::0;::::1;:38:::0;28592:3:::1;33515:15;::::0;;::::1;:40:::0;;;;28707:3:::1;33566:13;::::0;::::1;:36:::0;33613:3:::1;:10:::0;;-1:-1:-1;;33613:10:0;;;;-1:-1:-1;;;33613:10:0::1;-1:-1:-1::0;;;;33613:10:0::1;-1:-1:-1::0;;;33613:10:0::1;::::0;;;33636:8:::1;:20:::0;;-1:-1:-1;;;;;;33636:20:0;;::::1;-1:-1:-1::0;;;;;33636:20:0;;::::1;::::0;;;::::1;::::0;;;33667:10:::1;:23:::0;;;::::1;::::0;;::::1;;::::0;;33703:13:::1;:29:::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;33743:51;;-1:-1:-1;;;33743:51:0;;:36:::1;::::0;:51:::1;::::0;33788:4:::1;::::0;-1:-1:-1;33743:51:0::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;33807:10:0::1;:24:::0;;-1:-1:-1;;;;;;33807:24:0::1;-1:-1:-1::0;;;;;33807:24:0;::::1;::::0;;::::1;::::0;;;33842:47:::1;::::0;-1:-1:-1;;;33842:47:0;;33807:24;;-1:-1:-1;33842:32:0::1;::::0;-1:-1:-1;33842:47:0::1;::::0;33883:4:::1;::::0;33842:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;33902:24:0::1;:50:::0;;-1:-1:-1;;;;;;33902:50:0::1;-1:-1:-1::0;;;;;33902:50:0;::::1;;::::0;;-1:-1:-1;;9428:68:0;;;-1:-1:-1;9428:68:0;;9463:13;:21;;-1:-1:-1;;9463:21:0;;;9428:68;9141:362;32362:1598;;;;;;;;;:::o;44326:602::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;29460:31;;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;29460:31;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;44471:43;;::::1;44463:77;;;::::0;-1:-1:-1;;;44463:77:0;;19724:2:1;44463:77:0::1;::::0;::::1;19706:21:1::0;19763:2;19743:18;;;19736:30;-1:-1:-1;;;19782:18:1;;;19775:51;19843:18;;44463:77:0::1;19522:345:1::0;44463:77:0::1;44558:9;44553:368;44573:25:::0;;::::1;44553:368;;;44672:1;44628:13;44672:1:::0;44642:14;;44657:1;44642:17;;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;44628:32:::0;;-1:-1:-1;44628:32:0;::::1;::::0;;;;;;-1:-1:-1;44628:32:0;;-1:-1:-1;;;;;44628:32:0::1;:46;;44620:87;;;::::0;-1:-1:-1;;;44620:87:0;;20074:2:1;44620:87:0::1;::::0;::::1;20056:21:1::0;20113:2;20093:18;;;20086:30;-1:-1:-1;;;20132:18:1;;;20125:57;20199:18;;44620:87:0::1;19872:351:1::0;44620:87:0::1;44757:10;:33:::0;::::1;;44732:11:::0;;44744:1;44732:14;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:21;;:58;;44724:102;;;::::0;-1:-1:-1;;;44724:102:0;;20980:2:1;44724:102:0::1;::::0;::::1;20962:21:1::0;21019:2;20999:18;;;20992:30;21058:33;21038:18;;;21031:61;21109:18;;44724:102:0::1;20778:355:1::0;44724:102:0::1;44851:13;:32;44865:14;;44880:1;44865:17;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;44851:32:::0;;-1:-1:-1;44851:32:0;::::1;::::0;;;;;;-1:-1:-1;44851:32:0;;-1:-1:-1;;;;;44851:32:0::1;44843:50;44894:11:::0;;44906:1;44894:14;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;44843:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44600:3;;;;:::i;:::-;;;44553:368;;;;44326:602:::0;;;;;:::o;34560:212::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;-1:-1:-1;;;;;;;;;;;29006:32:0;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;29006:32;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34662:27:0;::::1;34654:70;;;::::0;-1:-1:-1;;;34654:70:0;;21831:2:1;34654:70:0::1;::::0;::::1;21813:21:1::0;21870:2;21850:18;;;21843:30;21909:32;21889:18;;;21882:60;21959:18;;34654:70:0::1;21629:354:1::0;34654:70:0::1;-1:-1:-1::0;34735:13:0::1;:29:::0;;-1:-1:-1;;;;;;34735:29:0::1;-1:-1:-1::0;;;;;34735:29:0;;;::::1;::::0;;;::::1;::::0;;34560:212::o;41382:1359::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;41571:7;;-1:-1:-1;;;;;;;;;;;29345:32:0;-1:-1:-1;;;;;30180:12:0;;;;30167:30;;:48;;29345:32;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;41604:13:::1;::::0;-1:-1:-1;;;;;41604:13:0::1;41596:71;;;::::0;-1:-1:-1;;;41596:71:0;;22190:2:1;41596:71:0::1;::::0;::::1;22172:21:1::0;22229:2;22209:18;;;22202:30;22268:33;22248:18;;;22241:61;22319:18;;41596:71:0::1;21988:355:1::0;41596:71:0::1;41686:14;::::0;-1:-1:-1;;;;;41686:14:0::1;41678:73;;;::::0;-1:-1:-1;;;41678:73:0;;22550:2:1;41678:73:0::1;::::0;::::1;22532:21:1::0;;;22569:18;;;22562:30;22628:34;22608:18;;;22601:62;22680:18;;41678:73:0::1;22348:356:1::0;41678:73:0::1;41770:13;::::0;-1:-1:-1;;;;;41770:13:0::1;41762:62;;;::::0;-1:-1:-1;;;41762:62:0;;22911:2:1;41762:62:0::1;::::0;::::1;22893:21:1::0;22950:2;22930:18;;;22923:30;-1:-1:-1;;;22969:18:1;;;22962:52;23031:18;;41762:62:0::1;22709:346:1::0;41762:62:0::1;41892:18;::::0;41867:15:::1;:22:::0;41843:14:::1;:21:::0;:46:::1;::::0;41867:22;41843:46:::1;:::i;:::-;:67;41835:104;;;::::0;-1:-1:-1;;;41835:104:0;;23262:2:1;41835:104:0::1;::::0;::::1;23244:21:1::0;23301:2;23281:18;;;23274:30;-1:-1:-1;;;23320:18:1;;;23313:54;23384:18;;41835:104:0::1;23060:348:1::0;41835:104:0::1;41998:1;41958:28:::0;;;:13:::1;:28;::::0;;;;;-1:-1:-1;;;;;41958:28:0::1;:42:::0;41950:81:::1;;;::::0;-1:-1:-1;;;41950:81:0;;23615:2:1;41950:81:0::1;::::0;::::1;23597:21:1::0;23654:2;23634:18;;;23627:30;-1:-1:-1;;;23673:18:1;;;23666:56;23739:18;;41950:81:0::1;23413:350:1::0;41950:81:0::1;42076:14;::::0;42188:4:::1;::::0;42208:10:::1;::::0;42233::::1;:30:::0;42278:37;;42330:29;;42061:309:::1;::::0;-1:-1:-1;;;42061:309:0;;::::1;::::0;::::1;24083:25:1::0;;;24124:18;;;24117:34;;;-1:-1:-1;;;;;42188:4:0;;::::1;24205:18:1::0;;;24198:43;42208:10:0;;::::1;24257:18:1::0;;;24250:43;42233:30:0;;;::::1;-1:-1:-1::0;;;;;42233:30:0;;::::1;24347:19:1::0;;;24340:44;42278:37:0::1;24400:19:1::0;;;24393:44;24453:19;;;24446:35;42044:14:0::1;::::0;42076;;;::::1;::::0;42061:43:::1;::::0;24055:19:1;;42061:309:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42383:14;:27:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;42383:27:0;;::::1;-1:-1:-1::0;;;;;;42383:27:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;42421:28:0;;;:13:::1;42383:27;42421:28:::0;;;;;;;:37;;;;::::1;::::0;::::1;::::0;;;42469:23;;;:15:::1;:23:::0;;;;;;;:30;;-1:-1:-1;;42469:30:0::1;::::0;;::::1;::::0;;;42526:13:::1;::::0;42512:46;;-1:-1:-1;;;42512:46:0;;42044:326;;-1:-1:-1;42526:13:0::1;::::0;42512:38:::1;::::0;:46:::1;::::0;42044:326;;42512:46:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42583:10:0::1;::::0;42571:68:::1;::::0;-1:-1:-1;;;42571:68:0;;24978:6:1;24966:19;;42571:68:0::1;::::0;::::1;24948:38:1::0;25002:18;;;24995:34;;;-1:-1:-1;;;;;25065:32:1;;;25045:18;;;25038:60;42583:10:0;;::::1;::::0;-1:-1:-1;42571:37:0::1;::::0;-1:-1:-1;24921:18:1;;42571:68:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42657:52;42667:6;42675:13;42690:18;42657:52;;;;;;;;:::i;:::-;;;;;;;;42727:6:::0;41382:1359;-1:-1:-1;;;;;41382:1359:0:o;34780:263::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;-1:-1:-1;;;;;;;;;;;29006:32:0;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;29006:32;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;34928:1:::1;34902:23;-1:-1:-1::0;;;;;34902:27:0::1;;34894:80;;;::::0;-1:-1:-1;;;34894:80:0;;25661:2:1;34894:80:0::1;::::0;::::1;25643:21:1::0;25700:2;25680:18;;;25673:30;25739:34;25719:18;;;25712:62;-1:-1:-1;;;25790:18:1;;;25783:38;25838:19;;34894:80:0::1;25459:404:1::0;34894:80:0::1;-1:-1:-1::0;34985:24:0::1;:50:::0;;-1:-1:-1;;;;;;34985:50:0::1;-1:-1:-1::0;;;;;34985:50:0;;;::::1;::::0;;;::::1;::::0;;34780:263::o;52116:382::-;52222:10;52206:27;;;;:15;:27;;;;;;;;52198:61;;;;-1:-1:-1;;;52198:61:0;;;;;;;:::i;:::-;52276:11;;52272:110;;52322:4;;52352:8;;52322:48;;-1:-1:-1;;;52322:48:0;;-1:-1:-1;;;;;52322:4:0;;;;:17;;:48;;52340:10;;52352:8;;;;52362:7;;52322:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52272:110;52407:10;52394:24;;;;:12;:24;;;;;:35;;52422:7;;52394:24;:35;;52422:7;;52394:35;:::i;:::-;;;;-1:-1:-1;;52440:4:0;;52470:10;;52440:50;;-1:-1:-1;;;52440:50:0;;-1:-1:-1;;;;;52440:4:0;;;;:17;;:50;;52458:10;;52470;;;;52482:7;;52440:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52116:382;;:::o;19240:300::-;19314:7;19334:20;19357:17;21115:11;;;21038:96;19357:17;19334:40;;19389:11;;19404:1;19389:16;19385:148;;;-1:-1:-1;19429:1:0;;19240:300;-1:-1:-1;;19240:300:0:o;19385:148::-;19509:12;19486:20;63563:17;;;63474:114;19486:20;19470:36;;:13;:36;:::i;:::-;:51;;;;:::i;:::-;19463:58;19240:300;-1:-1:-1;;;19240:300:0:o;45048:221::-;45119:7;45139:14;45156:17;45165:7;45156:8;:17::i;:::-;45189:48;;;45198:10;27297:34:1;;-1:-1:-1;;;;;27367:15:1;;27362:2;27347:18;;27340:43;27399:18;;;27392:34;;;27457:2;27442:18;;27435:34;;;45139::0;;-1:-1:-1;45189:48:0;;27246:3:1;27231:19;45189:48:0;;;;;;;45255:6;45048:221;-1:-1:-1;;;45048:221:0:o;13339:143::-;13406:7;13433:41;13454:19;13464:8;13454:9;:19::i;36656:584::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;29231:29;;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;29231:29;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;36782:21:::1;;:::i;:::-;36858:14:::0;36827:28:::1;36842:13:::0;36827:12;:28:::1;:::i;:::-;:45;;;;:::i;:::-;36814:58;;::::0;;;36905:5:::1;-1:-1:-1::0;36891:19:0;::::1;::::0;:63:::1;;;36930:1;36915:12;:16;;;:38;;;;36952:1;36935:14;:18;;;36915:38;36891:88;;;;;36974:5;36958:13;:21;;;36891:88;36883:122;;;::::0;-1:-1:-1;;;36883:122:0;;27682:2:1;36883:122:0::1;::::0;::::1;27664:21:1::0;27721:2;27701:18;;;27694:30;-1:-1:-1;;;27740:18:1;;;27733:51;27801:18;;36883:122:0::1;27480:345:1::0;36883:122:0::1;37030:10:::0;;37023:63:::1;::::0;;28063:6:1;28096:15;;;28078:34;;28148:15;;;28143:2;28128:18;;28121:43;28200:15;;;28180:18;;;28173:43;28252:15;;;28247:2;28232:18;;28225:43;37023:63:0;::::1;::::0;;;;28040:3:1;37023:63:0;;::::1;37099:32;::::0;;::::1;:15;::::0;::::1;:32:::0;;;37142:30;;::::1;:14;::::0;::::1;:30:::0;;;37183:28;;::::1;:13;::::0;::::1;:28:::0;;;37222:10;;:3:::1;:10:::0;;;;;::::1;-1:-1:-1::0;;37222:10:0;;;;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;37222:10:0;-1:-1:-1;;;37222:10:0;;::::1;-1:-1:-1::0;;;;37222:10:0;;;;;-1:-1:-1;;;37222:10:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;36656:584:0:o;38539:170::-;38665:10;;38653:48;;-1:-1:-1;;;38653:48:0;;38600:15;;;;-1:-1:-1;;;;;38665:10:0;;;;38653:39;;:48;;38693:7;;38653:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38646:55;;;;38539:170;;;:::o;40557:78::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;-1:-1:-1;;;;;;;;;;;29121:31:0;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;29121:31;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;40619:8:::1;:6;:8::i;34292:183::-:0;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;-1:-1:-1;;;;;;;;;;;29121:31:0;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;29121:31;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;34403:1:::1;34389:11;:15;34381:51;;;::::0;-1:-1:-1;;;34381:51:0;;28731:2:1;34381:51:0::1;::::0;::::1;28713:21:1::0;28770:2;28750:18;;;28743:30;-1:-1:-1;;;28789:18:1;;;28782:53;28852:18;;34381:51:0::1;28529:347:1::0;34381:51:0::1;-1:-1:-1::0;34443:10:0::1;:24:::0;34292:183::o;35428:201::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;29694:32;;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;29694:32;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35522:25:0;::::1;35514:72;;;::::0;-1:-1:-1;;;35514:72:0;;29083:2:1;35514:72:0::1;::::0;::::1;29065:21:1::0;29122:2;29102:18;;;29095:30;29161:34;29141:18;;;29134:62;-1:-1:-1;;;29212:18:1;;;29205:32;29254:19;;35514:72:0::1;28881:398:1::0;35514:72:0::1;-1:-1:-1::0;35597:10:0::1;:24:::0;;-1:-1:-1;;;;;;35597:24:0::1;-1:-1:-1::0;;;;;35597:24:0;;;::::1;::::0;;;::::1;::::0;;35428:201::o;30801:87::-;30840:13;30873:7;30866:14;;;;;:::i;49853:2033::-;49969:10;49953:27;;;;:15;:27;;;;;;;;49945:61;;;;-1:-1:-1;;;49945:61:0;;;;;;;:::i;:::-;50060:10;;50048:49;;;-1:-1:-1;;;50048:49:0;;;;50019:26;;-1:-1:-1;;;;;50060:10:0;;50048:47;;:49;;;;;;;;;;;;;;50019:26;50060:10;50048:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50019:78;;50110:25;50150:10;;;;;;;;;-1:-1:-1;;;;;50150:10:0;-1:-1:-1;;;;;50138:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50110:75;;50196:36;50247:10;;;;;;;;;-1:-1:-1;;;;;50247:10:0;-1:-1:-1;;;;;50235:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50322:4;;50337:10;;50322:26;;-1:-1:-1;;;50322:26:0;;50196:83;;-1:-1:-1;50290:29:0;;-1:-1:-1;;;;;50322:4:0;;;;:14;;:26;;50337:10;;;50322:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50290:58;-1:-1:-1;50447:32:0;50290:58;50498:48;50518:28;50498:17;:48;:::i;:::-;:72;50494:266;;;50695:52;50719:28;50695:21;:52;:::i;:::-;50674:74;;:17;:74;:::i;:::-;50630:118;;50494:266;50849:16;50926:24;50906:17;;:44;;;;:::i;:::-;50884:17;;50869:32;;:12;:32;:::i;:::-;50868:83;;;;:::i;:::-;50849:102;;50964:22;51096:24;51076:17;;:44;;;;:::i;:::-;51039:18;51019:17;;:38;;;;:::i;:::-;51003:55;;:12;:55;:::i;:::-;51002:119;;;;:::i;:::-;50964:157;;51155:8;51134:17;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;51206:1:0;;-1:-1:-1;51179:23:0;51194:8;51179:12;:23;:::i;:::-;51178:29;51174:409;;;51224:14;51241:23;51256:8;51241:12;:23;:::i;:::-;51224:40;;51485:24;51467:15;;51458:6;:24;;;;:::i;:::-;:51;;;;:::i;:::-;51439:15;;:70;;;;;;;:::i;:::-;;;;-1:-1:-1;;51536:10:0;;51524:47;;-1:-1:-1;;;51524:47:0;;;;;1410:25:1;;;-1:-1:-1;;;;;51536:10:0;;;;51524:39;;1383:18:1;;51524:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51209:374;51174:409;51689:10;51677:23;;;;:11;:23;;;;;;:41;-1:-1:-1;51677:41:0;:84;;51750:10;51738:23;;;;:11;:23;;;;;;51677:84;;;51721:14;51677:84;51662:10;51650:23;;;;:11;:23;;;;;:111;;:23;;;:111;;;;;:::i;:::-;;;;-1:-1:-1;;51785:10:0;51772:24;;;;:12;:24;;;;;:40;;51800:12;;51772:24;:40;;51800:12;;51772:40;:::i;:::-;;;;-1:-1:-1;;51830:48:0;;;;;;51837:10;;51849:12;;51863:14;;51830:48;:::i;:::-;;;;;;;;49934:1952;;;;;;;49853:2033;;:::o;17798:359::-;17940:10;17885:4;17929:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;17929:32:0;;;;;;;;;;17980:36;;;;17972:79;;;;-1:-1:-1;;;17972:79:0;;29836:2:1;17972:79:0;;;29818:21:1;29875:2;29855:18;;;29848:30;29914:32;29894:18;;;29887:60;29964:18;;17972:79:0;29634:354:1;17972:79:0;18062:65;18071:10;18083:8;18093:33;18110:16;18093;:33;:::i;18062:65::-;-1:-1:-1;18145:4:0;;17798:359;-1:-1:-1;;;17798:359:0:o;13997:169::-;14077:4;14094:42;14104:10;14116;14128:7;14094:9;:42::i;18835:295::-;18903:7;18923:22;18948:20;63563:17;;;63474:114;18948:20;18923:45;-1:-1:-1;18983:19:0;18979:144;;-1:-1:-1;19026:1:0;;18835:295;-1:-1:-1;;18835:295:0:o;18979:144::-;19097:14;19077:17;21115:11;;;21038:96;44936:104;44988:7;45015:17;45024:7;45015:8;:17::i;43369:229::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;-1:-1:-1;;;;;;;;;;;29345:32:0;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;29345:32;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;43469:30:::1;43484:14;43469;:30::i;:::-;-1:-1:-1::0;;;;;43510:29:0;::::1;;::::0;;;:13:::1;:29;::::0;;;;;;:36;;-1:-1:-1;;43510:36:0::1;43542:4;43510:36;::::0;;43562:28;::::1;::::0;::::1;::::0;43524:14;;43562:28:::1;:::i;47886:547::-:0;10541:4;10565:7;;;10819:9;10811:38;;;;-1:-1:-1;;;10811:38:0;;;;;;;:::i;:::-;47963:14:::1;::::0;;;::::1;;;47955:50;;;::::0;-1:-1:-1;;;47955:50:0;;30195:2:1;47955:50:0::1;::::0;::::1;30177:21:1::0;30234:2;30214:18;;;30207:30;-1:-1:-1;;;30253:18:1;;;30246:53;30316:18;;47955:50:0::1;29993:347:1::0;47955:50:0::1;48018:20;48041:21;48051:10;48041:9;:21::i;:::-;48018:44;;48096:1;48081:12;:16;48073:51;;;::::0;-1:-1:-1;;;48073:51:0;;30547:2:1;48073:51:0::1;::::0;::::1;30529:21:1::0;30586:2;30566:18;;;30559:30;-1:-1:-1;;;30605:18:1;;;30598:52;30667:18;;48073:51:0::1;30345:346:1::0;48073:51:0::1;48137:21;48161:34;48182:12;48161:20;:34::i;:::-;48137:58;;48227:13;48206:17;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;48253:37:0::1;::::0;-1:-1:-1;48265:10:0::1;48277:12:::0;48253:11:::1;:37::i;:::-;-1:-1:-1::0;48313:10:0::1;::::0;48301:74:::1;::::0;-1:-1:-1;;;48301:74:0;;-1:-1:-1;;;;;48313:10:0;;::::1;::::0;48301:47:::1;::::0;:74:::1;::::0;48349:10:::1;::::0;48361:13;;48301:74:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;48391:34:0::1;::::0;1410:25:1;;;48399:10:0::1;::::0;-1:-1:-1;;;;;;;;;;;;48391:34:0;-1:-1:-1;1398:2:1;1383:18;48391:34:0::1;;;;;;;;47944:489;;47886:547::o:0;37426:143::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;-1:-1:-1;;;;;;;;;;;29006:32:0;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;29006:32;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;-1:-1:-1;37525:16:0::1;:36:::0;;;::::1;;;;-1:-1:-1::0;;37525:36:0;;::::1;::::0;;;::::1;::::0;;37426:143::o;18420:99::-;18467:7;18494:17;21115:11;;;21038:96;46725:672;10541:4;10565:7;;;10819:9;10811:38;;;;-1:-1:-1;;;10811:38:0;;;;;;;:::i;:::-;30363:16:::1;::::0;::::1;::::0;::::1;;;30362:17;30354:51;;;::::0;-1:-1:-1;;;30354:51:0;;31177:2:1;30354:51:0::1;::::0;::::1;31159:21:1::0;31216:2;31196:18;;;31189:30;-1:-1:-1;;;31235:18:1;;;31228:51;31296:18;;30354:51:0::1;30975:345:1::0;30354:51:0::1;46806:15:::2;46824:29;46845:7;46824:20;:29::i;:::-;46806:47;;46882:1;46872:7;:11;46864:44;;;::::0;-1:-1:-1;;;46864:44:0;;31527:2:1;46864:44:0::2;::::0;::::2;31509:21:1::0;31566:2;31546:18;;;31539:30;-1:-1:-1;;;31585:18:1;;;31578:50;31645:18;;46864:44:0::2;31325:344:1::0;46864:44:0::2;46938:21;46948:10;46938:9;:21::i;:::-;46927:7;:32;;46919:80;;;::::0;-1:-1:-1;;;46919:80:0;;31876:2:1;46919:80:0::2;::::0;::::2;31858:21:1::0;31915:2;31895:18;;;31888:30;31954:34;31934:18;;;31927:62;-1:-1:-1;;;32005:18:1;;;31998:33;32048:19;;46919:80:0::2;31674:399:1::0;46919:80:0::2;47012:32;47024:10;47036:7;47012:11;:32::i;:::-;;47076:7;47055:17;;:28;;;;;;;:::i;:::-;;;;;;;;47113:7;47094:15;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;47145:10:0::2;::::0;47133:51:::2;::::0;-1:-1:-1;;;47133:51:0;;-1:-1:-1;;;;;47145:10:0;;::::2;::::0;47133:30:::2;::::0;:51:::2;::::0;47164:10:::2;::::0;47176:7;;47133:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;47263:41:0::2;::::0;1410:25:1;;;47292:1:0::2;::::0;-1:-1:-1;47272:10:0::2;::::0;-1:-1:-1;;;;;;;;;;;;47263:41:0;1398:2:1;1383:18;47263:41:0::2;;;;;;;47360:29;::::0;1410:25:1;;;47369:10:0::2;::::0;47360:29:::2;::::0;1398:2:1;1383:18;47360:29:0::2;1264:177:1::0;39580:439:0;39726:15;:22;39702:14;:21;39631:16;;39660:25;;39702:46;;39726:22;39702:46;:::i;:::-;-1:-1:-1;;;;;39688:61:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39688:61:0;;39660:89;;39767:6;39762:222;39807:15;:22;39783:14;:21;:46;;39807:22;39783:46;:::i;:::-;39779:1;:50;39762:222;;;39869:14;:21;39865:25;;:107;;39950:14;:21;39930:15;;39946:25;;:1;:25;:::i;:::-;39930:42;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;39930:42:0;39865:107;;;39910:14;39925:1;39910:17;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;39910:17:0;39865:107;39851:8;39860:1;39851:11;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39851:121:0;;;:11;;;;;;;;;;;:121;39831:3;;;;:::i;:::-;;;;39762:222;;48541:1212;48659:10;48643:27;;;;:15;:27;;;;;;;;48635:61;;;;-1:-1:-1;;;48635:61:0;;;;;;;:::i;:::-;48709:27;;;;;;;;48733:3;48709:27;;;;;;;;;;;;;;;;-1:-1:-1;;;48709:27:0;;;;;;;;;;-1:-1:-1;;;48709:27:0;;;;;;;;;;;;:21;;48832:31;;;:::i;:::-;48824:40;;48798:66;;48898:1;48882:15;:17;48875:25;;;;:::i;:::-;48934:13;48913:17;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;;48970:10:0;48958:23;;;;:11;:23;;;;;:40;;48985:13;;48958:23;:40;;48985:13;;48958:40;:::i;:::-;;;;-1:-1:-1;;49022:10:0;49009:24;;;;:12;:24;;;;;:41;;49037:13;;49009:24;:41;;49037:13;;49009:41;:::i;:::-;;;;-1:-1:-1;;49132:14:0;;;;49063:16;;49124:22;;:5;:22;:::i;:::-;49116:31;;49082;49098:15;49082:13;:31;:::i;:::-;:65;;;;:::i;:::-;49063:84;;49158:13;49198:8;49174:20;63563:17;;;63474:114;49174:20;:32;;;;:::i;:::-;49158:48;;49217:19;49239:20;63563:17;;;63474:114;49239:20;49217:42;-1:-1:-1;49274:9:0;;49270:65;;49330:5;49310:17;21115:11;;;21038:96;49310:17;49299:28;;:8;:28;:::i;:::-;:36;;;;:::i;:::-;49285:50;;49270:65;49360:8;;49348:34;;-1:-1:-1;;;;;49360:8:0;49370:11;49348;:34::i;:::-;;49395:18;49458:15;49439:4;:15;;;49431:24;;49416:11;:39;;;;:::i;:::-;:57;;;;:::i;:::-;49500:8;;49510:10;;49395:78;;-1:-1:-1;49484:49:0;;-1:-1:-1;;;;;49500:8:0;;;;49510:10;49395:78;49484:15;:49::i;:::-;49576:10;;49544:55;;-1:-1:-1;;;;;49576:10:0;49588;49544:31;:55::i;:::-;49642:8;;49610:67;;-1:-1:-1;;;;;49642:8:0;49652:24;49666:10;49652:11;:24;:::i;:::-;49610:31;:67::i;:::-;49695:50;49703:10;49715:13;49730:14;49695:50;;;;;;;;:::i;:::-;;;;;;;;48624:1129;;;;;;48541:1212;;:::o;52654:339::-;52741:10;52725:27;;;;:15;:27;;;;;;;;52717:61;;;;-1:-1:-1;;;52717:61:0;;;;;;;:::i;:::-;52847:10;52835:23;;;;:11;:23;;;;;;;;;52797:12;:24;;;;;;;:34;;52824:7;;52797:34;:::i;:::-;:61;;52789:103;;;;-1:-1:-1;;;52789:103:0;;32634:2:1;52789:103:0;;;32616:21:1;32673:2;32653:18;;;32646:30;32712:31;32692:18;;;32685:59;32761:18;;52789:103:0;32432:353:1;52789:103:0;52918:10;52905:24;;;;:12;:24;;;;;:35;;52933:7;;52905:24;:35;;52933:7;;52905:35;:::i;:::-;;;;-1:-1:-1;;52951:4:0;;:34;;-1:-1:-1;;;52951:34:0;;-1:-1:-1;;;;;52951:4:0;;;;:13;;:34;;52965:10;;52977:7;;52951:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34036:187::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;29572:30;;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;29572:30;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34124:23:0;::::1;34116:68;;;::::0;-1:-1:-1;;;34116:68:0;;32992:2:1;34116:68:0::1;::::0;::::1;32974:21:1::0;;;33011:18;;;33004:30;33070:34;33050:18;;;33043:62;33122:18;;34116:68:0::1;32790:356:1::0;34116:68:0::1;-1:-1:-1::0;34195:8:0::1;:20:::0;;-1:-1:-1;;;;;;34195:20:0::1;-1:-1:-1::0;;;;;34195:20:0;;;::::1;::::0;;;::::1;::::0;;34036:187::o;42988:131::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;-1:-1:-1;;;;;;;;;;;29345:32:0;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;29345:32;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;43081:30:::1;43096:14;43081;:30::i;18603:111::-:0;18660:7;18687:19;18697:8;18687:9;:19::i;35130:218::-;30180:12;;30167:48;;-1:-1:-1;;;30167:48:0;;-1:-1:-1;;;;;;;;;;;29006:32:0;-1:-1:-1;;;;;30180:12:0;;30167:30;;:48;;29006:32;;30204:10;;30167:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30159:79;;;;-1:-1:-1;;;30159:79:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35234:28:0;::::1;35226:72;;;::::0;-1:-1:-1;;;35226:72:0;;33353:2:1;35226:72:0::1;::::0;::::1;33335:21:1::0;33392:2;33372:18;;;33365:30;33431:33;33411:18;;;33404:61;33482:18;;35226:72:0::1;33151:355:1::0;35226:72:0::1;-1:-1:-1::0;35309:14:0::1;:31:::0;;-1:-1:-1;;;;;;35309:31:0::1;-1:-1:-1::0;;;;;35309:31:0;;;::::1;::::0;;;::::1;::::0;;35130:218::o;53168:197::-;53233:13;;-1:-1:-1;;;;;53233:13:0;53219:10;:27;53211:68;;;;-1:-1:-1;;;53211:68:0;;33713:2:1;53211:68:0;;;33695:21:1;33752:2;33732:18;;;33725:30;-1:-1:-1;;;33771:18:1;;;33764:58;33839:18;;53211:68:0;33511:352:1;53211:68:0;53304:10;;;;;;;;;-1:-1:-1;;;;;53304:10:0;-1:-1:-1;;;;;53292:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53335:22;:20;:22::i;:::-;53168:197::o;11553:120::-;10541:4;10565:7;;;11089:41;;;;-1:-1:-1;;;11089:41:0;;34070:2:1;11089:41:0;;;34052:21:1;34109:2;34089:18;;;34082:30;-1:-1:-1;;;34128:18:1;;;34121:50;34188:18;;11089:41:0;33868:344:1;11089:41:0;11622:5:::1;11612:15:::0;;-1:-1:-1;;11612:15:0::1;::::0;;11643:22:::1;646:10:::0;11652:12:::1;11643:22;;;;;;:::i;:::-;;;;;;;;11553:120::o:0;20615:340::-;10541:4;10565:7;;;10819:9;10811:38;;;;-1:-1:-1;;;10811:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20726:20:0;::::1;20718:58;;;::::0;-1:-1:-1;;;20718:58:0;;34419:2:1;20718:58:0::1;::::0;::::1;34401:21:1::0;34458:2;34438:18;;;34431:30;-1:-1:-1;;;34477:18:1;;;34470:55;34542:18;;20718:58:0::1;34217:349:1::0;20718:58:0::1;-1:-1:-1::0;;;;;20795:22:0;::::1;20787:58;;;::::0;-1:-1:-1;;;20787:58:0;;34773:2:1;20787:58:0::1;::::0;::::1;34755:21:1::0;34812:2;34792:18;;;34785:30;-1:-1:-1;;;34831:18:1;;;34824:53;34894:18;;20787:58:0::1;34571:347:1::0;20787:58:0::1;-1:-1:-1::0;;;;;20858:18:0;;::::1;;::::0;;;:10:::1;:18;::::0;;;;;;;:28;;::::1;::::0;;;;;;;;;;:38;;;20912:35;;1410:25:1;;;20912:35:0::1;::::0;1383:18:1;20912:35:0::1;;;;;;;20615:340:::0;;;:::o;20001:278::-;20094:25;20122:29;20143:7;20122:20;:29::i;:::-;20094:57;;20162:55;20178:7;20187:10;20199:17;20162:15;:55::i;:::-;20251:10;-1:-1:-1;;;;;20233:38:0;20242:7;-1:-1:-1;;;;;20233:38:0;-1:-1:-1;;;;;;;;;;;20263:7:0;20233:38;;;;1410:25:1;;1398:2;1383:18;;1264:177;20233:38:0;;;;;;;;20083:196;20001:278;;;:::o;61824:487::-;61966:6;61961:343;62006:15;:22;61982:14;:21;:46;;62006:22;61982:46;:::i;:::-;61978:1;:50;61961:343;;;62078:14;:21;62050;;62074:25;;:107;;62159:14;:21;62139:15;;62155:25;;:1;:25;:::i;:::-;62139:42;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;62139:42:0;62074:107;;;62119:14;62134:1;62119:17;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;62119:17:0;62074:107;62196:96;;-1:-1:-1;;;62196:96:0;;-1:-1:-1;;;;;35181:15:1;;;62196:96:0;;;35163:34:1;35233:15;;35213:18;;;35206:43;35265:18;;;35258:34;;;62050:131:0;;-1:-1:-1;;;;;;62196:36:0;;;;;35098:18:1;;62196:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62035:269;62030:3;;;;;:::i;:::-;;;;61961:343;;;;61824:487;;;:::o;45571:834::-;45638:7;10565;;;;10819:9;10811:38;;;;-1:-1:-1;;;10811:38:0;;;;;;;:::i;:::-;45696:10:::1;;45686:7;45666:17;;:27;;;;:::i;:::-;:40;45658:78;;;::::0;-1:-1:-1;;;45658:78:0;;35505:2:1;45658:78:0::1;::::0;::::1;35487:21:1::0;35544:2;35524:18;;;35517:30;-1:-1:-1;;;35563:18:1;;;35556:55;35628:18;;45658:78:0::1;35303:349:1::0;45658:78:0::1;45749:4;::::0;:53:::1;::::0;-1:-1:-1;;;45749:53:0;;-1:-1:-1;;;;;45749:4:0;;::::1;::::0;:17:::1;::::0;:53:::1;::::0;45767:10:::1;::::0;45787:4:::1;::::0;45794:7;;45749:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;45823:12:0;45815:43:::1;;;::::0;-1:-1:-1;;;45815:43:0;;35859:2:1;45815:43:0::1;::::0;::::1;35841:21:1::0;35898:2;35878:18;;;35871:30;-1:-1:-1;;;35917:18:1;;;35910:48;35975:18;;45815:43:0::1;35657:342:1::0;45815:43:0::1;45871:14;45888:29;45909:7;45888:20;:29::i;:::-;45871:46:::0;-1:-1:-1;45932:11:0;45928:211:::1;;-1:-1:-1::0;46120:7:0;45928:211:::1;46172:7;46151:17;;:28;;;;;;;:::i;:::-;;;;;;;;46210:7;46190:16;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;46228:31:0::1;::::0;-1:-1:-1;46240:10:0::1;46252:6:::0;46228:11:::1;:31::i;:::-;;46272:51;46304:10;46316:6;46272:31;:51::i;:::-;46341:30;::::0;1410:25:1;;;46351:10:0::1;::::0;46341:30:::1;::::0;1398:2:1;1383:18;46341:30:0::1;;;;;;;46391:6:::0;45571:834;-1:-1:-1;;45571:834:0:o;21218:111::-;-1:-1:-1;;;;;21305:16:0;21278:7;21305:16;;;:6;:16;;;;;;;21218:111::o;11294:118::-;10541:4;10565:7;;;10819:9;10811:38;;;;-1:-1:-1;;;10811:38:0;;;;;;;:::i;:::-;11354:7:::1;:14:::0;;-1:-1:-1;;11354:14:0::1;11364:4;11354:14;::::0;;11384:20:::1;11391:12;646:10:::0;;566:98;62513:535;-1:-1:-1;;;;;62589:31:0;;;;;;:15;:31;;;;;;;;62581:66;;;;-1:-1:-1;;;62581:66:0;;36206:2:1;62581:66:0;;;36188:21:1;36245:2;36225:18;;;36218:30;-1:-1:-1;;;36264:18:1;;;36257:52;36326:18;;62581:66:0;36004:346:1;62581:66:0;62658:17;62678:33;62690:14;62706:4;62678:11;:33::i;:::-;62658:53;;-1:-1:-1;;62730:9:0;:30;;62722:67;;;;-1:-1:-1;;;62722:67:0;;36557:2:1;62722:67:0;;;36539:21:1;36596:2;36576:18;;;36569:30;-1:-1:-1;;;36615:18:1;;;36608:54;36679:18;;62722:67:0;36355:348:1;62722:67:0;62823:14;62838:21;;62802:18;;62823:14;62838:25;;62862:1;;62838:25;:::i;:::-;62823:41;;;;;;;;:::i;:::-;;;;;;;;;;;62875:14;:25;;-1:-1:-1;;;;;62823:41:0;;;;-1:-1:-1;62823:41:0;;62890:9;;62875:25;;;;;;:::i;:::-;;;;;;;;;:38;;;;;-1:-1:-1;;;;;62875:38:0;;;;;-1:-1:-1;;;;;62875:38:0;;;;;;62924:14;:20;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;62924:20:0;;;;;;;-1:-1:-1;;;;;;62924:20:0;;;;;;;;;;;62957:15;:36;;-1:-1:-1;62957:36:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;62957:36:0;;;;;63011:29;;;;;;62957:36;;63011:29;:::i;:::-;;;;;;;;62570:478;;62513:535;:::o;23859:994::-;23953:22;10565:7;;;;10819:9;10811:38;;;;-1:-1:-1;;;10811:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23996:22:0;::::1;23988:61;;;::::0;-1:-1:-1;;;23988:61:0;;37042:2:1;23988:61:0::1;::::0;::::1;37024:21:1::0;37081:2;37061:18;;;37054:30;-1:-1:-1;;;37100:18:1;;;37093:56;37166:18;;23988:61:0::1;36840:350:1::0;23988:61:0::1;-1:-1:-1::0;;;;;24086:16:0;::::1;24062:21;24086:16:::0;;;:6:::1;:16;::::0;;;;;24121:30;;::::1;;24113:70;;;::::0;-1:-1:-1;;;24113:70:0;;37397:2:1;24113:70:0::1;::::0;::::1;37379:21:1::0;37436:2;37416:18;;;37409:30;-1:-1:-1;;;37455:18:1;;;37448:57;37522:18;;24113:70:0::1;37195:351:1::0;24113:70:0::1;24233:13;24213:17;21115:11:::0;;;21038:96;24213:17:::1;:33;;;;:::i;:::-;24257:11;:28:::0;;;24196:50;-1:-1:-1;24317:29:0::1;24333:13:::0;24317;:29:::1;:::i;:::-;-1:-1:-1::0;;;;;24298:16:0;;::::1;;::::0;;;:6:::1;:16;::::0;;;;:48;;;;23859:994;;-1:-1:-1;;23859:994:0:o;22560:905::-;22656:22;10565:7;;;;10819:9;10811:38;;;;-1:-1:-1;;;10811:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22699:24:0;::::1;22691:61;;;::::0;-1:-1:-1;;;22691:61:0;;37753:2:1;22691:61:0::1;::::0;::::1;37735:21:1::0;37792:2;37772:18;;;37765:30;-1:-1:-1;;;37811:18:1;;;37804:54;37875:18;;22691:61:0::1;37551:348:1::0;22691:61:0::1;22802:13;22782:17;21115:11:::0;;;21038:96;22782:17:::1;:33;;;;:::i;:::-;22826:11;:28:::0;;;-1:-1:-1;;;;;22888:18:0;::::1;;::::0;;;:6:::1;:18;::::0;;;;;22765:50;;-1:-1:-1;22888:34:0::1;::::0;22909:13;;22888:34:::1;:::i;:::-;-1:-1:-1::0;;;;;22867:18:0;;::::1;;::::0;;;:6:::1;:18;::::0;;;;:55;;;;-1:-1:-1;22560:905:0;:::o;21675:548::-;10541:4;10565:7;;;10819:9;10811:38;;;;-1:-1:-1;;;10811:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21802:21:0;::::1;21794:64;;;::::0;-1:-1:-1;;;21794:64:0;;38106:2:1;21794:64:0::1;::::0;::::1;38088:21:1::0;38145:2;38125:18;;;38118:30;38184:32;38164:18;;;38157:60;38234:18;;21794:64:0::1;37904:354:1::0;21794:64:0::1;-1:-1:-1::0;;;;;21877:24:0;::::1;21869:65;;;::::0;-1:-1:-1;;;21869:65:0;;38465:2:1;21869:65:0::1;::::0;::::1;38447:21:1::0;38504:2;38484:18;;;38477:30;-1:-1:-1;;;38523:18:1;;;38516:58;38591:18;;21869:65:0::1;38263:352:1::0;21869:65:0::1;-1:-1:-1::0;;;;;21977:15:0;::::1;21947:27;21977:15:::0;;;:6:::1;:15;::::0;;;;;22011:36;;::::1;;22003:80;;;::::0;-1:-1:-1;;;22003:80:0;;38822:2:1;22003:80:0::1;::::0;::::1;38804:21:1::0;38861:2;38841:18;;;38834:30;38900:33;38880:18;;;38873:61;38951:18;;22003:80:0::1;38620:355:1::0;22003:80:0::1;22114:35;22136:13:::0;22114:19;:35:::1;:::i;:::-;-1:-1:-1::0;;;;;22096:15:0;;::::1;;::::0;;;:6:::1;:15;::::0;;;;;:53;;;;22181:18;;::::1;::::0;;;;:34:::1;::::0;22202:13;;22181:34:::1;:::i;:::-;-1:-1:-1::0;;;;;22160:18:0;;::::1;;::::0;;;:6:::1;:18;::::0;;;;:55;;;;-1:-1:-1;;;21675:548:0:o;63162:172::-;-1:-1:-1;;;;;63264:62:0;;63281:1;-1:-1:-1;;;;;;;;;;;63290:35:0;63311:13;63290:20;:35::i;:::-;63264:62;;1410:25:1;;;1398:2;1383:18;63264:62:0;;;;;;;63162:172;;:::o;53453:2473::-;53505:24;53549:9;53544:1017;53592:15;:22;53568:14;:21;:46;;53592:22;53568:46;:::i;:::-;53564:1;:50;53544:1017;;;53661:14;:21;53636:18;;53657:25;;:107;;53742:14;:21;53722:15;;53738:25;;:1;:25;:::i;:::-;53722:42;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;53722:42:0;53657:107;;;53702:14;53717:1;53702:17;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;53702:17:0;53657:107;-1:-1:-1;;;;;53978:24:0;;;;;;:12;:24;;;;;;;;;53952:11;:23;;;;;;;53636:128;;-1:-1:-1;;53948:602:0;;;-1:-1:-1;;;;;54079:24:0;;54025:25;54079:24;;;:12;:24;;;;;;;;;54053:11;:23;;;;;;:50;;54079:24;54053:50;:::i;:::-;54300:16;;54268:4;;:29;;-1:-1:-1;;;54268:29:0;;54025:78;;-1:-1:-1;54300:16:0;;-1:-1:-1;;;;;54268:4:0;;;;:14;;:29;;54291:4;;54268:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;54228:36;54247:17;54228:16;:36;:::i;:::-;:88;54224:311;;54341:37;54361:17;54341:37;;:::i;:::-;-1:-1:-1;;;;;54471:23:0;;;;;;:11;:23;;;;;:44;;54341:37;;-1:-1:-1;54498:17:0;;54471:23;;;:44;;54498:17;;54471:44;:::i;:::-;;;;-1:-1:-1;;54224:311:0;54004:546;53948:602;-1:-1:-1;53616:3:0;;;:::i;:::-;;;53544:1017;;;;54693:16;54673;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;54726:16:0;;:20;;;:43;;;54768:1;54750:15;;:19;54726:43;54722:1197;;;54863:15;:22;:26;;;;:49;;;54911:1;54893:15;;:19;54863:49;54859:148;;;54951:40;54975:15;;54951:23;:40::i;:::-;54933:15;:58;54859:148;55161:1;55142:16;;:20;:43;;;;;55184:1;55166:15;;:19;55142:43;55138:369;;;55206:28;55256:15;;55237:16;;:34;:71;;55292:16;;55237:71;;;55274:15;;55237:71;55206:102;;55347:20;55327:16;;:40;;;;;;;:::i;:::-;;;;;;;;55405:20;55386:15;;:39;;;;;;;:::i;:::-;;;;-1:-1:-1;;55444:4:0;;55458:10;;55444:47;;-1:-1:-1;;;55444:47:0;;-1:-1:-1;;;;;55444:4:0;;;;:13;;:47;;55458:10;;;55470:20;;55444:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55187:320;55138:369;55599:14;:21;:25;55595:313;;55645:12;55690:26;:15;;:24;:26::i;:::-;55660:27;:16;;:25;:27::i;:::-;:56;;;;:::i;:::-;55645:71;-1:-1:-1;55739:10:0;;55735:81;;55774:22;55790:5;55774:15;:22::i;:::-;-1:-1:-1;55853:1:0;55834:16;:20;;;55873:15;:19;53494:2432;53453:2473::o;63762:460::-;63844:7;63864:14;63881:8;:57;;63916:15;:22;63881:57;;;63892:14;:21;63881:57;63864:74;;63954:9;63949:231;63973:6;63969:1;:10;63949:231;;;64001:21;64025:8;:49;;64056:15;64072:1;64056:18;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;64056:18:0;64025:49;;;64036:14;64051:1;64036:17;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;64036:17:0;64025:49;64001:73;;64110:14;-1:-1:-1;;;;;64093:31:0;:13;-1:-1:-1;;;;;64093:31:0;;64089:80;;;-1:-1:-1;64152:1:0;-1:-1:-1;64145:8:0;;-1:-1:-1;64145:8:0;64089:80;-1:-1:-1;63981:3:0;;;:::i;:::-;;;63949:231;;;-1:-1:-1;;;64197:17:0;63762:460;-1:-1:-1;;;;63762:460:0:o;56080:1047::-;56209:15;:22;56147:24;;56249:18;56242:26;;;;:::i;:::-;56281:17;56313:21;56356:9;56351:190;56375:14;56371:1;:18;56351:190;;;56416:13;:33;56430:15;56446:1;56430:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;56430:18:0;56416:33;;;;;;;;;;;;;;;56411:119;;56483:11;:31;56495:15;56511:1;56495:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;56495:18:0;56483:31;;;;;;;;;;;;;56470:44;;;;:::i;:::-;;;56411:119;56391:3;;;:::i;:::-;;;56351:190;;;-1:-1:-1;56557:14:0;56553:34;;-1:-1:-1;56580:7:0;;56080:1047;-1:-1:-1;;;56080:1047:0:o;56553:34::-;56605:9;56600:477;56624:14;56620:1;:18;56600:477;;;56665:13;:33;56679:15;56695:1;56679:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;56679:18:0;56665:33;;;;;;;;;;;;;;;56660:406;;56719:20;56742:11;:31;56754:15;56770:1;56754:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;56754:18:0;56742:31;;;;;;;;;;;;;;-1:-1:-1;56837:9:0;56812:22;56742:31;56812:7;:22;:::i;:::-;:34;;;;:::i;:::-;56792:54;;56889:12;56877:9;:24;:51;;56919:9;56877:51;;;56904:12;56877:51;56865:63;-1:-1:-1;56981:24:0;56865:63;56981:12;:24;:::i;:::-;56947:11;:31;56959:15;56975:1;56959:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;56959:18:0;56947:31;;;;;;;;;;;;:58;57024:26;57041:9;57024:26;;:::i;:::-;;;56700:366;;56660:406;56640:3;;;:::i;:::-;;;56600:477;;;-1:-1:-1;57096:23:0;57106:13;57096:7;:23;:::i;:::-;57089:30;56080:1047;-1:-1:-1;;;;;56080:1047:0:o;70725:181::-;70781:6;-1:-1:-1;;;70808:5:0;:14;70800:67;;;;-1:-1:-1;;;70800:67:0;;39454:2:1;70800:67:0;;;39436:21:1;39493:2;39473:18;;;39466:30;39532:34;39512:18;;;39505:62;-1:-1:-1;;;39583:18:1;;;39576:38;39631:19;;70800:67:0;39252:404:1;70800:67:0;-1:-1:-1;70892:5:0;70725:181::o;57292:4255::-;57376:14;:21;57415:17;57408:25;;;;:::i;:::-;57446:21;57483:13;-1:-1:-1;;;;;57470:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57470:27:0;;57446:51;;57508:29;57554:13;-1:-1:-1;;;;;57540:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57540:28:0;;57508:60;;57579:33;57628:13;-1:-1:-1;;;;;57615:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57615:27:0;;57579:63;;57738:36;57791:13;-1:-1:-1;;;;;57777:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57777:28:0;;57738:67;;57818:21;57854:18;57887:21;57923:19;57978:14;;;;;;;;;;;:34;;;;-1:-1:-1;57996:16:0;;;;;;;57978:34;57974:286;;;58060:17;;58041:15;;:36;58033:87;;;;-1:-1:-1;;;58033:87:0;;39863:2:1;58033:87:0;;;39845:21:1;39902:2;39882:18;;;39875:30;39941:34;39921:18;;;39914:62;-1:-1:-1;;;39992:18:1;;;39985:36;40038:19;;58033:87:0;39661:402:1;58033:87:0;-1:-1:-1;58153:1:0;57974:286;;;58231:13;58209:19;:17;:19::i;:::-;:35;;;;:::i;:::-;58195:49;;57974:286;58274:11;58309:9;58304:523;58328:13;58324:1;:17;58304:523;;;58385:14;58400:1;58385:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58385:17:0;58367:12;58380:1;58367:15;;;;;;;;:::i;:::-;;;;;;:35;-1:-1:-1;;;;;58367:35:0;;;-1:-1:-1;;;;;58367:35:0;;;;;58451:11;:28;58463:12;58476:1;58463:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;58451:28:0;-1:-1:-1;;;;;58451:28:0;;;;;;;;;;;;;58421:17;58439:1;58421:20;;;;;;;;:::i;:::-;;;;;;:59;;;;;58524:11;:28;58536:12;58549:1;58536:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;58524:28:0;-1:-1:-1;;;;;58524:28:0;;;;;;;;;;;;;58499:19;58519:1;58499:22;;;;;;;;:::i;:::-;;;;;;:53;;;;;58609:17;58627:1;58609:20;;;;;;;;:::i;:::-;;;;;;;58587:11;58580:50;;;;:::i;:::-;58573:57;-1:-1:-1;58669:1:0;58653:13;58573:57;58653:6;:13;:::i;:::-;:17;58649:88;;;58695:22;58713:4;58695:22;;:::i;:::-;;;58649:88;58766:4;58755:5;58761:1;58755:8;;;;;;;;:::i;:::-;;;;;;;;;;:15;58789:22;58807:4;58789:22;;:::i;:::-;;-1:-1:-1;58343:3:0;;;:::i;:::-;;;58304:523;;;-1:-1:-1;;58854:19:0;;;:42;;-1:-1:-1;58877:19:0;;58854:42;58850:81;;;58913:7;;;;;;;;;57292:4255;:::o;58850:81::-;58960:1;58943:14;58976:18;;58972:112;;;-1:-1:-1;;;59057:15:0;59058:14;59057:15;:::i;:::-;59040:32;;58972:112;59101:9;59096:432;59120:13;59116:1;:17;59096:432;;;59167:9;59155:21;;:5;59161:1;59155:8;;;;;;;;:::i;:::-;;;;;;:21;;;;;;;:::i;:::-;;;-1:-1:-1;59195:8:0;;59206:1;;59195:5;;59201:1;;59195:8;;;;;;:::i;:::-;;;;;;;:12;59191:326;;;59228:13;59264:14;59255:6;59244:5;59250:1;59244:8;;;;;;;;:::i;:::-;;;;;;;:17;;;;:::i;:::-;:34;;;;:::i;:::-;59228:50;;59297:15;59338:6;59315:17;59333:1;59315:20;;;;;;;;:::i;:::-;;;;;;;:29;;;;:::i;:::-;59297:47;;59402:8;59363:11;:28;59375:12;59388:1;59375:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;59363:28:0;-1:-1:-1;;;;;59363:28:0;;;;;;;;;;;;:48;;;;59453:8;59430:17;59448:1;59430:20;;;;;;;;:::i;:::-;;;;;;;;;;:31;59480:21;59495:6;59480:21;;:::i;:::-;;;59209:308;;59191:326;59135:3;;;:::i;:::-;;;59096:432;;;-1:-1:-1;59555:16:0;59574:20;59583:11;59574:6;:20;:::i;:::-;59555:39;;59625:1;59613:9;:13;59609:660;;;59732:9;59692:11;:28;59704:12;59717:1;59704:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;59692:28:0;-1:-1:-1;;;;;59692:28:0;;;;;;;;;;;;;:50;;;;;;;:::i;:::-;;;;-1:-1:-1;59609:660:0;;-1:-1:-1;59609:660:0;;59793:1;59781:9;:13;59777:492;;;59820:9;59815:439;59839:13;59835:1;:17;:34;;;;;59868:1;59856:9;:13;59835:34;59815:439;;;59899:13;59923:17;59941:1;59923:20;;;;;;;;:::i;:::-;;;;;;;59899:45;;59979:1;59971:5;:9;59967:268;;;60009:17;60045:10;60046:9;60045:10;:::i;:::-;60029:5;:27;:57;;60081:5;60029:57;;;60067:10;60068:9;60067:10;:::i;:::-;60009:77;;60145:9;60113:11;:28;60125:12;60138:1;60125:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;60113:28:0;-1:-1:-1;;;;;60113:28:0;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;-1:-1:-1;60181:30:0;;-1:-1:-1;60201:9:0;60181:30;;:::i;:::-;;;59982:253;59967:268;-1:-1:-1;59871:3:0;;;:::i;:::-;;;59815:439;;;;59777:492;59540:740;60521:27;60568:9;60563:854;60587:13;60583:1;:17;60563:854;;;60684:27;60762:12;60775:1;60762:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;60754:48:0;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;60746:59:0;60714:12;:29;60727:12;60740:1;60727:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;60714:29:0;-1:-1:-1;;;;;60714:29:0;;;;;;;;;;;;;:91;;;;:::i;:::-;60684:121;;60935:19;60955:1;60935:22;;;;;;;;:::i;:::-;;;;;;;60913:19;:44;:183;;;;;61074:19;61094:1;61074:22;;;;;;;;:::i;:::-;;;;;;;61043:11;:28;61055:12;61068:1;61055:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;61043:28:0;-1:-1:-1;;;;;61043:28:0;;;;;;;;;;;;;:53;60913:183;60820:586;;;61218:19;61187:11;:28;61199:12;61212:1;61199:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;61187:28:0;-1:-1:-1;;;;;61187:28:0;;;;;;;;;;;;;:50;:203;;61368:19;61388:1;61368:22;;;;;;;;:::i;:::-;;;;;;;61337:11;:28;61349:12;61362:1;61349:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;61337:28:0;-1:-1:-1;;;;;61337:28:0;;;;;;;;;;;;;:53;;;;:::i;:::-;61187:203;;;61287:19;61307:1;61287:22;;;;;;;;:::i;:::-;;;;;;;61265:19;:44;;;;:::i;:::-;61139:251;;;;:::i;:::-;;;60820:586;-1:-1:-1;60602:3:0;;;:::i;:::-;;;60563:854;;;-1:-1:-1;61433:23:0;;61429:111;;61473:4;;61487:10;;61473:55;;-1:-1:-1;;;61473:55:0;;-1:-1:-1;;;;;61473:4:0;;;;:13;;:55;;61487:10;;;61507:19;;61473:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61429:111;57341:4206;;;;;;;;;;;57292:4255;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1446:247::-;1505:6;1558:2;1546:9;1537:7;1533:23;1529:32;1526:52;;;1574:1;1571;1564:12;1526:52;1613:9;1600:23;1632:31;1657:5;1632:31;:::i;1698:632::-;1869:2;1921:21;;;1991:13;;1894:18;;;2013:22;;;1840:4;;1869:2;2092:15;;;;2066:2;2051:18;;;1840:4;2135:169;2149:6;2146:1;2143:13;2135:169;;;2210:13;;2198:26;;2279:15;;;;2244:12;;;;2171:1;2164:9;2135:169;;;-1:-1:-1;2321:3:1;;1698:632;-1:-1:-1;;;;;;1698:632:1:o;2335:456::-;2412:6;2420;2428;2481:2;2469:9;2460:7;2456:23;2452:32;2449:52;;;2497:1;2494;2487:12;2449:52;2536:9;2523:23;2555:31;2580:5;2555:31;:::i;:::-;2605:5;-1:-1:-1;2662:2:1;2647:18;;2634:32;2675:33;2634:32;2675:33;:::i;:::-;2335:456;;2727:7;;-1:-1:-1;;;2781:2:1;2766:18;;;;2753:32;;2335:456::o;2796:180::-;2855:6;2908:2;2896:9;2887:7;2883:23;2879:32;2876:52;;;2924:1;2921;2914:12;2876:52;-1:-1:-1;2947:23:1;;2796:180;-1:-1:-1;2796:180:1:o;2981:203::-;-1:-1:-1;;;;;3145:32:1;;;;3127:51;;3115:2;3100:18;;2981:203::o;3189:118::-;3275:5;3268:13;3261:21;3254:5;3251:32;3241:60;;3297:1;3294;3287:12;3312:309;3377:6;3385;3438:2;3426:9;3417:7;3413:23;3409:32;3406:52;;;3454:1;3451;3444:12;3406:52;3493:9;3480:23;3512:28;3534:5;3512:28;:::i;3815:196::-;3903:6;3956:3;3944:9;3935:7;3931:23;3927:33;3924:53;;;3973:1;3970;3963:12;4016:131;-1:-1:-1;;;;;4091:31:1;;4081:42;;4071:70;;4137:1;4134;4127:12;4152:1308;4283:6;4291;4299;4307;4315;4323;4331;4339;4347;4400:3;4388:9;4379:7;4375:23;4371:33;4368:53;;;4417:1;4414;4407:12;4368:53;4456:9;4443:23;4475:31;4500:5;4475:31;:::i;:::-;4525:5;-1:-1:-1;4582:2:1;4567:18;;4554:32;4595:33;4554:32;4595:33;:::i;:::-;4647:7;-1:-1:-1;4706:2:1;4691:18;;4678:32;4719:33;4678:32;4719:33;:::i;:::-;4771:7;-1:-1:-1;4830:2:1;4815:18;;4802:32;4843:33;4802:32;4843:33;:::i;:::-;4895:7;-1:-1:-1;4954:3:1;4939:19;;4926:33;4968;4926;4968;:::i;:::-;5020:7;-1:-1:-1;5079:3:1;5064:19;;5051:33;5093;5051;5093;:::i;:::-;5145:7;-1:-1:-1;5204:3:1;5189:19;;5176:33;5218;5176;5218;:::i;:::-;5270:7;-1:-1:-1;5324:3:1;5309:19;;5296:33;;-1:-1:-1;5381:3:1;5366:19;;5353:33;5395;5353;5395;:::i;:::-;5447:7;5437:17;;;4152:1308;;;;;;;;;;;:::o;5465:367::-;5528:8;5538:6;5592:3;5585:4;5577:6;5573:17;5569:27;5559:55;;5610:1;5607;5600:12;5559:55;-1:-1:-1;5633:20:1;;-1:-1:-1;;;;;5665:30:1;;5662:50;;;5708:1;5705;5698:12;5662:50;5745:4;5737:6;5733:17;5721:29;;5805:3;5798:4;5788:6;5785:1;5781:14;5773:6;5769:27;5765:38;5762:47;5759:67;;;5822:1;5819;5812:12;5759:67;5465:367;;;;;:::o;5837:800::-;5986:6;5994;6002;6010;6063:2;6051:9;6042:7;6038:23;6034:32;6031:52;;;6079:1;6076;6069:12;6031:52;6106:23;;-1:-1:-1;;;;;6178:14:1;;;6175:34;;;6205:1;6202;6195:12;6175:34;6244:70;6306:7;6297:6;6286:9;6282:22;6244:70;:::i;:::-;6333:8;;-1:-1:-1;6218:96:1;-1:-1:-1;6421:2:1;6406:18;;6393:32;;-1:-1:-1;6437:16:1;;;6434:36;;;6466:1;6463;6456:12;6434:36;;6505:72;6569:7;6558:8;6547:9;6543:24;6505:72;:::i;:::-;5837:800;;;;-1:-1:-1;6596:8:1;-1:-1:-1;;;;5837:800:1:o;6642:117::-;6727:6;6720:5;6716:18;6709:5;6706:29;6696:57;;6749:1;6746;6739:12;6764:381;6840:6;6848;6856;6909:2;6897:9;6888:7;6884:23;6880:32;6877:52;;;6925:1;6922;6915:12;6877:52;6961:9;6948:23;6938:33;;7018:2;7007:9;7003:18;6990:32;6980:42;;7072:2;7061:9;7057:18;7044:32;7085:30;7109:5;7085:30;:::i;:::-;7134:5;7124:15;;;6764:381;;;;;:::o;7150:247::-;7209:6;7262:2;7250:9;7241:7;7237:23;7233:32;7230:52;;;7278:1;7275;7268:12;7230:52;7317:9;7304:23;7336:31;7361:5;7336:31;:::i;7402:248::-;7470:6;7478;7531:2;7519:9;7510:7;7506:23;7502:32;7499:52;;;7547:1;7544;7537:12;7499:52;-1:-1:-1;;7570:23:1;;;7640:2;7625:18;;;7612:32;;-1:-1:-1;7402:248:1:o;8048:315::-;8116:6;8124;8177:2;8165:9;8156:7;8152:23;8148:32;8145:52;;;8193:1;8190;8183:12;8145:52;8229:9;8216:23;8206:33;;8289:2;8278:9;8274:18;8261:32;8302:31;8327:5;8302:31;:::i;:::-;8352:5;8342:15;;;8048:315;;;;;:::o;8368:523::-;8442:6;8450;8458;8511:2;8499:9;8490:7;8486:23;8482:32;8479:52;;;8527:1;8524;8517:12;8479:52;8566:9;8553:23;8585:30;8609:5;8585:30;:::i;:::-;8634:5;-1:-1:-1;8691:2:1;8676:18;;8663:32;8704;8663;8704;:::i;:::-;8755:7;-1:-1:-1;8814:2:1;8799:18;;8786:32;8827;8786;8827;:::i;9149:241::-;9205:6;9258:2;9246:9;9237:7;9233:23;9229:32;9226:52;;;9274:1;9271;9264:12;9226:52;9313:9;9300:23;9332:28;9354:5;9332:28;:::i;9395:388::-;9463:6;9471;9524:2;9512:9;9503:7;9499:23;9495:32;9492:52;;;9540:1;9537;9530:12;9492:52;9579:9;9566:23;9598:31;9623:5;9598:31;:::i;:::-;9648:5;-1:-1:-1;9705:2:1;9690:18;;9677:32;9718:33;9677:32;9718:33;:::i;9788:658::-;9959:2;10011:21;;;10081:13;;9984:18;;;10103:22;;;9930:4;;9959:2;10182:15;;;;10156:2;10141:18;;;9930:4;10225:195;10239:6;10236:1;10233:13;10225:195;;;10304:13;;-1:-1:-1;;;;;10300:39:1;10288:52;;10395:15;;;;10360:12;;;;10336:1;10254:9;10225:195;;10451:274;10625:25;;;-1:-1:-1;;;;;10686:32:1;10681:2;10666:18;;10659:60;10613:2;10598:18;;10451:274::o;10730:245::-;10797:6;10850:2;10838:9;10829:7;10825:23;10821:32;10818:52;;;10866:1;10863;10856:12;10818:52;10898:9;10892:16;10917:28;10939:5;10917:28;:::i;10980:342::-;11182:2;11164:21;;;11221:2;11201:18;;;11194:30;-1:-1:-1;;;11255:2:1;11240:18;;11233:48;11313:2;11298:18;;10980:342::o;11327:380::-;11406:1;11402:12;;;;11449;;;11470:61;;11524:4;11516:6;11512:17;11502:27;;11470:61;11577:2;11569:6;11566:14;11546:18;11543:38;11540:161;;;11623:10;11618:3;11614:20;11611:1;11604:31;11658:4;11655:1;11648:15;11686:4;11683:1;11676:15;11712:340;11914:2;11896:21;;;11953:2;11933:18;;;11926:30;-1:-1:-1;;;11987:2:1;11972:18;;11965:46;12043:2;12028:18;;11712:340::o;12057:184::-;12127:6;12180:2;12168:9;12159:7;12155:23;12151:32;12148:52;;;12196:1;12193;12186:12;12148:52;-1:-1:-1;12219:16:1;;12057:184;-1:-1:-1;12057:184:1:o;12598:127::-;12659:10;12654:3;12650:20;12647:1;12640:31;12690:4;12687:1;12680:15;12714:4;12711:1;12704:15;12730:128;12770:3;12801:1;12797:6;12794:1;12791:13;12788:39;;;12807:18;;:::i;:::-;-1:-1:-1;12843:9:1;;12730:128::o;12863:127::-;12924:10;12919:3;12915:20;12912:1;12905:31;12955:4;12952:1;12945:15;12979:4;12976:1;12969:15;12995:125;13035:4;13063:1;13060;13057:8;13054:34;;;13068:18;;:::i;:::-;-1:-1:-1;13105:9:1;;12995:125::o;13125:127::-;13186:10;13181:3;13177:20;13174:1;13167:31;13217:4;13214:1;13207:15;13241:4;13238:1;13231:15;13446:135;13485:3;-1:-1:-1;;13506:17:1;;13503:43;;;13526:18;;:::i;:::-;-1:-1:-1;13573:1:1;13562:13;;13446:135::o;14685:245::-;14743:6;14796:2;14784:9;14775:7;14771:23;14767:32;14764:52;;;14812:1;14809;14802:12;14764:52;14851:9;14838:23;14870:30;14894:5;14870:30;:::i;15698:859::-;15867:5;15854:19;15882:32;15906:7;15882:32;:::i;:::-;15946:6;15937:7;15933:20;15923:30;;15978:4;15972:11;16029:2;16020:5;16016:10;16012:2;16008:19;16005:27;15999:4;15992:41;16081:2;16074:5;16070:14;16057:28;16094:33;16119:7;16094:33;:::i;:::-;-1:-1:-1;;;;;;16155:33:1;;;;16152:41;;;16203:2;16199:16;;;;-1:-1:-1;;;;;16195:46:1;16149:93;16136:107;;16230:1;16270:12;;16330:2;16319:14;;16306:28;16343:33;16306:28;16343:33;:::i;:::-;16411:17;;-1:-1:-1;;;;;;16407:48:1;-1:-1:-1;;;;;16457:33:1;;;;16404:87;16385:107;;16546:2;16535:14;;;;16522:28;16518:1;16508:12;;;;16501:50;15698:859::o;19293:224::-;19332:3;19360:6;19393:2;19390:1;19386:10;19423:2;19420:1;19416:10;19454:3;19450:2;19446:12;19441:3;19438:21;19435:47;;;19462:18;;:::i;:::-;19498:13;;19293:224;-1:-1:-1;;;;19293:224:1:o;20228:545::-;20321:4;20327:6;20387:11;20374:25;20481:2;20477:7;20466:8;20450:14;20446:29;20442:43;20422:18;20418:68;20408:96;;20500:1;20497;20490:12;20408:96;20527:33;;20579:20;;;-1:-1:-1;;;;;;20611:30:1;;20608:50;;;20654:1;20651;20644:12;20608:50;20687:4;20675:17;;-1:-1:-1;20738:1:1;20734:14;;;20718;20714:35;20704:46;;20701:66;;;20763:1;20760;20753:12;21138:486;21327:2;21309:21;;;21346:18;;21339:34;;;-1:-1:-1;;;;;;21385:31:1;;21382:51;;;21429:1;21426;21419:12;21382:51;21463:6;21460:1;21456:14;21520:6;21512;21507:2;21496:9;21492:18;21479:48;21597:1;21550:22;;21574:2;21546:31;21586:13;;;-1:-1:-1;21546:31:1;21138:486;-1:-1:-1;;21138:486:1:o;24492:251::-;24562:6;24615:2;24603:9;24594:7;24590:23;24586:32;24583:52;;;24631:1;24628;24621:12;24583:52;24663:9;24657:16;24682:31;24707:5;24682:31;:::i;25109:345::-;-1:-1:-1;;;;;25329:32:1;;;;25311:51;;25393:2;25378:18;;25371:34;;;;25436:2;25421:18;;25414:34;25299:2;25284:18;;25109:345::o;25868:::-;26070:2;26052:21;;;26109:2;26089:18;;;26082:30;-1:-1:-1;;;26143:2:1;26128:18;;26121:51;26204:2;26189:18;;25868:345::o;26218:375::-;-1:-1:-1;;;;;26476:15:1;;;26458:34;;26528:15;;;;26523:2;26508:18;;26501:43;26575:2;26560:18;;26553:34;;;;26408:2;26393:18;;26218:375::o;26598:168::-;26638:7;26704:1;26700;26696:6;26692:14;26689:1;26686:21;26681:1;26674:9;26667:17;26663:45;26660:71;;;26711:18;;:::i;:::-;-1:-1:-1;26751:9:1;;26598:168::o;26771:127::-;26832:10;26827:3;26823:20;26820:1;26813:31;26863:4;26860:1;26853:15;26887:4;26884:1;26877:15;26903:120;26943:1;26969;26959:35;;26974:18;;:::i;:::-;-1:-1:-1;27008:9:1;;26903:120::o;28279:245::-;28358:6;28366;28419:2;28407:9;28398:7;28394:23;28390:32;28387:52;;;28435:1;28432;28425:12;28387:52;-1:-1:-1;;28458:16:1;;28514:2;28499:18;;;28493:25;28458:16;;28493:25;;-1:-1:-1;28279:245:1:o;30696:274::-;-1:-1:-1;;;;;30888:32:1;;;;30870:51;;30952:2;30937:18;;30930:34;30858:2;30843:18;;30696:274::o;32078:127::-;32139:10;32134:3;32130:20;32127:1;32120:31;32170:4;32167:1;32160:15;32194:4;32191:1;32184:15;32210:217;32249:4;32278:6;32334:10;;;;32304;;32356:12;;;32353:38;;;32371:18;;:::i;:::-;32408:13;;32210:217;-1:-1:-1;;;32210:217:1:o;36708:127::-;36769:10;36764:3;36760:20;36757:1;36750:31;36800:4;36797:1;36790:15;36824:4;36821:1;36814:15;38980:267;39019:4;39048:9;;;39073:10;;-1:-1:-1;;;39092:19:1;;39085:27;;39069:44;39066:70;;;39116:18;;:::i;:::-;-1:-1:-1;;;;;39163:27:1;;39156:35;;39148:44;;39145:70;;;39195:18;;:::i;:::-;-1:-1:-1;;39232:9:1;;38980:267::o;40068:553::-;40107:7;-1:-1:-1;;;;;40177:9:1;;;40205;;;40230:11;;;40249:10;;;40243:17;;40226:35;40223:61;;;40264:18;;:::i;:::-;-1:-1:-1;;;40340:1:1;40333:9;;40358:11;;;40378;;;40371:19;;40354:37;40351:63;;;40394:18;;:::i;:::-;40440:1;40437;40433:9;40423:19;;40487:1;40483:2;40478:11;40475:1;40471:19;40466:2;40462;40458:11;40454:37;40451:63;;;40494:18;;:::i;:::-;40559:1;40555:2;40550:11;40547:1;40543:19;40538:2;40534;40530:11;40526:37;40523:63;;;40566:18;;:::i;:::-;-1:-1:-1;;;40606:9:1;;;;;40068:553;-1:-1:-1;;;40068:553:1:o;40626:265::-;40665:3;40693:9;;;40718:10;;-1:-1:-1;;;;;40737:27:1;;;40730:35;;40714:52;40711:78;;;40769:18;;:::i;:::-;-1:-1:-1;;;40816:19:1;;;40809:27;;40801:36;;40798:62;;;40840:18;;:::i;:::-;-1:-1:-1;;40876:9:1;;40626:265::o;40896:136::-;40931:3;-1:-1:-1;;;40952:22:1;;40949:48;;;40977:18;;:::i;:::-;-1:-1:-1;41017:1:1;41013:13;;40896:136::o;41037:193::-;41076:1;41102;41092:35;;41107:18;;:::i;:::-;-1:-1:-1;;;41143:18:1;;-1:-1:-1;;41163:13:1;;41139:38;41136:64;;;41180:18;;:::i;:::-;-1:-1:-1;41214:10:1;;41037:193::o;41235:251::-;41305:6;41358:2;41346:9;41337:7;41333:23;41329:32;41326:52;;;41374:1;41371;41364:12;41326:52;41406:9;41400:16;41425:31;41450:5;41425:31;:::i
Swarm Source
ipfs://d121a6c6aa8ff56232ce49a2146199d43ec0e6548a229d5e808a0acf0129c870
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.