Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 15661181 | 787 days ago | IN | 0 ETH | 0.01809578 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Gin
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-02 */ // SPDX-License-Identifier: AGPL-3.0-only // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !Address.isContract(address(this)); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: contracts/OwnableKeepable.sol // Based on OpenZeppelin's Ownable contract. Adds 'keeper' for non-multisig tasks. pragma solidity >=0.8.0; abstract contract Ownable is Context { address private _owner; address public keeper; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event KeeperTransferred(address indexed previousKeeper, address indexed newKeeper); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { //transfer to non 0 addy during constructor when deploying 4real to prevent our base contracts being taken over. Ensures only our proxy is usable //Since proxies are not initialized //_transferOwnership(address(~uint160(0))); _transferOwnership(address(uint160(0))); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "TipsyOwnable: caller is not the owner"); _; } modifier onlyOwnerOrKeeper() { require(owner() == _msgSender() || keeper == _msgSender(), "TipsyOwnable: caller is not the owner or not a keeper"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() external virtual onlyOwner { _transferOwnership(address(0x000000000000000000000000000000000000dEaD)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) external virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } function transferKeeper(address _newKeeper) external virtual onlyOwner { require(_newKeeper != address(0), "Ownable: new Keeper is the zero address"); emit KeeperTransferred(keeper, _newKeeper); keeper = _newKeeper; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } function initOwnership(address newOwner) public virtual { require(_owner == address(0), "Ownable: owner already set"); require(newOwner != address(0), "Ownable: new owner can't be 0 address"); _owner = newOwner; emit OwnershipTransferred(address(0), newOwner); } } /** * @title Storage * @dev Store & retrieve value in a variable */ // File: contracts/Solmate_modified.sol pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Gin (https://github.com/TipsyCoin/TipsyGin/), modified from Solmate /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @author CheckNSignature function and SplitsSigs from Gnosis Safe. (https://github.com/safe-global/safe-contracts/blob/main/contracts/GnosisSafe.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. /// In the interests of general openness, we prefer vars that are safe to be made public, are abstract contract SolMateERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); event Mint(address indexed minter, address indexed to, uint256 amount); event Burn(address indexed burner, address indexed from, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public constant name = "Gin"; string public constant symbol = "$gin"; uint8 public constant decimals = 18; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal INITIAL_CHAIN_ID; //These can't be immutable in upgradeable proxy pattern //We also want to reuse contract address accross multiple chain ... //So deployed bytecode must be identical == can't do consts for init chain id, etc bytes32 public INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// GIN EXTRA //////////////////////////////////////////////////////////////*/ mapping(address => bool) public mintSigners; mapping(address => bool) public contractMinters; uint8 public constant MIN_SIGS = 2; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ //Changed to initialize for upgrade purposes. /*////////////////////////////////////////////////////////////// EXTRA GIN STUFF //////////////////////////////////////////////////////////////*/ function _addContractMinter(address _newSigner) internal virtual returns (bool) { //require (msg.sender == address(this), "Only internal calls, please"); uint size; assembly { size := extcodesize(_newSigner) } require(size > 0, "CONTRACTMINTER_NOT_CONTRACT"); contractMinters[_newSigner] = true; return true; } function _removeContractMinter(address _removedSigner) internal virtual returns (bool) { contractMinters[_removedSigner] = false; return true; } function _addMintSigner(address _newSigner) internal virtual returns (bool) { //require (msg.sender == address(this), "Only internal calls, please"); uint size; assembly { size := extcodesize(_newSigner) } require(size == 0, "SIGNER_NOT_EOA"); mintSigners[_newSigner] = true; return true; } function _removeMintSigner(address _removedSigner) internal virtual returns (bool) { mintSigners[_removedSigner] = false; return true; } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// GNOSIS-SAFE MULTISIG CHECK Modified from here: (https://github.com/safe-global/safe-contracts/blob/main/contracts/GnosisSafe.sol) //////////////////////////////////////////////////////////////*/ function checkNSignatures(address minter, bytes32 dataHash, uint8 _requiredSigs, bytes memory signatures) public view returns (bool) { // Check that the provided signature data is not too short require(signatures.length == _requiredSigs * 65, "SIG_LENGTH_COUNT_MISMATCH"); // There cannot be an owner with address 0. address lastOwner = address(0); address currentOwner; uint8 v; bytes32 r; bytes32 s; uint256 i; uint8 minterCount = 0; for (i = 0; i < _requiredSigs; i++) { //Split the bytes into signature data. v is only 1 byte long. r and s are 32 bytes (v, r, s) = signatureSplit(signatures, i); require (v == 27 || v == 28, "ZIPD_OR_CONTRACT_KEY_UNSUPPORTED"); currentOwner = ecrecover(dataHash, v, r, s); //Keys must be supplied in increasing public key order. Gas savings. require(currentOwner > lastOwner && mintSigners[currentOwner] == true, "SIG_CHECK_FAILED"); if (currentOwner == minter) minterCount++; lastOwner = currentOwner; } require(minterCount == 1, "MINTER_NOT_IN_SIG_SET"); return true; } /// @dev divides bytes signature into `uint8 v, bytes32 r, bytes32 s`. /// @notice Make sure to peform a bounds check for @param pos, to avoid out of bounds access on @param signatures /// @param pos which signature to read. A prior bounds check of this parameter should be performed, to avoid out of bounds access /// @param signatures concatenated rsv signatures /// Sourced from here: https://github.com/safe-global/safe-contracts/blob/main/contracts/GnosisSafe.sol function signatureSplit(bytes memory signatures, uint256 pos) internal pure returns (uint8 v, bytes32 r, bytes32 s) { // The signature format is a compact form of: // {bytes32 r}{bytes32 s}{uint8 v} // Compact means, uint8 is not padded to 32 bytes. // solhint-disable-next-line no-inline-assembly assembly { let signaturePos := mul(0x41, pos) r := mload(add(signatures, add(signaturePos, 0x20))) s := mload(add(signatures, add(signaturePos, 0x40))) // Here we are loading the last 32 bytes, including 31 bytes // of 's'. There is no 'mload8' to do this. // // 'byte' is not working due to the Solidity parser, so lets // use the second best option, 'and' v := and(mload(add(signatures, add(signaturePos, 0x41))), 0xff) } } /*////////////////////////////////////////////////////////////// EIP-2612 PERMIT //////////////////////////////////////////////////////////////*/ function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() public view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } } // File: contracts/final_gin.sol pragma solidity >=0.8.0; //import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; contract Gin is SolMateERC20, Ownable, Pausable, Initializable { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event ChainSupport(uint indexed chainId, bool indexed supported); event ContractPermission(address indexed contractAddress, bool indexed permitted); event SignerPermission(address indexed signerAddress, bool indexed permitted); event RequiredSigs(uint8 indexed oldAmount, uint8 indexed newAmount); event Deposit(address indexed from, uint256 indexed amount, uint256 sourceChain, uint256 indexed toChain); event Withdrawal(address indexed to, uint256 indexed amount, bytes32 indexed depositID); /*////////////////////////////////////////////////////////////// STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => bool) public supportedChains; uint8 public requiredSigs; /*////////////////////////////////////////////////////////////// INITILALIZATION //////////////////////////////////////////////////////////////*/ //Testing Only /* function _testInit() external { initialize(msg.sender, msg.sender, address(this)); permitSigner(address(msg.sender)); permitSigner(address(0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf));//this is the address for the 0x000...1 priv key permitSigner(address(0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF));//this is the address for the 0x000...2 priv key }*/ function initialize(address _keeper, address _stakingContract) public initializer { require(decimals == 18, "Init: Const check DECIMALS"); require(keccak256(abi.encodePacked(name)) == keccak256(abi.encodePacked("Gin")), "Init: Const check NAME"); require(keccak256(abi.encodePacked(symbol)) == keccak256(abi.encodePacked("$gin")), "Init: Const check SYMBOL"); require(MIN_SIGS == 2, "Init: Const check SIGS"); require(_keeper != address(0), "Init: keeper can't be 0 address"); keeper = _keeper; //Owner will be sent to the gnosis safe listed in readme multisig once contract is configured initOwnership(msg.sender); INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); setRequiredSigs(MIN_SIGS); //Use address 0 for chains that don't have staking contract deployed if (_stakingContract != address(0)) permitContract(_stakingContract); } /*////////////////////////////////////////////////////////////// PRIVILAGED //////////////////////////////////////////////////////////////*/ function permitContract(address _newSigner) public onlyOwner returns (bool) { emit ContractPermission(_newSigner, true); return _addContractMinter(_newSigner); } function permitSigner(address _newSigner) public onlyOwner returns (bool) { emit SignerPermission(_newSigner, true); return _addMintSigner(_newSigner); } function revokeSigner(address _newSigner) public onlyOwnerOrKeeper returns (bool) { emit SignerPermission(_newSigner, false); return _removeMintSigner(_newSigner); } //This one is only owner, because it could break Tipsystake. function revokeContract(address _newSigner) public onlyOwner returns (bool) { emit ContractPermission(_newSigner, false); return _removeContractMinter(_newSigner); } function setRequiredSigs(uint8 _numberSigs) public onlyOwner returns (uint8) { require(_numberSigs >= MIN_SIGS, "SIGS_BELOW_MINIMUM"); emit RequiredSigs(requiredSigs, _numberSigs); requiredSigs = _numberSigs; return _numberSigs; } function setSupportedChain(uint256 _chainId, bool _supported) external onlyOwnerOrKeeper returns(uint256, bool) { require(_chainId != block.chainid, "TO_FROM_CHAIN_IDENTICTAL"); supportedChains[_chainId] = _supported; emit ChainSupport(_chainId, _supported); return (_chainId, _supported); } function setPause(bool _paused) external onlyOwnerOrKeeper { if (_paused == true) _pause(); else _unpause(); } /*////////////////////////////////////////////////////////////// TIPSYSTAKE INTEGRATION //////////////////////////////////////////////////////////////*/ function mintTo(address _to, uint256 _amount) public whenNotPaused returns (bool) { require(contractMinters[msg.sender] == true, "MINTTO_FOR_TIPSYSTAKE_CONTRACTS_ONLY"); _mint(_to, _amount); emit Mint(msg.sender, _to, _amount); return true; //return bool required for our staking contract to function } /*////////////////////////////////////////////////////////////// BRIDGE FUNCTIONS //////////////////////////////////////////////////////////////*/ //Deposit from address to the given chainId. Our bridge will pick the Deposit event up and MultisigMint on the associated chain //Checks to ensure chainId is supported (ensure revent when no supported chainIds before bridge is live) //Does a standard transferFrom to ensure user approves this contract first. (Prevent accidental deposit, since this method is destructive to tokens) //Likely to use ChainID 0 to indicate tokens should be transfered to our game server function deposit(uint256 _amount, uint256 toChain) external whenNotPaused returns (bool) { require(supportedChains[toChain], "CHAIN_NOTYET_SUPPORTED"); require(transferFrom(msg.sender, address(this), _amount), "DEPOSIT_FAILED_CHECK_BAL_APPROVE"); _burn(address(this), _amount); emit Deposit(msg.sender, _amount, block.chainid, toChain); return true; } //MultiSig Mint. Used so server/bridge can sign messages off-chain, and transmit via relay network //Also used by the game. So tokens can be minted from the game without user paying gas function multisigMint(address minter, address to, uint256 amount, uint256 deadline, bytes32 _depositHash, bytes memory signatures) external whenNotPaused returns(bool) { require(deadline >= block.timestamp, "MINT_DEADLINE_EXPIRED"); bytes32 dataHash; dataHash = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "multisigMint(address minter,address to,uint256 amount,uint256 nonce,uint256 deadline,bytes32 _depositHash,bytes signatures)" ), minter, to, amount, nonces[minter]++, deadline, _depositHash ) ) ) ); checkNSignatures(minter, dataHash, requiredSigs, signatures); _mint(to, amount); emit Withdrawal(to, amount, _depositHash); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"supported","type":"bool"}],"name":"ChainSupport","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"bool","name":"permitted","type":"bool"}],"name":"ContractPermission","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sourceChain","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"toChain","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousKeeper","type":"address"},{"indexed":true,"internalType":"address","name":"newKeeper","type":"address"}],"name":"KeeperTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"oldAmount","type":"uint8"},{"indexed":true,"internalType":"uint8","name":"newAmount","type":"uint8"}],"name":"RequiredSigs","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signerAddress","type":"address"},{"indexed":true,"internalType":"bool","name":"permitted","type":"bool"}],"name":"SignerPermission","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"depositID","type":"bytes32"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_SIGS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"},{"internalType":"uint8","name":"_requiredSigs","type":"uint8"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"checkNSignatures","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"computeDomainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contractMinters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"toChain","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"initOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"},{"internalType":"address","name":"_stakingContract","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintSigners","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes32","name":"_depositHash","type":"bytes32"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"multisigMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[{"internalType":"address","name":"_newSigner","type":"address"}],"name":"permitContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newSigner","type":"address"}],"name":"permitSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requiredSigs","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newSigner","type":"address"}],"name":"revokeContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newSigner","type":"address"}],"name":"revokeSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_numberSigs","type":"uint8"}],"name":"setRequiredSigs","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_chainId","type":"uint256"},{"internalType":"bool","name":"_supported","type":"bool"}],"name":"setSupportedChain","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportedChains","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newKeeper","type":"address"}],"name":"transferKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001b600061002d565b6009805460ff60a01b1916905561007f565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612f92806200008f6000396000f3fe608060405234801561001057600080fd5b50600436106102925760003560e01c806370a0823111610160578063c13ceaa3116100d8578063dd62ed3e1161008c578063e460ef0d11610071578063e460ef0d146106ef578063f290e8dd14610712578063f2fde38b1461072557600080fd5b8063dd62ed3e146106b1578063e2bbb158146106dc57600080fd5b8063cc2e3ee1116100bd578063cc2e3ee114610678578063d3ff45d01461068b578063d505accf1461069e57600080fd5b8063c13ceaa314610652578063c34b44a01461066557600080fd5b80638da5cb5b1161012f578063a9059cbb11610114578063a9059cbb1461060c578063aced16611461061f578063bedb86fb1461063f57600080fd5b80638da5cb5b1461059157806395d89b41146105d057600080fd5b806370a082311461053c578063715018a61461055c5780637c0bbd5c146105645780637ecebe001461057157600080fd5b80633644e5151161020e5780635c975abb116101c257806361302f17116101a757806361302f171461044e57806367e22404146104615780636d5a0e991461046a57600080fd5b80635c975abb146104235780635d4a9db51461044657600080fd5b806346c6f5f4116101f357806346c6f5f4146103c5578063485cc955146103ed578063548d496f1461040057600080fd5b80633644e515146103aa578063449a52f8146103b257600080fd5b806323b872dd116102655780632a1fbaff1161024a5780632a1fbaff1461037a5780632c1925261461038d578063313ce567146103a257600080fd5b806323b872dd146103425780632807978e1461035557600080fd5b8063052139d21461029757806306fdde03146102cf578063095ea7b31461031857806318160ddd1461032b575b600080fd5b6102ba6102a5366004612a60565b60076020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61030b6040518060400160405280600381526020017f47696e000000000000000000000000000000000000000000000000000000000081525081565b6040516102c69190612aa6565b6102ba610326366004612af7565b610738565b61033460005481565b6040519081526020016102c6565b6102ba610350366004612b21565b6107b2565b610368610363366004612b6e565b6108f6565b60405160ff90911681526020016102c6565b6102ba610388366004612a60565b610a48565b6103a061039b366004612a60565b610b25565b005b610368601281565b610334610cc9565b6102ba6103c0366004612af7565b610dac565b6103d86103d3366004612b99565b610e93565b604080519283529015156020830152016102c6565b6103a06103fb366004612bc5565b611034565b6102ba61040e366004612bef565b600a6020526000908152604090205460ff1681565b60095474010000000000000000000000000000000000000000900460ff166102ba565b610368600281565b6103a061045c366004612a60565b61151e565b61033460045481565b604080518082018252600381527f47696e000000000000000000000000000000000000000000000000000000000060209182015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fb4e677c45e470714c0e73654b8e28fc2bbe115e24490a0cf4f32f73a57d2f7c3818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c09091019092528151910120610334565b61033461054a366004612a60565b60016020526000908152604090205481565b6103a061167e565b600b546103689060ff1681565b61033461057f366004612a60565b60056020526000908152604090205481565b60085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c6565b61030b6040518060400160405280600481526020017f2467696e0000000000000000000000000000000000000000000000000000000081525081565b6102ba61061a366004612af7565b611718565b6009546105ab9073ffffffffffffffffffffffffffffffffffffffff1681565b6103a061064d366004612c08565b61179d565b6102ba610660366004612cfd565b611869565b6102ba610673366004612a60565b611a7c565b6102ba610686366004612a60565b611bc3565b6102ba610699366004612d77565b611ce8565b6103a06106ac366004612ddf565b611fa5565b6103346106bf366004612bc5565b600260209081526000928352604080842090915290825290205481565b6102ba6106ea366004612e49565b612290565b6102ba6106fd366004612a60565b60066020526000908152604090205460ff1681565b6102ba610720366004612a60565b6123b4565b6103a0610733366004612a60565b612491565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107a09086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610846576108148382612e9a565b73ffffffffffffffffffffffffffffffffffffffff861660009081526002602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85166000908152600160205260408120805485929061087b908490612e9a565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260016020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906108e39087815260200190565b60405180910390a3506001949350505050565b60085460009073ffffffffffffffffffffffffffffffffffffffff16331461098b5760405162461bcd60e51b815260206004820152602560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b600260ff831610156109df5760405162461bcd60e51b815260206004820152601260248201527f534947535f42454c4f575f4d494e494d554d00000000000000000000000000006044820152606401610982565b600b5460405160ff8085169216907f21596c7db24a03f853c8e10ac11e0ae5a92687d80b75f0bcfdee111eba70cb3090600090a350600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316179055805b919050565b60085460009073ffffffffffffffffffffffffffffffffffffffff163314610ad85760405162461bcd60e51b815260206004820152602560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610982565b60405160019073ffffffffffffffffffffffffffffffffffffffff8416907febe501dabdf217b50ee62204834587d68f48f19608aba6ef6bc270dc0441a5d490600090a36107ac826125b0565b60085473ffffffffffffffffffffffffffffffffffffffff163314610bb25760405162461bcd60e51b815260206004820152602560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610982565b73ffffffffffffffffffffffffffffffffffffffff8116610c3b5760405162461bcd60e51b815260206004820152602760248201527f4f776e61626c653a206e6577204b656570657220697320746865207a65726f2060448201527f61646472657373000000000000000000000000000000000000000000000000006064820152608401610982565b60095460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f9097747ed48b5dd443be38e301bbacc0183d965854f4e1fcb64583b429dcc88a90600090a3600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006003544614610da55750604080518082018252600381527f47696e000000000000000000000000000000000000000000000000000000000060209182015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fb4e677c45e470714c0e73654b8e28fc2bbe115e24490a0cf4f32f73a57d2f7c3818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b5060045490565b6000610db6612656565b3360009081526007602052604090205460ff161515600114610e3f5760405162461bcd60e51b8152602060048201526024808201527f4d494e54544f5f464f525f54495053595354414b455f434f4e5452414354535f60448201527f4f4e4c59000000000000000000000000000000000000000000000000000000006064820152608401610982565b610e4983836126c1565b60405182815273ffffffffffffffffffffffffffffffffffffffff84169033907fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8906020016107a0565b6000803373ffffffffffffffffffffffffffffffffffffffff16610ecc60085473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff161480610f05575060095473ffffffffffffffffffffffffffffffffffffffff1633145b610f775760405162461bcd60e51b815260206004820152603560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e6572206f72206e6f742061206b656570657200000000000000000000006064820152608401610982565b468403610fc65760405162461bcd60e51b815260206004820152601860248201527f544f5f46524f4d5f434841494e5f4944454e54494354414c00000000000000006044820152606401610982565b6000848152600a602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168615159081179091559051909186917f60f144686fc70289089a845980af3580ac4a213fd92a33fd2ab95ef8eb0b79399190a3509192909150565b600954760100000000000000000000000000000000000000000000900460ff1661107d576009547501000000000000000000000000000000000000000000900460ff1615611081565b303b155b6110f35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610982565b600954760100000000000000000000000000000000000000000000900460ff1615801561115c57600980547fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff167601010000000000000000000000000000000000000000001790555b6040517f47696e00000000000000000000000000000000000000000000000000000000006020820152602301604051602081830303815290604052805190602001206040518060400160405280600381526020017f47696e00000000000000000000000000000000000000000000000000000000008152506040516020016111e49190612ead565b60405160208183030381529060405280519060200120146112475760405162461bcd60e51b815260206004820152601660248201527f496e69743a20436f6e737420636865636b204e414d45000000000000000000006044820152606401610982565b6040517f2467696e000000000000000000000000000000000000000000000000000000006020820152602401604051602081830303815290604052805190602001206040518060400160405280600481526020017f2467696e000000000000000000000000000000000000000000000000000000008152506040516020016112cf9190612ead565b60405160208183030381529060405280519060200120146113325760405162461bcd60e51b815260206004820152601860248201527f496e69743a20436f6e737420636865636b2053594d424f4c00000000000000006044820152606401610982565b73ffffffffffffffffffffffffffffffffffffffff83166113955760405162461bcd60e51b815260206004820152601f60248201527f496e69743a206b65657065722063616e277420626520302061646472657373006044820152606401610982565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790556113de3361151e565b466003556114b5604080518082018252600381527f47696e000000000000000000000000000000000000000000000000000000000060209182015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fb4e677c45e470714c0e73654b8e28fc2bbe115e24490a0cf4f32f73a57d2f7c3818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b6004556114c260026108f6565b5073ffffffffffffffffffffffffffffffffffffffff8216156114ea576114e882610a48565b505b801561151957600980547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1690555b505050565b60085473ffffffffffffffffffffffffffffffffffffffff16156115845760405162461bcd60e51b815260206004820152601a60248201527f4f776e61626c653a206f776e657220616c7265616479207365740000000000006044820152606401610982565b73ffffffffffffffffffffffffffffffffffffffff811661160d5760405162461bcd60e51b815260206004820152602560248201527f4f776e61626c653a206e6577206f776e65722063616e2774206265203020616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610982565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350565b60085473ffffffffffffffffffffffffffffffffffffffff16331461170b5760405162461bcd60e51b815260206004820152602560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610982565b61171661dead612739565b565b33600090815260016020526040812080548391908390611739908490612e9a565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260016020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906107a09086815260200190565b60085473ffffffffffffffffffffffffffffffffffffffff163314806117da575060095473ffffffffffffffffffffffffffffffffffffffff1633145b61184c5760405162461bcd60e51b815260206004820152603560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e6572206f72206e6f742061206b656570657200000000000000000000006064820152608401610982565b8015156001036118615761185e6127b0565b50565b61185e612849565b6000611873612656565b428410156118c35760405162461bcd60e51b815260206004820152601560248201527f4d494e545f444541444c494e455f4558504952454400000000000000000000006044820152606401610982565b60006118cd610cc9565b73ffffffffffffffffffffffffffffffffffffffff8916600090815260056020526040812080547f79a9ea266339426f606bcdebf8e70eab0def749a35ce5b0d1755c30cecebd23c928c928c928c9290919061192883612ec9565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810187905260e0810186905261010001604051602081830303815290604052805190602001206040516020016119d19291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120600b54909150611a1e908990839060ff1686611ce8565b50611a2987876126c1565b83868873ffffffffffffffffffffffffffffffffffffffff167f806bc37112176c187cccea4249aea74827b609b5e40d595301442638bfd5736760405160405180910390a4506001979650505050505050565b60085460009073ffffffffffffffffffffffffffffffffffffffff16331480611abc575060095473ffffffffffffffffffffffffffffffffffffffff1633145b611b2e5760405162461bcd60e51b815260206004820152603560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e6572206f72206e6f742061206b656570657200000000000000000000006064820152608401610982565b60405160009073ffffffffffffffffffffffffffffffffffffffff8416907fc538b50375ebb3f8a9e36594a17d25bd0fcd9a932f5cf142a9e37c9b9dab7605908390a373ffffffffffffffffffffffffffffffffffffffff8216600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560016107ac565b60085460009073ffffffffffffffffffffffffffffffffffffffff163314611c535760405162461bcd60e51b815260206004820152602560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610982565b60405160009073ffffffffffffffffffffffffffffffffffffffff8416907febe501dabdf217b50ee62204834587d68f48f19608aba6ef6bc270dc0441a5d4908390a373ffffffffffffffffffffffffffffffffffffffff8216600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560016107ac565b6000611cf5836041612f01565b60ff16825114611d475760405162461bcd60e51b815260206004820152601960248201527f5349475f4c454e4754485f434f554e545f4d49534d41544348000000000000006044820152606401610982565b60008080808080805b8960ff16821015611f405760418281028a0160208101516040820151919092015160ff1696509094509250601b851480611d8d57508460ff16601c145b611dd95760405162461bcd60e51b815260206004820181905260248201527f5a4950445f4f525f434f4e54524143545f4b45595f554e535550504f525445446044820152606401610982565b6040805160008152602081018083528d905260ff871691810191909152606081018590526080810184905260019060a0016020604051602081039080840390855afa158015611e2c573d6000803e3d6000fd5b5050506020604051035195508673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16118015611e9d575073ffffffffffffffffffffffffffffffffffffffff861660009081526006602052604090205460ff1615156001145b611ee95760405162461bcd60e51b815260206004820152601060248201527f5349475f434845434b5f4641494c4544000000000000000000000000000000006044820152606401610982565b8b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611f2a5780611f2681612f2a565b9150505b8596508180611f3890612ec9565b925050611d50565b8060ff16600114611f935760405162461bcd60e51b815260206004820152601560248201527f4d494e5445525f4e4f545f494e5f5349475f53455400000000000000000000006044820152606401610982565b5060019b9a5050505050505050505050565b42841015611ff55760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610982565b60006001612001610cc9565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015612153573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906121ce57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61221a5760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f5349474e45520000000000000000000000000000000000006044820152606401610982565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526002602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600061229a612656565b6000828152600a602052604090205460ff166122f85760405162461bcd60e51b815260206004820152601660248201527f434841494e5f4e4f545945545f535550504f52544544000000000000000000006044820152606401610982565b6123033330856107b2565b61234f5760405162461bcd60e51b815260206004820181905260248201527f4445504f5349545f4641494c45445f434845434b5f42414c5f415050524f56456044820152606401610982565b61235930846128a0565b81833373ffffffffffffffffffffffffffffffffffffffff167f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e466040516123a391815260200190565b60405180910390a450600192915050565b60085460009073ffffffffffffffffffffffffffffffffffffffff1633146124445760405162461bcd60e51b815260206004820152602560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610982565b60405160019073ffffffffffffffffffffffffffffffffffffffff8416907fc538b50375ebb3f8a9e36594a17d25bd0fcd9a932f5cf142a9e37c9b9dab760590600090a36107ac8261292b565b60085473ffffffffffffffffffffffffffffffffffffffff16331461251e5760405162461bcd60e51b815260206004820152602560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610982565b73ffffffffffffffffffffffffffffffffffffffff81166125a75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610982565b61185e81612739565b6000813b806126015760405162461bcd60e51b815260206004820152601b60248201527f434f4e54524143544d494e5445525f4e4f545f434f4e545241435400000000006044820152606401610982565b505073ffffffffffffffffffffffffffffffffffffffff16600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915590565b60095474010000000000000000000000000000000000000000900460ff16156117165760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610982565b806000808282546126d29190612f49565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127b8612656565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861281f3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6128516129d2565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361281f565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040812080548392906128d5908490612e9a565b909155505060008054829003815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161272d565b6000813b801561297d5760405162461bcd60e51b815260206004820152600e60248201527f5349474e45525f4e4f545f454f410000000000000000000000000000000000006044820152606401610982565b505073ffffffffffffffffffffffffffffffffffffffff16600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915590565b60095474010000000000000000000000000000000000000000900460ff166117165760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610982565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a4357600080fd5b600060208284031215612a7257600080fd5b612a7b82612a3c565b9392505050565b60005b83811015612a9d578181015183820152602001612a85565b50506000910152565b6020815260008251806020840152612ac5816040850160208701612a82565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060408385031215612b0a57600080fd5b612b1383612a3c565b946020939093013593505050565b600080600060608486031215612b3657600080fd5b612b3f84612a3c565b9250612b4d60208501612a3c565b9150604084013590509250925092565b803560ff81168114610a4357600080fd5b600060208284031215612b8057600080fd5b612a7b82612b5d565b80358015158114610a4357600080fd5b60008060408385031215612bac57600080fd5b82359150612bbc60208401612b89565b90509250929050565b60008060408385031215612bd857600080fd5b612be183612a3c565b9150612bbc60208401612a3c565b600060208284031215612c0157600080fd5b5035919050565b600060208284031215612c1a57600080fd5b612a7b82612b89565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112612c6357600080fd5b813567ffffffffffffffff80821115612c7e57612c7e612c23565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612cc457612cc4612c23565b81604052838152866020858801011115612cdd57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c08789031215612d1657600080fd5b612d1f87612a3c565b9550612d2d60208801612a3c565b945060408701359350606087013592506080870135915060a087013567ffffffffffffffff811115612d5e57600080fd5b612d6a89828a01612c52565b9150509295509295509295565b60008060008060808587031215612d8d57600080fd5b612d9685612a3c565b935060208501359250612dab60408601612b5d565b9150606085013567ffffffffffffffff811115612dc757600080fd5b612dd387828801612c52565b91505092959194509250565b600080600080600080600060e0888a031215612dfa57600080fd5b612e0388612a3c565b9650612e1160208901612a3c565b95506040880135945060608801359350612e2d60808901612b5d565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612e5c57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156107ac576107ac612e6b565b60008251612ebf818460208701612a82565b9190910192915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612efa57612efa612e6b565b5060010190565b600060ff821660ff84168160ff0481118215151615612f2257612f22612e6b565b029392505050565b600060ff821660ff8103612f4057612f40612e6b565b60010192915050565b808201808211156107ac576107ac612e6b56fea26469706673582212204df062ce4a728db409b68ffa83f0a34c19327d770669675260d855e15c1f5eee64736f6c63430008100033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102925760003560e01c806370a0823111610160578063c13ceaa3116100d8578063dd62ed3e1161008c578063e460ef0d11610071578063e460ef0d146106ef578063f290e8dd14610712578063f2fde38b1461072557600080fd5b8063dd62ed3e146106b1578063e2bbb158146106dc57600080fd5b8063cc2e3ee1116100bd578063cc2e3ee114610678578063d3ff45d01461068b578063d505accf1461069e57600080fd5b8063c13ceaa314610652578063c34b44a01461066557600080fd5b80638da5cb5b1161012f578063a9059cbb11610114578063a9059cbb1461060c578063aced16611461061f578063bedb86fb1461063f57600080fd5b80638da5cb5b1461059157806395d89b41146105d057600080fd5b806370a082311461053c578063715018a61461055c5780637c0bbd5c146105645780637ecebe001461057157600080fd5b80633644e5151161020e5780635c975abb116101c257806361302f17116101a757806361302f171461044e57806367e22404146104615780636d5a0e991461046a57600080fd5b80635c975abb146104235780635d4a9db51461044657600080fd5b806346c6f5f4116101f357806346c6f5f4146103c5578063485cc955146103ed578063548d496f1461040057600080fd5b80633644e515146103aa578063449a52f8146103b257600080fd5b806323b872dd116102655780632a1fbaff1161024a5780632a1fbaff1461037a5780632c1925261461038d578063313ce567146103a257600080fd5b806323b872dd146103425780632807978e1461035557600080fd5b8063052139d21461029757806306fdde03146102cf578063095ea7b31461031857806318160ddd1461032b575b600080fd5b6102ba6102a5366004612a60565b60076020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61030b6040518060400160405280600381526020017f47696e000000000000000000000000000000000000000000000000000000000081525081565b6040516102c69190612aa6565b6102ba610326366004612af7565b610738565b61033460005481565b6040519081526020016102c6565b6102ba610350366004612b21565b6107b2565b610368610363366004612b6e565b6108f6565b60405160ff90911681526020016102c6565b6102ba610388366004612a60565b610a48565b6103a061039b366004612a60565b610b25565b005b610368601281565b610334610cc9565b6102ba6103c0366004612af7565b610dac565b6103d86103d3366004612b99565b610e93565b604080519283529015156020830152016102c6565b6103a06103fb366004612bc5565b611034565b6102ba61040e366004612bef565b600a6020526000908152604090205460ff1681565b60095474010000000000000000000000000000000000000000900460ff166102ba565b610368600281565b6103a061045c366004612a60565b61151e565b61033460045481565b604080518082018252600381527f47696e000000000000000000000000000000000000000000000000000000000060209182015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fb4e677c45e470714c0e73654b8e28fc2bbe115e24490a0cf4f32f73a57d2f7c3818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c09091019092528151910120610334565b61033461054a366004612a60565b60016020526000908152604090205481565b6103a061167e565b600b546103689060ff1681565b61033461057f366004612a60565b60056020526000908152604090205481565b60085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c6565b61030b6040518060400160405280600481526020017f2467696e0000000000000000000000000000000000000000000000000000000081525081565b6102ba61061a366004612af7565b611718565b6009546105ab9073ffffffffffffffffffffffffffffffffffffffff1681565b6103a061064d366004612c08565b61179d565b6102ba610660366004612cfd565b611869565b6102ba610673366004612a60565b611a7c565b6102ba610686366004612a60565b611bc3565b6102ba610699366004612d77565b611ce8565b6103a06106ac366004612ddf565b611fa5565b6103346106bf366004612bc5565b600260209081526000928352604080842090915290825290205481565b6102ba6106ea366004612e49565b612290565b6102ba6106fd366004612a60565b60066020526000908152604090205460ff1681565b6102ba610720366004612a60565b6123b4565b6103a0610733366004612a60565b612491565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107a09086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610846576108148382612e9a565b73ffffffffffffffffffffffffffffffffffffffff861660009081526002602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85166000908152600160205260408120805485929061087b908490612e9a565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260016020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906108e39087815260200190565b60405180910390a3506001949350505050565b60085460009073ffffffffffffffffffffffffffffffffffffffff16331461098b5760405162461bcd60e51b815260206004820152602560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b600260ff831610156109df5760405162461bcd60e51b815260206004820152601260248201527f534947535f42454c4f575f4d494e494d554d00000000000000000000000000006044820152606401610982565b600b5460405160ff8085169216907f21596c7db24a03f853c8e10ac11e0ae5a92687d80b75f0bcfdee111eba70cb3090600090a350600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316179055805b919050565b60085460009073ffffffffffffffffffffffffffffffffffffffff163314610ad85760405162461bcd60e51b815260206004820152602560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610982565b60405160019073ffffffffffffffffffffffffffffffffffffffff8416907febe501dabdf217b50ee62204834587d68f48f19608aba6ef6bc270dc0441a5d490600090a36107ac826125b0565b60085473ffffffffffffffffffffffffffffffffffffffff163314610bb25760405162461bcd60e51b815260206004820152602560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610982565b73ffffffffffffffffffffffffffffffffffffffff8116610c3b5760405162461bcd60e51b815260206004820152602760248201527f4f776e61626c653a206e6577204b656570657220697320746865207a65726f2060448201527f61646472657373000000000000000000000000000000000000000000000000006064820152608401610982565b60095460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f9097747ed48b5dd443be38e301bbacc0183d965854f4e1fcb64583b429dcc88a90600090a3600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006003544614610da55750604080518082018252600381527f47696e000000000000000000000000000000000000000000000000000000000060209182015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fb4e677c45e470714c0e73654b8e28fc2bbe115e24490a0cf4f32f73a57d2f7c3818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b5060045490565b6000610db6612656565b3360009081526007602052604090205460ff161515600114610e3f5760405162461bcd60e51b8152602060048201526024808201527f4d494e54544f5f464f525f54495053595354414b455f434f4e5452414354535f60448201527f4f4e4c59000000000000000000000000000000000000000000000000000000006064820152608401610982565b610e4983836126c1565b60405182815273ffffffffffffffffffffffffffffffffffffffff84169033907fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8906020016107a0565b6000803373ffffffffffffffffffffffffffffffffffffffff16610ecc60085473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff161480610f05575060095473ffffffffffffffffffffffffffffffffffffffff1633145b610f775760405162461bcd60e51b815260206004820152603560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e6572206f72206e6f742061206b656570657200000000000000000000006064820152608401610982565b468403610fc65760405162461bcd60e51b815260206004820152601860248201527f544f5f46524f4d5f434841494e5f4944454e54494354414c00000000000000006044820152606401610982565b6000848152600a602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168615159081179091559051909186917f60f144686fc70289089a845980af3580ac4a213fd92a33fd2ab95ef8eb0b79399190a3509192909150565b600954760100000000000000000000000000000000000000000000900460ff1661107d576009547501000000000000000000000000000000000000000000900460ff1615611081565b303b155b6110f35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610982565b600954760100000000000000000000000000000000000000000000900460ff1615801561115c57600980547fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff167601010000000000000000000000000000000000000000001790555b6040517f47696e00000000000000000000000000000000000000000000000000000000006020820152602301604051602081830303815290604052805190602001206040518060400160405280600381526020017f47696e00000000000000000000000000000000000000000000000000000000008152506040516020016111e49190612ead565b60405160208183030381529060405280519060200120146112475760405162461bcd60e51b815260206004820152601660248201527f496e69743a20436f6e737420636865636b204e414d45000000000000000000006044820152606401610982565b6040517f2467696e000000000000000000000000000000000000000000000000000000006020820152602401604051602081830303815290604052805190602001206040518060400160405280600481526020017f2467696e000000000000000000000000000000000000000000000000000000008152506040516020016112cf9190612ead565b60405160208183030381529060405280519060200120146113325760405162461bcd60e51b815260206004820152601860248201527f496e69743a20436f6e737420636865636b2053594d424f4c00000000000000006044820152606401610982565b73ffffffffffffffffffffffffffffffffffffffff83166113955760405162461bcd60e51b815260206004820152601f60248201527f496e69743a206b65657065722063616e277420626520302061646472657373006044820152606401610982565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790556113de3361151e565b466003556114b5604080518082018252600381527f47696e000000000000000000000000000000000000000000000000000000000060209182015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fb4e677c45e470714c0e73654b8e28fc2bbe115e24490a0cf4f32f73a57d2f7c3818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b6004556114c260026108f6565b5073ffffffffffffffffffffffffffffffffffffffff8216156114ea576114e882610a48565b505b801561151957600980547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1690555b505050565b60085473ffffffffffffffffffffffffffffffffffffffff16156115845760405162461bcd60e51b815260206004820152601a60248201527f4f776e61626c653a206f776e657220616c7265616479207365740000000000006044820152606401610982565b73ffffffffffffffffffffffffffffffffffffffff811661160d5760405162461bcd60e51b815260206004820152602560248201527f4f776e61626c653a206e6577206f776e65722063616e2774206265203020616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610982565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350565b60085473ffffffffffffffffffffffffffffffffffffffff16331461170b5760405162461bcd60e51b815260206004820152602560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610982565b61171661dead612739565b565b33600090815260016020526040812080548391908390611739908490612e9a565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260016020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906107a09086815260200190565b60085473ffffffffffffffffffffffffffffffffffffffff163314806117da575060095473ffffffffffffffffffffffffffffffffffffffff1633145b61184c5760405162461bcd60e51b815260206004820152603560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e6572206f72206e6f742061206b656570657200000000000000000000006064820152608401610982565b8015156001036118615761185e6127b0565b50565b61185e612849565b6000611873612656565b428410156118c35760405162461bcd60e51b815260206004820152601560248201527f4d494e545f444541444c494e455f4558504952454400000000000000000000006044820152606401610982565b60006118cd610cc9565b73ffffffffffffffffffffffffffffffffffffffff8916600090815260056020526040812080547f79a9ea266339426f606bcdebf8e70eab0def749a35ce5b0d1755c30cecebd23c928c928c928c9290919061192883612ec9565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810187905260e0810186905261010001604051602081830303815290604052805190602001206040516020016119d19291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120600b54909150611a1e908990839060ff1686611ce8565b50611a2987876126c1565b83868873ffffffffffffffffffffffffffffffffffffffff167f806bc37112176c187cccea4249aea74827b609b5e40d595301442638bfd5736760405160405180910390a4506001979650505050505050565b60085460009073ffffffffffffffffffffffffffffffffffffffff16331480611abc575060095473ffffffffffffffffffffffffffffffffffffffff1633145b611b2e5760405162461bcd60e51b815260206004820152603560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e6572206f72206e6f742061206b656570657200000000000000000000006064820152608401610982565b60405160009073ffffffffffffffffffffffffffffffffffffffff8416907fc538b50375ebb3f8a9e36594a17d25bd0fcd9a932f5cf142a9e37c9b9dab7605908390a373ffffffffffffffffffffffffffffffffffffffff8216600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560016107ac565b60085460009073ffffffffffffffffffffffffffffffffffffffff163314611c535760405162461bcd60e51b815260206004820152602560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610982565b60405160009073ffffffffffffffffffffffffffffffffffffffff8416907febe501dabdf217b50ee62204834587d68f48f19608aba6ef6bc270dc0441a5d4908390a373ffffffffffffffffffffffffffffffffffffffff8216600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560016107ac565b6000611cf5836041612f01565b60ff16825114611d475760405162461bcd60e51b815260206004820152601960248201527f5349475f4c454e4754485f434f554e545f4d49534d41544348000000000000006044820152606401610982565b60008080808080805b8960ff16821015611f405760418281028a0160208101516040820151919092015160ff1696509094509250601b851480611d8d57508460ff16601c145b611dd95760405162461bcd60e51b815260206004820181905260248201527f5a4950445f4f525f434f4e54524143545f4b45595f554e535550504f525445446044820152606401610982565b6040805160008152602081018083528d905260ff871691810191909152606081018590526080810184905260019060a0016020604051602081039080840390855afa158015611e2c573d6000803e3d6000fd5b5050506020604051035195508673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16118015611e9d575073ffffffffffffffffffffffffffffffffffffffff861660009081526006602052604090205460ff1615156001145b611ee95760405162461bcd60e51b815260206004820152601060248201527f5349475f434845434b5f4641494c4544000000000000000000000000000000006044820152606401610982565b8b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611f2a5780611f2681612f2a565b9150505b8596508180611f3890612ec9565b925050611d50565b8060ff16600114611f935760405162461bcd60e51b815260206004820152601560248201527f4d494e5445525f4e4f545f494e5f5349475f53455400000000000000000000006044820152606401610982565b5060019b9a5050505050505050505050565b42841015611ff55760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610982565b60006001612001610cc9565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015612153573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906121ce57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61221a5760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f5349474e45520000000000000000000000000000000000006044820152606401610982565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526002602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600061229a612656565b6000828152600a602052604090205460ff166122f85760405162461bcd60e51b815260206004820152601660248201527f434841494e5f4e4f545945545f535550504f52544544000000000000000000006044820152606401610982565b6123033330856107b2565b61234f5760405162461bcd60e51b815260206004820181905260248201527f4445504f5349545f4641494c45445f434845434b5f42414c5f415050524f56456044820152606401610982565b61235930846128a0565b81833373ffffffffffffffffffffffffffffffffffffffff167f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e466040516123a391815260200190565b60405180910390a450600192915050565b60085460009073ffffffffffffffffffffffffffffffffffffffff1633146124445760405162461bcd60e51b815260206004820152602560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610982565b60405160019073ffffffffffffffffffffffffffffffffffffffff8416907fc538b50375ebb3f8a9e36594a17d25bd0fcd9a932f5cf142a9e37c9b9dab760590600090a36107ac8261292b565b60085473ffffffffffffffffffffffffffffffffffffffff16331461251e5760405162461bcd60e51b815260206004820152602560248201527f54697073794f776e61626c653a2063616c6c6572206973206e6f74207468652060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610982565b73ffffffffffffffffffffffffffffffffffffffff81166125a75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610982565b61185e81612739565b6000813b806126015760405162461bcd60e51b815260206004820152601b60248201527f434f4e54524143544d494e5445525f4e4f545f434f4e545241435400000000006044820152606401610982565b505073ffffffffffffffffffffffffffffffffffffffff16600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915590565b60095474010000000000000000000000000000000000000000900460ff16156117165760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610982565b806000808282546126d29190612f49565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127b8612656565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861281f3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6128516129d2565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361281f565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040812080548392906128d5908490612e9a565b909155505060008054829003815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161272d565b6000813b801561297d5760405162461bcd60e51b815260206004820152600e60248201527f5349474e45525f4e4f545f454f410000000000000000000000000000000000006044820152606401610982565b505073ffffffffffffffffffffffffffffffffffffffff16600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915590565b60095474010000000000000000000000000000000000000000900460ff166117165760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610982565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a4357600080fd5b600060208284031215612a7257600080fd5b612a7b82612a3c565b9392505050565b60005b83811015612a9d578181015183820152602001612a85565b50506000910152565b6020815260008251806020840152612ac5816040850160208701612a82565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060408385031215612b0a57600080fd5b612b1383612a3c565b946020939093013593505050565b600080600060608486031215612b3657600080fd5b612b3f84612a3c565b9250612b4d60208501612a3c565b9150604084013590509250925092565b803560ff81168114610a4357600080fd5b600060208284031215612b8057600080fd5b612a7b82612b5d565b80358015158114610a4357600080fd5b60008060408385031215612bac57600080fd5b82359150612bbc60208401612b89565b90509250929050565b60008060408385031215612bd857600080fd5b612be183612a3c565b9150612bbc60208401612a3c565b600060208284031215612c0157600080fd5b5035919050565b600060208284031215612c1a57600080fd5b612a7b82612b89565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112612c6357600080fd5b813567ffffffffffffffff80821115612c7e57612c7e612c23565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612cc457612cc4612c23565b81604052838152866020858801011115612cdd57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c08789031215612d1657600080fd5b612d1f87612a3c565b9550612d2d60208801612a3c565b945060408701359350606087013592506080870135915060a087013567ffffffffffffffff811115612d5e57600080fd5b612d6a89828a01612c52565b9150509295509295509295565b60008060008060808587031215612d8d57600080fd5b612d9685612a3c565b935060208501359250612dab60408601612b5d565b9150606085013567ffffffffffffffff811115612dc757600080fd5b612dd387828801612c52565b91505092959194509250565b600080600080600080600060e0888a031215612dfa57600080fd5b612e0388612a3c565b9650612e1160208901612a3c565b95506040880135945060608801359350612e2d60808901612b5d565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612e5c57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156107ac576107ac612e6b565b60008251612ebf818460208701612a82565b9190910192915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612efa57612efa612e6b565b5060010190565b600060ff821660ff84168160ff0481118215151615612f2257612f22612e6b565b029392505050565b600060ff821660ff8103612f4057612f40612e6b565b60010192915050565b808201808211156107ac576107ac612e6b56fea26469706673582212204df062ce4a728db409b68ffa83f0a34c19327d770669675260d855e15c1f5eee64736f6c63430008100033
Deployed Bytecode Sourcemap
30773:7553:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21373:47;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;571:14:1;;564:22;546:41;;534:2;519:18;21373:47:0;;;;;;;;20133:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23207:217::-;;;;;;:::i;:::-;;:::i;20447:26::-;;;;;;;;;1718:25:1;;;1706:2;1691:18;20447:26:0;1572:177:1;23825:578:0;;;;;;:::i;:::-;;:::i;34509:271::-;;;;;;:::i;:::-;;:::i;:::-;;;2607:4:1;2595:17;;;2577:36;;2565:2;2550:18;34509:271:0;2435:184:1;33677::0;;;;;;:::i;:::-;;:::i;17598:249::-;;;;;;:::i;:::-;;:::i;:::-;;20220:35;;20253:2;20220:35;;29111:179;;;:::i;35465:343::-;;;;;;:::i;:::-;;:::i;34788:332::-;;;;;;:::i;:::-;;:::i;:::-;;;;3392:25:1;;;3460:14;;3453:22;3448:2;3433:18;;3426:50;3365:18;34788:332:0;3224:258:1;32439:1044:0;;;;;;:::i;:::-;;:::i;31732:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;14329:86;14400:7;;;;;;;14329:86;;21427:34;;21460:1;21427:34;;18206:303;;;;;;:::i;:::-;;:::i;21050:39::-;;;;;;29298:455;29596:4;;;;;;;;;;;;;;;;;29429:301;;29462:95;29429:301;;;14085:25:1;29580:22:0;14126:18:1;;;14119:34;29625:14:0;14169:18:1;;;14162:34;29662:13:0;14212:18:1;;;14205:34;29706:4:0;14255:19:1;;;;14248:84;;;;29429:301:0;;;;;;;;;;14057:19:1;;;;29429:301:0;;;29401:344;;;;;29298:455;;20480:44;;;;;;:::i;:::-;;;;;;;;;;;;;;17086:146;;;:::i;31786:25::-;;;;;;;;;21096:41;;;;;;:::i;:::-;;;;;;;;;;;;;;16243:87;16316:6;;;;16243:87;;;4113:42:1;4101:55;;;4083:74;;4071:2;4056:18;16243:87:0;3937:226:1;20175:38:0;;;;;;;;;;;;;;;;;;;;;23432:385;;;;;;:::i;:::-;;:::i;15540:21::-;;;;;;;;;35128:133;;;;;;:::i;:::-;;:::i;37100:1221::-;;;;;;:::i;:::-;;:::i;34053:188::-;;;;;;:::i;:::-;;:::i;34313:::-;;;;;;:::i;:::-;;:::i;24744:1272::-;;;;;;:::i;:::-;;:::i;27654:1449::-;;;;;;:::i;:::-;;:::i;20531:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;36495:401;;;;;;:::i;:::-;;:::i;21323:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33869:176;;;;;;:::i;:::-;;:::i;17387:203::-;;;;;;:::i;:::-;;:::i;23207:217::-;23308:10;23281:4;23298:21;;;:9;:21;;;;;;;;;:30;;;;;;;;;;:39;;;23355:37;23281:4;;23298:30;;23355:37;;;;23331:6;1718:25:1;;1706:2;1691:18;;1572:177;23355:37:0;;;;;;;;-1:-1:-1;23412:4:0;23207:217;;;;;:::o;23825:578::-;23948:15;;;23913:4;23948:15;;;:9;:15;;;;;;;;23964:10;23948:27;;;;;;;;24039:17;24028:28;;24024:80;;24088:16;24098:6;24088:7;:16;:::i;:::-;24058:15;;;;;;;:9;:15;;;;;;;;24074:10;24058:27;;;;;;;:46;24024:80;24117:15;;;;;;;:9;:15;;;;;:25;;24136:6;;24117:15;:25;;24136:6;;24117:25;:::i;:::-;;;;-1:-1:-1;;24293:13:0;;;;;;;;:9;:13;;;;;;;:23;;;;;;24345:26;24293:13;;24345:26;;;;;;;24310:6;1718:25:1;;1706:2;1691:18;;1572:177;24345:26:0;;;;;;;;-1:-1:-1;24391:4:0;;23825:578;-1:-1:-1;;;;23825:578:0:o;34509:271::-;16316:6;;34579:5;;16463:23;16316:6;12522:10;16463:23;16455:73;;;;-1:-1:-1;;;16455:73:0;;7930:2:1;16455:73:0;;;7912:21:1;7969:2;7949:18;;;7942:30;8008:34;7988:18;;;7981:62;8079:7;8059:18;;;8052:35;8104:19;;16455:73:0;;;;;;;;;21460:1:::1;34605:23;::::0;::::1;;;34597:54;;;::::0;-1:-1:-1;;;34597:54:0;;8336:2:1;34597:54:0::1;::::0;::::1;8318:21:1::0;8375:2;8355:18;;;8348:30;8414:20;8394:18;;;8387:48;8452:18;;34597:54:0::1;8134:342:1::0;34597:54:0::1;34680:12;::::0;34667:39:::1;::::0;::::1;::::0;;::::1;::::0;34680:12:::1;::::0;34667:39:::1;::::0;34680:12:::1;::::0;34667:39:::1;-1:-1:-1::0;34717:12:0::1;:26:::0;;;::::1;;::::0;::::1;;::::0;;;16539:1:::1;34509:271:::0;;;:::o;33677:184::-;16316:6;;33747:4;;16463:23;16316:6;12522:10;16463:23;16455:73;;;;-1:-1:-1;;;16455:73:0;;7930:2:1;16455:73:0;;;7912:21:1;7969:2;7949:18;;;7942:30;8008:34;7988:18;;;7981:62;8079:7;8059:18;;;8052:35;8104:19;;16455:73:0;7728:401:1;16455:73:0;33769:36:::1;::::0;33800:4:::1;::::0;33769:36:::1;::::0;::::1;::::0;::::1;::::0;;;::::1;33823:30;33842:10;33823:18;:30::i;17598:249::-:0;16316:6;;16463:23;16316:6;12522:10;16463:23;16455:73;;;;-1:-1:-1;;;16455:73:0;;7930:2:1;16455:73:0;;;7912:21:1;7969:2;7949:18;;;7942:30;8008:34;7988:18;;;7981:62;8079:7;8059:18;;;8052:35;8104:19;;16455:73:0;7728:401:1;16455:73:0;17688:24:::1;::::0;::::1;17680:76;;;::::0;-1:-1:-1;;;17680:76:0;;8683:2:1;17680:76:0::1;::::0;::::1;8665:21:1::0;8722:2;8702:18;;;8695:30;8761:34;8741:18;;;8734:62;8832:9;8812:18;;;8805:37;8859:19;;17680:76:0::1;8481:403:1::0;17680:76:0::1;17790:6;::::0;17772:37:::1;::::0;::::1;::::0;;::::1;::::0;17790:6:::1;::::0;17772:37:::1;::::0;17790:6:::1;::::0;17772:37:::1;17820:6;:19:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;17598:249::o;29111:179::-;29168:7;29212:16;;29195:13;:33;:87;;-1:-1:-1;29596:4:0;;;;;;;;;;;;;;;;;29429:301;;29462:95;29429:301;;;14085:25:1;29580:22:0;14126:18:1;;;14119:34;29625:14:0;14169:18:1;;;14162:34;29662:13:0;14212:18:1;;;14205:34;29706:4:0;14255:19:1;;;;14248:84;;;;29429:301:0;;;;;;;;;;14057:19:1;;;;29429:301:0;;;29401:344;;;;;;29111:179::o;29195:87::-;-1:-1:-1;29231:24:0;;;29111:179::o;35465:343::-;35541:4;13934:19;:17;:19::i;:::-;35582:10:::1;35566:27;::::0;;;:15:::1;:27;::::0;;;;;::::1;;:35;;:27:::0;:35:::1;35558:84;;;::::0;-1:-1:-1;;;35558:84:0;;9091:2:1;35558:84:0::1;::::0;::::1;9073:21:1::0;9130:2;9110:18;;;9103:30;9169:34;9149:18;;;9142:62;9240:6;9220:18;;;9213:34;9264:19;;35558:84:0::1;8889:400:1::0;35558:84:0::1;35653:19;35659:3;35664:7;35653:5;:19::i;:::-;35688:30;::::0;1718:25:1;;;35688:30:0::1;::::0;::::1;::::0;35693:10:::1;::::0;35688:30:::1;::::0;1706:2:1;1691:18;35688:30:0::1;1572:177:1::0;34788:332:0;34885:7;;12522:10;16607:23;;:7;16316:6;;;;;16243:87;16607:7;:23;;;:49;;;-1:-1:-1;16634:6:0;;:22;:6;12522:10;16634:22;16607:49;16599:115;;;;-1:-1:-1;;;16599:115:0;;9496:2:1;16599:115:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:34;9554:18;;;9547:62;9645:23;9625:18;;;9618:51;9686:19;;16599:115:0;9294:417:1;16599:115:0;34931:13:::1;34919:8;:25:::0;34911:62:::1;;;::::0;-1:-1:-1;;;34911:62:0;;9918:2:1;34911:62:0::1;::::0;::::1;9900:21:1::0;9957:2;9937:18;;;9930:30;9996:26;9976:18;;;9969:54;10040:18;;34911:62:0::1;9716:348:1::0;34911:62:0::1;34984:25;::::0;;;:15:::1;:25;::::0;;;;;:38;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;35038:34;;34984:38;;:25;;35038:34:::1;::::0;34984:25;35038:34:::1;-1:-1:-1::0;35091:8:0;;35101:10;;-1:-1:-1;34788:332:0:o;32439:1044::-;10950:13;;;;;;;:48;;10986:12;;;;;;;10985:13;10950:48;;;11742:4;1565:19;:23;10966:16;10942:107;;;;-1:-1:-1;;;10942:107:0;;10271:2:1;10942:107:0;;;10253:21:1;10310:2;10290:18;;;10283:30;10349:34;10329:18;;;10322:62;10420:16;10400:18;;;10393:44;10454:19;;10942:107:0;10069:410:1;10942:107:0;11085:13;;;;;;;11084:14;11109:101;;;;11144:13;:20;;11179:19;;;;;;11109:101;32659:23:::1;::::0;11053:5:1;32659:23:0::1;::::0;::::1;11041:18:1::0;11075:11;;32659:23:0::1;;;;;;;;;;;;32649:34;;;;;;32639:4;;;;;;;;;;;;;;;;::::0;32622:22:::1;;;;;;;;:::i;:::-;;;;;;;;;;;;;32612:33;;;;;;:71;32604:106;;;::::0;-1:-1:-1;;;32604:106:0;;11593:2:1;32604:106:0::1;::::0;::::1;11575:21:1::0;11632:2;11612:18;;;11605:30;11671:24;11651:18;;;11644:52;11713:18;;32604:106:0::1;11391:346:1::0;32604:106:0::1;32782:24;::::0;11956:6:1;32782:24:0::1;::::0;::::1;11944:19:1::0;11979:11;;32782:24:0::1;;;;;;;;;;;;32772:35;;;;;;32760:6;;;;;;;;;;;;;;;;::::0;32743:24:::1;;;;;;;;:::i;:::-;;;;;;;;;;;;;32733:35;;;;;;:74;32725:111;;;::::0;-1:-1:-1;;;32725:111:0;;12203:2:1;32725:111:0::1;::::0;::::1;12185:21:1::0;12242:2;12222:18;;;12215:30;12281:26;12261:18;;;12254:54;12325:18;;32725:111:0::1;12001:348:1::0;32725:111:0::1;32922:21;::::0;::::1;32914:65;;;::::0;-1:-1:-1;;;32914:65:0;;12907:2:1;32914:65:0::1;::::0;::::1;12889:21:1::0;12946:2;12926:18;;;12919:30;12985:33;12965:18;;;12958:61;13036:18;;32914:65:0::1;12705:355:1::0;32914:65:0::1;32994:6;:16:::0;;;::::1;;::::0;::::1;;::::0;;33132:25:::1;33146:10;33132:13;:25::i;:::-;33191:13;33172:16;:32:::0;33246:24:::1;29596:4:::0;;;;;;;;;;;;;;;;;29429:301;;29462:95;29429:301;;;14085:25:1;29580:22:0;14126:18:1;;;14119:34;29625:14:0;14169:18:1;;;14162:34;29662:13:0;14212:18:1;;;14205:34;29706:4:0;14255:19:1;;;;14248:84;;;;29429:301:0;;;;;;;;;;14057:19:1;;;;29429:301:0;;;29401:344;;;;;;29298:455;33246:24:::1;33219;:51:::0;33285:25:::1;21460:1;33285:15;:25::i;:::-;-1:-1:-1::0;33411:30:0::1;::::0;::::1;::::0;33407:68:::1;;33443:32;33458:16;33443:14;:32::i;:::-;;33407:68;11240:14:::0;11236:68;;;11271:13;:21;;;;;;11236:68;10657:654;32439:1044;;:::o;18206:303::-;18281:6;;:20;:6;:20;18273:59;;;;-1:-1:-1;;;18273:59:0;;13267:2:1;18273:59:0;;;13249:21:1;13306:2;13286:18;;;13279:30;13345:28;13325:18;;;13318:56;13391:18;;18273:59:0;13065:350:1;18273:59:0;18351:22;;;18343:72;;;;-1:-1:-1;;;18343:72:0;;13622:2:1;18343:72:0;;;13604:21:1;13661:2;13641:18;;;13634:30;13700:34;13680:18;;;13673:62;13771:7;13751:18;;;13744:35;13796:19;;18343:72:0;13420:401:1;18343:72:0;18426:6;:17;;;;;;;;;;;;;18459:42;;-1:-1:-1;;18459:42:0;;-1:-1:-1;;18459:42:0;18206:303;:::o;17086:146::-;16316:6;;16463:23;16316:6;12522:10;16463:23;16455:73;;;;-1:-1:-1;;;16455:73:0;;7930:2:1;16455:73:0;;;7912:21:1;7969:2;7949:18;;;7942:30;8008:34;7988:18;;;7981:62;8079:7;8059:18;;;8052:35;8104:19;;16455:73:0;7728:401:1;16455:73:0;17153:71:::1;17180:42;17153:18;:71::i;:::-;17086:146::o:0;23432:385::-;23529:10;23502:4;23519:21;;;:9;:21;;;;;:31;;23544:6;;23519:21;23502:4;;23519:31;;23544:6;;23519:31;:::i;:::-;;;;-1:-1:-1;;23701:13:0;;;;;;;:9;:13;;;;;;;:23;;;;;;23753:32;23762:10;;23753:32;;;;23718:6;1718:25:1;;1706:2;1691:18;;1572:177;35128:133:0;16316:6;;16607:23;16316:6;12522:10;16607:23;;:49;;-1:-1:-1;16634:6:0;;:22;:6;12522:10;16634:22;16607:49;16599:115;;;;-1:-1:-1;;;16599:115:0;;9496:2:1;16599:115:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:34;9554:18;;;9547:62;9645:23;9625:18;;;9618:51;9686:19;;16599:115:0;9294:417:1;16599:115:0;35202:15;::::1;;35213:4;35202:15:::0;35198:55:::1;;35219:8;:6;:8::i;:::-;35128:133:::0;:::o;35198:55::-:1;35243:10;:8;:10::i;37100:1221::-:0;37262:4;13934:19;:17;:19::i;:::-;37299:15:::1;37287:8;:27;;37279:61;;;::::0;-1:-1:-1;;;37279:61:0;;14545:2:1;37279:61:0::1;::::0;::::1;14527:21:1::0;14584:2;14564:18;;;14557:30;14623:23;14603:18;;;14596:51;14664:18;;37279:61:0::1;14343:345:1::0;37279:61:0::1;37351:16;37502:18;:16;:18::i;:::-;37958:14;::::0;::::1;;::::0;;;:6:::1;:14;::::0;;;;:16;;37620:200:::1;::::0;37851:6;;37888:2;;37921:6;;37958:16;;:14;:16:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;37579:504:0::1;::::0;;::::1;::::0;::::1;15208:25:1::0;;;;15252:42;15330:15;;;15310:18;;;15303:43;15382:15;;;;15362:18;;;15355:43;15414:18;;;15407:34;15457:19;;;15450:35;15501:19;;;15494:35;;;15545:19;;;15538:35;;;15180:19;;37579:504:0::1;;;;;;;;;;;;37543:563;;;;;;37430:695;;;;;;;;15854:66:1::0;15842:79;;15946:1;15937:11;;15930:27;;;;15982:2;15973:12;;15966:28;16019:2;16010:12;;15584:444;37430:695:0::1;;::::0;;;;;::::1;::::0;;;;;;37402:738;;37430:695:::1;37402:738:::0;;::::1;::::0;38186:12:::1;::::0;37402:738;;-1:-1:-1;38151:60:0::1;::::0;38168:6;;37402:738;;38186:12:::1;;38200:10:::0;38151:16:::1;:60::i;:::-;;38222:17;38228:2;38232:6;38222:5;:17::i;:::-;38278:12;38270:6;38266:2;38255:36;;;;;;;;;;;;-1:-1:-1::0;38309:4:0::1;::::0;37100:1221;-1:-1:-1;;;;;;;37100:1221:0:o;34053:188::-;16316:6;;34129:4;;16607:23;16316:6;12522:10;16607:23;;:49;;-1:-1:-1;16634:6:0;;:22;:6;12522:10;16634:22;16607:49;16599:115;;;;-1:-1:-1;;;16599:115:0;;9496:2:1;16599:115:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:34;9554:18;;;9547:62;9645:23;9625:18;;;9618:51;9686:19;;16599:115:0;9294:417:1;16599:115:0;34151:35:::1;::::0;34180:5:::1;::::0;34151:35:::1;::::0;::::1;::::0;::::1;::::0;34180:5;;34151:35:::1;22948:27:::0;;;22931:4;22948:27;;;:11;:27;;;;;:35;;;;;;-1:-1:-1;34204:29:0::1;22854:159:::0;34313:188;16316:6;;34383:4;;16463:23;16316:6;12522:10;16463:23;16455:73;;;;-1:-1:-1;;;16455:73:0;;7930:2:1;16455:73:0;;;7912:21:1;7969:2;7949:18;;;7942:30;8008:34;7988:18;;;7981:62;8079:7;8059:18;;;8052:35;8104:19;;16455:73:0;7728:401:1;16455:73:0;34405:37:::1;::::0;34436:5:::1;::::0;34405:37:::1;::::0;::::1;::::0;::::1;::::0;34436:5;;34405:37:::1;22393:31:::0;;;22376:4;22393:31;;;:15;:31;;;;;:39;;;;;;-1:-1:-1;34460:33:0::1;22295:167:::0;24744:1272;24871:4;24985:18;:13;25001:2;24985:18;:::i;:::-;24964:39;;:10;:17;:39;24956:77;;;;-1:-1:-1;;;24956:77:0;;16478:2:1;24956:77:0;;;16460:21:1;16517:2;16497:18;;;16490:30;16556:27;16536:18;;;16529:55;16601:18;;24956:77:0;16276:349:1;24956:77:0;25097:17;;;;;;;25281:639;25297:13;25293:17;;:1;:17;25281:639;;;26950:4;26946:14;;;26985:40;;27019:4;26985:40;;26979:47;27085:4;27051:40;;27045:47;27392:40;;;;27386:47;27435:4;27382:58;;-1:-1:-1;26979:47:0;;-1:-1:-1;27045:47:0;-1:-1:-1;25498:2:0;25493:7;;;:18;;;25504:1;:7;;25509:2;25504:7;25493:18;25484:64;;;;-1:-1:-1;;;25484:64:0;;16832:2:1;25484:64:0;;;16814:21:1;;;16851:18;;;16844:30;16910:34;16890:18;;;16883:62;16962:18;;25484:64:0;16630:356:1;25484:64:0;25578:28;;;;;;;;;;;;17218:25:1;;;17291:4;17279:17;;17259:18;;;17252:45;;;;17313:18;;;17306:34;;;17356:18;;;17349:34;;;25578:28:0;;17190:19:1;;25578:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25563:43;;25726:9;25711:24;;:12;:24;;;:61;;;;-1:-1:-1;25739:25:0;;;;;;;:11;:25;;;;;;;;:33;;:25;:33;25711:61;25703:90;;;;-1:-1:-1;;;25703:90:0;;17596:2:1;25703:90:0;;;17578:21:1;17635:2;17615:18;;;17608:30;17674:18;17654;;;17647:46;17710:18;;25703:90:0;17394:340:1;25703:90:0;25830:6;25814:22;;:12;:22;;;25810:41;;25838:13;;;;:::i;:::-;;;;25810:41;25878:12;25866:24;;25312:3;;;;;:::i;:::-;;;;25281:639;;;25940:11;:16;;25955:1;25940:16;25932:50;;;;-1:-1:-1;;;25932:50:0;;18121:2:1;25932:50:0;;;18103:21:1;18160:2;18140:18;;;18133:30;18199:23;18179:18;;;18172:51;18240:18;;25932:50:0;17919:345:1;25932:50:0;-1:-1:-1;26000:4:0;;24744:1272;-1:-1:-1;;;;;;;;;;;24744:1272:0:o;27654:1449::-;27812:15;27800:8;:27;;27792:63;;;;-1:-1:-1;;;27792:63:0;;18471:2:1;27792:63:0;;;18453:21:1;18510:2;18490:18;;;18483:30;18549:25;18529:18;;;18522:53;18592:18;;27792:63:0;18269:347:1;27792:63:0;28023:24;28050:827;28190:18;:16;:18::i;:::-;28644:13;;;;;;;;:6;:13;;;;;;;;;:15;;;;;;;;28275:458;;28320:167;28275:458;;;18908:25:1;19010:18;;;19003:43;;;;19082:15;;;19062:18;;;19055:43;19114:18;;;19107:34;;;19157:19;;;19150:35;;;;19201:19;;;;19194:35;;;28275:458:0;;;;;;;;;;18880:19:1;;;28275:458:0;;;28235:525;;;;;;;;15854:66:1;28110:673:0;;;15842:79:1;15937:11;;;15930:27;;;;15973:12;;;15966:28;;;;16010:12;;28110:673:0;;;;;;;;;;;;;28078:724;;28110:673;28078:724;;;;28050:827;;;;;;;;;17218:25:1;17291:4;17279:17;;17259:18;;;17252:45;17313:18;;;17306:34;;;17356:18;;;17349:34;;;17190:19;;28050:827:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28050:827:0;;;;;;-1:-1:-1;;28900:30:0;;;;;;;:59;;;28954:5;28934:25;;:16;:25;;;28900:59;28892:86;;;;-1:-1:-1;;;28892:86:0;;19442:2:1;28892:86:0;;;19424:21:1;19481:2;19461:18;;;19454:30;19520:16;19500:18;;;19493:44;19554:18;;28892:86:0;19240:338:1;28892:86:0;28993:27;;;;;;;;:9;:27;;;;;;;;:36;;;;;;;;;;;;;:44;;;29064:31;1718:25:1;;;28993:36:0;;29064:31;;;;;1691:18:1;29064:31:0;;;;;;;27654:1449;;;;;;;:::o;36495:401::-;36578:4;13934:19;:17;:19::i;:::-;36603:24:::1;::::0;;;:15:::1;:24;::::0;;;;;::::1;;36595:59;;;::::0;-1:-1:-1;;;36595:59:0;;19785:2:1;36595:59:0::1;::::0;::::1;19767:21:1::0;19824:2;19804:18;;;19797:30;19863:24;19843:18;;;19836:52;19905:18;;36595:59:0::1;19583:346:1::0;36595:59:0::1;36673:48;36686:10;36706:4;36713:7;36673:12;:48::i;:::-;36665:93;;;::::0;-1:-1:-1;;;36665:93:0;;20136:2:1;36665:93:0::1;::::0;::::1;20118:21:1::0;;;20155:18;;;20148:30;20214:34;20194:18;;;20187:62;20266:18;;36665:93:0::1;19934:356:1::0;36665:93:0::1;36769:29;36783:4;36790:7;36769:5;:29::i;:::-;36858:7;36834;36822:10;36814:52;;;36843:13;36814:52;;;;1718:25:1::0;;1706:2;1691:18;;1572:177;36814:52:0::1;;;;;;;;-1:-1:-1::0;36884:4:0::1;36495:401:::0;;;;:::o;33869:176::-;16316:6;;33937:4;;16463:23;16316:6;12522:10;16463:23;16455:73;;;;-1:-1:-1;;;16455:73:0;;7930:2:1;16455:73:0;;;7912:21:1;7969:2;7949:18;;;7942:30;8008:34;7988:18;;;7981:62;8079:7;8059:18;;;8052:35;8104:19;;16455:73:0;7728:401:1;16455:73:0;33959:34:::1;::::0;33988:4:::1;::::0;33959:34:::1;::::0;::::1;::::0;::::1;::::0;;;::::1;34011:26;34026:10;34011:14;:26::i;17387:203::-:0;16316:6;;16463:23;16316:6;12522:10;16463:23;16455:73;;;;-1:-1:-1;;;16455:73:0;;7930:2:1;16455:73:0;;;7912:21:1;7969:2;7949:18;;;7942:30;8008:34;7988:18;;;7981:62;8079:7;8059:18;;;8052:35;8104:19;;16455:73:0;7728:401:1;16455:73:0;17478:22:::1;::::0;::::1;17470:73;;;::::0;-1:-1:-1;;;17470:73:0;;20497:2:1;17470:73:0::1;::::0;::::1;20479:21:1::0;20536:2;20516:18;;;20509:30;20575:34;20555:18;;;20548:62;20646:8;20626:18;;;20619:36;20672:19;;17470:73:0::1;20295:402:1::0;17470:73:0::1;17554:28;17573:8;17554:18;:28::i;21895:392::-:0;21969:4;22120:23;;22172:8;22164:48;;;;-1:-1:-1;;;22164:48:0;;20904:2:1;22164:48:0;;;20886:21:1;20943:2;20923:18;;;20916:30;20982:29;20962:18;;;20955:57;21029:18;;22164:48:0;20702:351:1;22164:48:0;-1:-1:-1;;22223:27:0;;;;;;:15;:27;;;;;:34;;;;22253:4;22223:34;;;;;;22253:4;21895:392::o;14488:108::-;14400:7;;;;;;;14558:9;14550:38;;;;-1:-1:-1;;;14550:38:0;;21260:2:1;14550:38:0;;;21242:21:1;21299:2;21279:18;;;21272:30;21338:18;21318;;;21311:46;21374:18;;14550:38:0;21058:340:1;29953:331:0;30039:6;30024:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;30194:13:0;;;;;;;:9;:13;;;;;;;;:23;;;;;;30244:32;1718:25:1;;;30244:32:0;;1691:18:1;30244:32:0;;;;;;;;29953:331;;:::o;18007:191::-;18100:6;;;;18117:17;;;;;;;;;;;18150:40;;18100:6;;;18117:17;18100:6;;18150:40;;18081:16;;18150:40;18070:128;18007:191;:::o;14925:118::-;13934:19;:17;:19::i;:::-;14985:7:::1;:14:::0;;;::::1;::::0;::::1;::::0;;15015:20:::1;15022:12;12522:10:::0;;12442:98;15022:12:::1;15015:20;::::0;4113:42:1;4101:55;;;4083:74;;4071:2;4056:18;15015:20:0::1;;;;;;;14925:118::o:0;15184:120::-;14193:16;:14;:16::i;:::-;15243:7:::1;:15:::0;;;::::1;::::0;;15274:22:::1;12522:10:::0;15283:12:::1;12442:98:::0;30292:334;30365:15;;;;;;;:9;:15;;;;;:25;;30384:6;;30365:15;:25;;30384:6;;30365:25;:::i;:::-;;;;-1:-1:-1;;30536:11:0;:21;;;;;;;30584:34;;1718:25:1;;;30584:34:0;;;;;;1706:2:1;1691:18;30584:34:0;1572:177:1;22474:372:0;22544:4;22695:23;;22747:9;;22739:36;;;;-1:-1:-1;;;22739:36:0;;21735:2:1;22739:36:0;;;21717:21:1;21774:2;21754:18;;;21747:30;21813:16;21793:18;;;21786:44;21847:18;;22739:36:0;21533:338:1;22739:36:0;-1:-1:-1;;22786:23:0;;;;;;:11;:23;;;;;:30;;;;22812:4;22786:30;;;;;;22812:4;22474:372::o;14673:108::-;14400:7;;;;;;;14732:41;;;;-1:-1:-1;;;14732:41:0;;22078:2:1;14732:41:0;;;22060:21:1;22117:2;22097:18;;;22090:30;22156:22;22136:18;;;22129:50;22196:18;;14732:41:0;21876:344:1;14:196;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;215:186;274:6;327:2;315:9;306:7;302:23;298:32;295:52;;;343:1;340;333:12;295:52;366:29;385:9;366:29;:::i;:::-;356:39;215:186;-1:-1:-1;;;215:186:1:o;598:250::-;683:1;693:113;707:6;704:1;701:13;693:113;;;783:11;;;777:18;764:11;;;757:39;729:2;722:10;693:113;;;-1:-1:-1;;840:1:1;822:16;;815:27;598:250::o;853:455::-;1002:2;991:9;984:21;965:4;1034:6;1028:13;1077:6;1072:2;1061:9;1057:18;1050:34;1093:79;1165:6;1160:2;1149:9;1145:18;1140:2;1132:6;1128:15;1093:79;:::i;:::-;1224:2;1212:15;1229:66;1208:88;1193:104;;;;1299:2;1189:113;;853:455;-1:-1:-1;;853:455:1:o;1313:254::-;1381:6;1389;1442:2;1430:9;1421:7;1417:23;1413:32;1410:52;;;1458:1;1455;1448:12;1410:52;1481:29;1500:9;1481:29;:::i;:::-;1471:39;1557:2;1542:18;;;;1529:32;;-1:-1:-1;;;1313:254:1:o;1754:328::-;1831:6;1839;1847;1900:2;1888:9;1879:7;1875:23;1871:32;1868:52;;;1916:1;1913;1906:12;1868:52;1939:29;1958:9;1939:29;:::i;:::-;1929:39;;1987:38;2021:2;2010:9;2006:18;1987:38;:::i;:::-;1977:48;;2072:2;2061:9;2057:18;2044:32;2034:42;;1754:328;;;;;:::o;2087:156::-;2153:20;;2213:4;2202:16;;2192:27;;2182:55;;2233:1;2230;2223:12;2248:182;2305:6;2358:2;2346:9;2337:7;2333:23;2329:32;2326:52;;;2374:1;2371;2364:12;2326:52;2397:27;2414:9;2397:27;:::i;2806:160::-;2871:20;;2927:13;;2920:21;2910:32;;2900:60;;2956:1;2953;2946:12;2971:248;3036:6;3044;3097:2;3085:9;3076:7;3072:23;3068:32;3065:52;;;3113:1;3110;3103:12;3065:52;3149:9;3136:23;3126:33;;3178:35;3209:2;3198:9;3194:18;3178:35;:::i;:::-;3168:45;;2971:248;;;;;:::o;3487:260::-;3555:6;3563;3616:2;3604:9;3595:7;3591:23;3587:32;3584:52;;;3632:1;3629;3622:12;3584:52;3655:29;3674:9;3655:29;:::i;:::-;3645:39;;3703:38;3737:2;3726:9;3722:18;3703:38;:::i;3752:180::-;3811:6;3864:2;3852:9;3843:7;3839:23;3835:32;3832:52;;;3880:1;3877;3870:12;3832:52;-1:-1:-1;3903:23:1;;3752:180;-1:-1:-1;3752:180:1:o;4168:::-;4224:6;4277:2;4265:9;4256:7;4252:23;4248:32;4245:52;;;4293:1;4290;4283:12;4245:52;4316:26;4332:9;4316:26;:::i;4353:184::-;4405:77;4402:1;4395:88;4502:4;4499:1;4492:15;4526:4;4523:1;4516:15;4542:777;4584:5;4637:3;4630:4;4622:6;4618:17;4614:27;4604:55;;4655:1;4652;4645:12;4604:55;4691:6;4678:20;4717:18;4754:2;4750;4747:10;4744:36;;;4760:18;;:::i;:::-;4894:2;4888:9;4956:4;4948:13;;4799:66;4944:22;;;4968:2;4940:31;4936:40;4924:53;;;4992:18;;;5012:22;;;4989:46;4986:72;;;5038:18;;:::i;:::-;5078:10;5074:2;5067:22;5113:2;5105:6;5098:18;5159:3;5152:4;5147:2;5139:6;5135:15;5131:26;5128:35;5125:55;;;5176:1;5173;5166:12;5125:55;5240:2;5233:4;5225:6;5221:17;5214:4;5206:6;5202:17;5189:54;5287:1;5280:4;5275:2;5267:6;5263:15;5259:26;5252:37;5307:6;5298:15;;;;;;4542:777;;;;:::o;5324:675::-;5437:6;5445;5453;5461;5469;5477;5530:3;5518:9;5509:7;5505:23;5501:33;5498:53;;;5547:1;5544;5537:12;5498:53;5570:29;5589:9;5570:29;:::i;:::-;5560:39;;5618:38;5652:2;5641:9;5637:18;5618:38;:::i;:::-;5608:48;;5703:2;5692:9;5688:18;5675:32;5665:42;;5754:2;5743:9;5739:18;5726:32;5716:42;;5805:3;5794:9;5790:19;5777:33;5767:43;;5861:3;5850:9;5846:19;5833:33;5889:18;5881:6;5878:30;5875:50;;;5921:1;5918;5911:12;5875:50;5944:49;5985:7;5976:6;5965:9;5961:22;5944:49;:::i;:::-;5934:59;;;5324:675;;;;;;;;:::o;6004:533::-;6097:6;6105;6113;6121;6174:3;6162:9;6153:7;6149:23;6145:33;6142:53;;;6191:1;6188;6181:12;6142:53;6214:29;6233:9;6214:29;:::i;:::-;6204:39;;6290:2;6279:9;6275:18;6262:32;6252:42;;6313:36;6345:2;6334:9;6330:18;6313:36;:::i;:::-;6303:46;;6400:2;6389:9;6385:18;6372:32;6427:18;6419:6;6416:30;6413:50;;;6459:1;6456;6449:12;6413:50;6482:49;6523:7;6514:6;6503:9;6499:22;6482:49;:::i;:::-;6472:59;;;6004:533;;;;;;;:::o;6542:606::-;6653:6;6661;6669;6677;6685;6693;6701;6754:3;6742:9;6733:7;6729:23;6725:33;6722:53;;;6771:1;6768;6761:12;6722:53;6794:29;6813:9;6794:29;:::i;:::-;6784:39;;6842:38;6876:2;6865:9;6861:18;6842:38;:::i;:::-;6832:48;;6927:2;6916:9;6912:18;6899:32;6889:42;;6978:2;6967:9;6963:18;6950:32;6940:42;;7001:37;7033:3;7022:9;7018:19;7001:37;:::i;:::-;6991:47;;7085:3;7074:9;7070:19;7057:33;7047:43;;7137:3;7126:9;7122:19;7109:33;7099:43;;6542:606;;;;;;;;;;:::o;7153:248::-;7221:6;7229;7282:2;7270:9;7261:7;7257:23;7253:32;7250:52;;;7298:1;7295;7288:12;7250:52;-1:-1:-1;;7321:23:1;;;7391:2;7376:18;;;7363:32;;-1:-1:-1;7153:248:1:o;7406:184::-;7458:77;7455:1;7448:88;7555:4;7552:1;7545:15;7579:4;7576:1;7569:15;7595:128;7662:9;;;7683:11;;;7680:37;;;7697:18;;:::i;11097:289::-;11228:3;11266:6;11260:13;11282:66;11341:6;11336:3;11329:4;11321:6;11317:17;11282:66;:::i;:::-;11364:16;;;;;11097:289;-1:-1:-1;;11097:289:1:o;14693:195::-;14732:3;14763:66;14756:5;14753:77;14750:103;;14833:18;;:::i;:::-;-1:-1:-1;14880:1:1;14869:13;;14693:195::o;16033:238::-;16071:7;16111:4;16108:1;16104:12;16143:4;16140:1;16136:12;16203:3;16197:4;16193:14;16188:3;16185:23;16178:3;16171:11;16164:19;16160:49;16157:75;;;16212:18;;:::i;:::-;16252:13;;16033:238;-1:-1:-1;;;16033:238:1:o;17739:175::-;17776:3;17820:4;17813:5;17809:16;17849:4;17840:7;17837:17;17834:43;;17857:18;;:::i;:::-;17906:1;17893:15;;17739:175;-1:-1:-1;;17739:175:1:o;21403:125::-;21468:9;;;21489:10;;;21486:36;;;21502:18;;:::i
Swarm Source
ipfs://4df062ce4a728db409b68ffa83f0a34c19327d770669675260d855e15c1f5eee
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.