AVAX Price: $22.03 (+1.87%)
Gas: 1.2 nAVAX
 

Overview

AVAX Balance

Avalanche C-Chain LogoAvalanche C-Chain LogoAvalanche C-Chain Logo0 AVAX

AVAX Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Redeem Underlyin...227468332022-11-23 16:19:18881 days ago1669220358IN
Vee.Finance: veUSDT.e
0 AVAX0.0139106550
Redeem159599812022-06-13 3:29:541045 days ago1655090994IN
Vee.Finance: veUSDT.e
0 AVAX0.0055815525
Redeem157185722022-06-07 13:25:011051 days ago1654608301IN
Vee.Finance: veUSDT.e
0 AVAX0.0055812525
Redeem141036052022-04-30 18:39:101088 days ago1651343950IN
Vee.Finance: veUSDT.e
0 AVAX0.0057409355.18058169
Redeem141036052022-04-30 18:39:101088 days ago1651343950IN
Vee.Finance: veUSDT.e
0 AVAX0.0101279853.57303698
Repay Borrow141034722022-04-30 18:34:291088 days ago1651343669IN
Vee.Finance: veUSDT.e
0 AVAX0.01641064105.59717215
Redeem Underlyin...141034502022-04-30 18:33:461088 days ago1651343626IN
Vee.Finance: veUSDT.e
0 AVAX0.02153416102.66489032
Repay Borrow141034252022-04-30 18:32:511088 days ago1651343571IN
Vee.Finance: veUSDT.e
0 AVAX0.01598759103.10854549
Redeem Underlyin...141034072022-04-30 18:32:091088 days ago1651343529IN
Vee.Finance: veUSDT.e
0 AVAX0.02250756107.30561237
Repay Borrow141033772022-04-30 18:31:081088 days ago1651343468IN
Vee.Finance: veUSDT.e
0 AVAX0.0158961102.51849291
Redeem Underlyin...141033352022-04-30 18:29:451088 days ago1651343385IN
Vee.Finance: veUSDT.e
0 AVAX0.02118264100.98900315
Repay Borrow141033012022-04-30 18:28:381088 days ago1651343318IN
Vee.Finance: veUSDT.e
0 AVAX0.01628296105.02159003
Redeem Underlyin...141032432022-04-30 18:26:321088 days ago1651343192IN
Vee.Finance: veUSDT.e
0 AVAX0.02117131100.94078269
Redeem139979602022-04-28 6:11:261091 days ago1651126286IN
Vee.Finance: veUSDT.e
0 AVAX0.0124166646.05843048
Redeem139962612022-04-28 5:14:391091 days ago1651122879IN
Vee.Finance: veUSDT.e
0 AVAX0.0105905456.01980814
Redeem Underlyin...139962432022-04-28 5:14:021091 days ago1651122842IN
Vee.Finance: veUSDT.e
0 AVAX0.02223721117.2644937
Repay Borrow139958922022-04-28 5:01:551091 days ago1651122115IN
Vee.Finance: veUSDT.e
0 AVAX0.0132052784.97167983
Redeem Underlyin...139958712022-04-28 5:01:131091 days ago1651122073IN
Vee.Finance: veUSDT.e
0 AVAX0.0168628580.39425678
Repay Borrow139958302022-04-28 4:59:511091 days ago1651121991IN
Vee.Finance: veUSDT.e
0 AVAX0.0126097181.31729458
Redeem Underlyin...139958022022-04-28 4:58:561091 days ago1651121936IN
Vee.Finance: veUSDT.e
0 AVAX0.0177196684.47428246
Repay Borrow139957662022-04-28 4:57:431091 days ago1651121863IN
Vee.Finance: veUSDT.e
0 AVAX0.013339886.02554687
Redeem Underlyin...139957472022-04-28 4:57:051091 days ago1651121825IN
Vee.Finance: veUSDT.e
0 AVAX0.0178156884.93202717
Repay Borrow139957242022-04-28 4:56:201091 days ago1651121780IN
Vee.Finance: veUSDT.e
0 AVAX0.0122133178.76104201
Redeem Underlyin...139957032022-04-28 4:55:371091 days ago1651121737IN
Vee.Finance: veUSDT.e
0 AVAX0.0157494275.0816489
Repay Borrow139956822022-04-28 4:54:531091 days ago1651121693IN
Vee.Finance: veUSDT.e
0 AVAX0.0126066273.22793637
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x2773604f...f39d7C369
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
CErc20Immutable

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at snowscan.xyz on 2021-11-09
*/

pragma solidity >=0.8.0;


contract ExponentialNoError {
    uint constant expScale = 1e18;
    uint constant doubleScale = 1e36;
    uint constant halfExpScale = expScale/2;
    uint constant mantissaOne = expScale;

    struct Exp {
        uint mantissa;
    }

    struct Double {
        uint mantissa;
    }

    
    function truncate(Exp memory exp) pure internal returns (uint) {
        
        return exp.mantissa / expScale;
    }

    
    function mul_ScalarTruncate(Exp memory a, uint scalar) pure internal returns (uint) {
        Exp memory product = mul_(a, scalar);
        return truncate(product);
    }

    
    function mul_ScalarTruncateAddUInt(Exp memory a, uint scalar, uint addend) pure internal returns (uint) {
        Exp memory product = mul_(a, scalar);
        return add_(truncate(product), addend);
    }

    
    function lessThanExp(Exp memory left, Exp memory right) pure internal returns (bool) {
        return left.mantissa < right.mantissa;
    }

    
    function lessThanOrEqualExp(Exp memory left, Exp memory right) pure internal returns (bool) {
        return left.mantissa <= right.mantissa;
    }

    
    function greaterThanExp(Exp memory left, Exp memory right) pure internal returns (bool) {
        return left.mantissa > right.mantissa;
    }

    
    function isZeroExp(Exp memory value) pure internal returns (bool) {
        return value.mantissa == 0;
    }

    function safe224(uint n, string memory errorMessage) pure internal returns (uint224) {
        require(n < 2**224, errorMessage);
        return uint224(n);
    }

    function safe32(uint n, string memory errorMessage) pure internal returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function add_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
        return Exp({mantissa: add_(a.mantissa, b.mantissa)});
    }

    function add_(Double memory a, Double memory b) pure internal returns (Double memory) {
        return Double({mantissa: add_(a.mantissa, b.mantissa)});
    }

    function add_(uint a, uint b) pure internal returns (uint) {
        return add_(a, b, "addition overflow");
    }

    function add_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
        uint c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function sub_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
        return Exp({mantissa: sub_(a.mantissa, b.mantissa)});
    }

    function sub_(Double memory a, Double memory b) pure internal returns (Double memory) {
        return Double({mantissa: sub_(a.mantissa, b.mantissa)});
    }

    function sub_(uint a, uint b) pure internal returns (uint) {
        return sub_(a, b, "subtraction underflow");
    }

    function sub_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function mul_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
        return Exp({mantissa: mul_(a.mantissa, b.mantissa) / expScale});
    }

    function mul_(Exp memory a, uint b) pure internal returns (Exp memory) {
        return Exp({mantissa: mul_(a.mantissa, b)});
    }

    function mul_(uint a, Exp memory b) pure internal returns (uint) {
        return mul_(a, b.mantissa) / expScale;
    }

    function mul_(Double memory a, Double memory b) pure internal returns (Double memory) {
        return Double({mantissa: mul_(a.mantissa, b.mantissa) / doubleScale});
    }

    function mul_(Double memory a, uint b) pure internal returns (Double memory) {
        return Double({mantissa: mul_(a.mantissa, b)});
    }

    function mul_(uint a, Double memory b) pure internal returns (uint) {
        return mul_(a, b.mantissa) / doubleScale;
    }

    function mul_(uint a, uint b) pure internal returns (uint) {
        return mul_(a, b, "multiplication overflow");
    }

    function mul_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
        if (a == 0 || b == 0) {
            return 0;
        }
        uint c = a * b;
        require(c / a == b, errorMessage);
        return c;
    }

    function div_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
        return Exp({mantissa: div_(mul_(a.mantissa, expScale), b.mantissa)});
    }

    function div_(Exp memory a, uint b) pure internal returns (Exp memory) {
        return Exp({mantissa: div_(a.mantissa, b)});
    }

    function div_(uint a, Exp memory b) pure internal returns (uint) {
        return div_(mul_(a, expScale), b.mantissa);
    }

    function div_(Double memory a, Double memory b) pure internal returns (Double memory) {
        return Double({mantissa: div_(mul_(a.mantissa, doubleScale), b.mantissa)});
    }

    function div_(Double memory a, uint b) pure internal returns (Double memory) {
        return Double({mantissa: div_(a.mantissa, b)});
    }

    function div_(uint a, Double memory b) pure internal returns (uint) {
        return div_(mul_(a, doubleScale), b.mantissa);
    }

    function div_(uint a, uint b) pure internal returns (uint) {
        return div_(a, b, "divide by zero");
    }

    function div_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
        require(b > 0, errorMessage);
        return a / b;
    }

    function fraction(uint a, uint b) pure internal returns (Double memory) {
        return Double({mantissa: div_(mul_(a, doubleScale), b)});
    }
}





            
pragma solidity >=0.8.0;


contract CarefulMath {

    
    enum MathError {
        NO_ERROR,
        DIVISION_BY_ZERO,
        INTEGER_OVERFLOW,
        INTEGER_UNDERFLOW
    }

    
    function mulUInt(uint a, uint b) internal pure returns (MathError, uint) {
        if (a == 0) {
            return (MathError.NO_ERROR, 0);
        }

        uint c = a * b;

        if (c / a != b) {
            return (MathError.INTEGER_OVERFLOW, 0);
        } else {
            return (MathError.NO_ERROR, c);
        }
    }

    
    function divUInt(uint a, uint b) internal pure returns (MathError, uint) {
        if (b == 0) {
            return (MathError.DIVISION_BY_ZERO, 0);
        }

        return (MathError.NO_ERROR, a / b);
    }

    
    function subUInt(uint a, uint b) internal pure returns (MathError, uint) {
        if (b <= a) {
            return (MathError.NO_ERROR, a - b);
        } else {
            return (MathError.INTEGER_UNDERFLOW, 0);
        }
    }

    
    function addUInt(uint a, uint b) internal pure returns (MathError, uint) {
        uint c = a + b;

        if (c >= a) {
            return (MathError.NO_ERROR, c);
        } else {
            return (MathError.INTEGER_OVERFLOW, 0);
        }
    }

    
    function addThenSubUInt(uint a, uint b, uint c) internal pure returns (MathError, uint) {
        (MathError err0, uint sum) = addUInt(a, b);

        if (err0 != MathError.NO_ERROR) {
            return (err0, 0);
        }

        return subUInt(sum, c);
    }
}




            
pragma solidity >=0.8.0;


interface EIP20NonStandardInterface {

    
    function totalSupply() external view returns (uint256);

    
    function balanceOf(address owner) external view returns (uint256 balance);

    
    
    
    
    

    
    function transfer(address dst, uint256 amount) external;

    
    
    
    
    

    
    function transferFrom(address src, address dst, uint256 amount) external;

    
    function approve(address spender, uint256 amount) external returns (bool success);

    
    function allowance(address owner, address spender) external view returns (uint256 remaining);

    event Transfer(address indexed from, address indexed to, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 amount);
}





            
pragma solidity >=0.8.0;


abstract contract InterestRateModel {
    
    bool public constant isInterestRateModel = true;

    
    function getBorrowRate(uint cash, uint borrows, uint reserves) external virtual view returns (uint);

    
    function getSupplyRate(uint cash, uint borrows, uint reserves, uint reserveFactorMantissa) external virtual view returns (uint);

}





            
pragma solidity >=0.8.0;

abstract contract ComptrollerInterface {
    
    bool public constant isComptroller = true;

    

    function enterMarkets(address[] calldata cTokens) external virtual returns (uint[] memory);
    function exitMarket(address cToken) external virtual returns (uint);

    

    function mintAllowed(address cToken, address minter, uint mintAmount) external virtual returns (uint);
    function mintVerify(address cToken, address minter, uint mintAmount, uint mintTokens) external virtual;

    function redeemAllowed(address cToken, address redeemer, uint redeemTokens) external virtual returns (uint);
    function redeemVerify(address cToken, address redeemer, uint redeemAmount, uint redeemTokens) external virtual;

    function borrowAllowed(address cToken, address borrower, uint borrowAmount) external virtual returns (uint);
    function borrowVerify(address cToken, address borrower, uint borrowAmount) external virtual;

    function repayBorrowAllowed(
        address cToken,
        address payer,
        address borrower,
        uint repayAmount) external virtual returns (uint);
    function repayBorrowVerify(
        address cToken,
        address payer,
        address borrower,
        uint repayAmount,
        uint borrowerIndex) external virtual;

    function liquidateBorrowAllowed(
        address cTokenBorrowed,
        address cTokenCollateral,
        address liquidator,
        address borrower,
        uint repayAmount) external virtual returns (uint);
    function liquidateBorrowVerify(
        address cTokenBorrowed,
        address cTokenCollateral,
        address liquidator,
        address borrower,
        uint repayAmount,
        uint seizeTokens) external virtual;

    function seizeAllowed(
        address cTokenCollateral,
        address cTokenBorrowed,
        address liquidator,
        address borrower,
        uint seizeTokens) external virtual returns (uint);
    function seizeVerify(
        address cTokenCollateral,
        address cTokenBorrowed,
        address liquidator,
        address borrower,
        uint seizeTokens) external virtual;

    function transferAllowed(address cToken, address src, address dst, uint transferTokens) external virtual returns (uint);
    function transferVerify(address cToken, address src, address dst, uint transferTokens) external virtual;

    

    function liquidateCalculateSeizeTokens(
        address cTokenBorrowed,
        address cTokenCollateral,
        uint repayAmount) external virtual view returns (uint, uint);
    function getBlockNumber() public virtual view returns (uint);
}





            


pragma solidity ^0.8.0;

library Address {
	 
    function isContract(address account) internal view returns (bool) {
        
        
        

        uint256 size;
        
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}




            


pragma solidity >=0.5.16 <0.9.0;

library BytesLib {
    function concatBytesSig(bytes4 signature, bytes memory data1, bytes memory data2) internal pure returns(bytes memory combined) {
        bytes memory tempBytes;
        assembly {
            tempBytes := mload(0x40)

            let length := mload(data1)
            mstore(tempBytes, length)

            let mc := add(tempBytes, 0x20)
            mstore(mc, signature)
            mc := add(mc, 4)
            let end := add(mc, length)

            for {
                let cc := add(data1, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

            length := mload(data2)
            mstore(tempBytes, add(4, add(length, mload(tempBytes))))

            mc := end
            end := add(mc, length)

            for {
                let cc := add(data2, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

            mstore(0x40, and(
              add(add(end, iszero(add(4, add(length, mload(data1))))), 31),
              not(31) 
            ))
        }

        return tempBytes;
    }
}




            

pragma solidity >=0.5.0;

interface IVeeProxyController {
    function deposit(address account, address token, uint256 amount, uint8 leverage) external payable;
}




            
pragma solidity >=0.8.0;


interface EIP20Interface {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);

    
    function totalSupply() external view returns (uint256);

    
    function balanceOf(address owner) external view returns (uint256 balance);

    
    function transfer(address dst, uint256 amount) external returns (bool success);

    
    function transferFrom(address src, address dst, uint256 amount) external returns (bool success);

    
    function approve(address spender, uint256 amount) external returns (bool success);

    
    function allowance(address owner, address spender) external view returns (uint256 remaining);

    event Transfer(address indexed from, address indexed to, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 amount);
}





            
pragma solidity >=0.8.0;





contract Exponential is CarefulMath, ExponentialNoError {
    
    function getExp(uint num, uint denom) pure internal returns (MathError, Exp memory) {
        (MathError err0, uint scaledNumerator) = mulUInt(num, expScale);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        (MathError err1, uint rational) = divUInt(scaledNumerator, denom);
        if (err1 != MathError.NO_ERROR) {
            return (err1, Exp({mantissa: 0}));
        }

        return (MathError.NO_ERROR, Exp({mantissa: rational}));
    }

    
    function addExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) {
        (MathError error, uint result) = addUInt(a.mantissa, b.mantissa);

        return (error, Exp({mantissa: result}));
    }

    
    function subExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) {
        (MathError error, uint result) = subUInt(a.mantissa, b.mantissa);

        return (error, Exp({mantissa: result}));
    }

    
    function mulScalar(Exp memory a, uint scalar) pure internal returns (MathError, Exp memory) {
        (MathError err0, uint scaledMantissa) = mulUInt(a.mantissa, scalar);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        return (MathError.NO_ERROR, Exp({mantissa: scaledMantissa}));
    }

    
    function mulScalarTruncate(Exp memory a, uint scalar) pure internal returns (MathError, uint) {
        (MathError err, Exp memory product) = mulScalar(a, scalar);
        if (err != MathError.NO_ERROR) {
            return (err, 0);
        }

        return (MathError.NO_ERROR, truncate(product));
    }

    
    function mulScalarTruncateAddUInt(Exp memory a, uint scalar, uint addend) pure internal returns (MathError, uint) {
        (MathError err, Exp memory product) = mulScalar(a, scalar);
        if (err != MathError.NO_ERROR) {
            return (err, 0);
        }

        return addUInt(truncate(product), addend);
    }

    
    function divScalar(Exp memory a, uint scalar) pure internal returns (MathError, Exp memory) {
        (MathError err0, uint descaledMantissa) = divUInt(a.mantissa, scalar);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        return (MathError.NO_ERROR, Exp({mantissa: descaledMantissa}));
    }

    
    function divScalarByExp(uint scalar, Exp memory divisor) pure internal returns (MathError, Exp memory) {
        
        (MathError err0, uint numerator) = mulUInt(expScale, scalar);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }
        return getExp(numerator, divisor.mantissa);
    }

    
    function divScalarByExpTruncate(uint scalar, Exp memory divisor) pure internal returns (MathError, uint) {
        (MathError err, Exp memory fraction) = divScalarByExp(scalar, divisor);
        if (err != MathError.NO_ERROR) {
            return (err, 0);
        }

        return (MathError.NO_ERROR, truncate(fraction));
    }

    
    function mulExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) {

        (MathError err0, uint doubleScaledProduct) = mulUInt(a.mantissa, b.mantissa);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        
        
        
        (MathError err1, uint doubleScaledProductWithHalfScale) = addUInt(halfExpScale, doubleScaledProduct);
        if (err1 != MathError.NO_ERROR) {
            return (err1, Exp({mantissa: 0}));
        }

        (MathError err2, uint product) = divUInt(doubleScaledProductWithHalfScale, expScale);
        
        assert(err2 == MathError.NO_ERROR);

        return (MathError.NO_ERROR, Exp({mantissa: product}));
    }

    
    function mulExp(uint a, uint b) pure internal returns (MathError, Exp memory) {
        return mulExp(Exp({mantissa: a}), Exp({mantissa: b}));
    }

    
    function mulExp3(Exp memory a, Exp memory b, Exp memory c) pure internal returns (MathError, Exp memory) {
        (MathError err, Exp memory ab) = mulExp(a, b);
        if (err != MathError.NO_ERROR) {
            return (err, ab);
        }
        return mulExp(ab, c);
    }

    
    function divExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) {
        return getExp(a.mantissa, b.mantissa);
    }
}





            
pragma solidity >=0.8.0;

contract ComptrollerErrorReporter {
    enum Error {
        NO_ERROR,
        UNAUTHORIZED,
        COMPTROLLER_MISMATCH,
        INSUFFICIENT_SHORTFALL,
        INSUFFICIENT_LIQUIDITY,
        INVALID_CLOSE_FACTOR,
        INVALID_COLLATERAL_FACTOR,
        INVALID_LIQUIDATION_INCENTIVE,
        MARKET_NOT_ENTERED, 
        MARKET_NOT_LISTED,
        MARKET_ALREADY_LISTED,
        MATH_ERROR,
        NONZERO_BORROW_BALANCE,
        PRICE_ERROR,
        REJECTION,
        SNAPSHOT_ERROR,
        TOO_MANY_ASSETS,
        TOO_MUCH_REPAY
    }

    enum FailureInfo {
        ACCEPT_ADMIN_PENDING_ADMIN_CHECK,
        ACCEPT_PENDING_IMPLEMENTATION_ADDRESS_CHECK,
        EXIT_MARKET_BALANCE_OWED,
        EXIT_MARKET_REJECTION,
        SET_CLOSE_FACTOR_OWNER_CHECK,
        SET_CLOSE_FACTOR_VALIDATION,
        SET_COLLATERAL_FACTOR_OWNER_CHECK,
        SET_COLLATERAL_FACTOR_NO_EXISTS,
        SET_COLLATERAL_FACTOR_VALIDATION,
        SET_COLLATERAL_FACTOR_WITHOUT_PRICE,
        SET_IMPLEMENTATION_OWNER_CHECK,
        SET_LIQUIDATION_INCENTIVE_OWNER_CHECK,
        SET_LIQUIDATION_INCENTIVE_VALIDATION,
        SET_MAX_ASSETS_OWNER_CHECK,
        SET_PENDING_ADMIN_OWNER_CHECK,
        SET_PENDING_IMPLEMENTATION_OWNER_CHECK,
        SET_PRICE_ORACLE_OWNER_CHECK,
        SUPPORT_MARKET_EXISTS,
        SUPPORT_MARKET_OWNER_CHECK,
        SET_PAUSE_GUARDIAN_OWNER_CHECK,
        SET_TOKEN_ADDRESS_OWNER_CHECK
    }

    
    event Failure(uint error, uint info, uint detail);

    
    function fail(Error err, FailureInfo info) internal returns (uint) {
        emit Failure(uint(err), uint(info), 0);

        return uint(err);
    }

    
    function failOpaque(Error err, FailureInfo info, uint opaqueError) internal returns (uint) {
        emit Failure(uint(err), uint(info), opaqueError);

        return uint(err);
    }
}

