Contract 0xb08ba4ad6bc291f4f1e79c4c7f9395141b8d5797 3

 
Token migration announcement. INTDESTCOIN token contract has migrated to a new address.

Contract Overview

INTDESTCOIN: Old INTD Token
Balance:
0 MATIC

MATIC Value:
$0.00

Token:
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xfd947045295966b26a7dc18f62af3d438dffabaf1c7da0c68665865aee178c12Approve349010232022-10-28 10:47:53153 days 4 hrs agoINTDESTCOIN: Deployer 1 IN  INTDESTCOIN: Old INTD Token0 MATIC0.001095306258 45.022453904
0x98e334363728e7a555fbea078f399093094d62ccae2f3c3b9bb7a74f36d35422Approve348984092022-10-28 9:17:17153 days 6 hrs agoINTDESTCOIN: Deployer 1 IN  INTDESTCOIN: Old INTD Token0 MATIC0.00238392318 51.143979679
0x0cf349103d267492bda6ca2f877ed1bed6f5fcdc72417c5d2e134bfd5fb127a3Approve348415712022-10-27 0:11:34154 days 15 hrs agoINTDESTCOIN: Deployer 1 IN  INTDESTCOIN: Old INTD Token0 MATIC0.001622904365 66.70932117
0xbea96d26cdc97724731345133a67afafde5234250e51b798b16f1db8665be9a5Approve348404112022-10-26 23:27:26154 days 16 hrs agoINTDESTCOIN: Deployer 1 IN  INTDESTCOIN: Old INTD Token0 MATIC0.003102994437 66.570720788
0x5648a16eb38d6389e9a79e9164a1a80216b88c51833558bb3706cce04a6e48c3Pause334319702022-09-22 16:44:33188 days 22 hrs agoINTDESTCOIN: Deployer IN  INTDESTCOIN: Old INTD Token0 MATIC0.00083208 30.000000016
0x355f45dbd4c3138efe316bcdfad40d4efdc2398a07d0d8a6e2420c69d1b8010eTransfer334314882022-09-22 16:27:59188 days 23 hrs agoINTDESTCOIN: Deployer IN  INTDESTCOIN: Old INTD Token0 MATIC0.00182676 30.000000016
0x879a0940d48a353ced0589dc17aed7ed425d665e6ceec171bb8efff154abda5eApprove332614372022-09-18 13:07:26193 days 2 hrs ago0x8254f3fdb02f3ddbe9ba5333df0190a6a854601f IN  INTDESTCOIN: Old INTD Token0 MATIC0.00078984 30.000000011
0x0a392f155de49702f10b6a95d40a600680c38eb51cb2709cf1c2d5b182757126Approve332614212022-09-18 13:06:54193 days 2 hrs ago0x8254f3fdb02f3ddbe9ba5333df0190a6a854601f IN  INTDESTCOIN: Old INTD Token0 MATIC0.00078984 30.000000012
0x194dc7c766fcb85e6be102399d3fa172e192be2ba2a241609f9bb0050563661dApprove332613222022-09-18 13:03:32193 days 2 hrs ago0x8254f3fdb02f3ddbe9ba5333df0190a6a854601f IN  INTDESTCOIN: Old INTD Token0 MATIC0.00078984 30.000000014
0x372e64c86e5028bed25192dccb21899a2b71cf24ecfe477eb739a5208194d76eApprove332613202022-09-18 13:03:28193 days 2 hrs ago0x8254f3fdb02f3ddbe9ba5333df0190a6a854601f IN  INTDESTCOIN: Old INTD Token0 MATIC0.00078984 30.000000014
0xc1cd9c57e536e504add127659cbded0b00816cb0703182ccfa373b25662d7ca7Approve332612922022-09-18 13:02:28193 days 2 hrs ago0x8254f3fdb02f3ddbe9ba5333df0190a6a854601f IN  INTDESTCOIN: Old INTD Token0 MATIC0.00078984 30.000000014
0x437718bd0f671264ad718ea4985a2b5f14161551fda6d17d0fdd4f89c70309c3Approve332612812022-09-18 13:02:06193 days 2 hrs ago0x8254f3fdb02f3ddbe9ba5333df0190a6a854601f IN  INTDESTCOIN: Old INTD Token0 MATIC0.00078984 30.000000014
0x1ce29f0ed9e08a6a7454ad0e92857c0676e1e81a11477b6d48554e406ed2d89eApprove326909062022-09-04 18:49:46206 days 20 hrs ago0xd5770bd2979a8389b75bea5f7fb66eee7e203f8c IN  INTDESTCOIN: Old INTD Token0 MATIC0.00256366 55.000000011
0xec65e681c1b1a9dd8a5f1e33c697532af17bbf7402adeb3370ac19f542ef38d3Mint323864292022-08-27 18:52:28214 days 20 hrs agoINTDESTCOIN: Deployer IN  INTDESTCOIN: Old INTD Token0 MATIC0.003138216422 32.608572645
0xc2d1f59ddaf4863ae183a3214a27acbeefd786cb3c25a78014919fe5bffec155Approve323227872022-08-25 23:07:38216 days 16 hrs agoINTDESTCOIN: Deployer IN  INTDESTCOIN: Old INTD Token0 MATIC0.001595137219 34.221600016
0x78230b72c34594dae9291f95d5ec03f6f91744f7c6c3fb2cfe8f97653c08b09eTransfer317771522022-08-11 18:08:14230 days 21 hrs agoINTDESTCOIN: Deployer IN  INTDESTCOIN: Old INTD Token0 MATIC0.0019758 30.000000015
0x4080448aba425ba9b395db4847cbfada6ac8aa0d7801c2e28827424d40ec3f54Approve314287382022-08-02 9:55:11240 days 5 hrs agoINTDESTCOIN: Deployer IN  INTDESTCOIN: Old INTD Token0 MATIC0.0019502404 42.1
0x4d27e15fdebb7a539b1a594c3306c1ef9dacb2ac7053d8c551580470e13c66cdApprove309134282022-07-19 22:32:05253 days 16 hrs agoINTDESTCOIN: Deployer IN  INTDESTCOIN: Old INTD Token0 MATIC0.00146175232 31.36
0x1230a32c076067701f4b9a7ff6c6a1c7984ccd58d05a12a52c7f0787fa55c4a7Approve308465232022-07-18 3:43:39255 days 11 hrs agoINTDESTCOIN: Deployer IN  INTDESTCOIN: Old INTD Token0 MATIC0.001501085628 32.212137953
0x637d4fbd0e2f7b114da4360f83f0f6808643f13d62b46cc3652008e257ab5369Approve308456222022-07-18 3:08:22255 days 12 hrs agoINTDESTCOIN: Deployer IN  INTDESTCOIN: Old INTD Token0 MATIC0.002244706645 48.1572695
0x9a698996e27418d440764205afc0829fd72d8a98978033baa6d510dd2e0bdb970x61014060307712122022-07-16 1:43:20257 days 13 hrs agoINTDESTCOIN: Deployer IN  Create: INTDESTCOIN0 MATIC0.08399443813 32.250603061
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
INTDESTCOIN

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-07-16
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;
interface IERC3156FlashBorrower {

