ETH Price: $1,984.03 (+1.68%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Initialize152832312022-08-05 15:51:171286 days ago1659714677IN
0xB82FB729...D3DA971B0
0 ETH0.0008276317.72017517

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Bank

Compiler Version
v0.5.14+commit.01f1aaa4

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU LGPLv2.1 license
/**
 *Submitted for verification at Etherscan.io on 2022-08-05
*/

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.5.14;

interface IGlobalConfig {
    function constants() external view returns (address);
    function tokenInfoRegistry() external view returns (ITokenRegistry);
    function chainLink() external view returns (address);
    function bank() external view returns (IBank);
    function savingAccount() external view returns (ISavingAccount);
    function accounts() external view returns (IAccounts);
    function maxReserveRatio() external view returns (uint256);
    function midReserveRatio() external view returns (uint256);
    function minReserveRatio() external view returns (uint256);
    function rateCurveSlope() external view returns (uint256);
    function rateCurveConstant() external view returns (uint256);
    function compoundSupplyRateWeights() external view returns (uint256);
    function compoundBorrowRateWeights() external view returns (uint256);
    function deFinerCommunityFund() external view returns (address);
    function deFinerRate() external view returns (uint256);
    function liquidationThreshold() external view returns (uint);
    function liquidationDiscountRatio() external view returns (uint);
    function owner() external view returns (address);
}

interface ITokenRegistry {
    function getTokenDecimals(address) external view returns (uint8);
    function getCToken(address) external view returns (address);
    function depositeMiningSpeeds(address) external view returns (uint256);
    function borrowMiningSpeeds(address) external view returns (uint256);
    function isSupportedOnCompound(address) external view returns (bool);
    function getTokens() external view returns (address[] memory);
    function getTokenInfoFromAddress(address _token) external view returns (uint8, uint256, uint256, uint256);
    function getTokenInfoFromIndex(uint index) external view returns (address, uint256, uint256, uint256);
    function getTokenIndex(address _token) external view returns (uint8);
    function addressFromIndex(uint index) external view returns(address);
    function isTokenExist(address _token) external view returns (bool isExist);
    function isTokenEnabled(address _token) external view returns (bool);
}

interface IAccounts {
    function deposit(address, address, uint256) external;
    function borrow(address, address, uint256) external;
    function getBorrowPrincipal(address, address) external view returns (uint256);
    function withdraw(address, address, uint256) external returns (uint256);
    function repay(address, address, uint256) external returns (uint256);
}

interface ISavingAccount {
    function toCompound(address, uint256) external;
    function fromCompound(address, uint256) external;
}

interface IBank {
    function newRateIndexCheckpoint(address) external;
    function deposit(address _to, address _token, uint256 _amount) external;
    function withdraw(address _from, address _token, uint256 _amount) external returns(uint);
    function borrow(address _from, address _token, uint256 _amount) external;
    function repay(address _to, address _token, uint256 _amount) external returns(uint);
    function getDepositAccruedRate(address _token, uint _depositRateRecordStart) external view returns (uint256);
    function getBorrowAccruedRate(address _token, uint _borrowRateRecordStart) external view returns (uint256);
    function depositeRateIndex(address _token, uint _blockNum) external view returns (uint);
    function borrowRateIndex(address _token, uint _blockNum) external view returns (uint);
    function depositeRateIndexNow(address _token) external view returns(uint);
    function borrowRateIndexNow(address _token) external view returns(uint);
    function updateMining(address _token) external;
    function updateDepositFINIndex(address _token) external;
    function updateBorrowFINIndex(address _token) external;
    function depositFINRateIndex(address, uint) external view returns (uint);
    function borrowFINRateIndex(address, uint) external view returns (uint);
}

interface ICToken {
    function supplyRatePerBlock() external view returns (uint);
    function borrowRatePerBlock() external view returns (uint);
    function mint(uint mintAmount) external returns (uint);
    function redeemUnderlying(uint redeemAmount) external returns (uint);
    function redeem(uint redeemAmount) external returns (uint);
    function exchangeRateStore() external view returns (uint);
    function exchangeRateCurrent() external returns (uint);
    function balanceOf(address owner) external view returns (uint256);
    function balanceOfUnderlying(address owner) external returns (uint);
}

interface ICETH{
    function mint() external payable;
}

interface IController {
    function fastForward(uint blocks) external returns (uint);
    function getBlockNumber() external view returns (uint);
}


/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


contract Constant {
    enum ActionType { DepositAction, WithdrawAction, BorrowAction, RepayAction, LiquidateRepayAction }
    address public constant ETH_ADDR = 0x000000000000000000000000000000000000000E;
    uint256 public constant INT_UNIT = 10 ** uint256(18);
    uint256 public constant ACCURACY = 10 ** 18;
    // OKExChain blocks per year as per 3 sec per block
    uint256 public constant BLOCKS_PER_YEAR = 2102400;
}


/**
 * @title Initializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 */
contract Initializable {

  /**
   * @dev Indicates that the contract has been initialized.
   */
  bool private initialized;

  /**
   * @dev Indicates that the contract is in the process of being initialized.
   */
  bool private initializing;

  /**
   * @dev Modifier to use in the initializer function of a contract.
   */
  modifier initializer() {
    require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  /// @dev Returns true if and only if the function is running in the constructor
  function isConstructor() private view returns (bool) {
    // extcodesize checks the size of the code stored in an address, and
    // address returns the current address. Since the code is still not
    // deployed when running a constructor, any checks on its code size will
    // yield zero, making it an effective way to detect if a contract is
    // under construction or not.
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  // Reserved storage space to allow for layout changes in the future.
  uint256[50] private ______gap;
}


contract Bank is Constant, Initializable{
    using SafeMath for uint256;

    mapping(address => uint256) public totalLoans;     // amount of lended tokens
    mapping(address => uint256) public totalReserve;   // amount of tokens in reservation
    mapping(address => uint256) public totalCompound;  // amount of tokens in compound
    // Token => block-num => rate
    mapping(address => mapping(uint => uint)) public depositeRateIndex; // the index curve of deposit rate
    // Token => block-num => rate
    mapping(address => mapping(uint => uint)) public borrowRateIndex;   // the index curve of borrow rate
    // token address => block number
    mapping(address => uint) public lastCheckpoint;            // last checkpoint on the index curve
    // cToken address => rate
    mapping(address => uint) public lastCTokenExchangeRate;    // last compound cToken exchange rate
    mapping(address => ThirdPartyPool) compoundPool;    // the compound pool

    IGlobalConfig globalConfig;            // global configuration contract address

    mapping(address => mapping(uint => uint)) public depositFINRateIndex;
    mapping(address => mapping(uint => uint)) public borrowFINRateIndex;
    mapping(address => uint) public lastDepositFINRateCheckpoint;
    mapping(address => uint) public lastBorrowFINRateCheckpoint;

    modifier onlyAuthorized() {
        require(msg.sender == address(globalConfig.savingAccount()) || msg.sender == address(globalConfig.accounts()),
            "Only authorized to call from DeFiner internal contracts.");
        _;
    }

    struct ThirdPartyPool {
        bool supported;             // if the token is supported by the third party platforms such as Compound
        uint capitalRatio;          // the ratio of the capital in third party to the total asset
        uint depositRatePerBlock;   // the deposit rate of the token in third party
        uint borrowRatePerBlock;    // the borrow rate of the token in third party
    }

    event UpdateIndex(address indexed token, uint256 depositeRateIndex, uint256 borrowRateIndex);
    event UpdateDepositFINIndex(address indexed _token, uint256 depositFINRateIndex);
    event UpdateBorrowFINIndex(address indexed _token, uint256 borrowFINRateIndex);

    /**
     * Initialize the Bank
     * @param _globalConfig the global configuration contract
     */
    function initialize(
        IGlobalConfig _globalConfig
    ) public initializer {
        globalConfig = _globalConfig;
    }

    /**
     * Total amount of the token in Saving account
     * @param _token token address
     */
    function getTotalDepositStore(address _token) public view returns(uint) {
        address cToken = globalConfig.tokenInfoRegistry().getCToken(_token);
        // totalLoans[_token] = U   totalReserve[_token] = R
        return totalCompound[cToken].add(totalLoans[_token]).add(totalReserve[_token]); // return totalAmount = C + U + R
    }

    /**
     * Update total amount of token in Compound as the cToken price changed
     * @param _token token address
     */
    function updateTotalCompound(address _token) internal {
        address cToken = globalConfig.tokenInfoRegistry().getCToken(_token);
        if(cToken != address(0)) {
            totalCompound[cToken] = ICToken(cToken).balanceOfUnderlying(address(globalConfig.savingAccount()));
        }
    }

    /**
     * Update the total reservation. Before run this function, make sure that totalCompound has been updated
     * by calling updateTotalCompound. Otherwise, totalCompound may not equal to the exact amount of the
     * token in Compound.
     * @param _token token address
     * @param _action indicate if user's operation is deposit or withdraw, and borrow or repay.
     * @return the actuall amount deposit/withdraw from the saving pool
     */
    function updateTotalReserve(address _token, uint _amount, ActionType _action) internal returns(uint256 compoundAmount){
        address cToken = globalConfig.tokenInfoRegistry().getCToken(_token);
        uint totalAmount = getTotalDepositStore(_token);
        if (_action == ActionType.DepositAction || _action == ActionType.RepayAction) {
            // Total amount of token after deposit or repay
            if (_action == ActionType.DepositAction)
                totalAmount = totalAmount.add(_amount);
            else
                totalLoans[_token] = totalLoans[_token].sub(_amount);

            // Expected total amount of token in reservation after deposit or repay
            uint totalReserveBeforeAdjust = totalReserve[_token].add(_amount);

            if (cToken != address(0) &&
            totalReserveBeforeAdjust > totalAmount.mul(globalConfig.maxReserveRatio()).div(100)) {
                uint toCompoundAmount = totalReserveBeforeAdjust.sub(totalAmount.mul(globalConfig.midReserveRatio()).div(100));
                //toCompound(_token, toCompoundAmount);
                compoundAmount = toCompoundAmount;
                totalCompound[cToken] = totalCompound[cToken].add(toCompoundAmount);
                totalReserve[_token] = totalReserve[_token].add(_amount).sub(toCompoundAmount);
            }
            else {
                totalReserve[_token] = totalReserve[_token].add(_amount);
            }
        } else if(_action == ActionType.LiquidateRepayAction) {
            // When liquidation is called the `totalLoans` amount should be reduced.
            // We dont need to update other variables as all the amounts are adjusted internally,
            // hence does not require updation of `totalReserve` / `totalCompound`
            totalLoans[_token] = totalLoans[_token].sub(_amount);
        } else {
            // The lack of liquidity exception happens when the pool doesn't have enough tokens for borrow/withdraw
            // It happens when part of the token has lended to the other accounts.
            // However in case of withdrawAll, even if the token has no loan, this requirment may still false because
            // of the precision loss in the rate calcuation. So we put a logic here to deal with this case: in case
            // of withdrawAll and there is no loans for the token, we just adjust the balance in bank contract to the
            // to the balance of that individual account.
            if(_action == ActionType.WithdrawAction) {
                if(totalLoans[_token] != 0)
                    require(getPoolAmount(_token) >= _amount, "Lack of liquidity when withdraw.");
                else if (getPoolAmount(_token) < _amount)
                    totalReserve[_token] = _amount.sub(totalCompound[cToken]);
                totalAmount = getTotalDepositStore(_token);
            }
            else
                require(getPoolAmount(_token) >= _amount, "Lack of liquidity when borrow.");

            // Total amount of token after withdraw or borrow
            if (_action == ActionType.WithdrawAction)
                totalAmount = totalAmount.sub(_amount);
            else
                totalLoans[_token] = totalLoans[_token].add(_amount);

            // Expected total amount of token in reservation after deposit or repay
            uint totalReserveBeforeAdjust = totalReserve[_token] > _amount ? totalReserve[_token].sub(_amount) : 0;

            // Trigger fromCompound if the new reservation ratio is less than 10%
            if(cToken != address(0) &&
            (totalAmount == 0 || totalReserveBeforeAdjust < totalAmount.mul(globalConfig.minReserveRatio()).div(100))) {

                uint totalAvailable = totalReserve[_token].add(totalCompound[cToken]).sub(_amount);
                if (totalAvailable < totalAmount.mul(globalConfig.midReserveRatio()).div(100)){
                    // Withdraw all the tokens from Compound
                    compoundAmount = totalCompound[cToken];
                    totalCompound[cToken] = 0;
                    totalReserve[_token] = totalAvailable;
                } else {
                    // Withdraw partial tokens from Compound
                    uint totalInCompound = totalAvailable.sub(totalAmount.mul(globalConfig.midReserveRatio()).div(100));
                    compoundAmount = totalCompound[cToken].sub(totalInCompound);
                    totalCompound[cToken] = totalInCompound;
                    totalReserve[_token] = totalAvailable.sub(totalInCompound);
                }
            }
            else {
                totalReserve[_token] = totalReserve[_token].sub(_amount);
            }
        }
        return compoundAmount;
    }

     function update(address _token, uint _amount, ActionType _action) public onlyAuthorized returns(uint256 compoundAmount) {
        updateTotalCompound(_token);
        // updateTotalLoan(_token);
        compoundAmount = updateTotalReserve(_token, _amount, _action);
        return compoundAmount;
    }

    /**
     * The function is called in Bank.deposit(), Bank.withdraw() and Accounts.claim() functions.
     * The function should be called AFTER the newRateIndexCheckpoint function so that the account balances are
     * accurate, and BEFORE the account balance acutally updated due to deposit/withdraw activities.
     */
    function updateDepositFINIndex(address _token) public onlyAuthorized{
        uint currentBlock = getBlockNumber();
        uint deltaBlock;
        // If it is the first deposit FIN rate checkpoint, set the deltaBlock value be 0 so that the first
        // point on depositFINRateIndex is zero.
        deltaBlock = lastDepositFINRateCheckpoint[_token] == 0 ? 0 : currentBlock.sub(lastDepositFINRateCheckpoint[_token]);
        // If the totalDeposit of the token is zero, no FIN token should be mined and the FINRateIndex is unchanged.
        depositFINRateIndex[_token][currentBlock] = depositFINRateIndex[_token][lastDepositFINRateCheckpoint[_token]].add(
            getTotalDepositStore(_token) == 0 ? 0 : depositeRateIndex[_token][lastCheckpoint[_token]]
                .mul(deltaBlock)
                .mul(globalConfig.tokenInfoRegistry().depositeMiningSpeeds(_token))
                .div(getTotalDepositStore(_token)));
        lastDepositFINRateCheckpoint[_token] = currentBlock;

        emit UpdateDepositFINIndex(_token, depositFINRateIndex[_token][currentBlock]);
    }

    function updateBorrowFINIndex(address _token) public onlyAuthorized{
        uint currentBlock = getBlockNumber();
        uint deltaBlock;
        // If it is the first borrow FIN rate checkpoint, set the deltaBlock value be 0 so that the first
        // point on borrowFINRateIndex is zero.
        deltaBlock = lastBorrowFINRateCheckpoint[_token] == 0 ? 0 : currentBlock.sub(lastBorrowFINRateCheckpoint[_token]);
        // If the totalBorrow of the token is zero, no FIN token should be mined and the FINRateIndex is unchanged.
        borrowFINRateIndex[_token][currentBlock] = borrowFINRateIndex[_token][lastBorrowFINRateCheckpoint[_token]].add(
            totalLoans[_token] == 0 ? 0 : borrowRateIndex[_token][lastCheckpoint[_token]]
                    .mul(deltaBlock)
                    .mul(globalConfig.tokenInfoRegistry().borrowMiningSpeeds(_token))
                    .div(totalLoans[_token]));
        lastBorrowFINRateCheckpoint[_token] = currentBlock;

        emit UpdateBorrowFINIndex(_token, borrowFINRateIndex[_token][currentBlock]);
    }

    function updateMining(address _token) public onlyAuthorized{
        newRateIndexCheckpoint(_token);
        updateTotalCompound(_token);
    }

    /**
     * Get the borrowing interest rate.
     * @param _token token address
     * @return the borrow rate for the current block
     */
    function getBorrowRatePerBlock(address _token) public view returns(uint) {
        uint256 capitalUtilizationRatio = getCapitalUtilizationRatio(_token);
        // rateCurveConstant = <'3 * (10)^16'_rateCurveConstant_configurable>
        uint256 rateCurveConstant = globalConfig.rateCurveConstant();
        // compoundSupply = Compound Supply Rate * <'0.4'_supplyRateWeights_configurable>
        uint256 compoundSupply = compoundPool[_token].depositRatePerBlock.mul(globalConfig.compoundSupplyRateWeights());
        // compoundBorrow = Compound Borrow Rate * <'0.6'_borrowRateWeights_configurable>
        uint256 compoundBorrow = compoundPool[_token].borrowRatePerBlock.mul(globalConfig.compoundBorrowRateWeights());
        // nonUtilizedCapRatio = (1 - U) // Non utilized capital ratio
        uint256 nonUtilizedCapRatio = INT_UNIT.sub(capitalUtilizationRatio);

        bool isSupportedOnCompound = globalConfig.tokenInfoRegistry().isSupportedOnCompound(_token);
        if(isSupportedOnCompound) {
            uint256 compoundSupplyPlusBorrow = compoundSupply.add(compoundBorrow).div(10);
            uint256 rateConstant;
            // if the token is supported in third party (like Compound), check if U = 1
            if(capitalUtilizationRatio > ((10**18) - (2 * 10**16))) { // > 0.98
                // if U = 1, borrowing rate = compoundSupply + compoundBorrow + ((rateCurveConstant * 100) / BLOCKS_PER_YEAR)
                rateConstant = rateCurveConstant.mul(50).div(BLOCKS_PER_YEAR);
                return compoundSupplyPlusBorrow.add(rateConstant);
            } else {
                // if U != 1, borrowing rate = compoundSupply + compoundBorrow + ((rateCurveConstant / (1 - U)) / BLOCKS_PER_YEAR)
                rateConstant = rateCurveConstant.mul(10**18).div(nonUtilizedCapRatio).div(BLOCKS_PER_YEAR);
                return compoundSupplyPlusBorrow.add(rateConstant);
            }
        } else {
            // If the token is NOT supported by the third party, check if U = 1
            if(capitalUtilizationRatio > ((10**18) - (2 * 10**16))) { // > 0.98
                // if U = 1, borrowing rate = rateCurveConstant * 100
                return rateCurveConstant.mul(50).div(BLOCKS_PER_YEAR);
            } else {
                // if 0 < U < 1, borrowing rate = 3% / (1 - U)
                return rateCurveConstant.mul(10**18).div(nonUtilizedCapRatio).div(BLOCKS_PER_YEAR);
            }
        }
    }

    /**
    * Get Deposit Rate.  Deposit APR = (Borrow APR * Utilization Rate (U) +  Compound Supply Rate *
    * Capital Compound Ratio (C) )* (1- DeFiner Community Fund Ratio (D)). The scaling is 10 ** 18
    * @param _token token address
    * @return deposite rate of blocks before the current block
    */
    function getDepositRatePerBlock(address _token) public view returns(uint) {
        uint256 borrowRatePerBlock = getBorrowRatePerBlock(_token);
        uint256 capitalUtilRatio = getCapitalUtilizationRatio(_token);
        if(!globalConfig.tokenInfoRegistry().isSupportedOnCompound(_token))
            return borrowRatePerBlock.mul(capitalUtilRatio).div(INT_UNIT);

        return borrowRatePerBlock.mul(capitalUtilRatio).add(compoundPool[_token].depositRatePerBlock
            .mul(compoundPool[_token].capitalRatio)).div(INT_UNIT);
    }

    /**
     * Get capital utilization. Capital Utilization Rate (U )= total loan outstanding / Total market deposit
     * @param _token token address
     * @return Capital utilization ratio `U`.
     *  Valid range: 0 ≤ U ≤ 10^18
     */
    function getCapitalUtilizationRatio(address _token) public view returns(uint) {
        uint256 totalDepositsNow = getTotalDepositStore(_token);
        if(totalDepositsNow == 0) {
            return 0;
        } else {
            return totalLoans[_token].mul(INT_UNIT).div(totalDepositsNow);
        }
    }

    /**
     * Ratio of the capital in Compound
     * @param _token token address
     */
    function getCapitalCompoundRatio(address _token) public view returns(uint) {
        address cToken = globalConfig.tokenInfoRegistry().getCToken(_token);
        if(totalCompound[cToken] == 0 ) {
            return 0;
        } else {
            return uint(totalCompound[cToken].mul(INT_UNIT).div(getTotalDepositStore(_token)));
        }
    }

    /**
     * It's a utility function. Get the cummulative deposit rate in a block interval ending in current block
     * @param _token token address
     * @param _depositRateRecordStart the start block of the interval
     * @dev This function should always be called after current block is set as a new rateIndex point.
     */
    function getDepositAccruedRate(address _token, uint _depositRateRecordStart) external view returns (uint256) {
        uint256 depositRate = depositeRateIndex[_token][_depositRateRecordStart];
        require(depositRate != 0, "_depositRateRecordStart is not a check point on index curve.");
        return depositeRateIndexNow(_token).mul(INT_UNIT).div(depositRate);
    }

    /**
     * Get the cummulative borrow rate in a block interval ending in current block
     * @param _token token address
     * @param _borrowRateRecordStart the start block of the interval
     * @dev This function should always be called after current block is set as a new rateIndex point.
     */
    function getBorrowAccruedRate(address _token, uint _borrowRateRecordStart) external view returns (uint256) {
        uint256 borrowRate = borrowRateIndex[_token][_borrowRateRecordStart];
        require(borrowRate != 0, "_borrowRateRecordStart is not a check point on index curve.");
        return borrowRateIndexNow(_token).mul(INT_UNIT).div(borrowRate);
    }

    /**
     * Set a new rate index checkpoint.
     * @param _token token address
     * @dev The rate set at the checkpoint is the rate from the last checkpoint to this checkpoint
     */
    function newRateIndexCheckpoint(address _token) public onlyAuthorized {

        // return if the rate check point already exists
        uint blockNumber = getBlockNumber();
        if (blockNumber == lastCheckpoint[_token])
            return;

        uint256 UNIT = INT_UNIT;
        address cToken = globalConfig.tokenInfoRegistry().getCToken(_token);

        // If it is the first check point, initialize the rate index
        uint256 previousCheckpoint = lastCheckpoint[_token];
        if (lastCheckpoint[_token] == 0) {
            if(cToken == address(0)) {
                compoundPool[_token].supported = false;
                borrowRateIndex[_token][blockNumber] = UNIT;
                depositeRateIndex[_token][blockNumber] = UNIT;
                // Update the last checkpoint
                lastCheckpoint[_token] = blockNumber;
            }
            else {
                compoundPool[_token].supported = true;
                uint cTokenExchangeRate = ICToken(cToken).exchangeRateCurrent();
                // Get the curretn cToken exchange rate in Compound, which is need to calculate DeFiner's rate
                compoundPool[_token].capitalRatio = getCapitalCompoundRatio(_token);
                compoundPool[_token].borrowRatePerBlock = ICToken(cToken).borrowRatePerBlock();  // initial value
                compoundPool[_token].depositRatePerBlock = ICToken(cToken).supplyRatePerBlock(); // initial value
                borrowRateIndex[_token][blockNumber] = UNIT;
                depositeRateIndex[_token][blockNumber] = UNIT;
                // Update the last checkpoint
                lastCheckpoint[_token] = blockNumber;
                lastCTokenExchangeRate[cToken] = cTokenExchangeRate;
            }

        } else {
            if(cToken == address(0)) {
                compoundPool[_token].supported = false;
                borrowRateIndex[_token][blockNumber] = borrowRateIndexNow(_token);
                depositeRateIndex[_token][blockNumber] = depositeRateIndexNow(_token);
                // Update the last checkpoint
                lastCheckpoint[_token] = blockNumber;
            } else {
                compoundPool[_token].supported = true;
                uint cTokenExchangeRate = ICToken(cToken).exchangeRateCurrent();
                // Get the curretn cToken exchange rate in Compound, which is need to calculate DeFiner's rate
                compoundPool[_token].capitalRatio = getCapitalCompoundRatio(_token);
                compoundPool[_token].borrowRatePerBlock = ICToken(cToken).borrowRatePerBlock();
                compoundPool[_token].depositRatePerBlock = cTokenExchangeRate.mul(UNIT).div(lastCTokenExchangeRate[cToken])
                    .sub(UNIT).div(blockNumber.sub(lastCheckpoint[_token]));
                borrowRateIndex[_token][blockNumber] = borrowRateIndexNow(_token);
                depositeRateIndex[_token][blockNumber] = depositeRateIndexNow(_token);
                // Update the last checkpoint
                lastCheckpoint[_token] = blockNumber;
                lastCTokenExchangeRate[cToken] = cTokenExchangeRate;
            }
        }

        // Update the total loan
        if(borrowRateIndex[_token][blockNumber] != UNIT) {
            totalLoans[_token] = totalLoans[_token].mul(borrowRateIndex[_token][blockNumber])
                .div(borrowRateIndex[_token][previousCheckpoint]);
        }

        emit UpdateIndex(_token, depositeRateIndex[_token][getBlockNumber()], borrowRateIndex[_token][getBlockNumber()]);
    }

    /**
     * Calculate a token deposite rate of current block
     * @param _token token address
     * @dev This is an looking forward estimation from last checkpoint and not the exactly rate that the user will pay or earn.
     */
    function depositeRateIndexNow(address _token) public view returns(uint) {
        uint256 lcp = lastCheckpoint[_token];
        // If this is the first checkpoint, set the index be 1.
        if(lcp == 0)
            return INT_UNIT;

        uint256 lastDepositeRateIndex = depositeRateIndex[_token][lcp];
        uint256 depositRatePerBlock = getDepositRatePerBlock(_token);
        // newIndex = oldIndex*(1+r*delta_block). If delta_block = 0, i.e. the last checkpoint is current block, index doesn't change.
        return lastDepositeRateIndex.mul(getBlockNumber().sub(lcp).mul(depositRatePerBlock).add(INT_UNIT)).div(INT_UNIT);
    }

    /**
     * Calculate a token borrow rate of current block
     * @param _token token address
     */
    function borrowRateIndexNow(address _token) public view returns(uint) {
        uint256 lcp = lastCheckpoint[_token];
        // If this is the first checkpoint, set the index be 1.
        if(lcp == 0)
            return INT_UNIT;
        uint256 lastBorrowRateIndex = borrowRateIndex[_token][lcp];
        uint256 borrowRatePerBlock = getBorrowRatePerBlock(_token);
        return lastBorrowRateIndex.mul(getBlockNumber().sub(lcp).mul(borrowRatePerBlock).add(INT_UNIT)).div(INT_UNIT);
    }

    /**
	 * Get the state of the given token
     * @param _token token address
	 */
    function getTokenState(address _token) public view returns (uint256 deposits, uint256 loans, uint256 reserveBalance, uint256 remainingAssets){
        return (
        getTotalDepositStore(_token),
        totalLoans[_token],
        totalReserve[_token],
        totalReserve[_token].add(totalCompound[globalConfig.tokenInfoRegistry().getCToken(_token)])
        );
    }

    function getPoolAmount(address _token) public view returns(uint) {
        return totalReserve[_token].add(totalCompound[globalConfig.tokenInfoRegistry().getCToken(_token)]);
    }

    function deposit(address _to, address _token, uint256 _amount) external onlyAuthorized {

        require(_amount != 0, "Amount is zero");

        // Add a new checkpoint on the index curve.
        newRateIndexCheckpoint(_token);
        updateDepositFINIndex(_token);

        // Update tokenInfo. Add the _amount to principal, and update the last deposit block in tokenInfo
        globalConfig.accounts().deposit(_to, _token, _amount);

        // Update the amount of tokens in compound and loans, i.e. derive the new values
        // of C (Compound Ratio) and U (Utilization Ratio).
        uint compoundAmount = update(_token, _amount, ActionType.DepositAction);

        if(compoundAmount > 0) {
            globalConfig.savingAccount().toCompound(_token, compoundAmount);
        }
    }

    function borrow(address _from, address _token, uint256 _amount) external onlyAuthorized {

        // Add a new checkpoint on the index curve.
        newRateIndexCheckpoint(_token);
        updateBorrowFINIndex(_token);

        // Update tokenInfo for the user
        globalConfig.accounts().borrow(_from, _token, _amount);

        // Update pool balance
        // Update the amount of tokens in compound and loans, i.e. derive the new values
        // of C (Compound Ratio) and U (Utilization Ratio).
        uint compoundAmount = update(_token, _amount, ActionType.BorrowAction);

        if(compoundAmount > 0) {
            globalConfig.savingAccount().fromCompound(_token, compoundAmount);
        }
    }

    function repay(address _to, address _token, uint256 _amount) external onlyAuthorized returns(uint) {

        // Add a new checkpoint on the index curve.
        newRateIndexCheckpoint(_token);
        updateBorrowFINIndex(_token);

        // Sanity check
        require(globalConfig.accounts().getBorrowPrincipal(_to, _token) > 0,
            "Token BorrowPrincipal must be greater than 0. To deposit balance, please use deposit button."
        );

        // Update tokenInfo
        uint256 remain = globalConfig.accounts().repay(_to, _token, _amount);

        // Update the amount of tokens in compound and loans, i.e. derive the new values
        // of C (Compound Ratio) and U (Utilization Ratio).
        uint compoundAmount = update(_token, _amount.sub(remain), ActionType.RepayAction);
        if(compoundAmount > 0) {
           globalConfig.savingAccount().toCompound(_token, compoundAmount);
        }

        // Return actual amount repaid
        return _amount.sub(remain);
    }

    /**
     * Withdraw a token from an address
     * @param _from address to be withdrawn from
     * @param _token token address
     * @param _amount amount to be withdrawn
     * @return The actually amount withdrawed, which will be the amount requested minus the commission fee.
     */
    function withdraw(address _from, address _token, uint256 _amount) external onlyAuthorized returns(uint) {

        require(_amount != 0, "Amount is zero");

        // Add a new checkpoint on the index curve.
        newRateIndexCheckpoint(_token);
        updateDepositFINIndex(_token);

        // Withdraw from the account
        uint amount = globalConfig.accounts().withdraw(_from, _token, _amount);

        // Update pool balance
        // Update the amount of tokens in compound and loans, i.e. derive the new values
        // of C (Compound Ratio) and U (Utilization Ratio).
        uint compoundAmount = update(_token, amount, ActionType.WithdrawAction);

        // Check if there are enough tokens in the pool.
        if(compoundAmount > 0) {
            globalConfig.savingAccount().fromCompound(_token, compoundAmount);
        }

        return amount;
    }

    /**
     * Get current block number
     * @return the current block number
     */
    function getBlockNumber() private view returns (uint) {
        return block.number;
    }

    function version() public pure returns(string memory) {
        return "v1.2.0";
    }

}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"borrowFINRateIndex","type":"uint256"}],"name":"UpdateBorrowFINIndex","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositFINRateIndex","type":"uint256"}],"name":"UpdateDepositFINIndex","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositeRateIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"borrowRateIndex","type":"uint256"}],"name":"UpdateIndex","type":"event"},{"constant":true,"inputs":[],"name":"ACCURACY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BLOCKS_PER_YEAR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETH_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INT_UNIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"borrow","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"borrowFINRateIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"borrowRateIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"borrowRateIndexNow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"depositFINRateIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"depositeRateIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"depositeRateIndexNow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_borrowRateRecordStart","type":"uint256"}],"name":"getBorrowAccruedRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getBorrowRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getCapitalCompoundRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getCapitalUtilizationRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_depositRateRecordStart","type":"uint256"}],"name":"getDepositAccruedRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getDepositRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getPoolAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getTokenState","outputs":[{"internalType":"uint256","name":"deposits","type":"uint256"},{"internalType":"uint256","name":"loans","type":"uint256"},{"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"internalType":"uint256","name":"remainingAssets","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getTotalDepositStore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IGlobalConfig","name":"_globalConfig","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastBorrowFINRateCheckpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastCTokenExchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastCheckpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDepositFINRateCheckpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"newRateIndexCheckpoint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"repay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalCompound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalLoans","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"enum Constant.ActionType","name":"_action","type":"uint8"}],"name":"update","outputs":[{"internalType":"uint256","name":"compoundAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"updateBorrowFINIndex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"updateDepositFINIndex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"updateMining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50614881806100206000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80636dae2fa511610130578063d2796a93116100b8578063de34b0f41161007c578063de34b0f4146107b2578063e0b5a664146107d8578063e9ace6d9146107fe578063f487196614610824578063fbcd9b051461074e57610227565b8063d2796a9314610720578063d37db1d214610746578063d8c2d84c1461074e578063d8d7891714610756578063d9caed121461077c57610227565b80637aa473d1116100ff5780637aa473d11461064c5780638340f54914610678578063945eb764146106ae578063c4d66de8146106d4578063c9ca7d31146106fa57610227565b80636dae2fa5146105b65780636e5d84ba146105dc57806374a23843146106025780637753f47b1461062857610227565b80634cb9792b116101b357806354fd4d501161018257806354fd4d501461048657806356697310146105035780635a80c4971461052f5780635f85ca471461055b57806362e4a78c1461058157610227565b80634cb9792b146103dc5780634d770570146104025780634e7e36e2146104285780635224372c1461044e57610227565b80631ff4443c116101fa5780631ff4443c1461031257806329aa42181461033e5780632d6cb68114610364578063343340f41461039057806337a58b15146103b657610227565b80630603c2221461022c5780630b3eb9701461026a5780630b574443146102b65780631da649cf146102dc575b600080fd5b6102586004803603604081101561024257600080fd5b506001600160a01b03813516906020013561084a565b60408051918252519081900360200190f35b6102906004803603602081101561028057600080fd5b50356001600160a01b0316610867565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610258600480360360208110156102cc57600080fd5b50356001600160a01b03166109c9565b610258600480360360608110156102f257600080fd5b506001600160a01b03813581169160208101359091169060400135610a93565b6102586004803603604081101561032857600080fd5b506001600160a01b038135169060200135610f31565b6102586004803603602081101561035457600080fd5b50356001600160a01b0316610f4e565b6102586004803603604081101561037a57600080fd5b506001600160a01b038135169060200135610f60565b610258600480360360208110156103a657600080fd5b50356001600160a01b0316610fe3565b610258600480360360208110156103cc57600080fd5b50356001600160a01b0316610ff5565b610258600480360360208110156103f257600080fd5b50356001600160a01b0316611007565b6102586004803603602081101561041857600080fd5b50356001600160a01b0316611019565b6102586004803603602081101561043e57600080fd5b50356001600160a01b0316611075565b6104846004803603606081101561046457600080fd5b506001600160a01b03813581169160208101359091169060400135611087565b005b61048e6113d2565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104c85781810151838201526020016104b0565b50505050905090810190601f1680156104f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102586004803603604081101561051957600080fd5b506001600160a01b0381351690602001356113f2565b6102586004803603604081101561054557600080fd5b506001600160a01b03813516906020013561140f565b6104846004803603602081101561057157600080fd5b50356001600160a01b0316611488565b6102586004803603606081101561059757600080fd5b5080356001600160a01b0316906020810135906040013560ff166115e9565b610258600480360360208110156105cc57600080fd5b50356001600160a01b0316611748565b610258600480360360208110156105f257600080fd5b50356001600160a01b03166118d1565b6102586004803603602081101561061857600080fd5b50356001600160a01b0316611a17565b610630611a29565b604080516001600160a01b039092168252519081900360200190f35b6102586004803603604081101561066257600080fd5b506001600160a01b038135169060200135611a2e565b6104846004803603606081101561068e57600080fd5b506001600160a01b03813581169160208101359091169060400135611a4b565b610258600480360360208110156106c457600080fd5b50356001600160a01b0316611dba565b610484600480360360208110156106ea57600080fd5b50356001600160a01b0316611eed565b6102586004803603602081101561071057600080fd5b50356001600160a01b0316611fab565b6104846004803603602081101561073657600080fd5b50356001600160a01b0316612371565b61025861274a565b610258612751565b6102586004803603602081101561076c57600080fd5b50356001600160a01b031661275d565b6102586004803603606081101561079257600080fd5b506001600160a01b038135811691602081013590911690604001356127ba565b610484600480360360208110156107c857600080fd5b50356001600160a01b0316612b50565b610484600480360360208110156107ee57600080fd5b50356001600160a01b031661345a565b6102586004803603602081101561081457600080fd5b50356001600160a01b03166137f9565b6102586004803603602081101561083a57600080fd5b50356001600160a01b031661380b565b603d60209081526000928352604080842090915290825290205481565b600080600080610876856118d1565b6001600160a01b038087166000908152603360209081526040808320546034835281842054603b548351639895880f60e01b81529351929691956109ba9560359591949290931692639895880f92600480840193829003018186803b1580156108de57600080fd5b505afa1580156108f2573d6000803e3d6000fd5b505050506040513d602081101561090857600080fd5b505160408051637e5a4eb960e01b81526001600160a01b038e8116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b15801561095457600080fd5b505afa158015610968573d6000803e3d6000fd5b505050506040513d602081101561097e57600080fd5b50516001600160a01b0390811682526020828101939093526040918201600090812054918d16815260349093529120549063ffffffff61396516565b93509350935093509193509193565b6001600160a01b038116600090815260386020526040812054806109f85750670de0b6b3a76400009050610a8e565b6001600160a01b038316600090815260376020908152604080832084845290915281205490610a2685611fab565b9050610a88670de0b6b3a7640000610a7c610a6f82610a6386610a578a610a4b6139bf565b9063ffffffff6139c316565b9063ffffffff613a0516565b9063ffffffff61396516565b859063ffffffff613a0516565b9063ffffffff613a5e16565b93505050505b919050565b603b546040805163cc5738b560e01b815290516000926001600160a01b03169163cc5738b5916004808301926020929190829003018186803b158015610ad857600080fd5b505afa158015610aec573d6000803e3d6000fd5b505050506040513d6020811015610b0257600080fd5b50516001600160a01b0316331480610b9b5750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015610b6357600080fd5b505afa158015610b77573d6000803e3d6000fd5b505050506040513d6020811015610b8d57600080fd5b50516001600160a01b031633145b610bd65760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b610bdf83612b50565b610be883612371565b603b546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b158015610c2d57600080fd5b505afa158015610c41573d6000803e3d6000fd5b505050506040513d6020811015610c5757600080fd5b505160408051638224b89960e01b81526001600160a01b038881166004830152878116602483015291519190921691638224b899916044808301926020929190829003018186803b158015610cab57600080fd5b505afa158015610cbf573d6000803e3d6000fd5b505050506040513d6020811015610cd557600080fd5b505111610d135760405162461bcd60e51b815260040180806020018281038252605c81526020018061472f605c913960600191505060405180910390fd5b603b546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b158015610d5857600080fd5b505afa158015610d6c573d6000803e3d6000fd5b505050506040513d6020811015610d8257600080fd5b505160408051631da649cf60e01b81526001600160a01b03888116600483015287811660248301526044820187905291519190921691631da649cf9160648083019260209291908290030181600087803b158015610ddf57600080fd5b505af1158015610df3573d6000803e3d6000fd5b505050506040513d6020811015610e0957600080fd5b505190506000610e2a85610e23868563ffffffff6139c316565b60036115e9565b90508015610f1757603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015610e8057600080fd5b505afa158015610e94573d6000803e3d6000fd5b505050506040513d6020811015610eaa57600080fd5b505160408051638280e5a960e01b81526001600160a01b0388811660048301526024820185905291519190921691638280e5a991604480830192600092919082900301818387803b158015610efe57600080fd5b505af1158015610f12573d6000803e3d6000fd5b505050505b610f27848363ffffffff6139c316565b9695505050505050565b603660209081526000928352604080842090915290825290205481565b603f6020526000908152604090205481565b6001600160a01b038216600090815260376020908152604080832084845290915281205480610fc05760405162461bcd60e51b815260040180806020018281038252603b815260200180614812603b913960400191505060405180910390fd5b610fd981610a7c670de0b6b3a7640000610a57886109c9565b9150505b92915050565b60336020526000908152604090205481565b60356020526000908152604090205481565b603e6020526000908152604090205481565b600080611025836118d1565b905080611036576000915050610a8e565b6001600160a01b03831660009081526033602052604090205461106d908290610a7c90670de0b6b3a764000063ffffffff613a0516565b915050610a8e565b60346020526000908152604090205481565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b50516001600160a01b03163314806111985750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561116057600080fd5b505afa158015611174573d6000803e3d6000fd5b505050506040513d602081101561118a57600080fd5b50516001600160a01b031633145b6111d35760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b6111dc82612b50565b6111e582612371565b603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561123357600080fd5b505afa158015611247573d6000803e3d6000fd5b505050506040513d602081101561125d57600080fd5b5051604080516314890dcb60e21b81526001600160a01b03868116600483015285811660248301526044820185905291519190921691635224372c91606480830192600092919082900301818387803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b5050505060006112df838360026115e9565b905080156113cc57603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561133557600080fd5b505afa158015611349573d6000803e3d6000fd5b505050506040513d602081101561135f57600080fd5b50516040805163526e93cb60e01b81526001600160a01b038681166004830152602482018590529151919092169163526e93cb91604480830192600092919082900301818387803b1580156113b357600080fd5b505af11580156113c7573d6000803e3d6000fd5b505050505b50505050565b604080518082019091526006815265076312e322e360d41b602082015290565b603c60209081526000928352604080842090915290825290205481565b6001600160a01b03821660009081526036602090815260408083208484529091528120548061146f5760405162461bcd60e51b815260040180806020018281038252603c8152602001806146f3603c913960400191505060405180910390fd5b610fd981610a7c670de0b6b3a7640000610a578861275d565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156114d657600080fd5b505afa1580156114ea573d6000803e3d6000fd5b505050506040513d602081101561150057600080fd5b50516001600160a01b03163314806115995750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561156157600080fd5b505afa158015611575573d6000803e3d6000fd5b505050506040513d602081101561158b57600080fd5b50516001600160a01b031633145b6115d45760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b6115dd81612b50565b6115e681613aa0565b50565b603b546040805163cc5738b560e01b815290516000926001600160a01b03169163cc5738b5916004808301926020929190829003018186803b15801561162e57600080fd5b505afa158015611642573d6000803e3d6000fd5b505050506040513d602081101561165857600080fd5b50516001600160a01b03163314806116f15750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b957600080fd5b505afa1580156116cd573d6000803e3d6000fd5b505050506040513d60208110156116e357600080fd5b50516001600160a01b031633145b61172c5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b61173584613aa0565b611740848484613cb1565b949350505050565b60008061175483611fab565b9050600061176184611019565b9050603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117b157600080fd5b505afa1580156117c5573d6000803e3d6000fd5b505050506040513d60208110156117db57600080fd5b505160408051630e525ed960e21b81526001600160a01b038781166004830152915191909216916339497b64916024808301926020929190829003018186803b15801561182757600080fd5b505afa15801561183b573d6000803e3d6000fd5b505050506040513d602081101561185157600080fd5b505161187c57611873670de0b6b3a7640000610a7c848463ffffffff613a0516565b92505050610a8e565b6001600160a01b0384166000908152603a60205260409020600181015460029091015461174091670de0b6b3a764000091610a7c916118c1919063ffffffff613a0516565b610a63868663ffffffff613a0516565b600080603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561192257600080fd5b505afa158015611936573d6000803e3d6000fd5b505050506040513d602081101561194c57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03868116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b15801561199857600080fd5b505afa1580156119ac573d6000803e3d6000fd5b505050506040513d60208110156119c257600080fd5b50516001600160a01b0380851660009081526034602090815260408083205460338352818420549486168452603590925290912054929350611a10929091610a63919063ffffffff61396516565b9392505050565b60386020526000908152604090205481565b600e81565b603760209081526000928352604080842090915290825290205481565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d6020811015611ac357600080fd5b50516001600160a01b0316331480611b5c5750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2457600080fd5b505afa158015611b38573d6000803e3d6000fd5b505050506040513d6020811015611b4e57600080fd5b50516001600160a01b031633145b611b975760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b80611bda576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973207a65726f60901b604482015290519081900360640190fd5b611be382612b50565b611bec8261345a565b603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015611c3a57600080fd5b505afa158015611c4e573d6000803e3d6000fd5b505050506040513d6020811015611c6457600080fd5b505160408051638340f54960e01b81526001600160a01b03868116600483015285811660248301526044820185905291519190921691638340f54991606480830192600092919082900301818387803b158015611cc057600080fd5b505af1158015611cd4573d6000803e3d6000fd5b505050506000611ce6838360006115e9565b905080156113cc57603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3c57600080fd5b505afa158015611d50573d6000803e3d6000fd5b505050506040513d6020811015611d6657600080fd5b505160408051638280e5a960e01b81526001600160a01b0386811660048301526024820185905291519190921691638280e5a991604480830192600092919082900301818387803b1580156113b357600080fd5b6000610fdd60356000603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1157600080fd5b505afa158015611e25573d6000803e3d6000fd5b505050506040513d6020811015611e3b57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03888116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015611e8757600080fd5b505afa158015611e9b573d6000803e3d6000fd5b505050506040513d6020811015611eb157600080fd5b50516001600160a01b0390811682526020828101939093526040918201600090812054918716815260349093529120549063ffffffff61396516565b600054610100900460ff1680611f065750611f066145f0565b80611f14575060005460ff16155b611f4f5760405162461bcd60e51b815260040180806020018281038252602e8152602001806147ac602e913960400191505060405180910390fd5b600054610100900460ff16158015611f7a576000805460ff1961ff0019909116610100171660011790555b603b80546001600160a01b0319166001600160a01b0384161790558015611fa7576000805461ff00191690555b5050565b600080611fb783611019565b90506000603b60009054906101000a90046001600160a01b03166001600160a01b031663b442a2066040518163ffffffff1660e01b815260040160206040518083038186803b15801561200957600080fd5b505afa15801561201d573d6000803e3d6000fd5b505050506040513d602081101561203357600080fd5b5051603b54604080516308fafb8d60e01b815290519293506000926120d5926001600160a01b0316916308fafb8d916004808301926020929190829003018186803b15801561208157600080fd5b505afa158015612095573d6000803e3d6000fd5b505050506040513d60208110156120ab57600080fd5b50516001600160a01b0387166000908152603a60205260409020600201549063ffffffff613a0516565b9050600061217e603b60009054906101000a90046001600160a01b03166001600160a01b03166313afb8ef6040518163ffffffff1660e01b815260040160206040518083038186803b15801561212a57600080fd5b505afa15801561213e573d6000803e3d6000fd5b505050506040513d602081101561215457600080fd5b50516001600160a01b0388166000908152603a60205260409020600301549063ffffffff613a0516565b9050600061219a670de0b6b3a76400008663ffffffff6139c316565b90506000603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156121ec57600080fd5b505afa158015612200573d6000803e3d6000fd5b505050506040513d602081101561221657600080fd5b505160408051630e525ed960e21b81526001600160a01b038b81166004830152915191909216916339497b64916024808301926020929190829003018186803b15801561226257600080fd5b505afa158015612276573d6000803e3d6000fd5b505050506040513d602081101561228c57600080fd5b50519050801561231b5760006122ad600a610a7c878763ffffffff61396516565b90506000670d99a8cec7e200008811156122fa576122d962201480610a7c89603263ffffffff613a0516565b90506122eb828263ffffffff61396516565b98505050505050505050610a8e565b6122d962201480610a7c86818b670de0b6b3a764000063ffffffff613a0516565b670d99a8cec7e200008611156123505761234362201480610a7c87603263ffffffff613a0516565b9650505050505050610a8e565b61234362201480610a7c848189670de0b6b3a764000063ffffffff613a0516565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156123bf57600080fd5b505afa1580156123d3573d6000803e3d6000fd5b505050506040513d60208110156123e957600080fd5b50516001600160a01b03163314806124825750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561244a57600080fd5b505afa15801561245e573d6000803e3d6000fd5b505050506040513d602081101561247457600080fd5b50516001600160a01b031633145b6124bd5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b60006124c76139bf565b6001600160a01b0383166000908152603f60205260408120549192509015612518576001600160a01b0383166000908152603f602052604090205461251390839063ffffffff6139c316565b61251b565b60005b6001600160a01b0384166000908152603360205260409020549091506126d6901561269c5761269760336000866001600160a01b03166001600160a01b0316815260200190815260200160002054610a7c603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156125ba57600080fd5b505afa1580156125ce573d6000803e3d6000fd5b505050506040513d60208110156125e457600080fd5b50516040805163d7fa113760e01b81526001600160a01b038a811660048301529151919092169163d7fa1137916024808301926020929190829003018186803b15801561263057600080fd5b505afa158015612644573d6000803e3d6000fd5b505050506040513d602081101561265a57600080fd5b50516001600160a01b038816600090815260376020908152604080832060388352818420548452909152902054610a57908763ffffffff613a0516565b61269f565b60005b6001600160a01b0385166000908152603d60209081526040808320603f83528184205484529091529020549063ffffffff61396516565b6001600160a01b0384166000818152603d60209081526040808320878452808352818420958655848452603f83528184208890559287905291815292548151908152905191927fabb9f52b6cb5c079bc60ea0d31e98448916c1b4fdbfea1dda8e2ef9802588bfd92918290030190a2505050565b6220148081565b670de0b6b3a764000081565b6001600160a01b0381166000908152603860205260408120548061278c5750670de0b6b3a76400009050610a8e565b6001600160a01b038316600090815260366020908152604080832084845290915281205490610a2685611748565b603b546040805163cc5738b560e01b815290516000926001600160a01b03169163cc5738b5916004808301926020929190829003018186803b1580156127ff57600080fd5b505afa158015612813573d6000803e3d6000fd5b505050506040513d602081101561282957600080fd5b50516001600160a01b03163314806128c25750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561288a57600080fd5b505afa15801561289e573d6000803e3d6000fd5b505050506040513d60208110156128b457600080fd5b50516001600160a01b031633145b6128fd5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b81612940576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973207a65726f60901b604482015290519081900360640190fd5b61294983612b50565b6129528361345a565b603b546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b15801561299757600080fd5b505afa1580156129ab573d6000803e3d6000fd5b505050506040513d60208110156129c157600080fd5b505160408051636ce5768960e11b81526001600160a01b0388811660048301528781166024830152604482018790529151919092169163d9caed129160648083019260209291908290030181600087803b158015612a1e57600080fd5b505af1158015612a32573d6000803e3d6000fd5b505050506040513d6020811015612a4857600080fd5b505190506000612a5a858360016115e9565b90508015612b4757603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015612ab057600080fd5b505afa158015612ac4573d6000803e3d6000fd5b505050506040513d6020811015612ada57600080fd5b50516040805163526e93cb60e01b81526001600160a01b038881166004830152602482018590529151919092169163526e93cb91604480830192600092919082900301818387803b158015612b2e57600080fd5b505af1158015612b42573d6000803e3d6000fd5b505050505b50949350505050565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015612b9e57600080fd5b505afa158015612bb2573d6000803e3d6000fd5b505050506040513d6020811015612bc857600080fd5b50516001600160a01b0316331480612c615750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015612c2957600080fd5b505afa158015612c3d573d6000803e3d6000fd5b505050506040513d6020811015612c5357600080fd5b50516001600160a01b031633145b612c9c5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b6000612ca66139bf565b6001600160a01b038316600090815260386020526040902054909150811415612ccf57506115e6565b603b5460408051639895880f60e01b81529051670de0b6b3a7640000926000926001600160a01b0390911691639895880f91600480820192602092909190829003018186803b158015612d2157600080fd5b505afa158015612d35573d6000803e3d6000fd5b505050506040513d6020811015612d4b57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03878116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015612d9757600080fd5b505afa158015612dab573d6000803e3d6000fd5b505050506040513d6020811015612dc157600080fd5b50516001600160a01b0385166000908152603860205260409020549091508061305c576001600160a01b038216612e4c576001600160a01b0385166000818152603a60209081526040808320805460ff191690556037825280832088845282528083208790558383526036825280832088845282528083208790559282526038905220849055613057565b6001600160a01b038086166000908152603a60209081526040808320805460ff19166001179055805163bd6d894d60e01b81529051929386169263bd6d894d9260048084019391929182900301818787803b158015612eaa57600080fd5b505af1158015612ebe573d6000803e3d6000fd5b505050506040513d6020811015612ed457600080fd5b50519050612ee18661380b565b603a6000886001600160a01b03166001600160a01b0316815260200190815260200160002060010181905550826001600160a01b031663f8f9da286040518163ffffffff1660e01b815260040160206040518083038186803b158015612f4657600080fd5b505afa158015612f5a573d6000803e3d6000fd5b505050506040513d6020811015612f7057600080fd5b50516001600160a01b038088166000908152603a6020908152604091829020600301939093558051630ae9d70b60e41b815290519186169263ae9d70b092600480840193829003018186803b158015612fc857600080fd5b505afa158015612fdc573d6000803e3d6000fd5b505050506040513d6020811015612ff257600080fd5b50516001600160a01b038088166000818152603a6020908152604080832060020195909555603781528482208a83528152848220899055828252603681528482208a835281528482208990559181526038825283812089905591861682526039905220555b61331f565b6001600160a01b0382166130f8576001600160a01b0385166000908152603a60205260409020805460ff19169055613093856109c9565b6001600160a01b03861660009081526037602090815260408083208884529091529020556130c08561275d565b6001600160a01b038616600081815260366020908152604080832089845282528083209490945591815260389091522084905561331f565b6001600160a01b038086166000908152603a60209081526040808320805460ff19166001179055805163bd6d894d60e01b81529051929386169263bd6d894d9260048084019391929182900301818787803b15801561315657600080fd5b505af115801561316a573d6000803e3d6000fd5b505050506040513d602081101561318057600080fd5b5051905061318d8661380b565b603a6000886001600160a01b03166001600160a01b0316815260200190815260200160002060010181905550826001600160a01b031663f8f9da286040518163ffffffff1660e01b815260040160206040518083038186803b1580156131f257600080fd5b505afa158015613206573d6000803e3d6000fd5b505050506040513d602081101561321c57600080fd5b50516001600160a01b0387166000908152603a602090815260408083206003019390935560389052205461328c9061325b90879063ffffffff6139c316565b6001600160a01b038516600090815260396020526040902054610a7c908790610a4b9083878463ffffffff613a0516565b6001600160a01b0387166000908152603a60205260409020600201556132b1866109c9565b6001600160a01b03871660009081526037602090815260408083208984529091529020556132de8661275d565b6001600160a01b0380881660008181526036602090815260408083208b84528252808320959095559181526038825283812089905591861682526039905220555b6001600160a01b038516600090815260376020908152604080832087845290915290205483146133a8576001600160a01b03851660008181526037602090815260408083208584528252808320548884528184205494845260339092529091205461338e92610a7c9190613a05565b6001600160a01b0386166000908152603360205260409020555b6001600160a01b03851660008181526036602052604081207f1cc14bf94d8329e459fdcf4f38c293236b70411487793b5c07ac7448c788c252916133ea6139bf565b81526020019081526020016000205460376000896001600160a01b03166001600160a01b0316815260200190815260200160002060006134286139bf565b815260200190815260200160002054604051808381526020018281526020019250505060405180910390a25050505050565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156134a857600080fd5b505afa1580156134bc573d6000803e3d6000fd5b505050506040513d60208110156134d257600080fd5b50516001600160a01b031633148061356b5750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561353357600080fd5b505afa158015613547573d6000803e3d6000fd5b505050506040513d602081101561355d57600080fd5b50516001600160a01b031633145b6135a65760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b60006135b06139bf565b6001600160a01b0383166000908152603e60205260408120549192509015613601576001600160a01b0383166000908152603e60205260409020546135fc90839063ffffffff6139c316565b613604565b60005b9050613785613612846118d1565b1561374b57613746613623856118d1565b603b5460408051639895880f60e01b81529051610a7c926001600160a01b031691639895880f916004808301926020929190829003018186803b15801561366957600080fd5b505afa15801561367d573d6000803e3d6000fd5b505050506040513d602081101561369357600080fd5b505160408051637a78a94360e01b81526001600160a01b038a8116600483015291519190921691637a78a943916024808301926020929190829003018186803b1580156136df57600080fd5b505afa1580156136f3573d6000803e3d6000fd5b505050506040513d602081101561370957600080fd5b50516001600160a01b038816600090815260366020908152604080832060388352818420548452909152902054610a57908763ffffffff613a0516565b61374e565b60005b6001600160a01b0385166000908152603c60209081526040808320603e83528184205484529091529020549063ffffffff61396516565b6001600160a01b0384166000818152603c60209081526040808320878452808352818420958655848452603e83528184208890559287905291815292548151908152905191927f2aa34452d1f231efd3e8dc3eae64938dbfa82f1b40e2b994e1a395d7ed27ae5b92918290030190a2505050565b60396020526000908152604090205481565b600080603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561385c57600080fd5b505afa158015613870573d6000803e3d6000fd5b505050506040513d602081101561388657600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03868116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b1580156138d257600080fd5b505afa1580156138e6573d6000803e3d6000fd5b505050506040513d60208110156138fc57600080fd5b50516001600160a01b038116600090815260356020526040902054909150613928576000915050610a8e565b61106d613934846118d1565b6001600160a01b038316600090815260356020526040902054610a7c90670de0b6b3a764000063ffffffff613a0516565b600082820183811015611a10576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b4390565b6000611a1083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506145f6565b600082613a1457506000610fdd565b82820282848281613a2157fe5b0414611a105760405162461bcd60e51b815260040180806020018281038252602181526020018061478b6021913960400191505060405180910390fd5b6000611a1083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061468d565b603b5460408051639895880f60e01b815290516000926001600160a01b031691639895880f916004808301926020929190829003018186803b158015613ae557600080fd5b505afa158015613af9573d6000803e3d6000fd5b505050506040513d6020811015613b0f57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03858116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015613b5b57600080fd5b505afa158015613b6f573d6000803e3d6000fd5b505050506040513d6020811015613b8557600080fd5b505190506001600160a01b03811615611fa757806001600160a01b0316633af9e669603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015613bf557600080fd5b505afa158015613c09573d6000803e3d6000fd5b505050506040513d6020811015613c1f57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301525160248083019260209291908290030181600087803b158015613c6857600080fd5b505af1158015613c7c573d6000803e3d6000fd5b505050506040513d6020811015613c9257600080fd5b50516001600160a01b0382166000908152603560205260409020555050565b600080603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015613d0257600080fd5b505afa158015613d16573d6000803e3d6000fd5b505050506040513d6020811015613d2c57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03888116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015613d7857600080fd5b505afa158015613d8c573d6000803e3d6000fd5b505050506040513d6020811015613da257600080fd5b505190506000613db1866118d1565b90506000846004811115613dc157fe5b1480613dd857506003846004811115613dd657fe5b145b1561409a576000846004811115613deb57fe5b1415613e0857613e01818663ffffffff61396516565b9050613e4b565b6001600160a01b038616600090815260336020526040902054613e31908663ffffffff6139c316565b6001600160a01b0387166000908152603360205260409020555b6001600160a01b038616600090815260346020526040812054613e74908763ffffffff61396516565b90506001600160a01b03831615801590613f1b5750613f186064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663268c74e46040518163ffffffff1660e01b815260040160206040518083038186803b158015613edf57600080fd5b505afa158015613ef3573d6000803e3d6000fd5b505050506040513d6020811015613f0957600080fd5b5051859063ffffffff613a0516565b81115b15614051576000613fc1613fb46064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663c36938966040518163ffffffff1660e01b815260040160206040518083038186803b158015613f7b57600080fd5b505afa158015613f8f573d6000803e3d6000fd5b505050506040513d6020811015613fa557600080fd5b5051879063ffffffff613a0516565b839063ffffffff6139c316565b6001600160a01b038516600090815260356020526040902054909550859150613ff0908263ffffffff61396516565b6001600160a01b03808616600090815260356020908152604080832094909455918b16815260349091522054614032908290610a4b908a63ffffffff61396516565b6001600160a01b03891660009081526034602052604090205550614094565b6001600160a01b03871660009081526034602052604090205461407a908763ffffffff61396516565b6001600160a01b0388166000908152603460205260409020555b506145e7565b60048460048111156140a857fe5b14156140f5576001600160a01b0386166000908152603360205260409020546140d7908663ffffffff6139c316565b6001600160a01b0387166000908152603360205260409020556145e7565b600184600481111561410357fe5b14156141ed576001600160a01b03861660009081526033602052604090205415614189578461413187611dba565b1015614184576040805162461bcd60e51b815260206004820181905260248201527f4c61636b206f66206c6971756964697479207768656e2077697468647261772e604482015290519081900360640190fd5b6141dd565b8461419387611dba565b10156141dd576001600160a01b0382166000908152603560205260409020546141c390869063ffffffff6139c316565b6001600160a01b0387166000908152603460205260409020555b6141e6866118d1565b905061424a565b846141f787611dba565b101561424a576040805162461bcd60e51b815260206004820152601e60248201527f4c61636b206f66206c6971756964697479207768656e20626f72726f772e0000604482015290519081900360640190fd5b600184600481111561425857fe5b14156142755761426e818663ffffffff6139c316565b90506142b8565b6001600160a01b03861660009081526033602052604090205461429e908663ffffffff61396516565b6001600160a01b0387166000908152603360205260409020555b6001600160a01b03861660009081526034602052604081205486106142de576000614307565b6001600160a01b038716600090815260346020526040902054614307908763ffffffff6139c316565b90506001600160a01b0383161580159061437d575081158061437d575061437a6064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b0316635a596d1c6040518163ffffffff1660e01b815260040160206040518083038186803b158015613edf57600080fd5b81105b156145a2576001600160a01b03808416600090815260356020908152604080832054938b168352603490915281205490916143c4918991610a4b919063ffffffff61396516565b90506144556064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663c36938966040518163ffffffff1660e01b815260040160206040518083038186803b15801561441c57600080fd5b505afa158015614430573d6000803e3d6000fd5b505050506040513d602081101561444657600080fd5b5051869063ffffffff613a0516565b811015614494576001600160a01b038085166000908152603560209081526040808320805490849055938c16835260349091529020829055945061459c565b6000614528613fb46064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663c36938966040518163ffffffff1660e01b815260040160206040518083038186803b1580156144ef57600080fd5b505afa158015614503573d6000803e3d6000fd5b505050506040513d602081101561451957600080fd5b5051889063ffffffff613a0516565b6001600160a01b038616600090815260356020526040902054909150614554908263ffffffff6139c316565b6001600160a01b03861660009081526035602052604090208290559550614581828263ffffffff6139c316565b6001600160a01b038a16600090815260346020526040902055505b506145e5565b6001600160a01b0387166000908152603460205260409020546145cb908763ffffffff6139c316565b6001600160a01b0388166000908152603460205260409020555b505b50509392505050565b303b1590565b600081848411156146855760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561464a578181015183820152602001614632565b50505050905090810190601f1680156146775780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836146dc5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561464a578181015183820152602001614632565b5060008385816146e857fe5b049594505050505056fe5f6465706f736974526174655265636f72645374617274206973206e6f74206120636865636b20706f696e74206f6e20696e6465782063757276652e546f6b656e20426f72726f775072696e636970616c206d7573742062652067726561746572207468616e20302e20546f206465706f7369742062616c616e63652c20706c6561736520757365206465706f73697420627574746f6e2e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65644f6e6c7920617574686f72697a656420746f2063616c6c2066726f6d20446546696e657220696e7465726e616c20636f6e7472616374732e5f626f72726f77526174655265636f72645374617274206973206e6f74206120636865636b20706f696e74206f6e20696e6465782063757276652ea265627a7a72315820757185121399a527a64ac4f04319dcd8b650fb25ccba9f3ca4843c1dbe0ef84664736f6c634300050e0032

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c80636dae2fa511610130578063d2796a93116100b8578063de34b0f41161007c578063de34b0f4146107b2578063e0b5a664146107d8578063e9ace6d9146107fe578063f487196614610824578063fbcd9b051461074e57610227565b8063d2796a9314610720578063d37db1d214610746578063d8c2d84c1461074e578063d8d7891714610756578063d9caed121461077c57610227565b80637aa473d1116100ff5780637aa473d11461064c5780638340f54914610678578063945eb764146106ae578063c4d66de8146106d4578063c9ca7d31146106fa57610227565b80636dae2fa5146105b65780636e5d84ba146105dc57806374a23843146106025780637753f47b1461062857610227565b80634cb9792b116101b357806354fd4d501161018257806354fd4d501461048657806356697310146105035780635a80c4971461052f5780635f85ca471461055b57806362e4a78c1461058157610227565b80634cb9792b146103dc5780634d770570146104025780634e7e36e2146104285780635224372c1461044e57610227565b80631ff4443c116101fa5780631ff4443c1461031257806329aa42181461033e5780632d6cb68114610364578063343340f41461039057806337a58b15146103b657610227565b80630603c2221461022c5780630b3eb9701461026a5780630b574443146102b65780631da649cf146102dc575b600080fd5b6102586004803603604081101561024257600080fd5b506001600160a01b03813516906020013561084a565b60408051918252519081900360200190f35b6102906004803603602081101561028057600080fd5b50356001600160a01b0316610867565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610258600480360360208110156102cc57600080fd5b50356001600160a01b03166109c9565b610258600480360360608110156102f257600080fd5b506001600160a01b03813581169160208101359091169060400135610a93565b6102586004803603604081101561032857600080fd5b506001600160a01b038135169060200135610f31565b6102586004803603602081101561035457600080fd5b50356001600160a01b0316610f4e565b6102586004803603604081101561037a57600080fd5b506001600160a01b038135169060200135610f60565b610258600480360360208110156103a657600080fd5b50356001600160a01b0316610fe3565b610258600480360360208110156103cc57600080fd5b50356001600160a01b0316610ff5565b610258600480360360208110156103f257600080fd5b50356001600160a01b0316611007565b6102586004803603602081101561041857600080fd5b50356001600160a01b0316611019565b6102586004803603602081101561043e57600080fd5b50356001600160a01b0316611075565b6104846004803603606081101561046457600080fd5b506001600160a01b03813581169160208101359091169060400135611087565b005b61048e6113d2565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104c85781810151838201526020016104b0565b50505050905090810190601f1680156104f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102586004803603604081101561051957600080fd5b506001600160a01b0381351690602001356113f2565b6102586004803603604081101561054557600080fd5b506001600160a01b03813516906020013561140f565b6104846004803603602081101561057157600080fd5b50356001600160a01b0316611488565b6102586004803603606081101561059757600080fd5b5080356001600160a01b0316906020810135906040013560ff166115e9565b610258600480360360208110156105cc57600080fd5b50356001600160a01b0316611748565b610258600480360360208110156105f257600080fd5b50356001600160a01b03166118d1565b6102586004803603602081101561061857600080fd5b50356001600160a01b0316611a17565b610630611a29565b604080516001600160a01b039092168252519081900360200190f35b6102586004803603604081101561066257600080fd5b506001600160a01b038135169060200135611a2e565b6104846004803603606081101561068e57600080fd5b506001600160a01b03813581169160208101359091169060400135611a4b565b610258600480360360208110156106c457600080fd5b50356001600160a01b0316611dba565b610484600480360360208110156106ea57600080fd5b50356001600160a01b0316611eed565b6102586004803603602081101561071057600080fd5b50356001600160a01b0316611fab565b6104846004803603602081101561073657600080fd5b50356001600160a01b0316612371565b61025861274a565b610258612751565b6102586004803603602081101561076c57600080fd5b50356001600160a01b031661275d565b6102586004803603606081101561079257600080fd5b506001600160a01b038135811691602081013590911690604001356127ba565b610484600480360360208110156107c857600080fd5b50356001600160a01b0316612b50565b610484600480360360208110156107ee57600080fd5b50356001600160a01b031661345a565b6102586004803603602081101561081457600080fd5b50356001600160a01b03166137f9565b6102586004803603602081101561083a57600080fd5b50356001600160a01b031661380b565b603d60209081526000928352604080842090915290825290205481565b600080600080610876856118d1565b6001600160a01b038087166000908152603360209081526040808320546034835281842054603b548351639895880f60e01b81529351929691956109ba9560359591949290931692639895880f92600480840193829003018186803b1580156108de57600080fd5b505afa1580156108f2573d6000803e3d6000fd5b505050506040513d602081101561090857600080fd5b505160408051637e5a4eb960e01b81526001600160a01b038e8116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b15801561095457600080fd5b505afa158015610968573d6000803e3d6000fd5b505050506040513d602081101561097e57600080fd5b50516001600160a01b0390811682526020828101939093526040918201600090812054918d16815260349093529120549063ffffffff61396516565b93509350935093509193509193565b6001600160a01b038116600090815260386020526040812054806109f85750670de0b6b3a76400009050610a8e565b6001600160a01b038316600090815260376020908152604080832084845290915281205490610a2685611fab565b9050610a88670de0b6b3a7640000610a7c610a6f82610a6386610a578a610a4b6139bf565b9063ffffffff6139c316565b9063ffffffff613a0516565b9063ffffffff61396516565b859063ffffffff613a0516565b9063ffffffff613a5e16565b93505050505b919050565b603b546040805163cc5738b560e01b815290516000926001600160a01b03169163cc5738b5916004808301926020929190829003018186803b158015610ad857600080fd5b505afa158015610aec573d6000803e3d6000fd5b505050506040513d6020811015610b0257600080fd5b50516001600160a01b0316331480610b9b5750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015610b6357600080fd5b505afa158015610b77573d6000803e3d6000fd5b505050506040513d6020811015610b8d57600080fd5b50516001600160a01b031633145b610bd65760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b610bdf83612b50565b610be883612371565b603b546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b158015610c2d57600080fd5b505afa158015610c41573d6000803e3d6000fd5b505050506040513d6020811015610c5757600080fd5b505160408051638224b89960e01b81526001600160a01b038881166004830152878116602483015291519190921691638224b899916044808301926020929190829003018186803b158015610cab57600080fd5b505afa158015610cbf573d6000803e3d6000fd5b505050506040513d6020811015610cd557600080fd5b505111610d135760405162461bcd60e51b815260040180806020018281038252605c81526020018061472f605c913960600191505060405180910390fd5b603b546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b158015610d5857600080fd5b505afa158015610d6c573d6000803e3d6000fd5b505050506040513d6020811015610d8257600080fd5b505160408051631da649cf60e01b81526001600160a01b03888116600483015287811660248301526044820187905291519190921691631da649cf9160648083019260209291908290030181600087803b158015610ddf57600080fd5b505af1158015610df3573d6000803e3d6000fd5b505050506040513d6020811015610e0957600080fd5b505190506000610e2a85610e23868563ffffffff6139c316565b60036115e9565b90508015610f1757603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015610e8057600080fd5b505afa158015610e94573d6000803e3d6000fd5b505050506040513d6020811015610eaa57600080fd5b505160408051638280e5a960e01b81526001600160a01b0388811660048301526024820185905291519190921691638280e5a991604480830192600092919082900301818387803b158015610efe57600080fd5b505af1158015610f12573d6000803e3d6000fd5b505050505b610f27848363ffffffff6139c316565b9695505050505050565b603660209081526000928352604080842090915290825290205481565b603f6020526000908152604090205481565b6001600160a01b038216600090815260376020908152604080832084845290915281205480610fc05760405162461bcd60e51b815260040180806020018281038252603b815260200180614812603b913960400191505060405180910390fd5b610fd981610a7c670de0b6b3a7640000610a57886109c9565b9150505b92915050565b60336020526000908152604090205481565b60356020526000908152604090205481565b603e6020526000908152604090205481565b600080611025836118d1565b905080611036576000915050610a8e565b6001600160a01b03831660009081526033602052604090205461106d908290610a7c90670de0b6b3a764000063ffffffff613a0516565b915050610a8e565b60346020526000908152604090205481565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b50516001600160a01b03163314806111985750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561116057600080fd5b505afa158015611174573d6000803e3d6000fd5b505050506040513d602081101561118a57600080fd5b50516001600160a01b031633145b6111d35760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b6111dc82612b50565b6111e582612371565b603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561123357600080fd5b505afa158015611247573d6000803e3d6000fd5b505050506040513d602081101561125d57600080fd5b5051604080516314890dcb60e21b81526001600160a01b03868116600483015285811660248301526044820185905291519190921691635224372c91606480830192600092919082900301818387803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b5050505060006112df838360026115e9565b905080156113cc57603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561133557600080fd5b505afa158015611349573d6000803e3d6000fd5b505050506040513d602081101561135f57600080fd5b50516040805163526e93cb60e01b81526001600160a01b038681166004830152602482018590529151919092169163526e93cb91604480830192600092919082900301818387803b1580156113b357600080fd5b505af11580156113c7573d6000803e3d6000fd5b505050505b50505050565b604080518082019091526006815265076312e322e360d41b602082015290565b603c60209081526000928352604080842090915290825290205481565b6001600160a01b03821660009081526036602090815260408083208484529091528120548061146f5760405162461bcd60e51b815260040180806020018281038252603c8152602001806146f3603c913960400191505060405180910390fd5b610fd981610a7c670de0b6b3a7640000610a578861275d565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156114d657600080fd5b505afa1580156114ea573d6000803e3d6000fd5b505050506040513d602081101561150057600080fd5b50516001600160a01b03163314806115995750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561156157600080fd5b505afa158015611575573d6000803e3d6000fd5b505050506040513d602081101561158b57600080fd5b50516001600160a01b031633145b6115d45760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b6115dd81612b50565b6115e681613aa0565b50565b603b546040805163cc5738b560e01b815290516000926001600160a01b03169163cc5738b5916004808301926020929190829003018186803b15801561162e57600080fd5b505afa158015611642573d6000803e3d6000fd5b505050506040513d602081101561165857600080fd5b50516001600160a01b03163314806116f15750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b957600080fd5b505afa1580156116cd573d6000803e3d6000fd5b505050506040513d60208110156116e357600080fd5b50516001600160a01b031633145b61172c5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b61173584613aa0565b611740848484613cb1565b949350505050565b60008061175483611fab565b9050600061176184611019565b9050603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117b157600080fd5b505afa1580156117c5573d6000803e3d6000fd5b505050506040513d60208110156117db57600080fd5b505160408051630e525ed960e21b81526001600160a01b038781166004830152915191909216916339497b64916024808301926020929190829003018186803b15801561182757600080fd5b505afa15801561183b573d6000803e3d6000fd5b505050506040513d602081101561185157600080fd5b505161187c57611873670de0b6b3a7640000610a7c848463ffffffff613a0516565b92505050610a8e565b6001600160a01b0384166000908152603a60205260409020600181015460029091015461174091670de0b6b3a764000091610a7c916118c1919063ffffffff613a0516565b610a63868663ffffffff613a0516565b600080603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561192257600080fd5b505afa158015611936573d6000803e3d6000fd5b505050506040513d602081101561194c57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03868116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b15801561199857600080fd5b505afa1580156119ac573d6000803e3d6000fd5b505050506040513d60208110156119c257600080fd5b50516001600160a01b0380851660009081526034602090815260408083205460338352818420549486168452603590925290912054929350611a10929091610a63919063ffffffff61396516565b9392505050565b60386020526000908152604090205481565b600e81565b603760209081526000928352604080842090915290825290205481565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d6020811015611ac357600080fd5b50516001600160a01b0316331480611b5c5750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2457600080fd5b505afa158015611b38573d6000803e3d6000fd5b505050506040513d6020811015611b4e57600080fd5b50516001600160a01b031633145b611b975760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b80611bda576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973207a65726f60901b604482015290519081900360640190fd5b611be382612b50565b611bec8261345a565b603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015611c3a57600080fd5b505afa158015611c4e573d6000803e3d6000fd5b505050506040513d6020811015611c6457600080fd5b505160408051638340f54960e01b81526001600160a01b03868116600483015285811660248301526044820185905291519190921691638340f54991606480830192600092919082900301818387803b158015611cc057600080fd5b505af1158015611cd4573d6000803e3d6000fd5b505050506000611ce6838360006115e9565b905080156113cc57603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3c57600080fd5b505afa158015611d50573d6000803e3d6000fd5b505050506040513d6020811015611d6657600080fd5b505160408051638280e5a960e01b81526001600160a01b0386811660048301526024820185905291519190921691638280e5a991604480830192600092919082900301818387803b1580156113b357600080fd5b6000610fdd60356000603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1157600080fd5b505afa158015611e25573d6000803e3d6000fd5b505050506040513d6020811015611e3b57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03888116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015611e8757600080fd5b505afa158015611e9b573d6000803e3d6000fd5b505050506040513d6020811015611eb157600080fd5b50516001600160a01b0390811682526020828101939093526040918201600090812054918716815260349093529120549063ffffffff61396516565b600054610100900460ff1680611f065750611f066145f0565b80611f14575060005460ff16155b611f4f5760405162461bcd60e51b815260040180806020018281038252602e8152602001806147ac602e913960400191505060405180910390fd5b600054610100900460ff16158015611f7a576000805460ff1961ff0019909116610100171660011790555b603b80546001600160a01b0319166001600160a01b0384161790558015611fa7576000805461ff00191690555b5050565b600080611fb783611019565b90506000603b60009054906101000a90046001600160a01b03166001600160a01b031663b442a2066040518163ffffffff1660e01b815260040160206040518083038186803b15801561200957600080fd5b505afa15801561201d573d6000803e3d6000fd5b505050506040513d602081101561203357600080fd5b5051603b54604080516308fafb8d60e01b815290519293506000926120d5926001600160a01b0316916308fafb8d916004808301926020929190829003018186803b15801561208157600080fd5b505afa158015612095573d6000803e3d6000fd5b505050506040513d60208110156120ab57600080fd5b50516001600160a01b0387166000908152603a60205260409020600201549063ffffffff613a0516565b9050600061217e603b60009054906101000a90046001600160a01b03166001600160a01b03166313afb8ef6040518163ffffffff1660e01b815260040160206040518083038186803b15801561212a57600080fd5b505afa15801561213e573d6000803e3d6000fd5b505050506040513d602081101561215457600080fd5b50516001600160a01b0388166000908152603a60205260409020600301549063ffffffff613a0516565b9050600061219a670de0b6b3a76400008663ffffffff6139c316565b90506000603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156121ec57600080fd5b505afa158015612200573d6000803e3d6000fd5b505050506040513d602081101561221657600080fd5b505160408051630e525ed960e21b81526001600160a01b038b81166004830152915191909216916339497b64916024808301926020929190829003018186803b15801561226257600080fd5b505afa158015612276573d6000803e3d6000fd5b505050506040513d602081101561228c57600080fd5b50519050801561231b5760006122ad600a610a7c878763ffffffff61396516565b90506000670d99a8cec7e200008811156122fa576122d962201480610a7c89603263ffffffff613a0516565b90506122eb828263ffffffff61396516565b98505050505050505050610a8e565b6122d962201480610a7c86818b670de0b6b3a764000063ffffffff613a0516565b670d99a8cec7e200008611156123505761234362201480610a7c87603263ffffffff613a0516565b9650505050505050610a8e565b61234362201480610a7c848189670de0b6b3a764000063ffffffff613a0516565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156123bf57600080fd5b505afa1580156123d3573d6000803e3d6000fd5b505050506040513d60208110156123e957600080fd5b50516001600160a01b03163314806124825750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561244a57600080fd5b505afa15801561245e573d6000803e3d6000fd5b505050506040513d602081101561247457600080fd5b50516001600160a01b031633145b6124bd5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b60006124c76139bf565b6001600160a01b0383166000908152603f60205260408120549192509015612518576001600160a01b0383166000908152603f602052604090205461251390839063ffffffff6139c316565b61251b565b60005b6001600160a01b0384166000908152603360205260409020549091506126d6901561269c5761269760336000866001600160a01b03166001600160a01b0316815260200190815260200160002054610a7c603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156125ba57600080fd5b505afa1580156125ce573d6000803e3d6000fd5b505050506040513d60208110156125e457600080fd5b50516040805163d7fa113760e01b81526001600160a01b038a811660048301529151919092169163d7fa1137916024808301926020929190829003018186803b15801561263057600080fd5b505afa158015612644573d6000803e3d6000fd5b505050506040513d602081101561265a57600080fd5b50516001600160a01b038816600090815260376020908152604080832060388352818420548452909152902054610a57908763ffffffff613a0516565b61269f565b60005b6001600160a01b0385166000908152603d60209081526040808320603f83528184205484529091529020549063ffffffff61396516565b6001600160a01b0384166000818152603d60209081526040808320878452808352818420958655848452603f83528184208890559287905291815292548151908152905191927fabb9f52b6cb5c079bc60ea0d31e98448916c1b4fdbfea1dda8e2ef9802588bfd92918290030190a2505050565b6220148081565b670de0b6b3a764000081565b6001600160a01b0381166000908152603860205260408120548061278c5750670de0b6b3a76400009050610a8e565b6001600160a01b038316600090815260366020908152604080832084845290915281205490610a2685611748565b603b546040805163cc5738b560e01b815290516000926001600160a01b03169163cc5738b5916004808301926020929190829003018186803b1580156127ff57600080fd5b505afa158015612813573d6000803e3d6000fd5b505050506040513d602081101561282957600080fd5b50516001600160a01b03163314806128c25750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561288a57600080fd5b505afa15801561289e573d6000803e3d6000fd5b505050506040513d60208110156128b457600080fd5b50516001600160a01b031633145b6128fd5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b81612940576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973207a65726f60901b604482015290519081900360640190fd5b61294983612b50565b6129528361345a565b603b546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b15801561299757600080fd5b505afa1580156129ab573d6000803e3d6000fd5b505050506040513d60208110156129c157600080fd5b505160408051636ce5768960e11b81526001600160a01b0388811660048301528781166024830152604482018790529151919092169163d9caed129160648083019260209291908290030181600087803b158015612a1e57600080fd5b505af1158015612a32573d6000803e3d6000fd5b505050506040513d6020811015612a4857600080fd5b505190506000612a5a858360016115e9565b90508015612b4757603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015612ab057600080fd5b505afa158015612ac4573d6000803e3d6000fd5b505050506040513d6020811015612ada57600080fd5b50516040805163526e93cb60e01b81526001600160a01b038881166004830152602482018590529151919092169163526e93cb91604480830192600092919082900301818387803b158015612b2e57600080fd5b505af1158015612b42573d6000803e3d6000fd5b505050505b50949350505050565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015612b9e57600080fd5b505afa158015612bb2573d6000803e3d6000fd5b505050506040513d6020811015612bc857600080fd5b50516001600160a01b0316331480612c615750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015612c2957600080fd5b505afa158015612c3d573d6000803e3d6000fd5b505050506040513d6020811015612c5357600080fd5b50516001600160a01b031633145b612c9c5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b6000612ca66139bf565b6001600160a01b038316600090815260386020526040902054909150811415612ccf57506115e6565b603b5460408051639895880f60e01b81529051670de0b6b3a7640000926000926001600160a01b0390911691639895880f91600480820192602092909190829003018186803b158015612d2157600080fd5b505afa158015612d35573d6000803e3d6000fd5b505050506040513d6020811015612d4b57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03878116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015612d9757600080fd5b505afa158015612dab573d6000803e3d6000fd5b505050506040513d6020811015612dc157600080fd5b50516001600160a01b0385166000908152603860205260409020549091508061305c576001600160a01b038216612e4c576001600160a01b0385166000818152603a60209081526040808320805460ff191690556037825280832088845282528083208790558383526036825280832088845282528083208790559282526038905220849055613057565b6001600160a01b038086166000908152603a60209081526040808320805460ff19166001179055805163bd6d894d60e01b81529051929386169263bd6d894d9260048084019391929182900301818787803b158015612eaa57600080fd5b505af1158015612ebe573d6000803e3d6000fd5b505050506040513d6020811015612ed457600080fd5b50519050612ee18661380b565b603a6000886001600160a01b03166001600160a01b0316815260200190815260200160002060010181905550826001600160a01b031663f8f9da286040518163ffffffff1660e01b815260040160206040518083038186803b158015612f4657600080fd5b505afa158015612f5a573d6000803e3d6000fd5b505050506040513d6020811015612f7057600080fd5b50516001600160a01b038088166000908152603a6020908152604091829020600301939093558051630ae9d70b60e41b815290519186169263ae9d70b092600480840193829003018186803b158015612fc857600080fd5b505afa158015612fdc573d6000803e3d6000fd5b505050506040513d6020811015612ff257600080fd5b50516001600160a01b038088166000818152603a6020908152604080832060020195909555603781528482208a83528152848220899055828252603681528482208a835281528482208990559181526038825283812089905591861682526039905220555b61331f565b6001600160a01b0382166130f8576001600160a01b0385166000908152603a60205260409020805460ff19169055613093856109c9565b6001600160a01b03861660009081526037602090815260408083208884529091529020556130c08561275d565b6001600160a01b038616600081815260366020908152604080832089845282528083209490945591815260389091522084905561331f565b6001600160a01b038086166000908152603a60209081526040808320805460ff19166001179055805163bd6d894d60e01b81529051929386169263bd6d894d9260048084019391929182900301818787803b15801561315657600080fd5b505af115801561316a573d6000803e3d6000fd5b505050506040513d602081101561318057600080fd5b5051905061318d8661380b565b603a6000886001600160a01b03166001600160a01b0316815260200190815260200160002060010181905550826001600160a01b031663f8f9da286040518163ffffffff1660e01b815260040160206040518083038186803b1580156131f257600080fd5b505afa158015613206573d6000803e3d6000fd5b505050506040513d602081101561321c57600080fd5b50516001600160a01b0387166000908152603a602090815260408083206003019390935560389052205461328c9061325b90879063ffffffff6139c316565b6001600160a01b038516600090815260396020526040902054610a7c908790610a4b9083878463ffffffff613a0516565b6001600160a01b0387166000908152603a60205260409020600201556132b1866109c9565b6001600160a01b03871660009081526037602090815260408083208984529091529020556132de8661275d565b6001600160a01b0380881660008181526036602090815260408083208b84528252808320959095559181526038825283812089905591861682526039905220555b6001600160a01b038516600090815260376020908152604080832087845290915290205483146133a8576001600160a01b03851660008181526037602090815260408083208584528252808320548884528184205494845260339092529091205461338e92610a7c9190613a05565b6001600160a01b0386166000908152603360205260409020555b6001600160a01b03851660008181526036602052604081207f1cc14bf94d8329e459fdcf4f38c293236b70411487793b5c07ac7448c788c252916133ea6139bf565b81526020019081526020016000205460376000896001600160a01b03166001600160a01b0316815260200190815260200160002060006134286139bf565b815260200190815260200160002054604051808381526020018281526020019250505060405180910390a25050505050565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156134a857600080fd5b505afa1580156134bc573d6000803e3d6000fd5b505050506040513d60208110156134d257600080fd5b50516001600160a01b031633148061356b5750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561353357600080fd5b505afa158015613547573d6000803e3d6000fd5b505050506040513d602081101561355d57600080fd5b50516001600160a01b031633145b6135a65760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b60006135b06139bf565b6001600160a01b0383166000908152603e60205260408120549192509015613601576001600160a01b0383166000908152603e60205260409020546135fc90839063ffffffff6139c316565b613604565b60005b9050613785613612846118d1565b1561374b57613746613623856118d1565b603b5460408051639895880f60e01b81529051610a7c926001600160a01b031691639895880f916004808301926020929190829003018186803b15801561366957600080fd5b505afa15801561367d573d6000803e3d6000fd5b505050506040513d602081101561369357600080fd5b505160408051637a78a94360e01b81526001600160a01b038a8116600483015291519190921691637a78a943916024808301926020929190829003018186803b1580156136df57600080fd5b505afa1580156136f3573d6000803e3d6000fd5b505050506040513d602081101561370957600080fd5b50516001600160a01b038816600090815260366020908152604080832060388352818420548452909152902054610a57908763ffffffff613a0516565b61374e565b60005b6001600160a01b0385166000908152603c60209081526040808320603e83528184205484529091529020549063ffffffff61396516565b6001600160a01b0384166000818152603c60209081526040808320878452808352818420958655848452603e83528184208890559287905291815292548151908152905191927f2aa34452d1f231efd3e8dc3eae64938dbfa82f1b40e2b994e1a395d7ed27ae5b92918290030190a2505050565b60396020526000908152604090205481565b600080603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561385c57600080fd5b505afa158015613870573d6000803e3d6000fd5b505050506040513d602081101561388657600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03868116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b1580156138d257600080fd5b505afa1580156138e6573d6000803e3d6000fd5b505050506040513d60208110156138fc57600080fd5b50516001600160a01b038116600090815260356020526040902054909150613928576000915050610a8e565b61106d613934846118d1565b6001600160a01b038316600090815260356020526040902054610a7c90670de0b6b3a764000063ffffffff613a0516565b600082820183811015611a10576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b4390565b6000611a1083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506145f6565b600082613a1457506000610fdd565b82820282848281613a2157fe5b0414611a105760405162461bcd60e51b815260040180806020018281038252602181526020018061478b6021913960400191505060405180910390fd5b6000611a1083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061468d565b603b5460408051639895880f60e01b815290516000926001600160a01b031691639895880f916004808301926020929190829003018186803b158015613ae557600080fd5b505afa158015613af9573d6000803e3d6000fd5b505050506040513d6020811015613b0f57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03858116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015613b5b57600080fd5b505afa158015613b6f573d6000803e3d6000fd5b505050506040513d6020811015613b8557600080fd5b505190506001600160a01b03811615611fa757806001600160a01b0316633af9e669603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015613bf557600080fd5b505afa158015613c09573d6000803e3d6000fd5b505050506040513d6020811015613c1f57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301525160248083019260209291908290030181600087803b158015613c6857600080fd5b505af1158015613c7c573d6000803e3d6000fd5b505050506040513d6020811015613c9257600080fd5b50516001600160a01b0382166000908152603560205260409020555050565b600080603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015613d0257600080fd5b505afa158015613d16573d6000803e3d6000fd5b505050506040513d6020811015613d2c57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03888116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015613d7857600080fd5b505afa158015613d8c573d6000803e3d6000fd5b505050506040513d6020811015613da257600080fd5b505190506000613db1866118d1565b90506000846004811115613dc157fe5b1480613dd857506003846004811115613dd657fe5b145b1561409a576000846004811115613deb57fe5b1415613e0857613e01818663ffffffff61396516565b9050613e4b565b6001600160a01b038616600090815260336020526040902054613e31908663ffffffff6139c316565b6001600160a01b0387166000908152603360205260409020555b6001600160a01b038616600090815260346020526040812054613e74908763ffffffff61396516565b90506001600160a01b03831615801590613f1b5750613f186064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663268c74e46040518163ffffffff1660e01b815260040160206040518083038186803b158015613edf57600080fd5b505afa158015613ef3573d6000803e3d6000fd5b505050506040513d6020811015613f0957600080fd5b5051859063ffffffff613a0516565b81115b15614051576000613fc1613fb46064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663c36938966040518163ffffffff1660e01b815260040160206040518083038186803b158015613f7b57600080fd5b505afa158015613f8f573d6000803e3d6000fd5b505050506040513d6020811015613fa557600080fd5b5051879063ffffffff613a0516565b839063ffffffff6139c316565b6001600160a01b038516600090815260356020526040902054909550859150613ff0908263ffffffff61396516565b6001600160a01b03808616600090815260356020908152604080832094909455918b16815260349091522054614032908290610a4b908a63ffffffff61396516565b6001600160a01b03891660009081526034602052604090205550614094565b6001600160a01b03871660009081526034602052604090205461407a908763ffffffff61396516565b6001600160a01b0388166000908152603460205260409020555b506145e7565b60048460048111156140a857fe5b14156140f5576001600160a01b0386166000908152603360205260409020546140d7908663ffffffff6139c316565b6001600160a01b0387166000908152603360205260409020556145e7565b600184600481111561410357fe5b14156141ed576001600160a01b03861660009081526033602052604090205415614189578461413187611dba565b1015614184576040805162461bcd60e51b815260206004820181905260248201527f4c61636b206f66206c6971756964697479207768656e2077697468647261772e604482015290519081900360640190fd5b6141dd565b8461419387611dba565b10156141dd576001600160a01b0382166000908152603560205260409020546141c390869063ffffffff6139c316565b6001600160a01b0387166000908152603460205260409020555b6141e6866118d1565b905061424a565b846141f787611dba565b101561424a576040805162461bcd60e51b815260206004820152601e60248201527f4c61636b206f66206c6971756964697479207768656e20626f72726f772e0000604482015290519081900360640190fd5b600184600481111561425857fe5b14156142755761426e818663ffffffff6139c316565b90506142b8565b6001600160a01b03861660009081526033602052604090205461429e908663ffffffff61396516565b6001600160a01b0387166000908152603360205260409020555b6001600160a01b03861660009081526034602052604081205486106142de576000614307565b6001600160a01b038716600090815260346020526040902054614307908763ffffffff6139c316565b90506001600160a01b0383161580159061437d575081158061437d575061437a6064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b0316635a596d1c6040518163ffffffff1660e01b815260040160206040518083038186803b158015613edf57600080fd5b81105b156145a2576001600160a01b03808416600090815260356020908152604080832054938b168352603490915281205490916143c4918991610a4b919063ffffffff61396516565b90506144556064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663c36938966040518163ffffffff1660e01b815260040160206040518083038186803b15801561441c57600080fd5b505afa158015614430573d6000803e3d6000fd5b505050506040513d602081101561444657600080fd5b5051869063ffffffff613a0516565b811015614494576001600160a01b038085166000908152603560209081526040808320805490849055938c16835260349091529020829055945061459c565b6000614528613fb46064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663c36938966040518163ffffffff1660e01b815260040160206040518083038186803b1580156144ef57600080fd5b505afa158015614503573d6000803e3d6000fd5b505050506040513d602081101561451957600080fd5b5051889063ffffffff613a0516565b6001600160a01b038616600090815260356020526040902054909150614554908263ffffffff6139c316565b6001600160a01b03861660009081526035602052604090208290559550614581828263ffffffff6139c316565b6001600160a01b038a16600090815260346020526040902055505b506145e5565b6001600160a01b0387166000908152603460205260409020546145cb908763ffffffff6139c316565b6001600160a01b0388166000908152603460205260409020555b505b50509392505050565b303b1590565b600081848411156146855760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561464a578181015183820152602001614632565b50505050905090810190601f1680156146775780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836146dc5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561464a578181015183820152602001614632565b5060008385816146e857fe5b049594505050505056fe5f6465706f736974526174655265636f72645374617274206973206e6f74206120636865636b20706f696e74206f6e20696e6465782063757276652e546f6b656e20426f72726f775072696e636970616c206d7573742062652067726561746572207468616e20302e20546f206465706f7369742062616c616e63652c20706c6561736520757365206465706f73697420627574746f6e2e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65644f6e6c7920617574686f72697a656420746f2063616c6c2066726f6d20446546696e657220696e7465726e616c20636f6e7472616374732e5f626f72726f77526174655265636f72645374617274206973206e6f74206120636865636b20706f696e74206f6e20696e6465782063757276652ea265627a7a72315820757185121399a527a64ac4f04319dcd8b650fb25ccba9f3ca4843c1dbe0ef84664736f6c634300050e0032

Deployed Bytecode Sourcemap

12871:27736:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12871:27736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14015:67;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14015:67:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;35942:379;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35942:379:0;-1:-1:-1;;;;;35942:379:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35345:500;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35345:500:0;-1:-1:-1;;;;;35345:500:0;;:::i;38084:1023::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;38084:1023:0;;;;;;;;;;;;;;;;;:::i;13250:66::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13250:66:0;;;;;;;;:::i;14156:59::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14156:59:0;-1:-1:-1;;;;;14156:59:0;;:::i;30160:366::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30160:366:0;;;;;;;;:::i;12953:45::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12953:45:0;-1:-1:-1;;;;;12953:45:0;;:::i;13127:48::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13127:48:0;-1:-1:-1;;;;;13127:48:0;;:::i;14089:60::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14089:60:0;-1:-1:-1;;;;;14089:60:0;;:::i;28343:317::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28343:317:0;-1:-1:-1;;;;;28343:317:0;;:::i;13036:47::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13036:47:0;-1:-1:-1;;;;;13036:47:0;;:::i;37343:733::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37343:733:0;;;;;;;;;;;;;;;;;:::i;:::-;;40514:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40514:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13940:68;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13940:68:0;;;;;;;;:::i;29463:377::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;29463:377:0;;;;;;;;:::i;24427:146::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24427:146:0;-1:-1:-1;;;;;24427:146:0;;:::i;21583:307::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21583:307:0;;-1:-1:-1;;;;;21583:307:0;;;;;;;;;;;;;:::i;27535:549::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27535:549:0;-1:-1:-1;;;;;27535:549:0;;:::i;15517:343::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15517:343:0;-1:-1:-1;;;;;15517:343:0;;:::i;13538:46::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13538:46:0;-1:-1:-1;;;;;13538:46:0;;:::i;10519:77::-;;;:::i;:::-;;;;-1:-1:-1;;;;;10519:77:0;;;;;;;;;;;;;;13393:64;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13393:64:0;;;;;;;;:::i;36519:816::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36519:816:0;;;;;;;;;;;;;;;;;:::i;36329:182::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36329:182:0;-1:-1:-1;;;;;36329:182:0;;:::i;15272:131::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15272:131:0;-1:-1:-1;;;;;15272:131:0;;:::i;24730:2480::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24730:2480:0;-1:-1:-1;;;;;24730:2480:0;;:::i;23340:1079::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23340:1079:0;-1:-1:-1;;;;;23340:1079:0;;:::i;10769:49::-;;;:::i;10603:52::-;;;:::i;34579:649::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34579:649:0;-1:-1:-1;;;;;34579:649:0;;:::i;39415:899::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39415:899:0;;;;;;;;;;;;;;;;;:::i;30729:3602::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30729:3602:0;-1:-1:-1;;;;;30729:3602:0;;:::i;22229:1103::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22229:1103:0;-1:-1:-1;;;;;22229:1103:0;;:::i;13671:54::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13671:54:0;-1:-1:-1;;;;;13671:54:0;;:::i;28763:353::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28763:353:0;-1:-1:-1;;;;;28763:353:0;;:::i;14015:67::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;35942:379::-;36002:16;36020:13;36035:22;36059:23;36112:28;36133:6;36112:20;:28::i;:::-;-1:-1:-1;;;;;36151:18:0;;;;;;;:10;:18;;;;;;;;;36180:12;:20;;;;;;36250:12;;:32;;-1:-1:-1;;;36250:32:0;;;;36151:18;;36180:20;;36211:91;;36236:13;;36151:18;;36250:12;;;;;:30;;:32;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;36250:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36250:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36250:32:0;:50;;;-1:-1:-1;;;36250:50:0;;-1:-1:-1;;;;;36250:50:0;;;;;;;;;:42;;;;;;;:50;;;;;:32;;:50;;;;;;;:42;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;36250:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36250:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36250:50:0;-1:-1:-1;;;;;36236:65:0;;;;;36250:50;36236:65;;;;;;;;;;;-1:-1:-1;36236:65:0;;;;36211:20;;;;;:12;:20;;;;;;;:91;:24;:91;:::i;:::-;36094:219;;;;;;;;35942:379;;;;;:::o;35345:500::-;-1:-1:-1;;;;;35440:22:0;;35409:4;35440:22;;;:14;:22;;;;;;35541:8;35538:41;;-1:-1:-1;10638:17:0;;-1:-1:-1;35564:15:0;;35538:41;-1:-1:-1;;;;;35620:23:0;;35590:27;35620:23;;;:15;:23;;;;;;;;:28;;;;;;;;;;35688:29;35636:6;35688:21;:29::i;:::-;35659:58;-1:-1:-1;35735:102:0;10638:17;35735:88;35759:63;10638:17;35759:49;35659:58;35759:25;35780:3;35759:16;:14;:16::i;:::-;:20;:25;:20;:25;:::i;:::-;:29;:49;:29;:49;:::i;:::-;:53;:63;:53;:63;:::i;:::-;35735:19;;:88;:23;:88;:::i;:::-;:92;:102;:92;:102;:::i;:::-;35728:109;;;;;35345:500;;;;:::o;38084:1023::-;14291:12;;:28;;;-1:-1:-1;;;14291:28:0;;;;38177:4;;-1:-1:-1;;;;;14291:12:0;;:26;;:28;;;;;;;;;;;;;;:12;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38249:30;38272:6;38249:22;:30::i;:::-;38290:28;38311:6;38290:20;:28::i;:::-;38364:12;;:23;;;-1:-1:-1;;;38364:23:0;;;;38422:1;;-1:-1:-1;;;;;38364:12:0;;:21;;:23;;;;;;;;;;;;;;:12;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;38364:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38364:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38364:23:0;:55;;;-1:-1:-1;;;38364:55:0;;-1:-1:-1;;;;;38364:55:0;;;;;;;;;;;;;;;;:42;;;;;;;:55;;;;;:23;;:55;;;;;;;:42;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;38364:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38364:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38364:55:0;:59;38356:187;;;;-1:-1:-1;;;38356:187:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38602:12;;:23;;;-1:-1:-1;;;38602:23:0;;;;38585:14;;-1:-1:-1;;;;;38602:12:0;;:21;;:23;;;;;;;;;;;;;;:12;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;38602:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38602:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38602:23:0;:51;;;-1:-1:-1;;;38602:51:0;;-1:-1:-1;;;;;38602:51:0;;;;;;;;;;;;;;;;;;;;;;:29;;;;;;;:51;;;;;:23;;:51;;;;;;;-1:-1:-1;38602:29:0;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;38602:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38602:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38602:51:0;;-1:-1:-1;38817:19:0;38839:59;38846:6;38854:19;:7;38602:51;38854:19;:11;:19;:::i;:::-;38875:22;38839:6;:59::i;:::-;38817:81;-1:-1:-1;38912:18:0;;38909:112;;38946:12;;;;;;;;;-1:-1:-1;;;;;38946:12:0;-1:-1:-1;;;;;38946:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38946:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38946:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38946:28:0;:63;;;-1:-1:-1;;;38946:63:0;;-1:-1:-1;;;;;38946:63:0;;;;;;;;;;;;;;;:39;;;;;;;:63;;;;;-1:-1:-1;;38946:63:0;;;;;;;-1:-1:-1;38946:39:0;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;38946:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38946:63:0;;;;38909:112;39080:19;:7;39092:6;39080:19;:11;:19;:::i;:::-;39073:26;38084:1023;-1:-1:-1;;;;;;38084:1023:0:o;13250:66::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14156:59::-;;;;;;;;;;;;;:::o;30160:366::-;-1:-1:-1;;;;;30299:23:0;;30258:7;30299:23;;;:15;:23;;;;;;;;:47;;;;;;;;;30365:15;30357:87;;;;-1:-1:-1;;;30357:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30462:56;30507:10;30462:40;10638:17;30462:26;30481:6;30462:18;:26::i;:56::-;30455:63;;;30160:366;;;;;:::o;12953:45::-;;;;;;;;;;;;;:::o;13127:48::-;;;;;;;;;;;;;:::o;14089:60::-;;;;;;;;;;;;;:::o;28343:317::-;28415:4;28432:24;28459:28;28480:6;28459:20;:28::i;:::-;28432:55;-1:-1:-1;28501:21:0;28498:155;;28546:1;28539:8;;;;;28498:155;-1:-1:-1;;;;;28587:18:0;;;;;;:10;:18;;;;;;:54;;28624:16;;28587:32;;10638:17;28587:32;:22;:32;:::i;:54::-;28580:61;;;;;13036:47;;;;;;;;;;;;;:::o;37343:733::-;14291:12;;;;;;;;;-1:-1:-1;;;;;14291:12:0;-1:-1:-1;;;;;14291:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37497:30;37520:6;37497:22;:30::i;:::-;37538:28;37559:6;37538:20;:28::i;:::-;37621:12;;;;;;;;;-1:-1:-1;;;;;37621:12:0;-1:-1:-1;;;;;37621:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37621:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37621:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37621:23:0;:54;;;-1:-1:-1;;;37621:54:0;;-1:-1:-1;;;;;37621:54:0;;;;;;;;;;;;;;;;;;;;;;:30;;;;;;;:54;;;;;-1:-1:-1;;37621:54:0;;;;;;;-1:-1:-1;37621:30:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;37621:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37621:54:0;;;;37871:19;37893:48;37900:6;37908:7;37917:23;37893:6;:48::i;:::-;37871:70;-1:-1:-1;37957:18:0;;37954:115;;37992:12;;;;;;;;;-1:-1:-1;;;;;37992:12:0;-1:-1:-1;;;;;37992:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37992:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37992:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37992:28:0;:65;;;-1:-1:-1;;;37992:65:0;;-1:-1:-1;;;;;37992:65:0;;;;;;;;;;;;;;;:41;;;;;;;:65;;;;;-1:-1:-1;;37992:65:0;;;;;;;-1:-1:-1;37992:41:0;:65;;;5:2:-1;;;;30:1;27;20:12;5:2;37992:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37992:65:0;;;;37954:115;14455:1;37343:733;;;:::o;40514:88::-;40579:15;;;;;;;;;;;;-1:-1:-1;;;40579:15:0;;;;40514:88;:::o;13940:68::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;29463:377::-;-1:-1:-1;;;;;29605:25:0;;29563:7;29605:25;;;:17;:25;;;;;;;;:50;;;;;;;;;29674:16;29666:89;;;;-1:-1:-1;;;29666:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29773:59;29820:11;29773:42;10638:17;29773:28;29794:6;29773:20;:28::i;24427:146::-;14291:12;;;;;;;;;-1:-1:-1;;;;;14291:12:0;-1:-1:-1;;;;;14291:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24497:30;24520:6;24497:22;:30::i;:::-;24538:27;24558:6;24538:19;:27::i;:::-;24427:146;:::o;21583:307::-;14291:12;;:28;;;-1:-1:-1;;;14291:28:0;;;;21679:22;;-1:-1:-1;;;;;14291:12:0;;:26;;:28;;;;;;;;;;;;;;:12;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21714:27;21734:6;21714:19;:27::i;:::-;21806:44;21825:6;21833:7;21842;21806:18;:44::i;:::-;21789:61;21583:307;-1:-1:-1;;;;21583:307:0:o;27535:549::-;27603:4;27620:26;27649:29;27671:6;27649:21;:29::i;:::-;27620:58;;27689:24;27716:34;27743:6;27716:26;:34::i;:::-;27689:61;;27765:12;;;;;;;;;-1:-1:-1;;;;;27765:12:0;-1:-1:-1;;;;;27765:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27765:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27765:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27765:32:0;:62;;;-1:-1:-1;;;27765:62:0;;-1:-1:-1;;;;;27765:62:0;;;;;;;;;:54;;;;;;;:62;;;;;:32;;:62;;;;;;;:54;:62;;;5:2:-1;;;;30:1;27;20:12;5:2;27765:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27765:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27765:62:0;27761:142;;27849:54;10638:17;27849:40;:18;27872:16;27849:40;:22;:40;:::i;:54::-;27842:61;;;;;;27761:142;-1:-1:-1;;;;;28027:20:0;;;;;;:12;:20;;;;;:33;;;;27968:40;;;;;27923:153;;10638:17;;27923:139;;27968:93;;:40;:93;:58;:93;:::i;:::-;27923:40;:18;27946:16;27923:40;:22;:40;:::i;15517:343::-;15583:4;15600:14;15617:12;;;;;;;;;-1:-1:-1;;;;;15617:12:0;-1:-1:-1;;;;;15617:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15617:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15617:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15617:32:0;:50;;;-1:-1:-1;;;15617:50:0;;-1:-1:-1;;;;;15617:50:0;;;;;;;;;:42;;;;;;;:50;;;;;:32;;:50;;;;;;;:42;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;15617:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15617:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15617:50:0;-1:-1:-1;;;;;15797:20:0;;;;;;;:12;15617:50;15797:20;;;;;;;;15773:10;:18;;;;;;15747:21;;;;;:13;:21;;;;;;;15617:50;;-1:-1:-1;15747:71:0;;15797:20;;15747:45;;:21;:45;:25;:45;:::i;:71::-;15740:78;15517:343;-1:-1:-1;;;15517:343:0:o;13538:46::-;;;;;;;;;;;;;:::o;10519:77::-;10554:42;10519:77;:::o;13393:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;36519:816::-;14291:12;;;;;;;;;-1:-1:-1;;;;;14291:12:0;-1:-1:-1;;;;;14291:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36627:12;36619:39;;;;;-1:-1:-1;;;36619:39:0;;;;;;;;;;;;-1:-1:-1;;;36619:39:0;;;;;;;;;;;;;;;36724:30;36747:6;36724:22;:30::i;:::-;36765:29;36787:6;36765:21;:29::i;:::-;36914:12;;;;;;;;;-1:-1:-1;;;;;36914:12:0;-1:-1:-1;;;;;36914:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36914:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36914:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36914:23:0;:53;;;-1:-1:-1;;;36914:53:0;;-1:-1:-1;;;;;36914:53:0;;;;;;;;;;;;;;;;;;;;;;:31;;;;;;;:53;;;;;-1:-1:-1;;36914:53:0;;;;;;;-1:-1:-1;36914:31:0;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;36914:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36914:53:0;;;;37131:19;37153:49;37160:6;37168:7;37177:24;37153:6;:49::i;:::-;37131:71;-1:-1:-1;37218:18:0;;37215:113;;37253:12;;;;;;;;;-1:-1:-1;;;;;37253:12:0;-1:-1:-1;;;;;37253:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37253:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37253:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37253:28:0;:63;;;-1:-1:-1;;;37253:63:0;;-1:-1:-1;;;;;37253:63:0;;;;;;;;;;;;;;;:39;;;;;;;:63;;;;;-1:-1:-1;;37253:63:0;;;;;;;-1:-1:-1;37253:39:0;:63;;;5:2:-1;;;;30:1;27;20:12;36329:182:0;36388:4;36412:91;36437:13;:65;36451:12;;;;;;;;;-1:-1:-1;;;;;36451:12:0;-1:-1:-1;;;;;36451:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36451:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36451:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36451:32:0;:50;;;-1:-1:-1;;;36451:50:0;;-1:-1:-1;;;;;36451:50:0;;;;;;;;;:42;;;;;;;:50;;;;;:32;;:50;;;;;;;:42;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;36451:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36451:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36451:50:0;-1:-1:-1;;;;;36437:65:0;;;;;36451:50;36437:65;;;;;;;;;;;-1:-1:-1;36437:65:0;;;;36412:20;;;;;:12;:20;;;;;;;:91;:24;:91;:::i;15272:131::-;11845:12;;;;;;;;:31;;;11861:15;:13;:15::i;:::-;11845:47;;;-1:-1:-1;11881:11:0;;;;11880:12;11845:47;11837:106;;;;-1:-1:-1;;;11837:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11952:19;11975:12;;;;;;11974:13;11994:83;;;;12023:12;:19;;-1:-1:-1;;;;12023:19:0;;;;;12051:18;12038:4;12051:18;;;11994:83;15367:12;:28;;-1:-1:-1;;;;;;15367:28:0;-1:-1:-1;;;;;15367:28:0;;;;;12095:57;;;;12139:5;12124:20;;-1:-1:-1;;12124:20:0;;;12095:57;15272:131;;:::o;24730:2480::-;24797:4;24814:31;24848:34;24875:6;24848:26;:34::i;:::-;24814:68;;24972:25;25000:12;;;;;;;;;-1:-1:-1;;;;;25000:12:0;-1:-1:-1;;;;;25000:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25000:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25000:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25000:32:0;25204:12;;:40;;;-1:-1:-1;;;25204:40:0;;;;25000:32;;-1:-1:-1;25134:22:0;;25159:86;;-1:-1:-1;;;;;25204:12:0;;:38;;:40;;;;;25000:32;;25204:40;;;;;;;:12;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;25204:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25204:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25204:40:0;-1:-1:-1;;;;;25159:20:0;;;;;;:12;25204:40;25159:20;;;;:40;;;;:86;:44;:86;:::i;:::-;25134:111;;25347:22;25372:85;25416:12;;;;;;;;;-1:-1:-1;;;;;25416:12:0;-1:-1:-1;;;;;25416:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25416:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25416:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25416:40:0;-1:-1:-1;;;;;25372:20:0;;;;;;:12;25416:40;25372:20;;;;:39;;;;:85;:43;:85;:::i;:::-;25347:110;-1:-1:-1;25540:27:0;25570:37;10638:17;25583:23;25570:37;:12;:37;:::i;:::-;25540:67;;25620:26;25649:12;;;;;;;;;-1:-1:-1;;;;;25649:12:0;-1:-1:-1;;;;;25649:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25649:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25649:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25649:32:0;:62;;;-1:-1:-1;;;25649:62:0;;-1:-1:-1;;;;;25649:62:0;;;;;;;;;:54;;;;;;;:62;;;;;:32;;:62;;;;;;;:54;:62;;;5:2:-1;;;;30:1;27;20:12;5:2;25649:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25649:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25649:62:0;;-1:-1:-1;25722:1481:0;;;;25763:32;25798:42;25837:2;25798:34;:14;25817;25798:34;:18;:34;:::i;:42::-;25763:77;;25855:20;26009:23;25982;:51;25979:688;;;26206:46;10811:7;26206:25;:17;26228:2;26206:25;:21;:25;:::i;:46::-;26191:61;-1:-1:-1;26278:42:0;:24;26191:61;26278:42;:28;:42;:::i;:::-;26271:49;;;;;;;;;;;;25979:688;26508:75;10811:7;26508:54;26542:19;26508:54;:17;26530:6;26508:29;:21;:29;:::i;25722:1481::-;26810:23;26783;:51;26780:412;;;26943:46;10811:7;26943:25;:17;26965:2;26943:25;:21;:25;:::i;:46::-;26936:53;;;;;;;;;;26780:412;27101:75;10811:7;27101:54;27135:19;27101:54;:17;27123:6;27101:29;:21;:29;:::i;23340:1079::-;14291:12;;;;;;;;;-1:-1:-1;;;;;14291:12:0;-1:-1:-1;;;;;14291:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23418:17;23438:16;:14;:16::i;:::-;-1:-1:-1;;;;;23660:35:0;;23465:15;23660:35;;;:27;:35;;;;;;23418:36;;-1:-1:-1;23465:15:0;23660:40;:100;;-1:-1:-1;;;;;23724:35:0;;;;;;:27;:35;;;;;;23707:53;;:12;;:53;:16;:53;:::i;:::-;23660:100;;;23703:1;23660:100;-1:-1:-1;;;;;24013:18:0;;;;;;:10;:18;;;;;;23647:113;;-1:-1:-1;23931:331:0;;24013:23;:248;;24043:218;24242:10;:18;24253:6;-1:-1:-1;;;;;24242:18:0;-1:-1:-1;;;;;24242:18:0;;;;;;;;;;;;;24043:172;24155:12;;;;;;;;;-1:-1:-1;;;;;24155:12:0;-1:-1:-1;;;;;24155:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24155:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24155:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24155:32:0;:59;;;-1:-1:-1;;;24155:59:0;;-1:-1:-1;;;;;24155:59:0;;;;;;;;;:51;;;;;;;:59;;;;;:32;;:59;;;;;;;:51;:59;;;5:2:-1;;;;30:1;27;20:12;5:2;24155:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24155:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24155:59:0;-1:-1:-1;;;;;24043:23:0;;;;;;:15;24155:59;24043:23;;;;;;;24067:14;:22;;;;;;24043:47;;;;;;;;:85;;24117:10;24043:85;:73;:85;:::i;:218::-;24013:248;;;24039:1;24013:248;-1:-1:-1;;;;;23931:26:0;;;;;;:18;:26;;;;;;;;23958:27;:35;;;;;;23931:63;;;;;;;;;:331;:67;:331;:::i;:::-;-1:-1:-1;;;;;23888:26:0;;;;;;:18;:26;;;;;;;;:40;;;;;;;;;:374;;;24273:35;;;:27;:35;;;;;:50;;;24370:40;;;;;;;;;24341:70;;;;;;;23888:26;;24341:70;;;;;;;;;14455:1;;23340:1079;:::o;10769:49::-;10811:7;10769:49;:::o;10603:52::-;10638:17;10603:52;:::o;34579:649::-;-1:-1:-1;;;;;34676:22:0;;34645:4;34676:22;;;:14;:22;;;;;;34777:8;34774:41;;-1:-1:-1;10638:17:0;;-1:-1:-1;34800:15:0;;34774:41;-1:-1:-1;;;;;34860:25:0;;34828:29;34860:25;;;:17;:25;;;;;;;;:30;;;;;;;;;;34931;34878:6;34931:22;:30::i;39415:899::-;14291:12;;:28;;;-1:-1:-1;;;14291:28:0;;;;39513:4;;-1:-1:-1;;;;;14291:12:0;;:26;;:28;;;;;;;;;;;;;;:12;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39540:12;39532:39;;;;;-1:-1:-1;;;39532:39:0;;;;;;;;;;;;-1:-1:-1;;;39532:39:0;;;;;;;;;;;;;;;39637:30;39660:6;39637:22;:30::i;:::-;39678:29;39700:6;39678:21;:29::i;:::-;39772:12;;:23;;;-1:-1:-1;;;39772:23:0;;;;39758:11;;-1:-1:-1;;;;;39772:12:0;;:21;;:23;;;;;;;;;;;;;;:12;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;39772:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39772:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39772:23:0;:56;;;-1:-1:-1;;;39772:56:0;;-1:-1:-1;;;;;39772:56:0;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;:56;;;;;:23;;:56;;;;;;;-1:-1:-1;39772:32:0;:56;;;5:2:-1;;;;30:1;27;20:12;5:2;39772:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39772:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39772:56:0;;-1:-1:-1;40024:19:0;40046:49;40053:6;39772:56;40069:25;40046:6;:49::i;:::-;40024:71;-1:-1:-1;40169:18:0;;40166:115;;40204:12;;;;;;;;;-1:-1:-1;;;;;40204:12:0;-1:-1:-1;;;;;40204:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40204:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40204:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40204:28:0;:65;;;-1:-1:-1;;;40204:65:0;;-1:-1:-1;;;;;40204:65:0;;;;;;;;;;;;;;;:41;;;;;;;:65;;;;;-1:-1:-1;;40204:65:0;;;;;;;-1:-1:-1;40204:41:0;:65;;;5:2:-1;;;;30:1;27;20:12;5:2;40204:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40204:65:0;;;;40166:115;-1:-1:-1;40300:6:0;39415:899;-1:-1:-1;;;;39415:899:0:o;30729:3602::-;14291:12;;;;;;;;;-1:-1:-1;;;;;14291:12:0;-1:-1:-1;;;;;14291:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30870:16;30889;:14;:16::i;:::-;-1:-1:-1;;;;;30935:22:0;;;;;;:14;:22;;;;;;30870:35;;-1:-1:-1;30920:37:0;;30916:63;;;30972:7;;;30916:63;31042:12;;:32;;;-1:-1:-1;;;31042:32:0;;;;10638:17;;30991:12;;-1:-1:-1;;;;;31042:12:0;;;;:30;;:32;;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;31042:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31042:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31042:32:0;:50;;;-1:-1:-1;;;31042:50:0;;-1:-1:-1;;;;;31042:50:0;;;;;;;;;:42;;;;;;;:50;;;;;:32;;:50;;;;;;;:42;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;31042:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31042:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31042:50:0;-1:-1:-1;;;;;31204:22:0;;31175:26;31204:22;;;:14;31042:50;31204:22;;;;;31042:50;;-1:-1:-1;31241:27:0;31237:2692;;-1:-1:-1;;;;;31288:20:0;;31285:1225;;-1:-1:-1;;;;;31329:20:0;;31362:5;31329:20;;;:12;:20;;;;;;;;:38;;-1:-1:-1;;31329:38:0;;;31386:15;:23;;;;;:36;;;;;;;;:43;;;31448:25;;;:17;:25;;;;;:38;;;;;;;;:45;;;31559:22;;;:14;:22;;;:36;;;31285:1225;;;-1:-1:-1;;;;;31649:20:0;;;;;;;:12;:20;;;;;;;;:37;;-1:-1:-1;;31649:37:0;31682:4;31649:37;;;31731;;-1:-1:-1;;;31731:37:0;;;;31649:20;;31731:35;;;;;:37;;;;;31649:20;;31731:37;;;;;;31649:20;31731:35;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;31731:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31731:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31731:37:0;;-1:-1:-1;31935:31:0;31959:6;31935:23;:31::i;:::-;31899:12;:20;31912:6;-1:-1:-1;;;;;31899:20:0;-1:-1:-1;;;;;31899:20:0;;;;;;;;;;;;:33;;:67;;;;32035:6;-1:-1:-1;;;;;32027:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32027:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32027:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32027:36:0;-1:-1:-1;;;;;31985:20:0;;;;;;;:12;32027:36;31985:20;;;;;;;;:39;;:78;;;;32143:36;;-1:-1:-1;;;32143:36:0;;;;:34;;;;;;:36;;;;;;;;;;:34;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;32143:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32143:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32143:36:0;-1:-1:-1;;;;;32100:20:0;;;;;;;:12;32143:36;32100:20;;;;;;;:40;;:79;;;;32215:15;:23;;;;;:36;;;;;;;;:43;;;32277:25;;;:17;:25;;;;;:38;;;;;;;;:45;;;32388:22;;;:14;:22;;;;;:36;;;32443:30;;;;;:22;:30;;;:51;31285:1225;31237:2692;;;-1:-1:-1;;;;;32547:20:0;;32544:1374;;-1:-1:-1;;;;;32588:20:0;;32621:5;32588:20;;;:12;:20;;;;;:38;;-1:-1:-1;;32588:38:0;;;32684:26;32601:6;32684:18;:26::i;:::-;-1:-1:-1;;;;;32645:23:0;;;;;;:15;:23;;;;;;;;:36;;;;;;;;:65;32770:28;32661:6;32770:20;:28::i;:::-;-1:-1:-1;;;;;32729:25:0;;;;;;:17;:25;;;;;;;;:38;;;;;;;;:69;;;;32864:22;;;:14;:22;;;;:36;;;32544:1374;;;-1:-1:-1;;;;;32941:20:0;;;;;;;:12;:20;;;;;;;;:37;;-1:-1:-1;;32941:37:0;32974:4;32941:37;;;33023;;-1:-1:-1;;;33023:37:0;;;;32941:20;;33023:35;;;;;:37;;;;;32941:20;;33023:37;;;;;;32941:20;33023:35;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;33023:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33023:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33023:37:0;;-1:-1:-1;33227:31:0;33251:6;33227:23;:31::i;:::-;33191:12;:20;33204:6;-1:-1:-1;;;;;33191:20:0;-1:-1:-1;;;;;33191:20:0;;;;;;;;;;;;:33;;:67;;;;33327:6;-1:-1:-1;;;;;33319:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33319:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33319:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33319:36:0;-1:-1:-1;;;;;33277:20:0;;;;;;:12;33319:36;33277:20;;;;;;;:39;;:78;;;;33534:14;:22;;;;33417:141;;33518:39;;:11;;:39;:15;:39;:::i;:::-;-1:-1:-1;;;;;33450:30:0;;;;;;:22;:30;;;;;;33417:96;;33508:4;;33417:64;;:96;:18;33508:4;33417:28;:22;:28;:::i;:141::-;-1:-1:-1;;;;;33374:20:0;;;;;;:12;:20;;;;;:40;;:184;33616:26;33387:6;33616:18;:26::i;:::-;-1:-1:-1;;;;;33577:23:0;;;;;;:15;:23;;;;;;;;:36;;;;;;;;:65;33702:28;33593:6;33702:20;:28::i;:::-;-1:-1:-1;;;;;33661:25:0;;;;;;;:17;:25;;;;;;;;:38;;;;;;;;:69;;;;33796:22;;;:14;:22;;;;;:36;;;33851:30;;;;;:22;:30;;;:51;32544:1374;-1:-1:-1;;;;;33978:23:0;;;;;;:15;:23;;;;;;;;:36;;;;;;;;;:44;;33975:224;;-1:-1:-1;;;;;34143:23:0;;;;;;:15;:23;;;;;;;;:43;;;;;;;;;34083:36;;;;;;;34060:18;;;:10;:18;;;;;;;:127;;:60;;:18;:22;:60::i;:127::-;-1:-1:-1;;;;;34039:18:0;;;;;;:10;:18;;;;;:148;33975:224;-1:-1:-1;;;;;34216:107:0;;34236:25;;;;:17;:25;;;;;34216:107;;34262:16;:14;:16::i;:::-;34236:43;;;;;;;;;;;;34281:15;:23;34297:6;-1:-1:-1;;;;;34281:23:0;-1:-1:-1;;;;;34281:23:0;;;;;;;;;;;;:41;34305:16;:14;:16::i;:::-;34281:41;;;;;;;;;;;;34216:107;;;;;;;;;;;;;;;;;;;;;;;;14455:1;;;;30729:3602;:::o;22229:1103::-;14291:12;;;;;;;;;-1:-1:-1;;;;;14291:12:0;-1:-1:-1;;;;;14291:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22308:17;22328:16;:14;:16::i;:::-;-1:-1:-1;;;;;22552:36:0;;22355:15;22552:36;;;:28;:36;;;;;;22308;;-1:-1:-1;22355:15:0;22552:41;:102;;-1:-1:-1;;;;;22617:36:0;;;;;;:28;:36;;;;;;22600:54;;:12;;:54;:16;:54;:::i;:::-;22552:102;;;22596:1;22552:102;22539:115;;22827:345;22911:28;22932:6;22911:20;:28::i;:::-;:33;:260;;22951:220;23142:28;23163:6;23142:20;:28::i;:::-;23057:12;;:32;;;-1:-1:-1;;;23057:32:0;;;;22951:168;;-1:-1:-1;;;;;23057:12:0;;:30;;:32;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;23057:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23057:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23057:32:0;:61;;;-1:-1:-1;;;23057:61:0;;-1:-1:-1;;;;;23057:61:0;;;;;;;;;:53;;;;;;;:61;;;;;:32;;:61;;;;;;;:53;:61;;;5:2:-1;;;;30:1;27;20:12;5:2;23057:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23057:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23057:61:0;-1:-1:-1;;;;;22951:25:0;;;;;;:17;23057:61;22951:25;;;;;;;22977:14;:22;;;;;;22951:49;;;;;;;;:83;;23023:10;22951:83;:71;:83;:::i;:220::-;22911:260;;;22947:1;22911:260;-1:-1:-1;;;;;22827:27:0;;;;;;:19;:27;;;;;;;;22855:28;:36;;;;;;22827:65;;;;;;;;;:345;:69;:345;:::i;:::-;-1:-1:-1;;;;;22783:27:0;;;;;;:19;:27;;;;;;;;:41;;;;;;;;;:389;;;23183:36;;;:28;:36;;;;;:51;;;23282:41;;;;;;;;;23252:72;;;;;;;22783:27;;23252:72;;;;;;;;;14455:1;;22229:1103;:::o;13671:54::-;;;;;;;;;;;;;:::o;28763:353::-;28832:4;28849:14;28866:12;;;;;;;;;-1:-1:-1;;;;;28866:12:0;-1:-1:-1;;;;;28866:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28866:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28866:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28866:32:0;:50;;;-1:-1:-1;;;28866:50:0;;-1:-1:-1;;;;;28866:50:0;;;;;;;;;:42;;;;;;;:50;;;;;:32;;:50;;;;;;;:42;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;28866:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28866:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28866:50:0;-1:-1:-1;;;;;28930:21:0;;;;;;:13;28866:50;28930:21;;;;;28866:50;;-1:-1:-1;28927:182:0;;28981:1;28974:8;;;;;28927:182;29027:69;29067:28;29088:6;29067:20;:28::i;:::-;-1:-1:-1;;;;;29027:21:0;;;;;;:13;:21;;;;;;:35;;10638:17;29027:35;:25;:35;:::i;5791:181::-;5849:7;5881:5;;;5905:6;;;;5897:46;;;;;-1:-1:-1;;;5897:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;40414:92;40486:12;40414:92;:::o;6247:136::-;6305:7;6332:43;6336:1;6339;6332:43;;;;;;;;;;;;;;;;;:3;:43::i;7163:471::-;7221:7;7466:6;7462:47;;-1:-1:-1;7496:1:0;7489:8;;7462:47;7533:5;;;7537:1;7533;:5;:1;7557:5;;;;;:10;7549:56;;;;-1:-1:-1;;;7549:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8102:132;8160:7;8187:39;8191:1;8194;8187:39;;;;;;;;;;;;;;;;;:3;:39::i;15999:300::-;16081:12;;:32;;;-1:-1:-1;;;16081:32:0;;;;16064:14;;-1:-1:-1;;;;;16081:12:0;;:30;;:32;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;16081:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16081:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16081:32:0;:50;;;-1:-1:-1;;;16081:50:0;;-1:-1:-1;;;;;16081:50:0;;;;;;;;;:42;;;;;;;:50;;;;;:32;;:50;;;;;;;:42;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;16081:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16081:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16081:50:0;;-1:-1:-1;;;;;;16145:20:0;;;16142:150;;16214:6;-1:-1:-1;;;;;16206:35:0;;16250:12;;;;;;;;;-1:-1:-1;;;;;16250:12:0;-1:-1:-1;;;;;16250:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16250:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16250:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16250:28:0;16206:74;;;-1:-1:-1;;;;;;16206:74:0;;;;;;;-1:-1:-1;;;;;16206:74:0;;;;;;;;;;;;;16250:28;;16206:74;;;;;;;-1:-1:-1;16206:74:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;16206:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16206:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16206:74:0;-1:-1:-1;;;;;16182:21:0;;;;;;:13;16206:74;16182:21;;;;:98;15999:300;;:::o;16774:4800::-;16869:22;16903:14;16920:12;;;;;;;;;-1:-1:-1;;;;;16920:12:0;-1:-1:-1;;;;;16920:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16920:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16920:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16920:32:0;:50;;;-1:-1:-1;;;16920:50:0;;-1:-1:-1;;;;;16920:50:0;;;;;;;;;:42;;;;;;;:50;;;;;:32;;:50;;;;;;;:42;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;16920:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16920:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16920:50:0;;-1:-1:-1;16981:16:0;17000:28;17021:6;17000:20;:28::i;:::-;16981:47;-1:-1:-1;17054:24:0;17043:7;:35;;;;;;;;;:72;;;-1:-1:-1;17093:22:0;17082:7;:33;;;;;;;;;17043:72;17039:4496;;;17208:24;17197:7;:35;;;;;;;;;17193:185;;;17265:24;:11;17281:7;17265:24;:15;:24;:::i;:::-;17251:38;;17193:185;;;-1:-1:-1;;;;;17347:18:0;;;;;;:10;:18;;;;;;:31;;17370:7;17347:31;:22;:31;:::i;:::-;-1:-1:-1;;;;;17326:18:0;;;;;;:10;:18;;;;;:52;17193:185;-1:-1:-1;;;;;17512:20:0;;17480:29;17512:20;;;:12;:20;;;;;;:33;;17537:7;17512:33;:24;:33;:::i;:::-;17480:65;-1:-1:-1;;;;;;17566:20:0;;;;;;:120;;;17630:56;17682:3;17630:47;17646:12;;;;;;;;;-1:-1:-1;;;;;17646:12:0;-1:-1:-1;;;;;17646:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17646:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17646:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17646:30:0;17630:11;;:47;:15;:47;:::i;:56::-;17603:24;:83;17566:120;17562:673;;;17707:21;17731:86;17760:56;17812:3;17760:47;17776:12;;;;;;;;;-1:-1:-1;;;;;17776:12:0;-1:-1:-1;;;;;17776:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17776:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17776:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17776:30:0;17760:11;;:47;:15;:47;:::i;:56::-;17731:24;;:86;:28;:86;:::i;:::-;-1:-1:-1;;;;;17969:21:0;;;;;;:13;:21;;;;;;17707:110;;-1:-1:-1;17707:110:0;;-1:-1:-1;17969:43:0;;17707:110;17969:43;:25;:43;:::i;:::-;-1:-1:-1;;;;;17945:21:0;;;;;;;:13;:21;;;;;;;;:67;;;;18054:20;;;;;:12;:20;;;;;:55;;18092:16;;18054:33;;18079:7;18054:33;:24;:33;:::i;:55::-;-1:-1:-1;;;;;18031:20:0;;;;;;:12;:20;;;;;:78;-1:-1:-1;17562:673:0;;;-1:-1:-1;;;;;18186:20:0;;;;;;:12;:20;;;;;;:33;;18211:7;18186:33;:24;:33;:::i;:::-;-1:-1:-1;;;;;18163:20:0;;;;;;:12;:20;;;;;:56;17562:673;17039:4496;;;;18266:31;18255:7;:42;;;;;;;;;18252:3283;;;-1:-1:-1;;;;;18604:18:0;;;;;;:10;:18;;;;;;:31;;18627:7;18604:31;:22;:31;:::i;:::-;-1:-1:-1;;;;;18583:18:0;;;;;;:10;:18;;;;;:52;18252:3283;;;19297:25;19286:7;:36;;;;;;;;;19283:513;;;-1:-1:-1;;;;;19346:18:0;;;;;;:10;:18;;;;;;:23;19343:265;;19425:7;19400:21;19414:6;19400:13;:21::i;:::-;:32;;19392:77;;;;;-1:-1:-1;;;19392:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19343:265;;;19521:7;19497:21;19511:6;19497:13;:21::i;:::-;:31;19493:115;;;-1:-1:-1;;;;;19586:21:0;;;;;;:13;:21;;;;;;19574:34;;:7;;:34;:11;:34;:::i;:::-;-1:-1:-1;;;;;19551:20:0;;;;;;:12;:20;;;;;:57;19493:115;19641:28;19662:6;19641:20;:28::i;:::-;19627:42;;19283:513;;;19754:7;19729:21;19743:6;19729:13;:21::i;:::-;:32;;19721:75;;;;;-1:-1:-1;;;19721:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19891:25;19880:7;:36;;;;;;;;;19876:186;;;19949:24;:11;19965:7;19949:24;:15;:24;:::i;:::-;19935:38;;19876:186;;;-1:-1:-1;;;;;20031:18:0;;;;;;:10;:18;;;;;;:31;;20054:7;20031:31;:22;:31;:::i;:::-;-1:-1:-1;;;;;20010:18:0;;;;;;:10;:18;;;;;:52;19876:186;-1:-1:-1;;;;;20196:20:0;;20164:29;20196:20;;;:12;:20;;;;;;:30;-1:-1:-1;20196:70:0;;20265:1;20196:70;;;-1:-1:-1;;;;;20229:20:0;;;;;;:12;:20;;;;;;:33;;20254:7;20229:33;:24;:33;:::i;:::-;20164:102;-1:-1:-1;;;;;;20369:20:0;;;;;;:142;;-1:-1:-1;20407:16:0;;;:103;;;20454:56;20506:3;20454:47;20470:12;;;;;;;;;-1:-1:-1;;;;;20470:12:0;-1:-1:-1;;;;;20470:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;20454:56:0;20427:24;:83;20407:103;20366:1158;;;-1:-1:-1;;;;;20581:21:0;;;20534:19;20581:21;;;:13;:21;;;;;;;;;20556:20;;;;;:12;:20;;;;;;20534:19;;20556:60;;20608:7;;20556:47;;:20;:47;:24;:47;:::i;:60::-;20534:82;;20656:56;20708:3;20656:47;20672:12;;;;;;;;;-1:-1:-1;;;;;20672:12:0;-1:-1:-1;;;;;20672:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20672:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20672:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20672:30:0;20656:11;;:47;:15;:47;:::i;:56::-;20639:14;:73;20635:764;;;-1:-1:-1;;;;;20815:21:0;;;;;;;:13;:21;;;;;;;;;;20859:25;;;;20907:20;;;;;:12;:20;;;;;:37;;;20815:21;-1:-1:-1;20635:764:0;;;21055:20;21078:76;21097:56;21149:3;21097:47;21113:12;;;;;;;;;-1:-1:-1;;;;;21113:12:0;-1:-1:-1;;;;;21113:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21113:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21113:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21113:30:0;21097:11;;:47;:15;:47;:::i;21078:76::-;-1:-1:-1;;;;;21194:21:0;;;;;;:13;:21;;;;;;21055:99;;-1:-1:-1;21194:42:0;;21055:99;21194:42;:25;:42;:::i;:::-;-1:-1:-1;;;;;21259:21:0;;;;;;:13;:21;;;;;:39;;;21177:59;-1:-1:-1;21344:35:0;:14;21283:15;21344:35;:18;:35;:::i;:::-;-1:-1:-1;;;;;21321:20:0;;;;;;:12;:20;;;;;:58;-1:-1:-1;20635:764:0;20366:1158;;;;-1:-1:-1;;;;;21475:20:0;;;;;;:12;:20;;;;;;:33;;21500:7;21475:33;:24;:33;:::i;:::-;-1:-1:-1;;;;;21452:20:0;;;;;;:12;:20;;;;;:56;20366:1158;18252:3283;;-1:-1:-1;;16774:4800:0;;;;;:::o;12246:508::-;12663:4;12709:17;12741:7;12246:508;:::o;6720:192::-;6806:7;6842:12;6834:6;;;;6826:29;;;;-1:-1:-1;;;6826:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6826:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6878:5:0;;;6720:192::o;8764:345::-;8850:7;8952:12;8945:5;8937:28;;;;-1:-1:-1;;;8937:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;8937:28:0;;8976:9;8992:1;8988;:5;;;;;;;8764:345;-1:-1:-1;;;;;8764:345:0:o

Swarm Source

bzzr://757185121399a527a64ac4f04319dcd8b650fb25ccba9f3ca4843c1dbe0ef846

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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