contract TokenErrorReporter {
    enum Error {
        NO_ERROR,
        UNAUTHORIZED,
        BAD_INPUT,
        COMPTROLLER_REJECTION,
        COMPTROLLER_CALCULATION_ERROR,
        INTEREST_RATE_MODEL_ERROR,
        INVALID_ACCOUNT_PAIR,
        INVALID_CLOSE_AMOUNT_REQUESTED,
        INVALID_COLLATERAL_FACTOR,
        MATH_ERROR,
        MARKET_NOT_FRESH,
        MARKET_NOT_LISTED,
        TOKEN_INSUFFICIENT_ALLOWANCE,
        TOKEN_INSUFFICIENT_BALANCE,
        TOKEN_INSUFFICIENT_CASH,
        TOKEN_TRANSFER_IN_FAILED,
        TOKEN_TRANSFER_OUT_FAILED
    }

    
    enum FailureInfo {
        ACCEPT_ADMIN_PENDING_ADMIN_CHECK,
        ACCRUE_INTEREST_ACCUMULATED_INTEREST_CALCULATION_FAILED,
        ACCRUE_INTEREST_BORROW_RATE_CALCULATION_FAILED,
        ACCRUE_INTEREST_NEW_BORROW_INDEX_CALCULATION_FAILED,
        ACCRUE_INTEREST_NEW_TOTAL_BORROWS_CALCULATION_FAILED,
        ACCRUE_INTEREST_NEW_TOTAL_RESERVES_CALCULATION_FAILED,
        ACCRUE_INTEREST_SIMPLE_INTEREST_FACTOR_CALCULATION_FAILED,
        BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED,
        BORROW_ACCRUE_INTEREST_FAILED,
        BORROW_CASH_NOT_AVAILABLE,
        BORROW_FRESHNESS_CHECK,
        BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED,
        BORROW_NEW_ACCOUNT_BORROW_BALANCE_CALCULATION_FAILED,
        BORROW_MARKET_NOT_LISTED,
        BORROW_COMPTROLLER_REJECTION,
        LIQUIDATE_ACCRUE_BORROW_INTEREST_FAILED,
        LIQUIDATE_ACCRUE_COLLATERAL_INTEREST_FAILED,
        LIQUIDATE_COLLATERAL_FRESHNESS_CHECK,
        LIQUIDATE_COMPTROLLER_REJECTION,
        LIQUIDATE_COMPTROLLER_CALCULATE_AMOUNT_SEIZE_FAILED,
        LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX,
        LIQUIDATE_CLOSE_AMOUNT_IS_ZERO,
        LIQUIDATE_FRESHNESS_CHECK,
        LIQUIDATE_LIQUIDATOR_IS_BORROWER,
        LIQUIDATE_REPAY_BORROW_FRESH_FAILED,
        LIQUIDATE_SEIZE_BALANCE_INCREMENT_FAILED,
        LIQUIDATE_SEIZE_BALANCE_DECREMENT_FAILED,
        LIQUIDATE_SEIZE_COMPTROLLER_REJECTION,
        LIQUIDATE_SEIZE_LIQUIDATOR_IS_BORROWER,
        LIQUIDATE_SEIZE_TOO_MUCH,
        MINT_ACCRUE_INTEREST_FAILED,
        MINT_COMPTROLLER_REJECTION,
        MINT_EXCHANGE_CALCULATION_FAILED,
        MINT_EXCHANGE_RATE_READ_FAILED,
        MINT_FRESHNESS_CHECK,
        MINT_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED,
        MINT_NEW_TOTAL_SUPPLY_CALCULATION_FAILED,
        MINT_TRANSFER_IN_FAILED,
        MINT_TRANSFER_IN_NOT_POSSIBLE,
        REDEEM_ACCRUE_INTEREST_FAILED,
        REDEEM_COMPTROLLER_REJECTION,
        REDEEM_EXCHANGE_TOKENS_CALCULATION_FAILED,
        REDEEM_EXCHANGE_AMOUNT_CALCULATION_FAILED,
        REDEEM_EXCHANGE_RATE_READ_FAILED,
        REDEEM_FRESHNESS_CHECK,
        REDEEM_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED,
        REDEEM_NEW_TOTAL_SUPPLY_CALCULATION_FAILED,
        REDEEM_TRANSFER_OUT_NOT_POSSIBLE,
        REDUCE_RESERVES_ACCRUE_INTEREST_FAILED,
        REDUCE_RESERVES_ADMIN_CHECK,
        REDUCE_RESERVES_CASH_NOT_AVAILABLE,
        REDUCE_RESERVES_FRESH_CHECK,
        REDUCE_RESERVES_VALIDATION,
        REPAY_BEHALF_ACCRUE_INTEREST_FAILED,
        REPAY_BORROW_ACCRUE_INTEREST_FAILED,
        REPAY_BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED,
        REPAY_BORROW_COMPTROLLER_REJECTION,
        REPAY_BORROW_FRESHNESS_CHECK,
        REPAY_BORROW_NEW_ACCOUNT_BORROW_BALANCE_CALCULATION_FAILED,
        REPAY_BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED,
        REPAY_BORROW_TRANSFER_IN_NOT_POSSIBLE,
        SET_COLLATERAL_FACTOR_OWNER_CHECK,
        SET_COLLATERAL_FACTOR_VALIDATION,
        SET_COMPTROLLER_OWNER_CHECK,
        SET_INTEREST_RATE_MODEL_ACCRUE_INTEREST_FAILED,
        SET_INTEREST_RATE_MODEL_FRESH_CHECK,
        SET_INTEREST_RATE_MODEL_OWNER_CHECK,
        SET_MAX_ASSETS_OWNER_CHECK,
        SET_ORACLE_MARKET_NOT_LISTED,
        SET_PENDING_ADMIN_OWNER_CHECK,
        SET_RESERVE_FACTOR_ACCRUE_INTEREST_FAILED,
        SET_RESERVE_FACTOR_ADMIN_CHECK,
        SET_RESERVE_FACTOR_FRESH_CHECK,
        SET_RESERVE_FACTOR_BOUNDS_CHECK,
        TRANSFER_COMPTROLLER_REJECTION,
        TRANSFER_NOT_ALLOWED,
        TRANSFER_NOT_ENOUGH,
        TRANSFER_TOO_MUCH,
        ADD_RESERVES_ACCRUE_INTEREST_FAILED,
        ADD_RESERVES_FRESH_CHECK,
        ADD_RESERVES_TRANSFER_IN_NOT_POSSIBLE,
        BORROW_FRESH_LEVERAGE_AMOUNT_FAILED,
        REPAY_LEVERAGE_ACCUMULATED_BALANCE_CALCULATION_FAILED
    }

    
    event Failure(uint error, uint info, uint detail);

    
    function fail(Error err, FailureInfo info) internal returns (uint) {
        emit Failure(uint(err), uint(info), 0);

        return uint(err);
    }

    
    function failOpaque(Error err, FailureInfo info, uint opaqueError) internal returns (uint) {
        emit Failure(uint(err), uint(info), opaqueError);

        return uint(err);
    }
}




            
pragma solidity >=0.8.0;





abstract contract CTokenStorage {
    
    bool internal _notEntered;

    
    string public name;

    
    string public symbol;

    
    uint8 public decimals;

    

    uint internal constant borrowRateMaxMantissa = 0.0005e16;

    
    uint internal constant reserveFactorMaxMantissa = 1e18;

    
    address public admin;

    
    address public pendingAdmin;

    
    ComptrollerInterface public comptroller;

    
    InterestRateModel public interestRateModel;

    
    uint internal initialExchangeRateMantissa;

    
    uint public reserveFactorMantissa;

    
    uint public accrualBlockNumber;

    
    uint public borrowIndex;

    
    uint public totalBorrows;

    
    uint public totalReserves;

    
    uint public totalSupply;

    address public orderProxy;

    
    mapping (address => uint) internal accountTokens;

    
    mapping (address => mapping (address => uint)) internal transferAllowances;

    
    struct BorrowSnapshot {
        uint principal;
        uint interestIndex;
    }

    
    mapping(address => BorrowSnapshot) internal accountBorrows;

}

abstract contract CTokenInterface is CTokenStorage {
    
    bool public constant isCToken = true;


    

    
    event AccrueInterest(uint cashPrior, uint interestAccumulated, uint borrowIndex, uint totalBorrows);

    
    event Mint(address payer, address minter, uint mintAmount, uint mintTokens);

    
    event Redeem(address redeemer, uint redeemAmount, uint redeemTokens);

    
    event Borrow(address borrower, uint borrowAmount, uint accountBorrows, uint totalBorrows);

    
    event RepayBorrow(address payer, address borrower, uint repayAmount, uint accountBorrows, uint totalBorrows);

    
    event LiquidateBorrow(address liquidator, address borrower, uint repayAmount, address cTokenCollateral, uint seizeTokens);


    

    
    event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin);

    
    event NewAdmin(address oldAdmin, address newAdmin);

    
    event NewComptroller(ComptrollerInterface oldComptroller, ComptrollerInterface newComptroller);

    
    event NewMarketInterestRateModel(InterestRateModel oldInterestRateModel, InterestRateModel newInterestRateModel);

    
    event NewReserveFactor(uint oldReserveFactorMantissa, uint newReserveFactorMantissa);

    
    event ReservesAdded(address benefactor, uint addAmount, uint newTotalReserves);

    
    event ReservesReduced(address admin, uint reduceAmount, uint newTotalReserves);

    
    event Transfer(address indexed from, address indexed to, uint amount);

    
    event Approval(address indexed owner, address indexed spender, uint amount);

    
    

    
    event NewOrderProxy(address oldVeeProxy, address newVeeProxy);

    
    event RepayLeverage(address payer, address borrower, uint repayAmount, uint expectLeverageAmount, uint remainLeverageAmount);

    
    event LiquidateLeverage(address borrower, uint insufficientLeverage, uint oldBorrowPrincipal, uint newBorrowPrincipal);

    

    function transfer(address dst, uint amount) external virtual returns (bool);
    function transferFrom(address src, address dst, uint amount) external virtual returns (bool);
    function approve(address spender, uint amount) external virtual returns (bool);
    function allowance(address owner, address spender) external virtual view returns (uint);
    function balanceOf(address owner) external virtual view returns (uint);
    function balanceOfUnderlying(address owner) external virtual returns (uint);
    function getAccountSnapshot(address account) external virtual view returns (uint, uint, uint, uint);
    function borrowRatePerBlock() external virtual view returns (uint);
    function supplyRatePerBlock() external virtual view returns (uint);
    function totalBorrowsCurrent() external virtual returns (uint);
    function borrowBalanceCurrent(address account) external virtual returns (uint);
    function borrowBalanceStored(address account) public virtual view returns (uint);
    function exchangeRateCurrent() public virtual returns (uint);
    function exchangeRateStored() public virtual view returns (uint);
    function getCash() external virtual view returns (uint);
    function accrueInterest() public virtual returns (uint);
    function seize(address liquidator, address borrower, uint seizeTokens) external virtual returns (uint);

    

    function _setPendingAdmin(address payable newPendingAdmin) external virtual returns (uint);
    function _acceptAdmin() external virtual returns (uint);
    function _setComptroller(ComptrollerInterface newComptroller) public virtual returns (uint);
    function _setReserveFactor(uint newReserveFactorMantissa) external virtual returns (uint);
    function _reduceReserves(uint reduceAmount) external virtual returns (uint);
    function _setInterestRateModel(InterestRateModel newInterestRateModel) public virtual returns (uint);
}

contract CErc20Storage {
    
    address public underlying;
}

abstract contract CErc20Interface is CErc20Storage {

    

    function mint(uint mintAmount) external virtual returns (uint);
    function redeem(uint redeemTokens) external virtual returns (uint);
    function redeemUnderlying(uint redeemAmount) external virtual returns (uint);
    function borrow(uint borrowAmount) external virtual returns (uint);
    function repayBorrow(uint repayAmount) external virtual returns (uint);
    function repayBorrowBehalf(address borrower, uint repayAmount) external virtual returns (uint);
    function liquidateBorrow(address borrower, uint repayAmount, CTokenInterface cTokenCollateral) external virtual returns (uint);
    function sweepToken(EIP20NonStandardInterface token) external virtual;

    

    function _addReserves(uint addAmount) external virtual returns (uint);
    function mintBehalf(address receiver, uint mintAmount) external virtual returns (uint);
}

contract CDelegationStorage {
    
    address public implementation;
}

abstract contract CDelegatorInterface is CDelegationStorage {
    
    event NewImplementation(address oldImplementation, address newImplementation);

    
    function _setImplementation(address implementation_, bool allowResign, bytes memory becomeImplementationData) public virtual;
}

abstract contract CDelegateInterface is CDelegationStorage {
    
    function _becomeImplementation(bytes memory data) public virtual;

    
    function _resignImplementation() public virtual;
}

interface CEtherInterface {
    function mintBehalf(address receiver) external payable returns (uint);
}




            
pragma solidity >=0.8.0;












