ETH Price: $2,614.93 (+0.82%)

Token

Sins (SIN)
 

Overview

Max Total Supply

9,999,999,999,999,999,999,999,999,999,976,698.865152508 SIN

Holders

76

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
*🛸️🛸️👽️👽️👽️.eth
Balance
12.381764313 SIN

Value
$0.00
0xb2e615512c5c74573916854e0e62920c918e3455
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SinsERC20Token

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-07
*/

// SPDX-License-Identifier: AGPL-3.0-or-later

// File: interfaces/ISinsAuthority.sol


pragma solidity >=0.7.5;

interface ISinsAuthority {
    /* ========== EVENTS ========== */
    
    event GovernorPushed(address indexed from, address indexed to, bool _effectiveImmediately);
    event GuardianPushed(address indexed from, address indexed to, bool _effectiveImmediately);    
    event PolicyPushed(address indexed from, address indexed to, bool _effectiveImmediately);    
    event VaultPushed(address indexed from, address indexed to, bool _effectiveImmediately);    

    event GovernorPulled(address indexed from, address indexed to);
    event GuardianPulled(address indexed from, address indexed to);
    event PolicyPulled(address indexed from, address indexed to);
    event VaultPulled(address indexed from, address indexed to);

    /* ========== VIEW ========== */
    
    function governor() external view returns (address);
    function guardian() external view returns (address);
    function policy() external view returns (address);
    function vault() external view returns (address);
}
// File: types/SinsAccessControlled.sol


pragma solidity >=0.7.5;


abstract contract SinsAccessControlled {

    /* ========== EVENTS ========== */

    event AuthorityUpdated(ISinsAuthority indexed authority);

    string UNAUTHORIZED = "UNAUTHORIZED"; // save gas

    /* ========== STATE VARIABLES ========== */

    ISinsAuthority public authority;


    /* ========== Constructor ========== */

    constructor(ISinsAuthority _authority) {
        authority = _authority;
        emit AuthorityUpdated(_authority);
    }
    

    /* ========== MODIFIERS ========== */
    
    modifier onlyGovernor() {
        require(msg.sender == authority.governor(), UNAUTHORIZED);
        _;
    }
    
    modifier onlyGuardian() {
        require(msg.sender == authority.guardian(), UNAUTHORIZED);
        _;
    }
    
    modifier onlyPolicy() {
        require(msg.sender == authority.policy(), UNAUTHORIZED);
        _;
    }

    modifier onlyVault() {
        require(msg.sender == authority.vault(), UNAUTHORIZED);
        _;
    }
    
    /* ========== GOV ONLY ========== */
    
    function setAuthority(ISinsAuthority _newAuthority) external onlyGovernor {
        authority = _newAuthority;
        emit AuthorityUpdated(_newAuthority);
    }
}


pragma solidity >=0.7.5;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {

        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        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 = chainID;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {

        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        if (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) {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        return keccak256(abi.encode(typeHash, nameHash, versionHash, chainID, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}
// File: interfaces/IERC20Permit.sol


pragma solidity >=0.7.5;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as th xe allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: interfaces/IERC20.sol


pragma solidity >=0.7.5;

interface IERC20 {
  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the amount of tokens owned by `account`.
   */
  function balanceOf(address account) external view returns (uint256);

  /**
   * @dev Moves `amount` tokens from the caller's account to `recipient`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Returns the remaining number of tokens that `spender` will be
   * allowed to spend on behalf of `owner` through {transferFrom}. This is
   * zero by default.
   *
   * This value changes when {approve} or {transferFrom} are called.
   */
  function allowance(address owner, address spender) external view returns (uint256);

  /**
   * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * IMPORTANT: Beware that changing an allowance with this method brings the risk
   * that someone may use both the old and the new allowance by unfortunate
   * transaction ordering. One possible solution to mitigate this race
   * condition is to first reduce the spender's allowance to 0 and set the
   * desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * Emits an {Approval} event.
   */
  function approve(address spender, uint256 amount) external returns (bool);

  /**
   * @dev Moves `amount` tokens from `sender` to `recipient` using the
   * allowance mechanism. `amount` is then deducted from the caller's
   * allowance.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */
  event Transfer(address indexed from, address indexed to, uint256 value);

  /**
   * @dev Emitted when the allowance of a `spender` for an `owner` is set by
   * a call to {approve}. `value` is the new allowance.
   */
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: interfaces/ISIN.sol


pragma solidity >=0.7.5;


interface ISIN is IERC20 {
  function mint(address account_, uint256 amount_) external;

  function burn(uint256 amount) external;

  function burnFrom(address account_, uint256 amount_) external;
}


pragma solidity >=0.7.5;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } 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");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            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;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    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;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: libraries/SafeMath.sol

pragma solidity >=0.7.5;


// TODO(zx): Replace all instances of SafeMath with OZ implementation
library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    // Only used in the  BondingCalculator.sol
    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add( div( a, 2), 1 );
            while (b < c) {
                c = b;
                b = div( add( div( a, b ), b), 2 );
            }
        } else if (a != 0) {
            c = 1;
        }
    }

}
// File: libraries/Counters.sol

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}


interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}


interface ITaxDistributor {
  function distribute(address urv2, address dai, address marketingWallet, uint256 daiForBuyback, address buybackWallet, uint256 liquidityTokens, uint256 daiForLiquidity, address liquidityTo) external;
}

pragma solidity >=0.7.5;


library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}
// File: types/ERC20.sol


pragma solidity >=0.7.5;


abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


abstract contract ERC20 is Context, IERC20{

    using SafeMath for uint256;

    // TODO comment actual hash value.
    bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" );
    
    mapping (address => uint256) internal _balances;

    mapping (address => mapping (address => uint256)) internal _allowances;

    uint256 internal _totalSupply;

    string internal _name;
    
    string internal _symbol;
    
    uint8 internal immutable _decimals;

    constructor (string memory name_, string memory symbol_, uint8 decimals_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(msg.sender, recipient, 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) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, 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 = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(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);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(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 _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { }
}

// File: types/ERC20Permit.sol


pragma solidity >=0.7.5;






/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

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

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @dev See {IERC20Permit-permit}.
     */
    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);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     *
     * _Available since v4.1._
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}

// File: SinsERC20.sol


pragma solidity >=0.7.5;



interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}