    function onFlashLoan(
        address initiator,
        address token,
        uint256 amount,
        uint256 fee,
        bytes calldata data
    ) external returns (bytes32);
}
pragma solidity ^0.8.0;
interface IERC3156FlashLender {
    function maxFlashLoan(address token) external view returns (uint256);
    function flashFee(address token, uint256 amount) external view returns (uint256);
    function flashLoan(
        IERC3156FlashBorrower receiver,
        address token,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);
}
pragma solidity ^0.8.0;
library SafeCast {
    function toUint248(uint256 value) internal pure returns (uint248) {
        require(value <= type(uint248).max, "SafeCast: value doesn't fit in 248 bits");
        return uint248(value);
    }
    function toUint240(uint256 value) internal pure returns (uint240) {
        require(value <= type(uint240).max, "SafeCast: value doesn't fit in 240 bits");
        return uint240(value);
    }
    function toUint232(uint256 value) internal pure returns (uint232) {
        require(value <= type(uint232).max, "SafeCast: value doesn't fit in 232 bits");
        return uint232(value);
    }
    function toUint224(uint256 value) internal pure returns (uint224) {
        require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits");
        return uint224(value);
    }
    function toUint216(uint256 value) internal pure returns (uint216) {
        require(value <= type(uint216).max, "SafeCast: value doesn't fit in 216 bits");
        return uint216(value);
    }
    function toUint208(uint256 value) internal pure returns (uint208) {
        require(value <= type(uint208).max, "SafeCast: value doesn't fit in 208 bits");
        return uint208(value);
    }
    function toUint200(uint256 value) internal pure returns (uint200) {
        require(value <= type(uint200).max, "SafeCast: value doesn't fit in 200 bits");
        return uint200(value);
    }
    function toUint192(uint256 value) internal pure returns (uint192) {
        require(value <= type(uint192).max, "SafeCast: value doesn't fit in 192 bits");
        return uint192(value);
    }
    function toUint184(uint256 value) internal pure returns (uint184) {
        require(value <= type(uint184).max, "SafeCast: value doesn't fit in 184 bits");
        return uint184(value);
    }
    function toUint176(uint256 value) internal pure returns (uint176) {
        require(value <= type(uint176).max, "SafeCast: value doesn't fit in 176 bits");
        return uint176(value);
    }
    function toUint168(uint256 value) internal pure returns (uint168) {
        require(value <= type(uint168).max, "SafeCast: value doesn't fit in 168 bits");
        return uint168(value);
    }
    function toUint160(uint256 value) internal pure returns (uint160) {
        require(value <= type(uint160).max, "SafeCast: value doesn't fit in 160 bits");
        return uint160(value);
    }
    function toUint152(uint256 value) internal pure returns (uint152) {
        require(value <= type(uint152).max, "SafeCast: value doesn't fit in 152 bits");
        return uint152(value);
    }
    function toUint144(uint256 value) internal pure returns (uint144) {
        require(value <= type(uint144).max, "SafeCast: value doesn't fit in 144 bits");
        return uint144(value);
    }
    function toUint136(uint256 value) internal pure returns (uint136) {
        require(value <= type(uint136).max, "SafeCast: value doesn't fit in 136 bits");
        return uint136(value);
    }
    function toUint128(uint256 value) internal pure returns (uint128) {
        require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits");
        return uint128(value);
    }
    function toUint120(uint256 value) internal pure returns (uint120) {
        require(value <= type(uint120).max, "SafeCast: value doesn't fit in 120 bits");
        return uint120(value);
    }
    function toUint112(uint256 value) internal pure returns (uint112) {
        require(value <= type(uint112).max, "SafeCast: value doesn't fit in 112 bits");
        return uint112(value);
    }
    function toUint104(uint256 value) internal pure returns (uint104) {
        require(value <= type(uint104).max, "SafeCast: value doesn't fit in 104 bits");
        return uint104(value);
    }
    function toUint96(uint256 value) internal pure returns (uint96) {
        require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits");
        return uint96(value);
    }
    function toUint88(uint256 value) internal pure returns (uint88) {
        require(value <= type(uint88).max, "SafeCast: value doesn't fit in 88 bits");
        return uint88(value);
    }
    function toUint80(uint256 value) internal pure returns (uint80) {
        require(value <= type(uint80).max, "SafeCast: value doesn't fit in 80 bits");
        return uint80(value);
    }
    function toUint72(uint256 value) internal pure returns (uint72) {
        require(value <= type(uint72).max, "SafeCast: value doesn't fit in 72 bits");
        return uint72(value);
    }
    function toUint64(uint256 value) internal pure returns (uint64) {
        require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits");
        return uint64(value);
    }
    function toUint56(uint256 value) internal pure returns (uint56) {
        require(value <= type(uint56).max, "SafeCast: value doesn't fit in 56 bits");
        return uint56(value);
    }
    function toUint48(uint256 value) internal pure returns (uint48) {
        require(value <= type(uint48).max, "SafeCast: value doesn't fit in 48 bits");
        return uint48(value);
    }
    function toUint40(uint256 value) internal pure returns (uint40) {
        require(value <= type(uint40).max, "SafeCast: value doesn't fit in 40 bits");
        return uint40(value);
    }
    function toUint32(uint256 value) internal pure returns (uint32) {
        require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits");
        return uint32(value);
    }
    function toUint24(uint256 value) internal pure returns (uint24) {
        require(value <= type(uint24).max, "SafeCast: value doesn't fit in 24 bits");
        return uint24(value);
    }
    function toUint16(uint256 value) internal pure returns (uint16) {
        require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits");
        return uint16(value);
    }
    function toUint8(uint256 value) internal pure returns (uint8) {
        require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits");
        return uint8(value);
    }
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }
    function toInt248(int256 value) internal pure returns (int248) {
        require(value >= type(int248).min && value <= type(int248).max, "SafeCast: value doesn't fit in 248 bits");
        return int248(value);
    }
    function toInt240(int256 value) internal pure returns (int240) {
        require(value >= type(int240).min && value <= type(int240).max, "SafeCast: value doesn't fit in 240 bits");
        return int240(value);
    }
    function toInt232(int256 value) internal pure returns (int232) {
        require(value >= type(int232).min && value <= type(int232).max, "SafeCast: value doesn't fit in 232 bits");
        return int232(value);
    }
    function toInt224(int256 value) internal pure returns (int224) {
        require(value >= type(int224).min && value <= type(int224).max, "SafeCast: value doesn't fit in 224 bits");
        return int224(value);
    }
    function toInt216(int256 value) internal pure returns (int216) {
        require(value >= type(int216).min && value <= type(int216).max, "SafeCast: value doesn't fit in 216 bits");
        return int216(value);
    }
    function toInt208(int256 value) internal pure returns (int208) {
        require(value >= type(int208).min && value <= type(int208).max, "SafeCast: value doesn't fit in 208 bits");
        return int208(value);
    }
    function toInt200(int256 value) internal pure returns (int200) {
        require(value >= type(int200).min && value <= type(int200).max, "SafeCast: value doesn't fit in 200 bits");
        return int200(value);
    }
    function toInt192(int256 value) internal pure returns (int192) {
        require(value >= type(int192).min && value <= type(int192).max, "SafeCast: value doesn't fit in 192 bits");
        return int192(value);
    }
    function toInt184(int256 value) internal pure returns (int184) {
        require(value >= type(int184).min && value <= type(int184).max, "SafeCast: value doesn't fit in 184 bits");
        return int184(value);
    }
    function toInt176(int256 value) internal pure returns (int176) {
        require(value >= type(int176).min && value <= type(int176).max, "SafeCast: value doesn't fit in 176 bits");
        return int176(value);
    }
    function toInt168(int256 value) internal pure returns (int168) {
        require(value >= type(int168).min && value <= type(int168).max, "SafeCast: value doesn't fit in 168 bits");
        return int168(value);
    }
    function toInt160(int256 value) internal pure returns (int160) {
        require(value >= type(int160).min && value <= type(int160).max, "SafeCast: value doesn't fit in 160 bits");
        return int160(value);
    }
    function toInt152(int256 value) internal pure returns (int152) {
        require(value >= type(int152).min && value <= type(int152).max, "SafeCast: value doesn't fit in 152 bits");
        return int152(value);
    }
    function toInt144(int256 value) internal pure returns (int144) {
        require(value >= type(int144).min && value <= type(int144).max, "SafeCast: value doesn't fit in 144 bits");
        return int144(value);
    }
    function toInt136(int256 value) internal pure returns (int136) {
        require(value >= type(int136).min && value <= type(int136).max, "SafeCast: value doesn't fit in 136 bits");
        return int136(value);
    }
    function toInt128(int256 value) internal pure returns (int128) {
        require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits");
        return int128(value);
    }
    function toInt120(int256 value) internal pure returns (int120) {
        require(value >= type(int120).min && value <= type(int120).max, "SafeCast: value doesn't fit in 120 bits");
        return int120(value);
    }
    function toInt112(int256 value) internal pure returns (int112) {
        require(value >= type(int112).min && value <= type(int112).max, "SafeCast: value doesn't fit in 112 bits");
        return int112(value);
    }
    function toInt104(int256 value) internal pure returns (int104) {
        require(value >= type(int104).min && value <= type(int104).max, "SafeCast: value doesn't fit in 104 bits");
        return int104(value);
    }
    function toInt96(int256 value) internal pure returns (int96) {
        require(value >= type(int96).min && value <= type(int96).max, "SafeCast: value doesn't fit in 96 bits");
        return int96(value);
    }
    function toInt88(int256 value) internal pure returns (int88) {
        require(value >= type(int88).min && value <= type(int88).max, "SafeCast: value doesn't fit in 88 bits");
        return int88(value);
    }
    function toInt80(int256 value) internal pure returns (int80) {
        require(value >= type(int80).min && value <= type(int80).max, "SafeCast: value doesn't fit in 80 bits");
        return int80(value);
    }
    function toInt72(int256 value) internal pure returns (int72) {
        require(value >= type(int72).min && value <= type(int72).max, "SafeCast: value doesn't fit in 72 bits");
        return int72(value);
    }
    function toInt64(int256 value) internal pure returns (int64) {
        require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits");
        return int64(value);
    }
    function toInt56(int256 value) internal pure returns (int56) {
        require(value >= type(int56).min && value <= type(int56).max, "SafeCast: value doesn't fit in 56 bits");
        return int56(value);
    }
    function toInt48(int256 value) internal pure returns (int48) {
        require(value >= type(int48).min && value <= type(int48).max, "SafeCast: value doesn't fit in 48 bits");
        return int48(value);
    }
    function toInt40(int256 value) internal pure returns (int40) {
        require(value >= type(int40).min && value <= type(int40).max, "SafeCast: value doesn't fit in 40 bits");
        return int40(value);
    }
    function toInt32(int256 value) internal pure returns (int32) {
        require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits");
        return int32(value);
    }
    function toInt24(int256 value) internal pure returns (int24) {
        require(value >= type(int24).min && value <= type(int24).max, "SafeCast: value doesn't fit in 24 bits");
        return int24(value);
    }
    function toInt16(int256 value) internal pure returns (int16) {
        require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits");
        return int16(value);
    }
    function toInt8(int256 value) internal pure returns (int8) {
        require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits");
        return int8(value);
    }

    function toInt256(uint256 value) internal pure returns (int256) {
        require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256");
        return int256(value);
    }
}
pragma solidity ^0.8.0;
interface IVotes {
        event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
    event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);
    function getVotes(address account) external view returns (uint256);
    function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);
    function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);
    function delegates(address account) external view returns (address);
    function delegate(address delegatee) external;
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}
pragma solidity ^0.8.0;
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;
    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}
pragma solidity ^0.8.0;
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; 
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
       if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
         if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}
pragma solidity ^0.8.0;
abstract contract EIP712 {
     bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

pragma solidity ^0.8.0;
interface IERC20Permit {
     function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
    function nonces(address owner) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}
pragma solidity ^0.8.0;
library Counters {
    struct Counter {
        uint256 _value; 
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}
pragma solidity ^0.8.0;
library Math {
    enum Rounding {
        Down,
        Up,
        Zero
    }
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
             uint256 prod0;
            uint256 prod1;
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }
            if (prod1 == 0) {
                return prod0 / denominator;
            }
            require(denominator > prod1);
            uint256 remainder;
            assembly {
                remainder := mulmod(x, y, denominator)
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                denominator := div(denominator, twos)
                prod0 := div(prod0, twos)
                twos := add(div(sub(0, twos), twos), 1)
            }
            prod0 |= prod1 * twos;
            uint256 inverse = (3 * denominator) ^ 2;
            inverse *= 2 - denominator * inverse;
            inverse *= 2 - denominator * inverse;
            inverse *= 2 - denominator * inverse;
            inverse *= 2 - denominator * inverse;
            inverse *= 2 - denominator * inverse;
            inverse *= 2 - denominator * inverse;
            result = prod0 * inverse;
            return result;
        }
    }
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 result = 1;
        uint256 x = a;
        if (x >> 128 > 0) {
            x >>= 128;
            result <<= 64;
        }
        if (x >> 64 > 0) {
            x >>= 64;
            result <<= 32;
        }
        if (x >> 32 > 0) {
            x >>= 32;
            result <<= 16;
        }
        if (x >> 16 > 0) {
            x >>= 16;
            result <<= 8;
        }
        if (x >> 8 > 0) {
            x >>= 8;
            result <<= 4;
        }
        if (x >> 4 > 0) {
            x >>= 4;
            result <<= 2;
        }
        if (x >> 2 > 0) {
            result <<= 1;
        }
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        uint256 result = sqrt(a);
        if (rounding == Rounding.Up && result * result < a) {
            result += 1;
        }
        return result;
    }
}
pragma solidity ^0.8.0;
library Arrays {
    function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
        if (array.length == 0) {
            return 0;
        }

        uint256 low = 0;
        uint256 high = array.length;

        while (low < high) {
            uint256 mid = Math.average(low, high);
            if (array[mid] > element) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }
        if (low > 0 && array[low - 1] == element) {
            return low - 1;
        } else {
            return low;
        }
    }
}
pragma solidity ^0.8.0;
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
pragma solidity ^0.8.0;
abstract contract Pausable is Context {
    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;
    constructor() {
        _paused = false;
    }
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }
    modifier whenPaused() {
        _requirePaused();
        _;
    }
    function paused() public view virtual returns (bool) {
        return _paused;
    }
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}
pragma solidity ^0.8.0;
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor() {
        _transferOwnership(_msgSender());
    }
    modifier onlyOwner() {
        _checkOwner();
        _;
    }
    function owner() public view virtual returns (address) {
        return _owner;
    }
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
pragma solidity ^0.8.0;
interface IERC20 {
     event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}
pragma solidity ^0.8.0;
interface IERC20Metadata is IERC20 {
     function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}
pragma solidity ^0.8.0;
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

pragma solidity ^0.8.0;