abstract contract CToken is CTokenInterface, Exponential, TokenErrorReporter {
    address constant VETH = address(1);

    
    function initialize(ComptrollerInterface comptroller_,
                        InterestRateModel interestRateModel_,
                        uint initialExchangeRateMantissa_,
                        string memory name_,
                        string memory symbol_,
                        uint8 decimals_) public {
        require(msg.sender == admin, "only admin may initialize the market");
        require(accrualBlockNumber == 0 && borrowIndex == 0, "market may only be initialized once");

        
        initialExchangeRateMantissa = initialExchangeRateMantissa_;
        require(initialExchangeRateMantissa > 0, "initial exchange rate must be greater than zero.");

        
        uint err = _setComptroller(comptroller_);
        require(err == uint(Error.NO_ERROR), "setting comptroller failed");

        
        accrualBlockNumber = getBlockNumber();
        borrowIndex = mantissaOne;

        
        err = _setInterestRateModelFresh(interestRateModel_);
        require(err == uint(Error.NO_ERROR), "setting interest rate model failed");

        name = name_;
        symbol = symbol_;
        decimals = decimals_;

        
        _notEntered = true;
    }

    
    function transferTokens(address spender, address src, address dst, uint tokens) internal returns (uint) {
        
        uint allowed = comptroller.transferAllowed(address(this), src, dst, tokens);
        if (allowed != 0) {
            return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.TRANSFER_COMPTROLLER_REJECTION, allowed);
        }

        
        if (src == dst) {
            return fail(Error.BAD_INPUT, FailureInfo.TRANSFER_NOT_ALLOWED);
        }

        
        uint startingAllowance = 0;
        if (spender == src) {
            startingAllowance = type(uint).max;
        } else {
            startingAllowance = transferAllowances[src][spender];
        }

        
        
        
        
        

        
        
        
        

        
        
        
        

        
        
        
        

        uint allowanceNew = startingAllowance - tokens;
        uint srcTokensNew = accountTokens[src] - tokens;
        uint dstTokensNew = accountTokens[dst] + tokens;

        
        
        

        accountTokens[src] = srcTokensNew;
        accountTokens[dst] = dstTokensNew;

        
        if (startingAllowance != type(uint).max) {
            transferAllowances[src][spender] = allowanceNew;
        }

        
        emit Transfer(src, dst, tokens);

        
        

        return uint(Error.NO_ERROR);
    }

    
    function transfer(address dst, uint256 amount) external override nonReentrant returns (bool) {
        return transferTokens(msg.sender, msg.sender, dst, amount) == uint(Error.NO_ERROR);
    }

    
    function transferFrom(address src, address dst, uint256 amount) external override nonReentrant returns (bool) {
        return transferTokens(msg.sender, src, dst, amount) == uint(Error.NO_ERROR);
    }

    
    function approve(address spender, uint256 amount) external override returns (bool) {
        address src = msg.sender;
        transferAllowances[src][spender] = amount;
        emit Approval(src, spender, amount);
        return true;
    }

    
    function allowance(address owner, address spender) external override view returns (uint256) {
        return transferAllowances[owner][spender];
    }

    
    function balanceOf(address owner) external override view returns (uint256) {
        return accountTokens[owner];
    }

    
    function balanceOfUnderlying(address owner) external override returns (uint) {
        Exp memory exchangeRate = Exp({mantissa: exchangeRateCurrent()});
        (MathError mErr, uint balance) = mulScalarTruncate(exchangeRate, accountTokens[owner]);
        require(mErr == MathError.NO_ERROR, "balance could not be calculated");
        return balance;
    }

    
    function getAccountSnapshot(address account) external override view returns (uint, uint, uint, uint) {
        uint cTokenBalance = accountTokens[account];
        uint borrowBalance;
        uint exchangeRateMantissa;

        MathError mErr;

        (mErr, borrowBalance) = borrowBalanceStoredInternal(account);
        if (mErr != MathError.NO_ERROR) {
            return (uint(Error.MATH_ERROR), 0, 0, 0);
        }

        (mErr, exchangeRateMantissa) = exchangeRateStoredInternal();
        if (mErr != MathError.NO_ERROR) {
            return (uint(Error.MATH_ERROR), 0, 0, 0);
        }

        return (uint(Error.NO_ERROR), cTokenBalance, borrowBalance, exchangeRateMantissa);
    }

    
    function getBlockNumber() internal virtual view returns (uint) {
        return block.number;
    }

    
    function borrowRatePerBlock() external override view returns (uint) {
        return interestRateModel.getBorrowRate(getCashPrior(), totalBorrows, totalReserves);
    }

    
    function supplyRatePerBlock() external override view returns (uint) {
        return interestRateModel.getSupplyRate(getCashPrior(), totalBorrows, totalReserves, reserveFactorMantissa);
    }

    
    function totalBorrowsCurrent() external override nonReentrant returns (uint) {
        require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed");
        return totalBorrows;
    }

    
    function borrowBalanceCurrent(address account) external override nonReentrant returns (uint) {
        require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed");
        return borrowBalanceStored(account);
    }

    
    function borrowBalanceStored(address account) public override view returns (uint) {
        (MathError err, uint result) = borrowBalanceStoredInternal(account);
        require(err == MathError.NO_ERROR, "borrowBalanceStoredInternal failed");
        return result;
    }

    
    function borrowBalanceStoredInternal(address account) internal view returns (MathError, uint) {
        
        MathError mathErr;
        uint principalTimesIndex;
        uint result;

        
        BorrowSnapshot storage borrowSnapshot = accountBorrows[account];

        
        if (borrowSnapshot.principal == 0) {
            return (MathError.NO_ERROR, 0);
        }


        
        (mathErr, principalTimesIndex) = mulUInt(borrowSnapshot.principal, borrowIndex);
        if (mathErr != MathError.NO_ERROR) {
            return (mathErr, 0);
        }

        (mathErr, result) = divUInt(principalTimesIndex, borrowSnapshot.interestIndex);
        if (mathErr != MathError.NO_ERROR) {
            return (mathErr, 0);
        }

        return (MathError.NO_ERROR, result);
    }

    
    function exchangeRateCurrent() public override nonReentrant returns (uint) {
        require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed");
        return exchangeRateStored();
    }

    
    function exchangeRateStored() public override view returns (uint) {
        (MathError err, uint result) = exchangeRateStoredInternal();
        require(err == MathError.NO_ERROR, "exchangeRateStoredInternal failed");
        return result;
    }

    
    function exchangeRateStoredInternal() internal virtual view returns (MathError, uint) {
        uint _totalSupply = totalSupply;
        if (_totalSupply == 0) {
            
            return (MathError.NO_ERROR, initialExchangeRateMantissa);
        } else {
            
            uint totalCash = getCashPrior();
            
            Exp memory exchangeRate;
            MathError mathErr;

            
            
            
            
            uint cashPlusBorrowsMinusReserves = totalCash + totalBorrows - totalReserves;

            (mathErr, exchangeRate) = getExp(cashPlusBorrowsMinusReserves, _totalSupply);
            if (mathErr != MathError.NO_ERROR) {
                return (mathErr, 0);
            }

            return (MathError.NO_ERROR, exchangeRate.mantissa);
        }
    }

    
    function getCash() external view override returns (uint) {
        return getCashPrior();
    }

    
    function accrueInterest() public override virtual returns (uint) {
        
        uint currentBlockNumber = getBlockNumber();
        uint accrualBlockNumberPrior = accrualBlockNumber;

        
        if (accrualBlockNumberPrior == currentBlockNumber) {
            return uint(Error.NO_ERROR);
        }

        
        uint cashPrior = getCashPrior();
        uint borrowsPrior = totalBorrows;
        uint reservesPrior = totalReserves;
        uint borrowIndexPrior = borrowIndex;

        
        uint borrowRateMantissa = interestRateModel.getBorrowRate(cashPrior, borrowsPrior, reservesPrior);
        require(borrowRateMantissa <= borrowRateMaxMantissa, "borrow rate is absurdly high");

        
        (MathError mathErr, uint blockDelta) = subUInt(currentBlockNumber, accrualBlockNumberPrior);
        require(mathErr == MathError.NO_ERROR, "block delta error");

        

        Exp memory simpleInterestFactor;
        uint interestAccumulated;
        uint totalBorrowsNew;
        uint totalReservesNew;
        uint borrowIndexNew;

        (mathErr, simpleInterestFactor) = mulScalar(Exp({mantissa: borrowRateMantissa}), blockDelta);
        if (mathErr != MathError.NO_ERROR) {
            return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_SIMPLE_INTEREST_FACTOR_CALCULATION_FAILED, uint(mathErr));
        }

        (mathErr, interestAccumulated) = mulScalarTruncate(simpleInterestFactor, borrowsPrior);
        if (mathErr != MathError.NO_ERROR) {
            return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_ACCUMULATED_INTEREST_CALCULATION_FAILED, uint(mathErr));
        }
        (mathErr, totalBorrowsNew) = addUInt(interestAccumulated, borrowsPrior);
        if (mathErr != MathError.NO_ERROR) {
            return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_NEW_TOTAL_BORROWS_CALCULATION_FAILED, uint(mathErr));
        }

        (mathErr, totalReservesNew) = mulScalarTruncateAddUInt(Exp({mantissa: reserveFactorMantissa}), interestAccumulated, reservesPrior);
        if (mathErr != MathError.NO_ERROR) {
            return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_NEW_TOTAL_RESERVES_CALCULATION_FAILED, uint(mathErr));
        }

        (mathErr, borrowIndexNew) = mulScalarTruncateAddUInt(simpleInterestFactor, borrowIndexPrior, borrowIndexPrior);
        if (mathErr != MathError.NO_ERROR) {
            return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_NEW_BORROW_INDEX_CALCULATION_FAILED, uint(mathErr));
        }

        
        
        

        
        accrualBlockNumber = currentBlockNumber;
        borrowIndex = borrowIndexNew;
        totalBorrows = totalBorrowsNew;
        totalReserves = totalReservesNew;

        
        emit AccrueInterest(cashPrior, interestAccumulated, borrowIndexNew, totalBorrowsNew);

        return uint(Error.NO_ERROR);
    }

    
    function mintInternal(uint mintAmount) internal nonReentrant returns (uint, uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return (fail(Error(error), FailureInfo.MINT_ACCRUE_INTEREST_FAILED), 0);
        }
        
        return mintFresh(msg.sender, mintAmount);
    }

    struct MintLocalVars {
        Error err;
        MathError mathErr;
        uint exchangeRateMantissa;
        uint mintTokens;
        uint totalSupplyNew;
        uint accountTokensNew;
        uint actualMintAmount;
    }

    
    function mintFresh(address minter, uint mintAmount) internal returns (uint, uint) {
        
        uint allowed = comptroller.mintAllowed(address(this), minter, mintAmount);
        if (allowed != 0) {
            return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.MINT_COMPTROLLER_REJECTION, allowed), 0);
        }
        
        if (accrualBlockNumber != getBlockNumber()) {
            return (fail(Error.MARKET_NOT_FRESH, FailureInfo.MINT_FRESHNESS_CHECK), 0);
        }
        MintLocalVars memory vars;

        (vars.mathErr, vars.exchangeRateMantissa) = exchangeRateStoredInternal();
        if (vars.mathErr != MathError.NO_ERROR) {
            return (failOpaque(Error.MATH_ERROR, FailureInfo.MINT_EXCHANGE_RATE_READ_FAILED, uint(vars.mathErr)), 0);
        }
        
        
        

        
        address payer = msg.sender;
        vars.actualMintAmount = doTransferIn(payer, mintAmount);
        

        (vars.mathErr, vars.mintTokens) = divScalarByExpTruncate(vars.actualMintAmount, Exp({mantissa: vars.exchangeRateMantissa}));
        require(vars.mathErr == MathError.NO_ERROR, "MINT_EXCHANGE_CALCULATION_FAILED");
        
        
        
        
        
        
        vars.totalSupplyNew = totalSupply + vars.mintTokens;
        vars.accountTokensNew = accountTokens[minter] + vars.mintTokens;
        totalSupply = vars.totalSupplyNew;
        accountTokens[minter] = vars.accountTokensNew;

        
        emit Mint(payer, minter, vars.actualMintAmount, vars.mintTokens);
        emit Transfer(address(this), minter, vars.mintTokens);

        
        
        

        return (uint(Error.NO_ERROR), vars.actualMintAmount);
    }

    
    function redeemInternal(uint redeemTokens) internal nonReentrant returns (uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return fail(Error(error), FailureInfo.REDEEM_ACCRUE_INTEREST_FAILED);
        }
        
        return redeemFresh(payable(msg.sender), redeemTokens, 0);
    }

    
    function redeemUnderlyingInternal(uint redeemAmount) internal nonReentrant returns (uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return fail(Error(error), FailureInfo.REDEEM_ACCRUE_INTEREST_FAILED);
        }
        
        return redeemFresh(payable(msg.sender), 0, redeemAmount);
    }

    struct RedeemLocalVars {
        Error err;
        MathError mathErr;
        uint exchangeRateMantissa;
        uint redeemTokens;
        uint redeemAmount;
        uint totalSupplyNew;
        uint accountTokensNew;
    }

    
    function redeemFresh(address payable redeemer, uint redeemTokensIn, uint redeemAmountIn) internal returns (uint) {
        require(redeemTokensIn == 0 || redeemAmountIn == 0, "one of redeemTokensIn or redeemAmountIn must be zero");

        RedeemLocalVars memory vars;

        
        (vars.mathErr, vars.exchangeRateMantissa) = exchangeRateStoredInternal();
        if (vars.mathErr != MathError.NO_ERROR) {
            return failOpaque(Error.MATH_ERROR, FailureInfo.REDEEM_EXCHANGE_RATE_READ_FAILED, uint(vars.mathErr));
        }

        
        if (redeemTokensIn > 0) {
            
            vars.redeemTokens = redeemTokensIn;

            (vars.mathErr, vars.redeemAmount) = mulScalarTruncate(Exp({mantissa: vars.exchangeRateMantissa}), redeemTokensIn);
            if (vars.mathErr != MathError.NO_ERROR) {
                return failOpaque(Error.MATH_ERROR, FailureInfo.REDEEM_EXCHANGE_TOKENS_CALCULATION_FAILED, uint(vars.mathErr));
            }
        } else {
            

            (vars.mathErr, vars.redeemTokens) = divScalarByExpTruncate(redeemAmountIn, Exp({mantissa: vars.exchangeRateMantissa}));
            if (vars.mathErr != MathError.NO_ERROR) {
                return failOpaque(Error.MATH_ERROR, FailureInfo.REDEEM_EXCHANGE_AMOUNT_CALCULATION_FAILED, uint(vars.mathErr));
            }

            vars.redeemAmount = redeemAmountIn;
        }

        
        uint allowed = comptroller.redeemAllowed(address(this), redeemer, vars.redeemTokens);
        if (allowed != 0) {
            return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.REDEEM_COMPTROLLER_REJECTION, allowed);
        }

        
        if (accrualBlockNumber != getBlockNumber()) {
            return fail(Error.MARKET_NOT_FRESH, FailureInfo.REDEEM_FRESHNESS_CHECK);
        }

        
        
        
        
        

        
        
        
        
        vars.totalSupplyNew = totalSupply - vars.redeemTokens;
        vars.accountTokensNew = accountTokens[redeemer] - vars.redeemTokens;

        
        if (getCashPrior() < vars.redeemAmount) {
            return fail(Error.TOKEN_INSUFFICIENT_CASH, FailureInfo.REDEEM_TRANSFER_OUT_NOT_POSSIBLE);
        }



        
        totalSupply = vars.totalSupplyNew;
        accountTokens[redeemer] = vars.accountTokensNew;

         
        doTransferOut(redeemer, vars.redeemAmount);

        
        emit Transfer(redeemer, address(this), vars.redeemTokens);
        emit Redeem(redeemer, vars.redeemAmount, vars.redeemTokens);

        
        comptroller.redeemVerify(address(this), redeemer, vars.redeemAmount, vars.redeemTokens);

        return uint(Error.NO_ERROR);
    }

    
    function borrowInternal(uint borrowAmount) internal nonReentrant returns (uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return fail(Error(error), FailureInfo.BORROW_ACCRUE_INTEREST_FAILED);
        }
        
        return borrowFresh(payable(msg.sender), borrowAmount);
    }

    struct BorrowLocalVars {
        MathError mathErr;
        uint accountBorrows;
        uint accountBorrowsNew;
        uint totalBorrowsNew;
    }

    
    function borrowFresh(address payable borrower, uint borrowAmount) internal returns (uint) {
        require(msg.sender == tx.origin, "contract call deny");
        
        uint allowed = comptroller.borrowAllowed(address(this), borrower, borrowAmount);
        if (allowed != 0) {
            return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.BORROW_COMPTROLLER_REJECTION, allowed);
        }

        
        if (accrualBlockNumber != getBlockNumber()) {
            return fail(Error.MARKET_NOT_FRESH, FailureInfo.BORROW_FRESHNESS_CHECK);
        }

        
        if (getCashPrior() < borrowAmount) {
            return fail(Error.TOKEN_INSUFFICIENT_CASH, FailureInfo.BORROW_CASH_NOT_AVAILABLE);
        }

        BorrowLocalVars memory vars;
        uint deltaFee;
        uint borrowAmountWithFee;

        
        (vars.mathErr, vars.accountBorrows) = borrowBalanceStoredInternal(borrower);
        if (vars.mathErr != MathError.NO_ERROR) {
            return failOpaque(Error.MATH_ERROR, FailureInfo.BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, uint(vars.mathErr));
        }

        
        
        
        

        
        
        
        
        vars.accountBorrowsNew = vars.accountBorrows + borrowAmount;
        vars.totalBorrowsNew = totalBorrows + borrowAmount;
	
        accountBorrows[borrower].principal = vars.accountBorrowsNew;
        accountBorrows[borrower].interestIndex = borrowIndex;
        
        
        

        
            totalBorrows = vars.totalBorrowsNew;
            doTransferOut(borrower, borrowAmount);
        


        
        emit Borrow(borrower, borrowAmount, vars.accountBorrowsNew, vars.totalBorrowsNew);

        
        
        

        return uint(Error.NO_ERROR);
    }

    
    function repayBorrowInternal(uint repayAmount) internal nonReentrant returns (uint, uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return (fail(Error(error), FailureInfo.REPAY_BORROW_ACCRUE_INTEREST_FAILED), 0);
        }
        
        return repayBorrowFresh(msg.sender, msg.sender, repayAmount);
    }

    
    function repayBorrowBehalfInternal(address borrower, uint repayAmount) internal nonReentrant returns (uint, uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return (fail(Error(error), FailureInfo.REPAY_BEHALF_ACCRUE_INTEREST_FAILED), 0);
        }
        
        return repayBorrowFresh(msg.sender, borrower, repayAmount);
    }

    struct RepayBorrowLocalVars {
        Error err;
        MathError mathErr;
        uint repayAmount;
        uint borrowerIndex;
        uint accountBorrows;
        uint accountBorrowsNew;
        uint totalBorrowsNew;
        uint actualRepayAmount;
    }

    
    function repayBorrowFresh(address payer, address borrower, uint repayAmount) internal returns (uint, uint) {
        
        uint allowed = comptroller.repayBorrowAllowed(address(this), payer, borrower, repayAmount);
        if (allowed != 0) {
            return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.REPAY_BORROW_COMPTROLLER_REJECTION, allowed), 0);
        }

        
        if (accrualBlockNumber != getBlockNumber()) {
            return (fail(Error.MARKET_NOT_FRESH, FailureInfo.REPAY_BORROW_FRESHNESS_CHECK), 0);
        }

        RepayBorrowLocalVars memory vars;

        
        vars.borrowerIndex = accountBorrows[borrower].interestIndex;

        
        (vars.mathErr, vars.accountBorrows) = borrowBalanceStoredInternal(borrower);
        if (vars.mathErr != MathError.NO_ERROR) {
            return (failOpaque(Error.MATH_ERROR, FailureInfo.REPAY_BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, uint(vars.mathErr)), 0);
        }

        
        if (repayAmount == type(uint).max) {
            vars.repayAmount = vars.accountBorrows;
        } else {
            vars.repayAmount = repayAmount;
        }

        
        
        

        
        vars.actualRepayAmount = doTransferIn(payer, vars.repayAmount);

        
        
        

        
        
        vars.accountBorrowsNew = vars.accountBorrows - vars.actualRepayAmount;
        vars.totalBorrowsNew = totalBorrows - vars.actualRepayAmount;

        
        accountBorrows[borrower].principal = vars.accountBorrowsNew;
        accountBorrows[borrower].interestIndex = borrowIndex;
        totalBorrows = vars.totalBorrowsNew;

        
        emit RepayBorrow(payer, borrower, vars.actualRepayAmount, vars.accountBorrowsNew, vars.totalBorrowsNew);

        
        
        

        return (uint(Error.NO_ERROR), vars.actualRepayAmount);
    }

    
    function liquidateBorrowInternal(address borrower, uint repayAmount, CTokenInterface cTokenCollateral) internal nonReentrant returns (uint, uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return (fail(Error(error), FailureInfo.LIQUIDATE_ACCRUE_BORROW_INTEREST_FAILED), 0);
        }

        error = cTokenCollateral.accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return (fail(Error(error), FailureInfo.LIQUIDATE_ACCRUE_COLLATERAL_INTEREST_FAILED), 0);
        }

        
        return liquidateBorrowFresh(msg.sender, borrower, repayAmount, cTokenCollateral);
    }

    
    function liquidateBorrowFresh(address liquidator, address borrower, uint repayAmount, CTokenInterface cTokenCollateral) internal returns (uint, uint) {
        
        uint allowed = comptroller.liquidateBorrowAllowed(address(this), address(cTokenCollateral), liquidator, borrower, repayAmount);
        if (allowed != 0) {
            return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.LIQUIDATE_COMPTROLLER_REJECTION, allowed), 0);
        }

        
        if (accrualBlockNumber != getBlockNumber()) {
            return (fail(Error.MARKET_NOT_FRESH, FailureInfo.LIQUIDATE_FRESHNESS_CHECK), 0);
        }

        
        if (cTokenCollateral.accrualBlockNumber() != getBlockNumber()) {
            return (fail(Error.MARKET_NOT_FRESH, FailureInfo.LIQUIDATE_COLLATERAL_FRESHNESS_CHECK), 0);
        }

        
        if (borrower == liquidator) {
            return (fail(Error.INVALID_ACCOUNT_PAIR, FailureInfo.LIQUIDATE_LIQUIDATOR_IS_BORROWER), 0);
        }

        
        if (repayAmount == 0) {
            return (fail(Error.INVALID_CLOSE_AMOUNT_REQUESTED, FailureInfo.LIQUIDATE_CLOSE_AMOUNT_IS_ZERO), 0);
        }

        
        if (repayAmount == type(uint).max) {
            return (fail(Error.INVALID_CLOSE_AMOUNT_REQUESTED, FailureInfo.LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX), 0);
        }


        
        (uint repayBorrowError, uint actualRepayAmount) = repayBorrowFresh(liquidator, borrower, repayAmount);
        if (repayBorrowError != uint(Error.NO_ERROR)) {
            return (fail(Error(repayBorrowError), FailureInfo.LIQUIDATE_REPAY_BORROW_FRESH_FAILED), 0);
        }

        
        
        

        
        (uint amountSeizeError, uint seizeTokens) = comptroller.liquidateCalculateSeizeTokens(address(this), address(cTokenCollateral), actualRepayAmount);
        require(amountSeizeError == uint(Error.NO_ERROR), "CALCULATE_AMOUNT_SEIZE_FAILED");

        
        require(cTokenCollateral.balanceOf(borrower) >= seizeTokens, "LIQUIDATE_SEIZE_TOO_MUCH");

        
        uint seizeError;
        if (address(cTokenCollateral) == address(this)) {
            seizeError = seizeInternal(address(this), liquidator, borrower, seizeTokens);
        } else {
            seizeError = cTokenCollateral.seize(liquidator, borrower, seizeTokens);
        }

        
        require(seizeError == uint(Error.NO_ERROR), "token seizure failed");

        
        emit LiquidateBorrow(liquidator, borrower, actualRepayAmount, address(cTokenCollateral), seizeTokens);

        
        
        

        return (uint(Error.NO_ERROR), actualRepayAmount);
    }

    
    function seize(address liquidator, address borrower, uint seizeTokens) external override nonReentrant returns (uint) {
        return seizeInternal(msg.sender, liquidator, borrower, seizeTokens);
    }

    
    function seizeInternal(address seizerToken, address liquidator, address borrower, uint seizeTokens) internal returns (uint) {
        
        uint allowed = comptroller.seizeAllowed(address(this), seizerToken, liquidator, borrower, seizeTokens);
        if (allowed != 0) {
            return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.LIQUIDATE_SEIZE_COMPTROLLER_REJECTION, allowed);
        }

        
        if (borrower == liquidator) {
            return fail(Error.INVALID_ACCOUNT_PAIR, FailureInfo.LIQUIDATE_SEIZE_LIQUIDATOR_IS_BORROWER);
        }

        
        
        

        
        
        
        
        

        
        
        
        
        uint borrowerTokensNew = accountTokens[borrower] - seizeTokens;
        uint liquidatorTokensNew = accountTokens[liquidator] + seizeTokens;

        
        
        

        
        accountTokens[borrower] = borrowerTokensNew;
        accountTokens[liquidator] = liquidatorTokensNew;

        
        emit Transfer(borrower, liquidator, seizeTokens);

        
        
        

        return uint(Error.NO_ERROR);
    }


    

    
    function _setPendingAdmin(address payable newPendingAdmin) external override returns (uint) {
        
        if (msg.sender != admin) {
            return fail(Error.UNAUTHORIZED, FailureInfo.SET_PENDING_ADMIN_OWNER_CHECK);
        }

        
        address oldPendingAdmin = pendingAdmin;

        
        pendingAdmin = newPendingAdmin;

        
        emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin);

        return uint(Error.NO_ERROR);
    }

    
    function _acceptAdmin() external override returns (uint) {
        
        if (msg.sender != pendingAdmin || msg.sender == address(0)) {
            return fail(Error.UNAUTHORIZED, FailureInfo.ACCEPT_ADMIN_PENDING_ADMIN_CHECK);
        }

        
        address oldAdmin = admin;
        address oldPendingAdmin = pendingAdmin;

        
        admin = pendingAdmin;

        
        pendingAdmin = payable(address(0));

        emit NewAdmin(oldAdmin, admin);
        emit NewPendingAdmin(oldPendingAdmin, pendingAdmin);

        return uint(Error.NO_ERROR);
    }

    
    function _setComptroller(ComptrollerInterface newComptroller) public override returns (uint) {
        
        if (msg.sender != admin) {
            return fail(Error.UNAUTHORIZED, FailureInfo.SET_COMPTROLLER_OWNER_CHECK);
        }

        ComptrollerInterface oldComptroller = comptroller;
        
        require(newComptroller.isComptroller(), "marker method returned false");

        
        comptroller = newComptroller;

        
        emit NewComptroller(oldComptroller, newComptroller);

        return uint(Error.NO_ERROR);
    }

    
    function _setReserveFactor(uint newReserveFactorMantissa) external override nonReentrant returns (uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return fail(Error(error), FailureInfo.SET_RESERVE_FACTOR_ACCRUE_INTEREST_FAILED);
        }
        
        return _setReserveFactorFresh(newReserveFactorMantissa);
    }

    
    function _setReserveFactorFresh(uint newReserveFactorMantissa) internal returns (uint) {
        
        if (msg.sender != admin) {
            return fail(Error.UNAUTHORIZED, FailureInfo.SET_RESERVE_FACTOR_ADMIN_CHECK);
        }

        
        if (accrualBlockNumber != getBlockNumber()) {
            return fail(Error.MARKET_NOT_FRESH, FailureInfo.SET_RESERVE_FACTOR_FRESH_CHECK);
        }

        
        if (newReserveFactorMantissa > reserveFactorMaxMantissa) {
            return fail(Error.BAD_INPUT, FailureInfo.SET_RESERVE_FACTOR_BOUNDS_CHECK);
        }

        uint oldReserveFactorMantissa = reserveFactorMantissa;
        reserveFactorMantissa = newReserveFactorMantissa;

        emit NewReserveFactor(oldReserveFactorMantissa, newReserveFactorMantissa);

        return uint(Error.NO_ERROR);
    }

    
    function _addReservesInternal(uint addAmount) internal nonReentrant returns (uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return fail(Error(error), FailureInfo.ADD_RESERVES_ACCRUE_INTEREST_FAILED);
        }

        
        (error, ) = _addReservesFresh(addAmount);
        return error;
    }

    
    function _addReservesFresh(uint addAmount) internal returns (uint, uint) {
        
        uint totalReservesNew;
        uint actualAddAmount;

        
        if (accrualBlockNumber != getBlockNumber()) {
            return (fail(Error.MARKET_NOT_FRESH, FailureInfo.ADD_RESERVES_FRESH_CHECK), actualAddAmount);
        }

        
        
        

        

        actualAddAmount = doTransferIn(msg.sender, addAmount);

        totalReservesNew = totalReserves + actualAddAmount;

        
        require(totalReservesNew >= totalReserves, "add reserves overflow");

        
        totalReserves = totalReservesNew;

        
        emit ReservesAdded(msg.sender, actualAddAmount, totalReservesNew);

        
        return (uint(Error.NO_ERROR), actualAddAmount);
    }


    
    function _reduceReserves(uint reduceAmount) external override nonReentrant returns (uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return fail(Error(error), FailureInfo.REDUCE_RESERVES_ACCRUE_INTEREST_FAILED);
        }
        
        return _reduceReservesFresh(reduceAmount);
    }

    
    function _reduceReservesFresh(uint reduceAmount) internal returns (uint) {
        
        uint totalReservesNew;

        
        if (msg.sender != admin) {
            return fail(Error.UNAUTHORIZED, FailureInfo.REDUCE_RESERVES_ADMIN_CHECK);
        }

        
        if (accrualBlockNumber != getBlockNumber()) {
            return fail(Error.MARKET_NOT_FRESH, FailureInfo.REDUCE_RESERVES_FRESH_CHECK);
        }

        
        if (getCashPrior() < reduceAmount) {
            return fail(Error.TOKEN_INSUFFICIENT_CASH, FailureInfo.REDUCE_RESERVES_CASH_NOT_AVAILABLE);
        }

        
        if (reduceAmount > totalReserves) {
            return fail(Error.BAD_INPUT, FailureInfo.REDUCE_RESERVES_VALIDATION);
        }

        
        
        

        totalReservesNew = totalReserves - reduceAmount;
        
        require(totalReservesNew <= totalReserves, "reduce reserves underflow");

        
        totalReserves = totalReservesNew;

        
        doTransferOut(payable(admin), reduceAmount);

        emit ReservesReduced(admin, reduceAmount, totalReservesNew);

        return uint(Error.NO_ERROR);
    }

    
    function _setInterestRateModel(InterestRateModel newInterestRateModel) public override returns (uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return fail(Error(error), FailureInfo.SET_INTEREST_RATE_MODEL_ACCRUE_INTEREST_FAILED);
        }
        
        return _setInterestRateModelFresh(newInterestRateModel);
    }

    
    function _setInterestRateModelFresh(InterestRateModel newInterestRateModel) internal returns (uint) {

        
        InterestRateModel oldInterestRateModel;

        
        if (msg.sender != admin) {
            return fail(Error.UNAUTHORIZED, FailureInfo.SET_INTEREST_RATE_MODEL_OWNER_CHECK);
        }

        
        if (accrualBlockNumber != getBlockNumber()) {
            return fail(Error.MARKET_NOT_FRESH, FailureInfo.SET_INTEREST_RATE_MODEL_FRESH_CHECK);
        }

        
        oldInterestRateModel = interestRateModel;

        
        require(newInterestRateModel.isInterestRateModel(), "marker method returned false");

        
        interestRateModel = newInterestRateModel;

        
        emit NewMarketInterestRateModel(oldInterestRateModel, newInterestRateModel);

        return uint(Error.NO_ERROR);
    }

    

    
    function getCashPrior() internal virtual view returns (uint);

    
    function doTransferIn(address from, uint amount) internal virtual returns (uint);

    
    function doTransferOut(address payable to, uint amount) internal virtual;

    

    
    modifier nonReentrant() {
        require(_notEntered, "re-entered");
        _notEntered = false;
        _;
        _notEntered = true; 
    }

    
    function mintBehalfInternal(address receiver, uint mintAmount) internal virtual nonReentrant returns (uint, uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return (fail(Error(error), FailureInfo.MINT_ACCRUE_INTEREST_FAILED), 0);
        }
        
        return mintFresh(receiver, mintAmount);
    }

}





            
pragma solidity >=0.8.0;




contract CErc20 is CToken, CErc20Interface {
    
    function initialize(address underlying_,
                        ComptrollerInterface comptroller_,
                        InterestRateModel interestRateModel_,
                        uint initialExchangeRateMantissa_,
                        string memory name_,
                        string memory symbol_,
                        uint8 decimals_) public {
        
        super.initialize(comptroller_, interestRateModel_, initialExchangeRateMantissa_, name_, symbol_, decimals_);
        
        underlying = underlying_;
        EIP20Interface(underlying).totalSupply();
    }

    

    
    function mint(uint mintAmount) external override returns (uint) {
        (uint err,) = mintInternal(mintAmount);
        return err;
    }

    
    function redeem(uint redeemTokens) external override returns (uint) {
        return redeemInternal(redeemTokens);
    }

    
    function redeemUnderlying(uint redeemAmount) external override returns (uint) {
        return redeemUnderlyingInternal(redeemAmount);
    }

    
    function borrow(uint borrowAmount) external override returns (uint) {
        return borrowInternal(borrowAmount);
    }

    
    function repayBorrow(uint repayAmount) external override returns (uint) {
        (uint err,) = repayBorrowInternal(repayAmount);
        return err;
    }

    
    function repayBorrowBehalf(address borrower, uint repayAmount) external override returns (uint) {
        (uint err,) = repayBorrowBehalfInternal(borrower, repayAmount);
        return err;
    }

    
    function liquidateBorrow(address borrower, uint repayAmount, CTokenInterface cTokenCollateral) external override returns (uint) {
        (uint err,) = liquidateBorrowInternal(borrower, repayAmount, cTokenCollateral);
        return err;
    }

    
    function sweepToken(EIP20NonStandardInterface token) external override {
    	require(address(token) != underlying, "CErc20::sweepToken: can not sweep underlying token");
    	uint256 balance = token.balanceOf(address(this));
    	token.transfer(admin, balance);
    }

    
    function _addReserves(uint addAmount) external override returns (uint) {
        return _addReservesInternal(addAmount);
    }

    

    
    function getCashPrior() internal override virtual view returns (uint) {
        EIP20Interface token = EIP20Interface(underlying);
        return token.balanceOf(address(this));
    }

    
    function doTransferIn(address from, uint amount) internal override virtual returns (uint) {
        EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying);
        uint balanceBefore = EIP20Interface(underlying).balanceOf(address(this));
        token.transferFrom(from, address(this), amount);

        bool success;
        assembly {
            switch returndatasize()
                case 0 {                       
                    success := not(0)          
                }
                case 32 {                      
                    returndatacopy(0, 0, 32)
                    success := mload(0)        
                }
                default {                      
                    revert(0, 0)
                }
        }
        require(success, "TOKEN_TRANSFER_IN_FAILED");

        
        uint balanceAfter = EIP20Interface(underlying).balanceOf(address(this));
        require(balanceAfter >= balanceBefore, "TOKEN_TRANSFER_IN_OVERFLOW");
        return balanceAfter - balanceBefore;   
    }

    
    function doTransferOut(address payable to, uint amount) internal override virtual {
        EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying);
        token.transfer(to, amount);

        bool success;
        assembly {
            switch returndatasize()
                case 0 {                      
                    success := not(0)          
                }
                case 32 {                     
                    returndatacopy(0, 0, 32)
                    success := mload(0)        
                }
                default {                     
                    revert(0, 0)
                }
        }
        require(success, "TOKEN_TRANSFER_OUT_FAILED");
    }

    
    function mintBehalf(address receiver, uint mintAmount) external override returns (uint) {
        require(mintAmount != 0, "mintAmount error");
        (uint err,) = mintBehalfInternal(receiver, mintAmount);
        requireNoError(err, "mintBehalf failed");
        return err;
    }
    function requireNoError(uint errCode, string memory message) internal pure {
        if (errCode == uint(Error.NO_ERROR)) {
            return;
        }
        bytes memory fullMessage = new bytes(bytes(message).length + 5);
        uint i;
        for (i = 0; i < bytes(message).length; i++) {
            fullMessage[i] = bytes(message)[i];
        }
        fullMessage[i+0] = bytes1(uint8(32));
        fullMessage[i+1] = bytes1(uint8(40));
        fullMessage[i+2] = bytes1(uint8(48 + ( errCode / 10 )));
        fullMessage[i+3] = bytes1(uint8(48 + ( errCode % 10 )));
        fullMessage[i+4] = bytes1(uint8(41));
        require(errCode == uint(Error.NO_ERROR), string(fullMessage));
    }
}




