ETH Price: $3,276.46 (-1.62%)

Contract

0x8FC8551dd5E2Dc5d2B04f2957E543D7d53a79f1e
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim Rewards Fo...127723122021-07-06 6:28:441266 days ago1625552924IN
0x8FC8551d...d53a79f1e
0 ETH0.0002639310
Claim Rewards Fo...127259442021-06-29 1:06:241273 days ago1624928784IN
0x8FC8551d...d53a79f1e
0 ETH0.0003193512.1
Withdraw127013352021-06-25 5:08:011277 days ago1624597681IN
0x8FC8551d...d53a79f1e
0 ETH0.0006831810
Claim Rewards Fo...127013262021-06-25 5:06:421277 days ago1624597602IN
0x8FC8551d...d53a79f1e
0 ETH0.0019607610
Claim Rewards Fo...126669762021-06-19 20:32:261282 days ago1624134746IN
0x8FC8551d...d53a79f1e
0 ETH0.000211148
Withdraw126373742021-06-15 6:11:001287 days ago1623737460IN
0x8FC8551d...d53a79f1e
0 ETH0.0012617514
Withdraw126373682021-06-15 6:09:451287 days ago1623737385IN
0x8FC8551d...d53a79f1e
0 ETH0.0010500414
Claim Rewards Fo...125802372021-06-06 9:51:391295 days ago1622973099IN
0x8FC8551d...d53a79f1e
0 ETH0.0002903211.00000145
Withdraw125489042021-06-01 13:44:221300 days ago1622555062IN
0x8FC8551d...d53a79f1e
0 ETH0.0040402420
Withdraw125466982021-06-01 5:22:171301 days ago1622524937IN
0x8FC8551d...d53a79f1e
0 ETH0.0031286916.5
Withdraw125459972021-06-01 2:44:361301 days ago1622515476IN
0x8FC8551d...d53a79f1e
0 ETH0.005688930
Withdraw125456582021-06-01 1:30:301301 days ago1622511030IN
0x8FC8551d...d53a79f1e
0 ETH0.0056885430
Withdraw125439022021-05-31 19:08:161301 days ago1622488096IN
0x8FC8551d...d53a79f1e
0 ETH0.0034131218
Withdraw125428802021-05-31 15:22:171301 days ago1622474537IN
0x8FC8551d...d53a79f1e
0 ETH0.0109086454
Withdraw125420812021-05-31 12:18:271301 days ago1622463507IN
0x8FC8551d...d53a79f1e
0 ETH0.0014349321
Claim Rewards Fo...125420232021-05-31 12:06:521301 days ago1622462812IN
0x8FC8551d...d53a79f1e
0 ETH0.0038573221
Withdraw125410452021-05-31 8:24:071301 days ago1622449447IN
0x8FC8551d...d53a79f1e
0 ETH0.0017001318
Withdraw125408252021-05-31 7:35:101301 days ago1622446510IN
0x8FC8551d...d53a79f1e
0 ETH0.0044637423
Withdraw125392322021-05-31 1:38:031302 days ago1622425083IN
0x8FC8551d...d53a79f1e
0 ETH0.0048517525
Claim Rewards Fo...125392262021-05-31 1:36:111302 days ago1622424971IN
0x8FC8551d...d53a79f1e
0 ETH0.0047033525
Withdraw125391842021-05-31 1:24:371302 days ago1622424277IN
0x8FC8551d...d53a79f1e
0 ETH0.0034932618
Claim Rewards Fo...125369032021-05-30 16:53:211302 days ago1622393601IN
0x8FC8551d...d53a79f1e
0 ETH0.0005225819.8
Withdraw125362852021-05-30 14:30:041302 days ago1622385004IN
0x8FC8551d...d53a79f1e
0 ETH0.0022531225
Withdraw125362062021-05-30 14:12:481302 days ago1622383968IN
0x8FC8551d...d53a79f1e
0 ETH0.0048517525
Withdraw125359422021-05-30 13:09:171302 days ago1622380157IN
0x8FC8551d...d53a79f1e
0 ETH0.0023589522
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BonusRewards

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-20
*/

// Sources flattened with hardhat v2.0.7 https://hardhat.org

// File contracts/utils/Ownable.sol

// SPDX-License-Identifier: None

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 * @author crypto-pumpkin@github
 *
 * By initialization, the owner account will be the one that called initializeOwner. This
 * can later be changed with {transferOwnership}.
 */
contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev COVER: Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File contracts/utils/ReentrancyGuard.sol

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File contracts/interfaces/IERC20.sol

pragma solidity ^0.8.0;

/**
 * @title Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    function decimals() external view returns (uint8);
    function balanceOf(address account) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);
}


// File contracts/utils/Address.sol

pragma solidity ^0.8.0;

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File contracts/utils/SafeERC20.sol

pragma solidity ^0.8.0;


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender) - value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File contracts/interfaces/IBonusRewards.sol

pragma solidity ^0.8.0;

/**
 * @title Cover Protocol Bonus Token Rewards Interface
 * @author crypto-pumpkin
 */
interface IBonusRewards {
  event Deposit(address indexed user, address indexed lpToken, uint256 amount);
  event Withdraw(address indexed user, address indexed lpToken, uint256 amount);

  struct Bonus {
    address bonusTokenAddr; // the external bonus token, like CRV
    uint48 startTime;
    uint48 endTime;
    uint256 weeklyRewards; // total amount to be distributed from start to end
    uint256 accRewardsPerToken; // accumulated bonus to the lastUpdated Time
    uint256 remBonus; // remaining bonus in contract
  }

  struct Pool {
    Bonus[] bonuses;
    uint256 lastUpdatedAt; // last accumulated bonus update timestamp
  }

  struct User {
    uint256 amount;
    uint256[] rewardsWriteoffs; // the amount of bonus tokens to write off when calculate rewards from last update
  }

  function getPoolList() external view returns (address[] memory);
  function getResponders() external view returns (address[] memory);
  function getPool(address _lpToken) external view returns (Pool memory);
  function getUser(address _lpToken, address _account) external view returns (User memory _user, uint256[] memory _rewards);
  function getAuthorizers(address _lpToken, address _bonusTokenAddr) external view returns (address[] memory);
  function viewRewards(address _lpToken, address _user) external view  returns (uint256[] memory);

  function claimRewardsForPools(address[] calldata _lpTokens) external;
  function deposit(address _lpToken, uint256 _amount) external;
  function withdraw(address _lpToken, uint256 _amount) external;
  function emergencyWithdraw(address[] calldata _lpTokens) external;
  function addBonus(
    address _lpToken,
    address _bonusTokenAddr,
    uint48 _startTime,
    uint256 _weeklyRewards,
    uint256 _transferAmount
  ) external;
  function extendBonus(
    address _lpToken,
    uint256 _poolBonusId,
    address _bonusTokenAddr,
    uint256 _transferAmount
  ) external;
  function updateBonus(
    address _lpToken,
    address _bonusTokenAddr,
    uint256 _weeklyRewards,
    uint48 _startTime
  ) external;

  // only owner
  function setResponders(address[] calldata _responders) external;
  function setPaused(bool _paused) external;
  function collectDust(address _token, address _lpToken, uint256 _poolBonusId) external;
  function addPoolsAndAllowBonus(
    address[] calldata _lpTokens,
    address[] calldata _bonusTokenAddrs,
    address[] calldata _authorizers
  ) external;
}


// File contracts/BonusRewards.sol

pragma solidity ^0.8.0;




/**
 * @title Cover Protocol Bonus Token Rewards contract
 * @author crypto-pumpkin
 * @notice ETH is not allowed to be an bonus token, use wETH instead
 * @notice We support multiple bonus tokens for each pool. However, each pool will have 1 bonus token normally, may have 2 in rare cases
 */