abstract contract ERC20FlashMint is ERC20, IERC3156FlashLender {
    bytes32 private constant _RETURN_VALUE = keccak256("ERC3156FlashBorrower.onFlashLoan");

    function maxFlashLoan(address token) public view virtual override returns (uint256) {
        return token == address(this) ? type(uint256).max - ERC20.totalSupply() : 0;
    }

    function flashFee(address token, uint256 amount) public view virtual override returns (uint256) {
        require(token == address(this), "ERC20FlashMint: wrong token");

        amount;
        return 0;
    }

    function _flashFeeReceiver() internal view virtual returns (address) {
        return address(0);
    }

    function flashLoan(
        IERC3156FlashBorrower receiver,
        address token,
        uint256 amount,
        bytes calldata data
    ) public virtual override returns (bool) {
        require(amount <= maxFlashLoan(token), "ERC20FlashMint: amount exceeds maxFlashLoan");
        uint256 fee = flashFee(token, amount);
        _mint(address(receiver), amount);
        require(
            receiver.onFlashLoan(msg.sender, token, amount, fee, data) == _RETURN_VALUE,
            "ERC20FlashMint: invalid return value"
        );
        address flashFeeReceiver = _flashFeeReceiver();
        _spendAllowance(address(receiver), address(this), amount + fee);
        if (fee == 0 || flashFeeReceiver == address(0)) {
            _burn(address(receiver), amount + fee);
        } else {
            _burn(address(receiver), amount);
            _transfer(address(receiver), flashFeeReceiver, fee);
        }
        return true;
    }
}
pragma solidity ^0.8.0;
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;


    bytes32 private constant _PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
 
    bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;

    constructor(string memory name) EIP712(name, "1") {}

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}
pragma solidity ^0.8.0;
abstract contract ERC20Votes is IVotes, ERC20Permit {
    struct Checkpoint {
        uint32 fromBlock;
        uint224 votes;
    }

    bytes32 private constant _DELEGATION_TYPEHASH =
        keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    mapping(address => address) private _delegates;
    mapping(address => Checkpoint[]) private _checkpoints;
    Checkpoint[] private _totalSupplyCheckpoints;

    function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {
        return _checkpoints[account][pos];
    }

    function numCheckpoints(address account) public view virtual returns (uint32) {
        return SafeCast.toUint32(_checkpoints[account].length);
    }

    function delegates(address account) public view virtual override returns (address) {
        return _delegates[account];
    }

    function getVotes(address account) public view virtual override returns (uint256) {
        uint256 pos = _checkpoints[account].length;
        return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;
    }

    function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {
        require(blockNumber < block.number, "ERC20Votes: block not yet mined");
        return _checkpointsLookup(_checkpoints[account], blockNumber);
    }

    function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {
        require(blockNumber < block.number, "ERC20Votes: block not yet mined");
        return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);
    }

    function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {

        uint256 high = ckpts.length;
        uint256 low = 0;
        while (low < high) {
            uint256 mid = Math.average(low, high);
            if (ckpts[mid].fromBlock > blockNumber) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        return high == 0 ? 0 : ckpts[high - 1].votes;
    }

    function delegate(address delegatee) public virtual override {
        _delegate(_msgSender(), delegatee);
    }

    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= expiry, "ERC20Votes: signature expired");
        address signer = ECDSA.recover(
            _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),
            v,
            r,
            s
        );
        require(nonce == _useNonce(signer), "ERC20Votes: invalid nonce");
        _delegate(signer, delegatee);
    }

    function _maxSupply() internal view virtual returns (uint224) {
        return type(uint224).max;
    }

    function _mint(address account, uint256 amount) internal virtual override {
        super._mint(account, amount);
        require(totalSupply() <= _maxSupply(), "ERC20Votes: total supply risks overflowing votes");

        _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);
    }

    function _burn(address account, uint256 amount) internal virtual override {
        super._burn(account, amount);

        _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);
    }

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._afterTokenTransfer(from, to, amount);

        _moveVotingPower(delegates(from), delegates(to), amount);
    }

    function _delegate(address delegator, address delegatee) internal virtual {
        address currentDelegate = delegates(delegator);
        uint256 delegatorBalance = balanceOf(delegator);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveVotingPower(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveVotingPower(
        address src,
        address dst,
        uint256 amount
    ) private {
        if (src != dst && amount > 0) {
            if (src != address(0)) {
                (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);
                emit DelegateVotesChanged(src, oldWeight, newWeight);
            }

            if (dst != address(0)) {
                (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);
                emit DelegateVotesChanged(dst, oldWeight, newWeight);
            }
        }
    }

    function _writeCheckpoint(
        Checkpoint[] storage ckpts,
        function(uint256, uint256) view returns (uint256) op,
        uint256 delta
    ) private returns (uint256 oldWeight, uint256 newWeight) {
        uint256 pos = ckpts.length;
        oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;
        newWeight = op(oldWeight, delta);

        if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {
            ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);
        } else {
            ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));
        }
    }

    function _add(uint256 a, uint256 b) private pure returns (uint256) {
        return a + b;
    }

    function _subtract(uint256 a, uint256 b) private pure returns (uint256) {
        return a - b;
    }
}

pragma solidity ^0.8.0;

abstract contract ERC20Snapshot is ERC20 {
    using Arrays for uint256[];
    using Counters for Counters.Counter;

    struct Snapshots {
        uint256[] ids;
        uint256[] values;
    }

    mapping(address => Snapshots) private _accountBalanceSnapshots;
    Snapshots private _totalSupplySnapshots;
    Counters.Counter private _currentSnapshotId;
    event Snapshot(uint256 id);

    function _snapshot() internal virtual returns (uint256) {
        _currentSnapshotId.increment();

        uint256 currentId = _getCurrentSnapshotId();
        emit Snapshot(currentId);
        return currentId;
    }

    function _getCurrentSnapshotId() internal view virtual returns (uint256) {
        return _currentSnapshotId.current();
    }

    function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) {
        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]);

        return snapshotted ? value : balanceOf(account);
    }

    function totalSupplyAt(uint256 snapshotId) public view virtual returns (uint256) {
        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots);

        return snapshotted ? value : totalSupply();
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        if (from == address(0)) {
            // mint
            _updateAccountSnapshot(to);
            _updateTotalSupplySnapshot();
        } else if (to == address(0)) {
            // burn
            _updateAccountSnapshot(from);
            _updateTotalSupplySnapshot();
        } else {
            // transfer
            _updateAccountSnapshot(from);
            _updateAccountSnapshot(to);
        }
    }

    function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) {
        require(snapshotId > 0, "ERC20Snapshot: id is 0");
        require(snapshotId <= _getCurrentSnapshotId(), "ERC20Snapshot: nonexistent id");
        uint256 index = snapshots.ids.findUpperBound(snapshotId);

        if (index == snapshots.ids.length) {
            return (false, 0);
        } else {
            return (true, snapshots.values[index]);
        }
    }

    function _updateAccountSnapshot(address account) private {
        _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account));
    }

    function _updateTotalSupplySnapshot() private {
        _updateSnapshot(_totalSupplySnapshots, totalSupply());
    }

    function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private {
        uint256 currentId = _getCurrentSnapshotId();
        if (_lastSnapshotId(snapshots.ids) < currentId) {
            snapshots.ids.push(currentId);
            snapshots.values.push(currentValue);
        }
    }

    function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) {
        if (ids.length == 0) {
            return 0;
        } else {
            return ids[ids.length - 1];
        }
    }
}
pragma solidity ^0.8.0;
abstract contract ERC20Burnable is Context, ERC20 {
     function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}