contract SinsERC20Token is ERC20Permit, ISIN, SinsAccessControlled {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    address public marketingWallet;
    address public buybackWallet;

    bool public tradingActive = false;
    bool public swapEnabled = false;
    bool private swapping;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyBurnFee;
    uint256 public buyBuybackFee;
    
    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellBurnFee;
    uint256 public sellBuybackFee;
    address public taxDistributor;
    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForBurn;
    uint256 public tokensForBuyback;

    bool public limitsInEffect = true;
    // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

     // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;
    uint256 public initialSupply;
    address public dai;
    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;


    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event marketingWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event buybackWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor(address _authority, address _marketingWallet, address _buybackWallet, address _dai) 
    ERC20("Sins", "SIN", 9) 
    ERC20Permit("Sins") 
    SinsAccessControlled(ISinsAuthority(_authority)) {

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Router = _uniswapV2Router;
        dai = _dai;
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _dai);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        initialSupply = 50000*1e9;
        maxTransactionAmount = initialSupply * 5 / 1000; // 0.5% maxTransactionAmountTxn
        maxWallet = initialSupply * 10 / 1000; // 1% maxWallet
        _mint(authority.governor(), initialSupply);
        
        uint256 _buyMarketingFee = 2;
        uint256 _buyLiquidityFee = 3;
        uint256 _buyBurnFee = 1;
        uint256 _buyBuybackFee = 0;

        uint256 _sellMarketingFee = 9;
        uint256 _sellLiquidityFee = 3;
        uint256 _sellBurnFee = 1;
        uint256 _sellBuybackFee = 2;
        
    
        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyBurnFee = _buyBurnFee;
        buyBuybackFee = _buyBuybackFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyBurnFee + buyBuybackFee;

        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellBurnFee = _sellBurnFee;
        sellBuybackFee = _sellBuybackFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellBurnFee + sellBuybackFee;
        
        marketingWallet = address(_marketingWallet);
        buybackWallet = address(_buybackWallet);

        // exclude from paying fees or having max transaction amount
        excludeFromFees(authority.governor(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
    }

    receive() external payable {

  	}

    // remove limits after token is stable
    function removeLimits() external onlyGovernor returns (bool){
        limitsInEffect = false;
        sellMarketingFee = 4;
        sellLiquidityFee = 3;
        sellBurnFee = 1;
        sellBuybackFee = 0;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellBurnFee + sellBuybackFee;
        return true;
    }


    function updateTaxDistributor(address _taxDistributor) external onlyGovernor {
        taxDistributor = _taxDistributor;
    }


    function updateMaxTxnAmount(uint256 newNum) external onlyGovernor {
        require(newNum >= (totalSupply() * 1 / 1000)/1e9, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * (10**9);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyGovernor {
        require(newNum >= (totalSupply() * 5 / 1000)/1e9, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newNum * (10**9);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyGovernor {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyGovernor returns (bool){
        transferDelayEnabled = false;
        return true;
    }



    // once enabled, can never be turned off
    function enableTrading() external onlyGovernor {
        tradingActive = true;
        swapEnabled = true;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyGovernor {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }


    function excludeFromFees(address account, bool excluded) public onlyGovernor {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyGovernor{
        swapEnabled = enabled;
    }

    function updateBuyFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _burnFee, uint256 _buybackFee) external onlyGovernor {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyBurnFee = _burnFee;
        buyBuybackFee = _buybackFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyBurnFee + buyBuybackFee;
        require(buyTotalFees <= 15, "Must keep fees at 15% or less");
    }
    
    function updateSellFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _burnFee, uint256 _buybackFee) external onlyGovernor {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellBurnFee = _burnFee;
        sellBuybackFee = _buybackFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellBurnFee + sellBuybackFee;
        require(sellTotalFees <= 15, "Must keep fees at 15% or less");
    }

    function updateMarketingWallet(address newMarketingWallet) external onlyGovernor {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function updateBuybackWallet(address newBuybackWallet) external onlyGovernor {
        emit buybackWalletUpdated(newBuybackWallet, buybackWallet);
        buybackWallet = newBuybackWallet;
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function mint(address account_, uint256 amount_) external override onlyVault {
        _mint(account_, amount_);
    }

    function burn(uint256 amount) external override {
        _burn(msg.sender, amount);
    }

    function burnFrom(address account_, uint256 amount_) external override {
        _burnFrom(account_, amount_);
    }

    function _burnFrom(address account_, uint256 amount_) internal {
        uint256 decreasedAllowance_ = allowance(account_, msg.sender).sub(amount_, "ERC20: burn amount exceeds allowance");

        _approve(account_, msg.sender, decreasedAllowance_);
        _burn(account_, amount_);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if(limitsInEffect){
            if (
                from != authority.governor() &&
                to != authority.governor() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ){
                if(!tradingActive){
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != authority.governor() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }


                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }

                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if(!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }
		
        if( 
            swapEnabled &&
            !swapping &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to] &&
            !automatedMarketMakerPairs[from]
        ) {
            swapping = true;
            
            swapBack();

            swapping = false;
        }
        

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        tokensForBurn = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForBurn = fees * sellBurnFee / sellTotalFees;
                tokensForBuyback += fees * sellBuybackFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount.mul(buyTotalFees).div(100);
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForBurn = fees * buyBurnFee / buyTotalFees;
                tokensForBuyback += fees * buyBuybackFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
            }
            
            if(fees-tokensForBurn > 0){    
                super._transfer(from, address(this), fees.sub(tokensForBurn));
            }
            if (tokensForBurn > 0){
                super._transfer(from, deadAddress, tokensForBurn);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }


    function swapTokensForDai(uint256 tokenAmount) public {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dai;

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            taxDistributor,
            block.timestamp
        );
        
    }

    function swapBack() public {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForBuyback;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}
        
        if(contractBalance > totalSupply() * 5 / 10000 * 20){
          contractBalance = totalSupply() * 5 / 10000 * 20;
        }
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForDai = contractBalance.sub(liquidityTokens);
        
        uint256 initialDaiBalance = IERC20(dai).balanceOf(taxDistributor);

        swapTokensForDai(amountToSwapForDai); 
        
        uint256 daiBalance = IERC20(dai).balanceOf(taxDistributor).sub(initialDaiBalance);
        

        uint256 daiForMarketing = daiBalance.mul(tokensForMarketing).div(totalTokensToSwap);
        uint256 daiForBuyback = daiBalance.mul(tokensForBuyback).div(totalTokensToSwap);
        
        uint256 daiForLiquidity = daiBalance - daiForMarketing - daiForBuyback;

        super._transfer(address(this), taxDistributor, liquidityTokens);

        ITaxDistributor(taxDistributor).distribute(address(uniswapV2Router), dai, marketingWallet, daiForBuyback, buybackWallet, liquidityTokens, daiForLiquidity, authority.governor());
        
        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForBuyback = 0;

    }


}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_authority","type":"address"},{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_buybackWallet","type":"address"},{"internalType":"address","name":"_dai","type":"address"}],"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":"contract ISinsAuthority","name":"authority","type":"address"}],"name":"AuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","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":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"buybackWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"authority","outputs":[{"internalType":"contract ISinsAuthority","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","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":[],"name":"buyBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBuybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","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":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","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":"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":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellBuybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ISinsAuthority","name":"_newAuthority","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"swapTokensForDai","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDistributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForBuyback","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_buybackFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBuybackWallet","type":"address"}],"name":"updateBuybackWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_buybackFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxDistributor","type":"address"}],"name":"updateTaxDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140526101a0604052600c6101608190526b15539055551213d49256915160a21b610180908152620000579160069190620008bd565b50600b805461ffff60a01b19169055601b805460ff199081166001908117909255601d805490911690911790553480156200009157600080fd5b506040516200524338038062005243833981016040819052620000b49162000980565b836040518060400160405280600481526020016353696e7360e01b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600481526020016353696e7360e01b8152506040518060400160405280600381526020016229a4a760e91b8152506009826003908051906020019062000140929190620008bd565b50815162000156906004906020850190620008bd565b5060ff166080908152845160209586012084519486019490942060e08590526101008190524660c0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818b01819052818301999099526060810194909452938301919091523060a080840191909152835180840382018152929091019283905281519190960120909452505061012052600780546001600160a01b0319166001600160a01b03851690811790915591507f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a25060088054737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03199182168117909255602380549091166001600160a01b0384161790556040805163c45a015560e01b81529051829163c45a0155916004808301926020929190829003018186803b158015620002aa57600080fd5b505afa158015620002bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e59190620009dd565b6040516364e329cb60e11b81523060048201526001600160a01b038481166024830152919091169063c9c6539690604401602060405180830381600087803b1580156200033157600080fd5b505af115801562000346573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200036c9190620009dd565b600980546001600160a01b0319166001600160a01b0392909216918217905562000398906001620005de565b652d79883d200060228190556103e890620003b590600562000a11565b620003c1919062000a33565b6020556022546103e890620003d890600a62000a11565b620003e4919062000a33565b6021556007546040805163030d028960e21b8152905162000473926001600160a01b031691630c340a24916004808301926020929190829003018186803b1580156200042f57600080fd5b505afa15801562000444573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200046a9190620009dd565b60225462000632565b6002600d8190556003600e8190556001600f8190556000601081905560098383868482620004a2858462000a56565b620004ae919062000a56565b620004ba919062000a56565b600c5560128490556013839055601482905560158190558082620004df858762000a56565b620004eb919062000a56565b620004f7919062000a56565b601155600a80546001600160a01b03808f166001600160a01b031992831617909255600b80548e841692169190911790556007546040805163030d028960e21b81529051620005af939290921691630c340a2491600480820192602092909190829003018186803b1580156200056c57600080fd5b505afa15801562000581573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005a79190620009dd565b600162000732565b620005bc30600162000732565b620005cb61dead600162000732565b5050505050505050505050505062000b5e565b6001600160a01b038216600081815260246020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0382166200068e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b620006aa816002546200085360201b6200277d1790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620006dd9183906200277d62000853821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156200078157600080fd5b505afa15801562000796573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007bc9190620009dd565b6001600160a01b0316336001600160a01b031614600690620007f35760405162461bcd60e51b815260040162000685919062000aae565b506001600160a01b0382166000818152601e6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b60008062000862838562000a56565b905083811015620008b65760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000685565b9392505050565b828054620008cb9062000a71565b90600052602060002090601f016020900481019282620008ef57600085556200093a565b82601f106200090a57805160ff19168380011785556200093a565b828001600101855582156200093a579182015b828111156200093a5782518255916020019190600101906200091d565b50620009489291506200094c565b5090565b5b808211156200094857600081556001016200094d565b80516001600160a01b03811681146200097b57600080fd5b919050565b600080600080608085870312156200099757600080fd5b620009a28562000963565b9350620009b26020860162000963565b9250620009c26040860162000963565b9150620009d26060860162000963565b905092959194509250565b600060208284031215620009f057600080fd5b620008b68262000963565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000a2e5762000a2e620009fb565b500290565b60008262000a5157634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000a6c5762000a6c620009fb565b500190565b600181811c9082168062000a8657607f821691505b6020821081141562000aa857634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845481600182811c91508083168062000ad157607f831692505b85831081141562000af057634e487b7160e01b85526022600452602485fd5b87860183815260200181801562000b10576001811462000b225762000b4f565b60ff1986168252878201965062000b4f565b60008b81526020902060005b8681101562000b495781548482015290850190890162000b2e565b83019750505b50949998505050505050505050565b60805160a05160c05160e05161010051610120516101405161468a62000bb960003960006124300152600061355b015260006135aa01526000613585015260006135060152600061352e015260006105d9015261468a6000f3fe6080604052600436106103fd5760003560e01c80637a9e5e4b1161020d578063bf7e214f11610128578063dd62ed3e116100bb578063e884f2601161008a578063f4b9fa751161006f578063f4b9fa7514610be7578063f637434214610c07578063f8b45b0514610c1d57600080fd5b8063e884f26014610bbc578063f11a24d314610bd157600080fd5b8063dd62ed3e14610b20578063deab8aea14610b66578063e71dc3f514610b86578063e7ad9fcd14610b9c57600080fd5b8063c8c8ebe4116100f7578063c8c8ebe414610abe578063d4090d2a14610ad4578063d505accf14610aea578063d85ba06314610b0a57600080fd5b8063bf7e214f14610a44578063c024666814610a64578063c18bc19514610a84578063c876d0b914610aa457600080fd5b8063a457c2d7116101a0578063adb873bd1161016f578063adb873bd146109ac578063b4a735b2146109c2578063b62496f5146109e2578063bbc0c74214610a1257600080fd5b8063a457c2d71461092c578063a5288dec1461094c578063a9059cbb1461096c578063aacebbe31461098c57600080fd5b806392136913116101dc57806392136913146108c1578063924de9b7146108d757806395d89b41146108f75780639a7a23d61461090c57600080fd5b80637a9e5e4b146108565780637bce5a04146108765780637ecebe001461088c5780638a8c523c146108ac57600080fd5b806339509351116103185780636ac5eeee116102ab578063743efe0d1161027a5780637571336a1161025f5780637571336a146107f657806375f0a8741461081657806379cc67901461083657600080fd5b8063743efe0d146107c1578063751039fc146107e157600080fd5b80636ac5eeee1461072d5780636ddd17131461074257806370a082311461077557806371a51522146107ab57600080fd5b80634a62bb65116102e75780634a62bb65146106ae5780634fbee193146106c8578063540ba552146107015780636a486a8e1461071757600080fd5b8063395093511461062e57806340c10f191461064e57806342966c681461066e57806349bd5a5e1461068e57600080fd5b80631f3fed8f116103905780632e6ed7ef1161035f5780632e6ed7ef146105a5578063313ce567146105c55780633644e51514610603578063378dc3dc1461061857600080fd5b80631f3fed8f14610539578063203e727e1461054f57806323b872dd1461056f57806327c8f8351461058f57600080fd5b80631694505e116103cc5780631694505e146104b657806318160ddd146104ee5780631a8145bb1461050d5780631d7778561461052357600080fd5b806304dacd501461040957806306fdde031461042b578063095ea7b31461045657806310d5de531461048657600080fd5b3661040457005b600080fd5b34801561041557600080fd5b50610429610424366004613feb565b610c33565b005b34801561043757600080fd5b50610440610d6c565b60405161044d9190614008565b60405180910390f35b34801561046257600080fd5b5061047661047136600461407b565b610dfe565b604051901515815260200161044d565b34801561049257600080fd5b506104766104a1366004613feb565b601f6020526000908152604090205460ff1681565b3480156104c257600080fd5b506008546104d6906001600160a01b031681565b6040516001600160a01b03909116815260200161044d565b3480156104fa57600080fd5b506002545b60405190815260200161044d565b34801561051957600080fd5b506104ff60185481565b34801561052f57600080fd5b506104ff60195481565b34801561054557600080fd5b506104ff60175481565b34801561055b57600080fd5b5061042961056a3660046140a7565b610e15565b34801561057b57600080fd5b5061047661058a3660046140c0565b610f89565b34801561059b57600080fd5b506104d661dead81565b3480156105b157600080fd5b506104296105c0366004614101565b610ff2565b3480156105d157600080fd5b5060405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161044d565b34801561060f57600080fd5b506104ff61113c565b34801561062457600080fd5b506104ff60225481565b34801561063a57600080fd5b5061047661064936600461407b565b61114b565b34801561065a57600080fd5b5061042961066936600461407b565b611181565b34801561067a57600080fd5b506104296106893660046140a7565b61124a565b34801561069a57600080fd5b506009546104d6906001600160a01b031681565b3480156106ba57600080fd5b50601b546104769060ff1681565b3480156106d457600080fd5b506104766106e3366004613feb565b6001600160a01b03166000908152601e602052604090205460ff1690565b34801561070d57600080fd5b506104ff60105481565b34801561072357600080fd5b506104ff60115481565b34801561073957600080fd5b50610429611257565b34801561074e57600080fd5b50600b54610476907501000000000000000000000000000000000000000000900460ff1681565b34801561078157600080fd5b506104ff610790366004613feb565b6001600160a01b031660009081526020819052604090205490565b3480156107b757600080fd5b506104ff60155481565b3480156107cd57600080fd5b506104296107dc366004613feb565b6116bc565b3480156107ed57600080fd5b506104766117b1565b34801561080257600080fd5b50610429610811366004614148565b6118e9565b34801561082257600080fd5b50600a546104d6906001600160a01b031681565b34801561084257600080fd5b5061042961085136600461407b565b6119ed565b34801561086257600080fd5b50610429610871366004613feb565b6119f7565b34801561088257600080fd5b506104ff600d5481565b34801561089857600080fd5b506104ff6108a7366004613feb565b611b14565b3480156108b857600080fd5b50610429611b32565b3480156108cd57600080fd5b506104ff60125481565b3480156108e357600080fd5b506104296108f236600461417d565b611c2f565b34801561090357600080fd5b50610440611d35565b34801561091857600080fd5b50610429610927366004614148565b611d44565b34801561093857600080fd5b5061047661094736600461407b565b611e8d565b34801561095857600080fd5b506104296109673660046140a7565b611edc565b34801561097857600080fd5b5061047661098736600461407b565b611ff4565b34801561099857600080fd5b506104296109a7366004613feb565b612001565b3480156109b857600080fd5b506104ff60145481565b3480156109ce57600080fd5b506016546104d6906001600160a01b031681565b3480156109ee57600080fd5b506104766109fd366004613feb565b60246020526000908152604090205460ff1681565b348015610a1e57600080fd5b50600b546104769074010000000000000000000000000000000000000000900460ff1681565b348015610a5057600080fd5b506007546104d6906001600160a01b031681565b348015610a7057600080fd5b50610429610a7f366004614148565b612131565b348015610a9057600080fd5b50610429610a9f3660046140a7565b612269565b348015610ab057600080fd5b50601d546104769060ff1681565b348015610aca57600080fd5b506104ff60205481565b348015610ae057600080fd5b506104ff601a5481565b348015610af657600080fd5b50610429610b05366004614198565b6123dc565b348015610b1657600080fd5b506104ff600c5481565b348015610b2c57600080fd5b506104ff610b3b36600461420f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b7257600080fd5b50600b546104d6906001600160a01b031681565b348015610b9257600080fd5b506104ff600f5481565b348015610ba857600080fd5b50610429610bb7366004614101565b612540565b348015610bc857600080fd5b50610476612684565b348015610bdd57600080fd5b506104ff600e5481565b348015610bf357600080fd5b506023546104d6906001600160a01b031681565b348015610c1357600080fd5b506104ff60135481565b348015610c2957600080fd5b506104ff60215481565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610c8157600080fd5b505afa158015610c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb99190614248565b6001600160a01b0316336001600160a01b031614600690610cf65760405162461bcd60e51b8152600401610ced91906142b3565b60405180910390fd5b50600b546040516001600160a01b03918216918316907f2a4d8391610d71471dbbe59ddff7a3d253d2ec399b14d78219a7c881351fd8bf90600090a3600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b606060038054610d7b90614265565b80601f0160208091040260200160405190810160405280929190818152602001828054610da790614265565b8015610df45780601f10610dc957610100808354040283529160200191610df4565b820191906000526020600020905b815481529060010190602001808311610dd757829003601f168201915b5050505050905090565b6000610e0b3384846127e3565b5060015b92915050565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610e6357600080fd5b505afa158015610e77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9b9190614248565b6001600160a01b0316336001600160a01b031614600690610ecf5760405162461bcd60e51b8152600401610ced91906142b3565b50633b9aca006103e8610ee160025490565b610eec9060016143c1565b610ef6919061442d565b610f00919061442d565b811015610f755760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201527f6c6f776572207468616e20302e312500000000000000000000000000000000006064820152608401610ced565b610f8381633b9aca006143c1565b60205550565b6000610f9684848461293c565b610fe88433610fe3856040518060600160405280602881526020016145e4602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906134c7565b6127e3565b5060019392505050565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561104057600080fd5b505afa158015611054573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110789190614248565b6001600160a01b0316336001600160a01b0316146006906110ac5760405162461bcd60e51b8152600401610ced91906142b3565b50600d849055600e839055600f829055601081905580826110cd8587614441565b6110d79190614441565b6110e19190614441565b600c819055600f10156111365760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610ced565b50505050565b6000611146613501565b905090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610e0b918590610fe3908661277d565b600760009054906101000a90046001600160a01b03166001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111cf57600080fd5b505afa1580156111e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112079190614248565b6001600160a01b0316336001600160a01b03161460069061123b5760405162461bcd60e51b8152600401610ced91906142b3565b5061124682826135f8565b5050565b61125433826136d7565b50565b3060009081526020819052604081205490506000601a5460175460185461127e9190614441565b6112889190614441565b9050811580611295575080155b1561129e575050565b6127106112aa60025490565b6112b59060056143c1565b6112bf919061442d565b6112ca9060146143c1565b821115611300576127106112dd60025490565b6112e89060056143c1565b6112f2919061442d565b6112fd9060146143c1565b91505b60006002826018548561131391906143c1565b61131d919061442d565b611327919061442d565b9050600061133584836137f7565b6023546016546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529293506000929116906370a082319060240160206040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614459565b90506113de82611edc565b6023546016546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526000926114859285929116906370a082319060240160206040518083038186803b15801561144757600080fd5b505afa15801561145b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147f9190614459565b906137f7565b905060006114a8866114a26017548561383990919063ffffffff16565b906138d4565b905060006114c5876114a2601a548661383990919063ffffffff16565b90506000816114d48486614472565b6114de9190614472565b6016549091506114f99030906001600160a01b031689613916565b601660009054906101000a90046001600160a01b03166001600160a01b031663b375fcdc600860009054906101000a90046001600160a01b0316602360009054906101000a90046001600160a01b0316600a60009054906101000a90046001600160a01b031686600b60009054906101000a90046001600160a01b03168d88600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fe9190614248565b60405160e08a901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039889166004820152968816602488015294871660448701526064860193909352908516608485015260a484015260c483015290911660e482015261010401600060405180830381600087803b15801561168a57600080fd5b505af115801561169e573d6000803e3d6000fd5b5050600060188190556017819055601a555050505050505050505050565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561170a57600080fd5b505afa15801561171e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117429190614248565b6001600160a01b0316336001600160a01b0316146006906117765760405162461bcd60e51b8152600401610ced91906142b3565b50601680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600754604080517f0c340a2400000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691630c340a24916004808301926020929190829003018186803b15801561180f57600080fd5b505afa158015611823573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118479190614248565b6001600160a01b0316336001600160a01b03161460069061187b5760405162461bcd60e51b8152600401610ced91906142b3565b50601b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600460128190556003601381905560016014819055600060158190559290916118cc91614441565b6118d69190614441565b6118e09190614441565b60115550600190565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561193757600080fd5b505afa15801561194b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196f9190614248565b6001600160a01b0316336001600160a01b0316146006906119a35760405162461bcd60e51b8152600401610ced91906142b3565b506001600160a01b03919091166000908152601f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6112468282613acb565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611a4557600080fd5b505afa158015611a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7d9190614248565b6001600160a01b0316336001600160a01b031614600690611ab15760405162461bcd60e51b8152600401610ced91906142b3565b50600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a250565b6001600160a01b038116600090815260056020526040812054610e0f565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611b8057600080fd5b505afa158015611b94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb89190614248565b6001600160a01b0316336001600160a01b031614600690611bec5760405162461bcd60e51b8152600401610ced91906142b3565b50600b80547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff167501010000000000000000000000000000000000000000179055565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611c7d57600080fd5b505afa158015611c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb59190614248565b6001600160a01b0316336001600160a01b031614600690611ce95760405162461bcd60e51b8152600401610ced91906142b3565b50600b80549115157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909216919091179055565b606060048054610d7b90614265565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611d9257600080fd5b505afa158015611da6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dca9190614248565b6001600160a01b0316336001600160a01b031614600690611dfe5760405162461bcd60e51b8152600401610ced91906142b3565b506009546001600160a01b0383811691161415611e835760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ced565b6112468282613b2c565b6000610e0b3384610fe385604051806060016040528060258152602001614630602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906134c7565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611f1157611f11614489565b6001600160a01b039283166020918202929092010152602354825191169082906001908110611f4257611f42614489565b6001600160a01b039283166020918202929092010152600854611f6891309116846127e3565b6008546016546040517f5c11d7950000000000000000000000000000000000000000000000000000000081526001600160a01b0392831692635c11d79592611fbe928792600092889291169042906004016144b8565b600060405180830381600087803b158015611fd857600080fd5b505af1158015611fec573d6000803e3d6000fd5b505050505050565b6000610e0b33848461293c565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561204f57600080fd5b505afa158015612063573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120879190614248565b6001600160a01b0316336001600160a01b0316146006906120bb5760405162461bcd60e51b8152600401610ced91906142b3565b50600a546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561217f57600080fd5b505afa158015612193573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b79190614248565b6001600160a01b0316336001600160a01b0316146006906121eb5760405162461bcd60e51b8152600401610ced91906142b3565b506001600160a01b0382166000818152601e602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156122b757600080fd5b505afa1580156122cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ef9190614248565b6001600160a01b0316336001600160a01b0316146006906123235760405162461bcd60e51b8152600401610ced91906142b3565b50633b9aca006103e861233560025490565b6123409060056143c1565b61234a919061442d565b612354919061442d565b8110156123c85760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060448201527f302e3525000000000000000000000000000000000000000000000000000000006064820152608401610ced565b6123d681633b9aca006143c1565b60215550565b8342111561242c5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610ced565b60007f000000000000000000000000000000000000000000000000000000000000000088888861245b8c613b9e565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006124b682613bc8565b905060006124c682878787613c31565b9050896001600160a01b0316816001600160a01b0316146125295760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610ced565b6125348a8a8a6127e3565b50505050505050505050565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561258e57600080fd5b505afa1580156125a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c69190614248565b6001600160a01b0316336001600160a01b0316146006906125fa5760405162461bcd60e51b8152600401610ced91906142b3565b506012849055601383905560148290556015819055808261261b8587614441565b6126259190614441565b61262f9190614441565b6011819055600f10156111365760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610ced565b600754604080517f0c340a2400000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691630c340a24916004808301926020929190829003018186803b1580156126e257600080fd5b505afa1580156126f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271a9190614248565b6001600160a01b0316336001600160a01b03161460069061274e5760405162461bcd60e51b8152600401610ced91906142b3565b5050601d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600190565b60008061278a8385614441565b9050838110156127dc5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ced565b9392505050565b6001600160a01b03831661285e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610ced565b6001600160a01b0382166128da5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610ced565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166129b85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610ced565b6001600160a01b038216612a345760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610ced565b80612a4a57612a4583836000613916565b505050565b601b5460ff16156130be57600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015612aa357600080fd5b505afa158015612ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612adb9190614248565b6001600160a01b0316836001600160a01b031614158015612b935750600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015612b4557600080fd5b505afa158015612b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7d9190614248565b6001600160a01b0316826001600160a01b031614155b8015612ba757506001600160a01b03821615155b8015612bbe57506001600160a01b03821661dead14155b8015612be75750600b54760100000000000000000000000000000000000000000000900460ff16155b156130be57600b5474010000000000000000000000000000000000000000900460ff16612c99576001600160a01b0383166000908152601e602052604090205460ff1680612c4d57506001600160a01b0382166000908152601e602052604090205460ff165b612c995760405162461bcd60e51b815260206004820152601660248201527f54726164696e67206973206e6f74206163746976652e000000000000000000006044820152606401610ced565b601d5460ff1615612e3557600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015612cf257600080fd5b505afa158015612d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2a9190614248565b6001600160a01b0316826001600160a01b031614158015612d5957506008546001600160a01b03838116911614155b8015612d7357506009546001600160a01b03838116911614155b15612e3557326000908152601c60205260409020544311612e225760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60648201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000608482015260a401610ced565b326000908152601c602052604090204390555b6001600160a01b03831660009081526024602052604090205460ff168015612e7657506001600160a01b0382166000908152601f602052604090205460ff16155b15612f6c57602054811115612ef35760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527f6d61785472616e73616374696f6e416d6f756e742e00000000000000000000006064820152608401610ced565b6021546001600160a01b038316600090815260208190526040902054612f199083614441565b1115612f675760405162461bcd60e51b815260206004820152601360248201527f4d61782077616c6c6574206578636565646564000000000000000000000000006044820152606401610ced565b6130be565b6001600160a01b03821660009081526024602052604090205460ff168015612fad57506001600160a01b0383166000908152601f602052604090205460ff16155b1561302a57602054811115612f675760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d61785472616e73616374696f6e416d6f756e742e000000000000000000006064820152608401610ced565b6001600160a01b0382166000908152601f602052604090205460ff166130be576021546001600160a01b0383166000908152602081905260409020546130709083614441565b11156130be5760405162461bcd60e51b815260206004820152601360248201527f4d61782077616c6c6574206578636565646564000000000000000000000000006044820152606401610ced565b600b547501000000000000000000000000000000000000000000900460ff1680156131065750600b54760100000000000000000000000000000000000000000000900460ff16155b801561312b57506001600160a01b0383166000908152601e602052604090205460ff16155b801561315057506001600160a01b0382166000908152601e602052604090205460ff16155b801561317557506001600160a01b03831660009081526024602052604090205460ff16155b156131ec57600b80547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff167601000000000000000000000000000000000000000000001790556131c3611257565b600b80547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1690555b600b546001600160a01b0384166000908152601e602052604090205460ff76010000000000000000000000000000000000000000000090920482161591168061324d57506001600160a01b0383166000908152601e602052604090205460ff165b15613256575060005b6000601981905581156134b5576001600160a01b03841660009081526024602052604090205460ff16801561328d57506000601154115b15613362576132ac60646114a26011548661383990919063ffffffff16565b9050601154601354826132bf91906143c1565b6132c9919061442d565b601860008282546132da9190614441565b90915550506011546014546132ef90836143c1565b6132f9919061442d565b60195560115460155461330c90836143c1565b613316919061442d565b601a60008282546133279190614441565b909155505060115460125461333c90836143c1565b613346919061442d565b601760008282546133579190614441565b9091555061345c9050565b6001600160a01b03851660009081526024602052604090205460ff16801561338c57506000600c54115b1561345c576133ab60646114a2600c548661383990919063ffffffff16565b9050600c54600e54826133be91906143c1565b6133c8919061442d565b601860008282546133d99190614441565b9091555050600c54600f546133ee90836143c1565b6133f8919061442d565b601955600c5460105461340b90836143c1565b613415919061442d565b601a60008282546134269190614441565b9091555050600c54600d5461343b90836143c1565b613445919061442d565b601760008282546134569190614441565b90915550505b60006019548261346c9190614472565b111561349157613491853061348c601954856137f790919063ffffffff16565b613916565b601954156134a8576134a88561dead601954613916565b6134b28184614472565b92505b6134c0858585613916565b5050505050565b600081848411156134eb5760405162461bcd60e51b8152600401610ced9190614008565b5060006134f88486614472565b95945050505050565b6000467f0000000000000000000000000000000000000000000000000000000000000000811415613553577f000000000000000000000000000000000000000000000000000000000000000091505090565b5050604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6001600160a01b03821661364e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ced565b60025461365b908261277d565b6002556001600160a01b038216600090815260208190526040902054613681908261277d565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166137535760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610ced565b6137908160405180606001604052806022815260200161459c602291396001600160a01b03851660009081526020819052604090205491906134c7565b6001600160a01b0383166000908152602081905260409020556002546137b690826137f7565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016136cb565b60006127dc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506134c7565b60008261384857506000610e0f565b600061385483856143c1565b905082613861858361442d565b146127dc5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610ced565b60006127dc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c59565b6001600160a01b0383166139925760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610ced565b6001600160a01b038216613a0e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610ced565b613a4b816040518060600160405280602681526020016145be602691396001600160a01b03861660009081526020819052604090205491906134c7565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613a7a908261277d565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161292f565b6000613b158260405180606001604052806024815260200161460c602491396001600160a01b038616600090815260016020908152604080832033845290915290205491906134c7565b9050613b228333836127e3565b612a4583836136d7565b6001600160a01b03821660008181526024602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0381166000908152600560205260409020805490613bc281613cbd565b50919050565b6000610e0f613bd5613501565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000613c4287878787613cda565b91509150613c4f81613de5565b5095945050505050565b60008183613c7a5760405162461bcd60e51b8152600401610ced9190614008565b506000613c87848661442d565b9050613c938486614529565b613c9d82866143c1565b613ca79190614441565b8514613cb557613cb561453d565b949350505050565b6001816000016000828254613cd29190614441565b909155505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613d115750600090506003613ddc565b8460ff16601b14158015613d2957508460ff16601c14155b15613d3a5750600090506004613ddc565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613d8e573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b038116613dd557600060019250925050613ddc565b9150600090505b94509492505050565b6000816004811115613df957613df961456c565b1415613e025750565b6001816004811115613e1657613e1661456c565b1415613e645760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610ced565b6002816004811115613e7857613e7861456c565b1415613ec65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610ced565b6003816004811115613eda57613eda61456c565b1415613f4e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610ced565b6004816004811115613f6257613f6261456c565b14156112545760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610ced565b6001600160a01b038116811461125457600080fd5b600060208284031215613ffd57600080fd5b81356127dc81613fd6565b600060208083528351808285015260005b8181101561403557858101830151858201604001528201614019565b81811115614047576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000806040838503121561408e57600080fd5b823561409981613fd6565b946020939093013593505050565b6000602082840312156140b957600080fd5b5035919050565b6000806000606084860312156140d557600080fd5b83356140e081613fd6565b925060208401356140f081613fd6565b929592945050506040919091013590565b6000806000806080858703121561411757600080fd5b5050823594602084013594506040840135936060013592509050565b8035801515811461414357600080fd5b919050565b6000806040838503121561415b57600080fd5b823561416681613fd6565b915061417460208401614133565b90509250929050565b60006020828403121561418f57600080fd5b6127dc82614133565b600080600080600080600060e0888a0312156141b357600080fd5b87356141be81613fd6565b965060208801356141ce81613fd6565b95506040880135945060608801359350608088013560ff811681146141f257600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561422257600080fd5b823561422d81613fd6565b9150602083013561423d81613fd6565b809150509250929050565b60006020828403121561425a57600080fd5b81516127dc81613fd6565b600181811c9082168061427957607f821691505b60208210811415613bc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060208083526000845481600182811c9150808316806142d557607f831692505b85831081141561430c577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015614329576001811461435857614383565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861682528782019650614383565b60008b81526020902060005b8681101561437d57815484820152908501908901614364565b83019750505b50949998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143f9576143f9614392565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261443c5761443c6143fe565b500490565b6000821982111561445457614454614392565b500190565b60006020828403121561446b57600080fd5b5051919050565b60008282101561448457614484614392565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156145085784516001600160a01b0316835293830193918301916001016144e3565b50506001600160a01b03969096166060850152505050608001529392505050565b600082614538576145386143fe565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206f80522ad2fd3dec4a158ce1e0450a0e4b040cb57a3c502cfd3b3cd004a8ef1564736f6c63430008090033000000000000000000000000c19b00fd1de55aa4153578cef6f15ed735a20fb9000000000000000000000000423bc5f1c8e038a2382933a0d3aa0923ddca12c200000000000000000000000073293d758a62fece5f976a7674d625b849e30a020000000000000000000000006b175474e89094c44da98b954eedeac495271d0f