pragma solidity >=0.8.0;




contract CErc20Immutable is CErc20 {
    
    constructor(address underlying_,
                ComptrollerInterface comptroller_,
                InterestRateModel interestRateModel_,
                uint initialExchangeRateMantissa_,
                string memory name_,
                string memory symbol_,
                uint8 decimals_,
                address payable admin_) public {
        
        admin = payable(msg.sender);

        
        initialize(underlying_, comptroller_, interestRateModel_, initialExchangeRateMantissa_, name_, symbol_, decimals_);

        
        admin = admin_;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"underlying_","type":"address"},{"internalType":"contract ComptrollerInterface","name":"comptroller_","type":"address"},{"internalType":"contract InterestRateModel","name":"interestRateModel_","type":"address"},{"internalType":"uint256","name":"initialExchangeRateMantissa_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"address payable","name":"admin_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"cashPrior","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"interestAccumulated","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"borrowIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBorrows","type":"uint256"}],"name":"AccrueInterest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accountBorrows","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBorrows","type":"uint256"}],"name":"Borrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"error","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"info","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"detail","type":"uint256"}],"name":"Failure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"liquidator","type":"address"},{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"repayAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"cTokenCollateral","type":"address"},{"indexed":false,"internalType":"uint256","name":"seizeTokens","type":"uint256"}],"name":"LiquidateBorrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"insufficientLeverage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldBorrowPrincipal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBorrowPrincipal","type":"uint256"}],"name":"LiquidateLeverage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintTokens","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"NewAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ComptrollerInterface","name":"oldComptroller","type":"address"},{"indexed":false,"internalType":"contract ComptrollerInterface","name":"newComptroller","type":"address"}],"name":"NewComptroller","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract InterestRateModel","name":"oldInterestRateModel","type":"address"},{"indexed":false,"internalType":"contract InterestRateModel","name":"newInterestRateModel","type":"address"}],"name":"NewMarketInterestRateModel","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldVeeProxy","type":"address"},{"indexed":false,"internalType":"address","name":"newVeeProxy","type":"address"}],"name":"NewOrderProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPendingAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"NewPendingAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldReserveFactorMantissa","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newReserveFactorMantissa","type":"uint256"}],"name":"NewReserveFactor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"redeemTokens","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"repayAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accountBorrows","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBorrows","type":"uint256"}],"name":"RepayBorrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"repayAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expectLeverageAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remainLeverageAmount","type":"uint256"}],"name":"RepayLeverage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"benefactor","type":"address"},{"indexed":false,"internalType":"uint256","name":"addAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalReserves","type":"uint256"}],"name":"ReservesAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"reduceAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalReserves","type":"uint256"}],"name":"ReservesReduced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_acceptAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"addAmount","type":"uint256"}],"name":"_addReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reduceAmount","type":"uint256"}],"name":"_reduceReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ComptrollerInterface","name":"newComptroller","type":"address"}],"name":"_setComptroller","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract InterestRateModel","name":"newInterestRateModel","type":"address"}],"name":"_setInterestRateModel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newPendingAdmin","type":"address"}],"name":"_setPendingAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newReserveFactorMantissa","type":"uint256"}],"name":"_setReserveFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accrualBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accrueInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOfUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"}],"name":"borrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"borrowBalanceCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"borrowBalanceStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"comptroller","outputs":[{"internalType":"contract ComptrollerInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exchangeRateCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exchangeRateStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountSnapshot","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying_","type":"address"},{"internalType":"contract ComptrollerInterface","name":"comptroller_","type":"address"},{"internalType":"contract InterestRateModel","name":"interestRateModel_","type":"address"},{"internalType":"uint256","name":"initialExchangeRateMantissa_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ComptrollerInterface","name":"comptroller_","type":"address"},{"internalType":"contract InterestRateModel","name":"interestRateModel_","type":"address"},{"internalType":"uint256","name":"initialExchangeRateMantissa_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interestRateModel","outputs":[{"internalType":"contract InterestRateModel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"repayAmount","type":"uint256"},{"internalType":"contract CTokenInterface","name":"cTokenCollateral","type":"address"}],"name":"liquidateBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"mintBehalf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"orderProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"redeemTokens","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"redeemAmount","type":"uint256"}],"name":"redeemUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"repayAmount","type":"uint256"}],"name":"repayBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"repayAmount","type":"uint256"}],"name":"repayBorrowBehalf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveFactorMantissa","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"liquidator","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"seizeTokens","type":"uint256"}],"name":"seize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract EIP20NonStandardInterface","name":"token","type":"address"}],"name":"sweepToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBorrows","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBorrowsCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102f15760003560e01c806373acee981161019d578063bd6d894d116100e9578063f2b3abbd116100a2578063f851a4401161007c578063f851a4401461068a578063f8f9da28146106a2578063fca7820b146106aa578063fe9c44ae146106bd57600080fd5b8063f2b3abbd14610651578063f3fdb15a14610664578063f5e3c4621461067757600080fd5b8063bd6d894d146105af578063c37f68e2146105b7578063c5ebeaec146105ea578063db006a75146105fd578063dd62ed3e14610610578063e9c714f21461064957600080fd5b8063a0712d6811610156578063aa5af0fd11610130578063aa5af0fd14610578578063ae9d70b014610581578063b2a02ff114610589578063b71d1a0c1461059c57600080fd5b8063a0712d681461054a578063a6afed951461055d578063a9059cbb1461056557600080fd5b806373acee98146104f8578063852a12e3146105005780638f840ddd1461051357806395d89b411461051c57806395dd91931461052457806399d8c1b41461053757600080fd5b8063267822471161025c57806347bd371811610215578063601a0bf1116101ef578063601a0bf1146104a05780636c540baf146104b35780636f307dc3146104bc57806370a08231146104cf57600080fd5b806347bd3718146104715780634ead96be1461047a5780635fe3b5671461048d57600080fd5b806326782247146103e6578063313ce567146104115780633af9e669146104305780633b1d21a2146104435780633e9410101461044b5780634576b5db1461045e57600080fd5b8063182df0f5116102ae578063182df0f51461037d5780631a31d465146103855780631be195601461039a57806323323e03146103ad57806323b872dd146103c05780632608f818146103d357600080fd5b806306fdde03146102f6578063095ea7b3146103145780630e75270214610337578063173b99041461035857806317bfdfbc1461036157806318160ddd14610374575b600080fd5b6102fe6106c5565b60405161030b919061489d565b60405180910390f35b6103276103223660046146f1565b610753565b604051901515815260200161030b565b61034a610345366004614823565b6107c3565b60405190815260200161030b565b61034a60085481565b61034a61036f3660046145a4565b6107d7565b61034a600d5481565b61034a610850565b61039861039336600461463b565b6108cd565b005b6103986103a83660046145a4565b610971565b61034a6103bb3660046146f1565b610ad5565b6103276103ce3660046145fa565b610b60565b61034a6103e13660046146f1565b610bb0565b6004546103f9906001600160a01b031681565b6040516001600160a01b03909116815260200161030b565b60035461041e9060ff1681565b60405160ff909116815260200161030b565b61034a61043e3660046145a4565b610bc6565b61034a610c76565b61034a610459366004614823565b610c85565b61034a61046c3660046145a4565b610c90565b61034a600b5481565b600e546103f9906001600160a01b031681565b6005546103f9906001600160a01b031681565b61034a6104ae366004614823565b610de4565b61034a60095481565b6012546103f9906001600160a01b031681565b61034a6104dd3660046145a4565b6001600160a01b03166000908152600f602052604090205490565b61034a610e63565b61034a61050e366004614823565b610ec9565b61034a600c5481565b6102fe610ed4565b61034a6105323660046145a4565b610ee1565b610398610545366004614781565b610f60565b61034a610558366004614823565b6111bb565b61034a6111c7565b6103276105733660046146f1565b61153c565b61034a600a5481565b61034a61158b565b61034a6105973660046145fa565b611632565b61034a6105aa3660046145a4565b611681565b61034a611701565b6105ca6105c53660046145a4565b61176d565b60408051948552602085019390935291830152606082015260800161030b565b61034a6105f8366004614823565b61180e565b61034a61060b366004614823565b611819565b61034a61061e3660046145c1565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b61034a611824565b61034a61065f3660046145a4565b61191c565b6006546103f9906001600160a01b031681565b61034a61068536600461471d565b611954565b6003546103f99061010090046001600160a01b031681565b61034a61196c565b61034a6106b8366004614823565b6119bf565b610327600181565b600180546106d2906149a8565b80601f01602080910402602001604051908101604052809291908181526020018280546106fe906149a8565b801561074b5780601f106107205761010080835404028352916020019161074b565b820191906000526020600020905b81548152906001019060200180831161072e57829003601f168201915b505050505081565b3360008181526010602090815260408083206001600160a01b03871680855292528083208590555191929182907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107af9087815260200190565b60405180910390a360019150505b92915050565b6000806107cf83611a21565b509392505050565b6000805460ff166108035760405162461bcd60e51b81526004016107fa90614922565b60405180910390fd5b6000805460ff191681556108156111c7565b146108325760405162461bcd60e51b81526004016107fa906148f2565b61083b82610ee1565b90505b6000805460ff19166001179055919050565b600080600061085d611aad565b9092509050600082600381111561087657610876614a3e565b146107bd5760405162461bcd60e51b815260206004820152602160248201527f65786368616e67655261746553746f726564496e7465726e616c206661696c656044820152601960fa1b60648201526084016107fa565b6108db868686868686610f60565b601280546001600160a01b0319166001600160a01b038916908117909155604080516318160ddd60e01b815290516318160ddd91600480820192602092909190829003018186803b15801561092f57600080fd5b505afa158015610943573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610967919061483c565b5050505050505050565b6012546001600160a01b03828116911614156109ea5760405162461bcd60e51b815260206004820152603260248201527f4345726332303a3a7377656570546f6b656e3a2063616e206e6f74207377656560448201527138103ab73232b9363cb4b733903a37b5b2b760711b60648201526084016107fa565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015610a2c57600080fd5b505afa158015610a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a64919061483c565b60035460405163a9059cbb60e01b81526001600160a01b03610100909204821660048201526024810183905291925083169063a9059cbb90604401600060405180830381600087803b158015610ab957600080fd5b505af1158015610acd573d6000803e3d6000fd5b505050505050565b600081610b175760405162461bcd60e51b815260206004820152601060248201526f36b4b73a20b6b7bab73a1032b93937b960811b60448201526064016107fa565b6000610b238484611b4c565b509050610b5981604051806040016040528060118152602001701b5a5b9d10995a185b198819985a5b1959607a1b815250611bd9565b9392505050565b6000805460ff16610b835760405162461bcd60e51b81526004016107fa90614922565b6000805460ff19168155610b9933868686611e02565b1490506000805460ff191660011790559392505050565b600080610bbd848461202b565b50949350505050565b6000806040518060200160405280610bdc611701565b90526001600160a01b0384166000908152600f6020526040812054919250908190610c08908490612091565b90925090506000826003811115610c2157610c21614a3e565b14610c6e5760405162461bcd60e51b815260206004820152601f60248201527f62616c616e636520636f756c64206e6f742062652063616c63756c617465640060448201526064016107fa565b949350505050565b6000610c806120e4565b905090565b60006107bd82612168565b60035460009061010090046001600160a01b03163314610cb6576107bd6001603f6121e0565b60055460408051623f1ee960e11b815290516001600160a01b0392831692851691627e3dd2916004808301926020929190829003018186803b158015610cfb57600080fd5b505afa158015610d0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d33919061475f565b610d7f5760405162461bcd60e51b815260206004820152601c60248201527f6d61726b6572206d6574686f642072657475726e65642066616c73650000000060448201526064016107fa565b600580546001600160a01b0319166001600160a01b0385811691821790925560408051928416835260208301919091527f7ac369dbd14fa5ea3f473ed67cc9d598964a77501540ba6751eb0b3decf5870d91015b60405180910390a160009392505050565b6000805460ff16610e075760405162461bcd60e51b81526004016107fa90614922565b6000805460ff19168155610e196111c7565b90508015610e4557610e3d816010811115610e3657610e36614a3e565b60306121e0565b91505061083e565b610e4e83612259565b9150506000805460ff19166001179055919050565b6000805460ff16610e865760405162461bcd60e51b81526004016107fa90614922565b6000805460ff19168155610e986111c7565b14610eb55760405162461bcd60e51b81526004016107fa906148f2565b50600b546000805460ff1916600117905590565b60006107bd82612397565b600280546106d2906149a8565b6000806000610eef846123fc565b90925090506000826003811115610f0857610f08614a3e565b14610b595760405162461bcd60e51b815260206004820152602260248201527f626f72726f7742616c616e636553746f726564496e7465726e616c206661696c604482015261195960f21b60648201526084016107fa565b60035461010090046001600160a01b03163314610fcb5760405162461bcd60e51b8152602060048201526024808201527f6f6e6c792061646d696e206d617920696e697469616c697a6520746865206d616044820152631c9ad95d60e21b60648201526084016107fa565b600954158015610fdb5750600a54155b6110335760405162461bcd60e51b815260206004820152602360248201527f6d61726b6574206d6179206f6e6c7920626520696e697469616c697a6564206f6044820152626e636560e81b60648201526084016107fa565b60078490558361109e5760405162461bcd60e51b815260206004820152603060248201527f696e697469616c2065786368616e67652072617465206d75737420626520677260448201526f32b0ba32b9103a3430b7103d32b9379760811b60648201526084016107fa565b60006110a987610c90565b905080156110f95760405162461bcd60e51b815260206004820152601a60248201527f73657474696e6720636f6d7074726f6c6c6572206661696c656400000000000060448201526064016107fa565b43600955670de0b6b3a7640000600a55611112866124b5565b9050801561116d5760405162461bcd60e51b815260206004820152602260248201527f73657474696e6720696e7465726573742072617465206d6f64656c206661696c604482015261195960f21b60648201526084016107fa565b8351611180906001906020870190614468565b508251611194906002906020860190614468565b50506003805460ff90921660ff199283161790556000805490911660011790555050505050565b6000806107cf8361261f565b6009546000904390808214156111e15760005b9250505090565b60006111eb6120e4565b600b54600c54600a546006546040516315f2405360e01b81526004810186905260248101859052604481018490529495509293919290916000916001600160a01b0316906315f240539060640160206040518083038186803b15801561125057600080fd5b505afa158015611264573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611288919061483c565b905065048c273950008111156112e05760405162461bcd60e51b815260206004820152601c60248201527f626f72726f772072617465206973206162737572646c7920686967680000000060448201526064016107fa565b6000806112ed898961267d565b9092509050600082600381111561130657611306614a3e565b146113475760405162461bcd60e51b8152602060048201526011602482015270313637b1b5903232b63a309032b93937b960791b60448201526064016107fa565b60408051602081019091526000815260008060008061137460405180602001604052808a815250876126a8565b9097509450600087600381111561138d5761138d614a3e565b146113c3576113b0600960068960038111156113ab576113ab614a3e565b612724565b9e50505050505050505050505050505090565b6113cd858c612091565b909750935060008760038111156113e6576113e6614a3e565b14611404576113b0600960018960038111156113ab576113ab614a3e565b61140e848c61279c565b9097509250600087600381111561142757611427614a3e565b14611445576113b0600960048960038111156113ab576113ab614a3e565b6114606040518060200160405280600854815250858c6127cc565b9097509150600087600381111561147957611479614a3e565b14611497576113b0600960058960038111156113ab576113ab614a3e565b6114a2858a8b6127cc565b909750905060008760038111156114bb576114bb614a3e565b146114d9576113b0600960038960038111156113ab576113ab614a3e565b60098e9055600a819055600b839055600c829055604080518d815260208101869052908101829052606081018490527f4dec04e750ca11537cabcd8a9eab06494de08da3735bc8871cd41250e190bc049060800160405180910390a160006113b0565b6000805460ff1661155f5760405162461bcd60e51b81526004016107fa90614922565b6000805460ff1916815561157533338686611e02565b1490506000805460ff1916600117905592915050565b6006546000906001600160a01b031663b81688166115a76120e4565b600b54600c546008546040516001600160e01b031960e087901b16815260048101949094526024840192909252604483015260648201526084015b60206040518083038186803b1580156115fa57600080fd5b505afa15801561160e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c80919061483c565b6000805460ff166116555760405162461bcd60e51b81526004016107fa90614922565b6000805460ff1916905561166b33858585612827565b90506000805460ff191660011790559392505050565b60035460009061010090046001600160a01b031633146116a7576107bd600160456121e0565b600480546001600160a01b038481166001600160a01b031983168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610dd3565b6000805460ff166117245760405162461bcd60e51b81526004016107fa90614922565b6000805460ff191681556117366111c7565b146117535760405162461bcd60e51b81526004016107fa906148f2565b61175b610850565b90506000805460ff1916600117905590565b6001600160a01b0381166000908152600f6020526040812054819081908190818080611798896123fc565b9350905060008160038111156117b0576117b0614a3e565b146117ce5760095b6000806000975097509750975050505050611807565b6117d6611aad565b9250905060008160038111156117ee576117ee614a3e565b146117fa5760096117b8565b5060009650919450925090505b9193509193565b60006107bd826129b2565b60006107bd82612a15565b6004546000906001600160a01b03163314158061183f575033155b1561185057610c80600160006121e0565b60038054600480546001600160a01b03808216610100818102610100600160a81b0319871617968790556001600160a01b031990931690935560408051948390048216808652929095041660208401529290917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600454604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a9910160405180910390a160006111da565b6000806119276111c7565b9050801561194b57610b5981601081111561194457611944614a3e565b60406121e0565b610b59836124b5565b600080611962858585612a73565b5095945050505050565b6006546000906001600160a01b03166315f240536119886120e4565b600b54600c546040516001600160e01b031960e086901b1681526004810193909352602483019190915260448201526064016115e2565b6000805460ff166119e25760405162461bcd60e51b81526004016107fa90614922565b6000805460ff191681556119f46111c7565b90508015611a1857610e3d816010811115611a1157611a11614a3e565b60466121e0565b610e4e83612b9a565b60008054819060ff16611a465760405162461bcd60e51b81526004016107fa90614922565b6000805460ff19168155611a586111c7565b90508015611a8857611a7c816010811115611a7557611a75614a3e565b60366121e0565b60009250925050611a99565b611a93333386612c2f565b92509250505b6000805460ff191660011790559092909150565b600d54600090819080611ac7575050600754600092909150565b6000611ad16120e4565b9050611ae96040518060200160405280600081525090565b600080600c54600b5485611afd9190614946565b611b079190614991565b9050611b138186612ef0565b935091506000826003811115611b2b57611b2b614a3e565b14611b3d575095600095509350505050565b50505160009590945092505050565b60008054819060ff16611b715760405162461bcd60e51b81526004016107fa90614922565b6000805460ff19168155611b836111c7565b90508015611bb357611ba7816010811115611ba057611ba0614a3e565b601e6121e0565b60009250925050611bc3565b611bbd8585612fbb565b92509250505b6000805460ff1916600117905590939092509050565b81611be2575050565b600081516005611bf29190614946565b67ffffffffffffffff811115611c0a57611c0a614a6a565b6040519080825280601f01601f191660200182016040528015611c34576020820181803683370190505b50905060005b8251811015611c9b57828181518110611c5557611c55614a54565b602001015160f81c60f81b828281518110611c7257611c72614a54565b60200101906001600160f81b031916908160001a90535080611c93816149e3565b915050611c3a565b600160fd1b82611cac836000614946565b81518110611cbc57611cbc614a54565b60200101906001600160f81b031916908160001a905350600560fb1b82611ce4836001614946565b81518110611cf457611cf4614a54565b60200101906001600160f81b031916908160001a905350611d16600a8561495e565b611d21906030614946565b60f81b82611d30836002614946565b81518110611d4057611d40614a54565b60200101906001600160f81b031916908160001a905350611d62600a856149fe565b611d6d906030614946565b60f81b82611d7c836003614946565b81518110611d8c57611d8c614a54565b60200101906001600160f81b031916908160001a905350602960f81b82611db4836004614946565b81518110611dc457611dc4614a54565b60200101906001600160f81b031916908160001a905350818415611dfb5760405162461bcd60e51b81526004016107fa919061489d565b5050505050565b6005546040516317b9b84b60e31b81523060048201526001600160a01b038581166024830152848116604483015260648201849052600092839291169063bdcdc25890608401602060405180830381600087803b158015611e6257600080fd5b505af1158015611e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9a919061483c565b90508015611eb757611eaf6003604a83612724565b915050610c6e565b836001600160a01b0316856001600160a01b03161415611edd57611eaf6002604b6121e0565b6000856001600160a01b0316876001600160a01b03161415611f025750600019611f2a565b506001600160a01b038086166000908152601060209081526040808320938a16835292905220545b6000611f368583614991565b6001600160a01b0388166000908152600f602052604081205491925090611f5e908790614991565b6001600160a01b0388166000908152600f602052604081205491925090611f86908890614946565b6001600160a01b03808b166000908152600f6020526040808220869055918b1681522081905590506000198414611fe0576001600160a01b03808a166000908152601060209081526040808320938e168352929052208390555b876001600160a01b0316896001600160a01b0316600080516020614a998339815191528960405161201391815260200190565b60405180910390a35060009998505050505050505050565b60008054819060ff166120505760405162461bcd60e51b81526004016107fa90614922565b6000805460ff191681556120626111c7565b9050801561208657611ba781601081111561207f5761207f614a3e565b60356121e0565b611bbd338686612c2f565b6000806000806120a186866126a8565b909250905060008260038111156120ba576120ba614a3e565b146120cb57509150600090506120dd565b60006120d682613312565b9350935050505b9250929050565b6012546040516370a0823160e01b81523060048201526000916001600160a01b03169081906370a082319060240160206040518083038186803b15801561212a57600080fd5b505afa15801561213e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612162919061483c565b91505090565b6000805460ff1661218b5760405162461bcd60e51b81526004016107fa90614922565b6000805460ff1916815561219d6111c7565b905080156121c157610e3d8160108111156121ba576121ba614a3e565b604e6121e0565b6121ca8361332a565b509150506000805460ff19166001179055919050565b60007f45b96fe442630264581b197e84bbada861235052c5a1aadfff9ea4e40a969aa083601081111561221557612215614a3e565b83605281111561222757612227614a3e565b60408051928352602083019190915260009082015260600160405180910390a1826010811115610b5957610b59614a3e565b600354600090819061010090046001600160a01b0316331461228157610b59600160316121e0565b436009541461229657610b59600a60336121e0565b8261229f6120e4565b10156122b157610b59600e60326121e0565b600c548311156122c757610b59600260346121e0565b82600c546122d59190614991565b9050600c548111156123295760405162461bcd60e51b815260206004820152601960248201527f72656475636520726573657276657320756e646572666c6f770000000000000060448201526064016107fa565b600c8190556003546123499061010090046001600160a01b031684613401565b600354604080516101009092046001600160a01b031682526020820185905281018290527f3bad0c59cf2f06e7314077049f48a93578cd16f5ef92329f1dab1420a99c177e90606001610dd3565b6000805460ff166123ba5760405162461bcd60e51b81526004016107fa90614922565b6000805460ff191681556123cc6111c7565b905080156123f057610e3d8160108111156123e9576123e9614a3e565b60276121e0565b610e4e336000856134eb565b6001600160a01b0381166000908152601160205260408120805482918291829182916124315750600096879650945050505050565b6124418160000154600a546139c1565b9094509250600084600381111561245a5761245a614a3e565b1461246d57509195600095509350505050565b61247b838260010154613a0b565b9094509150600084600381111561249457612494614a3e565b146124a757509195600095509350505050565b506000969095509350505050565b600354600090819061010090046001600160a01b031633146124dd57610b59600160426121e0565b43600954146124f257610b59600a60416121e0565b600660009054906101000a90046001600160a01b03169050826001600160a01b0316632191f92a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561254357600080fd5b505afa158015612557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257b919061475f565b6125c75760405162461bcd60e51b815260206004820152601c60248201527f6d61726b6572206d6574686f642072657475726e65642066616c73650000000060448201526064016107fa565b600680546001600160a01b0319166001600160a01b0385811691821790925560408051928416835260208301919091527fedffc32e068c7c95dfd4bdfd5c4d939a084d6b11c4199eac8436ed234d72f9269101610dd3565b60008054819060ff166126445760405162461bcd60e51b81526004016107fa90614922565b6000805460ff191681556126566111c7565b9050801561267357611a7c816010811115611ba057611ba0614a3e565b611a933385612fbb565b60008083831161269c5760006126938486614991565b915091506120dd565b506003905060006120dd565b60006126c06040518060200160405280600081525090565b6000806126d18660000151866139c1565b909250905060008260038111156126ea576126ea614a3e565b14612709575060408051602081019091526000815290925090506120dd565b60408051602081019091529081526000969095509350505050565b60007f45b96fe442630264581b197e84bbada861235052c5a1aadfff9ea4e40a969aa084601081111561275957612759614a3e565b84605281111561276b5761276b614a3e565b604080519283526020830191909152810184905260600160405180910390a1836010811115610c6e57610c6e614a3e565b600080806127aa8486614946565b90508481106127be576000925090506120dd565b6002600092509250506120dd565b6000806000806127dc87876126a8565b909250905060008260038111156127f5576127f5614a3e565b14612806575091506000905061281f565b61281861281282613312565b8661279c565b9350935050505b935093915050565b60055460405163d02f735160e01b81523060048201526001600160a01b0386811660248301528581166044830152848116606483015260848201849052600092839291169063d02f73519060a401602060405180830381600087803b15801561288f57600080fd5b505af11580156128a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c7919061483c565b905080156128dc57611eaf6003601b83612724565b846001600160a01b0316846001600160a01b0316141561290257611eaf6006601c6121e0565b6001600160a01b0384166000908152600f6020526040812054612926908590614991565b6001600160a01b0387166000908152600f60205260408120549192509061294e908690614946565b6001600160a01b038088166000818152600f6020526040808220879055928b168082529083902084905591519293509091600080516020614a998339815191529061299c9089815260200190565b60405180910390a3600098975050505050505050565b6000805460ff166129d55760405162461bcd60e51b81526004016107fa90614922565b6000805460ff191681556129e76111c7565b90508015612a0b57610e3d816010811115612a0457612a04614a3e565b60086121e0565b610e4e3384613a36565b6000805460ff16612a385760405162461bcd60e51b81526004016107fa90614922565b6000805460ff19168155612a4a6111c7565b90508015612a6757610e3d8160108111156123e9576123e9614a3e565b610e4e338460006134eb565b60008054819060ff16612a985760405162461bcd60e51b81526004016107fa90614922565b6000805460ff19168155612aaa6111c7565b90508015612ada57612ace816010811115612ac757612ac7614a3e565b600f6121e0565b60009250925050612b83565b836001600160a01b031663a6afed956040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612b1557600080fd5b505af1158015612b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4d919061483c565b90508015612b7157612ace816010811115612b6a57612b6a614a3e565b60106121e0565b612b7d33878787613cc1565b92509250505b6000805460ff191660011790559094909350915050565b60035460009061010090046001600160a01b03163314612bc0576107bd600160476121e0565b4360095414612bd5576107bd600a60486121e0565b670de0b6b3a7640000821115612bf1576107bd600260496121e0565b600880549083905560408051828152602081018590527faaa68312e2ea9d50e16af5068410ab56e1a1fd06037b1a35664812c30f8214609101610dd3565b600554604051631200453160e11b81523060048201526001600160a01b03858116602483015284811660448301526064820184905260009283928392909116906324008a6290608401602060405180830381600087803b158015612c9257600080fd5b505af1158015612ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cca919061483c565b90508015612ceb57612cdf6003603883612724565b6000925092505061281f565b4360095414612d0057612cdf600a60396121e0565b612d496040805161010081019091528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b0386166000908152601160205260409020600101546060820152612d73866123fc565b6080830181905260208301826003811115612d9057612d90614a3e565b6003811115612da157612da1614a3e565b9052506000905081602001516003811115612dbe57612dbe614a3e565b14612ded57612de060096037836020015160038111156113ab576113ab614a3e565b600093509350505061281f565b600019851415612e065760808101516040820152612e0e565b604081018590525b612e1c8782604001516141b1565b60e082018190526080820151612e329190614991565b60a082015260e0810151600b54612e499190614991565b60c0820190815260a080830180516001600160a01b038a8116600081815260116020908152604091829020948555600a546001909501949094559551600b81905560e088015194518751938f1684529383019190915294810192909252606082015260808101929092527f1a2a22cb034d26d1854bdc6666a5b91fe25efbbb5dcad3b0355478d6f5c362a1910160405180910390a160e00151600097909650945050505050565b6000612f086040518060200160405280600081525090565b600080612f1d86670de0b6b3a76400006139c1565b90925090506000826003811115612f3657612f36614a3e565b14612f55575060408051602081019091526000815290925090506120dd565b600080612f628388613a0b565b90925090506000826003811115612f7b57612f7b614a3e565b14612f9e57816040518060200160405280600081525095509550505050506120dd565b604080516020810190915290815260009890975095505050505050565b600554604051634ef4c3e160e01b8152600091829182916001600160a01b031690634ef4c3e190612ff490309089908990600401614879565b602060405180830381600087803b15801561300e57600080fd5b505af1158015613022573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613046919061483c565b905080156130675761305b6003601f83612724565b600092509250506120dd565b436009541461307c5761305b600a60226121e0565b6130bd6040805160e0810190915280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6130c5611aad565b60408301819052602083018260038111156130e2576130e2614a3e565b60038111156130f3576130f3614a3e565b905250600090508160200151600381111561311057613110614a3e565b1461313f5761313260096021836020015160038111156113ab576113ab614a3e565b60009350935050506120dd565b3361314a81876141b1565b60c083018190526040805160208101825290840151815261316b91906143ea565b606084018190526020840182600381111561318857613188614a3e565b600381111561319957613199614a3e565b90525060009050826020015160038111156131b6576131b6614a3e565b146132035760405162461bcd60e51b815260206004820181905260248201527f4d494e545f45584348414e47455f43414c43554c4154494f4e5f4641494c454460448201526064016107fa565b8160600151600d546132159190614946565b608083015260608201516001600160a01b0388166000908152600f60205260409020546132429190614946565b60a08301819052608080840151600d556001600160a01b038981166000818152600f60209081526040918290209590955560c08701516060808901518351958916865296850193909352908301528101929092527f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee910160405180910390a1866001600160a01b0316306001600160a01b0316600080516020614a9983398151915284606001516040516132f891815260200190565b60405180910390a35060c001516000969095509350505050565b80516000906107bd90670de0b6b3a76400009061495e565b6000808080436009541461334e57613344600a604f6121e0565b9590945092505050565b61335833866141b1565b905080600c546133689190614946565b9150600c548210156133b45760405162461bcd60e51b8152602060048201526015602482015274616464207265736572766573206f766572666c6f7760581b60448201526064016107fa565b600c82905560408051338152602081018390529081018390527fa91e67c5ea634cd43a12c5a482724b03de01e85ca68702a53d0c2f45cb7c1dc59060600160405180910390a16000613344565b60125460405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905290911690819063a9059cbb90604401600060405180830381600087803b15801561345157600080fd5b505af1158015613465573d6000803e3d6000fd5b5050505060003d60008114613481576020811461348b57600080fd5b6000199150613497565b60206000803e60005191505b50806134e55760405162461bcd60e51b815260206004820152601960248201527f544f4b454e5f5452414e534645525f4f55545f4641494c45440000000000000060448201526064016107fa565b50505050565b60008215806134f8575081155b6135615760405162461bcd60e51b815260206004820152603460248201527f6f6e65206f662072656465656d546f6b656e73496e206f722072656465656d416044820152736d6f756e74496e206d757374206265207a65726f60601b60648201526084016107fa565b6135a26040805160e0810190915280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6135aa611aad565b60408301819052602083018260038111156135c7576135c7614a3e565b60038111156135d8576135d8614a3e565b90525060009050816020015160038111156135f5576135f5614a3e565b1461361f576136176009602b836020015160038111156113ab576113ab614a3e565b915050610b59565b83156136b85760608101849052604080516020810182529082015181526136469085612091565b608083018190526020830182600381111561366357613663614a3e565b600381111561367457613674614a3e565b905250600090508160200151600381111561369157613691614a3e565b146136b35761361760096029836020015160038111156113ab576113ab614a3e565b613749565b6136d483604051806020016040528084604001518152506143ea565b60608301819052602083018260038111156136f1576136f1614a3e565b600381111561370257613702614a3e565b905250600090508160200151600381111561371f5761371f614a3e565b14613741576136176009602a836020015160038111156113ab576113ab614a3e565b608081018390525b600554606082015160405163eabe7d9160e01b81526000926001600160a01b03169163eabe7d91916137829130918b9190600401614879565b602060405180830381600087803b15801561379c57600080fd5b505af11580156137b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d4919061483c565b905080156137f2576137e96003602883612724565b92505050610b59565b4360095414613807576137e9600a602c6121e0565b8160600151600d546138199190614991565b60a083015260608201516001600160a01b0387166000908152600f60205260409020546138469190614991565b60c083015260808201516138586120e4565b101561386a576137e9600e602f6121e0565b60a0820151600d5560c08201516001600160a01b0387166000908152600f602052604090205560808201516138a0908790613401565b306001600160a01b0316866001600160a01b0316600080516020614a9983398151915284606001516040516138d791815260200190565b60405180910390a36080820151606080840151604080516001600160a01b038b16815260208101949094528301527fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a929910160405180910390a1600554608083015160608401516040516351dff98960e01b81523060048201526001600160a01b038a81166024830152604482019390935260648101919091529116906351dff98990608401600060405180830381600087803b15801561399657600080fd5b505af11580156139aa573d6000803e3d6000fd5b50600092506139b7915050565b9695505050505050565b600080836139d4575060009050806120dd565b60006139e08486614972565b9050836139ed868361495e565b14613a00576002600092509250506120dd565b6000925090506120dd565b60008082613a1f57506001905060006120dd565b6000613a2b848661495e565b915091509250929050565b6000333214613a7c5760405162461bcd60e51b8152602060048201526012602482015271636f6e74726163742063616c6c2064656e7960701b60448201526064016107fa565b60055460405163368f515360e21b81526000916001600160a01b03169063da3d454c90613ab190309088908890600401614879565b602060405180830381600087803b158015613acb57600080fd5b505af1158015613adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b03919061483c565b90508015613b2057613b186003600e83612724565b9150506107bd565b4360095414613b3457613b18600a806121e0565b82613b3d6120e4565b1015613b4f57613b18600e60096121e0565b613b7b604080516080810190915280600081526020016000815260200160008152602001600081525090565b600080613b87876123fc565b6020850181905284826003811115613ba157613ba1614a3e565b6003811115613bb257613bb2614a3e565b9052506000905083516003811115613bcc57613bcc614a3e565b14613bf957613bee60096007856000015160038111156113ab576113ab614a3e565b9450505050506107bd565b858360200151613c099190614946565b6040840152600b54613c1c908790614946565b606084019081526040808501516001600160a01b038a166000908152601160205291909120908155600a5460019091015551600b55613c5b8787613401565b60408084015160608086015183516001600160a01b038c168152602081018b9052938401929092528201527f13ed6866d4e1ee6da46f845c46d7e54120883d75c5ea9a2dacc1c4ca8984ab809060800160405180910390a160005b979650505050505050565b600554604051632fe3f38f60e11b81523060048201526001600160a01b03838116602483015286811660448301528581166064830152608482018590526000928392839290911690635fc7e71e9060a401602060405180830381600087803b158015613d2c57600080fd5b505af1158015613d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d64919061483c565b90508015613d8557613d796003601283612724565b600092509250506141a8565b4360095414613d9a57613d79600a60166121e0565b43846001600160a01b0316636c540baf6040518163ffffffff1660e01b815260040160206040518083038186803b158015613dd457600080fd5b505afa158015613de8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e0c919061483c565b14613e1d57613d79600a60116121e0565b866001600160a01b0316866001600160a01b03161415613e4357613d79600660176121e0565b84613e5457613d79600760156121e0565b600019851415613e6a57613d79600760146121e0565b600080613e78898989612c2f565b90925090508115613ead57613e9f826010811115613e9857613e98614a3e565b60186121e0565b6000945094505050506141a8565b60055460405163c488847b60e01b815260009182916001600160a01b039091169063c488847b90613ee69030908c908890600401614879565b604080518083038186803b158015613efd57600080fd5b505afa158015613f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f359190614855565b90925090508115613f885760405162461bcd60e51b815260206004820152601d60248201527f43414c43554c4154455f414d4f554e545f5345495a455f4641494c454400000060448201526064016107fa565b6040516370a0823160e01b81526001600160a01b038b811660048301528291908a16906370a082319060240160206040518083038186803b158015613fcc57600080fd5b505afa158015613fe0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614004919061483c565b10156140525760405162461bcd60e51b815260206004820152601860248201527f4c49515549444154455f5345495a455f544f4f5f4d554348000000000000000060448201526064016107fa565b60006001600160a01b03891630141561407857614071308d8d85612827565b90506140fd565b60405163b2a02ff160e01b81526001600160a01b038a169063b2a02ff1906140a8908f908f908790600401614879565b602060405180830381600087803b1580156140c257600080fd5b505af11580156140d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140fa919061483c565b90505b80156141425760405162461bcd60e51b81526020600482015260146024820152731d1bdad95b881cd95a5e9d5c994819985a5b195960621b60448201526064016107fa565b604080516001600160a01b038e811682528d811660208301528183018790528b1660608201526080810184905290517f298637f684da70674f26509b10f07ec2fbc77a335ab1e7d6215a4b2484d8bb529181900360a00190a16000975092955050505050505b94509492505050565b6012546040516370a0823160e01b81523060048201526000916001600160a01b031690829082906370a082319060240160206040518083038186803b1580156141f957600080fd5b505afa15801561420d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614231919061483c565b6040516323b872dd60e01b81529091506001600160a01b038316906323b872dd9061426490889030908990600401614879565b600060405180830381600087803b15801561427e57600080fd5b505af1158015614292573d6000803e3d6000fd5b5050505060003d600081146142ae57602081146142b857600080fd5b60001991506142c4565b60206000803e60005191505b50806143125760405162461bcd60e51b815260206004820152601860248201527f544f4b454e5f5452414e534645525f494e5f4641494c4544000000000000000060448201526064016107fa565b6012546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561435657600080fd5b505afa15801561436a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061438e919061483c565b9050828110156143e05760405162461bcd60e51b815260206004820152601a60248201527f544f4b454e5f5452414e534645525f494e5f4f564552464c4f5700000000000060448201526064016107fa565b613cb68382614991565b6000806000806120a18686600061440d6040518060200160405280600081525090565b600080614422670de0b6b3a7640000876139c1565b9092509050600082600381111561443b5761443b614a3e565b1461445a575060408051602081019091526000815290925090506120dd565b6120d6818660000151612ef0565b828054614474906149a8565b90600052602060002090601f01602090048101928261449657600085556144dc565b82601f106144af57805160ff19168380011785556144dc565b828001600101855582156144dc579182015b828111156144dc5782518255916020019190600101906144c1565b506144e89291506144ec565b5090565b5b808211156144e857600081556001016144ed565b600082601f83011261451257600080fd5b813567ffffffffffffffff8082111561452d5761452d614a6a565b604051601f8301601f19908116603f0116810190828211818310171561455557614555614a6a565b8160405283815286602085880101111561456e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560ff8116811461459f57600080fd5b919050565b6000602082840312156145b657600080fd5b8135610b5981614a80565b600080604083850312156145d457600080fd5b82356145df81614a80565b915060208301356145ef81614a80565b809150509250929050565b60008060006060848603121561460f57600080fd5b833561461a81614a80565b9250602084013561462a81614a80565b929592945050506040919091013590565b600080600080600080600060e0888a03121561465657600080fd5b873561466181614a80565b9650602088013561467181614a80565b9550604088013561468181614a80565b945060608801359350608088013567ffffffffffffffff808211156146a557600080fd5b6146b18b838c01614501565b945060a08a01359150808211156146c757600080fd5b506146d48a828b01614501565b9250506146e360c0890161458e565b905092959891949750929550565b6000806040838503121561470457600080fd5b823561470f81614a80565b946020939093013593505050565b60008060006060848603121561473257600080fd5b833561473d81614a80565b925060208401359150604084013561475481614a80565b809150509250925092565b60006020828403121561477157600080fd5b81518015158114610b5957600080fd5b60008060008060008060c0878903121561479a57600080fd5b86356147a581614a80565b955060208701356147b581614a80565b945060408701359350606087013567ffffffffffffffff808211156147d957600080fd5b6147e58a838b01614501565b945060808901359150808211156147fb57600080fd5b5061480889828a01614501565b92505061481760a0880161458e565b90509295509295509295565b60006020828403121561483557600080fd5b5035919050565b60006020828403121561484e57600080fd5b5051919050565b6000806040838503121561486857600080fd5b505080516020909101519092909150565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208083528351808285015260005b818110156148ca578581018301518582016040015282016148ae565b818111156148dc576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601690820152751858d8dc9d59481a5b9d195c995cdd0819985a5b195960521b604082015260600190565b6020808252600a90820152691c994b595b9d195c995960b21b604082015260600190565b6000821982111561495957614959614a12565b500190565b60008261496d5761496d614a28565b500490565b600081600019048311821515161561498c5761498c614a12565b500290565b6000828210156149a3576149a3614a12565b500390565b600181811c908216806149bc57607f821691505b602082108114156149dd57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156149f7576149f7614a12565b5060010190565b600082614a0d57614a0d614a28565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114614a9557600080fd5b5056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212200a5495c8ff9c90708ed5a6572006ba639f53ca959030d8021949a95fe036f9cd64736f6c63430008060033