pragma solidity ^0.8.4;
contract INTDESTCOIN is ERC20, ERC20Burnable, ERC20Snapshot, Ownable, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint {
    constructor() ERC20("INTDESTCOIN", "INTD") ERC20Permit("INTDESTCOIN") {
        _mint(msg.sender, 10000000000 * 10 ** decimals());
    }

    function snapshot() public onlyOwner {
        _snapshot();
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
        internal
        whenNotPaused
        override(ERC20, ERC20Snapshot)
    {
        super._beforeTokenTransfer(from, to, amount);
    }

    function _afterTokenTransfer(address from, address to, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._afterTokenTransfer(from, to, amount);
    }

    function _mint(address to, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._mint(to, amount);
    }

    function _burn(address account, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._burn(account, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Snapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint32","name":"pos","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20Votes.Checkpoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"flashFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC3156FlashBorrower","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashLoan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"maxFlashLoan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101406040523480156200001257600080fd5b506040518060400160405280600b81526020016a24a72a2222a9aa21a7a4a760a91b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600b81526020016a24a72a2222a9aa21a7a4a760a91b815250604051806040016040528060048152602001631253951160e21b8152508160039080519060200190620000ab92919062000a4f565b508051620000c190600490602084019062000a4f565b505050620000de620000d8620001bb60201b60201c565b620001bf565b6009805460ff60a01b19169055815160208084019190912082518383012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c00190528051940193909320919290916080523060601b60c0526101205250620001b5935033925062000191915050601290565b6200019e90600a62000b4f565b620001af906402540be40062000c0e565b62000211565b62000c9d565b3390565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200022882826200022c60201b62000fe21760201c565b5050565b620002438282620002e360201b620010721760201c565b6001600160e01b0362000257620003e08216565b1115620002c45760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084015b60405180910390fd5b620002dd600e62001165620003e660201b1783620003fd565b50505050565b6001600160a01b0382166200033b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620002bb565b6200034960008383620005d3565b80600260008282546200035d919062000aeb565b90915550506001600160a01b038216600090815260208190526040812080548392906200038c90849062000aeb565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36200022860008383620005fa565b60025490565b6000620003f4828462000aeb565b90505b92915050565b8254600090819080156200045b57856200041960018362000c30565b815481106200043857634e487b7160e01b600052603260045260246000fd5b60009182526020909120015464010000000090046001600160e01b03166200045e565b60005b6001600160e01b031692506200047583858760201c565b9150600081118015620004c5575043866200049260018462000c30565b81548110620004b157634e487b7160e01b600052603260045260246000fd5b60009182526020909120015463ffffffff16145b156200054557620004e1826200061260201b620011711760201c565b86620004ef60018462000c30565b815481106200050e57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550620005ca565b85604051806040016040528062000567436200068160201b620011de1760201c565b63ffffffff16815260200162000588856200061260201b620011711760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b620005dd620006e8565b620005f58383836200074060201b620012431760201c565b505050565b620005f5838383620007ac60201b620012901760201c565b60006001600160e01b038211156200067d5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401620002bb565b5090565b600063ffffffff8211156200067d5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401620002bb565b620006fc600954600160a01b900460ff1690565b156200073e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401620002bb565b565b62000758838383620005f560201b620012621760201c565b6001600160a01b0383166200077c576200077282620007f8565b620005f562000830565b6001600160a01b03821662000796576200077283620007f8565b620007a183620007f8565b620005f582620007f8565b620007c4838383620005f560201b620012621760201c565b6001600160a01b038381166000908152600c6020526040808220548584168352912054620005f59291821691168362000840565b6001600160a01b038116600090815260056020908152604080832091839052909120546200082d91906200097b565b6200097b565b50565b6200073e60066200082760025490565b816001600160a01b0316836001600160a01b031614158015620008635750600081115b15620005f5576001600160a01b03831615620008f0576001600160a01b0383166000908152600d6020908152604082208291620008ad9190620009ca901b620012c21785620003fd565b91509150846001600160a01b0316600080516020620037148339815191528383604051620008e5929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615620005f5576001600160a01b0382166000908152600d6020908152604082208291620009349190620003e6901b620011651785620003fd565b91509150836001600160a01b03166000805160206200371483398151915283836040516200096c929190918252602082015260400190565b60405180910390a25050505050565b600062000987620009d8565b9050806200099584620009f6565b1015620005f5578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b6000620003f4828462000c30565b6000620009f1600862000a4b60201b620012ce1760201c565b905090565b805460009062000a0857506000919050565b8154829062000a1a9060019062000c30565b8154811062000a3957634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b5490565b82805462000a5d9062000c4a565b90600052602060002090601f01602090048101928262000a81576000855562000acc565b82601f1062000a9c57805160ff191683800117855562000acc565b8280016001018555821562000acc579182015b8281111562000acc57825182559160200191906001019062000aaf565b506200067d9291505b808211156200067d576000815560010162000ad5565b6000821982111562000b015762000b0162000c87565b500190565b600181815b8085111562000b4757816000190482111562000b2b5762000b2b62000c87565b8085161562000b3957918102915b93841c939080029062000b0b565b509250929050565b6000620003f460ff84168360008262000b6b57506001620003f7565b8162000b7a57506000620003f7565b816001811462000b93576002811462000b9e5762000bbe565b6001915050620003f7565b60ff84111562000bb25762000bb262000c87565b50506001821b620003f7565b5060208310610133831016604e8410600b841016171562000be3575081810a620003f7565b62000bef838362000b06565b806000190482111562000c065762000c0662000c87565b029392505050565b600081600019048311821515161562000c2b5762000c2b62000c87565b500290565b60008282101562000c455762000c4562000c87565b500390565b600181811c9082168062000c5f57607f821691505b6020821081141562000c8157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160601c60e0516101005161012051612a2462000cf060003960006116d301526000611722015260006116fd0152600061165601526000611680015260006116aa0152612a246000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806370a0823111610130578063981b24d0116100b8578063d505accf1161007c578063d505accf146104bb578063d9d98ce4146104ce578063dd62ed3e146104e1578063f1127ed8146104f4578063f2fde38b1461053157600080fd5b8063981b24d01461045c5780639ab24eb01461046f578063a457c2d714610482578063a9059cbb14610495578063c3cda520146104a857600080fd5b80638456cb59116100ff5780638456cb59146104205780638da5cb5b146104285780638e539e8c1461043957806395d89b411461044c5780639711715a1461045457600080fd5b806370a08231146103c9578063715018a6146103f257806379cc6790146103fa5780637ecebe001461040d57600080fd5b806340c10f19116101b35780635c19a95c116101825780635c19a95c146103565780635c975abb146103695780635cffe9de1461037b578063613255ab1461038e5780636fcfff45146103a157600080fd5b806340c10f19146102d957806342966c68146102ec5780634ee2cd7e146102ff578063587cde1e1461031257600080fd5b8063313ce567116101fa578063313ce567146102925780633644e515146102a157806339509351146102a95780633a46b1a8146102bc5780633f4ba83a146102cf57600080fd5b806306fdde031461022c578063095ea7b31461024a57806318160ddd1461026d57806323b872dd1461027f575b600080fd5b610234610544565b60405161024191906128ec565b60405180910390f35b61025d610258366004612710565b6105d6565b6040519015158152602001610241565b6002545b604051908152602001610241565b61025d61028d366004612663565b6105f0565b60405160128152602001610241565b610271610614565b61025d6102b7366004612710565b610623565b6102716102ca366004612710565b610645565b6102d76106c4565b005b6102d76102e7366004612710565b6106d6565b6102d76102fa36600461287b565b6106ec565b61027161030d366004612710565b6106f9565b61033e61032036600461260f565b6001600160a01b039081166000908152600c60205260409020541690565b6040516001600160a01b039091168152602001610241565b6102d761036436600461260f565b610752565b600954600160a01b900460ff1661025d565b61025d6103893660046127e1565b61075c565b61027161039c36600461260f565b61094f565b6103b46103af36600461260f565b610977565b60405163ffffffff9091168152602001610241565b6102716103d736600461260f565b6001600160a01b031660009081526020819052604090205490565b6102d7610999565b6102d7610408366004612710565b6109ab565b61027161041b36600461260f565b6109c0565b6102d76109de565b6009546001600160a01b031661033e565b61027161044736600461287b565b6109ee565b610234610a4a565b6102d7610a59565b61027161046a36600461287b565b610a69565b61027161047d36600461260f565b610a94565b61025d610490366004612710565b610b29565b61025d6104a3366004612710565b610ba4565b6102d76104b636600461273b565b610bb2565b6102d76104c93660046126a3565b610ce8565b6102716104dc366004612710565b610e4c565b6102716104ef36600461262b565b610eaf565b610507610502366004612794565b610eda565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610241565b6102d761053f36600461260f565b610f6c565b6060600380546105539061298e565b80601f016020809104026020016040519081016040528092919081815260200182805461057f9061298e565b80156105cc5780601f106105a1576101008083540402835291602001916105cc565b820191906000526020600020905b8154815290600101906020018083116105af57829003601f168201915b5050505050905090565b6000336105e48185856112d2565b60019150505b92915050565b6000336105fe8582856113f6565b61060985858561146a565b506001949350505050565b600061061e611649565b905090565b6000336105e48185856106368383610eaf565b610640919061293f565b6112d2565b600043821061069b5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064015b60405180910390fd5b6001600160a01b0383166000908152600d602052604090206106bd9083611770565b9392505050565b6106cc611849565b6106d46118a3565b565b6106de611849565b6106e882826118f8565b5050565b6106f63382611902565b50565b6001600160a01b03821660009081526005602052604081208190819061072090859061190c565b9150915081610747576001600160a01b038516600090815260208190526040902054610749565b805b95945050505050565b6106f63382611a11565b60006107678561094f565b8411156107ca5760405162461bcd60e51b815260206004820152602b60248201527f4552433230466c6173684d696e743a20616d6f756e742065786365656473206d60448201526a30bc233630b9b42637b0b760a91b6064820152608401610692565b60006107d68686610e4c565b90506107e287866118f8565b6040516323e30c8b60e01b81527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9906001600160a01b038916906323e30c8b9061083a9033908b908b9088908c908c90600401612893565b602060405180830381600087803b15801561085457600080fd5b505af1158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c91906127c9565b146108e55760405162461bcd60e51b8152602060048201526024808201527f4552433230466c6173684d696e743a20696e76616c69642072657475726e2076604482015263616c756560e01b6064820152608401610692565b60006108fb88306108f6858a61293f565b6113f6565b81158061090f57506001600160a01b038116155b1561092c5761092788610922848961293f565b611902565b610941565b6109368887611902565b61094188828461146a565b506001979650505050505050565b60006001600160a01b03821630146109685760006105ea565b6002546105ea90600019612977565b6001600160a01b0381166000908152600d60205260408120546105ea906111de565b6109a1611849565b6106d46000611a8a565b6109b68233836113f6565b6106e88282611902565b6001600160a01b0381166000908152600a60205260408120546105ea565b6109e6611849565b6106d4611adc565b6000438210610a3f5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610692565b6105ea600e83611770565b6060600480546105539061298e565b610a61611849565b6106f6611b1f565b6000806000610a7984600661190c565b9150915081610a8a57600254610a8c565b805b949350505050565b6001600160a01b0381166000908152600d60205260408120548015610b16576001600160a01b0383166000908152600d60205260409020610ad6600183612977565b81548110610af457634e487b7160e01b600052603260045260246000fd5b60009182526020909120015464010000000090046001600160e01b0316610b19565b60005b6001600160e01b03169392505050565b60003381610b378286610eaf565b905083811015610b975760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610692565b61060982868684036112d2565b6000336105e481858561146a565b83421115610c025760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610692565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610c7c90610c749060a00160405160208183030381529060405280519060200120611b79565b858585611bc7565b9050610c8781611bef565b8614610cd55760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610692565b610cdf8188611a11565b50505050505050565b83421115610d385760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610692565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610d678c611bef565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610dc282611b79565b90506000610dd282878787611bc7565b9050896001600160a01b0316816001600160a01b031614610e355760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610692565b610e408a8a8a6112d2565b50505050505050505050565b60006001600160a01b0383163014610ea65760405162461bcd60e51b815260206004820152601b60248201527f4552433230466c6173684d696e743a2077726f6e6720746f6b656e00000000006044820152606401610692565b50600092915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60408051808201909152600080825260208201526001600160a01b0383166000908152600d60205260409020805463ffffffff8416908110610f2c57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b610f74611849565b6001600160a01b038116610fd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610692565b6106f681611a8a565b610fec8282611072565b6002546001600160e01b03101561105e5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610692565b61106c600e61116583611c17565b50505050565b6001600160a01b0382166110c85760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610692565b6110d460008383611dba565b80600260008282546110e6919061293f565b90915550506001600160a01b0382166000908152602081905260408120805483929061111390849061293f565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36106e860008383611dcd565b60006106bd828461293f565b60006001600160e01b038211156111da5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610692565b5090565b600063ffffffff8211156111da5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610692565b6001600160a01b0383166112675761125a82611dd8565b611262611e0a565b505050565b6001600160a01b03821661127e5761125a83611dd8565b61128783611dd8565b61126282611dd8565b6001600160a01b038381166000908152600c602052604080822054858416835291205461126292918216911683611e18565b60006106bd8284612977565b5490565b6001600160a01b0383166113345760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610692565b6001600160a01b0382166113955760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610692565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006114028484610eaf565b9050600019811461106c578181101561145d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610692565b61106c84848484036112d2565b6001600160a01b0383166114ce5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610692565b6001600160a01b0382166115305760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610692565b61153b838383611dba565b6001600160a01b038316600090815260208190526040902054818110156115b35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610692565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906115ea90849061293f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161163691815260200190565b60405180910390a361106c848484611dcd565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156116a257507f000000000000000000000000000000000000000000000000000000000000000046145b156116cc57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b818110156117e257600061178b8284611f55565b9050848682815481106117ae57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015463ffffffff1611156117ce578092506117dc565b6117d981600161293f565b91505b50611777565b811561183457846117f4600184612977565b8154811061181257634e487b7160e01b600052603260045260246000fd5b60009182526020909120015464010000000090046001600160e01b0316611837565b60005b6001600160e01b031695945050505050565b6009546001600160a01b031633146106d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610692565b6118ab611f70565b6009805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6106e88282610fe2565b6106e88282611fc0565b600080600084116119585760405162461bcd60e51b815260206004820152601660248201527504552433230536e617073686f743a20696420697320360541b6044820152606401610692565b611960611fd8565b8411156119af5760405162461bcd60e51b815260206004820152601d60248201527f4552433230536e617073686f743a206e6f6e6578697374656e742069640000006044820152606401610692565b60006119bb8486611fe3565b84549091508114156119d4576000809250925050611a0a565b60018460010182815481106119f957634e487b7160e01b600052603260045260246000fd5b906000526020600020015492509250505b9250929050565b6001600160a01b038281166000818152600c60208181526040808420805485845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461106c828483611e18565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611ae46120c2565b6009805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118db3390565b6000611b2f600880546001019055565b6000611b39611fd8565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051611b6c91815260200190565b60405180910390a1919050565b60006105ea611b86611649565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000611bd88787878761210f565b91509150611be5816121fc565b5095945050505050565b6001600160a01b0381166000908152600a602052604090208054600181018255905b50919050565b825460009081908015611c705785611c30600183612977565b81548110611c4e57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015464010000000090046001600160e01b0316611c73565b60005b6001600160e01b03169250611c8c83858763ffffffff16565b9150600081118015611cd857504386611ca6600184612977565b81548110611cc457634e487b7160e01b600052603260045260246000fd5b60009182526020909120015463ffffffff16145b15611d4657611ce682611171565b86611cf2600184612977565b81548110611d1057634e487b7160e01b600052603260045260246000fd5b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550611db1565b856040518060400160405280611d5b436111de565b63ffffffff168152602001611d6f85611171565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b611dc26120c2565b611262838383611243565b611262838383611290565b6001600160a01b038116600090815260056020908152604080832091839052909120546106f691906123fd565b6123fd565b6106d46006611e0560025490565b816001600160a01b0316836001600160a01b031614158015611e3a5750600081115b15611262576001600160a01b03831615611ec8576001600160a01b0383166000908152600d602052604081208190611e75906112c285611c17565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611ebd929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611262576001600160a01b0382166000908152600d602052604081208190611efe9061116585611c17565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611f46929190918252602082015260400190565b60405180910390a25050505050565b6000611f646002848418612957565b6106bd9084841661293f565b600954600160a01b900460ff166106d45760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610692565b611fca8282612447565b61106c600e6112c283611c17565b600061061e60085490565b8154600090611ff4575060006105ea565b82546000905b8082101561205e57600061200e8383611f55565b90508486828154811061203157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154111561204a57809150612058565b61205581600161293f565b92505b50611ffa565b6000821180156120a157508385612076600185612977565b8154811061209457634e487b7160e01b600052603260045260246000fd5b9060005260206000200154145b156120ba576120b1600183612977565b925050506105ea565b5090506105ea565b600954600160a01b900460ff16156106d45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610692565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561214657506000905060036121f3565b8460ff16601b1415801561215e57508460ff16601c14155b1561216f57506000905060046121f3565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156121c3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166121ec576000600192509250506121f3565b9150600090505b94509492505050565b600081600481111561221e57634e487b7160e01b600052602160045260246000fd5b14156122275750565b600181600481111561224957634e487b7160e01b600052602160045260246000fd5b14156122975760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610692565b60028160048111156122b957634e487b7160e01b600052602160045260246000fd5b14156123075760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610692565b600381600481111561232957634e487b7160e01b600052602160045260246000fd5b14156123825760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610692565b60048160048111156123a457634e487b7160e01b600052602160045260246000fd5b14156106f65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610692565b6000612407611fd8565b905080612413846125a8565b1015611262578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b6001600160a01b0382166124a75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610692565b6124b382600083611dba565b6001600160a01b038216600090815260208190526040902054818110156125275760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610692565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612556908490612977565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361126283600084611dcd565b80546000906125b957506000919050565b815482906125c990600190612977565b815481106125e757634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b919050565b803560ff811681146125f957600080fd5b600060208284031215612620578081fd5b81356106bd816129d9565b6000806040838503121561263d578081fd5b8235612648816129d9565b91506020830135612658816129d9565b809150509250929050565b600080600060608486031215612677578081fd5b8335612682816129d9565b92506020840135612692816129d9565b929592945050506040919091013590565b600080600080600080600060e0888a0312156126bd578283fd5b87356126c8816129d9565b965060208801356126d8816129d9565b955060408801359450606088013593506126f4608089016125fe565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612722578182fd5b823561272d816129d9565b946020939093013593505050565b60008060008060008060c08789031215612753578182fd5b863561275e816129d9565b9550602087013594506040870135935061277a606088016125fe565b92506080870135915060a087013590509295509295509295565b600080604083850312156127a6578182fd5b82356127b1816129d9565b9150602083013563ffffffff81168114612658578182fd5b6000602082840312156127da578081fd5b5051919050565b6000806000806000608086880312156127f8578081fd5b8535612803816129d9565b94506020860135612813816129d9565b935060408601359250606086013567ffffffffffffffff80821115612836578283fd5b818801915088601f830112612849578283fd5b813581811115612857578384fd5b896020828501011115612868578384fd5b9699959850939650602001949392505050565b60006020828403121561288c578081fd5b5035919050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a06080820181905281018290526000828460c084013781830160c090810191909152601f909201601f1916010195945050505050565b6000602080835283518082850152825b81811015612918578581018301518582016040015282016128fc565b818111156129295783604083870101525b50601f01601f1916929092016040019392505050565b60008219821115612952576129526129c3565b500190565b60008261297257634e487b7160e01b81526012600452602481fd5b500490565b600082821015612989576129896129c3565b500390565b600181811c908216806129a257607f821691505b60208210811415611c1157634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146106f657600080fdfea2646970667358221220280683de1c568378c88cac5b63bb51f1a4f06141e0774b8ff918e4fbe8868ad564736f6c63430008040033dec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724

Deployed ByteCode Sourcemap

49475:1334:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31943:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32861:201;;;;;;:::i;:::-;;:::i;:::-;;;6366:14:1;;6359:22;6341:41;;6329:2;6314:18;32861:201:0;6296:92:1;32258:108:0;32346:12;;32258:108;;;6539:25:1;;;6527:2;6512:18;32258:108:0;6494:76:1;33070:295:0;;;;;;:::i;:::-;;:::i;32159:93::-;;;32242:2;22061:36:1;;22049:2;22034:18;32159:93:0;22016:87:1;39803:115:0;;;:::i;33373:238::-;;;;;;:::i;:::-;;:::i;41283:268::-;;;;;;:::i;:::-;;:::i;49892:65::-;;;:::i;:::-;;49965:95;;;;;;:::i;:::-;;:::i;49184:91::-;;;;;;:::i;:::-;;:::i;46641:266::-;;;;;;:::i;:::-;;:::i;40927:128::-;;;;;;:::i;:::-;-1:-1:-1;;;;;41028:19:0;;;41001:7;41028:19;;;:10;:19;;;;;;;;40927:128;;;;-1:-1:-1;;;;;5415:32:1;;;5397:51;;5385:2;5370:18;40927:128:0;5352:102:1;42319:114:0;;;;;;:::i;:::-;;:::i;28912:86::-;28983:7;;-1:-1:-1;;;28983:7:0;;;;28912:86;;37575:959;;;;;;:::i;:::-;;:::i;37053:178::-;;;;;;:::i;:::-;;:::i;40768:151::-;;;;;;:::i;:::-;;:::i;:::-;;;21896:10:1;21884:23;;;21866:42;;21854:2;21839:18;40768:151:0;21821:93:1;32372:127:0;;;;;;:::i;:::-;-1:-1:-1;;;;;32473:18:0;32446:7;32473:18;;;;;;;;;;;;32372:127;30044:103;;;:::i;49281:164::-;;;;;;:::i;:::-;;:::i;39667:128::-;;;;;;:::i;:::-;;:::i;49823:61::-;;;:::i;29813:87::-;29886:6;;-1:-1:-1;;;;;29886:6:0;29813:87;;41559:259;;;;;;:::i;:::-;;:::i;32049:104::-;;;:::i;49748:67::-;;;:::i;46915:234::-;;;;;;:::i;:::-;;:::i;41063:212::-;;;;;;:::i;:::-;;:::i;33619:436::-;;;;;;:::i;:::-;;:::i;32505:193::-;;;;;;:::i;:::-;;:::i;42441:591::-;;;;;;:::i;:::-;;:::i;39014:645::-;;;;;;:::i;:::-;;:::i;37239:215::-;;;;;;:::i;:::-;;:::i;32704:151::-;;;;;;:::i;:::-;;:::i;40610:150::-;;;;;;:::i;:::-;;:::i;:::-;;;;21160:13:1;;21175:10;21156:30;21138:49;;21247:4;21235:17;;;21229:24;-1:-1:-1;;;;;21225:50:1;21203:20;;;21196:80;;;;21111:18;40610:150:0;21093:189:1;30153:201:0;;;;;;:::i;:::-;;:::i;31943:100::-;31997:13;32030:5;32023:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31943:100;:::o;32861:201::-;32944:4;28397:10;33000:32;28397:10;33016:7;33025:6;33000:8;:32::i;:::-;33050:4;33043:11;;;32861:201;;;;;:::o;33070:295::-;33201:4;28397:10;33259:38;33275:4;28397:10;33290:6;33259:15;:38::i;:::-;33308:27;33318:4;33324:2;33328:6;33308:9;:27::i;:::-;-1:-1:-1;33353:4:0;;33070:295;-1:-1:-1;;;;33070:295:0:o;39803:115::-;39863:7;39890:20;:18;:20::i;:::-;39883:27;;39803:115;:::o;33373:238::-;33461:4;28397:10;33517:64;28397:10;33533:7;33570:10;33542:25;28397:10;33533:7;33542:9;:25::i;:::-;:38;;;;:::i;:::-;33517:8;:64::i;41283:268::-;41381:7;41423:12;41409:11;:26;41401:70;;;;-1:-1:-1;;;41401:70:0;;10415:2:1;41401:70:0;;;10397:21:1;10454:2;10434:18;;;10427:30;10493:33;10473:18;;;10466:61;10544:18;;41401:70:0;;;;;;;;;-1:-1:-1;;;;;41508:21:0;;;;;;:12;:21;;;;;41489:54;;41531:11;41489:18;:54::i;:::-;41482:61;41283:268;-1:-1:-1;;;41283:268:0:o;49892:65::-;29774:13;:11;:13::i;:::-;49939:10:::1;:8;:10::i;:::-;49892:65::o:0;49965:95::-;29774:13;:11;:13::i;:::-;50035:17:::1;50041:2;50045:6;50035:5;:17::i;:::-;49965:95:::0;;:::o;49184:91::-;49240:27;28397:10;49260:6;49240:5;:27::i;:::-;49184:91;:::o;46641:266::-;-1:-1:-1;;;;;46805:33:0;;46728:7;46805:33;;;:24;:33;;;;;46728:7;;;;46784:55;;46793:10;;46784:8;:55::i;:::-;46748:91;;;;46859:11;:40;;-1:-1:-1;;;;;32473:18:0;;32446:7;32473:18;;;;;;;;;;;46859:40;;;46873:5;46859:40;46852:47;46641:266;-1:-1:-1;;;;;46641:266:0:o;42319:114::-;42391:34;28397:10;42415:9;42391;:34::i;37575:959::-;37754:4;37789:19;37802:5;37789:12;:19::i;:::-;37779:6;:29;;37771:85;;;;-1:-1:-1;;;37771:85:0;;17989:2:1;37771:85:0;;;17971:21:1;18028:2;18008:18;;;18001:30;18067:34;18047:18;;;18040:62;-1:-1:-1;;;18118:18:1;;;18111:41;18169:19;;37771:85:0;17961:233:1;37771:85:0;37867:11;37881:23;37890:5;37897:6;37881:8;:23::i;:::-;37867:37;;37915:32;37929:8;37940:6;37915:5;:32::i;:::-;37980:58;;-1:-1:-1;;;37980:58:0;;36999:45;;-1:-1:-1;;;;;37980:20:0;;;;;:58;;38001:10;;38013:5;;38020:6;;38028:3;;38033:4;;;;37980:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;37958:161;;;;-1:-1:-1;;;37958:161:0;;14935:2:1;37958:161:0;;;14917:21:1;14974:2;14954:18;;;14947:30;15013:34;14993:18;;;14986:62;-1:-1:-1;;;15064:18:1;;;15057:34;15108:19;;37958:161:0;14907:226:1;37958:161:0;38130:24;38187:63;38211:8;38230:4;38237:12;38246:3;38237:6;:12;:::i;:::-;38187:15;:63::i;:::-;38265:8;;;:42;;-1:-1:-1;;;;;;38277:30:0;;;38265:42;38261:244;;;38324:38;38338:8;38349:12;38358:3;38349:6;:12;:::i;:::-;38324:5;:38::i;:::-;38261:244;;;38395:32;38409:8;38420:6;38395:5;:32::i;:::-;38442:51;38460:8;38471:16;38489:3;38442:9;:51::i;:::-;-1:-1:-1;38522:4:0;;37575:959;-1:-1:-1;;;;;;;37575:959:0:o;37053:178::-;37128:7;-1:-1:-1;;;;;37155:22:0;;37172:4;37155:22;:68;;37222:1;37155:68;;;32346:12;;37180:39;;-1:-1:-1;;37180:39:0;:::i;40768:151::-;-1:-1:-1;;;;;40882:21:0;;40838:6;40882:21;;;:12;:21;;;;;:28;40864:47;;:17;:47::i;30044:103::-;29774:13;:11;:13::i;:::-;30109:30:::1;30136:1;30109:18;:30::i;49281:164::-:0;49358:46;49374:7;28397:10;49397:6;49358:15;:46::i;:::-;49415:22;49421:7;49430:6;49415:5;:22::i;39667:128::-;-1:-1:-1;;;;;39763:14:0;;39736:7;39763:14;;;:7;:14;;;;;23077;39763:24;22985:114;49823:61;29774:13;:11;:13::i;:::-;49868:8:::1;:6;:8::i;41559:259::-:0;41646:7;41688:12;41674:11;:26;41666:70;;;;-1:-1:-1;;;41666:70:0;;10415:2:1;41666:70:0;;;10397:21:1;10454:2;10434:18;;;10427:30;10493:33;10473:18;;;10466:61;10544:18;;41666:70:0;10387:181:1;41666:70:0;41754:56;41773:23;41798:11;41754:18;:56::i;32049:104::-;32105:13;32138:7;32131:14;;;;;:::i;49748:67::-;29774:13;:11;:13::i;:::-;49796:11:::1;:9;:11::i;46915:234::-:0;46987:7;47008:16;47026:13;47043:43;47052:10;47064:21;47043:8;:43::i;:::-;47007:79;;;;47106:11;:35;;32346:12;;47106:35;;;47120:5;47106:35;47099:42;46915:234;-1:-1:-1;;;;46915:234:0:o;41063:212::-;-1:-1:-1;;;;;41170:21:0;;41136:7;41170:21;;;:12;:21;;;;;:28;41216:8;;:51;;-1:-1:-1;;;;;41231:21:0;;;;;;:12;:21;;;;;41253:7;41259:1;41253:3;:7;:::i;:::-;41231:30;;;;;;-1:-1:-1;;;41231:30:0;;;;;;;;;;;;;;;;;;:36;;;;-1:-1:-1;;;;;41231:36:0;41216:51;;;41227:1;41216:51;-1:-1:-1;;;;;41209:58:0;;41063:212;-1:-1:-1;;;41063:212:0:o;33619:436::-;33712:4;28397:10;33712:4;33795:25;28397:10;33812:7;33795:9;:25::i;:::-;33768:52;;33859:15;33839:16;:35;;33831:85;;;;-1:-1:-1;;;33831:85:0;;20372:2:1;33831:85:0;;;20354:21:1;20411:2;20391:18;;;20384:30;20450:34;20430:18;;;20423:62;-1:-1:-1;;;20501:18:1;;;20494:35;20546:19;;33831:85:0;20344:227:1;33831:85:0;33952:60;33961:5;33968:7;33996:15;33977:16;:34;33952:8;:60::i;32505:193::-;32584:4;28397:10;32640:28;28397:10;32657:2;32661:6;32640:9;:28::i;42441:591::-;42668:6;42649:15;:25;;42641:67;;;;-1:-1:-1;;;42641:67:0;;11124:2:1;42641:67:0;;;11106:21:1;11163:2;11143:18;;;11136:30;11202:31;11182:18;;;11175:59;11251:18;;42641:67:0;11096:179:1;42641:67:0;42791:58;;;40364:71;42791:58;;;7402:25:1;-1:-1:-1;;;;;7463:32:1;;7443:18;;;7436:60;;;;7512:18;;;7505:34;;;7555:18;;;7548:34;;;42719:14:0;;42736:174;;42764:87;;7374:19:1;;42791:58:0;;;;;;;;;;;;42781:69;;;;;;42764:16;:87::i;:::-;42866:1;42882;42898;42736:13;:174::i;:::-;42719:191;;42938:17;42948:6;42938:9;:17::i;:::-;42929:5;:26;42921:64;;;;-1:-1:-1;;;42921:64:0;;12245:2:1;42921:64:0;;;12227:21:1;12284:2;12264:18;;;12257:30;12323:27;12303:18;;;12296:55;12368:18;;42921:64:0;12217:175:1;42921:64:0;42996:28;43006:6;43014:9;42996;:28::i;:::-;42441:591;;;;;;;:::o;39014:645::-;39258:8;39239:15;:27;;39231:69;;;;-1:-1:-1;;;39231:69:0;;13767:2:1;39231:69:0;;;13749:21:1;13806:2;13786:18;;;13779:30;13845:31;13825:18;;;13818:59;13894:18;;39231:69:0;13739:179:1;39231:69:0;39313:18;38792:95;39373:5;39380:7;39389:5;39396:16;39406:5;39396:9;:16::i;:::-;39344:79;;;;;;6862:25:1;;;;-1:-1:-1;;;;;6961:15:1;;;6941:18;;;6934:43;7013:15;;;;6993:18;;;6986:43;7045:18;;;7038:34;7088:19;;;7081:35;7132:19;;;7125:35;;;6834:19;;39344:79:0;;;;;;;;;;;;39334:90;;;;;;39313:111;;39437:12;39452:28;39469:10;39452:16;:28::i;:::-;39437:43;;39493:14;39510:28;39524:4;39530:1;39533;39536;39510:13;:28::i;:::-;39493:45;;39567:5;-1:-1:-1;;;;;39557:15:0;:6;-1:-1:-1;;;;;39557:15:0;;39549:58;;;;-1:-1:-1;;;39549:58:0;;16444:2:1;39549:58:0;;;16426:21:1;16483:2;16463:18;;;16456:30;16522:32;16502:18;;;16495:60;16572:18;;39549:58:0;16416:180:1;39549:58:0;39620:31;39629:5;39636:7;39645:5;39620:8;:31::i;:::-;39014:645;;;;;;;;;;:::o;37239:215::-;37326:7;-1:-1:-1;;;;;37354:22:0;;37371:4;37354:22;37346:62;;;;-1:-1:-1;;;37346:62:0;;15685:2:1;37346:62:0;;;15667:21:1;15724:2;15704:18;;;15697:30;15763:29;15743:18;;;15736:57;15810:18;;37346:62:0;15657:177:1;37346:62:0;-1:-1:-1;37445:1:0;37239:215;;;;:::o;32704:151::-;-1:-1:-1;;;;;32820:18:0;;;32793:7;32820:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;32704:151::o;40610:150::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;40726:21:0;;;;;;:12;:21;;;;;:26;;;;;;;;;;-1:-1:-1;;;40726:26:0;;;;;;;;;;;;;;;;;;40719:33;;;;;;;;;40726:26;;40719:33;;;;;;;;;-1:-1:-1;;;;;40719:33:0;;;;;;;;;40610:150;-1:-1:-1;;;40610:150:0:o;30153:201::-;29774:13;:11;:13::i;:::-;-1:-1:-1;;;;;30242:22:0;::::1;30234:73;;;::::0;-1:-1:-1;;;30234:73:0;;12599:2:1;30234:73:0::1;::::0;::::1;12581:21:1::0;12638:2;12618:18;;;12611:30;12677:34;12657:18;;;12650:62;-1:-1:-1;;;12728:18:1;;;12721:36;12774:19;;30234:73:0::1;12571:228:1::0;30234:73:0::1;30318:28;30337:8;30318:18;:28::i;43153:290::-:0;43238:28;43250:7;43259:6;43238:11;:28::i;:::-;32346:12;;-1:-1:-1;;;;;;43285:29:0;43277:90;;;;-1:-1:-1;;;43277:90:0;;16803:2:1;43277:90:0;;;16785:21:1;16842:2;16822:18;;;16815:30;16881:34;16861:18;;;16854:62;-1:-1:-1;;;16932:18:1;;;16925:46;16988:19;;43277:90:0;16775:238:1;43277:90:0;43380:55;43397:23;43422:4;43428:6;43380:16;:55::i;:::-;;;43153:290;;:::o;34742:399::-;-1:-1:-1;;;;;34826:21:0;;34818:65;;;;-1:-1:-1;;;34818:65:0;;20778:2:1;34818:65:0;;;20760:21:1;20817:2;20797:18;;;20790:30;20856:33;20836:18;;;20829:61;20907:18;;34818:65:0;20750:181:1;34818:65:0;34896:49;34925:1;34929:7;34938:6;34896:20;:49::i;:::-;34974:6;34958:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;34991:18:0;;:9;:18;;;;;;;;;;:28;;35013:6;;34991:9;:28;;35013:6;;34991:28;:::i;:::-;;;;-1:-1:-1;;35035:37:0;;6539:25:1;;;-1:-1:-1;;;;;35035:37:0;;;35052:1;;35035:37;;6527:2:1;6512:18;35035:37:0;;;;;;;35085:48;35113:1;35117:7;35126:6;35085:19;:48::i;45623:98::-;45681:7;45708:5;45712:1;45708;:5;:::i;1341:195::-;1398:7;-1:-1:-1;;;;;1426:26:0;;;1418:78;;;;-1:-1:-1;;;1418:78:0;;17581:2:1;1418:78:0;;;17563:21:1;17620:2;17600:18;;;17593:30;17659:34;17639:18;;;17632:62;-1:-1:-1;;;17710:18:1;;;17703:37;17757:19;;1418:78:0;17553:229:1;1418:78:0;-1:-1:-1;1522:5:0;1341:195::o;6125:190::-;6181:6;6217:16;6208:25;;;6200:76;;;;-1:-1:-1;;;6200:76:0;;19209:2:1;6200:76:0;;;19191:21:1;19248:2;19228:18;;;19221:30;19287:34;19267:18;;;19260:62;-1:-1:-1;;;19338:18:1;;;19331:36;19384:19;;6200:76:0;19181:228:1;47157:622:0;-1:-1:-1;;;;;47361:18:0;;47357:415;;47417:26;47440:2;47417:22;:26::i;:::-;47458:28;:26;:28::i;:::-;47157:622;;;:::o;47357:415::-;-1:-1:-1;;;;;47508:16:0;;47504:268;;47562:28;47585:4;47562:22;:28::i;47504:268::-;47691:28;47714:4;47691:22;:28::i;:::-;47734:26;47757:2;47734:22;:26::i;43653:262::-;-1:-1:-1;;;;;41028:19:0;;;41001:7;41028:19;;;:10;:19;;;;;;;;;;;;;;;43851:56;;41028:19;;;;;43900:6;43851:16;:56::i;45729:103::-;45792:7;45819:5;45823:1;45819;:5;:::i;22985:114::-;23077:14;;22985:114::o;35748:380::-;-1:-1:-1;;;;;35884:19:0;;35876:68;;;;-1:-1:-1;;;35876:68:0;;19616:2:1;35876:68:0;;;19598:21:1;19655:2;19635:18;;;19628:30;19694:34;19674:18;;;19667:62;-1:-1:-1;;;19745:18:1;;;19738:34;19789:19;;35876:68:0;19588:226:1;35876:68:0;-1:-1:-1;;;;;35963:21:0;;35955:68;;;;-1:-1:-1;;;35955:68:0;;13006:2:1;35955:68:0;;;12988:21:1;13045:2;13025:18;;;13018:30;13084:34;13064:18;;;13057:62;-1:-1:-1;;;13135:18:1;;;13128:32;13177:19;;35955:68:0;12978:224:1;35955:68:0;-1:-1:-1;;;;;36036:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;36088:32;;6539:25:1;;;36088:32:0;;6512:18:1;36088:32:0;;;;;;;35748:380;;;:::o;36136:453::-;36271:24;36298:25;36308:5;36315:7;36298:9;:25::i;:::-;36271:52;;-1:-1:-1;;36338:16:0;:37;36334:248;;36420:6;36400:16;:26;;36392:68;;;;-1:-1:-1;;;36392:68:0;;13409:2:1;36392:68:0;;;13391:21:1;13448:2;13428:18;;;13421:30;13487:31;13467:18;;;13460:59;13536:18;;36392:68:0;13381:179:1;36392:68:0;36504:51;36513:5;36520:7;36548:6;36529:16;:25;36504:8;:51::i;34063:671::-;-1:-1:-1;;;;;34194:18:0;;34186:68;;;;-1:-1:-1;;;34186:68:0;;18803:2:1;34186:68:0;;;18785:21:1;18842:2;18822:18;;;18815:30;18881:34;18861:18;;;18854:62;-1:-1:-1;;;18932:18:1;;;18925:35;18977:19;;34186:68:0;18775:227:1;34186:68:0;-1:-1:-1;;;;;34273:16:0;;34265:64;;;;-1:-1:-1;;;34265:64:0;;10011:2:1;34265:64:0;;;9993:21:1;10050:2;10030:18;;;10023:30;10089:34;10069:18;;;10062:62;-1:-1:-1;;;10140:18:1;;;10133:33;10183:19;;34265:64:0;9983:225:1;34265:64:0;34342:38;34363:4;34369:2;34373:6;34342:20;:38::i;:::-;-1:-1:-1;;;;;34415:15:0;;34393:19;34415:15;;;;;;;;;;;34449:21;;;;34441:72;;;;-1:-1:-1;;;34441:72:0;;14125:2:1;34441:72:0;;;14107:21:1;14164:2;14144:18;;;14137:30;14203:34;14183:18;;;14176:62;-1:-1:-1;;;14254:18:1;;;14247:36;14300:19;;34441:72:0;14097:228:1;34441:72:0;-1:-1:-1;;;;;34549:15:0;;;:9;:15;;;;;;;;;;;34567:20;;;34549:38;;34609:13;;;;;;;;:23;;34581:6;;34549:9;34609:23;;34581:6;;34609:23;:::i;:::-;;;;;;;;34665:2;-1:-1:-1;;;;;34650:26:0;34659:4;-1:-1:-1;;;;;34650:26:0;;34669:6;34650:26;;;;6539:25:1;;6527:2;6512:18;;6494:76;34650:26:0;;;;;;;;34689:37;34709:4;34715:2;34719:6;34689:19;:37::i;21727:314::-;21780:7;21812:4;-1:-1:-1;;;;;21821:12:0;21804:29;;:66;;;;;21854:16;21837:13;:33;21804:66;21800:234;;;-1:-1:-1;21894:24:0;;21727:314::o;21800:234::-;-1:-1:-1;22230:73:0;;;21980:10;22230:73;;;;7852:25:1;;;;21992:12:0;7893:18:1;;;7886:34;22006:15:0;7936:18:1;;;7929:34;22274:13:0;7979:18:1;;;7972:34;22297:4:0;8022:19:1;;;;8015:61;;;;22230:73:0;;;;;;;;;;7824:19:1;;;;22230:73:0;;;22220:84;;;;;;39803:115::o;41826:485::-;41962:12;;41925:7;;;42011:236;42024:4;42018:3;:10;42011:236;;;42045:11;42059:23;42072:3;42077:4;42059:12;:23::i;:::-;42045:37;;42124:11;42101:5;42107:3;42101:10;;;;;;-1:-1:-1;;;42101:10:0;;;;;;;;;;;;;;;;;;:20;;;:34;42097:139;;;42163:3;42156:10;;42097:139;;;42213:7;:3;42219:1;42213:7;:::i;:::-;42207:13;;42097:139;42011:236;;;;42266:9;;:37;;42282:5;42288:8;42295:1;42288:4;:8;:::i;:::-;42282:15;;;;;;-1:-1:-1;;;42282:15:0;;;;;;;;;;;;;;;;;;:21;;;;-1:-1:-1;;;;;42282:21:0;42266:37;;;42278:1;42266:37;-1:-1:-1;;;;;42259:44:0;;41826:485;-1:-1:-1;;;;;41826:485:0:o;29906:132::-;29886:6;;-1:-1:-1;;;;;29886:6:0;28397:10;29970:23;29962:68;;;;-1:-1:-1;;;29962:68:0;;17220:2:1;29962:68:0;;;17202:21:1;;;17239:18;;;17232:30;17298:34;17278:18;;;17271:62;17350:18;;29962:68:0;17192:182:1;29356:120:0;28870:16;:14;:16::i;:::-;29415:7:::1;:15:::0;;-1:-1:-1;;;;29415:15:0::1;::::0;;29446:22:::1;28397:10:::0;29455:12:::1;29446:22;::::0;-1:-1:-1;;;;;5415:32:1;;;5397:51;;5385:2;5370:18;29446:22:0::1;;;;;;;29356:120::o:0;50498:145::-;50612:23;50624:2;50628:6;50612:11;:23::i;50651:155::-;50770:28;50782:7;50791:6;50770:11;:28::i;47787:491::-;47876:4;47882:7;47923:1;47910:10;:14;47902:49;;;;-1:-1:-1;;;47902:49:0;;20021:2:1;47902:49:0;;;20003:21:1;20060:2;20040:18;;;20033:30;-1:-1:-1;;;20079:18:1;;;20072:52;20141:18;;47902:49:0;19993:172:1;47902:49:0;47984:23;:21;:23::i;:::-;47970:10;:37;;47962:79;;;;-1:-1:-1;;;47962:79:0;;9653:2:1;47962:79:0;;;9635:21:1;9692:2;9672:18;;;9665:30;9731:31;9711:18;;;9704:59;9780:18;;47962:79:0;9625:179:1;47962:79:0;48052:13;48068:40;:9;48097:10;48068:28;:40::i;:::-;48134:20;;48052:56;;-1:-1:-1;48125:29:0;;48121:150;;;48179:5;48186:1;48171:17;;;;;;;48121:150;48229:4;48235:9;:16;;48252:5;48235:23;;;;;;-1:-1:-1;;;48235:23:0;;;;;;;;;;;;;;;;;48221:38;;;;;47787:491;;;;;;:::o;43923:388::-;-1:-1:-1;;;;;41028:19:0;;;44008:23;41028:19;;;:10;:19;;;;;;;;;;32473:18;;;;;;;44123:21;;;;:33;;;-1:-1:-1;;;;;;44123:33:0;;;;;;;44174:54;;41028:19;;;;;32473:18;;44123:33;;41028:19;;;44174:54;;44008:23;44174:54;44241:62;44258:15;44275:9;44286:16;44241;:62::i;30362:191::-;30455:6;;;-1:-1:-1;;;;;30472:17:0;;;-1:-1:-1;;;;;;30472:17:0;;;;;;;30505:40;;30455:6;;;30472:17;30455:6;;30505:40;;30436:16;;30505:40;30362:191;;:::o;29232:118::-;28792:19;:17;:19::i;:::-;29292:7:::1;:14:::0;;-1:-1:-1;;;;29292:14:0::1;-1:-1:-1::0;;;29292:14:0::1;::::0;;29322:20:::1;29329:12;28397:10:::0;;28317:98;46275:223;46322:7;46342:30;:18;23196:19;;23214:1;23196:19;;;23107:127;46342:30;46385:17;46405:23;:21;:23::i;:::-;46385:43;;46444:19;46453:9;46444:19;;;;6539:25:1;;6527:2;6512:18;;6494:76;46444:19:0;;;;;;;;46481:9;46275:223;-1:-1:-1;46275:223:0:o;22318:167::-;22395:7;22422:55;22444:20;:18;:20::i;:::-;22466:10;20689:57;;-1:-1:-1;;;20689:57:0;;;5112:27:1;5155:11;;;5148:27;;;5191:12;;;5184:28;;;20652:7:0;;5228:12:1;;20689:57:0;;;;;;;;;;;;20679:68;;;;;;20672:75;;20559:196;;;;;19891:279;20019:7;20040:17;20059:18;20081:25;20092:4;20098:1;20101;20104;20081:10;:25::i;:::-;20039:67;;;;20117:18;20129:5;20117:11;:18::i;:::-;-1:-1:-1;20153:9:0;19891:279;-1:-1:-1;;;;;19891:279:0:o;39926:207::-;-1:-1:-1;;;;;40047:14:0;;39986:15;40047:14;;;:7;:14;;;;;23077;;23214:1;23196:19;;;;23077:14;40108:17;39926:207;;;;:::o;44970:645::-;45207:12;;45144:17;;;;45242:8;;:35;;45257:5;45263:7;45269:1;45263:3;:7;:::i;:::-;45257:14;;;;;;-1:-1:-1;;;45257:14:0;;;;;;;;;;;;;;;;;;:20;;;;-1:-1:-1;;;;;45257:20:0;45242:35;;;45253:1;45242:35;-1:-1:-1;;;;;45230:47:0;;;45300:20;45303:9;45314:5;45300:2;:20;;:::i;:::-;45288:32;;45343:1;45337:3;:7;:51;;;;-1:-1:-1;45376:12:0;45348:5;45354:7;45360:1;45354:3;:7;:::i;:::-;45348:14;;;;;;-1:-1:-1;;;45348:14:0;;;;;;;;;;;;;;;;;;:24;;;:40;45337:51;45333:275;;;45428:29;45447:9;45428:18;:29::i;:::-;45405:5;45411:7;45417:1;45411:3;:7;:::i;:::-;45405:14;;;;;;-1:-1:-1;;;45405:14:0;;;;;;;;;;;;;;;;:20;;;:52;;;;;-1:-1:-1;;;;;45405:52:0;;;;;-1:-1:-1;;;;;45405:52:0;;;;;;45333:275;;;45490:5;45501:94;;;;;;;;45524:31;45542:12;45524:17;:31::i;:::-;45501:94;;;;;;45564:29;45583:9;45564:18;:29::i;:::-;-1:-1:-1;;;;;45501:94:0;;;;;;45490:106;;;;;;;-1:-1:-1;45490:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45333:275;44970:645;;;;;;;:::o;50068:221::-;28792:19;:17;:19::i;:::-;50237:44:::1;50264:4;50270:2;50274:6;50237:26;:44::i;50297:193::-:0;50439:43;50465:4;50471:2;50475:6;50439:25;:43::i;48286:146::-;-1:-1:-1;;;;;48370:33:0;;;;;;:24;:33;;;;;;;;32473:18;;;;;;;;48354:70;;48370:33;48354:15;:70::i;48405:18::-;48354:15;:70::i;48440:118::-;48497:53;48513:21;48536:13;32346:12;;;32258:108;44319:643;44451:3;-1:-1:-1;;;;;44444:10:0;:3;-1:-1:-1;;;;;44444:10:0;;;:24;;;;;44467:1;44458:6;:10;44444:24;44440:515;;;-1:-1:-1;;;;;44489:17:0;;;44485:224;;-1:-1:-1;;;;;44585:17:0;;44528;44585;;;:12;:17;;;;;44528;;44568:54;;44604:9;44615:6;44568:16;:54::i;:::-;44527:95;;;;44667:3;-1:-1:-1;;;;;44646:47:0;;44672:9;44683;44646:47;;;;;;21643:25:1;;;21699:2;21684:18;;21677:34;21631:2;21616:18;;21598:119;44646:47:0;;;;;;;;44485:224;;;-1:-1:-1;;;;;44729:17:0;;;44725:219;;-1:-1:-1;;;;;44825:17:0;;44768;44825;;;:12;:17;;;;;44768;;44808:49;;44844:4;44850:6;44808:16;:49::i;:::-;44767:90;;;;44902:3;-1:-1:-1;;;;;44881:47:0;;44907:9;44918;44881:47;;;;;;21643:25:1;;;21699:2;21684:18;;21677:34;21631:2;21616:18;;21598:119;44881:47:0;;;;;;;;44725:219;;44319:643;;;:::o;23916:156::-;23978:7;24053:11;24063:1;24054:5;;;24053:11;:::i;:::-;24043:21;;24044:5;;;24043:21;:::i;29118:108::-;28983:7;;-1:-1:-1;;;28983:7:0;;;;29177:41;;;;-1:-1:-1;;;29177:41:0;;10775:2:1;29177:41:0;;;10757:21:1;10814:2;10794:18;;;10787:30;-1:-1:-1;;;10833:18:1;;;10826:50;10893:18;;29177:41:0;10747:170:1;43451:194:0;43536:28;43548:7;43557:6;43536:11;:28::i;:::-;43577:60;43594:23;43619:9;43630:6;43577:16;:60::i;46506:127::-;46570:7;46597:28;:18;23077:14;;22985:114;27644:610;27757:12;;27733:7;;27753:58;;-1:-1:-1;27798:1:0;27791:8;;27753:58;27864:12;;27823:11;;27889:222;27902:4;27896:3;:10;27889:222;;;27923:11;27937:23;27950:3;27955:4;27937:12;:23::i;:::-;27923:37;;27992:7;27979:5;27985:3;27979:10;;;;;;-1:-1:-1;;;27979:10:0;;;;;;;;;;;;;;;;;:20;27975:125;;;28027:3;28020:10;;27975:125;;;28077:7;:3;28083:1;28077:7;:::i;:::-;28071:13;;27975:125;27889:222;;;;28131:1;28125:3;:7;:36;;;;-1:-1:-1;28154:7:0;28136:5;28142:7;28148:1;28142:3;:7;:::i;:::-;28136:14;;;;;;-1:-1:-1;;;28136:14:0;;;;;;;;;;;;;;;;;:25;28125:36;28121:126;;;28185:7;28191:1;28185:3;:7;:::i;:::-;28178:14;;;;;;28121:126;-1:-1:-1;28232:3:0;-1:-1:-1;28225:10:0;;29004:108;28983:7;;-1:-1:-1;;;28983:7:0;;;;29074:9;29066:38;;;;-1:-1:-1;;;29066:38:0;;15340:2:1;29066:38:0;;;15322:21:1;15379:2;15359:18;;;15352:30;-1:-1:-1;;;15398:18:1;;;15391:46;15454:18;;29066:38:0;15312:166:1;19222:663:0;19353:7;;19405:66;19392:79;;19388:163;;;-1:-1:-1;19504:1:0;;-1:-1:-1;19508:30:0;19488:51;;19388:163;19565:1;:7;;19570:2;19565:7;;:18;;;;;19576:1;:7;;19581:2;19576:7;;19565:18;19561:102;;;-1:-1:-1;19616:1:0;;-1:-1:-1;19620:30:0;19600:51;;19561:102;19690:24;;;19673:14;19690:24;;;;;;;;;8314:25:1;;;8387:4;8375:17;;8355:18;;;8348:45;;;;8409:18;;;8402:34;;;8452:18;;;8445:34;;;19690:24:0;;8286:19:1;;19690:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19690:24:0;;-1:-1:-1;;19690:24:0;;;-1:-1:-1;;;;;;;19729:20:0;;19725:103;;19782:1;19786:29;19766:50;;;;;;;19725:103;19848:6;-1:-1:-1;19856:20:0;;-1:-1:-1;19222:663:0;;;;;;;;:::o;16892:620::-;16970:20;16961:5;:29;;;;;;-1:-1:-1;;;16961:29:0;;;;;;;;;;16957:548;;;16892:620;:::o;16957:548::-;17045:29;17036:5;:38;;;;;;-1:-1:-1;;;17036:38:0;;;;;;;;;;17032:473;;;17091:34;;-1:-1:-1;;;17091:34:0;;9300:2:1;17091:34:0;;;9282:21:1;9339:2;9319:18;;;9312:30;9378:26;9358:18;;;9351:54;9422:18;;17091:34:0;9272:174:1;17032:473:0;17156:35;17147:5;:44;;;;;;-1:-1:-1;;;17147:44:0;;;;;;;;;;17143:362;;;17208:41;;-1:-1:-1;;;17208:41:0;;11885:2:1;17208:41:0;;;11867:21:1;11924:2;11904:18;;;11897:30;11963:33;11943:18;;;11936:61;12014:18;;17208:41:0;11857:181:1;17143:362:0;17280:30;17271:5;:39;;;;;;-1:-1:-1;;;17271:39:0;;;;;;;;;;17267:238;;;17327:44;;-1:-1:-1;;;17327:44:0;;14532:2:1;17327:44:0;;;14514:21:1;14571:2;14551:18;;;14544:30;14610:34;14590:18;;;14583:62;-1:-1:-1;;;14661:18:1;;;14654:32;14703:19;;17327:44:0;14504:224:1;17267:238:0;17402:30;17393:5;:39;;;;;;-1:-1:-1;;;17393:39:0;;;;;;;;;;17389:116;;;17449:44;;-1:-1:-1;;;17449:44:0;;16041:2:1;17449:44:0;;;16023:21:1;16080:2;16060:18;;;16053:30;16119:34;16099:18;;;16092:62;-1:-1:-1;;;16170:18:1;;;16163:32;16212:19;;17449:44:0;16013:224:1;48566:310:0;48661:17;48681:23;:21;:23::i;:::-;48661:43;-1:-1:-1;48661:43:0;48719:30;48735:9;48719:15;:30::i;:::-;:42;48715:154;;;48778:29;;;;;;;;-1:-1:-1;48778:29:0;;;;;;;;;;;;;;48822:16;;;:35;;;;;;;;;;;;;;;48566:310::o;35149:591::-;-1:-1:-1;;;;;35233:21:0;;35225:67;;;;-1:-1:-1;;;35225:67:0;;18401:2:1;35225:67:0;;;18383:21:1;18440:2;18420:18;;;18413:30;18479:34;18459:18;;;18452:62;-1:-1:-1;;;18530:18:1;;;18523:31;18571:19;;35225:67:0;18373:223:1;35225:67:0;35305:49;35326:7;35343:1;35347:6;35305:20;:49::i;:::-;-1:-1:-1;;;;;35392:18:0;;35367:22;35392:18;;;;;;;;;;;35429:24;;;;35421:71;;;;-1:-1:-1;;;35421:71:0;;11482:2:1;35421:71:0;;;11464:21:1;11521:2;11501:18;;;11494:30;11560:34;11540:18;;;11533:62;-1:-1:-1;;;11611:18:1;;;11604:32;11653:19;;35421:71:0;11454:224:1;35421:71:0;-1:-1:-1;;;;;35528:18:0;;:9;:18;;;;;;;;;;35549:23;;;35528:44;;35594:12;:22;;35566:6;;35528:9;35594:22;;35566:6;;35594:22;:::i;:::-;;;;-1:-1:-1;;35634:37:0;;6539:25:1;;;35660:1:0;;-1:-1:-1;;;;;35634:37:0;;;;;6527:2:1;6512:18;35634:37:0;;;;;;;35684:48;35704:7;35721:1;35725:6;35684:19;:48::i;48884:212::-;48978:10;;48954:7;;48974:115;;-1:-1:-1;49017:1:0;;48884:212;-1:-1:-1;48884:212:0:o;48974:115::-;49062:10;;49058:3;;49062:14;;49075:1;;49062:14;:::i;:::-;49058:19;;;;;;-1:-1:-1;;;49058:19:0;;;;;;;;;;;;;;;;;49051:26;;48884:212;;;:::o;48974:115::-;48884:212;;;:::o;14:156:1:-;80:20;;140:4;129:16;;119:27;;109:2;;160:1;157;150:12;175:257;234:6;287:2;275:9;266:7;262:23;258:32;255:2;;;308:6;300;293:22;255:2;352:9;339:23;371:31;396:5;371:31;:::i;437:398::-;505:6;513;566:2;554:9;545:7;541:23;537:32;534:2;;;587:6;579;572:22;534:2;631:9;618:23;650:31;675:5;650:31;:::i;:::-;700:5;-1:-1:-1;757:2:1;742:18;;729:32;770:33;729:32;770:33;:::i;:::-;822:7;812:17;;;524:311;;;;;:::o;840:466::-;917:6;925;933;986:2;974:9;965:7;961:23;957:32;954:2;;;1007:6;999;992:22;954:2;1051:9;1038:23;1070:31;1095:5;1070:31;:::i;:::-;1120:5;-1:-1:-1;1177:2:1;1162:18;;1149:32;1190:33;1149:32;1190:33;:::i;:::-;944:362;;1242:7;;-1:-1:-1;;;1296:2:1;1281:18;;;;1268:32;;944:362::o;1311:744::-;1422:6;1430;1438;1446;1454;1462;1470;1523:3;1511:9;1502:7;1498:23;1494:33;1491:2;;;1545:6;1537;1530:22;1491:2;1589:9;1576:23;1608:31;1633:5;1608:31;:::i;:::-;1658:5;-1:-1:-1;1715:2:1;1700:18;;1687:32;1728:33;1687:32;1728:33;:::i;:::-;1780:7;-1:-1:-1;1834:2:1;1819:18;;1806:32;;-1:-1:-1;1885:2:1;1870:18;;1857:32;;-1:-1:-1;1908:37:1;1940:3;1925:19;;1908:37;:::i;:::-;1898:47;;1992:3;1981:9;1977:19;1964:33;1954:43;;2044:3;2033:9;2029:19;2016:33;2006:43;;1481:574;;;;;;;;;;:::o;2060:325::-;2128:6;2136;2189:2;2177:9;2168:7;2164:23;2160:32;2157:2;;;2210:6;2202;2195:22;2157:2;2254:9;2241:23;2273:31;2298:5;2273:31;:::i;:::-;2323:5;2375:2;2360:18;;;;2347:32;;-1:-1:-1;;;2147:238:1:o;2390:602::-;2492:6;2500;2508;2516;2524;2532;2585:3;2573:9;2564:7;2560:23;2556:33;2553:2;;;2607:6;2599;2592:22;2553:2;2651:9;2638:23;2670:31;2695:5;2670:31;:::i;:::-;2720:5;-1:-1:-1;2772:2:1;2757:18;;2744:32;;-1:-1:-1;2823:2:1;2808:18;;2795:32;;-1:-1:-1;2846:36:1;2878:2;2863:18;;2846:36;:::i;:::-;2836:46;;2929:3;2918:9;2914:19;2901:33;2891:43;;2981:3;2970:9;2966:19;2953:33;2943:43;;2543:449;;;;;;;;:::o;2997:439::-;3064:6;3072;3125:2;3113:9;3104:7;3100:23;3096:32;3093:2;;;3146:6;3138;3131:22;3093:2;3190:9;3177:23;3209:31;3234:5;3209:31;:::i;:::-;3259:5;-1:-1:-1;3316:2:1;3301:18;;3288:32;3364:10;3351:24;;3339:37;;3329:2;;3395:6;3387;3380:22;3441:194;3511:6;3564:2;3552:9;3543:7;3539:23;3535:32;3532:2;;;3585:6;3577;3570:22;3532:2;-1:-1:-1;3613:16:1;;3522:113;-1:-1:-1;3522:113:1:o;3640:1014::-;3765:6;3773;3781;3789;3797;3850:3;3838:9;3829:7;3825:23;3821:33;3818:2;;;3872:6;3864;3857:22;3818:2;3916:9;3903:23;3935:31;3960:5;3935:31;:::i;:::-;3985:5;-1:-1:-1;4042:2:1;4027:18;;4014:32;4055:33;4014:32;4055:33;:::i;:::-;4107:7;-1:-1:-1;4161:2:1;4146:18;;4133:32;;-1:-1:-1;4216:2:1;4201:18;;4188:32;4239:18;4269:14;;;4266:2;;;4301:6;4293;4286:22;4266:2;4344:6;4333:9;4329:22;4319:32;;4389:7;4382:4;4378:2;4374:13;4370:27;4360:2;;4416:6;4408;4401:22;4360:2;4461;4448:16;4487:2;4479:6;4476:14;4473:2;;;4508:6;4500;4493:22;4473:2;4558:7;4553:2;4544:6;4540:2;4536:15;4532:24;4529:37;4526:2;;;4584:6;4576;4569:22;4526:2;3808:846;;;;-1:-1:-1;3808:846:1;;-1:-1:-1;4620:2:1;4612:11;;4642:6;3808:846;-1:-1:-1;;;3808:846:1:o;4659:190::-;4718:6;4771:2;4759:9;4750:7;4746:23;4742:32;4739:2;;;4792:6;4784;4777:22;4739:2;-1:-1:-1;4820:23:1;;4729:120;-1:-1:-1;4729:120:1:o;5459:737::-;-1:-1:-1;;;;;5766:15:1;;;5748:34;;5818:15;;5813:2;5798:18;;5791:43;5865:2;5850:18;;5843:34;;;5908:2;5893:18;;5886:34;;;5728:3;5951;5936:19;;5929:32;;;5977:19;;5970:35;;;5691:4;5998:6;6048;6042:3;6027:19;;6014:49;6083:22;;;6107:3;6079:32;;;6072:46;;;;6179:2;6158:15;;;-1:-1:-1;;6154:29:1;6139:45;6135:55;;5700:496;-1:-1:-1;;;;;5700:496:1:o;8490:603::-;8602:4;8631:2;8660;8649:9;8642:21;8692:6;8686:13;8735:6;8730:2;8719:9;8715:18;8708:34;8760:4;8773:140;8787:6;8784:1;8781:13;8773:140;;;8882:14;;;8878:23;;8872:30;8848:17;;;8867:2;8844:26;8837:66;8802:10;;8773:140;;;8931:6;8928:1;8925:13;8922:2;;;9001:4;8996:2;8987:6;8976:9;8972:22;8968:31;8961:45;8922:2;-1:-1:-1;9077:2:1;9056:15;-1:-1:-1;;9052:29:1;9037:45;;;;9084:2;9033:54;;8611:482;-1:-1:-1;;;8611:482:1:o;22108:128::-;22148:3;22179:1;22175:6;22172:1;22169:13;22166:2;;;22185:18;;:::i;:::-;-1:-1:-1;22221:9:1;;22156:80::o;22241:217::-;22281:1;22307;22297:2;;-1:-1:-1;;;22332:31:1;;22386:4;22383:1;22376:15;22414:4;22339:1;22404:15;22297:2;-1:-1:-1;22443:9:1;;22287:171::o;22463:125::-;22503:4;22531:1;22528;22525:8;22522:2;;;22536:18;;:::i;:::-;-1:-1:-1;22573:9:1;;22512:76::o;22593:380::-;22672:1;22668:12;;;;22715;;;22736:2;;22790:4;22782:6;22778:17;22768:27;;22736:2;22843;22835:6;22832:14;22812:18;22809:38;22806:2;;;22889:10;22884:3;22880:20;22877:1;22870:31;22924:4;22921:1;22914:15;22952:4;22949:1;22942:15;22978:127;23039:10;23034:3;23030:20;23027:1;23020:31;23070:4;23067:1;23060:15;23094:4;23091:1;23084:15;23110:131;-1:-1:-1;;;;;23185:31:1;;23175:42;;23165:2;;23231:1;23228;23221:12

Swarm Source

ipfs://280683de1c568378c88cac5b63bb51f1a4f06141e0774b8ff918e4fbe8868ad5
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.