Deployed Bytecode

0x6080604052600436106103fd5760003560e01c80637a9e5e4b1161020d578063bf7e214f11610128578063dd62ed3e116100bb578063e884f2601161008a578063f4b9fa751161006f578063f4b9fa7514610be7578063f637434214610c07578063f8b45b0514610c1d57600080fd5b8063e884f26014610bbc578063f11a24d314610bd157600080fd5b8063dd62ed3e14610b20578063deab8aea14610b66578063e71dc3f514610b86578063e7ad9fcd14610b9c57600080fd5b8063c8c8ebe4116100f7578063c8c8ebe414610abe578063d4090d2a14610ad4578063d505accf14610aea578063d85ba06314610b0a57600080fd5b8063bf7e214f14610a44578063c024666814610a64578063c18bc19514610a84578063c876d0b914610aa457600080fd5b8063a457c2d7116101a0578063adb873bd1161016f578063adb873bd146109ac578063b4a735b2146109c2578063b62496f5146109e2578063bbc0c74214610a1257600080fd5b8063a457c2d71461092c578063a5288dec1461094c578063a9059cbb1461096c578063aacebbe31461098c57600080fd5b806392136913116101dc57806392136913146108c1578063924de9b7146108d757806395d89b41146108f75780639a7a23d61461090c57600080fd5b80637a9e5e4b146108565780637bce5a04146108765780637ecebe001461088c5780638a8c523c146108ac57600080fd5b806339509351116103185780636ac5eeee116102ab578063743efe0d1161027a5780637571336a1161025f5780637571336a146107f657806375f0a8741461081657806379cc67901461083657600080fd5b8063743efe0d146107c1578063751039fc146107e157600080fd5b80636ac5eeee1461072d5780636ddd17131461074257806370a082311461077557806371a51522146107ab57600080fd5b80634a62bb65116102e75780634a62bb65146106ae5780634fbee193146106c8578063540ba552146107015780636a486a8e1461071757600080fd5b8063395093511461062e57806340c10f191461064e57806342966c681461066e57806349bd5a5e1461068e57600080fd5b80631f3fed8f116103905780632e6ed7ef1161035f5780632e6ed7ef146105a5578063313ce567146105c55780633644e51514610603578063378dc3dc1461061857600080fd5b80631f3fed8f14610539578063203e727e1461054f57806323b872dd1461056f57806327c8f8351461058f57600080fd5b80631694505e116103cc5780631694505e146104b657806318160ddd146104ee5780631a8145bb1461050d5780631d7778561461052357600080fd5b806304dacd501461040957806306fdde031461042b578063095ea7b31461045657806310d5de531461048657600080fd5b3661040457005b600080fd5b34801561041557600080fd5b50610429610424366004613feb565b610c33565b005b34801561043757600080fd5b50610440610d6c565b60405161044d9190614008565b60405180910390f35b34801561046257600080fd5b5061047661047136600461407b565b610dfe565b604051901515815260200161044d565b34801561049257600080fd5b506104766104a1366004613feb565b601f6020526000908152604090205460ff1681565b3480156104c257600080fd5b506008546104d6906001600160a01b031681565b6040516001600160a01b03909116815260200161044d565b3480156104fa57600080fd5b506002545b60405190815260200161044d565b34801561051957600080fd5b506104ff60185481565b34801561052f57600080fd5b506104ff60195481565b34801561054557600080fd5b506104ff60175481565b34801561055b57600080fd5b5061042961056a3660046140a7565b610e15565b34801561057b57600080fd5b5061047661058a3660046140c0565b610f89565b34801561059b57600080fd5b506104d661dead81565b3480156105b157600080fd5b506104296105c0366004614101565b610ff2565b3480156105d157600080fd5b5060405160ff7f000000000000000000000000000000000000000000000000000000000000000916815260200161044d565b34801561060f57600080fd5b506104ff61113c565b34801561062457600080fd5b506104ff60225481565b34801561063a57600080fd5b5061047661064936600461407b565b61114b565b34801561065a57600080fd5b5061042961066936600461407b565b611181565b34801561067a57600080fd5b506104296106893660046140a7565b61124a565b34801561069a57600080fd5b506009546104d6906001600160a01b031681565b3480156106ba57600080fd5b50601b546104769060ff1681565b3480156106d457600080fd5b506104766106e3366004613feb565b6001600160a01b03166000908152601e602052604090205460ff1690565b34801561070d57600080fd5b506104ff60105481565b34801561072357600080fd5b506104ff60115481565b34801561073957600080fd5b50610429611257565b34801561074e57600080fd5b50600b54610476907501000000000000000000000000000000000000000000900460ff1681565b34801561078157600080fd5b506104ff610790366004613feb565b6001600160a01b031660009081526020819052604090205490565b3480156107b757600080fd5b506104ff60155481565b3480156107cd57600080fd5b506104296107dc366004613feb565b6116bc565b3480156107ed57600080fd5b506104766117b1565b34801561080257600080fd5b50610429610811366004614148565b6118e9565b34801561082257600080fd5b50600a546104d6906001600160a01b031681565b34801561084257600080fd5b5061042961085136600461407b565b6119ed565b34801561086257600080fd5b50610429610871366004613feb565b6119f7565b34801561088257600080fd5b506104ff600d5481565b34801561089857600080fd5b506104ff6108a7366004613feb565b611b14565b3480156108b857600080fd5b50610429611b32565b3480156108cd57600080fd5b506104ff60125481565b3480156108e357600080fd5b506104296108f236600461417d565b611c2f565b34801561090357600080fd5b50610440611d35565b34801561091857600080fd5b50610429610927366004614148565b611d44565b34801561093857600080fd5b5061047661094736600461407b565b611e8d565b34801561095857600080fd5b506104296109673660046140a7565b611edc565b34801561097857600080fd5b5061047661098736600461407b565b611ff4565b34801561099857600080fd5b506104296109a7366004613feb565b612001565b3480156109b857600080fd5b506104ff60145481565b3480156109ce57600080fd5b506016546104d6906001600160a01b031681565b3480156109ee57600080fd5b506104766109fd366004613feb565b60246020526000908152604090205460ff1681565b348015610a1e57600080fd5b50600b546104769074010000000000000000000000000000000000000000900460ff1681565b348015610a5057600080fd5b506007546104d6906001600160a01b031681565b348015610a7057600080fd5b50610429610a7f366004614148565b612131565b348015610a9057600080fd5b50610429610a9f3660046140a7565b612269565b348015610ab057600080fd5b50601d546104769060ff1681565b348015610aca57600080fd5b506104ff60205481565b348015610ae057600080fd5b506104ff601a5481565b348015610af657600080fd5b50610429610b05366004614198565b6123dc565b348015610b1657600080fd5b506104ff600c5481565b348015610b2c57600080fd5b506104ff610b3b36600461420f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b7257600080fd5b50600b546104d6906001600160a01b031681565b348015610b9257600080fd5b506104ff600f5481565b348015610ba857600080fd5b50610429610bb7366004614101565b612540565b348015610bc857600080fd5b50610476612684565b348015610bdd57600080fd5b506104ff600e5481565b348015610bf357600080fd5b506023546104d6906001600160a01b031681565b348015610c1357600080fd5b506104ff60135481565b348015610c2957600080fd5b506104ff60215481565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610c8157600080fd5b505afa158015610c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb99190614248565b6001600160a01b0316336001600160a01b031614600690610cf65760405162461bcd60e51b8152600401610ced91906142b3565b60405180910390fd5b50600b546040516001600160a01b03918216918316907f2a4d8391610d71471dbbe59ddff7a3d253d2ec399b14d78219a7c881351fd8bf90600090a3600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b606060038054610d7b90614265565b80601f0160208091040260200160405190810160405280929190818152602001828054610da790614265565b8015610df45780601f10610dc957610100808354040283529160200191610df4565b820191906000526020600020905b815481529060010190602001808311610dd757829003601f168201915b5050505050905090565b6000610e0b3384846127e3565b5060015b92915050565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610e6357600080fd5b505afa158015610e77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9b9190614248565b6001600160a01b0316336001600160a01b031614600690610ecf5760405162461bcd60e51b8152600401610ced91906142b3565b50633b9aca006103e8610ee160025490565b610eec9060016143c1565b610ef6919061442d565b610f00919061442d565b811015610f755760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201527f6c6f776572207468616e20302e312500000000000000000000000000000000006064820152608401610ced565b610f8381633b9aca006143c1565b60205550565b6000610f9684848461293c565b610fe88433610fe3856040518060600160405280602881526020016145e4602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906134c7565b6127e3565b5060019392505050565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561104057600080fd5b505afa158015611054573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110789190614248565b6001600160a01b0316336001600160a01b0316146006906110ac5760405162461bcd60e51b8152600401610ced91906142b3565b50600d849055600e839055600f829055601081905580826110cd8587614441565b6110d79190614441565b6110e19190614441565b600c819055600f10156111365760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610ced565b50505050565b6000611146613501565b905090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610e0b918590610fe3908661277d565b600760009054906101000a90046001600160a01b03166001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111cf57600080fd5b505afa1580156111e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112079190614248565b6001600160a01b0316336001600160a01b03161460069061123b5760405162461bcd60e51b8152600401610ced91906142b3565b5061124682826135f8565b5050565b61125433826136d7565b50565b3060009081526020819052604081205490506000601a5460175460185461127e9190614441565b6112889190614441565b9050811580611295575080155b1561129e575050565b6127106112aa60025490565b6112b59060056143c1565b6112bf919061442d565b6112ca9060146143c1565b821115611300576127106112dd60025490565b6112e89060056143c1565b6112f2919061442d565b6112fd9060146143c1565b91505b60006002826018548561131391906143c1565b61131d919061442d565b611327919061442d565b9050600061133584836137f7565b6023546016546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529293506000929116906370a082319060240160206040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614459565b90506113de82611edc565b6023546016546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526000926114859285929116906370a082319060240160206040518083038186803b15801561144757600080fd5b505afa15801561145b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147f9190614459565b906137f7565b905060006114a8866114a26017548561383990919063ffffffff16565b906138d4565b905060006114c5876114a2601a548661383990919063ffffffff16565b90506000816114d48486614472565b6114de9190614472565b6016549091506114f99030906001600160a01b031689613916565b601660009054906101000a90046001600160a01b03166001600160a01b031663b375fcdc600860009054906101000a90046001600160a01b0316602360009054906101000a90046001600160a01b0316600a60009054906101000a90046001600160a01b031686600b60009054906101000a90046001600160a01b03168d88600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fe9190614248565b60405160e08a901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039889166004820152968816602488015294871660448701526064860193909352908516608485015260a484015260c483015290911660e482015261010401600060405180830381600087803b15801561168a57600080fd5b505af115801561169e573d6000803e3d6000fd5b5050600060188190556017819055601a555050505050505050505050565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561170a57600080fd5b505afa15801561171e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117429190614248565b6001600160a01b0316336001600160a01b0316146006906117765760405162461bcd60e51b8152600401610ced91906142b3565b50601680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600754604080517f0c340a2400000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691630c340a24916004808301926020929190829003018186803b15801561180f57600080fd5b505afa158015611823573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118479190614248565b6001600160a01b0316336001600160a01b03161460069061187b5760405162461bcd60e51b8152600401610ced91906142b3565b50601b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600460128190556003601381905560016014819055600060158190559290916118cc91614441565b6118d69190614441565b6118e09190614441565b60115550600190565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561193757600080fd5b505afa15801561194b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196f9190614248565b6001600160a01b0316336001600160a01b0316146006906119a35760405162461bcd60e51b8152600401610ced91906142b3565b506001600160a01b03919091166000908152601f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6112468282613acb565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611a4557600080fd5b505afa158015611a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7d9190614248565b6001600160a01b0316336001600160a01b031614600690611ab15760405162461bcd60e51b8152600401610ced91906142b3565b50600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a250565b6001600160a01b038116600090815260056020526040812054610e0f565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611b8057600080fd5b505afa158015611b94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb89190614248565b6001600160a01b0316336001600160a01b031614600690611bec5760405162461bcd60e51b8152600401610ced91906142b3565b50600b80547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff167501010000000000000000000000000000000000000000179055565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611c7d57600080fd5b505afa158015611c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb59190614248565b6001600160a01b0316336001600160a01b031614600690611ce95760405162461bcd60e51b8152600401610ced91906142b3565b50600b80549115157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909216919091179055565b606060048054610d7b90614265565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611d9257600080fd5b505afa158015611da6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dca9190614248565b6001600160a01b0316336001600160a01b031614600690611dfe5760405162461bcd60e51b8152600401610ced91906142b3565b506009546001600160a01b0383811691161415611e835760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ced565b6112468282613b2c565b6000610e0b3384610fe385604051806060016040528060258152602001614630602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906134c7565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611f1157611f11614489565b6001600160a01b039283166020918202929092010152602354825191169082906001908110611f4257611f42614489565b6001600160a01b039283166020918202929092010152600854611f6891309116846127e3565b6008546016546040517f5c11d7950000000000000000000000000000000000000000000000000000000081526001600160a01b0392831692635c11d79592611fbe928792600092889291169042906004016144b8565b600060405180830381600087803b158015611fd857600080fd5b505af1158015611fec573d6000803e3d6000fd5b505050505050565b6000610e0b33848461293c565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561204f57600080fd5b505afa158015612063573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120879190614248565b6001600160a01b0316336001600160a01b0316146006906120bb5760405162461bcd60e51b8152600401610ced91906142b3565b50600a546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561217f57600080fd5b505afa158015612193573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b79190614248565b6001600160a01b0316336001600160a01b0316146006906121eb5760405162461bcd60e51b8152600401610ced91906142b3565b506001600160a01b0382166000818152601e602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156122b757600080fd5b505afa1580156122cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ef9190614248565b6001600160a01b0316336001600160a01b0316146006906123235760405162461bcd60e51b8152600401610ced91906142b3565b50633b9aca006103e861233560025490565b6123409060056143c1565b61234a919061442d565b612354919061442d565b8110156123c85760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060448201527f302e3525000000000000000000000000000000000000000000000000000000006064820152608401610ced565b6123d681633b9aca006143c1565b60215550565b8342111561242c5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610ced565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861245b8c613b9e565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006124b682613bc8565b905060006124c682878787613c31565b9050896001600160a01b0316816001600160a01b0316146125295760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610ced565b6125348a8a8a6127e3565b50505050505050505050565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561258e57600080fd5b505afa1580156125a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c69190614248565b6001600160a01b0316336001600160a01b0316146006906125fa5760405162461bcd60e51b8152600401610ced91906142b3565b506012849055601383905560148290556015819055808261261b8587614441565b6126259190614441565b61262f9190614441565b6011819055600f10156111365760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610ced565b600754604080517f0c340a2400000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691630c340a24916004808301926020929190829003018186803b1580156126e257600080fd5b505afa1580156126f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271a9190614248565b6001600160a01b0316336001600160a01b03161460069061274e5760405162461bcd60e51b8152600401610ced91906142b3565b5050601d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600190565b60008061278a8385614441565b9050838110156127dc5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ced565b9392505050565b6001600160a01b03831661285e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610ced565b6001600160a01b0382166128da5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610ced565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166129b85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610ced565b6001600160a01b038216612a345760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610ced565b80612a4a57612a4583836000613916565b505050565b601b5460ff16156130be57600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015612aa357600080fd5b505afa158015612ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612adb9190614248565b6001600160a01b0316836001600160a01b031614158015612b935750600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015612b4557600080fd5b505afa158015612b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7d9190614248565b6001600160a01b0316826001600160a01b031614155b8015612ba757506001600160a01b03821615155b8015612bbe57506001600160a01b03821661dead14155b8015612be75750600b54760100000000000000000000000000000000000000000000900460ff16155b156130be57600b5474010000000000000000000000000000000000000000900460ff16612c99576001600160a01b0383166000908152601e602052604090205460ff1680612c4d57506001600160a01b0382166000908152601e602052604090205460ff165b612c995760405162461bcd60e51b815260206004820152601660248201527f54726164696e67206973206e6f74206163746976652e000000000000000000006044820152606401610ced565b601d5460ff1615612e3557600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015612cf257600080fd5b505afa158015612d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2a9190614248565b6001600160a01b0316826001600160a01b031614158015612d5957506008546001600160a01b03838116911614155b8015612d7357506009546001600160a01b03838116911614155b15612e3557326000908152601c60205260409020544311612e225760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60648201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000608482015260a401610ced565b326000908152601c602052604090204390555b6001600160a01b03831660009081526024602052604090205460ff168015612e7657506001600160a01b0382166000908152601f602052604090205460ff16155b15612f6c57602054811115612ef35760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527f6d61785472616e73616374696f6e416d6f756e742e00000000000000000000006064820152608401610ced565b6021546001600160a01b038316600090815260208190526040902054612f199083614441565b1115612f675760405162461bcd60e51b815260206004820152601360248201527f4d61782077616c6c6574206578636565646564000000000000000000000000006044820152606401610ced565b6130be565b6001600160a01b03821660009081526024602052604090205460ff168015612fad57506001600160a01b0383166000908152601f602052604090205460ff16155b1561302a57602054811115612f675760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d61785472616e73616374696f6e416d6f756e742e000000000000000000006064820152608401610ced565b6001600160a01b0382166000908152601f602052604090205460ff166130be576021546001600160a01b0383166000908152602081905260409020546130709083614441565b11156130be5760405162461bcd60e51b815260206004820152601360248201527f4d61782077616c6c6574206578636565646564000000000000000000000000006044820152606401610ced565b600b547501000000000000000000000000000000000000000000900460ff1680156131065750600b54760100000000000000000000000000000000000000000000900460ff16155b801561312b57506001600160a01b0383166000908152601e602052604090205460ff16155b801561315057506001600160a01b0382166000908152601e602052604090205460ff16155b801561317557506001600160a01b03831660009081526024602052604090205460ff16155b156131ec57600b80547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff167601000000000000000000000000000000000000000000001790556131c3611257565b600b80547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1690555b600b546001600160a01b0384166000908152601e602052604090205460ff76010000000000000000000000000000000000000000000090920482161591168061324d57506001600160a01b0383166000908152601e602052604090205460ff165b15613256575060005b6000601981905581156134b5576001600160a01b03841660009081526024602052604090205460ff16801561328d57506000601154115b15613362576132ac60646114a26011548661383990919063ffffffff16565b9050601154601354826132bf91906143c1565b6132c9919061442d565b601860008282546132da9190614441565b90915550506011546014546132ef90836143c1565b6132f9919061442d565b60195560115460155461330c90836143c1565b613316919061442d565b601a60008282546133279190614441565b909155505060115460125461333c90836143c1565b613346919061442d565b601760008282546133579190614441565b9091555061345c9050565b6001600160a01b03851660009081526024602052604090205460ff16801561338c57506000600c54115b1561345c576133ab60646114a2600c548661383990919063ffffffff16565b9050600c54600e54826133be91906143c1565b6133c8919061442d565b601860008282546133d99190614441565b9091555050600c54600f546133ee90836143c1565b6133f8919061442d565b601955600c5460105461340b90836143c1565b613415919061442d565b601a60008282546134269190614441565b9091555050600c54600d5461343b90836143c1565b613445919061442d565b601760008282546134569190614441565b90915550505b60006019548261346c9190614472565b111561349157613491853061348c601954856137f790919063ffffffff16565b613916565b601954156134a8576134a88561dead601954613916565b6134b28184614472565b92505b6134c0858585613916565b5050505050565b600081848411156134eb5760405162461bcd60e51b8152600401610ced9190614008565b5060006134f88486614472565b95945050505050565b6000467f0000000000000000000000000000000000000000000000000000000000000001811415613553577f2ad8d997eaa8a6aa8d5b579d1be1ccd4f0dabe89fd748674d86a217f1d73477d91505090565b5050604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527fa68c88e70df4ffe16954db43bf6c307f0c8088995d4bb24f45088da6afe37c26828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6001600160a01b03821661364e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ced565b60025461365b908261277d565b6002556001600160a01b038216600090815260208190526040902054613681908261277d565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166137535760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610ced565b6137908160405180606001604052806022815260200161459c602291396001600160a01b03851660009081526020819052604090205491906134c7565b6001600160a01b0383166000908152602081905260409020556002546137b690826137f7565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016136cb565b60006127dc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506134c7565b60008261384857506000610e0f565b600061385483856143c1565b905082613861858361442d565b146127dc5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610ced565b60006127dc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c59565b6001600160a01b0383166139925760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610ced565b6001600160a01b038216613a0e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610ced565b613a4b816040518060600160405280602681526020016145be602691396001600160a01b03861660009081526020819052604090205491906134c7565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613a7a908261277d565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161292f565b6000613b158260405180606001604052806024815260200161460c602491396001600160a01b038616600090815260016020908152604080832033845290915290205491906134c7565b9050613b228333836127e3565b612a4583836136d7565b6001600160a01b03821660008181526024602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0381166000908152600560205260409020805490613bc281613cbd565b50919050565b6000610e0f613bd5613501565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000613c4287878787613cda565b91509150613c4f81613de5565b5095945050505050565b60008183613c7a5760405162461bcd60e51b8152600401610ced9190614008565b506000613c87848661442d565b9050613c938486614529565b613c9d82866143c1565b613ca79190614441565b8514613cb557613cb561453d565b949350505050565b6001816000016000828254613cd29190614441565b909155505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613d115750600090506003613ddc565b8460ff16601b14158015613d2957508460ff16601c14155b15613d3a5750600090506004613ddc565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613d8e573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b038116613dd557600060019250925050613ddc565b9150600090505b94509492505050565b6000816004811115613df957613df961456c565b1415613e025750565b6001816004811115613e1657613e1661456c565b1415613e645760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610ced565b6002816004811115613e7857613e7861456c565b1415613ec65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610ced565b6003816004811115613eda57613eda61456c565b1415613f4e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610ced565b6004816004811115613f6257613f6261456c565b14156112545760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610ced565b6001600160a01b038116811461125457600080fd5b600060208284031215613ffd57600080fd5b81356127dc81613fd6565b600060208083528351808285015260005b8181101561403557858101830151858201604001528201614019565b81811115614047576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000806040838503121561408e57600080fd5b823561409981613fd6565b946020939093013593505050565b6000602082840312156140b957600080fd5b5035919050565b6000806000606084860312156140d557600080fd5b83356140e081613fd6565b925060208401356140f081613fd6565b929592945050506040919091013590565b6000806000806080858703121561411757600080fd5b5050823594602084013594506040840135936060013592509050565b8035801515811461414357600080fd5b919050565b6000806040838503121561415b57600080fd5b823561416681613fd6565b915061417460208401614133565b90509250929050565b60006020828403121561418f57600080fd5b6127dc82614133565b600080600080600080600060e0888a0312156141b357600080fd5b87356141be81613fd6565b965060208801356141ce81613fd6565b95506040880135945060608801359350608088013560ff811681146141f257600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561422257600080fd5b823561422d81613fd6565b9150602083013561423d81613fd6565b809150509250929050565b60006020828403121561425a57600080fd5b81516127dc81613fd6565b600181811c9082168061427957607f821691505b60208210811415613bc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060208083526000845481600182811c9150808316806142d557607f831692505b85831081141561430c577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015614329576001811461435857614383565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861682528782019650614383565b60008b81526020902060005b8681101561437d57815484820152908501908901614364565b83019750505b50949998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143f9576143f9614392565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261443c5761443c6143fe565b500490565b6000821982111561445457614454614392565b500190565b60006020828403121561446b57600080fd5b5051919050565b60008282101561448457614484614392565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156145085784516001600160a01b0316835293830193918301916001016144e3565b50506001600160a01b03969096166060850152505050608001529392505050565b600082614538576145386143fe565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206f80522ad2fd3dec4a158ce1e0450a0e4b040cb57a3c502cfd3b3cd004a8ef1564736f6c63430008090033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000c19b00fd1de55aa4153578cef6f15ed735a20fb9000000000000000000000000423bc5f1c8e038a2382933a0d3aa0923ddca12c200000000000000000000000073293d758a62fece5f976a7674d625b849e30a020000000000000000000000006b175474e89094c44da98b954eedeac495271d0f