Deployed Bytecode Sourcemap

73627:633:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25809:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35836:246;;;;;;:::i;:::-;;:::i;:::-;;;13445:14:1;;13438:22;13420:41;;13408:2;13393:18;35836:246:0;13375:92:1;69454:158:0;;;;;;:::i;:::-;;:::i;:::-;;;25037:25:1;;;25025:2;25010:18;69454:158:0;24992:76:1;26299:33:0;;;;;;38221:233;;;;;;:::i;:::-;;:::i;26509:23::-;;;;;;39814:250;;;:::i;68249:599::-;;;;;;:::i;:::-;;:::i;:::-;;70098:272;;;;;;:::i;:::-;;:::i;72572:288::-;;;;;;:::i;:::-;;:::i;35618:204::-;;;;;;:::i;:::-;;:::i;69626:198::-;;;;;;:::i;:::-;;:::i;26090:27::-;;;;;-1:-1:-1;;;;;26090:27:0;;;;;;-1:-1:-1;;;;;7166:32:1;;;7148:51;;7136:2;7121:18;26090:27:0;7103:102:1;25877:21:0;;;;;;;;;;;;26550:4:1;26538:17;;;26520:36;;26508:2;26493:18;25877:21:0;26475:87:1;36397:363:0;;;;;;:::i;:::-;;:::i;40932:97::-;;;:::i;70384:128::-;;;;;;:::i;:::-;;:::i;61383:564::-;;;;;;:::i;:::-;;:::i;26430:24::-;;;;;;26541:25;;;;;-1:-1:-1;;;;;26541:25:0;;;26132:39;;;;;-1:-1:-1;;;;;26132:39:0;;;64448:363;;;;;;:::i;:::-;;:::i;26347:30::-;;;;;;30866:25;;;;;-1:-1:-1;;;;;30866:25:0;;;36262:121;;;;;;:::i;:::-;-1:-1:-1;;;;;36355:20:0;36328:7;36355:20;;;:13;:20;;;;;;;36262:121;38006:201;;;:::i;69162:142::-;;;;;;:::i;:::-;;:::i;26469:25::-;;;;;;25842:20;;;:::i;38468:275::-;;;;;;:::i;:::-;;:::i;32726:1214::-;;;;;;:::i;:::-;;:::i;68870:142::-;;;;;;:::i;:::-;;:::i;41043:2958::-;;;:::i;35410:194::-;;;;;;:::i;:::-;;:::i;26392:23::-;;;;;;37799:193;;;:::i;58888:203::-;;;;;;:::i;:::-;;:::i;60288:477::-;;;;;;:::i;:::-;;:::i;39593:207::-;;;:::i;36774:712::-;;;;;;:::i;:::-;;:::i;:::-;;;;26213:25:1;;;26269:2;26254:18;;26247:34;;;;26297:18;;;26290:34;26355:2;26340:18;;26333:34;26200:3;26185:19;36774:712:0;26167:206:1;69318:122:0;;;;;;:::i;:::-;;:::i;69026:::-;;;;;;:::i;:::-;;:::i;36096:152::-;;;;;;:::i;:::-;-1:-1:-1;;;;;36206:25:0;;;36179:7;36206:25;;;:18;:25;;;;;;;;:34;;;;;;;;;;;;;36096:152;60779:590;;;:::i;66019:397::-;;;;;;:::i;:::-;;:::i;26186:42::-;;;;;-1:-1:-1;;;;;26186:42:0;;;69838:246;;;;;;:::i;:::-;;:::i;26055:20::-;;;;;;;;-1:-1:-1;;;;;26055:20:0;;;37615:170;;;:::i;61961:394::-;;;;;;:::i;:::-;;:::i;26963:36::-;;26995:4;26963:36;;25809:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35836:246::-;35944:10;35913:4;35965:23;;;:18;:23;;;;;;;;-1:-1:-1;;;;;35965:32:0;;;;;;;;;;:41;;;36022:30;35913:4;;35944:10;;;36022:30;;;;36000:6;25037:25:1;;25025:2;25010:18;;24992:76;36022:30:0;;;;;;;;36070:4;36063:11;;;35836:246;;;;;:::o;69454:158::-;69520:4;69538:8;69551:32;69571:11;69551:19;:32::i;:::-;-1:-1:-1;69537:46:0;69454:158;-1:-1:-1;;;69454:158:0:o;38221:233::-;38308:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;;;;;;;;;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;38333:16:::1;:14;:16::i;:::-;:40;38325:75;;;;-1:-1:-1::0;;;38325:75:0::1;;;;;;;:::i;:::-;38418:28;38438:7;38418:19;:28::i;:::-;38411:35;;67697:1;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;38221:233;;-1:-1:-1;38221:233:0:o;39814:250::-;39874:4;39892:13;39907:11;39922:28;:26;:28::i;:::-;39891:59;;-1:-1:-1;39891:59:0;-1:-1:-1;39976:18:0;39969:3;:25;;;;;;;;:::i;:::-;;39961:71;;;;-1:-1:-1;;;39961:71:0;;23210:2:1;39961:71:0;;;23192:21:1;23249:2;23229:18;;;23222:30;23288:34;23268:18;;;23261:62;-1:-1:-1;;;23339:18:1;;;23332:31;23380:19;;39961:71:0;23182:223:1;68249:599:0;68637:107;68654:12;68668:18;68688:28;68718:5;68725:7;68734:9;68637:16;:107::i;:::-;68765:10;:24;;-1:-1:-1;;;;;;68765:24:0;-1:-1:-1;;;;;68765:24:0;;;;;;;;68800:40;;;-1:-1:-1;;;68800:40:0;;;;:38;;:40;;;;;;;;;;;;;;;68765:24;68800:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68249:599;;;;;;;:::o;70098:272::-;70203:10;;-1:-1:-1;;;;;70185:28:0;;;70203:10;;70185:28;;70177:91;;;;-1:-1:-1;;;70177:91:0;;18098:2:1;70177:91:0;;;18080:21:1;18137:2;18117:18;;;18110:30;18176:34;18156:18;;;18149:62;-1:-1:-1;;;18227:18:1;;;18220:48;18285:19;;70177:91:0;18070:240:1;70177:91:0;70294:30;;-1:-1:-1;;;70294:30:0;;70318:4;70294:30;;;7148:51:1;70276:15:0;;-1:-1:-1;;;;;70294:15:0;;;;;7121:18:1;;70294:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70347:5;;70332:30;;-1:-1:-1;;;70332:30:0;;-1:-1:-1;;;;;70347:5:0;;;;;;70332:30;;;7392:51:1;7459:18;;;7452:34;;;;;-1:-1:-1;70332:14:0;;;;;7365:18:1;;70332:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70169:201;70098:272;:::o;72572:288::-;72654:4;72679:15;72671:44;;;;-1:-1:-1;;;72671:44:0;;18517:2:1;72671:44:0;;;18499:21:1;18556:2;18536:18;;;18529:30;-1:-1:-1;;;18575:18:1;;;18568:46;18631:18;;72671:44:0;18489:166:1;72671:44:0;72727:8;72740:40;72759:8;72769:10;72740:18;:40::i;:::-;72726:54;;;72791:40;72806:3;72791:40;;;;;;;;;;;;;-1:-1:-1;;;72791:40:0;;;:14;:40::i;:::-;72849:3;72572:288;-1:-1:-1;;;72572:288:0:o;35618:204::-;35722:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;35746:44:::1;35761:10;35773:3;35778;35783:6;35746:14;:44::i;:::-;:68;35739:75;;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;35618:204;;-1:-1:-1;;;35618:204:0:o;69626:198::-;69716:4;69734:8;69747:48;69773:8;69783:11;69747:25;:48::i;:::-;-1:-1:-1;69733:62:0;69626:198;-1:-1:-1;;;;69626:198:0:o;36397:363::-;36468:4;36485:23;36511:38;;;;;;;;36526:21;:19;:21::i;:::-;36511:38;;-1:-1:-1;;;;;36625:20:0;;36561:14;36625:20;;;:13;:20;;;;;;36485:64;;-1:-1:-1;36561:14:0;;;36593:53;;36485:64;;36593:17;:53::i;:::-;36560:86;;-1:-1:-1;36560:86:0;-1:-1:-1;36673:18:0;36665:4;:26;;;;;;;;:::i;:::-;;36657:70;;;;-1:-1:-1;;;36657:70:0;;16987:2:1;36657:70:0;;;16969:21:1;17026:2;17006:18;;;16999:30;17065:33;17045:18;;;17038:61;17116:18;;36657:70:0;16959:181:1;36657:70:0;36745:7;36397:363;-1:-1:-1;;;;36397:363:0:o;40932:97::-;40983:4;41007:14;:12;:14::i;:::-;41000:21;;40932:97;:::o;70384:128::-;70449:4;70473:31;70494:9;70473:20;:31::i;61383:564::-;61515:5;;61470:4;;61515:5;;;-1:-1:-1;;;;;61515:5:0;61501:10;:19;61497:124;;61544:65;61549:18;61569:39;61544:4;:65::i;61497:124::-;61671:11;;61711:30;;;-1:-1:-1;;;61711:30:0;;;;-1:-1:-1;;;;;61671:11:0;;;;61711:28;;;;;:30;;;;;;;;;;;;;;:28;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61703:71;;;;-1:-1:-1;;;61703:71:0;;21103:2:1;61703:71:0;;;21085:21:1;21142:2;21122:18;;;21115:30;21181;21161:18;;;21154:58;21229:18;;61703:71:0;21075:178:1;61703:71:0;61797:11;:28;;-1:-1:-1;;;;;;61797:28:0;-1:-1:-1;;;;;61797:28:0;;;;;;;;;61853:46;;;8515:15:1;;;8497:34;;8562:2;8547:18;;8540:43;;;;61853:46:0;;8432:18:1;61853:46:0;;;;;;;;61924:14;61912:27;61383:564;-1:-1:-1;;;61383:564:0:o;64448:363::-;64532:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;64562:16:::1;:14;:16::i;:::-;64549:29:::0;-1:-1:-1;64593:29:0;;64589:153:::1;;64660:70;64671:5;64665:12;;;;;;;;:::i;:::-;64679:50;64660:4;:70::i;:::-;64653:77;;;;;64589:153;64769:34;64790:12;64769:20;:34::i;:::-;64762:41;;;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;64448:363;;-1:-1:-1;64448:363:0:o;38006:201::-;38077:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;38102:16:::1;:14;:16::i;:::-;:40;38094:75;;;;-1:-1:-1::0;;;38094:75:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;38187:12:0::1;::::0;67709:11;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;38006:201;:::o;69162:142::-;69234:4;69258:38;69283:12;69258:24;:38::i;25842:20::-;;;;;;;:::i;38468:275::-;38544:4;38562:13;38577:11;38592:36;38620:7;38592:27;:36::i;:::-;38561:67;;-1:-1:-1;38561:67:0;-1:-1:-1;38654:18:0;38647:3;:25;;;;;;;;:::i;:::-;;38639:72;;;;-1:-1:-1;;;38639:72:0;;15475:2:1;38639:72:0;;;15457:21:1;15514:2;15494:18;;;15487:30;15553:34;15533:18;;;15526:62;-1:-1:-1;;;15604:18:1;;;15597:32;15646:19;;38639:72:0;15447:224:1;32726:1214:0;33080:5;;;;;-1:-1:-1;;;;;33080:5:0;33066:10;:19;33058:68;;;;-1:-1:-1;;;33058:68:0;;16229:2:1;33058:68:0;;;16211:21:1;16268:2;16248:18;;;16241:30;16307:34;16287:18;;;16280:62;-1:-1:-1;;;16358:18:1;;;16351:34;16402:19;;33058:68:0;16201:226:1;33058:68:0;33145:18;;:23;:43;;;;-1:-1:-1;33172:11:0;;:16;33145:43;33137:91;;;;-1:-1:-1;;;33137:91:0;;17694:2:1;33137:91:0;;;17676:21:1;17733:2;17713:18;;;17706:30;17772:34;17752:18;;;17745:62;-1:-1:-1;;;17823:18:1;;;17816:33;17866:19;;33137:91:0;17666:225:1;33137:91:0;33251:27;:58;;;33328:31;33320:92;;;;-1:-1:-1;;;33320:92:0;;19929:2:1;33320:92:0;;;19911:21:1;19968:2;19948:18;;;19941:30;20007:34;19987:18;;;19980:62;-1:-1:-1;;;20058:18:1;;;20051:46;20114:19;;33320:92:0;19901:238:1;33320:92:0;33435:8;33446:29;33462:12;33446:15;:29::i;:::-;33435:40;-1:-1:-1;33494:27:0;;33486:66;;;;-1:-1:-1;;;33486:66:0;;22502:2:1;33486:66:0;;;22484:21:1;22541:2;22521:18;;;22514:30;22580:28;22560:18;;;22553:56;22626:18;;33486:66:0;22474:176:1;33486:66:0;37581:12;33575:18;:37;90:4;33623:11;:25;33677:46;33704:18;33677:26;:46::i;:::-;33671:52;-1:-1:-1;33742:27:0;;33734:74;;;;-1:-1:-1;;;33734:74:0;;20346:2:1;33734:74:0;;;20328:21:1;20385:2;20365:18;;;20358:30;20424:34;20404:18;;;20397:62;-1:-1:-1;;;20475:18:1;;;20468:32;20517:19;;33734:74:0;20318:224:1;33734:74:0;33821:12;;;;:4;;:12;;;;;:::i;:::-;-1:-1:-1;33844:16:0;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;;33871:8:0;:20;;;;;;-1:-1:-1;;33871:20:0;;;;;;:8;33914:18;;;;;33871:20;33914:18;;;-1:-1:-1;;;;;32726:1214:0:o;68870:142::-;68928:4;68946:8;68959:24;68972:10;68959:12;:24::i;41043:2958::-;41213:18;;41102:4;;37581:12;;41258:45;;;41254:105;;;41332:14;41327:20;41320:27;;;;41043:2958;:::o;41254:105::-;41381:14;41398;:12;:14::i;:::-;41443:12;;41487:13;;41535:11;;41595:17;;:71;;-1:-1:-1;;;41595:71:0;;;;;25536:25:1;;;25577:18;;;25570:34;;;25620:18;;;25613:34;;;41381:31:0;;-1:-1:-1;41443:12:0;;41487:13;;41535:11;;41423:17;;-1:-1:-1;;;;;41595:17:0;;:31;;25509:18:1;;41595:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41569:97;;25962:9;41685:18;:43;;41677:84;;;;-1:-1:-1;;;41677:84:0;;22145:2:1;41677:84:0;;;22127:21:1;22184:2;22164:18;;;22157:30;22223;22203:18;;;22196:58;22271:18;;41677:84:0;22117:178:1;41677:84:0;41785:17;41804:15;41823:52;41831:18;41851:23;41823:7;:52::i;:::-;41784:91;;-1:-1:-1;41784:91:0;-1:-1:-1;41905:18:0;41894:7;:29;;;;;;;;:::i;:::-;;41886:59;;;;-1:-1:-1;;;41886:59:0;;21460:2:1;41886:59:0;;;21442:21:1;21499:2;21479:18;;;21472:30;-1:-1:-1;;;21518:18:1;;;21511:47;21575:18;;41886:59:0;21432:167:1;41886:59:0;-1:-1:-1;;;;;;;;;;;;42012:24:0;42047:20;42078:21;42110:19;42176:58;42186:35;;;;;;;;42201:18;42186:35;;;42223:10;42176:9;:58::i;:::-;42142:92;;-1:-1:-1;42142:92:0;-1:-1:-1;42260:18:0;42249:7;:29;;;;;;;;:::i;:::-;;42245:183;;42302:114;42313:16;42331:69;42407:7;42402:13;;;;;;;;:::i;:::-;42302:10;:114::i;:::-;42295:121;;;;;;;;;;;;;;;;41043:2958;:::o;42245:183::-;42473:53;42491:20;42513:12;42473:17;:53::i;:::-;42440:86;;-1:-1:-1;42440:86:0;-1:-1:-1;42552:18:0;42541:7;:29;;;;;;;;:::i;:::-;;42537:181;;42594:112;42605:16;42623:67;42697:7;42692:13;;;;;;;;:::i;42537:181::-;42757:42;42765:19;42786:12;42757:7;:42::i;:::-;42728:71;;-1:-1:-1;42728:71:0;-1:-1:-1;42825:18:0;42814:7;:29;;;;;;;;:::i;:::-;;42810:178;;42867:109;42878:16;42896:64;42967:7;42962:13;;;;;;;;:::i;42810:178::-;43030:100;43055:38;;;;;;;;43070:21;;43055:38;;;43095:19;43116:13;43030:24;:100::i;:::-;43000:130;;-1:-1:-1;43000:130:0;-1:-1:-1;43156:18:0;43145:7;:29;;;;;;;;:::i;:::-;;43141:179;;43198:110;43209:16;43227:65;43299:7;43294:13;;;;;;;;:::i;43141:179::-;43360:82;43385:20;43407:16;43425;43360:24;:82::i;:::-;43332:110;;-1:-1:-1;43332:110:0;-1:-1:-1;43468:18:0;43457:7;:29;;;;;;;;:::i;:::-;;43453:177;;43510:108;43521:16;43539:63;43609:7;43604:13;;;;;;;;:::i;43453:177::-;43684:18;:39;;;43734:11;:28;;;43773:12;:30;;;43814:13;:32;;;43874:79;;;26213:25:1;;;26269:2;26254:18;;26247:34;;;26297:18;;;26290:34;;;26355:2;26340:18;;26333:34;;;43874:79:0;;26200:3:1;26185:19;43874:79:0;;;;;;;43978:14;43973:20;;35410:194;35497:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;35521:51:::1;35536:10;35548;35560:3;35565:6;35521:14;:51::i;:::-;:75;35514:82;;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;35410:194;;-1:-1:-1;;35410:194:0:o;37799:193::-;37885:17;;37861:4;;-1:-1:-1;;;;;37885:17:0;:31;37917:14;:12;:14::i;:::-;37933:12;;37947:13;;37962:21;;37885:99;;-1:-1:-1;;;;;;37885:99:0;;;;;;;;;;26213:25:1;;;;26254:18;;;26247:34;;;;26297:18;;;26290:34;26340:18;;;26333:34;26185:19;;37885:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;58888:203::-;58999:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;59023:60:::1;59037:10;59049::::0;59061:8;59071:11;59023:13:::1;:60::i;:::-;59016:67;;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;58888:203;;-1:-1:-1;;;58888:203:0:o;60288:477::-;60419:5;;60374:4;;60419:5;;;-1:-1:-1;;;;;60419:5:0;60405:10;:19;60401:126;;60448:67;60453:18;60473:41;60448:4;:67::i;60401:126::-;60575:12;;;-1:-1:-1;;;;;60610:30:0;;;-1:-1:-1;;;;;;60610:30:0;;;;;;;60668:49;;;60575:12;;;;8497:34:1;;;8562:2;8547:18;;8540:43;;;;60668:49:0;;8432:18:1;60668:49:0;8414:175:1;39593:207:0;39662:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;39687:16:::1;:14;:16::i;:::-;:40;39679:75;;;;-1:-1:-1::0;;;39679:75:0::1;;;;;;;:::i;:::-;39772:20;:18;:20::i;:::-;39765:27;;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;39593:207;:::o;36774:712::-;-1:-1:-1;;;;;36907:22:0;;36851:4;36907:22;;;:13;:22;;;;;;36851:4;;;;;;;;;37058:36;36921:7;37058:27;:36::i;:::-;37034:60;-1:-1:-1;37034:60:0;-1:-1:-1;37117:18:0;37109:4;:26;;;;;;;;:::i;:::-;;37105:99;;37165:16;37160:22;37184:1;37187;37190;37152:40;;;;;;;;;;;;;;37105:99;37247:28;:26;:28::i;:::-;37216:59;-1:-1:-1;37216:59:0;-1:-1:-1;37298:18:0;37290:4;:26;;;;;;;;:::i;:::-;;37286:99;;37346:16;37341:22;;37286:99;-1:-1:-1;37410:14:0;;-1:-1:-1;37427:13:0;;-1:-1:-1;37442:13:0;-1:-1:-1;37442:13:0;-1:-1:-1;36774:712:0;;;;;;:::o;69318:122::-;69380:4;69404:28;69419:12;69404:14;:28::i;69026:122::-;69088:4;69112:28;69127:12;69112:14;:28::i;60779:590::-;60875:12;;60830:4;;-1:-1:-1;;;;;60875:12:0;60861:10;:26;;;:54;;-1:-1:-1;60891:10:0;:24;60861:54;60857:164;;;60939:70;60944:18;60964:44;60939:4;:70::i;60857:164::-;61062:5;;;61104:12;;;-1:-1:-1;;;;;61104:12:0;;;61062:5;61139:20;;;-1:-1:-1;;;;;;61139:20:0;;;;;;;-1:-1:-1;;;;;;61182:34:0;;;;;;61234:25;;;61062:5;;;;;;8497:34:1;;;61253:5:0;;;;;8562:2:1;8547:18;;8540:43;61062:5:0;61104:12;;61234:25;;8432:18:1;61234:25:0;;;;;;;61308:12;;61275:46;;;-1:-1:-1;;;;;8515:15:1;;;8497:34;;61308:12:0;;;8562:2:1;8547:18;;8540:43;61275:46:0;;8432:18:1;61275:46:0;;;;;;;61346:14;61341:20;;66019:397;66115:4;66132:10;66145:16;:14;:16::i;:::-;66132:29;-1:-1:-1;66176:29:0;;66172:161;;66243:78;66254:5;66248:12;;;;;;;;:::i;:::-;66262:58;66243:4;:78::i;66172:161::-;66360:48;66387:20;66360:26;:48::i;69838:246::-;69960:4;69978:8;69991:64;70015:8;70025:11;70038:16;69991:23;:64::i;:::-;-1:-1:-1;69977:78:0;69838:246;-1:-1:-1;;;;;69838:246:0:o;37615:170::-;37701:17;;37677:4;;-1:-1:-1;;;;;37701:17:0;:31;37733:14;:12;:14::i;:::-;37749:12;;37763:13;;37701:76;;-1:-1:-1;;;;;;37701:76:0;;;;;;;;;;25536:25:1;;;;25577:18;;;25570:34;;;;25620:18;;;25613:34;25509:18;;37701:76:0;25491:162:1;61961:394:0;62059:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;62089:16:::1;:14;:16::i;:::-;62076:29:::0;-1:-1:-1;62120:29:0;;62116:156:::1;;62187:73;62198:5;62192:12;;;;;;;;:::i;:::-;62206:53;62187:4;:73::i;62116:156::-;62299:48;62322:24;62299:22;:48::i;52473:384::-:0;52551:4;67630:11;;52551:4;;67630:11;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;52587:16:::1;:14;:16::i;:::-;52574:29:::0;-1:-1:-1;52618:29:0;;52614:155:::1;;52686:67;52697:5;52691:12;;;;;;;;:::i;:::-;52705:47;52686:4;:67::i;:::-;52755:1;52678:79;;;;;;;52614:155;52796:53;52813:10;52825;52837:11;52796:16;:53::i;:::-;52789:60;;;;;67697:1;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;52473:384;;;;-1:-1:-1;52473:384:0:o;40078:840::-;40195:11;;40147:9;;;;40221:17;40217:694;;-1:-1:-1;;40297:27:0;;40277:18;;40297:27;;-1:-1:-1;40078:840:0:o;40217:694::-;40372:14;40389;:12;:14::i;:::-;40372:31;;40432:23;-1:-1:-1;;;;;;;;;;;;;;40432:23:0;40470:17;40560:33;40623:13;;40608:12;;40596:9;:24;;;;:::i;:::-;:40;;;;:::i;:::-;40560:76;;40679:50;40686:28;40716:12;40679:6;:50::i;:::-;40653:76;-1:-1:-1;40653:76:0;-1:-1:-1;40759:18:0;40748:7;:29;;;;;;;;:::i;:::-;;40744:89;;-1:-1:-1;40806:7:0;40815:1;;-1:-1:-1;40078:840:0;-1:-1:-1;;;;40078:840:0:o;40744:89::-;-1:-1:-1;;40877:21:0;40857:18;;40877:21;;-1:-1:-1;40078:840:0;-1:-1:-1;;;40078:840:0:o;67750:378::-;67852:4;67630:11;;67852:4;;67630:11;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;67888:16:::1;:14;:16::i;:::-;67875:29:::0;-1:-1:-1;67919:29:0;;67915:147:::1;;67987:59;67998:5;67992:12;;;;;;;;:::i;:::-;68006:39;67987:4;:59::i;:::-;68048:1;67979:71;;;;;;;67915:147;68089:31;68099:8;68109:10;68089:9;:31::i;:::-;68082:38;;;;;67697:1;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;67750:378;;;;-1:-1:-1;67750:378:0;-1:-1:-1;67750:378:0:o;72866:714::-;72956:31;72952:70;;72866:714;;:::o;72952:70::-;73032:24;73075:7;73069:21;73093:1;73069:25;;;;:::i;:::-;73059:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73059:36:0;;73032:63;;73106:6;73123:105;73145:7;73139:21;73135:1;:25;73123:105;;;73205:7;73214:1;73199:17;;;;;;;;:::i;:::-;;;;;;;;;73182:11;73194:1;73182:14;;;;;;;;:::i;:::-;;;;:34;-1:-1:-1;;;;;73182:34:0;;;;;;;;-1:-1:-1;73162:3:0;;;;:::i;:::-;;;;73123:105;;;-1:-1:-1;;;73238:11:0;73250:3;:1;73252;73250:3;:::i;:::-;73238:16;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;73238:36:0;;;;;;;;-1:-1:-1;;;;73285:11:0;73297:3;:1;73299;73297:3;:::i;:::-;73285:16;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;73285:36:0;;;;;;;;-1:-1:-1;73371:12:0;73381:2;73371:7;:12;:::i;:::-;73364:21;;:2;:21;:::i;:::-;73351:36;;73332:11;73344:3;:1;73346;73344:3;:::i;:::-;73332:16;;;;;;;;:::i;:::-;;;;:55;-1:-1:-1;;;;;73332:55:0;;;;;;;;-1:-1:-1;73437:12:0;73447:2;73437:7;:12;:::i;:::-;73430:21;;:2;:21;:::i;:::-;73417:36;;73398:11;73410:3;:1;73412;73410:3;:::i;:::-;73398:16;;;;;;;;:::i;:::-;;;;:55;-1:-1:-1;;;;;73398:55:0;;;;;;;;-1:-1:-1;;;;73464:11:0;73476:3;:1;73478;73476:3;:::i;:::-;73464:16;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;73464:36:0;;;;;;;;-1:-1:-1;73559:11:0;73519:31;;73511:61;;;;-1:-1:-1;;;73511:61:0;;;;;;;;:::i;:::-;;72941:639;;72866:714;;:::o;33954:1442::-;34094:11;;:60;;-1:-1:-1;;;34094:60:0;;34130:4;34094:60;;;10570:34:1;-1:-1:-1;;;;;10640:15:1;;;10620:18;;;10613:43;10692:15;;;10672:18;;;10665:43;10724:18;;;10717:34;;;34052:4:0;;;;34094:11;;;:27;;10504:19:1;;34094:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34079:75;-1:-1:-1;34169:12:0;;34165:144;;34205:92;34216:27;34245:42;34289:7;34205:10;:92::i;:::-;34198:99;;;;;34165:144;34342:3;-1:-1:-1;;;;;34335:10:0;:3;-1:-1:-1;;;;;34335:10:0;;34331:105;;;34369:55;34374:15;34391:32;34369:4;:55::i;34331:105::-;34458:22;34510:3;-1:-1:-1;;;;;34499:14:0;:7;-1:-1:-1;;;;;34499:14:0;;34495:166;;;-1:-1:-1;;;34495:166:0;;;-1:-1:-1;;;;;;34617:23:0;;;;;;;:18;:23;;;;;;;;:32;;;;;;;;;;34495:166;34851:17;34871:26;34891:6;34871:17;:26;:::i;:::-;-1:-1:-1;;;;;34928:18:0;;34908:17;34928:18;;;:13;:18;;;;;;34851:46;;-1:-1:-1;34908:17:0;34928:27;;34949:6;;34928:27;:::i;:::-;-1:-1:-1;;;;;34986:18:0;;34966:17;34986:18;;;:13;:18;;;;;;34908:47;;-1:-1:-1;34966:17:0;34986:27;;35007:6;;34986:27;:::i;:::-;-1:-1:-1;;;;;35058:18:0;;;;;;;:13;:18;;;;;;:33;;;35102:18;;;;;;:33;;;34966:47;-1:-1:-1;;;35162:35:0;;35158:115;;-1:-1:-1;;;;;35214:23:0;;;;;;;:18;:23;;;;;;;;:32;;;;;;;;;:47;;;35158:115;35314:3;-1:-1:-1;;;;;35300:26:0;35309:3;-1:-1:-1;;;;;35300:26:0;-1:-1:-1;;;;;;;;;;;35319:6:0;35300:26;;;;25037:25:1;;25025:2;25010:18;;24992:76;35300:26:0;;;;;;;;-1:-1:-1;35373:14:0;;33954:1442;-1:-1:-1;;;;;;;;;33954:1442:0:o;52871:406::-;52973:4;67630:11;;52973:4;;67630:11;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;53009:16:::1;:14;:16::i;:::-;52996:29:::0;-1:-1:-1;53040:29:0;;53036:155:::1;;53108:67;53119:5;53113:12;;;;;;;;:::i;:::-;53127:47;53108:4;:67::i;53036:155::-;53218:51;53235:10;53247:8;53257:11;53218:16;:51::i;15699:313::-:0;15776:9;15787:4;15805:13;15820:18;15842:20;15852:1;15855:6;15842:9;:20::i;:::-;15804:58;;-1:-1:-1;15804:58:0;-1:-1:-1;15884:18:0;15877:3;:25;;;;;;;;:::i;:::-;;15873:73;;-1:-1:-1;15927:3:0;-1:-1:-1;15932:1:0;;-1:-1:-1;15919:15:0;;15873:73;15966:18;15986:17;15995:7;15986:8;:17::i;:::-;15958:46;;;;;;15699:313;;;;;;:::o;70534:186::-;70653:10;;70682:30;;-1:-1:-1;;;70682:30:0;;70706:4;70682:30;;;7148:51:1;70598:4:0;;-1:-1:-1;;;;;70653:10:0;;;;70682:15;;7121:18:1;;70682:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70675:37;;;70534:186;:::o;63227:377::-;63304:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;63334:16:::1;:14;:16::i;:::-;63321:29:::0;-1:-1:-1;63365:29:0;;63361:150:::1;;63432:67;63443:5;63437:12;;;;;;;;:::i;:::-;63451:47;63432:4;:67::i;63361:150::-;63545:28;63563:9;63545:17;:28::i;:::-;-1:-1:-1::0;63533:40:0;-1:-1:-1;;67709:11:0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;63227:377;;-1:-1:-1;63227:377:0:o;25307:153::-;25368:4;25390:33;25403:3;25398:9;;;;;;;;:::i;:::-;25414:4;25409:10;;;;;;;;:::i;:::-;25390:33;;;25536:25:1;;;25592:2;25577:18;;25570:34;;;;25421:1:0;25620:18:1;;;25613:34;25524:2;25509:18;25390:33:0;;;;;;;25448:3;25443:9;;;;;;;;:::i;64825:1180::-;64981:5;;64892:4;;;;64981:5;;;-1:-1:-1;;;;;64981:5:0;64967:10;:19;64963:124;;65010:65;65015:18;65035:39;65010:4;:65::i;64963:124::-;37581:12;65113:18;;:38;65109:147;;65175:69;65180:22;65204:39;65175:4;:69::i;65109:147::-;65299:12;65282:14;:12;:14::i;:::-;:29;65278:152;;;65335:83;65340:29;65371:46;65335:4;:83::i;65278:152::-;65471:13;;65456:12;:28;65452:129;;;65508:61;65513:15;65530:38;65508:4;:61::i;65452:129::-;65660:12;65644:13;;:28;;;;:::i;:::-;65625:47;;65721:13;;65701:16;:33;;65693:71;;;;-1:-1:-1;;;65693:71:0;;20749:2:1;65693:71:0;;;20731:21:1;20788:2;20768:18;;;20761:30;20827:27;20807:18;;;20800:55;20872:18;;65693:71:0;20721:175:1;65693:71:0;65787:13;:32;;;65864:5;;65842:43;;65864:5;;;-1:-1:-1;;;;;65864:5:0;65872:12;65842:13;:43::i;:::-;65919:5;;65903:54;;;65919:5;;;;-1:-1:-1;;;;;65919:5:0;7707:51:1;;7789:2;7774:18;;7767:34;;;7817:18;;7810:34;;;65903:54:0;;7695:2:1;7680:18;65903:54:0;7662:188:1;46736:369:0;46820:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;46850:16:::1;:14;:16::i;:::-;46837:29:::0;-1:-1:-1;46881:29:0;;46877:144:::1;;46948:61;46959:5;46953:12;;;;;;;;:::i;:::-;46967:41;46948:4;:61::i;46877:144::-;47048:49;47068:10;47081:1;47084:12;47048:11;:49::i;38757:822::-:0;-1:-1:-1;;;;;39009:23:0;;38834:9;39009:23;;;:14;:23;;;;;39059:24;;38834:9;;;;;;;;39055:92;;-1:-1:-1;39113:18:0;;;;-1:-1:-1;38757:822:0;-1:-1:-1;;;;;38757:822:0:o;39055:92::-;39204:46;39212:14;:24;;;39238:11;;39204:7;:46::i;:::-;39171:79;;-1:-1:-1;39171:79:0;-1:-1:-1;39276:18:0;39265:7;:29;;;;;;;;:::i;:::-;;39261:81;;-1:-1:-1;39319:7:0;;39328:1;;-1:-1:-1;38757:822:0;-1:-1:-1;;;;38757:822:0:o;39261:81::-;39374:58;39382:19;39403:14;:28;;;39374:7;:58::i;:::-;39354:78;;-1:-1:-1;39354:78:0;-1:-1:-1;39458:18:0;39447:7;:29;;;;;;;;:::i;:::-;;39443:81;;-1:-1:-1;39501:7:0;;39510:1;;-1:-1:-1;38757:822:0;-1:-1:-1;;;;38757:822:0:o;39443:81::-;-1:-1:-1;39544:18:0;;39564:6;;-1:-1:-1;38757:822:0;-1:-1:-1;;;;38757:822:0:o;66430:870::-;66632:5;;66524:4;;;;66632:5;;;-1:-1:-1;;;;;66632:5:0;66618:10;:19;66614:132;;66661:73;66666:18;66686:47;66661:4;:73::i;66614:132::-;37581:12;66772:18;;:38;66768:155;;66834:77;66839:22;66863:47;66834:4;:77::i;66768:155::-;66968:17;;;;;;;;;-1:-1:-1;;;;;66968:17:0;66945:40;;67016:20;-1:-1:-1;;;;;67016:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67008:83;;;;-1:-1:-1;;;67008:83:0;;21103:2:1;67008:83:0;;;21085:21:1;21142:2;21122:18;;;21115:30;21181;21161:18;;;21154:58;21229:18;;67008:83:0;21075:178:1;67008:83:0;67114:17;:40;;-1:-1:-1;;;;;;67114:40:0;-1:-1:-1;;;;;67114:40:0;;;;;;;;;67182:70;;;8515:15:1;;;8497:34;;8562:2;8547:18;;8540:43;;;;67182:70:0;;8432:18:1;67182:70:0;8414:175:1;44015:348:0;44085:4;67630:11;;44085:4;;67630:11;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;44121:16:::1;:14;:16::i;:::-;44108:29:::0;-1:-1:-1;44152:29:0;;44148:147:::1;;44220:59;44231:5;44225:12;;;;;;;;:::i;44148:147::-;44322:33;44332:10;44344;44322:9;:33::i;6545:236::-:0;6601:9;6612:4;6638:1;6633;:6;6629:145;;6664:18;6684:5;6688:1;6684;:5;:::i;:::-;6656:34;;;;;;6629:145;-1:-1:-1;6731:27:0;;-1:-1:-1;6760:1:0;6723:39;;15332:353;15401:9;15412:10;-1:-1:-1;;;;;;;;;;;;;;15412:10:0;15436:14;15452:19;15475:27;15483:1;:10;;;15495:6;15475:7;:27::i;:::-;15435:67;;-1:-1:-1;15435:67:0;-1:-1:-1;15525:18:0;15517:4;:26;;;;;;;;:::i;:::-;;15513:92;;-1:-1:-1;15574:18:0;;;;;;;;;-1:-1:-1;15574:18:0;;15568:4;;-1:-1:-1;15574:18:0;-1:-1:-1;15560:33:0;;15513:92;15645:31;;;;;;;;;;;;-1:-1:-1;;15645:31:0;;-1:-1:-1;15332:353:0;-1:-1:-1;;;;15332:353:0:o;25474:187::-;25559:4;25581:43;25594:3;25589:9;;;;;;;;:::i;:::-;25605:4;25600:10;;;;;;;;:::i;:::-;25581:43;;;25536:25:1;;;25592:2;25577:18;;25570:34;;;;25620:18;;25613:34;;;25524:2;25509:18;25581:43:0;;;;;;;25649:3;25644:9;;;;;;;;:::i;6795:258::-;6851:9;;;6888:5;6892:1;6888;:5;:::i;:::-;6879:14;;6915:1;6910;:6;6906:140;;6941:18;;-1:-1:-1;6961:1:0;-1:-1:-1;6933:30:0;;6906:140;7004:26;7032:1;6996:38;;;;;;;16026:328;16123:9;16134:4;16152:13;16167:18;16189:20;16199:1;16202:6;16189:9;:20::i;:::-;16151:58;;-1:-1:-1;16151:58:0;-1:-1:-1;16231:18:0;16224:3;:25;;;;;;;;:::i;:::-;;16220:73;;-1:-1:-1;16274:3:0;-1:-1:-1;16279:1:0;;-1:-1:-1;16266:15:0;;16220:73;16312:34;16320:17;16329:7;16320:8;:17::i;:::-;16339:6;16312:7;:34::i;:::-;16305:41;;;;;;16026:328;;;;;;;:::o;59105:1159::-;59265:11;;:87;;-1:-1:-1;;;59265:87:0;;59298:4;59265:87;;;10056:34:1;-1:-1:-1;;;;;10126:15:1;;;10106:18;;;10099:43;10178:15;;;10158:18;;;10151:43;10230:15;;;10210:18;;;10203:43;10262:19;;;10255:35;;;59223:4:0;;;;59265:11;;;:24;;9990:19:1;;59265:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59250:102;-1:-1:-1;59367:12:0;;59363:151;;59403:99;59414:27;59443:49;59494:7;59403:10;:99::i;59363:151::-;59552:10;-1:-1:-1;;;;;59540:22:0;:8;-1:-1:-1;;;;;59540:22:0;;59536:146;;;59586:84;59591:26;59619:50;59586:4;:84::i;59536:146::-;-1:-1:-1;;;;;59843:23:0;;59818:22;59843:23;;;:13;:23;;;;;;:37;;59869:11;;59843:37;:::i;:::-;-1:-1:-1;;;;;59918:25:0;;59891:24;59918:25;;;:13;:25;;;;;;59818:62;;-1:-1:-1;59891:24:0;59918:39;;59946:11;;59918:39;:::i;:::-;-1:-1:-1;;;;;60012:23:0;;;;;;;:13;:23;;;;;;:43;;;60066:25;;;;;;;;;;:47;;;60141:43;;59891:66;;-1:-1:-1;60066:25:0;;-1:-1:-1;;;;;;;;;;;60141:43:0;;;60172:11;25037:25:1;;25025:2;25010:18;;24992:76;60141:43:0;;;;;;;;60241:14;60229:27;59105:1159;-1:-1:-1;;;;;;;;59105:1159:0:o;50113:356::-;50187:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;50217:16:::1;:14;:16::i;:::-;50204:29:::0;-1:-1:-1;50248:29:0;;50244:144:::1;;50315:61;50326:5;50320:12;;;;;;;;:::i;:::-;50334:41;50315:4;:61::i;50244:144::-;50415:46;50435:10;50448:12;50415:11;:46::i;46363:359::-:0;46437:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;46467:16:::1;:14;:16::i;:::-;46454:29:::0;-1:-1:-1;46498:29:0;;46494:144:::1;;46565:61;46576:5;46570:12;;;;;;;;:::i;46494:144::-;46665:49;46685:10;46698:12;46712:1;46665:11;:49::i;55493:693::-:0;55627:4;67630:11;;55627:4;;67630:11;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;55663:16:::1;:14;:16::i;:::-;55650:29:::0;-1:-1:-1;55694:29:0;;55690:159:::1;;55762:71;55773:5;55767:12;;;;;;;;:::i;:::-;55781:51;55762:4;:71::i;:::-;55835:1;55754:83;;;;;;;55690:159;55869:16;-1:-1:-1::0;;;;;55869:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55861:41:::0;-1:-1:-1;55917:29:0;;55913:163:::1;;55985:75;55996:5;55990:12;;;;;;;;:::i;:::-;56004:55;55985:4;:75::i;55913:163::-;56105:73;56126:10;56138:8;56148:11;56161:16;56105:20;:73::i;:::-;56098:80;;;;;67697:1;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;55493:693;;;;-1:-1:-1;55493:693:0;-1:-1:-1;;55493:693:0:o;62369:844::-;62495:5;;62450:4;;62495:5;;;-1:-1:-1;;;;;62495:5:0;62481:10;:19;62477:127;;62524:68;62529:18;62549:42;62524:4;:68::i;62477:127::-;37581:12;62630:18;;:38;62626:150;;62692:72;62697:22;62721:42;62692:4;:72::i;62626:150::-;26036:4;62802:24;:51;62798:157;;;62877:66;62882:15;62899:43;62877:4;:66::i;62798:157::-;62999:21;;;63031:48;;;;63097:68;;;25247:25:1;;;25303:2;25288:18;;25281:34;;;63097:68:0;;25220:18:1;63097:68:0;25202:119:1;53566:1913:0;53709:11;;:75;;-1:-1:-1;;;53709:75:0;;53748:4;53709:75;;;10570:34:1;-1:-1:-1;;;;;10640:15:1;;;10620:18;;;10613:43;10692:15;;;10672:18;;;10665:43;10724:18;;;10717:34;;;53661:4:0;;;;;;53709:11;;;;:30;;10504:19:1;;53709:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53694:90;-1:-1:-1;53799:12:0;;53795:153;;53836:96;53847:27;53876:46;53924:7;53836:10;:96::i;:::-;53934:1;53828:108;;;;;;;53795:153;37581:12;53974:18;;:38;53970:153;;54037:70;54042:22;54066:40;54037:4;:70::i;53970:153::-;54135:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54135:32:0;-1:-1:-1;;;;;54211:24:0;;;;;;:14;:24;;;;;:38;;;54190:18;;;:59;54310:37;54226:8;54310:27;:37::i;:::-;54287:19;;;54272:75;;;54273:12;;;54272:75;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;54378:18:0;;-1:-1:-1;54362:4:0;:12;;;:34;;;;;;;;:::i;:::-;;54358:192;;54421:113;54432:16;54450:63;54520:4;:12;;;54515:18;;;;;;;;:::i;54421:113::-;54536:1;54413:125;;;;;;;;54358:192;-1:-1:-1;;54576:11:0;:29;54572:163;;;54641:19;;;;54622:16;;;:38;54572:163;;;54693:16;;;:30;;;54572:163;54814:37;54827:5;54834:4;:16;;;54814:12;:37::i;:::-;54789:22;;;:62;;;54941:19;;;;:44;;54789:62;54941:44;:::i;:::-;54916:22;;;:69;55034:22;;;;55019:12;;:37;;55034:22;55019:37;:::i;:::-;54996:20;;;:60;;;55116:22;;;;;;-1:-1:-1;;;;;55079:24:0;;;;;;;:14;:24;;;;;;;;;:59;;;55190:11;;55149:38;;;;:52;;;;55227:20;;55212:12;:35;;;55304:22;;;;55328;;55275:98;;12442:15:1;;;12424:34;;12474:18;;;12467:43;;;;12526:18;;;12519:34;;;;12584:2;12569:18;;12562:34;12627:3;12612:19;;12605:35;;;;55275:98:0;;12358:19:1;55275:98:0;;;;;;;55448:22;;;55431:14;;55448:22;;-1:-1:-1;53566:1913:0;-1:-1:-1;;;;;53566:1913:0:o;14325:515::-;14386:9;14397:10;-1:-1:-1;;;;;;;;;;;;;;14397:10:0;14421:14;14437:20;14461:22;14469:3;90:4;14461:7;:22::i;:::-;14420:63;;-1:-1:-1;14420:63:0;-1:-1:-1;14506:18:0;14498:4;:26;;;;;;;;:::i;:::-;;14494:92;;-1:-1:-1;14555:18:0;;;;;;;;;-1:-1:-1;14555:18:0;;14549:4;;-1:-1:-1;14555:18:0;-1:-1:-1;14541:33:0;;14494:92;14599:14;14615:13;14632:31;14640:15;14657:5;14632:7;:31::i;:::-;14598:65;;-1:-1:-1;14598:65:0;-1:-1:-1;14686:18:0;14678:4;:26;;;;;;;;:::i;:::-;;14674:92;;14729:4;14735:18;;;;;;;;14750:1;14735:18;;;14721:33;;;;;;;;;;14674:92;14806:25;;;;;;;;;;;;-1:-1:-1;;14806:25:0;;-1:-1:-1;14325:515:0;-1:-1:-1;;;;;;14325:515:0:o;44618:1731::-;44736:11;;:58;;-1:-1:-1;;;44736:58:0;;44688:4;;;;;;-1:-1:-1;;;;;44736:11:0;;:23;;:58;;44768:4;;44775:6;;44783:10;;44736:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44721:73;-1:-1:-1;44809:12:0;;44805:145;;44846:88;44857:27;44886:38;44926:7;44846:10;:88::i;:::-;44936:1;44838:100;;;;;;;44805:145;37581:12;44974:18;;:38;44970:145;;45037:62;45042:22;45066:32;45037:4;:62::i;44970:145::-;45125:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45125:25:0;45207:28;:26;:28::i;:::-;45178:25;;;45163:72;;;45164:12;;;45163:72;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;45266:18:0;;-1:-1:-1;45250:4:0;:12;;;:34;;;;;;;;:::i;:::-;;45246:171;;45309:92;45320:16;45338:42;45387:4;:12;;;45382:18;;;;;;;;:::i;45309:92::-;45403:1;45301:104;;;;;;;;45246:171;45485:10;45530:31;45485:10;45550;45530:12;:31::i;:::-;45506:21;;;:55;;;45664:42;;;;;;;;45679:25;;;;45664:42;;45618:89;;45506:55;45618:22;:89::i;:::-;45599:15;;;45584:123;;;45585:12;;;45584:123;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;45742:18:0;;-1:-1:-1;45726:4:0;:12;;;:34;;;;;;;;:::i;:::-;;45718:79;;;;-1:-1:-1;;;45718:79:0;;23612:2:1;45718:79:0;;;23594:21:1;;;23631:18;;;23624:30;23690:34;23670:18;;;23663:62;23742:18;;45718:79:0;23584:182:1;45718:79:0;45904:4;:15;;;45890:11;;:29;;;;:::i;:::-;45868:19;;;:51;45978:15;;;;-1:-1:-1;;;;;45954:21:0;;;;;;:13;:21;;;;;;:39;;45978:15;45954:39;:::i;:::-;45930:21;;;:63;;;46018:19;;;;;46004:11;:33;-1:-1:-1;;;;;46048:21:0;;;;;;;:13;:21;;;;;;;;;:45;;;;46141:21;;;;46164:15;;;;;46121:59;;9594:15:1;;;9576:34;;9626:18;;;9619:43;;;;9678:18;;;9671:34;9721:18;;9714:34;;;;46121:59:0;;9510:19:1;46121:59:0;;;;;;;46220:6;-1:-1:-1;;;;;46196:48:0;46213:4;-1:-1:-1;;;;;46196:48:0;-1:-1:-1;;;;;;;;;;;46228:4:0;:15;;;46196:48;;;;25037:25:1;;25025:2;25010:18;;24992:76;46196:48:0;;;;;;;;-1:-1:-1;46319:21:0;;;46302:14;;46319:21;;-1:-1:-1;44618:1731:0;-1:-1:-1;;;;44618:1731:0:o;342:122::-;433:12;;399:4;;433:23;;90:4;;433:23;:::i;63618:814::-;63679:4;;;;37581:12;63791:18;;:38;63787:163;;63854:66;63859:22;63883:36;63854:4;:66::i;:::-;63846:92;63922:15;;-1:-1:-1;63618:814:0;-1:-1:-1;;;63618:814:0:o;63787:163::-;64024:35;64037:10;64049:9;64024:12;:35::i;:::-;64006:53;;64107:15;64091:13;;:31;;;;:::i;:::-;64072:50;;64173:13;;64153:16;:33;;64145:67;;;;-1:-1:-1;;;64145:67:0;;24743:2:1;64145:67:0;;;24725:21:1;24782:2;24762:18;;;24755:30;-1:-1:-1;;;24801:18:1;;;24794:51;24862:18;;64145:67:0;24715:171:1;64145:67:0;64235:13;:32;;;64295:60;;;64309:10;7707:51:1;;7789:2;7774:18;;7767:34;;;7817:18;;;7810:34;;;64295:60:0;;7695:2:1;7680:18;64295:60:0;;;;;;;64391:14;64386:20;;71821:737;71974:10;;71996:26;;-1:-1:-1;;;71996:26:0;;-1:-1:-1;;;;;7410:32:1;;;71996:26:0;;;7392:51:1;7459:18;;;7452:34;;;71974:10:0;;;;;;71996:14;;7365:18:1;;71996:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72035:12;72089:16;72128:1;72123:98;;;;72244:2;72239:144;;;;72463:1;72460;72453:12;72123:98;-1:-1:-1;;72186:6:0;-1:-1:-1;72123:98:0;;72239:144;72312:2;72309:1;72306;72291:24;72354:1;72348:8;72337:19;;72082:402;;72513:7;72505:45;;;;-1:-1:-1;;;72505:45:0;;19217:2:1;72505:45:0;;;19199:21:1;19256:2;19236:18;;;19229:30;19295:27;19275:18;;;19268:55;19340:18;;72505:45:0;19189:175:1;72505:45:0;71903:655;;71821:737;;:::o;47360:2739::-;47467:4;47492:19;;;:42;;-1:-1:-1;47515:19:0;;47492:42;47484:107;;;;-1:-1:-1;;;47484:107:0;;23973:2:1;47484:107:0;;;23955:21:1;24012:2;23992:18;;;23985:30;24051:34;24031:18;;;24024:62;-1:-1:-1;;;24102:18:1;;;24095:50;24162:19;;47484:107:0;23945:242:1;47484:107:0;47604:27;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47604:27:0;47698:28;:26;:28::i;:::-;47669:25;;;47654:72;;;47655:12;;;47654:72;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;47757:18:0;;-1:-1:-1;47741:4:0;:12;;;:34;;;;;;;;:::i;:::-;;47737:168;;47799:94;47810:16;47828:44;47879:4;:12;;;47874:18;;;;;;;;:::i;47799:94::-;47792:101;;;;;47737:168;47931:18;;47927:845;;47980:17;;;:34;;;48085:42;;;;;;;;48100:25;;;;48085:42;;48067:77;;48000:14;48067:17;:77::i;:::-;48046:17;;;48031:113;;;48032:12;;;48031:113;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;48179:18:0;;-1:-1:-1;48163:4:0;:12;;;:34;;;;;;;;:::i;:::-;;48159:185;;48225:103;48236:16;48254:53;48314:4;:12;;;48309:18;;;;;;;;:::i;48159:185::-;47927:845;;;48428:82;48451:14;48467:42;;;;;;;;48482:4;:25;;;48467:42;;;48428:22;:82::i;:::-;48407:17;;;48392:118;;;48393:12;;;48392:118;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;48545:18:0;;-1:-1:-1;48529:4:0;:12;;;:34;;;;;;;;:::i;:::-;;48525:185;;48591:103;48602:16;48620:53;48680:4;:12;;;48675:18;;;;;;;;:::i;48525:185::-;48726:17;;;:34;;;47927:845;48809:11;;48860:17;;;;48809:69;;-1:-1:-1;;;48809:69:0;;48794:12;;-1:-1:-1;;;;;48809:11:0;;:25;;:69;;48843:4;;48850:8;;48860:17;48809:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48794:84;-1:-1:-1;48893:12:0;;48889:142;;48929:90;48940:27;48969:40;49011:7;48929:10;:90::i;:::-;48922:97;;;;;;48889:142;37581:12;49057:18;;:38;49053:142;;49119:64;49124:22;49148:34;49119:4;:64::i;49053:142::-;49335:4;:17;;;49321:11;;:31;;;;:::i;:::-;49299:19;;;:53;49413:17;;;;-1:-1:-1;;;;;49387:23:0;;;;;;:13;:23;;;;;;:43;;49413:17;49387:43;:::i;:::-;49363:21;;;:67;49474:17;;;;49457:14;:12;:14::i;:::-;:34;49453:155;;;49515:81;49520:29;49551:44;49515:4;:81::i;49453:155::-;49648:19;;;;49634:11;:33;49704:21;;;;-1:-1:-1;;;;;49678:23:0;;;;;;:13;:23;;;;;:47;49773:17;;;;49749:42;;49692:8;;49749:13;:42::i;:::-;49846:4;-1:-1:-1;;;;;49819:52:0;49828:8;-1:-1:-1;;;;;49819:52:0;-1:-1:-1;;;;;;;;;;;49853:4:0;:17;;;49819:52;;;;25037:25:1;;25025:2;25010:18;;24992:76;49819:52:0;;;;;;;;49904:17;;;;49923;;;;;49887:54;;;-1:-1:-1;;;;;7725:32:1;;7707:51;;7789:2;7774:18;;7767:34;;;;7817:18;;7810:34;49887:54:0;;7680:18:1;49887:54:0;;;;;;;49964:11;;50014:17;;;;50033;;;;49964:87;;-1:-1:-1;;;49964:87:0;;49997:4;49964:87;;;9576:34:1;-1:-1:-1;;;;;9646:15:1;;;9626:18;;;9619:43;9678:18;;;9671:34;;;;9721:18;;;9714:34;;;;49964:11:0;;;:24;;9510:19:1;;49964:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50076:14:0;;-1:-1:-1;50071:20:0;;-1:-1:-1;;50071:20:0;;50064:27;47360:2739;-1:-1:-1;;;;;;47360:2739:0:o;5959:343::-;6015:9;;6047:6;6043:69;;-1:-1:-1;6078:18:0;;-1:-1:-1;6078:18:0;6070:30;;6043:69;6124:6;6133:5;6137:1;6133;:5;:::i;:::-;6124:14;-1:-1:-1;6164:1:0;6155:5;6159:1;6124:14;6155:5;:::i;:::-;:10;6151:144;;6190:26;6218:1;6182:38;;;;;;;6151:144;6261:18;;-1:-1:-1;6281:1:0;-1:-1:-1;6253:30:0;;6316:215;6372:9;;6404:6;6400:77;;-1:-1:-1;6435:26:0;;-1:-1:-1;6463:1:0;6427:38;;6400:77;6497:18;6517:5;6521:1;6517;:5;:::i;:::-;6489:34;;;;6316:215;;;;;:::o;50644:1815::-;50728:4;50753:10;50767:9;50753:23;50745:54;;;;-1:-1:-1;;;50745:54:0;;17347:2:1;50745:54:0;;;17329:21:1;17386:2;17366:18;;;17359:30;-1:-1:-1;;;17405:18:1;;;17398:48;17463:18;;50745:54:0;17319:168:1;50745:54:0;50835:11;;:64;;-1:-1:-1;;;50835:64:0;;50820:12;;-1:-1:-1;;;;;50835:11:0;;:25;;:64;;50869:4;;50876:8;;50886:12;;50835:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50820:79;-1:-1:-1;50914:12:0;;50910:142;;50950:90;50961:27;50990:40;51032:7;50950:10;:90::i;:::-;50943:97;;;;;50910:142;37581:12;51078:18;;:38;51074:142;;51140:64;51145:22;51169:34;51140:4;:64::i;51074:142::-;51259:12;51242:14;:12;:14::i;:::-;:29;51238:143;;;51295:74;51300:29;51331:37;51295:4;:74::i;51238:143::-;51393:27;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51393:27:0;51431:13;51455:24;51540:37;51568:8;51540:27;:37::i;:::-;51517:19;;;51502:75;;;51503:4;51502:75;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;51608:18:0;;-1:-1:-1;51592:12:0;;:34;;;;;;;;:::i;:::-;;51588:181;;51650:107;51661:16;51679:57;51743:4;:12;;;51738:18;;;;;;;;:::i;51650:107::-;51643:114;;;;;;;;51588:181;51910:12;51888:4;:19;;;:34;;;;:::i;:::-;51863:22;;;:59;51956:12;;:27;;51971:12;;51956:27;:::i;:::-;51933:20;;;:50;;;52034:22;;;;;-1:-1:-1;;;;;51997:24:0;;;;;;:14;:24;;;;;;:59;;;52108:11;;52067:38;;;;:52;52191:20;52176:12;:35;52226:37;52012:8;52250:12;52226:13;:37::i;:::-;52334:22;;;;;52358:20;;;;;52303:76;;-1:-1:-1;;;;;8112:32:1;;8094:51;;8176:2;8161:18;;8154:34;;;8204:18;;;8197:34;;;;8247:18;;8240:34;52303:76:0;;8081:3:1;8066:19;52303:76:0;;;;;;;52436:14;52431:20;52424:27;50644:1815;-1:-1:-1;;;;;;;50644:1815:0:o;56200:2674::-;56386:11;;:111;;-1:-1:-1;;;56386:111:0;;56429:4;56386:111;;;10056:34:1;-1:-1:-1;;;;;10126:15:1;;;10106:18;;;10099:43;10178:15;;;10158:18;;;10151:43;10230:15;;;10210:18;;;10203:43;10262:19;;;10255:35;;;56338:4:0;;;;;;56386:11;;;;:34;;9990:19:1;;56386:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56371:126;-1:-1:-1;56512:12:0;;56508:150;;56549:93;56560:27;56589:43;56634:7;56549:10;:93::i;:::-;56644:1;56541:105;;;;;;;56508:150;37581:12;56684:18;;:38;56680:150;;56747:67;56752:22;56776:37;56747:4;:67::i;56680:150::-;37581:12;56856:16;-1:-1:-1;;;;;56856:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;56852:180;;56938:78;56943:22;56967:48;56938:4;:78::i;56852:180::-;57070:10;-1:-1:-1;;;;;57058:22:0;:8;-1:-1:-1;;;;;57058:22:0;;57054:145;;;57105:78;57110:26;57138:44;57105:4;:78::i;57054:145::-;57225:16;57221:147;;57266:86;57271:36;57309:42;57266:4;:86::i;57221:147::-;-1:-1:-1;;57394:11:0;:29;57390:164;;;57448:90;57453:36;57491:46;57448:4;:90::i;57390:164::-;57579:21;57602:22;57628:51;57645:10;57657:8;57667:11;57628:16;:51::i;:::-;57578:101;;-1:-1:-1;57578:101:0;-1:-1:-1;57694:40:0;;57690:163;;57759:78;57770:16;57764:23;;;;;;;;:::i;:::-;57789:47;57759:4;:78::i;:::-;57839:1;57751:90;;;;;;;;;57690:163;57951:11;;:102;;-1:-1:-1;;;57951:102:0;;57908:21;;;;-1:-1:-1;;;;;57951:11:0;;;;:41;;:102;;58001:4;;58016:16;;58035:17;;57951:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57907:146;;-1:-1:-1;57907:146:0;-1:-1:-1;58072:40:0;;58064:82;;;;-1:-1:-1;;;58064:82:0;;19571:2:1;58064:82:0;;;19553:21:1;19610:2;19590:18;;;19583:30;19649:31;19629:18;;;19622:59;19698:18;;58064:82:0;19543:179:1;58064:82:0;58177:36;;-1:-1:-1;;;58177:36:0;;-1:-1:-1;;;;;7166:32:1;;;58177:36:0;;;7148:51:1;58217:11:0;;58177:26;;;;;;7121:18:1;;58177:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;58169:88;;;;-1:-1:-1;;;58169:88:0;;22857:2:1;58169:88:0;;;22839:21:1;22896:2;22876:18;;;22869:30;22935:26;22915:18;;;22908:54;22979:18;;58169:88:0;22829:174:1;58169:88:0;58280:15;-1:-1:-1;;;;;58310:42:0;;58347:4;58310:42;58306:254;;;58382:63;58404:4;58411:10;58423:8;58433:11;58382:13;:63::i;:::-;58369:76;;58306:254;;;58491:57;;-1:-1:-1;;;58491:57:0;;-1:-1:-1;;;;;58491:22:0;;;;;:57;;58514:10;;58526:8;;58536:11;;58491:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58478:70;;58306:254;58590:34;;58582:67;;;;-1:-1:-1;;;58582:67:0;;24394:2:1;58582:67:0;;;24376:21:1;24433:2;24413:18;;;24406:30;-1:-1:-1;;;24452:18:1;;;24445:50;24512:18;;58582:67:0;24366:170:1;58582:67:0;58677:96;;;-1:-1:-1;;;;;11457:15:1;;;11439:34;;11509:15;;;11504:2;11489:18;;11482:43;11541:18;;;11534:34;;;11604:15;;11599:2;11584:18;;11577:43;11651:3;11636:19;;11629:35;;;58677:96:0;;;;;;;11388:3:1;58677:96:0;;;58831:14;58818:48;-1:-1:-1;58848:17:0;;-1:-1:-1;;;;;;56200:2674:0;;;;;;;;:::o;70734:1073::-;70895:10;;70938:51;;-1:-1:-1;;;70938:51:0;;70983:4;70938:51;;;7148::1;70818:4:0;;-1:-1:-1;;;;;70895:10:0;;70818:4;;70895:10;;70938:36;;7121:18:1;;70938:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71000:47;;-1:-1:-1;;;71000:47:0;;70917:72;;-1:-1:-1;;;;;;71000:18:0;;;;;:47;;71019:4;;71033;;71040:6;;71000:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71060:12;71114:16;71153:1;71148:99;;;;71270:2;71265:145;;;;71491:1;71488;71481:12;71148:99;-1:-1:-1;;71212:6:0;-1:-1:-1;71148:99:0;;71265:145;71339:2;71336:1;71333;71318:24;71381:1;71375:8;71364:19;;71107:405;;71541:7;71533:44;;;;-1:-1:-1;;;71533:44:0;;16634:2:1;71533:44:0;;;16616:21:1;16673:2;16653:18;;;16646:30;16712:26;16692:18;;;16685:54;16756:18;;71533:44:0;16606:174:1;71533:44:0;71635:10;;71620:51;;-1:-1:-1;;;71620:51:0;;71665:4;71620:51;;;7148::1;71600:17:0;;-1:-1:-1;;;;;71635:10:0;;71620:36;;7121:18:1;;71620:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71600:71;;71706:13;71690:12;:29;;71682:68;;;;-1:-1:-1;;;71682:68:0;;18862:2:1;71682:68:0;;;18844:21:1;18901:2;18881:18;;;18874:30;18940:28;18920:18;;;18913:56;18986:18;;71682:68:0;18834:176:1;71682:68:0;71768:28;71783:13;71768:12;:28;:::i;17100:337::-;17188:9;17199:4;17217:13;17232:19;17255:31;17270:6;17278:7;16819:9;16830:10;-1:-1:-1;;;;;;;;;;;;;;16830:10:0;16864:14;16880;16898:25;90:4;16916:6;16898:7;:25::i;:::-;16863:60;;-1:-1:-1;16863:60:0;-1:-1:-1;16946:18:0;16938:4;:26;;;;;;;;:::i;:::-;;16934:92;;-1:-1:-1;16995:18:0;;;;;;;;;-1:-1:-1;16995:18:0;;16989:4;;-1:-1:-1;16995:18:0;-1:-1:-1;16981:33:0;;16934:92;17043:35;17050:9;17061:7;:16;;;17043:6;:35::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:719:1;57:5;110:3;103:4;95:6;91:17;87:27;77:2;;128:1;125;118:12;77:2;164:6;151:20;190:18;227:2;223;220:10;217:2;;;233:18;;:::i;:::-;308:2;302:9;276:2;362:13;;-1:-1:-1;;358:22:1;;;382:2;354:31;350:40;338:53;;;406:18;;;426:22;;;403:46;400:2;;;452:18;;:::i;:::-;492:10;488:2;481:22;527:2;519:6;512:18;573:3;566:4;561:2;553:6;549:15;545:26;542:35;539:2;;;590:1;587;580:12;539:2;654;647:4;639:6;635:17;628:4;620:6;616:17;603:54;701:1;694:4;689:2;681:6;677:15;673:26;666:37;721:6;712:15;;;;;;67:666;;;;:::o;738:156::-;804:20;;864:4;853:16;;843:27;;833:2;;884:1;881;874:12;833:2;785:109;;;:::o;899:247::-;958:6;1011:2;999:9;990:7;986:23;982:32;979:2;;;1027:1;1024;1017:12;979:2;1066:9;1053:23;1085:31;1110:5;1085:31;:::i;1411:388::-;1479:6;1487;1540:2;1528:9;1519:7;1515:23;1511:32;1508:2;;;1556:1;1553;1546:12;1508:2;1595:9;1582:23;1614:31;1639:5;1614:31;:::i;:::-;1664:5;-1:-1:-1;1721:2:1;1706:18;;1693:32;1734:33;1693:32;1734:33;:::i;:::-;1786:7;1776:17;;;1498:301;;;;;:::o;1804:456::-;1881:6;1889;1897;1950:2;1938:9;1929:7;1925:23;1921:32;1918:2;;;1966:1;1963;1956:12;1918:2;2005:9;1992:23;2024:31;2049:5;2024:31;:::i;:::-;2074:5;-1:-1:-1;2131:2:1;2116:18;;2103:32;2144:33;2103:32;2144:33;:::i;:::-;1908:352;;2196:7;;-1:-1:-1;;;2250:2:1;2235:18;;;;2222:32;;1908:352::o;2265:1157::-;2451:6;2459;2467;2475;2483;2491;2499;2552:3;2540:9;2531:7;2527:23;2523:33;2520:2;;;2569:1;2566;2559:12;2520:2;2608:9;2595:23;2627:31;2652:5;2627:31;:::i;:::-;2677:5;-1:-1:-1;2734:2:1;2719:18;;2706:32;2747:33;2706:32;2747:33;:::i;:::-;2799:7;-1:-1:-1;2858:2:1;2843:18;;2830:32;2871:33;2830:32;2871:33;:::i;:::-;2923:7;-1:-1:-1;2977:2:1;2962:18;;2949:32;;-1:-1:-1;3032:3:1;3017:19;;3004:33;3056:18;3086:14;;;3083:2;;;3113:1;3110;3103:12;3083:2;3136:50;3178:7;3169:6;3158:9;3154:22;3136:50;:::i;:::-;3126:60;;3239:3;3228:9;3224:19;3211:33;3195:49;;3269:2;3259:8;3256:16;3253:2;;;3285:1;3282;3275:12;3253:2;;3308:52;3352:7;3341:8;3330:9;3326:24;3308:52;:::i;:::-;3298:62;;;3379:37;3411:3;3400:9;3396:19;3379:37;:::i;:::-;3369:47;;2510:912;;;;;;;;;;:::o;3427:315::-;3495:6;3503;3556:2;3544:9;3535:7;3531:23;3527:32;3524:2;;;3572:1;3569;3562:12;3524:2;3611:9;3598:23;3630:31;3655:5;3630:31;:::i;:::-;3680:5;3732:2;3717:18;;;;3704:32;;-1:-1:-1;;;3514:228:1:o;3747:480::-;3848:6;3856;3864;3917:2;3905:9;3896:7;3892:23;3888:32;3885:2;;;3933:1;3930;3923:12;3885:2;3972:9;3959:23;3991:31;4016:5;3991:31;:::i;:::-;4041:5;-1:-1:-1;4093:2:1;4078:18;;4065:32;;-1:-1:-1;4149:2:1;4134:18;;4121:32;4162:33;4121:32;4162:33;:::i;:::-;4214:7;4204:17;;;3875:352;;;;;:::o;4232:277::-;4299:6;4352:2;4340:9;4331:7;4327:23;4323:32;4320:2;;;4368:1;4365;4358:12;4320:2;4400:9;4394:16;4453:5;4446:13;4439:21;4432:5;4429:32;4419:2;;4475:1;4472;4465:12;4795:1015;4972:6;4980;4988;4996;5004;5012;5065:3;5053:9;5044:7;5040:23;5036:33;5033:2;;;5082:1;5079;5072:12;5033:2;5121:9;5108:23;5140:31;5165:5;5140:31;:::i;:::-;5190:5;-1:-1:-1;5247:2:1;5232:18;;5219:32;5260:33;5219:32;5260:33;:::i;:::-;5312:7;-1:-1:-1;5366:2:1;5351:18;;5338:32;;-1:-1:-1;5421:2:1;5406:18;;5393:32;5444:18;5474:14;;;5471:2;;;5501:1;5498;5491:12;5471:2;5524:50;5566:7;5557:6;5546:9;5542:22;5524:50;:::i;:::-;5514:60;;5627:3;5616:9;5612:19;5599:33;5583:49;;5657:2;5647:8;5644:16;5641:2;;;5673:1;5670;5663:12;5641:2;;5696:52;5740:7;5729:8;5718:9;5714:24;5696:52;:::i;:::-;5686:62;;;5767:37;5799:3;5788:9;5784:19;5767:37;:::i;:::-;5757:47;;5023:787;;;;;;;;:::o;6378:180::-;6437:6;6490:2;6478:9;6469:7;6465:23;6461:32;6458:2;;;6506:1;6503;6496:12;6458:2;-1:-1:-1;6529:23:1;;6448:110;-1:-1:-1;6448:110:1:o;6563:184::-;6633:6;6686:2;6674:9;6665:7;6661:23;6657:32;6654:2;;;6702:1;6699;6692:12;6654:2;-1:-1:-1;6725:16:1;;6644:103;-1:-1:-1;6644:103:1:o;6752:245::-;6831:6;6839;6892:2;6880:9;6871:7;6867:23;6863:32;6860:2;;;6908:1;6905;6898:12;6860:2;-1:-1:-1;;6931:16:1;;6987:2;6972:18;;;6966:25;6931:16;;6966:25;;-1:-1:-1;6850:147:1:o;8911:383::-;-1:-1:-1;;;;;9177:15:1;;;9159:34;;9229:15;;;;9224:2;9209:18;;9202:43;9276:2;9261:18;;9254:34;;;;9109:2;9094:18;;9076:218::o;14671:597::-;14783:4;14812:2;14841;14830:9;14823:21;14873:6;14867:13;14916:6;14911:2;14900:9;14896:18;14889:34;14941:1;14951:140;14965:6;14962:1;14959:13;14951:140;;;15060:14;;;15056:23;;15050:30;15026:17;;;15045:2;15022:26;15015:66;14980:10;;14951:140;;;15109:6;15106:1;15103:13;15100:2;;;15179:1;15174:2;15165:6;15154:9;15150:22;15146:31;15139:42;15100:2;-1:-1:-1;15252:2:1;15231:15;-1:-1:-1;;15227:29:1;15212:45;;;;15259:2;15208:54;;14792:476;-1:-1:-1;;;14792:476:1:o;15676:346::-;15878:2;15860:21;;;15917:2;15897:18;;;15890:30;-1:-1:-1;;;15951:2:1;15936:18;;15929:52;16013:2;15998:18;;15850:172::o;21604:334::-;21806:2;21788:21;;;21845:2;21825:18;;;21818:30;-1:-1:-1;;;21879:2:1;21864:18;;21857:40;21929:2;21914:18;;21778:160::o;26567:128::-;26607:3;26638:1;26634:6;26631:1;26628:13;26625:2;;;26644:18;;:::i;:::-;-1:-1:-1;26680:9:1;;26615:80::o;26700:120::-;26740:1;26766;26756:2;;26771:18;;:::i;:::-;-1:-1:-1;26805:9:1;;26746:74::o;26825:168::-;26865:7;26931:1;26927;26923:6;26919:14;26916:1;26913:21;26908:1;26901:9;26894:17;26890:45;26887:2;;;26938:18;;:::i;:::-;-1:-1:-1;26978:9:1;;26877:116::o;26998:125::-;27038:4;27066:1;27063;27060:8;27057:2;;;27071:18;;:::i;:::-;-1:-1:-1;27108:9:1;;27047:76::o;27128:380::-;27207:1;27203:12;;;;27250;;;27271:2;;27325:4;27317:6;27313:17;27303:27;;27271:2;27378;27370:6;27367:14;27347:18;27344:38;27341:2;;;27424:10;27419:3;27415:20;27412:1;27405:31;27459:4;27456:1;27449:15;27487:4;27484:1;27477:15;27341:2;;27183:325;;;:::o;27513:135::-;27552:3;-1:-1:-1;;27573:17:1;;27570:2;;;27593:18;;:::i;:::-;-1:-1:-1;27640:1:1;27629:13;;27560:88::o;27653:112::-;27685:1;27711;27701:2;;27716:18;;:::i;:::-;-1:-1:-1;27750:9:1;;27691:74::o;27770:127::-;27831:10;27826:3;27822:20;27819:1;27812:31;27862:4;27859:1;27852:15;27886:4;27883:1;27876:15;27902:127;27963:10;27958:3;27954:20;27951:1;27944:31;27994:4;27991:1;27984:15;28018:4;28015:1;28008:15;28034:127;28095:10;28090:3;28086:20;28083:1;28076:31;28126:4;28123:1;28116:15;28150:4;28147:1;28140:15;28166:127;28227:10;28222:3;28218:20;28215:1;28208:31;28258:4;28255:1;28248:15;28282:4;28279:1;28272:15;28298:127;28359:10;28354:3;28350:20;28347:1;28340:31;28390:4;28387:1;28380:15;28414:4;28411:1;28404:15;28430:131;-1:-1:-1;;;;;28505:31:1;;28495:42;;28485:2;;28551:1;28548;28541:12;28485:2;28475:86;:::o

Swarm Source

ipfs://0a5495c8ff9c90708ed5a6572006ba639f53ca959030d8021949a95fe036f9cd

Block Transaction Gas Used Reward
view all blocks ##produced##

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.