contract BonusRewards is IBonusRewards, Ownable, ReentrancyGuard {
  using SafeERC20 for IERC20;

  bool public paused;
  uint256 private constant WEEK = 7 days;
  // help calculate rewards/bonus PerToken only. 1e12 will allow meaningful $1 deposit in a $1bn pool  
  uint256 private constant CAL_MULTIPLIER = 1e30;
  // use array to allow convinient replacement. Size of responders should be very small to 0 till a reputible responder multi-sig within DeFi or Yearn ecosystem is established
  address[] private responders;
  address[] private poolList;
  // lpToken => Pool
  mapping(address => Pool) private pools;
  // lpToken => User address => User data
  mapping(address => mapping(address => User)) private users;
  // use array to allow convinient replacement. Size of Authorizers should be very small (one or two partner addresses for the pool and bonus)
  // lpToken => bonus token => [] allowed authorizers to add bonus tokens
  mapping(address => mapping(address => address[])) private allowedTokenAuthorizers;
  // bonusTokenAddr => 1, used to avoid collecting bonus token when not ready
  mapping(address => uint8) private bonusTokenAddrMap;

  modifier notPaused() {
    require(!paused, "BonusRewards: paused");
    _;
  }

  function claimRewardsForPools(address[] calldata _lpTokens) external override nonReentrant notPaused {
    for (uint256 i = 0; i < _lpTokens.length; i++) {
      address lpToken = _lpTokens[i];
      User memory user = users[lpToken][msg.sender];
      if (user.amount == 0) continue;
      _updatePool(lpToken);
      _claimRewards(lpToken, user);
      _updateUserWriteoffs(lpToken);
    }
  }

  function deposit(address _lpToken, uint256 _amount) external override nonReentrant notPaused {
    require(pools[_lpToken].lastUpdatedAt > 0, "Blacksmith: pool does not exists");
    require(IERC20(_lpToken).balanceOf(msg.sender) >= _amount, "Blacksmith: insufficient balance");

    _updatePool(_lpToken);
    User storage user = users[_lpToken][msg.sender];
    _claimRewards(_lpToken, user);

    IERC20 token = IERC20(_lpToken);
    uint256 balanceBefore = token.balanceOf(address(this));
    token.safeTransferFrom(msg.sender, address(this), _amount);
    uint256 received = token.balanceOf(address(this)) - balanceBefore;

    user.amount = user.amount + received;
    _updateUserWriteoffs(_lpToken);
    emit Deposit(msg.sender, _lpToken, received);
  }

  /// @notice withdraw up to all user deposited
  function withdraw(address _lpToken, uint256 _amount) external override nonReentrant notPaused {
    require(pools[_lpToken].lastUpdatedAt > 0, "Blacksmith: pool does not exists");
    _updatePool(_lpToken);

    User storage user = users[_lpToken][msg.sender];
    _claimRewards(_lpToken, user);
    uint256 amount = user.amount > _amount ? _amount : user.amount;
    user.amount = user.amount - amount;
    _updateUserWriteoffs(_lpToken);

    _safeTransfer(_lpToken, amount);
    emit Withdraw(msg.sender, _lpToken, amount);
  }

  /// @notice withdraw all without rewards
  function emergencyWithdraw(address[] calldata _lpTokens) external override nonReentrant {
    for (uint256 i = 0; i < _lpTokens.length; i++) {
      User storage user = users[_lpTokens[i]][msg.sender];
      uint256 amount = user.amount;
      user.amount = 0;
      _safeTransfer(_lpTokens[i], amount);
      emit Withdraw(msg.sender, _lpTokens[i], amount);
    }
  }

  /// @notice called by authorizers only
  function addBonus(
    address _lpToken,
    address _bonusTokenAddr,
    uint48 _startTime,
    uint256 _weeklyRewards,
    uint256 _transferAmount
  ) external override nonReentrant notPaused {
    require(_isAuthorized(allowedTokenAuthorizers[_lpToken][_bonusTokenAddr]), "BonusRewards: not authorized caller");
    require(_startTime >= block.timestamp, "BonusRewards: startTime in the past");

    // make sure the pool is in the right state (exist with no active bonus at the moment) to add new bonus tokens
    Pool memory pool = pools[_lpToken];
    require(pool.lastUpdatedAt > 0, "BonusRewards: pool does not exist");
    Bonus[] memory bonuses = pool.bonuses;
    for (uint256 i = 0; i < bonuses.length; i++) {
      if (bonuses[i].bonusTokenAddr == _bonusTokenAddr) {
        // when there is alreay a bonus program with the same bonus token, make sure the program has ended properly
        require(bonuses[i].endTime + WEEK < block.timestamp, "BonusRewards: last bonus period hasn't ended");
        require(bonuses[i].remBonus == 0, "BonusRewards: last bonus not all claimed");
      }
    }

    IERC20 bonusTokenAddr = IERC20(_bonusTokenAddr);
    uint256 balanceBefore = bonusTokenAddr.balanceOf(address(this));
    bonusTokenAddr.safeTransferFrom(msg.sender, address(this), _transferAmount);
    uint256 received = bonusTokenAddr.balanceOf(address(this)) - balanceBefore;
    // endTime is based on how much tokens transfered v.s. planned weekly rewards
    uint48 endTime = uint48(received * WEEK / _weeklyRewards + _startTime);

    pools[_lpToken].bonuses.push(Bonus({
      bonusTokenAddr: _bonusTokenAddr,
      startTime: _startTime,
      endTime: endTime,
      weeklyRewards: _weeklyRewards,
      accRewardsPerToken: 0,
      remBonus: received
    }));
  }

  /// @notice called by authorizers only, update weeklyRewards (if not ended), or update startTime (only if rewards not started, 0 is ignored)
  function updateBonus(
    address _lpToken,
    address _bonusTokenAddr,
    uint256 _weeklyRewards,
    uint48 _startTime
  ) external override nonReentrant notPaused {
    require(_isAuthorized(allowedTokenAuthorizers[_lpToken][_bonusTokenAddr]), "BonusRewards: not authorized caller");
    require(_startTime == 0 || _startTime > block.timestamp, "BonusRewards: startTime in the past");

    // make sure the pool is in the right state (exist with no active bonus at the moment) to add new bonus tokens
    Pool memory pool = pools[_lpToken];
    require(pool.lastUpdatedAt > 0, "BonusRewards: pool does not exist");
    Bonus[] memory bonuses = pool.bonuses;
    for (uint256 i = 0; i < bonuses.length; i++) {
      if (bonuses[i].bonusTokenAddr == _bonusTokenAddr && bonuses[i].endTime > block.timestamp) {
        Bonus storage bonus = pools[_lpToken].bonuses[i];
        _updatePool(_lpToken); // update pool with old weeklyReward to this block
        if (bonus.startTime >= block.timestamp) {
          // only honor new start time, if program has not started
          if (_startTime >= block.timestamp) {
            bonus.startTime = _startTime;
          }
          bonus.endTime = uint48(bonus.remBonus * WEEK / _weeklyRewards + bonus.startTime);
        } else {
          uint256 remBonusToDistribute = (bonus.endTime - block.timestamp) * bonus.weeklyRewards / WEEK;
          bonus.endTime = uint48(remBonusToDistribute * WEEK / _weeklyRewards + block.timestamp);
        }
        bonus.weeklyRewards = _weeklyRewards;
      }
    }
  }

  /// @notice extend the current bonus program, the program has to be active (endTime is in the future)
  function extendBonus(
    address _lpToken,
    uint256 _poolBonusId,
    address _bonusTokenAddr,
    uint256 _transferAmount
  ) external override nonReentrant notPaused {
    require(_isAuthorized(allowedTokenAuthorizers[_lpToken][_bonusTokenAddr]), "BonusRewards: not authorized caller");

    Bonus memory bonus = pools[_lpToken].bonuses[_poolBonusId];
    require(bonus.bonusTokenAddr == _bonusTokenAddr, "BonusRewards: bonus and id dont match");
    require(bonus.endTime > block.timestamp, "BonusRewards: bonus program ended, please start a new one");

    IERC20 bonusTokenAddr = IERC20(_bonusTokenAddr);
    uint256 balanceBefore = bonusTokenAddr.balanceOf(address(this));
    bonusTokenAddr.safeTransferFrom(msg.sender, address(this), _transferAmount);
    uint256 received = bonusTokenAddr.balanceOf(address(this)) - balanceBefore;
    // endTime is based on how much tokens transfered v.s. planned weekly rewards
    uint48 endTime = uint48(received * WEEK / bonus.weeklyRewards + bonus.endTime);

    pools[_lpToken].bonuses[_poolBonusId].endTime = endTime;
    pools[_lpToken].bonuses[_poolBonusId].remBonus = bonus.remBonus + received;
  }

  /// @notice add pools and authorizers to add bonus tokens for pools, combine two calls into one. Only reason we add pools is when bonus tokens will be added
  function addPoolsAndAllowBonus(
    address[] calldata _lpTokens,
    address[] calldata _bonusTokenAddrs,
    address[] calldata _authorizers
  ) external override onlyOwner notPaused {
    // add pools
    uint256 currentTime = block.timestamp;
    for (uint256 i = 0; i < _lpTokens.length; i++) {
      address _lpToken = _lpTokens[i];
      require(IERC20(_lpToken).decimals() <= 18, "BonusRewards: lptoken decimals > 18");
      if (pools[_lpToken].lastUpdatedAt == 0) {
        pools[_lpToken].lastUpdatedAt = currentTime;
        poolList.push(_lpToken);
      }

      // add bonus tokens and their authorizers (who are allowed to add the token to pool)
      for (uint256 j = 0; j < _bonusTokenAddrs.length; j++) {
        address _bonusTokenAddr = _bonusTokenAddrs[j];
        require(pools[_bonusTokenAddr].lastUpdatedAt == 0, "BonusRewards: lpToken, not allowed");
        allowedTokenAuthorizers[_lpToken][_bonusTokenAddr] = _authorizers;
        bonusTokenAddrMap[_bonusTokenAddr] = 1;
      }
    }
  }

  /// @notice collect bonus token dust to treasury
  function collectDust(address _token, address _lpToken, uint256 _poolBonusId) external override onlyOwner {
    require(pools[_token].lastUpdatedAt == 0, "BonusRewards: lpToken, not allowed");

    if (_token == address(0)) { // token address(0) = ETH
      payable(owner()).transfer(address(this).balance);
    } else {
      uint256 balance = IERC20(_token).balanceOf(address(this));
      if (bonusTokenAddrMap[_token] == 1) {
        // bonus token
        Bonus memory bonus = pools[_lpToken].bonuses[_poolBonusId];
        require(bonus.bonusTokenAddr == _token, "BonusRewards: wrong pool");
        require(bonus.endTime + WEEK < block.timestamp, "BonusRewards: not ready");
        balance = bonus.remBonus;
        pools[_lpToken].bonuses[_poolBonusId].remBonus = 0;
      }

      IERC20(_token).transfer(owner(), balance);
    }
  }

  function setResponders(address[] calldata _responders) external override onlyOwner {
    responders = _responders;
  }

  function setPaused(bool _paused) external override {
    require(_isAuthorized(responders), "BonusRewards: caller not responder");
    paused = _paused;
  }

  function getPool(address _lpToken) external view override returns (Pool memory) {
    return pools[_lpToken];
  }

  function getUser(address _lpToken, address _account) external view override returns (User memory, uint256[] memory) {
    return (users[_lpToken][_account], viewRewards(_lpToken, _account));
  }

  function getAuthorizers(address _lpToken, address _bonusTokenAddr) external view override returns (address[] memory) {
    return allowedTokenAuthorizers[_lpToken][_bonusTokenAddr];
  }

  function getResponders() external view override returns (address[] memory) {
    return responders;
  }

  function viewRewards(address _lpToken, address _user) public view override returns (uint256[] memory) {
    Pool memory pool = pools[_lpToken];
    User memory user = users[_lpToken][_user];
    uint256[] memory rewards = new uint256[](pool.bonuses.length);
    if (user.amount <= 0) return rewards;

    uint256 rewardsWriteoffsLen = user.rewardsWriteoffs.length;
    for (uint256 i = 0; i < rewards.length; i ++) {
      Bonus memory bonus = pool.bonuses[i];
      if (bonus.startTime < block.timestamp && bonus.remBonus > 0) {
        uint256 lpTotal = IERC20(_lpToken).balanceOf(address(this));
        uint256 bonusForTime = _calRewardsForTime(bonus, pool.lastUpdatedAt);
        uint256 bonusPerToken = bonus.accRewardsPerToken + bonusForTime / lpTotal;
        uint256 rewardsWriteoff = rewardsWriteoffsLen <= i ? 0 : user.rewardsWriteoffs[i];
        uint256 reward = user.amount * bonusPerToken / CAL_MULTIPLIER - rewardsWriteoff;
        rewards[i] = reward < bonus.remBonus ? reward : bonus.remBonus;
      }
    }
    return rewards;
  }


  function getPoolList() external view override returns (address[] memory) {
    return poolList;
  }

  /// @notice update pool's bonus per staked token till current block timestamp, do nothing if pool does not exist
  function _updatePool(address _lpToken) private {
    Pool storage pool = pools[_lpToken];
    uint256 poolLastUpdatedAt = pool.lastUpdatedAt;
    if (poolLastUpdatedAt == 0 || block.timestamp <= poolLastUpdatedAt) return;
    pool.lastUpdatedAt = block.timestamp;
    uint256 lpTotal = IERC20(_lpToken).balanceOf(address(this));
    if (lpTotal == 0) return;

    for (uint256 i = 0; i < pool.bonuses.length; i ++) {
      Bonus storage bonus = pool.bonuses[i];
      if (poolLastUpdatedAt < bonus.endTime && bonus.startTime < block.timestamp) {
        uint256 bonusForTime = _calRewardsForTime(bonus, poolLastUpdatedAt);
        bonus.accRewardsPerToken = bonus.accRewardsPerToken + bonusForTime / lpTotal;
      }
    }
  }

  function _updateUserWriteoffs(address _lpToken) private {
    Bonus[] memory bonuses = pools[_lpToken].bonuses;
    User storage user = users[_lpToken][msg.sender];
    for (uint256 i = 0; i < bonuses.length; i++) {
      // update writeoff to match current acc rewards per token
      if (user.rewardsWriteoffs.length == i) {
        user.rewardsWriteoffs.push(user.amount * bonuses[i].accRewardsPerToken / CAL_MULTIPLIER);
      } else {
        user.rewardsWriteoffs[i] = user.amount * bonuses[i].accRewardsPerToken / CAL_MULTIPLIER;
      }
    }
  }

  /// @notice tranfer upto what the contract has
  function _safeTransfer(address _token, uint256 _amount) private returns (uint256 _transferred) {
    IERC20 token = IERC20(_token);
    uint256 balance = token.balanceOf(address(this));
    if (balance > _amount) {
      token.safeTransfer(msg.sender, _amount);
      _transferred = _amount;
    } else if (balance > 0) {
      token.safeTransfer(msg.sender, balance);
      _transferred = balance;
    }
  }

  function _calRewardsForTime(Bonus memory _bonus, uint256 _lastUpdatedAt) internal view returns (uint256) {
    if (_bonus.endTime <= _lastUpdatedAt) return 0;

    uint256 calEndTime = block.timestamp > _bonus.endTime ? _bonus.endTime : block.timestamp;
    uint256 calStartTime = _lastUpdatedAt > _bonus.startTime ? _lastUpdatedAt : _bonus.startTime;
    uint256 timePassed = calEndTime - calStartTime;
    return _bonus.weeklyRewards * CAL_MULTIPLIER * timePassed / WEEK;
  }

  function _claimRewards(address _lpToken, User memory _user) private {
    // only claim if user has deposited before
    if (_user.amount == 0) return;
    uint256 rewardsWriteoffsLen = _user.rewardsWriteoffs.length;
    Bonus[] memory bonuses = pools[_lpToken].bonuses;
    for (uint256 i = 0; i < bonuses.length; i++) {
      uint256 rewardsWriteoff = rewardsWriteoffsLen <= i ? 0 : _user.rewardsWriteoffs[i];
      uint256 bonusSinceLastUpdate = _user.amount * bonuses[i].accRewardsPerToken / CAL_MULTIPLIER - rewardsWriteoff;
      uint256 toTransfer = bonuses[i].remBonus < bonusSinceLastUpdate ? bonuses[i].remBonus : bonusSinceLastUpdate;
      if (toTransfer == 0) continue;
      uint256 transferred = _safeTransfer(bonuses[i].bonusTokenAddr, toTransfer);
      pools[_lpToken].bonuses[i].remBonus = bonuses[i].remBonus - transferred;
    }
  }

  // only owner or authorized users from list
  function _isAuthorized(address[] memory checkList) private view returns (bool) {
    if (msg.sender == owner()) return true;

    for (uint256 i = 0; i < checkList.length; i++) {
      if (msg.sender == checkList[i]) {
        return true;
      }
    }
    return false;
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_bonusTokenAddr","type":"address"},{"internalType":"uint48","name":"_startTime","type":"uint48"},{"internalType":"uint256","name":"_weeklyRewards","type":"uint256"},{"internalType":"uint256","name":"_transferAmount","type":"uint256"}],"name":"addBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_lpTokens","type":"address[]"},{"internalType":"address[]","name":"_bonusTokenAddrs","type":"address[]"},{"internalType":"address[]","name":"_authorizers","type":"address[]"}],"name":"addPoolsAndAllowBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_lpTokens","type":"address[]"}],"name":"claimRewardsForPools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_poolBonusId","type":"uint256"}],"name":"collectDust","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_lpTokens","type":"address[]"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_poolBonusId","type":"uint256"},{"internalType":"address","name":"_bonusTokenAddr","type":"address"},{"internalType":"uint256","name":"_transferAmount","type":"uint256"}],"name":"extendBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_bonusTokenAddr","type":"address"}],"name":"getAuthorizers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"}],"name":"getPool","outputs":[{"components":[{"components":[{"internalType":"address","name":"bonusTokenAddr","type":"address"},{"internalType":"uint48","name":"startTime","type":"uint48"},{"internalType":"uint48","name":"endTime","type":"uint48"},{"internalType":"uint256","name":"weeklyRewards","type":"uint256"},{"internalType":"uint256","name":"accRewardsPerToken","type":"uint256"},{"internalType":"uint256","name":"remBonus","type":"uint256"}],"internalType":"struct IBonusRewards.Bonus[]","name":"bonuses","type":"tuple[]"},{"internalType":"uint256","name":"lastUpdatedAt","type":"uint256"}],"internalType":"struct IBonusRewards.Pool","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPoolList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getResponders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_account","type":"address"}],"name":"getUser","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"rewardsWriteoffs","type":"uint256[]"}],"internalType":"struct IBonusRewards.User","name":"","type":"tuple"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_responders","type":"address[]"}],"name":"setResponders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_bonusTokenAddr","type":"address"},{"internalType":"uint256","name":"_weeklyRewards","type":"uint256"},{"internalType":"uint48","name":"_startTime","type":"uint48"}],"name":"updateBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"viewRewards","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360018055613e208061006d6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063bbe4f6db11610071578063bbe4f6db1461027a578063bed4df201461029a578063d41dcbea146102ad578063f2fde38b146102b5578063f3fef3a3146102c85761012c565b80638da5cb5b1461020b57806390bde51714610220578063a55c386814610241578063abca8a2e14610254578063bb10aa99146102675761012c565b806347e7ef24116100f457806347e7ef241461019d57806352985ac6146101b05780635c975abb146101d0578063664c0bf9146101e55780638c880e02146101f85761012c565b806301c1dfba1461013157806312faae931461014657806316c38b3c146101645780631eaa7a7b146101775780632c43e2ef1461018a575b600080fd5b61014461013f36600461349c565b6102db565b005b61014e61045b565b60405161015b919061368a565b60405180910390f35b610144610172366004613572565b6104bd565b610144610185366004613355565b61054f565b61014461019836600461349c565b61089b565b6101446101ab366004613430565b6109f5565b6101c36101be366004613323565b610d43565b60405161015b91906136d7565b6101d8611105565b60405161015b91906136ea565b6101446101f336600461349c565b61110e565b6101446102063660046134dc565b611144565b6102136113ec565b60405161015b9190613639565b61023361022e366004613323565b6113fb565b60405161015b929190613cc5565b61014461024f366004613459565b6114b1565b610144610262366004613390565b6118c5565b61014e610275366004613323565b611d13565b61028d610288366004613302565b611d96565b60405161015b9190613c25565b6101446102a83660046133dc565b611e79565b61014e612432565b6101446102c3366004613302565b612492565b6101446102d6366004613430565b61253d565b600260015414156103075760405162461bcd60e51b81526004016102fe90613bee565b60405180910390fd5b600260015560005b818110156104525760006006600085858581811061033d57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906103529190613302565b6001600160a01b03168152602080820192909252604090810160009081203382529092528120805491815591506103bd8585858181106103a257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906103b79190613302565b826126eb565b508484848181106103de57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906103f39190613302565b6001600160a01b0316336001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb836040516104359190613d08565b60405180910390a35050808061044a90613dab565b91505061030f565b50506001805550565b606060038054806020026020016040519081016040528092919081815260200182805480156104b357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610495575b5050505050905090565b610520600380548060200260200160405190810160405280929190818152602001828054801561051657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116104f8575b50505050506127ba565b61053c5760405162461bcd60e51b81526004016102fe90613897565b6002805460ff1916911515919091179055565b6000546001600160a01b031633146105795760405162461bcd60e51b81526004016102fe906139f3565b6001600160a01b038316600090815260056020526040902060010154156105b25760405162461bcd60e51b81526004016102fe906137f2565b6001600160a01b038316610606576105c86113ec565b6001600160a01b03166108fc479081150290604051600060405180830381858888f19350505050158015610600573d6000803e3d6000fd5b50610896565b6040516370a0823160e01b81526000906001600160a01b038516906370a0823190610635903090600401613639565b60206040518083038186803b15801561064d57600080fd5b505afa158015610661573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068591906135aa565b6001600160a01b03851660009081526008602052604090205490915060ff166001141561080c576001600160a01b03831660009081526005602052604081208054849081106106e457634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160c081018252600490930290910180546001600160a01b0380821680865265ffffffffffff600160a01b8404811697870197909752600160d01b9092049095169284019290925260018101546060840152600281015460808401526003015460a08301529092509086161461077a5760405162461bcd60e51b81526004016102fe90613a5f565b4262093a80826040015165ffffffffffff166107969190613d11565b106107b35760405162461bcd60e51b81526004016102fe90613a28565b60a08101516001600160a01b038516600090815260056020526040812080549294509091859081106107f557634e487b7160e01b600052603260045260246000fd5b906000526020600020906004020160030181905550505b836001600160a01b031663a9059cbb6108236113ec565b836040518363ffffffff1660e01b8152600401610841929190613671565b602060405180830381600087803b15801561085b57600080fd5b505af115801561086f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610893919061358e565b50505b505050565b600260015414156108be5760405162461bcd60e51b81526004016102fe90613bee565b600260018190555460ff16156108e65760405162461bcd60e51b81526004016102fe90613834565b60005b8181101561045257600083838381811061091357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906109289190613302565b6001600160a01b038116600090815260066020908152604080832033845282528083208151808301835281548152600182018054845181870281018701909552808552969750949590949193858101939291908301828280156109aa57602002820191906000526020600020905b815481526020019060010190808311610996575b5050509190925250508151919250506109c45750506109e3565b6109cd82612857565b6109d78282612a39565b6109e082612d07565b50505b806109ed81613dab565b9150506108e9565b60026001541415610a185760405162461bcd60e51b81526004016102fe90613bee565b600260018190555460ff1615610a405760405162461bcd60e51b81526004016102fe90613834565b6001600160a01b038216600090815260056020526040902060010154610a785760405162461bcd60e51b81526004016102fe90613979565b6040516370a0823160e01b815281906001600160a01b038416906370a0823190610aa6903390600401613639565b60206040518083038186803b158015610abe57600080fd5b505afa158015610ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af691906135aa565b1015610b145760405162461bcd60e51b81526004016102fe90613862565b610b1d82612857565b6001600160a01b038216600090815260066020908152604080832033845282529182902082518084018452815481526001820180548551818602810186019096528086529294610bb094889487938583019392909190830182828015610ba257602002820191906000526020600020905b815481526020019060010190808311610b8e575b505050505081525050612a39565b6040516370a0823160e01b815283906000906001600160a01b038316906370a0823190610be1903090600401613639565b60206040518083038186803b158015610bf957600080fd5b505afa158015610c0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3191906135aa565b9050610c486001600160a01b038316333087612f0d565b600081836001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610c779190613639565b60206040518083038186803b158015610c8f57600080fd5b505afa158015610ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc791906135aa565b610cd19190613d68565b8454909150610ce1908290613d11565b8455610cec86612d07565b856001600160a01b0316336001600160a01b03167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6283604051610d2f9190613d08565b60405180910390a350506001805550505050565b6001600160a01b038216600090815260056020908152604080832081518154938402810160609081018452928101848152929493909283918390868489015b82821015610e055760008481526020908190206040805160c0810182526004860290920180546001600160a01b038116845265ffffffffffff600160a01b8204811685870152600160d01b909104169183019190915260018082015460608401526002820154608084015260039091015460a08301529083529092019101610d82565b505050908252506001918201546020918201526001600160a01b0380881660009081526006835260408082209289168252918352818120825180840184528154815294810180548451818702810187019095528085529697509195909385810193929190830182828015610e9857602002820191906000526020600020905b815481526020019060010190808311610e84575b5050505050815250509050600082600001515167ffffffffffffffff811115610ed157634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610efa578160200160208202803683370190505b508251909150610f0e5792506110ff915050565b60208201515160005b82518110156110f757600085600001518281518110610f4657634e487b7160e01b600052603260045260246000fd5b6020026020010151905042816020015165ffffffffffff16108015610f6f575060008160a00151115b156110e4576040516370a0823160e01b81526000906001600160a01b038b16906370a0823190610fa3903090600401613639565b60206040518083038186803b158015610fbb57600080fd5b505afa158015610fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff391906135aa565b90506000611005838960200151612f65565b905060006110138383613d29565b84608001516110229190613d11565b905060008587111561105f578860200151868151811061105257634e487b7160e01b600052603260045260246000fd5b6020026020010151611062565b60005b90506000816c0c9f2c9cd04674edea40000000848c600001516110859190613d49565b61108f9190613d29565b6110999190613d68565b90508560a0015181106110b0578560a001516110b2565b805b8988815181106110d257634e487b7160e01b600052603260045260246000fd5b60200260200101818152505050505050505b50806110ef81613dab565b915050610f17565b509093505050505b92915050565b60025460ff1681565b6000546001600160a01b031633146111385760405162461bcd60e51b81526004016102fe906139f3565b610896600383836131e7565b6000546001600160a01b0316331461116e5760405162461bcd60e51b81526004016102fe906139f3565b60025460ff16156111915760405162461bcd60e51b81526004016102fe90613834565b4260005b868110156113e25760008888838181106111bf57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111d49190613302565b90506012816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561121157600080fd5b505afa158015611225573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124991906135c2565b60ff16111561126a5760405162461bcd60e51b81526004016102fe90613936565b6001600160a01b0381166000908152600560205260409020600101546112ea576001600160a01b038116600081815260056020526040812060019081018690556004805491820181559091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191690911790555b60005b868110156113cd57600088888381811061131757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061132c9190613302565b6001600160a01b038116600090815260056020526040902060010154909150156113685760405162461bcd60e51b81526004016102fe906137f2565b6001600160a01b0380841660009081526007602090815260408083209385168352929052206113989088886131e7565b506001600160a01b03166000908152600860205260409020805460ff19166001179055806113c581613dab565b9150506112ed565b505080806113da90613dab565b915050611195565b5050505050505050565b6000546001600160a01b031690565b61140361324a565b6001600160a01b0380841660009081526006602090815260408083209386168352929052206060906114358585610d43565b81604051806040016040529081600082015481526020016001820180548060200260200160405190810160405280929190818152602001828054801561149a57602002820191906000526020600020905b815481526020019060010190808311611486575b5050505050815250509150915091505b9250929050565b600260015414156114d45760405162461bcd60e51b81526004016102fe90613bee565b600260018190555460ff16156114fc5760405162461bcd60e51b81526004016102fe90613834565b6001600160a01b038085166000908152600760209081526040808320938616835292815290829020805483518184028101840190945280845261157b9392830182828015610516576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116104f85750505050506127ba565b6115975760405162461bcd60e51b81526004016102fe90613b15565b6001600160a01b03841660009081526005602052604081208054859081106115cf57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160c081018252600490930290910180546001600160a01b0380821680865265ffffffffffff600160a01b8404811697870197909752600160d01b9092049095169284019290925260018101546060840152600281015460808401526003015460a0830152909250908416146116655760405162461bcd60e51b81526004016102fe906139ae565b42816040015165ffffffffffff16116116905760405162461bcd60e51b81526004016102fe906138d9565b6040516370a0823160e01b815283906000906001600160a01b038316906370a08231906116c1903090600401613639565b60206040518083038186803b1580156116d957600080fd5b505afa1580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171191906135aa565b90506117286001600160a01b038316333087612f0d565b600081836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016117579190613639565b60206040518083038186803b15801561176f57600080fd5b505afa158015611783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a791906135aa565b6117b19190613d68565b90506000846040015165ffffffffffff16856060015162093a80846117d69190613d49565b6117e09190613d29565b6117ea9190613d11565b6001600160a01b038a166000908152600560205260409020805491925082918a90811061182757634e487b7160e01b600052603260045260246000fd5b9060005260206000209060040201600001601a6101000a81548165ffffffffffff021916908365ffffffffffff160217905550818560a0015161186a9190613d11565b6001600160a01b038a16600090815260056020526040902080548a9081106118a257634e487b7160e01b600052603260045260246000fd5b600091825260209091206003600490920201015550506001805550505050505050565b600260015414156118e85760405162461bcd60e51b81526004016102fe90613bee565b600260018190555460ff16156119105760405162461bcd60e51b81526004016102fe90613834565b6001600160a01b038085166000908152600760209081526040808320938716835292815290829020805483518184028101840190945280845261198f9392830182828015610516576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116104f85750505050506127ba565b6119ab5760405162461bcd60e51b81526004016102fe90613b15565b65ffffffffffff811615806119c75750428165ffffffffffff16115b6119e35760405162461bcd60e51b81526004016102fe90613728565b6001600160a01b0384166000908152600560209081526040808320815181546060948102820185018452928101838152909391928492849190879085015b82821015611aa45760008481526020908190206040805160c0810182526004860290920180546001600160a01b038116845265ffffffffffff600160a01b8204811685870152600160d01b909104169183019190915260018082015460608401526002820154608084015260039091015460a08301529083529092019101611a21565b50505050815260200160018201548152505090506000816020015111611adc5760405162461bcd60e51b81526004016102fe906137b1565b805160005b8151811015611d0657856001600160a01b0316828281518110611b1457634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b0316148015611b68575042828281518110611b5257634e487b7160e01b600052603260045260246000fd5b60200260200101516040015165ffffffffffff16115b15611cf4576001600160a01b0387166000908152600560205260408120805483908110611ba557634e487b7160e01b600052603260045260246000fd5b90600052602060002090600402019050611bbe88612857565b805442600160a01b90910465ffffffffffff1610611c6857428565ffffffffffff1610611c0657805465ffffffffffff60a01b1916600160a01b65ffffffffffff8716021781555b80546003820154600160a01b90910465ffffffffffff16908790611c2e9062093a8090613d49565b611c389190613d29565b611c429190613d11565b815465ffffffffffff91909116600160d01b026001600160d01b03909116178155611ced565b6001810154815460009162093a8091611c91904290600160d01b900465ffffffffffff16613d68565b611c9b9190613d49565b611ca59190613d29565b90504287611cb662093a8084613d49565b611cc09190613d29565b611cca9190613d11565b825465ffffffffffff91909116600160d01b026001600160d01b03909116178255505b6001018590555b80611cfe81613dab565b915050611ae1565b5050600180555050505050565b6001600160a01b038083166000908152600760209081526040808320938516835292815290829020805483518184028101840190945280845260609392830182828015611d8957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d6b575b5050505050905092915050565b611d9e613264565b6001600160a01b0382166000908152600560209081526040808320815181546060948102820185018452928101838152909491938593919285929185015b82821015611e5f5760008481526020908190206040805160c0810182526004860290920180546001600160a01b038116845265ffffffffffff600160a01b8204811685870152600160d01b909104169183019190915260018082015460608401526002820154608084015260039091015460a08301529083529092019101611ddc565b50505050815260200160018201548152505090505b919050565b60026001541415611e9c5760405162461bcd60e51b81526004016102fe90613bee565b600260018190555460ff1615611ec45760405162461bcd60e51b81526004016102fe90613834565b6001600160a01b0380861660009081526007602090815260408083209388168352928152908290208054835181840281018401909452808452611f439392830182828015610516576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116104f85750505050506127ba565b611f5f5760405162461bcd60e51b81526004016102fe90613b15565b428365ffffffffffff161015611f875760405162461bcd60e51b81526004016102fe90613728565b6001600160a01b0385166000908152600560209081526040808320815181546060948102820185018452928101838152909391928492849190879085015b828210156120485760008481526020908190206040805160c0810182526004860290920180546001600160a01b038116845265ffffffffffff600160a01b8204811685870152600160d01b909104169183019190915260018082015460608401526002820154608084015260039091015460a08301529083529092019101611fc5565b505050508152602001600182015481525050905060008160200151116120805760405162461bcd60e51b81526004016102fe906137b1565b805160005b815181101561219057866001600160a01b03168282815181106120b857634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b0316141561217e574262093a808383815181106120f857634e487b7160e01b600052603260045260246000fd5b60200260200101516040015165ffffffffffff166121169190613d11565b106121335760405162461bcd60e51b81526004016102fe90613ba2565b81818151811061215357634e487b7160e01b600052603260045260246000fd5b602002602001015160a0015160001461217e5760405162461bcd60e51b81526004016102fe90613a96565b8061218881613dab565b915050612085565b506040516370a0823160e01b815286906000906001600160a01b038316906370a08231906121c2903090600401613639565b60206040518083038186803b1580156121da57600080fd5b505afa1580156121ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221291906135aa565b90506122296001600160a01b038316333088612f0d565b600081836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016122589190613639565b60206040518083038186803b15801561227057600080fd5b505afa158015612284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a891906135aa565b6122b29190613d68565b9050600065ffffffffffff8916886122cd62093a8085613d49565b6122d79190613d29565b6122e19190613d11565b9050600560008c6001600160a01b03166001600160a01b031681526020019081526020016000206000016040518060c001604052808c6001600160a01b031681526020018b65ffffffffffff1681526020018365ffffffffffff1681526020018a81526020016000815260200184815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001601a6101000a81548165ffffffffffff021916908365ffffffffffff160217905550606082015181600101556080820151816002015560a082015181600301555050505050505050600180819055505050505050565b606060048054806020026020016040519081016040528092919081815260200182805480156104b3576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610495575050505050905090565b6000546001600160a01b031633146124bc5760405162461bcd60e51b81526004016102fe906139f3565b6001600160a01b0381166124e25760405162461bcd60e51b81526004016102fe9061376b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600260015414156125605760405162461bcd60e51b81526004016102fe90613bee565b600260018190555460ff16156125885760405162461bcd60e51b81526004016102fe90613834565b6001600160a01b0382166000908152600560205260409020600101546125c05760405162461bcd60e51b81526004016102fe90613979565b6125c982612857565b6001600160a01b03821660009081526006602090815260408083203384528252918290208251808401845281548152600182018054855181860281018601909652808652929461265a94889487938583019392909190830182828015610ba25760200282019190600052602060002090815481526020019060010190808311610b8e57505050505081525050612a39565b60008282600001541161266e578154612670565b825b8254909150612680908290613d68565b825561268b84612d07565b61269584826126eb565b50836001600160a01b0316336001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb836040516126d99190613d08565b60405180910390a35050600180555050565b6040516370a0823160e01b8152600090839082906001600160a01b038316906370a082319061271e903090600401613639565b60206040518083038186803b15801561273657600080fd5b505afa15801561274a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276e91906135aa565b9050838111156127945761278c6001600160a01b0383163386613026565b8392506127b2565b80156127b2576127ae6001600160a01b0383163383613026565b8092505b505092915050565b60006127c46113ec565b6001600160a01b0316336001600160a01b031614156127e557506001611e74565b60005b825181101561284e5782818151811061281157634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316336001600160a01b0316141561283c576001915050611e74565b8061284681613dab565b9150506127e8565b50600092915050565b6001600160a01b038116600090815260056020526040902060018101548015806128815750804211155b1561288d575050612a36565b4260018301556040516370a0823160e01b81526000906001600160a01b038516906370a08231906128c2903090600401613639565b60206040518083038186803b1580156128da57600080fd5b505afa1580156128ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291291906135aa565b90508061292157505050612a36565b60005b835481101561089357600084600001828154811061295257634e487b7160e01b600052603260045260246000fd5b600091825260209091206004909102018054909150600160d01b900465ffffffffffff16841080156129945750805442600160a01b90910465ffffffffffff16105b15612a23576040805160c08101825282546001600160a01b038116825265ffffffffffff600160a01b820481166020840152600160d01b90910416918101919091526001820154606082015260028201546080820152600382015460a0820152600090612a019086612f65565b9050612a0d8482613d29565b8260020154612a1c9190613d11565b6002830155505b5080612a2e81613dab565b915050612924565b50565b8051612a4457612d03565b602080820151516001600160a01b03841660009081526005835260408082208054825181870281018701909352808352939492939192909190849084015b82821015612b055760008481526020908190206040805160c0810182526004860290920180546001600160a01b038116845265ffffffffffff600160a01b8204811685870152600160d01b909104169183019190915260018082015460608401526002820154608084015260039091015460a08301529083529092019101612a82565b50505050905060005b815181101561089357600081841115612b525784602001518281518110612b4557634e487b7160e01b600052603260045260246000fd5b6020026020010151612b55565b60005b90506000816c0c9f2c9cd04674edea40000000858581518110612b8857634e487b7160e01b600052603260045260246000fd5b6020026020010151608001518860000151612ba39190613d49565b612bad9190613d29565b612bb79190613d68565b9050600081858581518110612bdc57634e487b7160e01b600052603260045260246000fd5b602002602001015160a0015110612bf35781612c20565b848481518110612c1357634e487b7160e01b600052603260045260246000fd5b602002602001015160a001515b905080612c2f57505050612cf1565b6000612c66868681518110612c5457634e487b7160e01b600052603260045260246000fd5b602002602001015160000151836126eb565b905080868681518110612c8957634e487b7160e01b600052603260045260246000fd5b602002602001015160a00151612c9f9190613d68565b6001600160a01b038a166000908152600560205260409020805487908110612cd757634e487b7160e01b600052603260045260246000fd5b906000526020600020906004020160030181905550505050505b80612cfb81613dab565b915050612b0e565b5050565b6001600160a01b038116600090815260056020908152604080832080548251818502810185019093528083529192909190849084015b82821015612dc05760008481526020908190206040805160c0810182526004860290920180546001600160a01b038116845265ffffffffffff600160a01b8204811685870152600160d01b909104169183019190915260018082015460608401526002820154608084015260039091015460a08301529083529092019101612d3d565b505050506001600160a01b038316600090815260066020908152604080832033845290915281209192505b8251811015612f07576001820154811415612e7257816001016c0c9f2c9cd04674edea40000000848381518110612e3257634e487b7160e01b600052603260045260246000fd5b6020026020010151608001518460000154612e4d9190613d49565b612e579190613d29565b81546001810183556000928352602090922090910155612ef5565b6c0c9f2c9cd04674edea40000000838281518110612ea057634e487b7160e01b600052603260045260246000fd5b6020026020010151608001518360000154612ebb9190613d49565b612ec59190613d29565b826001018281548110612ee857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001555b80612eff81613dab565b915050612deb565b50505050565b612f07846323b872dd60e01b858585604051602401612f2e9392919061364d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613045565b600081836040015165ffffffffffff1611612f82575060006110ff565b6000836040015165ffffffffffff164211612f9d5742612fab565b836040015165ffffffffffff165b90506000846020015165ffffffffffff168411612fd457846020015165ffffffffffff16612fd6565b835b90506000612fe48284613d68565b905062093a80816c0c9f2c9cd04674edea4000000088606001516130089190613d49565b6130129190613d49565b61301c9190613d29565b9695505050505050565b6108968363a9059cbb60e01b8484604051602401612f2e929190613671565b600061309a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166130d49092919063ffffffff16565b80519091501561089657808060200190518101906130b8919061358e565b6108965760405162461bcd60e51b81526004016102fe90613b58565b60606130e384846000856130eb565b949350505050565b60606130f6856131ae565b6131125760405162461bcd60e51b81526004016102fe90613ade565b600080866001600160a01b0316858760405161312e919061361d565b60006040518083038185875af1925050503d806000811461316b576040519150601f19603f3d011682016040523d82523d6000602084013e613170565b606091505b509150915081156131845791506130e39050565b8051156131945780518082602001fd5b8360405162461bcd60e51b81526004016102fe91906136f5565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906130e3575050151592915050565b82805482825590600052602060002090810192821561323a579160200282015b8281111561323a5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613207565b5061324692915061327e565b5090565b604051806040016040528060008152602001606081525090565b604051806040016040528060608152602001600081525090565b5b80821115613246576000815560010161327f565b80356001600160a01b0381168114611e7457600080fd5b60008083601f8401126132bb578182fd5b50813567ffffffffffffffff8111156132d2578182fd5b60208301915083602080830285010111156114aa57600080fd5b803565ffffffffffff81168114611e7457600080fd5b600060208284031215613313578081fd5b61331c82613293565b9392505050565b60008060408385031215613335578081fd5b61333e83613293565b915061334c60208401613293565b90509250929050565b600080600060608486031215613369578081fd5b61337284613293565b925061338060208501613293565b9150604084013590509250925092565b600080600080608085870312156133a5578081fd5b6133ae85613293565b93506133bc60208601613293565b9250604085013591506133d1606086016132ec565b905092959194509250565b600080600080600060a086880312156133f3578081fd5b6133fc86613293565b945061340a60208701613293565b9350613418604087016132ec565b94979396509394606081013594506080013592915050565b60008060408385031215613442578182fd5b61344b83613293565b946020939093013593505050565b6000806000806080858703121561346e578384fd5b61347785613293565b93506020850135925061348c60408601613293565b9396929550929360600135925050565b600080602083850312156134ae578182fd5b823567ffffffffffffffff8111156134c4578283fd5b6134d0858286016132aa565b90969095509350505050565b600080600080600080606087890312156134f4578081fd5b863567ffffffffffffffff8082111561350b578283fd5b6135178a838b016132aa565b9098509650602089013591508082111561352f578283fd5b61353b8a838b016132aa565b90965094506040890135915080821115613553578283fd5b5061356089828a016132aa565b979a9699509497509295939492505050565b600060208284031215613583578081fd5b813561331c81613ddc565b60006020828403121561359f578081fd5b815161331c81613ddc565b6000602082840312156135bb578081fd5b5051919050565b6000602082840312156135d3578081fd5b815160ff8116811461331c578182fd5b6000815180845260208085019450808401835b83811015613612578151875295820195908201906001016135f6565b509495945050505050565b6000825161362f818460208701613d7f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156136cb5783516001600160a01b0316835292840192918401916001016136a6565b50909695505050505050565b60006020825261331c60208301846135e3565b901515815260200190565b6000602082528251806020840152613714816040850160208701613d7f565b601f01601f19169190910160400192915050565b60208082526023908201527f426f6e7573526577617264733a20737461727454696d6520696e207468652070604082015262185cdd60ea1b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526021908201527f426f6e7573526577617264733a20706f6f6c20646f6573206e6f7420657869736040820152601d60fa1b606082015260800190565b60208082526022908201527f426f6e7573526577617264733a206c70546f6b656e2c206e6f7420616c6c6f77604082015261195960f21b606082015260800190565b602080825260149082015273109bdb9d5cd4995dd85c991cce881c185d5cd95960621b604082015260600190565b6020808252818101527f426c61636b736d6974683a20696e73756666696369656e742062616c616e6365604082015260600190565b60208082526022908201527f426f6e7573526577617264733a2063616c6c6572206e6f7420726573706f6e6460408201526132b960f11b606082015260800190565b60208082526039908201527f426f6e7573526577617264733a20626f6e75732070726f6772616d20656e646560408201527f642c20706c656173652073746172742061206e6577206f6e6500000000000000606082015260800190565b60208082526023908201527f426f6e7573526577617264733a206c70746f6b656e20646563696d616c73203e60408201526204062760eb1b606082015260800190565b6020808252818101527f426c61636b736d6974683a20706f6f6c20646f6573206e6f7420657869737473604082015260600190565b60208082526025908201527f426f6e7573526577617264733a20626f6e757320616e6420696420646f6e74206040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f426f6e7573526577617264733a206e6f74207265616479000000000000000000604082015260600190565b60208082526018908201527f426f6e7573526577617264733a2077726f6e6720706f6f6c0000000000000000604082015260600190565b60208082526028908201527f426f6e7573526577617264733a206c61737420626f6e7573206e6f7420616c6c6040820152670818db185a5b595960c21b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526023908201527f426f6e7573526577617264733a206e6f7420617574686f72697a65642063616c6040820152623632b960e91b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252602c908201527f426f6e7573526577617264733a206c61737420626f6e757320706572696f642060408201526b1a185cdb89dd08195b99195960a21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000602080835260608084018551604080858801528282518085526080945084890191508684019350875b81811015613cae57845180516001600160a01b031684528881015165ffffffffffff9081168a8601528582015116858501528781015188850152868101518785015260a090810151908401529387019360c090920191600101613c50565b505094909701519590960194909452509392505050565b60006040825283516040830152602084015160406060840152613ceb60808401826135e3565b90508281036020840152613cff81856135e3565b95945050505050565b90815260200190565b60008219821115613d2457613d24613dc6565b500190565b600082613d4457634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613d6357613d63613dc6565b500290565b600082821015613d7a57613d7a613dc6565b500390565b60005b83811015613d9a578181015183820152602001613d82565b83811115612f075750506000910152565b6000600019821415613dbf57613dbf613dc6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b8015158114612a3657600080fdfea2646970667358221220d0a22542c34abc2f3422f5a3b9b9552342772b1c6669d52607c8083eaefe988164736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063bbe4f6db11610071578063bbe4f6db1461027a578063bed4df201461029a578063d41dcbea146102ad578063f2fde38b146102b5578063f3fef3a3146102c85761012c565b80638da5cb5b1461020b57806390bde51714610220578063a55c386814610241578063abca8a2e14610254578063bb10aa99146102675761012c565b806347e7ef24116100f457806347e7ef241461019d57806352985ac6146101b05780635c975abb146101d0578063664c0bf9146101e55780638c880e02146101f85761012c565b806301c1dfba1461013157806312faae931461014657806316c38b3c146101645780631eaa7a7b146101775780632c43e2ef1461018a575b600080fd5b61014461013f36600461349c565b6102db565b005b61014e61045b565b60405161015b919061368a565b60405180910390f35b610144610172366004613572565b6104bd565b610144610185366004613355565b61054f565b61014461019836600461349c565b61089b565b6101446101ab366004613430565b6109f5565b6101c36101be366004613323565b610d43565b60405161015b91906136d7565b6101d8611105565b60405161015b91906136ea565b6101446101f336600461349c565b61110e565b6101446102063660046134dc565b611144565b6102136113ec565b60405161015b9190613639565b61023361022e366004613323565b6113fb565b60405161015b929190613cc5565b61014461024f366004613459565b6114b1565b610144610262366004613390565b6118c5565b61014e610275366004613323565b611d13565b61028d610288366004613302565b611d96565b60405161015b9190613c25565b6101446102a83660046133dc565b611e79565b61014e612432565b6101446102c3366004613302565b612492565b6101446102d6366004613430565b61253d565b600260015414156103075760405162461bcd60e51b81526004016102fe90613bee565b60405180910390fd5b600260015560005b818110156104525760006006600085858581811061033d57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906103529190613302565b6001600160a01b03168152602080820192909252604090810160009081203382529092528120805491815591506103bd8585858181106103a257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906103b79190613302565b826126eb565b508484848181106103de57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906103f39190613302565b6001600160a01b0316336001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb836040516104359190613d08565b60405180910390a35050808061044a90613dab565b91505061030f565b50506001805550565b606060038054806020026020016040519081016040528092919081815260200182805480156104b357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610495575b5050505050905090565b610520600380548060200260200160405190810160405280929190818152602001828054801561051657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116104f8575b50505050506127ba565b61053c5760405162461bcd60e51b81526004016102fe90613897565b6002805460ff1916911515919091179055565b6000546001600160a01b031633146105795760405162461bcd60e51b81526004016102fe906139f3565b6001600160a01b038316600090815260056020526040902060010154156105b25760405162461bcd60e51b81526004016102fe906137f2565b6001600160a01b038316610606576105c86113ec565b6001600160a01b03166108fc479081150290604051600060405180830381858888f19350505050158015610600573d6000803e3d6000fd5b50610896565b6040516370a0823160e01b81526000906001600160a01b038516906370a0823190610635903090600401613639565b60206040518083038186803b15801561064d57600080fd5b505afa158015610661573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068591906135aa565b6001600160a01b03851660009081526008602052604090205490915060ff166001141561080c576001600160a01b03831660009081526005602052604081208054849081106106e457634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160c081018252600490930290910180546001600160a01b0380821680865265ffffffffffff600160a01b8404811697870197909752600160d01b9092049095169284019290925260018101546060840152600281015460808401526003015460a08301529092509086161461077a5760405162461bcd60e51b81526004016102fe90613a5f565b4262093a80826040015165ffffffffffff166107969190613d11565b106107b35760405162461bcd60e51b81526004016102fe90613a28565b60a08101516001600160a01b038516600090815260056020526040812080549294509091859081106107f557634e487b7160e01b600052603260045260246000fd5b906000526020600020906004020160030181905550505b836001600160a01b031663a9059cbb6108236113ec565b836040518363ffffffff1660e01b8152600401610841929190613671565b602060405180830381600087803b15801561085b57600080fd5b505af115801561086f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610893919061358e565b50505b505050565b600260015414156108be5760405162461bcd60e51b81526004016102fe90613bee565b600260018190555460ff16156108e65760405162461bcd60e51b81526004016102fe90613834565b60005b8181101561045257600083838381811061091357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906109289190613302565b6001600160a01b038116600090815260066020908152604080832033845282528083208151808301835281548152600182018054845181870281018701909552808552969750949590949193858101939291908301828280156109aa57602002820191906000526020600020905b815481526020019060010190808311610996575b5050509190925250508151919250506109c45750506109e3565b6109cd82612857565b6109d78282612a39565b6109e082612d07565b50505b806109ed81613dab565b9150506108e9565b60026001541415610a185760405162461bcd60e51b81526004016102fe90613bee565b600260018190555460ff1615610a405760405162461bcd60e51b81526004016102fe90613834565b6001600160a01b038216600090815260056020526040902060010154610a785760405162461bcd60e51b81526004016102fe90613979565b6040516370a0823160e01b815281906001600160a01b038416906370a0823190610aa6903390600401613639565b60206040518083038186803b158015610abe57600080fd5b505afa158015610ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af691906135aa565b1015610b145760405162461bcd60e51b81526004016102fe90613862565b610b1d82612857565b6001600160a01b038216600090815260066020908152604080832033845282529182902082518084018452815481526001820180548551818602810186019096528086529294610bb094889487938583019392909190830182828015610ba257602002820191906000526020600020905b815481526020019060010190808311610b8e575b505050505081525050612a39565b6040516370a0823160e01b815283906000906001600160a01b038316906370a0823190610be1903090600401613639565b60206040518083038186803b158015610bf957600080fd5b505afa158015610c0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3191906135aa565b9050610c486001600160a01b038316333087612f0d565b600081836001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610c779190613639565b60206040518083038186803b158015610c8f57600080fd5b505afa158015610ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc791906135aa565b610cd19190613d68565b8454909150610ce1908290613d11565b8455610cec86612d07565b856001600160a01b0316336001600160a01b03167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6283604051610d2f9190613d08565b60405180910390a350506001805550505050565b6001600160a01b038216600090815260056020908152604080832081518154938402810160609081018452928101848152929493909283918390868489015b82821015610e055760008481526020908190206040805160c0810182526004860290920180546001600160a01b038116845265ffffffffffff600160a01b8204811685870152600160d01b909104169183019190915260018082015460608401526002820154608084015260039091015460a08301529083529092019101610d82565b505050908252506001918201546020918201526001600160a01b0380881660009081526006835260408082209289168252918352818120825180840184528154815294810180548451818702810187019095528085529697509195909385810193929190830182828015610e9857602002820191906000526020600020905b815481526020019060010190808311610e84575b5050505050815250509050600082600001515167ffffffffffffffff811115610ed157634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610efa578160200160208202803683370190505b508251909150610f0e5792506110ff915050565b60208201515160005b82518110156110f757600085600001518281518110610f4657634e487b7160e01b600052603260045260246000fd5b6020026020010151905042816020015165ffffffffffff16108015610f6f575060008160a00151115b156110e4576040516370a0823160e01b81526000906001600160a01b038b16906370a0823190610fa3903090600401613639565b60206040518083038186803b158015610fbb57600080fd5b505afa158015610fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff391906135aa565b90506000611005838960200151612f65565b905060006110138383613d29565b84608001516110229190613d11565b905060008587111561105f578860200151868151811061105257634e487b7160e01b600052603260045260246000fd5b6020026020010151611062565b60005b90506000816c0c9f2c9cd04674edea40000000848c600001516110859190613d49565b61108f9190613d29565b6110999190613d68565b90508560a0015181106110b0578560a001516110b2565b805b8988815181106110d257634e487b7160e01b600052603260045260246000fd5b60200260200101818152505050505050505b50806110ef81613dab565b915050610f17565b509093505050505b92915050565b60025460ff1681565b6000546001600160a01b031633146111385760405162461bcd60e51b81526004016102fe906139f3565b610896600383836131e7565b6000546001600160a01b0316331461116e5760405162461bcd60e51b81526004016102fe906139f3565b60025460ff16156111915760405162461bcd60e51b81526004016102fe90613834565b4260005b868110156113e25760008888838181106111bf57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111d49190613302565b90506012816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561121157600080fd5b505afa158015611225573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124991906135c2565b60ff16111561126a5760405162461bcd60e51b81526004016102fe90613936565b6001600160a01b0381166000908152600560205260409020600101546112ea576001600160a01b038116600081815260056020526040812060019081018690556004805491820181559091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191690911790555b60005b868110156113cd57600088888381811061131757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061132c9190613302565b6001600160a01b038116600090815260056020526040902060010154909150156113685760405162461bcd60e51b81526004016102fe906137f2565b6001600160a01b0380841660009081526007602090815260408083209385168352929052206113989088886131e7565b506001600160a01b03166000908152600860205260409020805460ff19166001179055806113c581613dab565b9150506112ed565b505080806113da90613dab565b915050611195565b5050505050505050565b6000546001600160a01b031690565b61140361324a565b6001600160a01b0380841660009081526006602090815260408083209386168352929052206060906114358585610d43565b81604051806040016040529081600082015481526020016001820180548060200260200160405190810160405280929190818152602001828054801561149a57602002820191906000526020600020905b815481526020019060010190808311611486575b5050505050815250509150915091505b9250929050565b600260015414156114d45760405162461bcd60e51b81526004016102fe90613bee565b600260018190555460ff16156114fc5760405162461bcd60e51b81526004016102fe90613834565b6001600160a01b038085166000908152600760209081526040808320938616835292815290829020805483518184028101840190945280845261157b9392830182828015610516576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116104f85750505050506127ba565b6115975760405162461bcd60e51b81526004016102fe90613b15565b6001600160a01b03841660009081526005602052604081208054859081106115cf57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160c081018252600490930290910180546001600160a01b0380821680865265ffffffffffff600160a01b8404811697870197909752600160d01b9092049095169284019290925260018101546060840152600281015460808401526003015460a0830152909250908416146116655760405162461bcd60e51b81526004016102fe906139ae565b42816040015165ffffffffffff16116116905760405162461bcd60e51b81526004016102fe906138d9565b6040516370a0823160e01b815283906000906001600160a01b038316906370a08231906116c1903090600401613639565b60206040518083038186803b1580156116d957600080fd5b505afa1580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171191906135aa565b90506117286001600160a01b038316333087612f0d565b600081836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016117579190613639565b60206040518083038186803b15801561176f57600080fd5b505afa158015611783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a791906135aa565b6117b19190613d68565b90506000846040015165ffffffffffff16856060015162093a80846117d69190613d49565b6117e09190613d29565b6117ea9190613d11565b6001600160a01b038a166000908152600560205260409020805491925082918a90811061182757634e487b7160e01b600052603260045260246000fd5b9060005260206000209060040201600001601a6101000a81548165ffffffffffff021916908365ffffffffffff160217905550818560a0015161186a9190613d11565b6001600160a01b038a16600090815260056020526040902080548a9081106118a257634e487b7160e01b600052603260045260246000fd5b600091825260209091206003600490920201015550506001805550505050505050565b600260015414156118e85760405162461bcd60e51b81526004016102fe90613bee565b600260018190555460ff16156119105760405162461bcd60e51b81526004016102fe90613834565b6001600160a01b038085166000908152600760209081526040808320938716835292815290829020805483518184028101840190945280845261198f9392830182828015610516576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116104f85750505050506127ba565b6119ab5760405162461bcd60e51b81526004016102fe90613b15565b65ffffffffffff811615806119c75750428165ffffffffffff16115b6119e35760405162461bcd60e51b81526004016102fe90613728565b6001600160a01b0384166000908152600560209081526040808320815181546060948102820185018452928101838152909391928492849190879085015b82821015611aa45760008481526020908190206040805160c0810182526004860290920180546001600160a01b038116845265ffffffffffff600160a01b8204811685870152600160d01b909104169183019190915260018082015460608401526002820154608084015260039091015460a08301529083529092019101611a21565b50505050815260200160018201548152505090506000816020015111611adc5760405162461bcd60e51b81526004016102fe906137b1565b805160005b8151811015611d0657856001600160a01b0316828281518110611b1457634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b0316148015611b68575042828281518110611b5257634e487b7160e01b600052603260045260246000fd5b60200260200101516040015165ffffffffffff16115b15611cf4576001600160a01b0387166000908152600560205260408120805483908110611ba557634e487b7160e01b600052603260045260246000fd5b90600052602060002090600402019050611bbe88612857565b805442600160a01b90910465ffffffffffff1610611c6857428565ffffffffffff1610611c0657805465ffffffffffff60a01b1916600160a01b65ffffffffffff8716021781555b80546003820154600160a01b90910465ffffffffffff16908790611c2e9062093a8090613d49565b611c389190613d29565b611c429190613d11565b815465ffffffffffff91909116600160d01b026001600160d01b03909116178155611ced565b6001810154815460009162093a8091611c91904290600160d01b900465ffffffffffff16613d68565b611c9b9190613d49565b611ca59190613d29565b90504287611cb662093a8084613d49565b611cc09190613d29565b611cca9190613d11565b825465ffffffffffff91909116600160d01b026001600160d01b03909116178255505b6001018590555b80611cfe81613dab565b915050611ae1565b5050600180555050505050565b6001600160a01b038083166000908152600760209081526040808320938516835292815290829020805483518184028101840190945280845260609392830182828015611d8957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d6b575b5050505050905092915050565b611d9e613264565b6001600160a01b0382166000908152600560209081526040808320815181546060948102820185018452928101838152909491938593919285929185015b82821015611e5f5760008481526020908190206040805160c0810182526004860290920180546001600160a01b038116845265ffffffffffff600160a01b8204811685870152600160d01b909104169183019190915260018082015460608401526002820154608084015260039091015460a08301529083529092019101611ddc565b50505050815260200160018201548152505090505b919050565b60026001541415611e9c5760405162461bcd60e51b81526004016102fe90613bee565b600260018190555460ff1615611ec45760405162461bcd60e51b81526004016102fe90613834565b6001600160a01b0380861660009081526007602090815260408083209388168352928152908290208054835181840281018401909452808452611f439392830182828015610516576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116104f85750505050506127ba565b611f5f5760405162461bcd60e51b81526004016102fe90613b15565b428365ffffffffffff161015611f875760405162461bcd60e51b81526004016102fe90613728565b6001600160a01b0385166000908152600560209081526040808320815181546060948102820185018452928101838152909391928492849190879085015b828210156120485760008481526020908190206040805160c0810182526004860290920180546001600160a01b038116845265ffffffffffff600160a01b8204811685870152600160d01b909104169183019190915260018082015460608401526002820154608084015260039091015460a08301529083529092019101611fc5565b505050508152602001600182015481525050905060008160200151116120805760405162461bcd60e51b81526004016102fe906137b1565b805160005b815181101561219057866001600160a01b03168282815181106120b857634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b0316141561217e574262093a808383815181106120f857634e487b7160e01b600052603260045260246000fd5b60200260200101516040015165ffffffffffff166121169190613d11565b106121335760405162461bcd60e51b81526004016102fe90613ba2565b81818151811061215357634e487b7160e01b600052603260045260246000fd5b602002602001015160a0015160001461217e5760405162461bcd60e51b81526004016102fe90613a96565b8061218881613dab565b915050612085565b506040516370a0823160e01b815286906000906001600160a01b038316906370a08231906121c2903090600401613639565b60206040518083038186803b1580156121da57600080fd5b505afa1580156121ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221291906135aa565b90506122296001600160a01b038316333088612f0d565b600081836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016122589190613639565b60206040518083038186803b15801561227057600080fd5b505afa158015612284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a891906135aa565b6122b29190613d68565b9050600065ffffffffffff8916886122cd62093a8085613d49565b6122d79190613d29565b6122e19190613d11565b9050600560008c6001600160a01b03166001600160a01b031681526020019081526020016000206000016040518060c001604052808c6001600160a01b031681526020018b65ffffffffffff1681526020018365ffffffffffff1681526020018a81526020016000815260200184815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001601a6101000a81548165ffffffffffff021916908365ffffffffffff160217905550606082015181600101556080820151816002015560a082015181600301555050505050505050600180819055505050505050565b606060048054806020026020016040519081016040528092919081815260200182805480156104b3576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610495575050505050905090565b6000546001600160a01b031633146124bc5760405162461bcd60e51b81526004016102fe906139f3565b6001600160a01b0381166124e25760405162461bcd60e51b81526004016102fe9061376b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600260015414156125605760405162461bcd60e51b81526004016102fe90613bee565b600260018190555460ff16156125885760405162461bcd60e51b81526004016102fe90613834565b6001600160a01b0382166000908152600560205260409020600101546125c05760405162461bcd60e51b81526004016102fe90613979565b6125c982612857565b6001600160a01b03821660009081526006602090815260408083203384528252918290208251808401845281548152600182018054855181860281018601909652808652929461265a94889487938583019392909190830182828015610ba25760200282019190600052602060002090815481526020019060010190808311610b8e57505050505081525050612a39565b60008282600001541161266e578154612670565b825b8254909150612680908290613d68565b825561268b84612d07565b61269584826126eb565b50836001600160a01b0316336001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb836040516126d99190613d08565b60405180910390a35050600180555050565b6040516370a0823160e01b8152600090839082906001600160a01b038316906370a082319061271e903090600401613639565b60206040518083038186803b15801561273657600080fd5b505afa15801561274a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276e91906135aa565b9050838111156127945761278c6001600160a01b0383163386613026565b8392506127b2565b80156127b2576127ae6001600160a01b0383163383613026565b8092505b505092915050565b60006127c46113ec565b6001600160a01b0316336001600160a01b031614156127e557506001611e74565b60005b825181101561284e5782818151811061281157634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316336001600160a01b0316141561283c576001915050611e74565b8061284681613dab565b9150506127e8565b50600092915050565b6001600160a01b038116600090815260056020526040902060018101548015806128815750804211155b1561288d575050612a36565b4260018301556040516370a0823160e01b81526000906001600160a01b038516906370a08231906128c2903090600401613639565b60206040518083038186803b1580156128da57600080fd5b505afa1580156128ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291291906135aa565b90508061292157505050612a36565b60005b835481101561089357600084600001828154811061295257634e487b7160e01b600052603260045260246000fd5b600091825260209091206004909102018054909150600160d01b900465ffffffffffff16841080156129945750805442600160a01b90910465ffffffffffff16105b15612a23576040805160c08101825282546001600160a01b038116825265ffffffffffff600160a01b820481166020840152600160d01b90910416918101919091526001820154606082015260028201546080820152600382015460a0820152600090612a019086612f65565b9050612a0d8482613d29565b8260020154612a1c9190613d11565b6002830155505b5080612a2e81613dab565b915050612924565b50565b8051612a4457612d03565b602080820151516001600160a01b03841660009081526005835260408082208054825181870281018701909352808352939492939192909190849084015b82821015612b055760008481526020908190206040805160c0810182526004860290920180546001600160a01b038116845265ffffffffffff600160a01b8204811685870152600160d01b909104169183019190915260018082015460608401526002820154608084015260039091015460a08301529083529092019101612a82565b50505050905060005b815181101561089357600081841115612b525784602001518281518110612b4557634e487b7160e01b600052603260045260246000fd5b6020026020010151612b55565b60005b90506000816c0c9f2c9cd04674edea40000000858581518110612b8857634e487b7160e01b600052603260045260246000fd5b6020026020010151608001518860000151612ba39190613d49565b612bad9190613d29565b612bb79190613d68565b9050600081858581518110612bdc57634e487b7160e01b600052603260045260246000fd5b602002602001015160a0015110612bf35781612c20565b848481518110612c1357634e487b7160e01b600052603260045260246000fd5b602002602001015160a001515b905080612c2f57505050612cf1565b6000612c66868681518110612c5457634e487b7160e01b600052603260045260246000fd5b602002602001015160000151836126eb565b905080868681518110612c8957634e487b7160e01b600052603260045260246000fd5b602002602001015160a00151612c9f9190613d68565b6001600160a01b038a166000908152600560205260409020805487908110612cd757634e487b7160e01b600052603260045260246000fd5b906000526020600020906004020160030181905550505050505b80612cfb81613dab565b915050612b0e565b5050565b6001600160a01b038116600090815260056020908152604080832080548251818502810185019093528083529192909190849084015b82821015612dc05760008481526020908190206040805160c0810182526004860290920180546001600160a01b038116845265ffffffffffff600160a01b8204811685870152600160d01b909104169183019190915260018082015460608401526002820154608084015260039091015460a08301529083529092019101612d3d565b505050506001600160a01b038316600090815260066020908152604080832033845290915281209192505b8251811015612f07576001820154811415612e7257816001016c0c9f2c9cd04674edea40000000848381518110612e3257634e487b7160e01b600052603260045260246000fd5b6020026020010151608001518460000154612e4d9190613d49565b612e579190613d29565b81546001810183556000928352602090922090910155612ef5565b6c0c9f2c9cd04674edea40000000838281518110612ea057634e487b7160e01b600052603260045260246000fd5b6020026020010151608001518360000154612ebb9190613d49565b612ec59190613d29565b826001018281548110612ee857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001555b80612eff81613dab565b915050612deb565b50505050565b612f07846323b872dd60e01b858585604051602401612f2e9392919061364d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613045565b600081836040015165ffffffffffff1611612f82575060006110ff565b6000836040015165ffffffffffff164211612f9d5742612fab565b836040015165ffffffffffff165b90506000846020015165ffffffffffff168411612fd457846020015165ffffffffffff16612fd6565b835b90506000612fe48284613d68565b905062093a80816c0c9f2c9cd04674edea4000000088606001516130089190613d49565b6130129190613d49565b61301c9190613d29565b9695505050505050565b6108968363a9059cbb60e01b8484604051602401612f2e929190613671565b600061309a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166130d49092919063ffffffff16565b80519091501561089657808060200190518101906130b8919061358e565b6108965760405162461bcd60e51b81526004016102fe90613b58565b60606130e384846000856130eb565b949350505050565b60606130f6856131ae565b6131125760405162461bcd60e51b81526004016102fe90613ade565b600080866001600160a01b0316858760405161312e919061361d565b60006040518083038185875af1925050503d806000811461316b576040519150601f19603f3d011682016040523d82523d6000602084013e613170565b606091505b509150915081156131845791506130e39050565b8051156131945780518082602001fd5b8360405162461bcd60e51b81526004016102fe91906136f5565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906130e3575050151592915050565b82805482825590600052602060002090810192821561323a579160200282015b8281111561323a5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613207565b5061324692915061327e565b5090565b604051806040016040528060008152602001606081525090565b604051806040016040528060608152602001600081525090565b5b80821115613246576000815560010161327f565b80356001600160a01b0381168114611e7457600080fd5b60008083601f8401126132bb578182fd5b50813567ffffffffffffffff8111156132d2578182fd5b60208301915083602080830285010111156114aa57600080fd5b803565ffffffffffff81168114611e7457600080fd5b600060208284031215613313578081fd5b61331c82613293565b9392505050565b60008060408385031215613335578081fd5b61333e83613293565b915061334c60208401613293565b90509250929050565b600080600060608486031215613369578081fd5b61337284613293565b925061338060208501613293565b9150604084013590509250925092565b600080600080608085870312156133a5578081fd5b6133ae85613293565b93506133bc60208601613293565b9250604085013591506133d1606086016132ec565b905092959194509250565b600080600080600060a086880312156133f3578081fd5b6133fc86613293565b945061340a60208701613293565b9350613418604087016132ec565b94979396509394606081013594506080013592915050565b60008060408385031215613442578182fd5b61344b83613293565b946020939093013593505050565b6000806000806080858703121561346e578384fd5b61347785613293565b93506020850135925061348c60408601613293565b9396929550929360600135925050565b600080602083850312156134ae578182fd5b823567ffffffffffffffff8111156134c4578283fd5b6134d0858286016132aa565b90969095509350505050565b600080600080600080606087890312156134f4578081fd5b863567ffffffffffffffff8082111561350b578283fd5b6135178a838b016132aa565b9098509650602089013591508082111561352f578283fd5b61353b8a838b016132aa565b90965094506040890135915080821115613553578283fd5b5061356089828a016132aa565b979a9699509497509295939492505050565b600060208284031215613583578081fd5b813561331c81613ddc565b60006020828403121561359f578081fd5b815161331c81613ddc565b6000602082840312156135bb578081fd5b5051919050565b6000602082840312156135d3578081fd5b815160ff8116811461331c578182fd5b6000815180845260208085019450808401835b83811015613612578151875295820195908201906001016135f6565b509495945050505050565b6000825161362f818460208701613d7f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156136cb5783516001600160a01b0316835292840192918401916001016136a6565b50909695505050505050565b60006020825261331c60208301846135e3565b901515815260200190565b6000602082528251806020840152613714816040850160208701613d7f565b601f01601f19169190910160400192915050565b60208082526023908201527f426f6e7573526577617264733a20737461727454696d6520696e207468652070604082015262185cdd60ea1b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526021908201527f426f6e7573526577617264733a20706f6f6c20646f6573206e6f7420657869736040820152601d60fa1b606082015260800190565b60208082526022908201527f426f6e7573526577617264733a206c70546f6b656e2c206e6f7420616c6c6f77604082015261195960f21b606082015260800190565b602080825260149082015273109bdb9d5cd4995dd85c991cce881c185d5cd95960621b604082015260600190565b6020808252818101527f426c61636b736d6974683a20696e73756666696369656e742062616c616e6365604082015260600190565b60208082526022908201527f426f6e7573526577617264733a2063616c6c6572206e6f7420726573706f6e6460408201526132b960f11b606082015260800190565b60208082526039908201527f426f6e7573526577617264733a20626f6e75732070726f6772616d20656e646560408201527f642c20706c656173652073746172742061206e6577206f6e6500000000000000606082015260800190565b60208082526023908201527f426f6e7573526577617264733a206c70746f6b656e20646563696d616c73203e60408201526204062760eb1b606082015260800190565b6020808252818101527f426c61636b736d6974683a20706f6f6c20646f6573206e6f7420657869737473604082015260600190565b60208082526025908201527f426f6e7573526577617264733a20626f6e757320616e6420696420646f6e74206040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f426f6e7573526577617264733a206e6f74207265616479000000000000000000604082015260600190565b60208082526018908201527f426f6e7573526577617264733a2077726f6e6720706f6f6c0000000000000000604082015260600190565b60208082526028908201527f426f6e7573526577617264733a206c61737420626f6e7573206e6f7420616c6c6040820152670818db185a5b595960c21b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526023908201527f426f6e7573526577617264733a206e6f7420617574686f72697a65642063616c6040820152623632b960e91b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252602c908201527f426f6e7573526577617264733a206c61737420626f6e757320706572696f642060408201526b1a185cdb89dd08195b99195960a21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000602080835260608084018551604080858801528282518085526080945084890191508684019350875b81811015613cae57845180516001600160a01b031684528881015165ffffffffffff9081168a8601528582015116858501528781015188850152868101518785015260a090810151908401529387019360c090920191600101613c50565b505094909701519590960194909452509392505050565b60006040825283516040830152602084015160406060840152613ceb60808401826135e3565b90508281036020840152613cff81856135e3565b95945050505050565b90815260200190565b60008219821115613d2457613d24613dc6565b500190565b600082613d4457634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613d6357613d63613dc6565b500290565b600082821015613d7a57613d7a613dc6565b500390565b60005b83811015613d9a578181015183820152602001613d82565b83811115612f075750506000910152565b6000600019821415613dbf57613dbf613dc6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b8015158114612a3657600080fdfea2646970667358221220d0a22542c34abc2f3422f5a3b9b9552342772b1c6669d52607c8083eaefe988164736f6c63430008000033