-----Decoded View---------------
Arg [0] : _authority (address): 0xc19B00FD1DE55aa4153578cEF6F15Ed735a20fB9
Arg [1] : _marketingWallet (address): 0x423bc5f1c8E038a2382933A0d3Aa0923DdCA12c2
Arg [2] : _buybackWallet (address): 0x73293d758A62feCE5f976A7674D625b849E30a02
Arg [3] : _dai (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000c19b00fd1de55aa4153578cef6f15ed735a20fb9
Arg [1] : 000000000000000000000000423bc5f1c8e038a2382933a0d3aa0923ddca12c2
Arg [2] : 00000000000000000000000073293d758a62fece5f976a7674d625b849e30a02
Arg [3] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f


Deployed Bytecode Sourcemap

41611:15366:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49546:197;;;;;;;;;;-1:-1:-1;49546:197:0;;;;;:::i;:::-;;:::i;:::-;;32008:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32876:167;;;;;;;;;;-1:-1:-1;32876:167:0;;;;;:::i;:::-;;:::i;:::-;;;1726:14:1;;1719:22;1701:41;;1689:2;1674:18;32876:167:0;1561:187:1;42979:64:0;;;;;;;;;;-1:-1:-1;42979:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41720:41;;;;;;;;;;-1:-1:-1;41720:41:0;;;;-1:-1:-1;;;;;41720:41:0;;;;;;-1:-1:-1;;;;;1944:55:1;;;1926:74;;1914:2;1899:18;41720:41:0;1753:253:1;32293:100:0;;;;;;;;;;-1:-1:-1;32373:12:0;;32293:100;;;2157:25:1;;;2145:2;2130:18;32293:100:0;2011:177:1;42484:33:0;;;;;;;;;;;;;;;;42524:28;;;;;;;;;;;;;;;;42444:33;;;;;;;;;;;;;;;;46553:235;;;;;;;;;;-1:-1:-1;46553:235:0;;;;;:::i;:::-;;:::i;33051:317::-;;;;;;;;;;-1:-1:-1;33051:317:0;;;;;:::i;:::-;;:::i;41803:53::-;;;;;;;;;;;;41849:6;41803:53;;48394:451;;;;;;;;;;-1:-1:-1;48394:451:0;;;;;:::i;:::-;;:::i;32194:91::-;;;;;;;;;;-1:-1:-1;32194:91:0;;3632:4:1;32268:9:0;3620:17:1;3602:36;;3590:2;3575:18;32194:91:0;3460:184:1;37976:115:0;;;;;;;;;;;;;:::i;43123:28::-;;;;;;;;;;;;;;;;33376:214;;;;;;;;;;-1:-1:-1;33376:214:0;;;;;:::i;:::-;;:::i;49884:120::-;;;;;;;;;;-1:-1:-1;49884:120:0;;;;;:::i;:::-;;:::i;50012:92::-;;;;;;;;;;-1:-1:-1;50012:92:0;;;;;:::i;:::-;;:::i;41768:28::-;;;;;;;;;;-1:-1:-1;41768:28:0;;;;-1:-1:-1;;;;;41768:28:0;;;42599:33;;;;;;;;;;-1:-1:-1;42599:33:0;;;;;;;;49751:125;;;;;;;;;;-1:-1:-1;49751:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;49840:28:0;49816:4;49840:28;;;:19;:28;;;;;;;;;49751:125;42187:28;;;;;;;;;;;;;;;;42228;;;;;;;;;;;;;;;;55431:1539;;;;;;;;;;;;;:::i;41979:31::-;;;;;;;;;;-1:-1:-1;41979:31:0;;;;;;;;;;;32401:127;;;;;;;;;;-1:-1:-1;32401:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;32502:18:0;32475:7;32502:18;;;;;;;;;;;;32401:127;42372:29;;;;;;;;;;;;;;;;46415:128;;;;;;;;;;-1:-1:-1;46415:128:0;;;;;:::i;:::-;;:::i;46072:333::-;;;;;;;;;;;;;:::i;47020:147::-;;;;;;;;;;-1:-1:-1;47020:147:0;;;;;:::i;:::-;;:::i;41865:30::-;;;;;;;;;;-1:-1:-1;41865:30:0;;;;-1:-1:-1;;;;;41865:30:0;;;50112:118;;;;;;;;;;-1:-1:-1;50112:118:0;;;;;:::i;:::-;;:::i;2283:165::-;;;;;;;;;;-1:-1:-1;2283:165:0;;;;;:::i;:::-;;:::i;42081:30::-;;;;;;;;;;;;;;;;37718:128;;;;;;;;;;-1:-1:-1;37718:128:0;;;;;:::i;:::-;;:::i;47427:115::-;;;;;;;;;;;;;:::i;42263:31::-;;;;;;;;;;;;;;;;48284:102;;;;;;;;;;-1:-1:-1;48284:102:0;;;;;:::i;:::-;;:::i;32099:87::-;;;;;;;;;;;;;:::i;47550:247::-;;;;;;;;;;-1:-1:-1;47550:247:0;;;;;:::i;:::-;;:::i;33598:265::-;;;;;;;;;;-1:-1:-1;33598:265:0;;;;;:::i;:::-;;:::i;54838:585::-;;;;;;;;;;-1:-1:-1;54838:585:0;;;;;:::i;:::-;;:::i;32536:173::-;;;;;;;;;;-1:-1:-1;32536:173:0;;;;;:::i;:::-;;:::i;49327:211::-;;;;;;;;;;-1:-1:-1;49327:211:0;;;;;:::i;:::-;;:::i;42339:26::-;;;;;;;;;;;;;;;;42408:29;;;;;;;;;;-1:-1:-1;42408:29:0;;;;-1:-1:-1;;;;;42408:29:0;;;43332:58;;;;;;;;;;-1:-1:-1;43332:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41939:33;;;;;;;;;;-1:-1:-1;41939:33:0;;;;;;;;;;;1477:31;;;;;;;;;;-1:-1:-1;1477:31:0;;;;-1:-1:-1;;;;;1477:31:0;;;48003:185;;;;;;;;;;-1:-1:-1;48003:185:0;;;;;:::i;:::-;;:::i;46796:216::-;;;;;;;;;;-1:-1:-1;46796:216:0;;;;;:::i;:::-;;:::i;42817:39::-;;;;;;;;;;-1:-1:-1;42817:39:0;;;;;;;;43050:35;;;;;;;;;;;;;;;;42559:31;;;;;;;;;;;;;;;;37007:645;;;;;;;;;;-1:-1:-1;37007:645:0;;;;;:::i;:::-;;:::i;42047:27::-;;;;;;;;;;;;;;;;32717:151;;;;;;;;;;-1:-1:-1;32717:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;32833:18:0;;;32806:7;32833:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;32717:151;41902:28;;;;;;;;;;-1:-1:-1;41902:28:0;;;;-1:-1:-1;;;;;41902:28:0;;;42155:25;;;;;;;;;;;;;;;;48857:462;;;;;;;;;;-1:-1:-1;48857:462:0;;;;;:::i;:::-;;:::i;47232:137::-;;;;;;;;;;;;;:::i;42118:30::-;;;;;;;;;;;;;;;;43158:18;;;;;;;;;;-1:-1:-1;43158:18:0;;;;-1:-1:-1;;;;;43158:18:0;;;42301:31;;;;;;;;;;;;;;;;43092:24;;;;;;;;;;;;;;;;49546:197;1810:9;;;;;;;;;-1:-1:-1;;;;;1810:9:0;-1:-1:-1;;;;;1810:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;49678:13:0::1;::::0;49639:53:::1;::::0;-1:-1:-1;;;;;49678:13:0;;::::1;::::0;49639:53;::::1;::::0;::::1;::::0;49678:13:::1;::::0;49639:53:::1;49703:13;:32:::0;;;::::1;-1:-1:-1::0;;;;;49703:32:0;;;::::1;::::0;;;::::1;::::0;;49546:197::o;32008:83::-;32045:13;32078:5;32071:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32008:83;:::o;32876:167::-;32959:4;32976:37;32985:10;32997:7;33006:6;32976:8;:37::i;:::-;-1:-1:-1;33031:4:0;32876:167;;;;;:::o;46553:235::-;1810:9;;;;;;;;;-1:-1:-1;;;;;1810:9:0;-1:-1:-1;;;;;1810:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;;46675:3:::1;46669:4;46649:13;32373:12:::0;;;32293:100;46649:13:::1;:17;::::0;46665:1:::1;46649:17;:::i;:::-;:24;;;;:::i;:::-;46648:30;;;;:::i;:::-;46638:6;:40;;46630:100;;;::::0;-1:-1:-1;;;46630:100:0;;9321:2:1;46630:100:0::1;::::0;::::1;9303:21:1::0;9360:2;9340:18;;;9333:30;9399:34;9379:18;;;9372:62;9470:17;9450:18;;;9443:45;9505:19;;46630:100:0::1;9119:411:1::0;46630:100:0::1;46764:16;:6:::0;46774:5:::1;46764:16;:::i;:::-;46741:20;:39:::0;-1:-1:-1;46553:235:0:o;33051:317::-;33157:4;33174:36;33184:6;33192:9;33203:6;33174:9;:36::i;:::-;33221:117;33230:6;33238:10;33250:87;33286:6;33250:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33250:19:0;;;;;;:11;:19;;;;;;;;33270:10;33250:31;;;;;;;;;:87;:35;:87::i;:::-;33221:8;:117::i;:::-;-1:-1:-1;33356:4:0;33051:317;;;;;:::o;48394:451::-;1810:9;;;;;;;;;-1:-1:-1;;;;;1810:9:0;-1:-1:-1;;;;;1810:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;-1:-1:-1;48535:15:0::1;:31:::0;;;48577:15:::1;:31:::0;;;48619:10:::1;:21:::0;;;48651:13:::1;:27:::0;;;48667:11;48632:8;48704:33:::1;48595:13:::0;48553;48704:33:::1;:::i;:::-;:46;;;;:::i;:::-;:62;;;;:::i;:::-;48689:12;:77:::0;;;48801:2:::1;-1:-1:-1::0;48785:18:0::1;48777:60;;;::::0;-1:-1:-1;;;48777:60:0;;9870:2:1;48777:60:0::1;::::0;::::1;9852:21:1::0;9909:2;9889:18;;;9882:30;9948:31;9928:18;;;9921:59;9997:18;;48777:60:0::1;9668:353:1::0;48777:60:0::1;48394:451:::0;;;;:::o;37976:115::-;38036:7;38063:20;:18;:20::i;:::-;38056:27;;37976:115;:::o;33376:214::-;33490:10;33464:4;33511:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;33511:32:0;;;;;;;;;;33464:4;;33481:79;;33502:7;;33511:48;;33548:10;33511:36;:48::i;49884:120::-;2171:9;;;;;;;;;-1:-1:-1;;;;;2171:9:0;-1:-1:-1;;;;;2171:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2157:31:0;:10;-1:-1:-1;;;;;2157:31:0;;2190:12;2149:54;;;;;-1:-1:-1;;;2149:54:0;;;;;;;;:::i;:::-;;49972:24:::1;49978:8;49988:7;49972:5;:24::i;:::-;49884:120:::0;;:::o;50012:92::-;50071:25;50077:10;50089:6;50071:5;:25::i;:::-;50012:92;:::o;55431:1539::-;55513:4;55469:23;32502:18;;;;;;;;;;;55469:50;;55530:25;55600:16;;55579:18;;55558;;:39;;;;:::i;:::-;:58;;;;:::i;:::-;55530:86;-1:-1:-1;55640:20:0;;;:46;;-1:-1:-1;55664:22:0;;55640:46;55637:60;;;55689:7;;55431:1539::o;55637:60::-;55758:5;55738:13;32373:12;;;32293:100;55738:13;:17;;55754:1;55738:17;:::i;:::-;:25;;;;:::i;:::-;:30;;55766:2;55738:30;:::i;:::-;55720:15;:48;55717:125;;;55820:5;55800:13;32373:12;;;32293:100;55800:13;:17;;55816:1;55800:17;:::i;:::-;:25;;;;:::i;:::-;:30;;55828:2;55800:30;:::i;:::-;55782:48;;55717:125;55901:23;55986:1;55966:17;55945:18;;55927:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;55901:86;-1:-1:-1;55998:26:0;56027:36;:15;55901:86;56027:19;:36::i;:::-;56119:3;;56134:14;;56112:37;;;;;-1:-1:-1;;;;;56134:14:0;;;56112:37;;;1926:74:1;55998:65:0;;-1:-1:-1;56084:25:0;;56119:3;;;56112:21;;1899:18:1;;56112:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56084:65;;56162:36;56179:18;56162:16;:36::i;:::-;56248:3;;56263:14;;56241:37;;;;;-1:-1:-1;;;;;56263:14:0;;;56241:37;;;1926:74:1;56220:18:0;;56241:60;;56283:17;;56248:3;;;56241:21;;1899:18:1;;56241:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;:60::i;:::-;56220:81;;56324:23;56350:57;56389:17;56350:34;56365:18;;56350:10;:14;;:34;;;;:::i;:::-;:38;;:57::i;:::-;56324:83;;56418:21;56442:55;56479:17;56442:32;56457:16;;56442:10;:14;;:32;;;;:::i;:55::-;56418:79;-1:-1:-1;56518:23:0;56418:79;56544:28;56557:15;56544:10;:28;:::i;:::-;:44;;;;:::i;:::-;56632:14;;56518:70;;-1:-1:-1;56601:63:0;;56625:4;;-1:-1:-1;;;;;56632:14:0;56648:15;56601;:63::i;:::-;56693:14;;;;;;;;;-1:-1:-1;;;;;56693:14:0;-1:-1:-1;;;;;56677:42:0;;56728:15;;;;;;;;;-1:-1:-1;;;;;56728:15:0;56746:3;;;;;;;;;-1:-1:-1;;;;;56746:3:0;56751:15;;;;;;;;;-1:-1:-1;;;;;56751:15:0;56768:13;56783;;;;;;;;;-1:-1:-1;;;;;56783:13:0;56798:15;56815;56832:9;;;;;;;;;-1:-1:-1;;;;;56832:9:0;-1:-1:-1;;;;;56832:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56677:176;;;;;;;;;;-1:-1:-1;;;;;10767:15:1;;;56677:176:0;;;10749:34:1;10819:15;;;10799:18;;;10792:43;10871:15;;;10851:18;;;10844:43;10903:18;;;10896:34;;;;10967:15;;;10946:19;;;10939:44;10999:19;;;10992:35;11043:19;;;11036:35;11108:15;;;11087:19;;;11080:44;10660:19;;56677:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56895:1:0;56874:18;:22;;;56907:18;:22;;;56940:16;:20;-1:-1:-1;;;;;;;;;;;55431:1539:0:o;46415:128::-;1810:9;;;;;;;;;-1:-1:-1;;;;;1810:9:0;-1:-1:-1;;;;;1810:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;-1:-1:-1;46503:14:0::1;:32:::0;;;::::1;-1:-1:-1::0;;;;;46503:32:0;;;::::1;::::0;;;::::1;::::0;;46415:128::o;46072:333::-;1810:9;;:20;;;;;;;;46127:4;;-1:-1:-1;;;;;1810:9:0;;:18;;:20;;;;;;;;;;;;;;:9;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;-1:-1:-1;46143:14:0::1;:22:::0;;;::::1;::::0;;46195:1:::1;46176:16;:20:::0;;;46226:1:::1;46207:16;:20:::0;;;46143:22;46238:11:::1;:15:::0;;;46160:5:::1;46264:14;:18:::0;;;46160:5;46143:22;;46309:35:::1;::::0;::::1;:::i;:::-;:49;;;;:::i;:::-;:66;;;;:::i;:::-;46293:13;:82:::0;-1:-1:-1;46393:4:0::1;46072:333:::0;:::o;47020:147::-;1810:9;;;;;;;;;-1:-1:-1;;;;;1810:9:0;-1:-1:-1;;;;;1810:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;47113:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;47020:147::o;50112:118::-;50194:28;50204:8;50214:7;50194:9;:28::i;2283:165::-;1810:9;;;;;;;;;-1:-1:-1;;;;;1810:9:0;-1:-1:-1;;;;;1810:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;-1:-1:-1;2368:9:0::1;:25:::0;;;::::1;-1:-1:-1::0;;;;;2368:25:0;::::1;::::0;;::::1;::::0;;;2409:31:::1;::::0;::::1;::::0;-1:-1:-1;;2409:31:0::1;2283:165:::0;:::o;37718:128::-;-1:-1:-1;;;;;37814:14:0;;37787:7;37814:14;;;:7;:14;;;;;30548;37814:24;30456:114;47427:115;1810:9;;;;;;;;;-1:-1:-1;;;;;1810:9:0;-1:-1:-1;;;;;1810:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;-1:-1:-1;47485:13:0::1;:20:::0;;47516:18;;;;;;47427:115::o;48284:102::-;1810:9;;;;;;;;;-1:-1:-1;;;;;1810:9:0;-1:-1:-1;;;;;1810:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;-1:-1:-1;48357:11:0::1;:21:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;48284:102::o;32099:87::-;32138:13;32171:7;32164:14;;;;;:::i;47550:247::-;1810:9;;;;;;;;;-1:-1:-1;;;;;1810:9:0;-1:-1:-1;;;;;1810:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;-1:-1:-1;47660:13:0::1;::::0;-1:-1:-1;;;;;47652:21:0;;::::1;47660:13:::0;::::1;47652:21;;47644:91;;;::::0;-1:-1:-1;;;47644:91:0;;11337:2:1;47644:91:0::1;::::0;::::1;11319:21:1::0;11376:2;11356:18;;;11349:30;11415:34;11395:18;;;11388:62;11486:27;11466:18;;;11459:55;11531:19;;47644:91:0::1;11135:421:1::0;47644:91:0::1;47748:41;47777:4;47783:5;47748:28;:41::i;33598:265::-:0;33691:4;33708:125;33717:10;33729:7;33738:94;33775:15;33738:94;;;;;;;;;;;;;;;;;33750:10;33738:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;33738:32:0;;;;;;;;;;;:94;:36;:94::i;54838:585::-;54989:16;;;55003:1;54989:16;;;;;;;;54965:21;;54989:16;;;;;;;;;;-1:-1:-1;54989:16:0;54965:40;;55034:4;55016;55021:1;55016:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55016:23:0;;;:7;;;;;;;;;:23;55060:3;;55050:7;;55060:3;;;55050:4;;55060:3;;55050:7;;;;;;:::i;:::-;-1:-1:-1;;;;;55050:13:0;;;:7;;;;;;;;;:13;55108:15;;55076:62;;55093:4;;55108:15;55126:11;55076:8;:62::i;:::-;55177:15;;55350:14;;55177:228;;;;;-1:-1:-1;;;;;55177:15:0;;;;:69;;:228;;55261:11;;55177:15;;55331:4;;55350:14;;;55379:15;;55177:228;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54892:531;54838:585;:::o;32536:173::-;32622:4;32639:40;32649:10;32661:9;32672:6;32639:9;:40::i;49327:211::-;1810:9;;;;;;;;;-1:-1:-1;;;;;1810:9:0;-1:-1:-1;;;;;1810:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;-1:-1:-1;49467:15:0::1;::::0;49424:59:::1;::::0;-1:-1:-1;;;;;49467:15:0;;::::1;::::0;49424:59;::::1;::::0;::::1;::::0;49467:15:::1;::::0;49424:59:::1;49494:15;:36:::0;;;::::1;-1:-1:-1::0;;;;;49494:36:0;;;::::1;::::0;;;::::1;::::0;;49327:211::o;48003:185::-;1810:9;;;;;;;;;-1:-1:-1;;;;;1810:9:0;-1:-1:-1;;;;;1810:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;48091:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;48146:34;;1701:41:1;;;48146:34:0::1;::::0;1674:18:1;48146:34:0::1;;;;;;;48003:185:::0;;:::o;46796:216::-;1810:9;;;;;;;;;-1:-1:-1;;;;;1810:9:0;-1:-1:-1;;;;;1810:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;;46921:3:::1;46915:4;46895:13;32373:12:::0;;;32293:100;46895:13:::1;:17;::::0;46911:1:::1;46895:17;:::i;:::-;:24;;;;:::i;:::-;46894:30;;;;:::i;:::-;46884:6;:40;;46876:89;;;::::0;-1:-1:-1;;;46876:89:0;;13172:2:1;46876:89:0::1;::::0;::::1;13154:21:1::0;13211:2;13191:18;;;13184:30;13250:34;13230:18;;;13223:62;13321:6;13301:18;;;13294:34;13345:19;;46876:89:0::1;12970:400:1::0;46876:89:0::1;46988:16;:6:::0;46998:5:::1;46988:16;:::i;:::-;46976:9;:28:::0;-1:-1:-1;46796:216:0:o;37007:645::-;37251:8;37232:15;:27;;37224:69;;;;-1:-1:-1;;;37224:69:0;;13577:2:1;37224:69:0;;;13559:21:1;13616:2;13596:18;;;13589:30;13655:31;13635:18;;;13628:59;13704:18;;37224:69:0;13375:353:1;37224:69:0;37306:18;37348:16;37366:5;37373:7;37382:5;37389:16;37399:5;37389:9;:16::i;:::-;37337:79;;;;;;14020:25:1;;;;-1:-1:-1;;;;;14142:15:1;;;14122:18;;;14115:43;14194:15;;;;14174:18;;;14167:43;14226:18;;;14219:34;14269:19;;;14262:35;14313:19;;;14306:35;;;13992:19;;37337:79:0;;;;;;;;;;;;37327:90;;;;;;37306:111;;37430:12;37445:28;37462:10;37445:16;:28::i;:::-;37430:43;;37486:14;37503:28;37517:4;37523:1;37526;37529;37503:13;:28::i;:::-;37486:45;;37560:5;-1:-1:-1;;;;;37550:15:0;:6;-1:-1:-1;;;;;37550:15:0;;37542:58;;;;-1:-1:-1;;;37542:58:0;;14554:2:1;37542:58:0;;;14536:21:1;14593:2;14573:18;;;14566:30;14632:32;14612:18;;;14605:60;14682:18;;37542:58:0;14352:354:1;37542:58:0;37613:31;37622:5;37629:7;37638:5;37613:8;:31::i;:::-;37213:439;;;37007:645;;;;;;;:::o;48857:462::-;1810:9;;;;;;;;;-1:-1:-1;;;;;1810:9:0;-1:-1:-1;;;;;1810:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;-1:-1:-1;48999:16:0::1;:32:::0;;;49042:16:::1;:32:::0;;;49085:11:::1;:22:::0;;;49118:14:::1;:28:::0;;;49135:11;49099:8;49173:35:::1;49061:13:::0;49018;49173:35:::1;:::i;:::-;:49;;;;:::i;:::-;:66;;;;:::i;:::-;49157:13;:82:::0;;;49275:2:::1;-1:-1:-1::0;49258:19:0::1;49250:61;;;::::0;-1:-1:-1;;;49250:61:0;;9870:2:1;49250:61:0::1;::::0;::::1;9852:21:1::0;9909:2;9889:18;;;9882:30;9948:31;9928:18;;;9921:59;9997:18;;49250:61:0::1;9668:353:1::0;47232:137:0;1810:9;;:20;;;;;;;;47295:4;;-1:-1:-1;;;;;1810:9:0;;:18;;:20;;;;;;;;;;;;;;:9;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1796:34:0;:10;-1:-1:-1;;;;;1796:34:0;;1832:12;1788:57;;;;;-1:-1:-1;;;1788:57:0;;;;;;;;:::i;:::-;-1:-1:-1;;47311:20:0::1;:28:::0;;;::::1;::::0;;;47232:137;:::o;21284:181::-;21342:7;;21374:5;21378:1;21374;:5;:::i;:::-;21362:17;;21403:1;21398;:6;;21390:46;;;;-1:-1:-1;;;21390:46:0;;14913:2:1;21390:46:0;;;14895:21:1;14952:2;14932:18;;;14925:30;14991:29;14971:18;;;14964:57;15038:18;;21390:46:0;14711:351:1;21390:46:0;21456:1;21284:181;-1:-1:-1;;;21284:181:0:o;35226:346::-;-1:-1:-1;;;;;35328:19:0;;35320:68;;;;-1:-1:-1;;;35320:68:0;;15269:2:1;35320:68:0;;;15251:21:1;15308:2;15288:18;;;15281:30;15347:34;15327:18;;;15320:62;15418:6;15398:18;;;15391:34;15442:19;;35320:68:0;15067:400:1;35320:68:0;-1:-1:-1;;;;;35407:21:0;;35399:68;;;;-1:-1:-1;;;35399:68:0;;15674:2:1;35399:68:0;;;15656:21:1;15713:2;15693:18;;;15686:30;15752:34;15732:18;;;15725:62;15823:4;15803:18;;;15796:32;15845:19;;35399:68:0;15472:398:1;35399:68:0;-1:-1:-1;;;;;35480:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;35532:32;;2157:25:1;;;35532:32:0;;2130:18:1;35532:32:0;;;;;;;;35226:346;;;:::o;50541:4287::-;-1:-1:-1;;;;;50673:18:0;;50665:68;;;;-1:-1:-1;;;50665:68:0;;16077:2:1;50665:68:0;;;16059:21:1;16116:2;16096:18;;;16089:30;16155:34;16135:18;;;16128:62;16226:7;16206:18;;;16199:35;16251:19;;50665:68:0;15875:401:1;50665:68:0;-1:-1:-1;;;;;50752:16:0;;50744:64;;;;-1:-1:-1;;;50744:64:0;;16483:2:1;50744:64:0;;;16465:21:1;16522:2;16502:18;;;16495:30;16561:34;16541:18;;;16534:62;16632:5;16612:18;;;16605:33;16655:19;;50744:64:0;16281:399:1;50744:64:0;50833:11;50830:92;;50861:28;50877:4;50883:2;50887:1;50861:15;:28::i;:::-;50541:4287;;;:::o;50830:92::-;50937:14;;;;50934:1849;;;50997:9;;;;;;;;;-1:-1:-1;;;;;50997:9:0;-1:-1:-1;;;;;50997:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50989:28:0;:4;-1:-1:-1;;;;;50989:28:0;;;:75;;;;;51044:9;;;;;;;;;-1:-1:-1;;;;;51044:9:0;-1:-1:-1;;;;;51044:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51038:26:0;:2;-1:-1:-1;;;;;51038:26:0;;;50989:75;:112;;;;-1:-1:-1;;;;;;51085:16:0;;;;50989:112;:154;;;;-1:-1:-1;;;;;;51122:21:0;;51136:6;51122:21;;50989:154;:184;;;;-1:-1:-1;51165:8:0;;;;;;;51164:9;50989:184;50967:1805;;;51211:13;;;;;;;51207:148;;-1:-1:-1;;;;;51256:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;51285:23:0;;;;;;:19;:23;;;;;;;;51256:52;51248:87;;;;-1:-1:-1;;;51248:87:0;;16887:2:1;51248:87:0;;;16869:21:1;16926:2;16906:18;;;16899:30;16965:24;16945:18;;;16938:52;17007:18;;51248:87:0;16685:346:1;51248:87:0;51513:20;;;;51509:436;;;51567:9;;;;;;;;;-1:-1:-1;;;;;51567:9:0;-1:-1:-1;;;;;51567:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51561:26:0;:2;-1:-1:-1;;;;;51561:26:0;;;:60;;;;-1:-1:-1;51605:15:0;;-1:-1:-1;;;;;51591:30:0;;;51605:15;;51591:30;;51561:60;:92;;;;-1:-1:-1;51639:13:0;;-1:-1:-1;;;;;51625:28:0;;;51639:13;;51625:28;;51561:92;51557:369;;;51718:9;51689:39;;;;:28;:39;;;;;;51731:12;-1:-1:-1;51681:140:0;;;;-1:-1:-1;;;51681:140:0;;17238:2:1;51681:140:0;;;17220:21:1;17277:2;17257:18;;;17250:30;17316:34;17296:18;;;17289:62;17387:34;17367:18;;;17360:62;17459:11;17438:19;;;17431:40;17488:19;;51681:140:0;17036:477:1;51681:140:0;51877:9;51848:39;;;;:28;:39;;;;;51890:12;51848:54;;51557:369;-1:-1:-1;;;;;51999:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;52035:35:0;;;;;;:31;:35;;;;;;;;52034:36;51999:71;51995:762;;;52117:20;;52107:6;:30;;52099:96;;;;-1:-1:-1;;;52099:96:0;;17720:2:1;52099:96:0;;;17702:21:1;17759:2;17739:18;;;17732:30;17798:34;17778:18;;;17771:62;17869:23;17849:18;;;17842:51;17910:19;;52099:96:0;17518:417:1;52099:96:0;52256:9;;-1:-1:-1;;;;;32502:18:0;;32475:7;32502:18;;;;;;;;;;;52230:22;;:6;:22;:::i;:::-;:35;;52222:67;;;;-1:-1:-1;;;52222:67:0;;18142:2:1;52222:67:0;;;18124:21:1;18181:2;18161:18;;;18154:30;18220:21;18200:18;;;18193:49;18259:18;;52222:67:0;17940:343:1;52222:67:0;51995:762;;;-1:-1:-1;;;;;52367:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;52401:37:0;;;;;;:31;:37;;;;;;;;52400:38;52367:71;52363:394;;;52485:20;;52475:6;:30;;52467:97;;;;-1:-1:-1;;;52467:97:0;;18490:2:1;52467:97:0;;;18472:21:1;18529:2;18509:18;;;18502:30;18568:34;18548:18;;;18541:62;18639:24;18619:18;;;18612:52;18681:19;;52467:97:0;18288:418:1;52363:394:0;-1:-1:-1;;;;;52611:35:0;;;;;;:31;:35;;;;;;;;52607:150;;52704:9;;-1:-1:-1;;;;;32502:18:0;;32475:7;32502:18;;;;;;;;;;;52678:22;;:6;:22;:::i;:::-;:35;;52670:67;;;;-1:-1:-1;;;52670:67:0;;18142:2:1;52670:67:0;;;18124:21:1;18181:2;18161:18;;;18154:30;18220:21;18200:18;;;18193:49;18259:18;;52670:67:0;17940:343:1;52670:67:0;52815:11;;;;;;;:37;;;;-1:-1:-1;52844:8:0;;;;;;;52843:9;52815:37;:80;;;;-1:-1:-1;;;;;;52870:25:0;;;;;;:19;:25;;;;;;;;52869:26;52815:80;:121;;;;-1:-1:-1;;;;;;52913:23:0;;;;;;:19;:23;;;;;;;;52912:24;52815:121;:170;;;;-1:-1:-1;;;;;;52954:31:0;;;;;;:25;:31;;;;;;;;52953:32;52815:170;52797:314;;;53012:8;:15;;;;;;;;53056:10;:8;:10::i;:::-;53083:8;:16;;;;;;52797:314;53149:8;;-1:-1:-1;;;;;53258:25:0;;53133:12;53258:25;;;:19;:25;;;;;;53149:8;;;;;;;53148:9;;53258:25;;:52;;-1:-1:-1;;;;;;53287:23:0;;;;;;:19;:23;;;;;;;;53258:52;53255:99;;;-1:-1:-1;53337:5:0;53255:99;53374:12;53401:13;:17;;;53503:1272;;;;-1:-1:-1;;;;;53557:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;53606:1;53590:13;;:17;53557:50;53553:900;;;53634:34;53664:3;53634:25;53645:13;;53634:6;:10;;:25;;;;:::i;:34::-;53627:41;;53735:13;;53716:16;;53709:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;53687:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;53804:13:0;;53790:11;;53783:18;;:4;:18;:::i;:::-;:34;;;;:::i;:::-;53767:13;:50;53880:13;;53863:14;;53856:21;;:4;:21;:::i;:::-;:37;;;;:::i;:::-;53836:16;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;53960:13:0;;53941:16;;53934:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;53912:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;53553:900:0;;-1:-1:-1;53553:900:0;;-1:-1:-1;;;;;54034:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;54084:1;54069:12;;:16;54034:51;54031:422;;;54110:33;54139:3;54110:24;54121:12;;54110:6;:10;;:24;;;;:::i;:33::-;54103:40;;54206:12;;54188:15;;54181:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;54159:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;54273:12:0;;54260:10;;54253:17;;:4;:17;:::i;:::-;:32;;;;:::i;:::-;54237:13;:48;54347:12;;54331:13;;54324:20;;:4;:20;:::i;:::-;:35;;;;:::i;:::-;54304:16;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;54425:12:0;;54407:15;;54400:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;54378:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;54031:422:0;54505:1;54489:13;;54484:4;:18;;;;:::i;:::-;:22;54481:126;;;54530:61;54546:4;54560;54567:23;54576:13;;54567:4;:8;;:23;;;;:::i;:::-;54530:15;:61::i;:::-;54625:13;;:17;54621:106;;54662:49;54678:4;41849:6;54697:13;;54662:15;:49::i;:::-;54749:14;54759:4;54749:14;;:::i;:::-;;;53503:1272;54787:33;54803:4;54809:2;54813:6;54787:15;:33::i;:::-;50654:4174;;50541:4287;;;:::o;21617:192::-;21703:7;21739:12;21731:6;;;;21723:29;;;;-1:-1:-1;;;21723:29:0;;;;;;;;:::i;:::-;-1:-1:-1;21763:9:0;21775:5;21779:1;21775;:5;:::i;:::-;21763:17;21617:192;-1:-1:-1;;;;;21617:192:0:o;5545:370::-;5598:7;5681:9;5728:16;5717:27;;5713:195;;;5768:24;5761:31;;;5545:370;:::o;5713:195::-;-1:-1:-1;;6197:67:0;;;5854:10;6197:67;;;;20134:25:1;;;;5866:12:0;20175:18:1;;;20168:34;5880:15:0;20218:18:1;;;20211:34;6148:9:0;20261:18:1;;;20254:34;6258:4:0;20304:19:1;;;;20297:84;;;;6197:67:0;;;;;;;;;;20106:19:1;;;;6197:67:0;;;6187:78;;;;;;5545:370::o;34418:374::-;-1:-1:-1;;;;;34502:21:0;;34494:65;;;;-1:-1:-1;;;34494:65:0;;18913:2:1;34494:65:0;;;18895:21:1;18952:2;18932:18;;;18925:30;18991:33;18971:18;;;18964:61;19042:18;;34494:65:0;18711:355:1;34494:65:0;34645:12;;:24;;34662:6;34645:16;:24::i;:::-;34630:12;:39;-1:-1:-1;;;;;34701:18:0;;:9;:18;;;;;;;;;;;:30;;34724:6;34701:22;:30::i;:::-;-1:-1:-1;;;;;34680:18:0;;:9;:18;;;;;;;;;;;:51;;;;34747:37;;2157:25:1;;;34680:18:0;;:9;;34747:37;;2130:18:1;34747:37:0;;;;;;;;34418:374;;:::o;34800:418::-;-1:-1:-1;;;;;34884:21:0;;34876:67;;;;-1:-1:-1;;;34876:67:0;;19273:2:1;34876:67:0;;;19255:21:1;19312:2;19292:18;;;19285:30;19351:34;19331:18;;;19324:62;19422:3;19402:18;;;19395:31;19443:19;;34876:67:0;19071:397:1;34876:67:0;35039:68;35062:6;35039:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35039:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;35018:18:0;;:9;:18;;;;;;;;;;:89;35133:12;;:24;;35150:6;35133:16;:24::i;:::-;35118:12;:39;35173:37;;2157:25:1;;;35199:1:0;;-1:-1:-1;;;;;35173:37:0;;;;;2145:2:1;2130:18;35173:37:0;2011:177:1;21473:136:0;21531:7;21558:43;21562:1;21565;21558:43;;;;;;;;;;;;;;;;;:3;:43::i;21817:250::-;21875:7;21899:6;21895:47;;-1:-1:-1;21929:1:0;21922:8;;21895:47;21954:9;21966:5;21970:1;21966;:5;:::i;:::-;21954:17;-1:-1:-1;21999:1:0;21990:5;21994:1;21954:17;21990:5;:::i;:::-;:10;21982:56;;;;-1:-1:-1;;;21982:56:0;;19675:2:1;21982:56:0;;;19657:21:1;19714:2;19694:18;;;19687:30;19753:34;19733:18;;;19726:62;19824:3;19804:18;;;19797:31;19845:19;;21982:56:0;19473:397:1;22075:132:0;22133:7;22160:39;22164:1;22167;22160:39;;;;;;;;;;;;;;;;;:3;:39::i;33871:539::-;-1:-1:-1;;;;;33977:20:0;;33969:70;;;;-1:-1:-1;;;33969:70:0;;16077:2:1;33969:70:0;;;16059:21:1;16116:2;16096:18;;;16089:30;16155:34;16135:18;;;16128:62;16226:7;16206:18;;;16199:35;16251:19;;33969:70:0;15875:401:1;33969:70:0;-1:-1:-1;;;;;34058:23:0;;34050:71;;;;-1:-1:-1;;;34050:71:0;;16483:2:1;34050:71:0;;;16465:21:1;16522:2;16502:18;;;16495:30;16561:34;16541:18;;;16534:62;16632:5;16612:18;;;16605:33;16655:19;;34050:71:0;16281:399:1;34050:71:0;34214;34236:6;34214:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34214:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;34194:17:0;;;:9;:17;;;;;;;;;;;:91;;;;34319:20;;;;;;;:32;;34344:6;34319:24;:32::i;:::-;-1:-1:-1;;;;;34296:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;34367:35;2157:25:1;;;34296:20:0;;34367:35;;;;;;2130:18:1;34367:35:0;2011:177:1;50238:295:0;50312:27;50342:84;50378:7;50342:84;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32833:18:0;;32806:7;32833:18;;;:11;:18;;;;;;;;50362:10;32833:27;;;;;;;;50342:35;:84;:35;:84::i;:::-;50312:114;;50439:51;50448:8;50458:10;50470:19;50439:8;:51::i;:::-;50501:24;50507:8;50517:7;50501:5;:24::i;47805:188::-;-1:-1:-1;;;;;47888:31:0;;;;;;:25;:31;;;;;;:39;;;;;;;;;;;;;47945:40;;47888:39;;:31;47945:40;;;47805:188;;:::o;38229:207::-;-1:-1:-1;;;;;38350:14:0;;38289:15;38350:14;;;:7;:14;;;;;30548;;;38411:17;38350:14;38411:15;:17::i;:::-;38306:130;38229:207;;;:::o;6915:167::-;6992:7;7019:55;7041:20;:18;:20::i;:::-;7063:10;21049:57;;20968:66:1;21049:57:0;;;20956:79:1;21051:11;;;21044:27;;;21087:12;;;21080:28;;;21012:7:0;;21124:12:1;;21049:57:0;;;;;;;;;;;;21039:68;;;;;;21032:75;;20919:196;;;;;19721:279;19849:7;19870:17;19889:18;19911:25;19922:4;19928:1;19931;19934;19911:10;:25::i;:::-;19869:67;;;;19947:18;19959:5;19947:11;:18::i;:::-;-1:-1:-1;19983:9:0;19721:279;-1:-1:-1;;;;;19721:279:0:o;22215:275::-;22301:7;22336:12;22329:5;22321:28;;;;-1:-1:-1;;;22321:28:0;;;;;;;;:::i;:::-;-1:-1:-1;22360:9:0;22372:5;22376:1;22372;:5;:::i;:::-;22360:17;-1:-1:-1;22408:5:0;22412:1;22408;:5;:::i;:::-;22400;22404:1;22400;:5;:::i;:::-;:13;;;;:::i;:::-;22395:1;:18;22388:26;;;;:::i;:::-;22481:1;22215:275;-1:-1:-1;;;;22215:275:0:o;30578:181::-;30750:1;30732:7;:14;;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;30578:181:0:o;17950:1632::-;18081:7;;19015:66;19002:79;;18998:163;;;-1:-1:-1;19114:1:0;;-1:-1:-1;19118:30:0;19098:51;;18998:163;19175:1;:7;;19180:2;19175:7;;:18;;;;;19186:1;:7;;19191:2;19186:7;;19175:18;19171:102;;;-1:-1:-1;19226:1:0;;-1:-1:-1;19230:30:0;19210:51;;19171:102;19387:24;;;19370:14;19387:24;;;;;;;;;21374:25:1;;;21447:4;21435:17;;21415:18;;;21408:45;;;;21469:18;;;21462:34;;;21512:18;;;21505:34;;;19387:24:0;;21346:19:1;;19387:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19387:24:0;;;;;;-1:-1:-1;;;;;;;19426:20:0;;19422:103;;19479:1;19483:29;19463:50;;;;;;;19422:103;19545:6;-1:-1:-1;19553:20:0;;-1:-1:-1;17950:1632:0;;;;;;;;:::o;12612:643::-;12690:20;12681:5;:29;;;;;;;;:::i;:::-;;12677:571;;;12612:643;:::o;12677:571::-;12788:29;12779:5;:38;;;;;;;;:::i;:::-;;12775:473;;;12834:34;;-1:-1:-1;;;12834:34:0;;21941:2:1;12834:34:0;;;21923:21:1;21980:2;21960:18;;;21953:30;22019:26;21999:18;;;21992:54;22063:18;;12834:34:0;21739:348:1;12775:473:0;12899:35;12890:5;:44;;;;;;;;:::i;:::-;;12886:362;;;12951:41;;-1:-1:-1;;;12951:41:0;;22294:2:1;12951:41:0;;;22276:21:1;22333:2;22313:18;;;22306:30;22372:33;22352:18;;;22345:61;22423:18;;12951:41:0;22092:355:1;12886:362:0;13023:30;13014:5;:39;;;;;;;;:::i;:::-;;13010:238;;;13070:44;;-1:-1:-1;;;13070:44:0;;22654:2:1;13070:44:0;;;22636:21:1;22693:2;22673:18;;;22666:30;22732:34;22712:18;;;22705:62;22803:4;22783:18;;;22776:32;22825:19;;13070:44:0;22452:398:1;13010:238:0;13145:30;13136:5;:39;;;;;;;;:::i;:::-;;13132:116;;;13192:44;;-1:-1:-1;;;13192:44:0;;23057:2:1;13192:44:0;;;23039:21:1;23096:2;23076:18;;;23069:30;23135:34;23115:18;;;23108:62;23206:4;23186:18;;;23179:32;23228:19;;13192:44:0;22855:398:1;14:154;-1:-1:-1;;;;;93:5:1;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:247;232:6;285:2;273:9;264:7;260:23;256:32;253:52;;;301:1;298;291:12;253:52;340:9;327:23;359:31;384:5;359:31;:::i;580:656::-;692:4;721:2;750;739:9;732:21;782:6;776:13;825:6;820:2;809:9;805:18;798:34;850:1;860:140;874:6;871:1;868:13;860:140;;;969:14;;;965:23;;959:30;935:17;;;954:2;931:26;924:66;889:10;;860:140;;;1018:6;1015:1;1012:13;1009:91;;;1088:1;1083:2;1074:6;1063:9;1059:22;1055:31;1048:42;1009:91;-1:-1:-1;1152:2:1;1140:15;1157:66;1136:88;1121:104;;;;1227:2;1117:113;;580:656;-1:-1:-1;;;580:656:1:o;1241:315::-;1309:6;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1425:9;1412:23;1444:31;1469:5;1444:31;:::i;:::-;1494:5;1546:2;1531:18;;;;1518:32;;-1:-1:-1;;;1241:315:1:o;2193:180::-;2252:6;2305:2;2293:9;2284:7;2280:23;2276:32;2273:52;;;2321:1;2318;2311:12;2273:52;-1:-1:-1;2344:23:1;;2193:180;-1:-1:-1;2193:180:1:o;2378:456::-;2455:6;2463;2471;2524:2;2512:9;2503:7;2499:23;2495:32;2492:52;;;2540:1;2537;2530:12;2492:52;2579:9;2566:23;2598:31;2623:5;2598:31;:::i;:::-;2648:5;-1:-1:-1;2705:2:1;2690:18;;2677:32;2718:33;2677:32;2718:33;:::i;:::-;2378:456;;2770:7;;-1:-1:-1;;;2824:2:1;2809:18;;;;2796:32;;2378:456::o;3070:385::-;3156:6;3164;3172;3180;3233:3;3221:9;3212:7;3208:23;3204:33;3201:53;;;3250:1;3247;3240:12;3201:53;-1:-1:-1;;3273:23:1;;;3343:2;3328:18;;3315:32;;-1:-1:-1;3394:2:1;3379:18;;3366:32;;3445:2;3430:18;3417:32;;-1:-1:-1;3070:385:1;-1:-1:-1;3070:385:1:o;3831:160::-;3896:20;;3952:13;;3945:21;3935:32;;3925:60;;3981:1;3978;3971:12;3925:60;3831:160;;;:::o;3996:315::-;4061:6;4069;4122:2;4110:9;4101:7;4097:23;4093:32;4090:52;;;4138:1;4135;4128:12;4090:52;4177:9;4164:23;4196:31;4221:5;4196:31;:::i;:::-;4246:5;-1:-1:-1;4270:35:1;4301:2;4286:18;;4270:35;:::i;:::-;4260:45;;3996:315;;;;;:::o;4589:180::-;4645:6;4698:2;4686:9;4677:7;4673:23;4669:32;4666:52;;;4714:1;4711;4704:12;4666:52;4737:26;4753:9;4737:26;:::i;5026:829::-;5137:6;5145;5153;5161;5169;5177;5185;5238:3;5226:9;5217:7;5213:23;5209:33;5206:53;;;5255:1;5252;5245:12;5206:53;5294:9;5281:23;5313:31;5338:5;5313:31;:::i;:::-;5363:5;-1:-1:-1;5420:2:1;5405:18;;5392:32;5433:33;5392:32;5433:33;:::i;:::-;5485:7;-1:-1:-1;5539:2:1;5524:18;;5511:32;;-1:-1:-1;5590:2:1;5575:18;;5562:32;;-1:-1:-1;5646:3:1;5631:19;;5618:33;5695:4;5682:18;;5670:31;;5660:59;;5715:1;5712;5705:12;5660:59;5026:829;;;;-1:-1:-1;5026:829:1;;;;5738:7;5792:3;5777:19;;5764:33;;-1:-1:-1;5844:3:1;5829:19;;;5816:33;;5026:829;-1:-1:-1;;5026:829:1:o;5860:388::-;5928:6;5936;5989:2;5977:9;5968:7;5964:23;5960:32;5957:52;;;6005:1;6002;5995:12;5957:52;6044:9;6031:23;6063:31;6088:5;6063:31;:::i;:::-;6113:5;-1:-1:-1;6170:2:1;6155:18;;6142:32;6183:33;6142:32;6183:33;:::i;:::-;6235:7;6225:17;;;5860:388;;;;;:::o;6253:251::-;6323:6;6376:2;6364:9;6355:7;6351:23;6347:32;6344:52;;;6392:1;6389;6382:12;6344:52;6424:9;6418:16;6443:31;6468:5;6443:31;:::i;6509:437::-;6588:1;6584:12;;;;6631;;;6652:61;;6706:4;6698:6;6694:17;6684:27;;6652:61;6759:2;6751:6;6748:14;6728:18;6725:38;6722:218;;;6796:77;6793:1;6786:88;6897:4;6894:1;6887:15;6925:4;6922:1;6915:15;7077:1301;7186:4;7215:2;7244;7233:9;7226:21;7267:1;7300:6;7294:13;7330:3;7352:1;7380:9;7376:2;7372:18;7362:28;;7440:2;7429:9;7425:18;7462;7452:61;;7506:4;7498:6;7494:17;7484:27;;7452:61;7559:2;7551:6;7548:14;7528:18;7525:38;7522:222;;;7598:77;7593:3;7586:90;7699:4;7696:1;7689:15;7729:4;7724:3;7717:17;7522:222;7800:18;;;512:19;;;564:4;555:14;7843:18;7870:158;;;;8042:1;8037:315;;;;7836:516;;7870:158;7918:66;7907:9;7903:82;7898:3;7891:95;8015:2;8010:3;8006:12;7999:19;;7870:158;;8037:315;7024:1;7017:14;;;7061:4;7048:18;;8132:1;8146:165;8160:6;8157:1;8154:13;8146:165;;;8238:14;;8225:11;;;8218:35;8281:16;;;;8175:10;;8146:165;;;8331:11;;;-1:-1:-1;;7836:516:1;-1:-1:-1;8369:3:1;;7077:1301;-1:-1:-1;;;;;;;;;7077:1301:1:o;8383:184::-;8435:77;8432:1;8425:88;8532:4;8529:1;8522:15;8556:4;8553:1;8546:15;8572:228;8612:7;8738:1;8670:66;8666:74;8663:1;8660:81;8655:1;8648:9;8641:17;8637:105;8634:131;;;8745:18;;:::i;:::-;-1:-1:-1;8785:9:1;;8572:228::o;8805:184::-;8857:77;8854:1;8847:88;8954:4;8951:1;8944:15;8978:4;8975:1;8968:15;8994:120;9034:1;9060;9050:35;;9065:18;;:::i;:::-;-1:-1:-1;9099:9:1;;8994:120::o;9535:128::-;9575:3;9606:1;9602:6;9599:1;9596:13;9593:39;;;9612:18;;:::i;:::-;-1:-1:-1;9648:9:1;;9535:128::o;10026:184::-;10096:6;10149:2;10137:9;10128:7;10124:23;10120:32;10117:52;;;10165:1;10162;10155:12;10117:52;-1:-1:-1;10188:16:1;;10026:184;-1:-1:-1;10026:184:1:o;10215:125::-;10255:4;10283:1;10280;10277:8;10274:34;;;10288:18;;:::i;:::-;-1:-1:-1;10325:9:1;;10215:125::o;11750:184::-;11802:77;11799:1;11792:88;11899:4;11896:1;11889:15;11923:4;11920:1;11913:15;11939:1026;12201:4;12249:3;12238:9;12234:19;12280:6;12269:9;12262:25;12306:2;12344:6;12339:2;12328:9;12324:18;12317:34;12387:3;12382:2;12371:9;12367:18;12360:31;12411:6;12446;12440:13;12477:6;12469;12462:22;12515:3;12504:9;12500:19;12493:26;;12554:2;12546:6;12542:15;12528:29;;12575:1;12585:218;12599:6;12596:1;12593:13;12585:218;;;12664:13;;-1:-1:-1;;;;;12660:62:1;12648:75;;12778:15;;;;12743:12;;;;12621:1;12614:9;12585:218;;;-1:-1:-1;;;;;;;12859:55:1;;;;12854:2;12839:18;;12832:83;-1:-1:-1;;;12946:3:1;12931:19;12924:35;12820:3;11939:1026;-1:-1:-1;;;11939:1026:1:o;20392:112::-;20424:1;20450;20440:35;;20455:18;;:::i;:::-;-1:-1:-1;20489:9:1;;20392:112::o;20509:184::-;20561:77;20558:1;20551:88;20658:4;20655:1;20648:15;20682:4;20679:1;20672:15;21550:184;21602:77;21599:1;21592:88;21699:4;21696:1;21689:15;21723:4;21720:1;21713:15

Swarm Source

ipfs://6f80522ad2fd3dec4a158ce1e0450a0e4b040cb57a3c502cfd3b3cd004a8ef15
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.