Deployed Bytecode Sourcemap

18248:16204:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21348:376;;;;;;:::i;:::-;;:::i;:::-;;29554:105;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28873:159;;;;;;:::i;:::-;;:::i;27881:860::-;;;;;;:::i;:::-;;:::i;19515:404::-;;;;;;:::i;:::-;;:::i;19925:776::-;;;;;;:::i;:::-;;:::i;29665:1068::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18351:18::-;;;:::i;:::-;;;;;;;:::i;28747:120::-;;;;;;:::i;:::-;;:::i;26783:1040::-;;;;;;:::i;:::-;;:::i;978:79::-;;;:::i;:::-;;;;;;;:::i;29159:196::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;25441:1176::-;;;;;;:::i;:::-;;:::i;23745:1585::-;;;;;;:::i;:::-;;:::i;29361:187::-;;;;;;:::i;:::-;;:::i;29038:115::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21772:1823::-;;;;;;:::i;:::-;;:::i;30741:101::-;;;:::i;1422:244::-;;;;;;:::i;:::-;;:::i;20756:542::-;;;;;;:::i;:::-;;:::i;21348:376::-;3400:1;3997:7;;:19;;3989:63;;;;-1:-1:-1;;;3989:63:0;;;;;;;:::i;:::-;;;;;;;;;3400:1;4130:7;:18;21448:9:::1;21443:276;21463:20:::0;;::::1;21443:276;;;21499:17;21519:5;:19;21525:9;;21535:1;21525:12;;;;;-1:-1:-1::0;;;21525:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21519:19:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;21519:19:0;;;21539:10:::1;21519:31:::0;;;;;;;21576:11;;21596:15;;;21519:31;-1:-1:-1;21620:35:0::1;21634:9:::0;;21644:1;21634:12;;::::1;;;-1:-1:-1::0;;;21634:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21648:6;21620:13;:35::i;:::-;;21690:9;;21700:1;21690:12;;;;;-1:-1:-1::0;;;21690:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21669:42:0::1;21678:10;-1:-1:-1::0;;;;;21669:42:0::1;;21704:6;21669:42;;;;;;:::i;:::-;;;;;;;;21443:276;;21485:3;;;;;:::i;:::-;;;;21443:276;;;-1:-1:-1::0;;3356:1:0;4309:22;;-1:-1:-1;21348:376:0:o;29554:105::-;29611:16;29643:10;29636:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29636:17:0;;;;;;;;;;;;;;;;;;;;;;;29554:105;:::o;28873:159::-;28939:25;28953:10;28939:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28939:25:0;;;;;;;;;;;;;;;;;;;;;:13;:25::i;:::-;28931:72;;;;-1:-1:-1;;;28931:72:0;;;;;;;:::i;:::-;29010:6;:16;;-1:-1:-1;;29010:16:0;;;;;;;;;;28873:159::o;27881:860::-;1190:6;;-1:-1:-1;;;;;1190:6:0;1200:10;1190:20;1182:65;;;;-1:-1:-1;;;1182:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28001:13:0;::::1;;::::0;;;:5:::1;:13;::::0;;;;:27:::1;;::::0;:32;27993:79:::1;;;;-1:-1:-1::0;;;27993:79:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28085:20:0;::::1;28081:655;;28150:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;28142:25:0::1;:48;28168:21;28142:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;28081:655;;;28231:39;::::0;-1:-1:-1;;;28231:39:0;;28213:15:::1;::::0;-1:-1:-1;;;;;28231:24:0;::::1;::::0;::::1;::::0;:39:::1;::::0;28264:4:::1;::::0;28231:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28283:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;28213:57;;-1:-1:-1;28283:25:0::1;;::::0;:30:::1;28279:398;;;-1:-1:-1::0;;;;;28371:15:0;::::1;28350:18;28371:15:::0;;;:5:::1;:15;::::0;;;;:37;;28395:12;;28371:37;::::1;;;-1:-1:-1::0;;;28371:37:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;28350:58:::1;::::0;;::::1;::::0;::::1;::::0;;28371:37:::1;::::0;;::::1;::::0;;::::1;28350:58:::0;;-1:-1:-1;;;;;28350:58:0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;28350:58:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;28350:58:0;;::::1;::::0;;::::1;::::0;;;;;;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;;;-1:-1:-1;28427:30:0;;::::1;;28419:67;;;;-1:-1:-1::0;;;28419:67:0::1;;;;;;;:::i;:::-;28528:15;18406:6;28505:5;:13;;;:20;;;;;;:::i;:::-;:38;28497:74;;;;-1:-1:-1::0;;;28497:74:0::1;;;;;;;:::i;:::-;28592:14;::::0;::::1;::::0;-1:-1:-1;;;;;28617:15:0;::::1;28666:1;28617:15:::0;;;:5:::1;:15;::::0;;;;:37;;28592:14;;-1:-1:-1;28666:1:0;;28641:12;;28617:37;::::1;;;-1:-1:-1::0;;;28617:37:0::1;;;;;;;;;;;;;;;;;;;:46;;:50;;;;28279:398;;28694:6;-1:-1:-1::0;;;;;28687:23:0::1;;28711:7;:5;:7::i;:::-;28720;28687:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28081:655;;27881:860:::0;;;:::o;19515:404::-;3400:1;3997:7;;:19;;3989:63;;;;-1:-1:-1;;;3989:63:0;;;;;;;:::i;:::-;3400:1;4130:7;:18;;;19464:6;::::1;;19463:7;19455:40;;;;-1:-1:-1::0;;;19455:40:0::1;;;;;;;:::i;:::-;19628:9:::2;19623:291;19643:20:::0;;::::2;19623:291;;;19679:15;19697:9;;19707:1;19697:12;;;;;-1:-1:-1::0;;;19697:12:0::2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19737:14:0;::::2;19718:16;19737:14:::0;;;:5:::2;:14;::::0;;;;;;;19752:10:::2;19737:26:::0;;;;;;;19718:45;;;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;;;;;;;;;;19679:30;;-1:-1:-1;19718:16:0;;:45;;19737:26;;19718:45;;::::2;::::0;;;;;::::2;::::0;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;19718:45:0;;;;-1:-1:-1;;19776:11:0;;19718:45;;-1:-1:-1;;19772:30:0::2;;19794:8;;;;19772:30;19811:20;19823:7;19811:11;:20::i;:::-;19840:28;19854:7;19863:4;19840:13;:28::i;:::-;19877:29;19898:7;19877:20;:29::i;:::-;19623:291;;;19665:3:::0;::::2;::::0;::::2;:::i;:::-;;;;19623:291;;19925:776:::0;3400:1;3997:7;;:19;;3989:63;;;;-1:-1:-1;;;3989:63:0;;;;;;;:::i;:::-;3400:1;4130:7;:18;;;19464:6;::::1;;19463:7;19455:40;;;;-1:-1:-1::0;;;19455:40:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20033:15:0;::::2;20065:1;20033:15:::0;;;:5:::2;:15;::::0;;;;:29:::2;;::::0;20025:78:::2;;;;-1:-1:-1::0;;;20025:78:0::2;;;;;;;:::i;:::-;20118:38;::::0;-1:-1:-1;;;20118:38:0;;20160:7;;-1:-1:-1;;;;;20118:26:0;::::2;::::0;::::2;::::0;:38:::2;::::0;20145:10:::2;::::0;20118:38:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;20110:94;;;;-1:-1:-1::0;;;20110:94:0::2;;;;;;;:::i;:::-;20213:21;20225:8;20213:11;:21::i;:::-;-1:-1:-1::0;;;;;20261:15:0;::::2;20241:17;20261:15:::0;;;:5:::2;:15;::::0;;;;;;;20277:10:::2;20261:27:::0;;;;;;;;20295:29;;;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;;;;;;;;;;20261:27;;20295:29:::2;::::0;20267:8;;20261:27;;20295:29;;::::2;::::0;;;;;;::::2;::::0;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;:13;:29::i;:::-;20395:30;::::0;-1:-1:-1;;;20395:30:0;;20355:8;;20333:12:::2;::::0;-1:-1:-1;;;;;20395:15:0;::::2;::::0;::::2;::::0;:30:::2;::::0;20419:4:::2;::::0;20395:30:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20371:54:::0;-1:-1:-1;20432:58:0::2;-1:-1:-1::0;;;;;20432:22:0;::::2;20455:10;20475:4;20482:7:::0;20432:22:::2;:58::i;:::-;20497:16;20549:13;20516:5;-1:-1:-1::0;;;;;20516:15:0::2;;20540:4;20516:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;;:::i;:::-;20585:11:::0;;20497:65;;-1:-1:-1;20585:22:0::2;::::0;20497:65;;20585:22:::2;:::i;:::-;20571:36:::0;;20614:30:::2;20635:8:::0;20614:20:::2;:30::i;:::-;20676:8;-1:-1:-1::0;;;;;20656:39:0::2;20664:10;-1:-1:-1::0;;;;;20656:39:0::2;;20686:8;20656:39;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;3356:1:0;4309:22;;-1:-1:-1;;;;19925:776:0:o;29665:1068::-;-1:-1:-1;;;;;29793:15:0;;29774:16;29793:15;;;:5;:15;;;;;;;;29774:34;;;;;;;;;29749:16;29774:34;;;;;;;;;;;29749:16;;29774;:34;;;;29793:15;;29774:16;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29774:34:0;;;;;-1:-1:-1;;;29774:34:0;;;;;;;;-1:-1:-1;;;29774:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29774:34:0;;;-1:-1:-1;29774:34:0;;;;;;;;;;-1:-1:-1;;;;;29834:15:0;;;-1:-1:-1;29834:15:0;;;:5;:15;;;;;;:22;;;;;;;;;;;29815:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29774:34;;-1:-1:-1;;;29834:22:0;;29815:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29863:24;29904:4;:12;;;:19;29890:34;;;;;;-1:-1:-1;;;29890:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29890:34:0;-1:-1:-1;29935:11:0;;29863:61;;-1:-1:-1;29931:36:0;;29960:7;-1:-1:-1;29953:14:0;;-1:-1:-1;;29953:14:0;29931:36;30006:21;;;;:28;29976:27;30041:666;30065:7;:14;30061:1;:18;30041:666;;;30096:18;30117:4;:12;;;30130:1;30117:15;;;;;;-1:-1:-1;;;30117:15:0;;;;;;;;;;;;;;;30096:36;;30163:15;30145:5;:15;;;:33;;;:55;;;;;30199:1;30182:5;:14;;;:18;30145:55;30141:559;;;30231:41;;-1:-1:-1;;;30231:41:0;;30213:15;;-1:-1:-1;;;;;30231:26:0;;;;;:41;;30266:4;;30231:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30213:59;;30283:20;30306:45;30325:5;30332:4;:18;;;30306;:45::i;:::-;30283:68;-1:-1:-1;30362:21:0;30413:22;30428:7;30283:68;30413:22;:::i;:::-;30386:5;:24;;;:49;;;;:::i;:::-;30362:73;;30446:23;30495:1;30472:19;:24;;:55;;30503:4;:21;;;30525:1;30503:24;;;;;;-1:-1:-1;;;30503:24:0;;;;;;;;;;;;;;;30472:55;;;30499:1;30472:55;30446:81;;30538:14;30602:15;18564:4;30569:13;30555:4;:11;;;:27;;;;:::i;:::-;:44;;;;:::i;:::-;:62;;;;:::i;:::-;30538:79;;30650:5;:14;;;30641:6;:23;:49;;30676:5;:14;;;30641:49;;;30667:6;30641:49;30628:7;30636:1;30628:10;;;;;;-1:-1:-1;;;30628:10:0;;;;;;;;;;;;;;:62;;;;;30141:559;;;;;;-1:-1:-1;30081:4:0;;;;:::i;:::-;;;;30041:666;;;-1:-1:-1;30720:7:0;;-1:-1:-1;;;;29665:1068:0;;;;;:::o;18351:18::-;;;;;;:::o;28747:120::-;1190:6;;-1:-1:-1;;;;;1190:6:0;1200:10;1190:20;1182:65;;;;-1:-1:-1;;;1182:65:0;;;;;;;:::i;:::-;28837:24:::1;:10;28850:11:::0;;28837:24:::1;:::i;26783:1040::-:0;1190:6;;-1:-1:-1;;;;;1190:6:0;1200:10;1190:20;1182:65;;;;-1:-1:-1;;;1182:65:0;;;;;;;:::i;:::-;19464:6:::1;::::0;::::1;;19463:7;19455:40;;;;-1:-1:-1::0;;;19455:40:0::1;;;;;;;:::i;:::-;27019:15:::2;26997:19;27041:777;27061:20:::0;;::::2;27041:777;;;27097:16;27116:9;;27126:1;27116:12;;;;;-1:-1:-1::0;;;27116:12:0::2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27097:31;;27176:2;27152:8;-1:-1:-1::0;;;;;27145:25:0::2;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;;;;27137:81;;;;-1:-1:-1::0;;;27137:81:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27231:15:0;::::2;;::::0;;;:5:::2;:15;::::0;;;;:29:::2;;::::0;27227:138:::2;;-1:-1:-1::0;;;;;27278:15:0;::::2;;::::0;;;:5:::2;:15;::::0;;;;:29:::2;::::0;;::::2;:43:::0;;;27332:8:::2;:23:::0;;;;::::2;::::0;;;;;;::::2;::::0;;-1:-1:-1;;;;;;27332:23:0::2;::::0;;::::2;::::0;;27227:138:::2;27472:9;27467:344;27487:27:::0;;::::2;27467:344;;;27532:23;27558:16;;27575:1;27558:19;;;;;-1:-1:-1::0;;;27558:19:0::2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27596:22:0;::::2;;::::0;;;:5:::2;:22;::::0;;;;:36:::2;;::::0;27532:45;;-1:-1:-1;27596:41:0;27588:88:::2;;;;-1:-1:-1::0;;;27588:88:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27687:33:0;;::::2;;::::0;;;:23:::2;:33;::::0;;;;;;;:50;;::::2;::::0;;;;;;:65:::2;::::0;27740:12;;27687:65:::2;:::i;:::-;-1:-1:-1::0;;;;;;27763:34:0::2;;::::0;;;:17:::2;:34;::::0;;;;:38;;-1:-1:-1;;27763:38:0::2;27800:1;27763:38;::::0;;27516:3;::::2;::::0;::::2;:::i;:::-;;;;27467:344;;;;27041:777;27083:3;;;;;:::i;:::-;;;;27041:777;;;;19502:1;26783:1040:::0;;;;;;:::o;978:79::-;1016:7;1043:6;-1:-1:-1;;;;;1043:6:0;978:79;:::o;29159:196::-;29244:11;;:::i;:::-;-1:-1:-1;;;;;29290:15:0;;;;;;;:5;:15;;;;;;;;:25;;;;;;;;;29257:16;;29317:31;29296:8;29306;29317:11;:31::i;:::-;29282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29159:196;;;;;;:::o;25441:1176::-;3400:1;3997:7;;:19;;3989:63;;;;-1:-1:-1;;;3989:63:0;;;;;;;:::i;:::-;3400:1;4130:7;:18;;;19464:6;::::1;;19463:7;19455:40;;;;-1:-1:-1::0;;;19455:40:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25647:33:0;;::::2;;::::0;;;:23:::2;:33;::::0;;;;;;;:50;;::::2;::::0;;;;;;;;;25633:65;;;;;;::::2;::::0;;;;;;;;;;::::2;::::0;;;::::2;25647:50:::0;25633:65;;::::2;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;25633:65:0::2;::::0;;;;;::::2;::::0;::::2;;::::0;;::::2;;;;;;;;:13;:65::i;:::-;25625:113;;;;-1:-1:-1::0;;;25625:113:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25768:15:0;::::2;25747:18;25768:15:::0;;;:5:::2;:15;::::0;;;;:37;;25792:12;;25768:37;::::2;;;-1:-1:-1::0;;;25768:37:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;;25747:58:::2;::::0;;::::2;::::0;::::2;::::0;;25768:37:::2;::::0;;::::2;::::0;;::::2;25747:58:::0;;-1:-1:-1;;;;;25747:58:0;;::::2;::::0;;;::::2;-1:-1:-1::0;;;25747:58:0;::::2;::::0;::::2;::::0;;::::2;::::0;;;;-1:-1:-1;;;25747:58:0;;::::2;::::0;;::::2;::::0;;;;;;;;;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;;::::0;;;;;;;-1:-1:-1;25820:39:0;;::::2;;25812:89;;;;-1:-1:-1::0;;;25812:89:0::2;;;;;;;:::i;:::-;25932:15;25916:5;:13;;;:31;;;25908:101;;;;-1:-1:-1::0;;;25908:101:0::2;;;;;;;:::i;:::-;26096:39;::::0;-1:-1:-1;;;26096:39:0;;26049:15;;26018:21:::2;::::0;-1:-1:-1;;;;;26096:24:0;::::2;::::0;::::2;::::0;:39:::2;::::0;26129:4:::2;::::0;26096:39:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26072:63:::0;-1:-1:-1;26142:75:0::2;-1:-1:-1::0;;;;;26142:31:0;::::2;26174:10;26194:4;26201:15:::0;26142:31:::2;:75::i;:::-;26224:16;26285:13;26243:14;-1:-1:-1::0;;;;;26243:24:0::2;;26276:4;26243:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;;:::i;:::-;26224:74;;26388:14;26452:5;:13;;;26412:53;;26430:5;:19;;;18406:6;26412:8;:15;;;;:::i;:::-;:37;;;;:::i;:::-;:53;;;;:::i;:::-;-1:-1:-1::0;;;;;26475:15:0;::::2;;::::0;;;:5:::2;:15;::::0;;;;:37;;26388:78;;-1:-1:-1;26388:78:0;;26499:12;;26475:37;::::2;;;-1:-1:-1::0;;;26475:37:0::2;;;;;;;;;;;;;;;;;;;:45;;;:55;;;;;;;;;;;;;;;;;;26603:8;26586:5;:14;;;:25;;;;:::i;:::-;-1:-1:-1::0;;;;;26537:15:0;::::2;;::::0;;;:5:::2;:15;::::0;;;;:37;;26561:12;;26537:37;::::2;;;-1:-1:-1::0;;;26537:37:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;:46:::2;:37;::::0;;::::2;;:46;:74:::0;-1:-1:-1;;3356:1:0;4309:22;;-1:-1:-1;;;;;;;25441:1176:0:o;23745:1585::-;3400:1;3997:7;;:19;;3989:63;;;;-1:-1:-1;;;3989:63:0;;;;;;;:::i;:::-;3400:1;4130:7;:18;;;19464:6;::::1;;19463:7;19455:40;;;;-1:-1:-1::0;;;19455:40:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23947:33:0;;::::2;;::::0;;;:23:::2;:33;::::0;;;;;;;:50;;::::2;::::0;;;;;;;;;23933:65;;;;;;::::2;::::0;;;;;;;;;;::::2;::::0;;;::::2;23947:50:::0;23933:65;;::::2;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;23933:65:0::2;::::0;;;;;::::2;::::0;::::2;;::::0;;::::2;;;;;;;;:13;:65::i;:::-;23925:113;;;;-1:-1:-1::0;;;23925:113:0::2;;;;;;;:::i;:::-;24053:15;::::0;::::2;::::0;;:47:::2;;;24085:15;24072:10;:28;;;24053:47;24045:95;;;;-1:-1:-1::0;;;24045:95:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24284:15:0;::::2;24265:16;24284:15:::0;;;:5:::2;:15;::::0;;;;;;;24265:34;;;;;;;::::2;::::0;;;;;;;;::::2;::::0;;;;;24284:15;;24265:34;;24284:15;;24265:34;:16;;:34;;::::2;;;;;;;;::::0;;;::::2;::::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;;;24265:34:0;::::2;::::0;;::::2;-1:-1:-1::0;;;24265:34:0;::::2;::::0;::::2;::::0;;::::2;::::0;-1:-1:-1;;;24265:34:0;;::::2;;::::0;;;;;;;;;;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;::::2;::::0;;;;;;;;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;24335:1;24314:4;:18;;;:22;24306:68;;;;-1:-1:-1::0;;;24306:68:0::2;;;;;;;:::i;:::-;24406:12:::0;;24381:22:::2;24425:900;24449:7;:14;24445:1;:18;24425:900;;;24512:15;-1:-1:-1::0;;;;;24483:44:0::2;:7;24491:1;24483:10;;;;;;-1:-1:-1::0;;;24483:10:0::2;;;;;;;;;;;;;;;:25;;;-1:-1:-1::0;;;;;24483:44:0::2;;:84;;;;;24552:15;24531:7;24539:1;24531:10;;;;;;-1:-1:-1::0;;;24531:10:0::2;;;;;;;;;;;;;;;:18;;;:36;;;24483:84;24479:839;;;-1:-1:-1::0;;;;;24602:15:0;::::2;24580:19;24602:15:::0;;;:5:::2;:15;::::0;;;;:26;;24626:1;;24602:26;::::2;;;-1:-1:-1::0;;;24602:26:0::2;;;;;;;;;;;;;;;;;;;24580:48;;24639:21;24651:8;24639:11;:21::i;:::-;24726:15:::0;;24745::::2;-1:-1:-1::0;;;24726:15:0;;::::2;;;:34;24722:540;;24861:15;24847:10;:29;;;24843:92;;24893:28:::0;;-1:-1:-1;;;;24893:28:0::2;-1:-1:-1::0;;;24893:28:0::2;::::0;::::2;;;::::0;;24843:92:::2;25011:15:::0;;24970:14:::2;::::0;::::2;::::0;-1:-1:-1;;;25011:15:0;;::::2;;;::::0;24994:14;;24970:21:::2;::::0;18406:6:::2;::::0;24970:21:::2;:::i;:::-;:38;;;;:::i;:::-;:56;;;;:::i;:::-;24947:80:::0;;::::2;::::0;;;::::2;-1:-1:-1::0;;;24947:80:0::2;-1:-1:-1::0;;;;;24947:80:0;;::::2;;::::0;;24722:540:::2;;;25125:19;::::0;::::2;::::0;25090:13;;25058:28:::2;::::0;18406:6:::2;::::0;25090:31:::2;::::0;25106:15:::2;::::0;-1:-1:-1;;;25090:13:0;::::2;;;:31;:::i;:::-;25089:55;;;;:::i;:::-;:62;;;;:::i;:::-;25058:93:::0;-1:-1:-1;25234:15:0::2;25217:14:::0;25187:27:::2;18406:6;25058:93:::0;25187:27:::2;:::i;:::-;:44;;;;:::i;:::-;:62;;;;:::i;:::-;25164:86:::0;;::::2;::::0;;;::::2;-1:-1:-1::0;;;25164:86:0::2;-1:-1:-1::0;;;;;25164:86:0;;::::2;;::::0;;-1:-1:-1;24722:540:0::2;25272:19;;:36:::0;;;24479:839:::2;24465:3:::0;::::2;::::0;::::2;:::i;:::-;;;;24425:900;;;-1:-1:-1::0;;3356:1:0;4309:22;;-1:-1:-1;;;;;23745:1585:0:o;29361:187::-;-1:-1:-1;;;;;29492:33:0;;;;;;;:23;:33;;;;;;;;:50;;;;;;;;;;;;29485:57;;;;;;;;;;;;;;;;;29460:16;;29485:57;;;29492:50;29485:57;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29485:57:0;;;;;;;;;;;;;;;;;;;;;;;29361:187;;;;:::o;29038:115::-;29105:11;;:::i;:::-;-1:-1:-1;;;;;29132:15:0;;;;;;:5;:15;;;;;;;;29125:22;;;;;;;;;;;;;;;;;;;;;;29132:15;;29125:22;;;;29132:15;;29125:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29125:22:0;;;;;-1:-1:-1;;;29125:22:0;;;;;;;;-1:-1:-1;;;29125:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29038:115;;;;:::o;21772:1823::-;3400:1;3997:7;;:19;;3989:63;;;;-1:-1:-1;;;3989:63:0;;;;;;;:::i;:::-;3400:1;4130:7;:18;;;19464:6;::::1;;19463:7;19455:40;;;;-1:-1:-1::0;;;19455:40:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22001:33:0;;::::2;;::::0;;;:23:::2;:33;::::0;;;;;;;:50;;::::2;::::0;;;;;;;;;21987:65;;;;;;::::2;::::0;;;;;;;;;;::::2;::::0;;;::::2;22001:50:::0;21987:65;;::::2;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;21987:65:0::2;::::0;;;;;::::2;::::0;::::2;;::::0;;::::2;;;;;;;;:13;:65::i;:::-;21979:113;;;;-1:-1:-1::0;;;21979:113:0::2;;;;;;;:::i;:::-;22121:15;22107:10;:29;;;;22099:77;;;;-1:-1:-1::0;;;22099:77:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22320:15:0;::::2;22301:16;22320:15:::0;;;:5:::2;:15;::::0;;;;;;;22301:34;;;;;;;::::2;::::0;;;;;;;;::::2;::::0;;;;;22320:15;;22301:34;;22320:15;;22301:34;:16;;:34;;::::2;;;;;;;;::::0;;;::::2;::::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;;;22301:34:0;::::2;::::0;;::::2;-1:-1:-1::0;;;22301:34:0;::::2;::::0;::::2;::::0;;::::2;::::0;-1:-1:-1;;;22301:34:0;;::::2;;::::0;;;;;;;;;;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;::::2;::::0;;;;;;;;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;22371:1;22350:4;:18;;;:22;22342:68;;;;-1:-1:-1::0;;;22342:68:0::2;;;;;;;:::i;:::-;22442:12:::0;;22417:22:::2;22461:437;22485:7;:14;22481:1;:18;22461:437;;;22548:15;-1:-1:-1::0;;;;;22519:44:0::2;:7;22527:1;22519:10;;;;;;-1:-1:-1::0;;;22519:10:0::2;;;;;;;;;;;;;;;:25;;;-1:-1:-1::0;;;;;22519:44:0::2;;22515:376;;;22729:15;18406:6;22701:7;22709:1;22701:10;;;;;;-1:-1:-1::0;;;22701:10:0::2;;;;;;;;;;;;;;;:18;;;:25;;;;;;:::i;:::-;:43;22693:100;;;;-1:-1:-1::0;;;22693:100:0::2;;;;;;;:::i;:::-;22812:7;22820:1;22812:10;;;;;;-1:-1:-1::0;;;22812:10:0::2;;;;;;;;;;;;;;;:19;;;22835:1;22812:24;22804:77;;;;-1:-1:-1::0;;;22804:77:0::2;;;;;;;:::i;:::-;22501:3:::0;::::2;::::0;::::2;:::i;:::-;;;;22461:437;;;-1:-1:-1::0;22984:39:0::2;::::0;-1:-1:-1;;;22984:39:0;;22937:15;;22906:21:::2;::::0;-1:-1:-1;;;;;22984:24:0;::::2;::::0;::::2;::::0;:39:::2;::::0;23017:4:::2;::::0;22984:39:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22960:63:::0;-1:-1:-1;23030:75:0::2;-1:-1:-1::0;;;;;23030:31:0;::::2;23062:10;23082:4;23089:15:::0;23030:31:::2;:75::i;:::-;23112:16;23173:13;23131:14;-1:-1:-1::0;;;;;23131:24:0::2;;23164:4;23131:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;;:::i;:::-;23112:74:::0;-1:-1:-1;23276:14:0::2;23300:45;::::0;::::2;23318:14:::0;23300:15:::2;18406:6;23112:74:::0;23300:15:::2;:::i;:::-;:32;;;;:::i;:::-;:45;;;;:::i;:::-;23276:70;;23355:5;:15;23361:8;-1:-1:-1::0;;;;;23355:15:0::2;-1:-1:-1::0;;;;;23355:15:0::2;;;;;;;;;;;;:23;;23384:204;;;;;;;;23415:15;-1:-1:-1::0;;;;;23384:204:0::2;;;;;23450:10;23384:204;;;;;;23478:7;23384:204;;;;;;23509:14;23384:204;;;;23552:1;23384:204;;;;23572:8;23384:204;;::::0;23355:234:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;23355:234:0::2;;;;;-1:-1:-1::0;;;;;23355:234:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19502:1;;;;;;3356::::0;4309:7;:22;;;;21772:1823;;;;;:::o;30741:101::-;30796:16;30828:8;30821:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30821:15:0;;;;;;;;;;;;;;;;;;;;;;30741:101;:::o;1422:244::-;1190:6;;-1:-1:-1;;;;;1190:6:0;1200:10;1190:20;1182:65;;;;-1:-1:-1;;;1182:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1511:22:0;::::1;1503:73;;;;-1:-1:-1::0;;;1503:73:0::1;;;;;;;:::i;:::-;1613:6;::::0;;1592:38:::1;::::0;-1:-1:-1;;;;;1592:38:0;;::::1;::::0;1613:6;::::1;::::0;1592:38:::1;::::0;::::1;1641:6;:17:::0;;-1:-1:-1;;;;;;1641:17:0::1;-1:-1:-1::0;;;;;1641:17:0;;;::::1;::::0;;;::::1;::::0;;1422:244::o;20756:542::-;3400:1;3997:7;;:19;;3989:63;;;;-1:-1:-1;;;3989:63:0;;;;;;;:::i;:::-;3400:1;4130:7;:18;;;19464:6;::::1;;19463:7;19455:40;;;;-1:-1:-1::0;;;19455:40:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20865:15:0;::::2;20897:1;20865:15:::0;;;:5:::2;:15;::::0;;;;:29:::2;;::::0;20857:78:::2;;;;-1:-1:-1::0;;;20857:78:0::2;;;;;;;:::i;:::-;20942:21;20954:8;20942:11;:21::i;:::-;-1:-1:-1::0;;;;;20992:15:0;::::2;20972:17;20992:15:::0;;;:5:::2;:15;::::0;;;;;;;21008:10:::2;20992:27:::0;;;;;;;;21026:29;;;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;;;;;;;;;;20992:27;;21026:29:::2;::::0;20998:8;;20992:27;;21026:29;;::::2;::::0;;;;;;::::2;::::0;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;:13;:29::i;:::-;21062:14;21093:7;21079:4;:11;;;:21;:45;;21113:11:::0;;21079:45:::2;;;21103:7;21079:45;21145:11:::0;;21062:62;;-1:-1:-1;21145:20:0::2;::::0;21062:62;;21145:20:::2;:::i;:::-;21131:34:::0;;21172:30:::2;21193:8:::0;21172:20:::2;:30::i;:::-;21211:31;21225:8;21235:6;21211:13;:31::i;:::-;;21275:8;-1:-1:-1::0;;;;;21254:38:0::2;21263:10;-1:-1:-1::0;;;;;21254:38:0::2;;21285:6;21254:38;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;3356:1:0;4309:22;;-1:-1:-1;;20756:542:0:o;32332:418::-;32488:30;;-1:-1:-1;;;32488:30:0;;32405:20;;32456:6;;32405:20;;-1:-1:-1;;;;;32488:15:0;;;;;:30;;32512:4;;32488:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32470:48;;32539:7;32529;:17;32525:220;;;32557:39;-1:-1:-1;;;;;32557:18:0;;32576:10;32588:7;32557:18;:39::i;:::-;32620:7;32605:22;;32525:220;;;32645:11;;32641:104;;32667:39;-1:-1:-1;;;;;32667:18:0;;32686:10;32698:7;32667:18;:39::i;:::-;32730:7;32715:22;;32641:104;32332:418;;;;;;:::o;34165:284::-;34238:4;34269:7;:5;:7::i;:::-;-1:-1:-1;;;;;34255:21:0;:10;-1:-1:-1;;;;;34255:21:0;;34251:38;;;-1:-1:-1;34285:4:0;34278:11;;34251:38;34303:9;34298:127;34322:9;:16;34318:1;:20;34298:127;;;34372:9;34382:1;34372:12;;;;;;-1:-1:-1;;;34372:12:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34358:26:0;:10;-1:-1:-1;;;;;34358:26:0;;34354:64;;;34404:4;34397:11;;;;;34354:64;34340:3;;;;:::i;:::-;;;;34298:127;;;-1:-1:-1;34438:5:0;;34165:284;-1:-1:-1;;34165:284:0:o;30964:741::-;-1:-1:-1;;;;;31038:15:0;;31018:17;31038:15;;;:5;:15;;;;;31088:18;;;;31117:22;;;:62;;;31162:17;31143:15;:36;;31117:62;31113:75;;;31181:7;;;;31113:75;31215:15;31194:18;;;:36;31255:41;;-1:-1:-1;;;31255:41:0;;31237:15;;-1:-1:-1;;;;;31255:26:0;;;;;:41;;31290:4;;31255:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31237:59;-1:-1:-1;31307:12:0;31303:25;;31321:7;;;;;31303:25;31341:9;31336:364;31360:19;;31356:23;;31336:364;;;31396:19;31418:4;:12;;31431:1;31418:15;;;;;;-1:-1:-1;;;31418:15:0;;;;;;;;;;;;;;;;;;;;;;31466:13;;31418:15;;-1:-1:-1;;;;31466:13:0;;;;31446:33;;:70;;;;-1:-1:-1;31483:15:0;;31501;-1:-1:-1;;;31483:15:0;;;;;:33;31446:70;31442:251;;;31552:44;;;;;;;;;;-1:-1:-1;;;;;31552:44:0;;;;;-1:-1:-1;;;31552:44:0;;;;;;;;-1:-1:-1;;;31552:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31529:20;;31552:44;;31578:17;31552:18;:44::i;:::-;31529:67;-1:-1:-1;31661:22:0;31676:7;31529:67;31661:22;:::i;:::-;31634:5;:24;;;:49;;;;:::i;:::-;31607:24;;;:76;-1:-1:-1;31442:251:0;-1:-1:-1;31381:4:0;;;;:::i;:::-;;;;31336:364;;30964:741;;:::o;33246:866::-;33373:12;;33369:30;;33392:7;;33369:30;33435:22;;;;;:29;-1:-1:-1;;;;;33496:15:0;;33405:27;33496:15;;;:5;:15;;;;;;33471:48;;;;;;;;;;;;;;;;;33435:29;;33405:27;;33471:48;;33496:15;;33471:48;33405:27;;33471:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33471:48:0;;;;;-1:-1:-1;;;33471:48:0;;;;;;;;-1:-1:-1;;;33471:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33531:9;33526:581;33550:7;:14;33546:1;:18;33526:581;;;33580:23;33629:1;33606:19;:24;;:56;;33637:5;:22;;;33660:1;33637:25;;;;;;-1:-1:-1;;;33637:25:0;;;;;;;;;;;;;;;33606:56;;;33633:1;33606:56;33580:82;;33671:28;33766:15;18564:4;33717:7;33725:1;33717:10;;;;;;-1:-1:-1;;;33717:10:0;;;;;;;;;;;;;;;:29;;;33702:5;:12;;;:44;;;;:::i;:::-;:61;;;;:::i;:::-;:79;;;;:::i;:::-;33671:110;;33790:18;33833:20;33811:7;33819:1;33811:10;;;;;;-1:-1:-1;;;33811:10:0;;;;;;;;;;;;;;;:19;;;:42;:87;;33878:20;33811:87;;;33856:7;33864:1;33856:10;;;;;;-1:-1:-1;;;33856:10:0;;;;;;;;;;;;;;;:19;;;33811:87;33790:108;-1:-1:-1;33911:15:0;33907:29;;33928:8;;;;;33907:29;33945:19;33967:52;33981:7;33989:1;33981:10;;;;;;-1:-1:-1;;;33981:10:0;;;;;;;;;;;;;;;:25;;;34008:10;33967:13;:52::i;:::-;33945:74;;34088:11;34066:7;34074:1;34066:10;;;;;;-1:-1:-1;;;34066:10:0;;;;;;;;;;;;;;;:19;;;:33;;;;:::i;:::-;-1:-1:-1;;;;;34028:15:0;;;;;;:5;:15;;;;;:26;;34052:1;;34028:26;;;;-1:-1:-1;;;34028:26:0;;;;;;;;;;;;;;;;;;;:35;;:71;;;;33526:581;;;;;33566:3;;;;:::i;:::-;;;;33526:581;;33246:866;;;:::o;31711:565::-;-1:-1:-1;;;;;31799:15:0;;31774:22;31799:15;;;:5;:15;;;;;;;;31774:48;;;;;;;;;;;;;;;;;;;31799:15;;31774:48;:22;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31774:48:0;;;;;-1:-1:-1;;;31774:48:0;;;;;;;;-1:-1:-1;;;31774:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;31849:15:0;;31829:17;31849:15;;;:5;:15;;;;;;;;31865:10;31849:27;;;;;;;31774:48;;-1:-1:-1;31883:388:0;31907:7;:14;31903:1;:18;31883:388;;;32006:21;;;:28;:33;;32002:262;;;32052:4;:21;;18564:4;32093:7;32101:1;32093:10;;;;;;-1:-1:-1;;;32093:10:0;;;;;;;;;;;;;;;:29;;;32079:4;:11;;;:43;;;;:::i;:::-;:60;;;;:::i;:::-;32052:88;;;;;;;-1:-1:-1;32052:88:0;;;;;;;;;;;32002:262;;;18564:4;32208:7;32216:1;32208:10;;;;;;-1:-1:-1;;;32208:10:0;;;;;;;;;;;;;;;:29;;;32194:4;:11;;;:43;;;;:::i;:::-;:60;;;;:::i;:::-;32167:4;:21;;32189:1;32167:24;;;;;;-1:-1:-1;;;32167:24:0;;;;;;;;;;;;;;;;;;:87;32002:262;31923:3;;;;:::i;:::-;;;;31883:388;;;;31711:565;;;:::o;12363:205::-;12464:96;12484:5;12514:27;;;12543:4;12549:2;12553:5;12491:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;12491:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;12491:68:0;-1:-1:-1;;;;;;12491:68:0;;;;;;;;;;12464:19;:96::i;32756:484::-;32852:7;32890:14;32872:6;:14;;;:32;;;32868:46;;-1:-1:-1;32913:1:0;32906:8;;32868:46;32923:18;32962:6;:14;;;32944:32;;:15;:32;:67;;32996:15;32944:67;;;32979:6;:14;;;32944:67;;;32923:88;;33018:20;33058:6;:16;;;33041:33;;:14;:33;:69;;33094:6;:16;;;33041:69;;;;;33077:14;33041:69;33018:92;-1:-1:-1;33117:18:0;33138:25;33018:92;33138:10;:25;:::i;:::-;33117:46;;18406:6;33217:10;18564:4;33177:6;:20;;;:37;;;;:::i;:::-;:50;;;;:::i;:::-;:57;;;;:::i;:::-;33170:64;32756:484;-1:-1:-1;;;;;;32756:484:0:o;12178:177::-;12261:86;12281:5;12311:23;;;12336:2;12340:5;12288:58;;;;;;;;;:::i;14432:761::-;14856:23;14882:69;14910:4;14882:69;;;;;;;;;;;;;;;;;14890:5;-1:-1:-1;;;;;14882:27:0;;;:69;;;;;:::i;:::-;14966:17;;14856:95;;-1:-1:-1;14966:21:0;14962:224;;15108:10;15097:30;;;;;;;;;;;;:::i;:::-;15089:85;;;;-1:-1:-1;;;15089:85:0;;;;;;;:::i;9217:196::-;9320:12;9352:53;9375:6;9383:4;9389:1;9392:12;9352:22;:53::i;:::-;9345:60;9217:196;-1:-1:-1;;;;9217:196:0:o;10594:979::-;10724:12;10757:18;10768:6;10757:10;:18::i;:::-;10749:60;;;;-1:-1:-1;;;10749:60:0;;;;;;;:::i;:::-;10883:12;10897:23;10924:6;-1:-1:-1;;;;;10924:11:0;10944:8;10955:4;10924:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10882:78;;;;10975:7;10971:595;;;11006:10;-1:-1:-1;10999:17:0;;-1:-1:-1;10999:17:0;10971:595;11120:17;;:21;11116:439;;11383:10;11377:17;11444:15;11431:10;11427:2;11423:19;11416:44;11331:148;11526:12;11519:20;;-1:-1:-1;;;11519:20:0;;;;;;;;:::i;6102:619::-;6162:4;6630:20;;6473:66;6670:23;;;;;;:42;;-1:-1:-1;;6697:15:0;;;6662:51;-1:-1:-1;;6102:619:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:175:1;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:404;;;327:3;320:4;312:6;308:17;304:27;294:2;;352:8;342;335:26;294:2;-1:-1:-1;382:20:1;;425:18;414:30;;411:2;;;464:8;454;447:26;411:2;508:4;500:6;496:17;484:29;;571:3;564:4;556;548:6;544:17;536:6;532:30;528:41;525:50;522:2;;;588:1;585;578:12;603:169;672:20;;732:14;721:26;;711:37;;701:2;;762:1;759;752:12;777:198;;889:2;877:9;868:7;864:23;860:32;857:2;;;910:6;902;895:22;857:2;938:31;959:9;938:31;:::i;:::-;928:41;847:128;-1:-1:-1;;;847:128:1:o;980:274::-;;;1109:2;1097:9;1088:7;1084:23;1080:32;1077:2;;;1130:6;1122;1115:22;1077:2;1158:31;1179:9;1158:31;:::i;:::-;1148:41;;1208:40;1244:2;1233:9;1229:18;1208:40;:::i;:::-;1198:50;;1067:187;;;;;:::o;1259:342::-;;;;1405:2;1393:9;1384:7;1380:23;1376:32;1373:2;;;1426:6;1418;1411:22;1373:2;1454:31;1475:9;1454:31;:::i;:::-;1444:41;;1504:40;1540:2;1529:9;1525:18;1504:40;:::i;:::-;1494:50;;1591:2;1580:9;1576:18;1563:32;1553:42;;1363:238;;;;;:::o;1606:417::-;;;;;1768:3;1756:9;1747:7;1743:23;1739:33;1736:2;;;1790:6;1782;1775:22;1736:2;1818:31;1839:9;1818:31;:::i;:::-;1808:41;;1868:40;1904:2;1893:9;1889:18;1868:40;:::i;:::-;1858:50;;1955:2;1944:9;1940:18;1927:32;1917:42;;1978:39;2013:2;2002:9;1998:18;1978:39;:::i;:::-;1968:49;;1726:297;;;;;;;:::o;2028:486::-;;;;;;2207:3;2195:9;2186:7;2182:23;2178:33;2175:2;;;2229:6;2221;2214:22;2175:2;2257:31;2278:9;2257:31;:::i;:::-;2247:41;;2307:40;2343:2;2332:9;2328:18;2307:40;:::i;:::-;2297:50;;2366:39;2401:2;2390:9;2386:18;2366:39;:::i;:::-;2165:349;;;;-1:-1:-1;2356:49:1;;2452:2;2437:18;;2424:32;;-1:-1:-1;2503:3:1;2488:19;2475:33;;2165:349;-1:-1:-1;;2165:349:1:o;2519:266::-;;;2648:2;2636:9;2627:7;2623:23;2619:32;2616:2;;;2669:6;2661;2654:22;2616:2;2697:31;2718:9;2697:31;:::i;:::-;2687:41;2775:2;2760:18;;;;2747:32;;-1:-1:-1;;;2606:179:1:o;2790:411::-;;;;;2953:3;2941:9;2932:7;2928:23;2924:33;2921:2;;;2975:6;2967;2960:22;2921:2;3003:31;3024:9;3003:31;:::i;:::-;2993:41;;3081:2;3070:9;3066:18;3053:32;3043:42;;3104:40;3140:2;3129:9;3125:18;3104:40;:::i;:::-;2911:290;;;;-1:-1:-1;3094:50:1;;3191:2;3176:18;3163:32;;-1:-1:-1;;2911:290:1:o;3206:463::-;;;3353:2;3341:9;3332:7;3328:23;3324:32;3321:2;;;3374:6;3366;3359:22;3321:2;3419:9;3406:23;3452:18;3444:6;3441:30;3438:2;;;3489:6;3481;3474:22;3438:2;3533:76;3601:7;3592:6;3581:9;3577:22;3533:76;:::i;:::-;3628:8;;3507:102;;-1:-1:-1;3311:358:1;-1:-1:-1;;;;3311:358:1:o;3674:1146::-;;;;;;;3925:2;3913:9;3904:7;3900:23;3896:32;3893:2;;;3946:6;3938;3931:22;3893:2;3991:9;3978:23;4020:18;4061:2;4053:6;4050:14;4047:2;;;4082:6;4074;4067:22;4047:2;4126:76;4194:7;4185:6;4174:9;4170:22;4126:76;:::i;:::-;4221:8;;-1:-1:-1;4100:102:1;-1:-1:-1;4309:2:1;4294:18;;4281:32;;-1:-1:-1;4325:16:1;;;4322:2;;;4359:6;4351;4344:22;4322:2;4403:78;4473:7;4462:8;4451:9;4447:24;4403:78;:::i;:::-;4500:8;;-1:-1:-1;4377:104:1;-1:-1:-1;4588:2:1;4573:18;;4560:32;;-1:-1:-1;4604:16:1;;;4601:2;;;4638:6;4630;4623:22;4601:2;;4682:78;4752:7;4741:8;4730:9;4726:24;4682:78;:::i;:::-;3883:937;;;;-1:-1:-1;3883:937:1;;-1:-1:-1;3883:937:1;;4779:8;;3883:937;-1:-1:-1;;;3883:937:1:o;4825:253::-;;4934:2;4922:9;4913:7;4909:23;4905:32;4902:2;;;4955:6;4947;4940:22;4902:2;4999:9;4986:23;5018:30;5042:5;5018:30;:::i;5083:257::-;;5203:2;5191:9;5182:7;5178:23;5174:32;5171:2;;;5224:6;5216;5209:22;5171:2;5261:9;5255:16;5280:30;5304:5;5280:30;:::i;5345:194::-;;5468:2;5456:9;5447:7;5443:23;5439:32;5436:2;;;5489:6;5481;5474:22;5436:2;-1:-1:-1;5517:16:1;;5426:113;-1:-1:-1;5426:113:1:o;5544:293::-;;5665:2;5653:9;5644:7;5640:23;5636:32;5633:2;;;5686:6;5678;5671:22;5633:2;5723:9;5717:16;5773:4;5766:5;5762:16;5755:5;5752:27;5742:2;;5798:6;5790;5783:22;5842:443;;5939:5;5933:12;5966:6;5961:3;5954:19;5992:4;6021:2;6016:3;6012:12;6005:19;;6058:2;6051:5;6047:14;6079:3;6091:169;6105:6;6102:1;6099:13;6091:169;;;6166:13;;6154:26;;6200:12;;;;6235:15;;;;6127:1;6120:9;6091:169;;;-1:-1:-1;6276:3:1;;5909:376;-1:-1:-1;;;;;5909:376:1:o;6290:274::-;;6457:6;6451:13;6473:53;6519:6;6514:3;6507:4;6499:6;6495:17;6473:53;:::i;:::-;6542:16;;;;;6427:137;-1:-1:-1;;6427:137:1:o;6569:203::-;-1:-1:-1;;;;;6733:32:1;;;;6715:51;;6703:2;6688:18;;6670:102::o;6777:375::-;-1:-1:-1;;;;;7035:15:1;;;7017:34;;7087:15;;;;7082:2;7067:18;;7060:43;7134:2;7119:18;;7112:34;;;;6967:2;6952:18;;6934:218::o;7157:274::-;-1:-1:-1;;;;;7349:32:1;;;;7331:51;;7413:2;7398:18;;7391:34;7319:2;7304:18;;7286:145::o;7436:661::-;7607:2;7659:21;;;7729:13;;7632:18;;;7751:22;;;7436:661;;7607:2;7830:15;;;;7804:2;7789:18;;;7436:661;7876:195;7890:6;7887:1;7884:13;7876:195;;;7955:13;;-1:-1:-1;;;;;7951:39:1;7939:52;;8046:15;;;;8011:12;;;;7987:1;7905:9;7876:195;;;-1:-1:-1;8088:3:1;;7587:510;-1:-1:-1;;;;;;7587:510:1:o;8102:267::-;;8281:2;8270:9;8263:21;8301:62;8359:2;8348:9;8344:18;8336:6;8301:62;:::i;8374:187::-;8539:14;;8532:22;8514:41;;8502:2;8487:18;;8469:92::o;8566:383::-;;8715:2;8704:9;8697:21;8747:6;8741:13;8790:6;8785:2;8774:9;8770:18;8763:34;8806:66;8865:6;8860:2;8849:9;8845:18;8840:2;8832:6;8828:15;8806:66;:::i;:::-;8933:2;8912:15;-1:-1:-1;;8908:29:1;8893:45;;;;8940:2;8889:54;;8687:262;-1:-1:-1;;8687:262:1:o;8954:399::-;9156:2;9138:21;;;9195:2;9175:18;;;9168:30;9234:34;9229:2;9214:18;;9207:62;-1:-1:-1;;;9300:2:1;9285:18;;9278:33;9343:3;9328:19;;9128:225::o;9358:402::-;9560:2;9542:21;;;9599:2;9579:18;;;9572:30;9638:34;9633:2;9618:18;;9611:62;-1:-1:-1;;;9704:2:1;9689:18;;9682:36;9750:3;9735:19;;9532:228::o;9765:397::-;9967:2;9949:21;;;10006:2;9986:18;;;9979:30;10045:34;10040:2;10025:18;;10018:62;-1:-1:-1;;;10111:2:1;10096:18;;10089:31;10152:3;10137:19;;9939:223::o;10167:398::-;10369:2;10351:21;;;10408:2;10388:18;;;10381:30;10447:34;10442:2;10427:18;;10420:62;-1:-1:-1;;;10513:2:1;10498:18;;10491:32;10555:3;10540:19;;10341:224::o;10570:344::-;10772:2;10754:21;;;10811:2;10791:18;;;10784:30;-1:-1:-1;;;10845:2:1;10830:18;;10823:50;10905:2;10890:18;;10744:170::o;10919:356::-;11121:2;11103:21;;;11140:18;;;11133:30;11199:34;11194:2;11179:18;;11172:62;11266:2;11251:18;;11093:182::o;11280:398::-;11482:2;11464:21;;;11521:2;11501:18;;;11494:30;11560:34;11555:2;11540:18;;11533:62;-1:-1:-1;;;11626:2:1;11611:18;;11604:32;11668:3;11653:19;;11454:224::o;11683:421::-;11885:2;11867:21;;;11924:2;11904:18;;;11897:30;11963:34;11958:2;11943:18;;11936:62;12034:27;12029:2;12014:18;;12007:55;12094:3;12079:19;;11857:247::o;12109:399::-;12311:2;12293:21;;;12350:2;12330:18;;;12323:30;12389:34;12384:2;12369:18;;12362:62;-1:-1:-1;;;12455:2:1;12440:18;;12433:33;12498:3;12483:19;;12283:225::o;12513:356::-;12715:2;12697:21;;;12734:18;;;12727:30;12793:34;12788:2;12773:18;;12766:62;12860:2;12845:18;;12687:182::o;12874:401::-;13076:2;13058:21;;;13115:2;13095:18;;;13088:30;13154:34;13149:2;13134:18;;13127:62;-1:-1:-1;;;13220:2:1;13205:18;;13198:35;13265:3;13250:19;;13048:227::o;13280:356::-;13482:2;13464:21;;;13501:18;;;13494:30;13560:34;13555:2;13540:18;;13533:62;13627:2;13612:18;;13454:182::o;13641:347::-;13843:2;13825:21;;;13882:2;13862:18;;;13855:30;13921:25;13916:2;13901:18;;13894:53;13979:2;13964:18;;13815:173::o;13993:348::-;14195:2;14177:21;;;14234:2;14214:18;;;14207:30;14273:26;14268:2;14253:18;;14246:54;14332:2;14317:18;;14167:174::o;14346:404::-;14548:2;14530:21;;;14587:2;14567:18;;;14560:30;14626:34;14621:2;14606:18;;14599:62;-1:-1:-1;;;14692:2:1;14677:18;;14670:38;14740:3;14725:19;;14520:230::o;14755:353::-;14957:2;14939:21;;;14996:2;14976:18;;;14969:30;15035:31;15030:2;15015:18;;15008:59;15099:2;15084:18;;14929:179::o;15113:399::-;15315:2;15297:21;;;15354:2;15334:18;;;15327:30;15393:34;15388:2;15373:18;;15366:62;-1:-1:-1;;;15459:2:1;15444:18;;15437:33;15502:3;15487:19;;15287:225::o;15517:406::-;15719:2;15701:21;;;15758:2;15738:18;;;15731:30;15797:34;15792:2;15777:18;;15770:62;-1:-1:-1;;;15863:2:1;15848:18;;15841:40;15913:3;15898:19;;15691:232::o;15928:408::-;16130:2;16112:21;;;16169:2;16149:18;;;16142:30;16208:34;16203:2;16188:18;;16181:62;-1:-1:-1;;;16274:2:1;16259:18;;16252:42;16326:3;16311:19;;16102:234::o;16341:355::-;16543:2;16525:21;;;16582:2;16562:18;;;16555:30;16621:33;16616:2;16601:18;;16594:61;16687:2;16672:18;;16515:181::o;16701:1301::-;;16864:2;16893;16882:9;16875:21;16915:2;16955;16944:9;16940:18;16993:6;16987:13;17019:4;17059:2;17054;17043:9;17039:18;17032:30;17082:6;17117:12;17111:19;17154:6;17146;17139:22;17180:3;17170:13;;17214:2;17203:9;17199:18;17192:25;;17258:2;17244:12;17240:21;17226:35;;17279:4;17292:625;17306:6;17303:1;17300:13;17292:625;;;17365:13;;17407:9;;-1:-1:-1;;;;;17403:35:1;17391:48;;17480:11;;;17474:18;17515:14;17563:23;;;17549:12;;;17542:45;17631:11;;;17625:18;17621:27;17607:12;;;17600:49;17689:11;;;17683:18;17669:12;;;17662:40;17742:11;;;17736:18;17722:12;;;17715:40;17426:3;17822:11;;;17816:18;17802:12;;;17795:40;17892:15;;;;17864:4;17855:14;;;;17435:1;17321:9;17292:625;;;-1:-1:-1;;17959:15:1;;;;17953:22;17933:18;;;;17926:50;;;;-1:-1:-1;17959:15:1;17993:3;-1:-1:-1;;;16844:1158:1:o;18007:611::-;;18256:2;18245:9;18238:21;18301:6;18295:13;18290:2;18279:9;18275:18;18268:41;18356:4;18348:6;18344:17;18338:24;18398:2;18393;18382:9;18378:18;18371:30;18421:69;18485:3;18474:9;18470:19;18456:12;18421:69;:::i;:::-;18410:80;;18537:9;18532:3;18528:19;18521:4;18510:9;18506:20;18499:49;18565:47;18608:3;18600:6;18565:47;:::i;:::-;18557:55;18228:390;-1:-1:-1;;;;;18228:390:1:o;18623:177::-;18769:25;;;18757:2;18742:18;;18724:76::o;18805:128::-;;18876:1;18872:6;18869:1;18866:13;18863:2;;;18882:18;;:::i;:::-;-1:-1:-1;18918:9:1;;18853:80::o;18938:217::-;;19004:1;18994:2;;-1:-1:-1;;;19029:31:1;;19083:4;19080:1;19073:15;19111:4;19036:1;19101:15;18994:2;-1:-1:-1;19140:9:1;;18984:171::o;19160:168::-;;19266:1;19262;19258:6;19254:14;19251:1;19248:21;19243:1;19236:9;19229:17;19225:45;19222:2;;;19273:18;;:::i;:::-;-1:-1:-1;19313:9:1;;19212:116::o;19333:125::-;;19401:1;19398;19395:8;19392:2;;;19406:18;;:::i;:::-;-1:-1:-1;19443:9:1;;19382:76::o;19463:258::-;19535:1;19545:113;19559:6;19556:1;19553:13;19545:113;;;19635:11;;;19629:18;19616:11;;;19609:39;19581:2;19574:10;19545:113;;;19676:6;19673:1;19670:13;19667:2;;;-1:-1:-1;;19711:1:1;19693:16;;19686:27;19516:205::o;19726:135::-;;-1:-1:-1;;19786:17:1;;19783:2;;;19806:18;;:::i;:::-;-1:-1:-1;19853:1:1;19842:13;;19773:88::o;19866:127::-;19927:10;19922:3;19918:20;19915:1;19908:31;19958:4;19955:1;19948:15;19982:4;19979:1;19972:15;19998:120;20086:5;20079:13;20072:21;20065:5;20062:32;20052:2;;20108:1;20105;20098:12

Swarm Source

ipfs://d0a22542c34abc2f3422f5a3b9b9552342772b1c6669d52607c8083eaefe9881

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.