Contract 0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c 3

 

Contract Overview

Balance:
3.73162380832387774 MATIC

MATIC Value:
$3.57 (@ $0.96/MATIC)

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xda979fe4ed38f6e2d2555505226ae0ddb2931521dc91f821bb2182a559b146c3Withdraw Token306823682022-07-13 14:19:0133 days 11 hrs ago0x567500b4035392d23775c7811f7b44c2f524262e IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.006033325275 86.203907413
0x294f7d5421646327a7baac308736d41398b66b1284fa3243e1559f89d017def7Confirm Transact...295180902022-06-13 13:04:3663 days 12 hrs ago0x567500b4035392d23775c7811f7b44c2f524262e IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.045395728516 397.625658172
0x24a03292736b5be462221d6715634b9ce6f03c518265a73ef8e67ee2bef0916cSubmit Transacti...295180102022-06-13 13:01:4863 days 13 hrs ago0x167cc030f8b79e3214ecdeabd7cb2fa74c179e3c IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.086286 500
0xd97ce68caddeb7fc1529e8855dff845dfeef5b85fdda36fff360cb2849def58eConfirm Transact...295177212022-06-13 12:51:5463 days 13 hrs ago0x567500b4035392d23775c7811f7b44c2f524262e IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.072933176562 501.993823001
0x1e9c1b2469f845530081f278998c136a17f2c591fa73a7e49b3a5b9ac74c0ac9Submit Transacti...295171972022-06-13 12:33:3163 days 13 hrs ago0x99723a4a9d9b3c3cecba16e2e3ed924abd1d55f6 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.0838185 500
0xedbcb11e35b5d1888b8353c09a8f55e0c84722dcf7f4b561c91e638809e56078Confirm Transact...223325202021-12-09 21:45:04249 days 4 hrs ago0xe641c95c3fbe4166d9dadc96afc898f622898829 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.00945721397488.216165057
0xb832d17974e6abda327fb59424275b64f94ee92867e1dd288f73e42916ba09d5Confirm Transact...223324992021-12-09 21:44:22249 days 4 hrs ago0xe641c95c3fbe4166d9dadc96afc898f622898829 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.00795683343988.216165057
0xb7a2adc85dc238cb90678b5ee128398fd7466a6424f30607f8abccf9af6735c9Confirm Transact...223324842021-12-09 21:43:52249 days 4 hrs ago0xe641c95c3fbe4166d9dadc96afc898f622898829 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.00876312918888.216165057
0xb340f29685ea2c851f0dfa6cdcf3c7dd54717401c8c1cd1d767adee2607afc18Submit Transacti...223320872021-12-09 21:28:02249 days 4 hrs ago0x99723a4a9d9b3c3cecba16e2e3ed924abd1d55f6 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.01477943434583.266764393
0xb3b744758f3853e03b41dce10ae338dc78ecdc51d983912058e8982436ef3d2fConfirm Transact...223319312021-12-09 21:22:42249 days 4 hrs ago0xb224cb543fa10cf2983c557c029cd874c1ace0cc IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.01227636358681.721476128
0x0aa71d4e6c36ea6db26534d3c7fdbcc36ed2db678a501cefb241acc6e9e55d52Confirm Transact...223319192021-12-09 21:22:18249 days 4 hrs ago0xb224cb543fa10cf2983c557c029cd874c1ace0cc IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.01227636358681.721476128
0xfa2df8c62a95cc905e67cf6a49deefea34284ccf72cf44508626003d86860a19Submit Transacti...223316452021-12-09 21:12:50249 days 4 hrs ago0x99723a4a9d9b3c3cecba16e2e3ed924abd1d55f6 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.01301549916477.640969261
0x3d0f985452ea5038dc771cb5de425c8573be5880ae48799888e3954eaecd3bd4Submit Transacti...223316302021-12-09 21:12:20249 days 4 hrs ago0x99723a4a9d9b3c3cecba16e2e3ed924abd1d55f6 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.01301549916477.640969261
0x1a817bc8e02130b474a214d48cabd9dce2c8afdf8e3762992b5bb369235406deConfirm Transact...223316182021-12-09 21:11:56249 days 4 hrs ago0x99723a4a9d9b3c3cecba16e2e3ed924abd1d55f6 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.00541429299177.640969261
0x754ec07dd72e06d18f30304c8865d1ba06f6af9c364fd47ebe987acb05c53a60Confirm Transact...223316112021-12-09 21:11:42249 days 4 hrs ago0x99723a4a9d9b3c3cecba16e2e3ed924abd1d55f6 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.00541429299177.640969261
0x0d1902af78722fee0b39613dda87c68b583b0f0f44c077931fd5f6aa09dd9729Revoke Confirmat...223242132021-12-09 16:38:12249 days 9 hrs ago0x99723a4a9d9b3c3cecba16e2e3ed924abd1d55f6 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.001861487551104.063481183
0xdc3ec8b75b5e00a350e2cab22f0b8bdaf1f3aee1bc99a7fc3f5ff73519553b28Revoke Confirmat...223242112021-12-09 16:38:04249 days 9 hrs ago0x99723a4a9d9b3c3cecba16e2e3ed924abd1d55f6 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.001861487551104.063481183
0xf6366137ea05d22a2b094a363675b98afec9050948e9b99f06b91b5be1c70943Submit Transacti...223241082021-12-09 16:32:50249 days 9 hrs ago0x99723a4a9d9b3c3cecba16e2e3ed924abd1d55f6 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.017818346132106.29124914
0x94213130ff63b91be43bb56542e3199df2b6d6a7d58f9ffd30e2654d0ba2ac43Submit Transacti...223240322021-12-09 16:30:14249 days 9 hrs ago0x99723a4a9d9b3c3cecba16e2e3ed924abd1d55f6 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.017817070637106.29124914
0x5832610159246b27918d34ab5681405c521b32822b9f6d91f7ae2d4535d4f00eAdd Owner223239822021-12-09 16:28:30249 days 9 hrs ago0x99723a4a9d9b3c3cecba16e2e3ed924abd1d55f6 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.0006587730
0x7caffccc43bb5dfe89f6f24324866f4cceb1aaca73c7a3ac1996a36a7414f8ccPay Native Curre...190582662021-09-13 11:03:20336 days 14 hrs ago0xf5624854d3b3b842bb8982e194b9555328b49a3c IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c3.731623808323877 MATIC0.0000475731
0xb866a7c4c5f1b6cb79e7b60675e4514b421306b1a1f5c0c311dc9a563f91a46ePay Token Order188396242021-09-07 7:41:07342 days 18 hrs ago0x9e41a125f36967d08a3f30091d6d04625c727b1f IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.000066479011.11
0xdd965f3d4e348ba4c291ad2af059158e52c6001cc4206987cdab386733ffb0aaPay Token Order188382892021-09-07 6:50:00342 days 19 hrs ago0x9e41a125f36967d08a3f30091d6d04625c727b1f IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.0005989110.000000001
0xb97b063ad63f9ddd961f2ef1f6ead3a765d2b3c1366facc93d6826daa08b4358Withdraw188137952021-09-06 15:07:40343 days 10 hrs ago0x22de936854e40350d01f47724fd047d4de0f26a1 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.0002725928
0x915869f976af2c4d3ccd1794f8505f06d8c099e16fb3ab2db7b8d8d96478892aPay Token Order187170932021-09-03 23:03:22346 days 2 hrs ago0x0e787d383554a2b4f2a45c076cc4efe397ff8444 IN  0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0 MATIC0.0000723911
[ Download CSV Export 
Latest 6 internal transactions
Parent Txn Hash Block From To Value
0xb97b063ad63f9ddd961f2ef1f6ead3a765d2b3c1366facc93d6826daa08b4358188137952021-09-06 15:07:40343 days 10 hrs ago 0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0x22de936854e40350d01f47724fd047d4de0f26a111,715.372262211405021767 MATIC
0x5516c98f575a41e9fc8eeddda8f84d8633233fb42249294ffb0e0f5943de8634186175282021-09-01 8:04:31348 days 17 hrs ago 0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0x22de936854e40350d01f47724fd047d4de0f26a122,841.583548985212675317 MATIC
0x4945d6698efe4248a174f5affcb4919555d545258f8e33f3ba34630f2b5f09eb175043882021-08-01 17:25:41379 days 8 hrs ago 0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0x22de936854e40350d01f47724fd047d4de0f26a19,307.764722943374707602 MATIC
0xc4418e229a4ad1c0bd56472d9a7641cb38f7747ebef85212392670fbbfcbe046163268012021-06-30 13:07:26411 days 12 hrs ago 0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0x22de936854e40350d01f47724fd047d4de0f26a1990.556141827992248251 MATIC
0xa3ce182639455f617bfff1f21970c336c6ae25c4dc7d33f626b52ab11aa77ef0155510772021-06-10 15:09:36431 days 10 hrs ago 0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0x98ee235244a99fde7aadafb0c0fc77845d9e055a160 MATIC
0xb94006368b6f0448451821eff413fd4a9a7202e4e3344e40ab071a0ed8a3f6dd152124952021-06-01 19:51:24440 days 6 hrs ago 0xc4ec3999c283e2c7001d329d77277d7b7cfdfb5c0x22de936854e40350d01f47724fd047d4de0f26a11.1227517535877407 MATIC
[ Download CSV Export 
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
MultiSigPayments

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
Yes with 1337 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-06-09
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0 <0.9.0;

/**
    Note: The ERC-165 identifier for this interface is 0x4e2312e0.
*/
interface IERC1155TokenReceiver {
    /**
        @notice Handle the receipt of a single ERC1155 token type.
        @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated.
        This function MUST return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61) if it accepts the transfer.
        This function MUST revert if it rejects the transfer.
        Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
        @param _operator  The address which initiated the transfer (i.e. msg.sender)
        @param _from      The address which previously owned the token
        @param _id        The ID of the token being transferred
        @param _value     The amount of tokens being transferred
        @param _data      Additional data with no specified format
        @return           `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
    */
    function onERC1155Received(
        address _operator,
        address _from,
        uint256 _id,
        uint256 _value,
        bytes calldata _data
    ) external returns (bytes4);

    /**
        @notice Handle the receipt of multiple ERC1155 token types.
        @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated.
        This function MUST return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81) if it accepts the transfer(s).
        This function MUST revert if it rejects the transfer(s).
        Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
        @param _operator  The address which initiated the batch transfer (i.e. msg.sender)
        @param _from      The address which previously owned the token
        @param _ids       An array containing ids of each token being transferred (order and length must match _values array)
        @param _values    An array containing amounts of each token being transferred (order and length must match _ids array)
        @param _data      Additional data with no specified format
        @return           `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
    */
    function onERC1155BatchReceived(
        address _operator,
        address _from,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data
    ) external returns (bytes4);
}

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
    @author The Calystral Team
    @title The RegistrableContractState's Interface
*/
interface IRegistrableContractState is IERC165 {
    /*==============================
    =           EVENTS             =
    ==============================*/
    /// @dev MUST emit when the contract is set to an active state.
    event Activated();
    /// @dev MUST emit when the contract is set to an inactive state.
    event Inactivated();

    /*==============================
    =          FUNCTIONS           =
    ==============================*/
    /**
        @notice Sets the contract state to active.
        @dev Sets the contract state to active.
    */
    function setActive() external;

    /**
        @notice Sets the contract state to inactive.
        @dev Sets the contract state to inactive.
    */
    function setInactive() external;

    /**
        @dev Sets the registry contract object.
        Reverts if the registryAddress doesn't implement the IRegistry interface.
        @param registryAddress The registry address
    */
    function setRegistry(address registryAddress) external;

    /**
        @notice Returns the current contract state.
        @dev Returns the current contract state.
        @return The current contract state (true == active; false == inactive)
    */
    function getIsActive() external view returns (bool);

    /**
        @notice Returns the Registry address.
        @dev Returns the Registry address.
        @return The Registry address
    */
    function getRegistryAddress() external view returns (address);

    /**
        @notice Returns the current address associated with `key` identifier.
        @dev Look-up in the Registry.
        Returns the current address associated with `key` identifier.
        @return The key identifier
    */
    function getContractAddress(uint256 key) external view returns (address);
}

/// @author Stefan George - <[email protected]> - adjusted by the Calystral Team
/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
interface IMultiSigAdmin is IERC1155TokenReceiver, IRegistrableContractState {
    /*==============================
    =           EVENTS             =
    ==============================*/
    event Confirmation(address indexed sender, uint256 indexed transactionId);
    event Revocation(address indexed sender, uint256 indexed transactionId);
    event Submission(uint256 indexed transactionId);
    event Execution(uint256 indexed transactionId);
    event ExecutionFailure(uint256 indexed transactionId);
    event Deposit(address indexed sender, uint256 value);
    event OwnerAddition(address indexed owner);
    event OwnerRemoval(address indexed owner);
    event RequirementChange(uint256 required);

    /*==============================
    =          FUNCTIONS           =
    ==============================*/
    /// @dev Fallback function allows to deposit ether.
    receive() external payable;

    /// @dev Allows an owner to submit and confirm a transaction.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return transactionId transactionId Returns transaction ID.
    function submitTransaction(
        address destination,
        uint256 value,
        bytes memory data
    ) external returns (uint256 transactionId);

    /// @dev Allows to add a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of new owner.
    function addOwner(address owner) external;

    /// @dev Allows to remove an owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner.
    function removeOwner(address owner) external;

    /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner to be replaced.
    /// @param newOwner Address of new owner.
    function replaceOwner(address owner, address newOwner) external;

    /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
    /// @param _required Number of required confirmations.
    function changeRequirement(uint256 _required) external;

    /// @dev Allows an owner to confirm a transaction.
    /// @param transactionId Transaction ID.
    function confirmTransaction(uint256 transactionId) external;

    /// @dev Allows an owner to revoke a confirmation for a transaction.
    /// @param transactionId Transaction ID.
    function revokeConfirmation(uint256 transactionId) external;

    /// @dev Allows anyone to execute a confirmed transaction.
    /// @param transactionId Transaction ID.
    function executeTransaction(uint256 transactionId) external;

    /*==============================
    =          VIEW & PURE         =
    ==============================*/
    /// @dev Returns the confirmation status of a transaction.
    /// @param transactionId Transaction ID.
    /// @return isConfirmed Confirmation status.
    function isConfirmed(uint256 transactionId) external view returns (bool);

    /// @dev Returns number of confirmations of a transaction.
    /// @param transactionId Transaction ID.
    /// @return count Number of confirmations.
    function getConfirmationCount(uint256 transactionId)
        external
        view
        returns (uint256 count);

    /// @dev Returns total number of transactions after filers are applied.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return count Total number of transactions after filters are applied.
    function getTransactionCount(bool pending, bool executed)
        external
        view
        returns (uint256 count);

    /// @dev Returns list of owners.
    /// @return owners List of owner addresses.
    function getOwners() external view returns (address[] memory);

    /// @dev Returns the amount of required confirmations.
    /// @return required Amount of required confirmations.
    function getRequired() external view returns (uint256);

    /// @dev Returns array with owner addresses, which confirmed transaction.
    /// @param transactionId Transaction ID.
    /// @return _confirmations Returns array of owner addresses.
    function getConfirmations(uint256 transactionId)
        external
        view
        returns (address[] memory _confirmations);

    /// @dev Returns list of transaction IDs in defined range.
    /// @param from Index start position of transaction array.
    /// @param to Index end position of transaction array.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return _transactionIds Returns array of transaction IDs.
    function getTransactionIds(
        uint256 from,
        uint256 to,
        bool pending,
        bool executed
    ) external view returns (uint256[] memory _transactionIds);
}

/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
/// @author Stefan George - <[email protected]> - adjusted by the Calystral Team
interface IMultiSigPayments is IMultiSigAdmin {
    /*==============================
    =            EVENTS            =
    ==============================*/
    /**
        @dev MUST emit when a token allowance changes.
        The `tokenAddress` argument MUST be the token address.
        The `allowed` argument MUST be the allowance.
    */
    event OnTokenUpdate(address indexed tokenAddress, bool allowed);
    /**
        @dev MUST emit when the withdraw address changes.
        The `withdrawAddress` argument MUST be the withdraw address.
    */
    event OnWithdrawAddressUpdate(address withdrawAddress);
    /**
        @dev MUST emit when an is payed with ETH.
        The `orderId` argument MUST be the orderId.
        The `amount` argument MUST be the amount payed in WEI.
    */
    event OnPayedNativeCurrencyOrder(uint256 indexed orderId, uint256 amount);
    /**
        @dev MUST emit when an is payed with a token.
        The `orderId` argument MUST be the orderId.
        The `tokenAddress` argument MUST be the token's contract address.
        The `amount` argument MUST be the amount payed in full DECIMALS of the token.
    */
    event OnPayedTokenOrder(
        uint256 indexed orderId,
        address indexed tokenAddress,
        uint256 amount
    );
    /**
        @dev MUST emit when ETH is withdrawn through withdraw function.
        The `receiver` argument MUST be the receiving address.
        The `amount` argument MUST be the amount payed in WEI.
    */
    event OnEthWithdraw(address indexed receiver, uint256 amount);
    /**
        @dev MUST emit when a token is withdrawn through withdrawToken function.
        The `receiver` argument MUST be the receiving address.
        The `tokenAddress` argument MUST be the token's contract address.
        The `amount` argument MUST be the amount payed in full DECIMALS of the token.
    */
    event OnTokenWithdraw(
        address indexed receiver,
        address indexed tokenAddress,
        uint256 amount
    );

    /*==============================
    =          FUNCTIONS           =
    ==============================*/
    /**
        @notice Used to pay an open order with ETH.
        @dev Payable function used to pay a created order in ETH. 
        @param orderId The orderId
    */
    function payNativeCurrencyOrder(uint256 orderId) external payable;

    /**
        @notice Used to pay an open order with an allowed ERC20 token.
        @dev Used to pay a created order with an allowed ERC20 token.
        @param orderId      The orderId
        @param tokenAddress The smart contract address of the ERC20 token
        @param amount       The amount of tokens payed
    */
    function payTokenOrder(
        uint256 orderId,
        address tokenAddress,
        uint256 amount
    ) external;

    /**
        @notice Adds or removes a specific ERC20 token for payments.
        @dev Adds or removes the address of an ERC20 contract for valid payment options.
        @param tokenAddress The smart contract address of the ERC20 token
        @param allowed      True or False as the allowence
    */
    function updateAllowedToken(address tokenAddress, bool allowed) external;

    /**
        @notice Withdraws ETH to the specified withdraw address.
        @dev Withdraws ETH to the specified `_withdrawAddress`.
    */
    function withdraw() external;

    /**
        @notice Withdraws a token to the specified withdraw address.
        @dev Withdraws a token to the specified `_withdrawAddress`.
        @param tokenAddress The smart contract address of the ERC20 token
    */
    function withdrawToken(address tokenAddress) external;

    /**
        @notice Updated the withdraw address.
        @dev Updates `_withdrawAddress`.
        @param withdrawAddress The withdraw address
    */
    function updateWithdrawAddress(address payable withdrawAddress) external;

    /**
        @notice Used to check if a specific token is allowed providing the token's contract address.
        @dev Used to check if a specific token is allowed providing the token's contract address.
        @param tokenAddress The smart contract address of the ERC20 token
        @return             Returns True or False
    */
    function isTokenAllowed(address tokenAddress) external view returns (bool);

    /**
        @notice Used to check if a specific order is payed already by orderId.
        @dev Used to check if a specific order is payed already by orderId.
        @param orderId  The orderId
        @return         Returns True or False
    */
    function isOrderIdExecuted(uint256 orderId) external view returns (bool);

    /**
        @notice Gets the withdraw address.
        @dev Gets the `_withdrawAddress`.
        @return Returns the withdraw address
    */
    function getWithdrawAddress() external view returns (address);
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override
        returns (bool)
    {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

/**
    @author The Calystral Team
    @title The Registry's Interface
*/
interface IRegistry is IRegistrableContractState {
    /*==============================
    =           EVENTS             =
    ==============================*/
    /**
        @dev MUST emit when an entry in the Registry is set or updated.
        The `key` argument MUST be the key of the entry which is set or updated.
        The `value` argument MUST be the address of the entry which is set or updated.
    */
    event EntrySet(uint256 indexed key, address value);
    /**
        @dev MUST emit when an entry in the Registry is removed.
        The `key` argument MUST be the key of the entry which is removed.
        The `value` argument MUST be the address of the entry which is removed.
    */
    event EntryRemoved(uint256 indexed key, address value);

    /*==============================
    =          FUNCTIONS           =
    ==============================*/
    /**
        @notice Sets the MultiSigAdmin contract as Registry entry 1.
        @dev Sets the MultiSigAdmin contract as Registry entry 1.
        @param msaAddress The contract address of the MultiSigAdmin
    */
    function initializeMultiSigAdmin(address msaAddress) external;

    /**
        @notice Checks if the registry Map contains the key.
        @dev Returns true if the key is in the registry map. O(1).
        @param key  The key to search for
        @return     The boolean result
    */
    function contains(uint256 key) external view returns (bool);

    /**
        @notice Returns the registry map length.
        @dev Returns the number of key-value pairs in the registry map. O(1).
        @return     The registry map length
    */
    function length() external view returns (uint256);

    /**
        @notice Returns the key-value pair stored at position `index` in the registry map.
        @dev Returns the key-value pair stored at position `index` in the registry map. O(1).
        Note that there are no guarantees on the ordering of entries inside the
        array, and it may change when more entries are added or removed.
        Requirements:
        - `index` must be strictly less than {length}.
        @param index    The position in the registry map
        @return         The key-value pair as a tuple
    */
    function at(uint256 index) external view returns (uint256, address);

    /**
        @notice Tries to return the value associated with `key`.
        @dev Tries to return the value associated with `key`.  O(1).
        Does not revert if `key` is not in the registry map.
        @param key    The key to search for
        @return       The key-value pair as a tuple
    */
    function tryGet(uint256 key) external view returns (bool, address);

    /**
        @notice Returns the value associated with `key`.
        @dev Returns the value associated with `key`.  O(1).
        Requirements:
        - `key` must be in the registry map.
        @param key    The key to search for
        @return       The contract address
    */
    function get(uint256 key) external view returns (address);

    /**
        @notice Returns all indices, keys, addresses.
        @dev Returns all indices, keys, addresses as three seperate arrays.
        @return Indices, keys, addresses
    */
    function getAll()
        external
        view
        returns (
            uint256[] memory,
            uint256[] memory,
            address[] memory
        );

    /**
        @notice Adds a key-value pair to a map, or updates the value for an existing
        key.
        @dev Adds a key-value pair to the registry map, or updates the value for an existing
        key. O(1).
        Returns true if the key was added to the registry map, that is if it was not
        already present.
        @param key    The key as an identifier
        @param value  The address of the contract
        @return       Success as a bool
    */
    function set(uint256 key, address value) external returns (bool);

    /**
        @notice Removes a value from the registry map.
        @dev Removes a value from the registry map. O(1).
        Returns true if the key was removed from the registry map, that is if it was present.
        @param key    The key as an identifier
        @return       Success as a bool
    */
    function remove(uint256 key) external returns (bool);

    /**
        @notice Sets a contract state to active.
        @dev Sets a contract state to active.
        @param key    The key as an identifier
    */
    function setContractActiveByKey(uint256 key) external;

    /**
        @notice Sets a contract state to active.
        @dev Sets a contract state to active.
        @param contractAddress The contract's address
    */
    function setContractActiveByAddress(address contractAddress) external;

    /**
        @notice Sets all contracts within the registry to state active.
        @dev Sets all contracts within the registry to state active.
        Does NOT revert if any contract doesn't implement the RegistrableContractState interface.
        Does NOT revert if it is an externally owned user account.
    */
    function setAllContractsActive() external;

    /**
        @notice Sets a contract state to inactive.
        @dev Sets a contract state to inactive.
        @param key    The key as an identifier
    */
    function setContractInactiveByKey(uint256 key) external;

    /**
        @notice Sets a contract state to inactive.
        @dev Sets a contract state to inactive.
        @param contractAddress The contract's address
    */
    function setContractInactiveByAddress(address contractAddress) external;

    /**
        @notice Sets all contracts within the registry to state inactive.
        @dev Sets all contracts within the registry to state inactive.
        Does NOT revert if any contract doesn't implement the RegistrableContractState interface.
        Does NOT revert if it is an externally owned user account.
    */
    function setAllContractsInactive() external;
}

/**
    @author The Calystral Team
    @title A helper parent contract: Pausable & Registry
*/
contract RegistrableContractState is IRegistrableContractState, ERC165 {
    /*==============================
    =          CONSTANTS           =
    ==============================*/

    /*==============================
    =            STORAGE           =
    ==============================*/
    /// @dev Current contract state
    bool private _isActive;
    /// @dev Current registry pointer
    address private _registryAddress;

    /*==============================
    =          MODIFIERS           =
    ==============================*/
    modifier isActive() {
        _isActiveCheck();
        _;
    }

    modifier isAuthorizedAdmin() {
        _isAuthorizedAdmin();
        _;
    }

    modifier isAuthorizedAdminOrRegistry() {
        _isAuthorizedAdminOrRegistry();
        _;
    }

    /*==============================
    =          CONSTRUCTOR         =
    ==============================*/
    /**
        @notice Creates and initializes the contract.
        @dev Creates and initializes the contract.
        Registers all implemented interfaces.
        Inheriting contracts are INACTIVE by default.
    */
    constructor(address registryAddress) {
        _registryAddress = registryAddress;

        _registerInterface(type(IRegistrableContractState).interfaceId);
    }

    /*==============================
    =      PUBLIC & EXTERNAL       =
    ==============================*/

    /*==============================
    =          RESTRICTED          =
    ==============================*/
    function setActive() external override isAuthorizedAdminOrRegistry() {
        _isActive = true;

        emit Activated();
    }

    function setInactive() external override isAuthorizedAdminOrRegistry() {
        _isActive = false;

        emit Inactivated();
    }

    function setRegistry(address registryAddress)
        external
        override
        isAuthorizedAdmin()
    {
        _registryAddress = registryAddress;

        try
            _registryContract().supportsInterface(type(IRegistry).interfaceId)
        returns (bool supportsInterface) {
            require(
                supportsInterface,
                "The provided contract does not implement the Registry interface"
            );
        } catch {
            revert(
                "The provided contract does not implement the Registry interface"
            );
        }
    }

    /*==============================
    =          VIEW & PURE         =
    ==============================*/
    function getIsActive() public view override returns (bool) {
        return _isActive;
    }

    function getRegistryAddress() public view override returns (address) {
        return _registryAddress;
    }

    function getContractAddress(uint256 key)
        public
        view
        override
        returns (address)
    {
        return _registryContract().get(key);
    }

    /*==============================
    =      INTERNAL & PRIVATE      =
    ==============================*/
    /**
        @dev Returns the target Registry object.
        @return The target Registry object
    */
    function _registryContract() internal view returns (IRegistry) {
        return IRegistry(_registryAddress);
    }

    /**
        @dev Checks if the contract is in an active state.
        Reverts if the contract is INACTIVE.
    */
    function _isActiveCheck() internal view {
        require(_isActive == true, "The contract is not active");
    }

    /**
        @dev Checks if the msg.sender is the Admin.
        Reverts if msg.sender is not the Admin.
    */
    function _isAuthorizedAdmin() internal view {
        require(msg.sender == getContractAddress(1), "Unauthorized call");
    }

    /**
        @dev Checks if the msg.sender is the Admin or the Registry.
        Reverts if msg.sender is not the Admin or the Registry.
    */
    function _isAuthorizedAdminOrRegistry() internal view {
        require(
            msg.sender == _registryAddress ||
                msg.sender == getContractAddress(1),
            "Unauthorized call"
        );
    }
}

/**
    Note: Simple contract to use as base for const vals
*/
contract CommonConstants {
    bytes4 internal constant ERC1155_ACCEPTED = 0xf23a6e61; // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))
    bytes4 internal constant ERC1155_BATCH_ACCEPTED = 0xbc197c81; // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
}

/// @author Stefan George - <[email protected]> - adjusted by the Calystral Team
/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
contract MultiSigAdmin is
    IMultiSigAdmin,
    RegistrableContractState,
    CommonConstants
{
    /*==============================
    =          CONSTANTS           =
    ==============================*/
    uint256 public constant MAX_OWNER_COUNT = 50;

    /*==============================
    =            STORAGE           =
    ==============================*/
    mapping(uint256 => Transaction) public transactions;
    mapping(uint256 => mapping(address => bool)) public confirmations;
    mapping(address => bool) public isOwner;
    address[] public owners;
    uint256 public required;
    uint256 public transactionCount;

    struct Transaction {
        address destination;
        uint256 value;
        bytes data;
        bool executed;
    }

    /*==============================
    =          MODIFIERS           =
    ==============================*/
    modifier isAuthorizedWallet() {
        require(
            msg.sender == address(this),
            "Can only be executed by the wallet contract itself."
        );
        _;
    }

    modifier isAuthorizedOwner(address owner) {
        require(isOwner[owner], "This address is not an owner.");
        _;
    }

    modifier ownerDoesNotExist(address owner) {
        require(!isOwner[owner], "This address is an owner.");
        _;
    }

    modifier transactionExists(uint256 transactionId) {
        require(
            transactions[transactionId].destination != address(0x0),
            "The transaction destination does not exist."
        );
        _;
    }

    modifier confirmed(uint256 transactionId, address owner) {
        require(
            confirmations[transactionId][owner],
            "The owner did not confirm this transactionId yet."
        );
        _;
    }

    modifier notConfirmed(uint256 transactionId, address owner) {
        require(
            !confirmations[transactionId][owner],
            "This owner did confirm this transactionId already."
        );
        _;
    }

    modifier notExecuted(uint256 transactionId) {
        require(
            !transactions[transactionId].executed,
            "This transactionId is executed already."
        );
        _;
    }

    modifier notNull(address _address) {
        require(_address != address(0x0), "The zero-address is not allowed.");
        _;
    }

    modifier validRequirement(uint256 ownerCount, uint256 _required) {
        require(
            ownerCount <= MAX_OWNER_COUNT &&
                _required <= ownerCount &&
                _required != 0 &&
                ownerCount != 0,
            "This change in requirement is not allowed."
        );
        _;
    }

    /*==============================
    =          CONSTRUCTOR         =
    ==============================*/
    /// @dev Contract constructor sets initial owners and required number of confirmations.
    /// @param _owners List of initial owners.
    /// @param _required Number of required confirmations.
    /// @param registryAddress The registry address
    constructor(
        address[] memory _owners,
        uint256 _required,
        address registryAddress
    )
        validRequirement(_owners.length, _required)
        RegistrableContractState(registryAddress)
    {
        for (uint256 i = 0; i < _owners.length; i++) {
            require(
                !isOwner[_owners[i]] && _owners[i] != address(0x0),
                "An owner address is included multiple times or as the zero-address."
            );
            isOwner[_owners[i]] = true;
        }
        owners = _owners;
        required = _required;

        _registerInterface(type(IERC1155TokenReceiver).interfaceId); // 0x4e2312e0
        _registerInterface(type(IMultiSigAdmin).interfaceId);
    }

    /*==============================
    =      PUBLIC & EXTERNAL       =
    ==============================*/
    receive() external payable override {
        if (msg.value > 0) {
            emit Deposit(msg.sender, msg.value);
        }
    }

    function submitTransaction(
        address destination,
        uint256 value,
        bytes memory data
    ) public override returns (uint256 transactionId) {
        transactionId = addTransaction(destination, value, data);
        confirmTransaction(transactionId);
    }

    /*==============================
    =          RESTRICTED          =
    ==============================*/
    function addOwner(address owner)
        public
        override
        isAuthorizedWallet()
        ownerDoesNotExist(owner)
        notNull(owner)
        validRequirement(owners.length + 1, required)
    {
        isOwner[owner] = true;
        owners.push(owner);
        emit OwnerAddition(owner);
    }

    function removeOwner(address owner)
        public
        override
        isAuthorizedWallet()
        isAuthorizedOwner(owner)
    {
        isOwner[owner] = false;
        for (uint256 i = 0; i < owners.length - 1; i++)
            if (owners[i] == owner) {
                owners[i] = owners[owners.length - 1];
                break;
            }
        owners.pop(); //owners.length -= 1;
        if (required > owners.length) changeRequirement(owners.length);
        emit OwnerRemoval(owner);
    }

    function replaceOwner(address owner, address newOwner)
        public
        override
        isAuthorizedWallet()
        isAuthorizedOwner(owner)
        ownerDoesNotExist(newOwner)
    {
        for (uint256 i = 0; i < owners.length; i++)
            if (owners[i] == owner) {
                owners[i] = newOwner;
                break;
            }
        isOwner[owner] = false;
        isOwner[newOwner] = true;
        emit OwnerRemoval(owner);
        emit OwnerAddition(newOwner);
    }

    function changeRequirement(uint256 _required)
        public
        override
        isAuthorizedWallet()
        validRequirement(owners.length, _required)
    {
        required = _required;
        emit RequirementChange(_required);
    }

    function confirmTransaction(uint256 transactionId)
        public
        override
        isAuthorizedOwner(msg.sender)
        transactionExists(transactionId)
        notConfirmed(transactionId, msg.sender)
    {
        confirmations[transactionId][msg.sender] = true;
        emit Confirmation(msg.sender, transactionId);
        executeTransaction(transactionId);
    }

    function revokeConfirmation(uint256 transactionId)
        public
        override
        isAuthorizedOwner(msg.sender)
        confirmed(transactionId, msg.sender)
        notExecuted(transactionId)
    {
        confirmations[transactionId][msg.sender] = false;
        emit Revocation(msg.sender, transactionId);
    }

    function executeTransaction(uint256 transactionId)
        public
        override
        isAuthorizedOwner(msg.sender)
        confirmed(transactionId, msg.sender)
        notExecuted(transactionId)
    {
        if (isConfirmed(transactionId)) {
            Transaction storage txn = transactions[transactionId];
            txn.executed = true;
            if (
                external_call(
                    txn.destination,
                    txn.value,
                    txn.data.length,
                    txn.data
                )
            ) {
                emit Execution(transactionId);
            } else {
                emit ExecutionFailure(transactionId);
                txn.executed = false;
            }
        }
    }

    /*==============================
    =          VIEW & PURE         =
    ==============================*/
    function isConfirmed(uint256 transactionId)
        public
        view
        override
        returns (bool)
    {
        uint256 count = 0;
        for (uint256 i = 0; i < owners.length; i++) {
            if (confirmations[transactionId][owners[i]]) count += 1;
            if (count == required) return true;
        }
        return false;
    }

    function getConfirmationCount(uint256 transactionId)
        public
        view
        override
        returns (uint256 count)
    {
        for (uint256 i = 0; i < owners.length; i++)
            if (confirmations[transactionId][owners[i]]) count += 1;
    }

    function getTransactionCount(bool pending, bool executed)
        public
        view
        override
        returns (uint256 count)
    {
        for (uint256 i = 0; i < transactionCount; i++)
            if (
                (pending && !transactions[i].executed) ||
                (executed && transactions[i].executed)
            ) count += 1;
    }

    function getOwners() public view override returns (address[] memory) {
        return owners;
    }

    function getRequired() public view override returns (uint256) {
        return required;
    }

    function getConfirmations(uint256 transactionId)
        public
        view
        override
        returns (address[] memory _confirmations)
    {
        address[] memory confirmationsTemp = new address[](owners.length);
        uint256 count = 0;
        uint256 i;
        for (i = 0; i < owners.length; i++)
            if (confirmations[transactionId][owners[i]]) {
                confirmationsTemp[count] = owners[i];
                count += 1;
            }
        _confirmations = new address[](count);
        for (i = 0; i < count; i++) _confirmations[i] = confirmationsTemp[i];
    }

    function getTransactionIds(
        uint256 from,
        uint256 to,
        bool pending,
        bool executed
    ) public view override returns (uint256[] memory _transactionIds) {
        uint256[] memory transactionIdsTemp = new uint256[](transactionCount);
        uint256 count = 0;
        uint256 i;
        for (i = 0; i < transactionCount; i++)
            if (
                (pending && !transactions[i].executed) ||
                (executed && transactions[i].executed)
            ) {
                transactionIdsTemp[count] = i;
                count += 1;
            }
        _transactionIds = new uint256[](to - from);
        for (i = from; i < to; i++)
            _transactionIds[i - from] = transactionIdsTemp[i];
    }

    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes calldata
    ) external pure override returns (bytes4) {
        return ERC1155_ACCEPTED;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] calldata,
        uint256[] calldata,
        bytes calldata
    ) external pure override returns (bytes4) {
        return ERC1155_BATCH_ACCEPTED;
    }

    /*==============================
    =      INTERNAL & PRIVATE      =
    ==============================*/
    // call has been separated into its own function in order to take advantage
    // of the Solidity's code generator to produce a loop that copies tx.data into memory.
    function external_call(
        address destination,
        uint256 value,
        uint256 dataLength,
        bytes memory data
    ) internal returns (bool) {
        bool result;
        assembly {
            let x := mload(0x40) // "Allocate" memory for output (0x40 is where "free memory" pointer is stored by convention)
            let d := add(data, 32) // First 32 bytes are the padded length of data, so exclude that
            result := call(
                sub(gas(), 34710), // 34710 is the value that solidity is currently emitting
                // It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) +
                // callNewAccountGas (25000, in case the destination address does not exist and needs creating)
                destination,
                value,
                d,
                dataLength, // Size of the input (in bytes) - this is what fixes the padding problem
                x,
                0 // Output is ignored, therefore the output size is zero
            )
        }
        return result;
    }

    /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return transactionId Returns transaction ID.
    function addTransaction(
        address destination,
        uint256 value,
        bytes memory data
    ) internal notNull(destination) returns (uint256 transactionId) {
        transactionId = transactionCount;
        transactions[transactionId] = Transaction({
            destination: destination,
            value: value,
            data: data,
            executed: false
        });
        transactionCount += 1;
        emit Submission(transactionId);
    }
}

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

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

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

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

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

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

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

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

/// @title Multisignature Payments wallet
/// @author The Calystral Team
contract MultiSigPayments is IMultiSigPayments, MultiSigAdmin {
    /*==============================
    =          CONSTANTS           =
    ==============================*/

    /*==============================
    =            STORAGE           =
    ==============================*/
    /// @dev token address => allowance
    mapping(address => bool) private _tokenAddressIsAllowed;
    /// @dev orderId => execution
    mapping(uint256 => bool) private _orderIdIsExecuted;
    /// @dev The address where any withdraw value is send to
    address payable private _withdrawAddress;

    /*==============================
    =          MODIFIERS           =
    ==============================*/

    /*==============================
    =          CONSTRUCTOR         =
    ==============================*/
    /// @dev Contract constructor sets initial owners and required number of confirmations.
    /// @param _owners List of initial owners.
    /// @param allowedTokens List of allowed tokens.
    /// @param _required Number of required confirmations.
    /// @param registryAddress The registry address
    /// @param withdrawAddress The withdraw address
    constructor(
        address[] memory _owners,
        address[] memory allowedTokens,
        uint256 _required,
        address registryAddress,
        address payable withdrawAddress
    ) MultiSigAdmin(_owners, _required, registryAddress) {
        require(
            withdrawAddress != address(0),
            "A withdraw address is required"
        );

        for (uint256 index = 0; index < allowedTokens.length; index++) {
            _updateAllowedToken(allowedTokens[index], true);
        }

        _updateWithdrawAddress(withdrawAddress);

        _registerInterface(type(IMultiSigPayments).interfaceId);
    }

    /*==============================
    =      PUBLIC & EXTERNAL       =
    ==============================*/
    function payNativeCurrencyOrder(uint256 orderId)
        external
        payable
        override
        isActive()
    {
        require(
            !_orderIdIsExecuted[orderId],
            "This order is executed already."
        );
        _orderIdIsExecuted[orderId] = true;
        OnPayedNativeCurrencyOrder(orderId, msg.value);
    }

    function payTokenOrder(
        uint256 orderId,
        address tokenAddress,
        uint256 amount
    ) external override isActive() {
        require(
            _tokenAddressIsAllowed[tokenAddress],
            "This token is not allowed."
        );
        require(
            !_orderIdIsExecuted[orderId],
            "This order is executed already."
        );
        IERC20 tokenContract = IERC20(tokenAddress);

        bool success =
            tokenContract.transferFrom(msg.sender, address(this), amount);
        require(success, "Paying the order with tokens failed.");

        _orderIdIsExecuted[orderId] = true;
        OnPayedTokenOrder(orderId, tokenAddress, amount);
    }

    /*==============================
    =          RESTRICTED          =
    ==============================*/
    function updateAllowedToken(address tokenAddress, bool allowed)
        public
        override
        isAuthorizedWallet()
    {
        _updateAllowedToken(tokenAddress, allowed);
    }

    function updateWithdrawAddress(address payable withdrawAddress)
        public
        override
        isAuthorizedWallet()
    {
        _updateWithdrawAddress(withdrawAddress);
    }

    function withdraw() external override isAuthorizedOwner(msg.sender) {
        uint256 amount = address(this).balance;
        _withdrawAddress.transfer(amount);

        emit OnEthWithdraw(_withdrawAddress, amount);
    }

    function withdrawToken(address tokenAddress)
        external
        override
        isAuthorizedOwner(msg.sender)
    {
        IERC20 erc20Contract = IERC20(tokenAddress);
        uint256 amount = erc20Contract.balanceOf(address(this));
        erc20Contract.transfer(_withdrawAddress, amount);

        emit OnTokenWithdraw(_withdrawAddress, tokenAddress, amount);
    }

    /*==============================
    =          VIEW & PURE         =
    ==============================*/
    function isTokenAllowed(address tokenAddress)
        public
        view
        override
        returns (bool)
    {
        return _tokenAddressIsAllowed[tokenAddress];
    }

    function isOrderIdExecuted(uint256 orderId)
        public
        view
        override
        returns (bool)
    {
        return _orderIdIsExecuted[orderId];
    }

    function getWithdrawAddress() public view override returns (address) {
        return _withdrawAddress;
    }

    /*==============================
    =      INTERNAL & PRIVATE      =
    ==============================*/
    function _updateWithdrawAddress(address payable withdrawAddress) private {
        _withdrawAddress = withdrawAddress;
        OnWithdrawAddressUpdate(withdrawAddress);
    }

    function _updateAllowedToken(address tokenAddress, bool allowed) private {
        _tokenAddressIsAllowed[tokenAddress] = allowed;
        OnTokenUpdate(tokenAddress, allowed);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"address[]","name":"allowedTokens","type":"address[]"},{"internalType":"uint256","name":"_required","type":"uint256"},{"internalType":"address","name":"registryAddress","type":"address"},{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Activated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Execution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"ExecutionFailure","type":"event"},{"anonymous":false,"inputs":[],"name":"Inactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OnEthWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OnPayedNativeCurrencyOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OnPayedTokenOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"OnTokenUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OnTokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"}],"name":"OnWithdrawAddressUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"required","type":"uint256"}],"name":"RequirementChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Revocation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Submission","type":"event"},{"inputs":[],"name":"MAX_OWNER_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"addOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_required","type":"uint256"}],"name":"changeRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"confirmTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"confirmations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"executeTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"getConfirmationCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"getConfirmations","outputs":[{"internalType":"address[]","name":"_confirmations","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"key","type":"uint256"}],"name":"getContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"pending","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"}],"name":"getTransactionCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"bool","name":"pending","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"}],"name":"getTransactionIds","outputs":[{"internalType":"uint256[]","name":"_transactionIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"isConfirmed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"isOrderIdExecuted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"isTokenAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"payNativeCurrencyOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"payTokenOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"removeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"replaceOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"required","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"revokeConfirmation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setInactive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registryAddress","type":"address"}],"name":"setRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"submitTransaction","outputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bool","name":"executed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"updateAllowedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"updateWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5060405162003aa038038062003aa0833981016040819052620000349162000638565b848383806200004a6301ffc9a760e01b620003c2565b60018054610100600160a81b0319166101006001600160a01b038416021790556200007c6389edd2db60e01b620003c2565b5082518260328211158015620000925750818111155b80156200009e57508015155b8015620000aa57508115155b6200010f5760405162461bcd60e51b815260206004820152602a60248201527f54686973206368616e676520696e20726571756972656d656e74206973206e6f6044820152693a1030b63637bbb2b21760b11b60648201526084015b60405180910390fd5b60005b85518110156200029f57600460008783815181106200014157634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16158015620001b1575060006001600160a01b03168682815181106200019d57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614155b620002315760405162461bcd60e51b815260206004820152604360248201527f416e206f776e6572206164647265737320697320696e636c75646564206d756c60448201527f7469706c652074696d6573206f7220617320746865207a65726f2d616464726560648201526239b99760e91b608482015260a40162000106565b6001600460008884815181106200025857634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806200029681620006d5565b91505062000112565b508451620002b5906005906020880190620004f6565b506006849055620002cd630271189760e51b620003c2565b620002df633fbd7d3b60e21b620003c2565b50505050506001600160a01b0381166200033c5760405162461bcd60e51b815260206004820152601e60248201527f4120776974686472617720616464726573732069732072657175697265640000604482015260640162000106565b60005b84518110156200039957620003848582815181106200036e57634e487b7160e01b600052603260045260246000fd5b602002602001015160016200044360201b60201c565b806200039081620006d5565b9150506200033f565b50620003a581620004a2565b620003b763f1a5d83960e01b620003c2565b50505050506200072c565b6001600160e01b031980821614156200041e5760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640162000106565b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b6001600160a01b038216600081815260086020908152604091829020805460ff191685151590811790915591519182527f13362eeee30560397ac30f32fd5beb0392582868bc10dc6cfca1b73e2d832d9d910160405180910390a25050565b600a80546001600160a01b0319166001600160a01b0383169081179091556040519081527fc0525b5837156cf0d3bcf4e2735ef832bcf6c0a36ab8f8bc445aeb9b341582d49060200160405180910390a150565b8280548282559060005260206000209081019282156200054e579160200282015b828111156200054e57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000517565b506200055c92915062000560565b5090565b5b808211156200055c576000815560010162000561565b8051620005848162000713565b919050565b600082601f8301126200059a578081fd5b815160206001600160401b0380831115620005b957620005b9620006fd565b818302604051601f19603f83011681018181108482111715620005e057620005e0620006fd565b60405284815283810192508684018288018501891015620005ff578687fd5b8692505b858310156200062c57620006178162000577565b84529284019260019290920191840162000603565b50979650505050505050565b600080600080600060a0868803121562000650578081fd5b85516001600160401b038082111562000667578283fd5b6200067589838a0162000589565b965060208801519150808211156200068b578283fd5b506200069a8882890162000589565b945050604086015192506060860151620006b48162000713565b6080870151909250620006c78162000713565b809150509295509295909350565b6000600019821415620006f657634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200072957600080fd5b50565b613364806200073c6000396000f3fe6080604052600436106102bf5760003560e01c8063a8abe69a1161016e578063dc8452cd116100cb578063f1b9ee241161007f578063f23a6e6111610064578063f23a6e611461083b578063f9eaee0d14610881578063fba7cc79146108ba57610302565b8063f1b9ee2414610802578063f21de1e81461081757610302565b8063e8e7f800116100b0578063e8e7f800146107b1578063ee22610b146107cf578063f14f571c146107ef57610302565b8063dc8452cd1461077b578063e20056e61461079157610302565b8063ba51a6df11610122578063c01a8c8411610107578063c01a8c8414610726578063c642747414610746578063d74f8edd1461076657610302565b8063ba51a6df1461068d578063bc197c81146106ad57610302565b8063aefa7d9811610153578063aefa7d9814610637578063b5dc40c314610657578063b77bf6001461067757610302565b8063a8abe69a146105ea578063a91ee0dc1461061757610302565b8063547415251161021c57806389476069116101d05780639ace38c2116101b55780639ace38c214610578578063a0e67e2b146105a8578063a3f4b573146105ca57610302565b806389476069146105385780638b51d13f1461055857610302565b8063715489b411610201578063715489b4146104e3578063760a8c2a14610503578063784547a71461051857610302565b806354741525146104a35780637065cb48146104c357610302565b80632f54bf6e1161027357806334ce2b1a1161025857806334ce2b1a1461043e5780633ccfd60b1461046e578063420138971461048357610302565b80632f54bf6e146103d35780633411c81c1461040357610302565b80631398a5f6116102a45780631398a5f614610374578063173825d91461039357806320ea8d86146103b357610302565b806301ffc9a714610307578063025e7c271461033c57610302565b366103025734156103005760405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a25b005b600080fd5b34801561031357600080fd5b5061032761032236600461304c565b6108d2565b60405190151581526020015b60405180910390f35b34801561034857600080fd5b5061035c61035736600461308c565b61090d565b6040516001600160a01b039091168152602001610333565b34801561038057600080fd5b506006545b604051908152602001610333565b34801561039f57600080fd5b506103006103ae366004612d79565b610937565b3480156103bf57600080fd5b506103006103ce36600461308c565b610bda565b3480156103df57600080fd5b506103276103ee366004612d79565b60046020526000908152604090205460ff1681565b34801561040f57600080fd5b5061032761041e3660046130bc565b600360209081526000928352604080842090915290825290205460ff1681565b34801561044a57600080fd5b5061032761045936600461308c565b60009081526009602052604090205460ff1690565b34801561047a57600080fd5b50610300610d8f565b34801561048f57600080fd5b5061030061049e3660046130e0565b610e70565b3480156104af57600080fd5b506103856104be36600461302f565b6110be565b3480156104cf57600080fd5b506103006104de366004612d79565b61113b565b3480156104ef57600080fd5b506103006104fe366004612f1e565b6113af565b34801561050f57600080fd5b50610300611428565b34801561052457600080fd5b5061032761053336600461308c565b611467565b34801561054457600080fd5b50610300610553366004612d79565b611515565b34801561056457600080fd5b5061038561057336600461308c565b6116f5565b34801561058457600080fd5b5061059861059336600461308c565b611789565b6040516103339493929190613160565b3480156105b457600080fd5b506105bd611849565b60405161033391906131db565b3480156105d657600080fd5b506103006105e5366004612d79565b6118ab565b3480156105f657600080fd5b5061060a610605366004613117565b611922565b6040516103339190613228565b34801561062357600080fd5b50610300610632366004612d79565b611b00565b34801561064357600080fd5b5061035c61065236600461308c565b611ce5565b34801561066357600080fd5b506105bd61067236600461308c565b611d81565b34801561068357600080fd5b5061038560075481565b34801561069957600080fd5b506103006106a836600461308c565b611fbb565b3480156106b957600080fd5b506106f56106c8366004612de9565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610333565b34801561073257600080fd5b5061030061074136600461308c565b612100565b34801561075257600080fd5b50610385610761366004612f4b565b6122da565b34801561077257600080fd5b50610385603281565b34801561078757600080fd5b5061038560065481565b34801561079d57600080fd5b506103006107ac366004612db1565b6122f9565b3480156107bd57600080fd5b50600a546001600160a01b031661035c565b3480156107db57600080fd5b506103006107ea36600461308c565b61258d565b6103006107fd36600461308c565b612856565b34801561080e57600080fd5b50610300612915565b34801561082357600080fd5b5061035c60015461010090046001600160a01b031690565b34801561084757600080fd5b506106f5610856366004612ea4565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b34801561088d57600080fd5b5061032761089c366004612d79565b6001600160a01b031660009081526008602052604090205460ff1690565b3480156108c657600080fd5b5060015460ff16610327565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b6005818154811061091d57600080fd5b6000918252602090912001546001600160a01b0316905081565b3330146109a75760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b60648201526084015b60405180910390fd5b6001600160a01b038116600090815260046020526040902054819060ff16610a115760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e000000604482015260640161099e565b6001600160a01b0382166000908152600460205260408120805460ff191690555b600554610a4190600190613278565b811015610b3b57826001600160a01b031660058281548110610a7357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610b295760058054610a9e90600190613278565b81548110610abc57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600580546001600160a01b039092169183908110610af657634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610b3b565b80610b33816132c4565b915050610a32565b506005805480610b5b57634e487b7160e01b600052603160045260246000fd5b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff191690550190556005546006541115610ba257600554610ba290611fbb565b6040516001600160a01b038316907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a25050565b3360008181526004602052604090205460ff16610c395760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e000000604482015260640161099e565b60008281526003602090815260408083203380855292529091205483919060ff16610ccc5760405162461bcd60e51b815260206004820152603160248201527f546865206f776e657220646964206e6f7420636f6e6669726d2074686973207460448201527f72616e73616374696f6e4964207965742e000000000000000000000000000000606482015260840161099e565b600084815260026020526040902060030154849060ff1615610d405760405162461bcd60e51b815260206004820152602760248201527f54686973207472616e73616374696f6e49642069732065786563757465642061604482015266363932b0b23c9760c91b606482015260840161099e565b6000858152600360209081526040808320338085529252808320805460ff191690555187927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35050505050565b3360008181526004602052604090205460ff16610dee5760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e000000604482015260640161099e565b600a5460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610e28573d6000803e3d6000fd5b50600a546040518281526001600160a01b03909116907f467c3e0e755faea08e1553e4da10e9591378c4783d6d35f274e621b47ffddfe1906020015b60405180910390a25050565b610e78612952565b6001600160a01b03821660009081526008602052604090205460ff16610ee05760405162461bcd60e51b815260206004820152601a60248201527f5468697320746f6b656e206973206e6f7420616c6c6f7765642e000000000000604482015260640161099e565b60008381526009602052604090205460ff1615610f3f5760405162461bcd60e51b815260206004820152601f60248201527f54686973206f7264657220697320657865637574656420616c72656164792e00604482015260640161099e565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905282906000906001600160a01b038316906323b872dd90606401602060405180830381600087803b158015610fab57600080fd5b505af1158015610fbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe39190613013565b9050806110575760405162461bcd60e51b8152602060048201526024808201527f506179696e6720746865206f72646572207769746820746f6b656e732066616960448201527f6c65642e00000000000000000000000000000000000000000000000000000000606482015260840161099e565b60008581526009602052604090819020805460ff19166001179055516001600160a01b0385169086907fdf6c11ebc9c2bda4f52003405af401b8283c6f4abfbd5db3233f74c5b8bb57f6906110af9087815260200190565b60405180910390a35050505050565b6000805b600754811015611134578380156110eb575060008181526002602052604090206003015460ff16155b8061110f575082801561110f575060008181526002602052604090206003015460ff165b156111225761111f600183613260565b91505b8061112c816132c4565b9150506110c2565b5092915050565b3330146111a65760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b606482015260840161099e565b6001600160a01b038116600090815260046020526040902054819060ff16156112115760405162461bcd60e51b815260206004820152601960248201527f54686973206164647265737320697320616e206f776e65722e00000000000000604482015260640161099e565b816001600160a01b0381166112685760405162461bcd60e51b815260206004820181905260248201527f546865207a65726f2d61646472657373206973206e6f7420616c6c6f7765642e604482015260640161099e565b600554611276906001613260565b6006546032821115801561128a5750818111155b801561129557508015155b80156112a057508115155b6113125760405162461bcd60e51b815260206004820152602a60248201527f54686973206368616e676520696e20726571756972656d656e74206973206e6f60448201527f7420616c6c6f7765642e00000000000000000000000000000000000000000000606482015260840161099e565b6001600160a01b038516600081815260046020526040808220805460ff1916600190811790915560058054918201815583527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db001805473ffffffffffffffffffffffffffffffffffffffff191684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b33301461141a5760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b606482015260840161099e565b61142482826129aa565b5050565b611430612a02565b6001805460ff1916811790556040517fed1cd0670ee0c0017f550451a038818c696d0b6a9d6ce5b369e44275573cf9b090600090a1565b600080805b60055481101561150b57600084815260036020526040812060058054919291849081106114a957634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16156114e4576114e1600183613260565b91505b6006548214156114f957600192505050610908565b80611503816132c4565b91505061146c565b5060009392505050565b3360008181526004602052604090205460ff166115745760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e000000604482015260640161099e565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282906000906001600160a01b038316906370a082319060240160206040518083038186803b1580156115d157600080fd5b505afa1580156115e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160991906130a4565b600a546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561167257600080fd5b505af1158015611686573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116aa9190613013565b50600a546040518281526001600160a01b038681169216907fead62a0895e2f4028883bce189e7f527dd9fc82732d0a40bb6c5a6e1b97c1cb59060200160405180910390a350505050565b6000805b600554811015611783576000838152600360205260408120600580549192918490811061173657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16156117715761176e600183613260565b91505b8061177b816132c4565b9150506116f9565b50919050565b60026020819052600091825260409091208054600182015492820180546001600160a01b039092169392916117bd9061328f565b80601f01602080910402602001604051908101604052809291908181526020018280546117e99061328f565b80156118365780601f1061180b57610100808354040283529160200191611836565b820191906000526020600020905b81548152906001019060200180831161181957829003601f168201915b5050506003909301549192505060ff1684565b606060058054806020026020016040519081016040528092919081815260200182805480156118a157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611883575b5050505050905090565b3330146119165760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b606482015260840161099e565b61191f81612a86565b50565b6060600060075467ffffffffffffffff81111561194f57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611978578160200160208202803683370190505b5090506000805b600754811015611a1d578580156119a8575060008181526002602052604090206003015460ff16155b806119cc57508480156119cc575060008181526002602052604090206003015460ff165b15611a0b57808383815181106119f257634e487b7160e01b600052603260045260246000fd5b6020908102919091010152611a08600183613260565b91505b80611a15816132c4565b91505061197f565b611a278888613278565b67ffffffffffffffff811115611a4d57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611a76578160200160208202803683370190505b5093508790505b86811015611af557828181518110611aa557634e487b7160e01b600052603260045260246000fd5b6020026020010151848983611aba9190613278565b81518110611ad857634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611aed816132c4565b915050611a7d565b505050949350505050565b611b08612ae7565b600180547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b03841602179055611b5660015461010090046001600160a01b031690565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f60e56d110000000000000000000000000000000000000000000000000000000060048201526001600160a01b0391909116906301ffc9a79060240160206040518083038186803b158015611bd057600080fd5b505afa925050508015611c00575060408051601f3d908101601f19168201909252611bfd91810190613013565b60015b611c725760405162461bcd60e51b815260206004820152603f60248201527f5468652070726f766964656420636f6e747261637420646f6573206e6f74206960448201527f6d706c656d656e742074686520526567697374727920696e7465726661636500606482015260840161099e565b806114245760405162461bcd60e51b815260206004820152603f60248201527f5468652070726f766964656420636f6e747261637420646f6573206e6f74206960448201527f6d706c656d656e742074686520526567697374727920696e7465726661636500606482015260840161099e565b6000611cfe60015461010090046001600160a01b031690565b6001600160a01b0316639507d39a836040518263ffffffff1660e01b8152600401611d2b91815260200190565b60206040518083038186803b158015611d4357600080fd5b505afa158015611d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7b9190612d95565b92915050565b60055460609060009067ffffffffffffffff811115611db057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611dd9578160200160208202803683370190505b5090506000805b600554811015611ee15760008581526003602052604081206005805491929184908110611e1d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1615611ecf5760058181548110611e6b57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316838381518110611ea957634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152611ecc600183613260565b91505b80611ed9816132c4565b915050611de0565b8167ffffffffffffffff811115611f0857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611f31578160200160208202803683370190505b509350600090505b81811015611fb357828181518110611f6157634e487b7160e01b600052603260045260246000fd5b6020026020010151848281518110611f8957634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280611fab816132c4565b915050611f39565b505050919050565b3330146120265760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b606482015260840161099e565b600554816032821180159061203b5750818111155b801561204657508015155b801561205157508115155b6120c35760405162461bcd60e51b815260206004820152602a60248201527f54686973206368616e676520696e20726571756972656d656e74206973206e6f60448201527f7420616c6c6f7765642e00000000000000000000000000000000000000000000606482015260840161099e565b60068390556040518381527fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9060200160405180910390a1505050565b3360008181526004602052604090205460ff1661215f5760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e000000604482015260640161099e565b60008281526002602052604090205482906001600160a01b03166121eb5760405162461bcd60e51b815260206004820152602b60248201527f546865207472616e73616374696f6e2064657374696e6174696f6e20646f657360448201527f206e6f742065786973742e000000000000000000000000000000000000000000606482015260840161099e565b60008381526003602090815260408083203380855292529091205484919060ff161561227f5760405162461bcd60e51b815260206004820152603260248201527f54686973206f776e65722064696420636f6e6669726d2074686973207472616e60448201527f73616374696f6e496420616c72656164792e0000000000000000000000000000606482015260840161099e565b6000858152600360209081526040808320338085529252808320805460ff191660011790555187927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a36122d38561258d565b5050505050565b60006122e7848484612af1565b90506122f281612100565b9392505050565b3330146123645760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b606482015260840161099e565b6001600160a01b038216600090815260046020526040902054829060ff166123ce5760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e000000604482015260640161099e565b6001600160a01b038216600090815260046020526040902054829060ff16156124395760405162461bcd60e51b815260206004820152601960248201527f54686973206164647265737320697320616e206f776e65722e00000000000000604482015260640161099e565b60005b6005548110156124f357846001600160a01b03166005828154811061247157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156124e15783600582815481106124ae57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506124f3565b806124eb816132c4565b91505061243c565b506001600160a01b03808516600081815260046020526040808220805460ff1990811690915593871682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a26040516001600160a01b038416907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a250505050565b3360008181526004602052604090205460ff166125ec5760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e000000604482015260640161099e565b60008281526003602090815260408083203380855292529091205483919060ff1661267f5760405162461bcd60e51b815260206004820152603160248201527f546865206f776e657220646964206e6f7420636f6e6669726d2074686973207460448201527f72616e73616374696f6e4964207965742e000000000000000000000000000000606482015260840161099e565b600084815260026020526040902060030154849060ff16156126f35760405162461bcd60e51b815260206004820152602760248201527f54686973207472616e73616374696f6e49642069732065786563757465642061604482015266363932b0b23c9760c91b606482015260840161099e565b6126fc85611467565b156122d357600085815260026020819052604090912060038101805460ff19166001908117909155815490820154928201805492936127e1936001600160a01b039093169290919061274d9061328f565b905084600201805461275e9061328f565b80601f016020809104026020016040519081016040528092919081815260200182805461278a9061328f565b80156127d75780601f106127ac576101008083540402835291602001916127d7565b820191906000526020600020905b8154815290600101906020018083116127ba57829003601f168201915b5050505050612c34565b156128165760405186907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a261284e565b60405186907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038101805460ff191690555b505050505050565b61285e612952565b60008181526009602052604090205460ff16156128bd5760405162461bcd60e51b815260206004820152601f60248201527f54686973206f7264657220697320657865637574656420616c72656164792e00604482015260640161099e565b60008181526009602052604090819020805460ff191660011790555181907f0f93009611cf5f44add3863d6f218a4082680ea594ee68db48a2b6924a10fb9b9061290a9034815260200190565b60405180910390a250565b61291d612a02565b6001805460ff191690556040517f83b03c3d41b5de9902c98822951ff375666c0cd7fd69f8993c0267ad087734d190600090a1565b6001805460ff161515146129a85760405162461bcd60e51b815260206004820152601a60248201527f54686520636f6e7472616374206973206e6f7420616374697665000000000000604482015260640161099e565b565b6001600160a01b038216600081815260086020908152604091829020805460ff191685151590811790915591519182527f13362eeee30560397ac30f32fd5beb0392582868bc10dc6cfca1b73e2d832d9d9101610e64565b60015461010090046001600160a01b0316331480612a3a5750612a256001611ce5565b6001600160a01b0316336001600160a01b0316145b6129a85760405162461bcd60e51b815260206004820152601160248201527f556e617574686f72697a65642063616c6c000000000000000000000000000000604482015260640161099e565b600a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fc0525b5837156cf0d3bcf4e2735ef832bcf6c0a36ab8f8bc445aeb9b341582d49060200160405180910390a150565b612a256001611ce5565b6000836001600160a01b038116612b4a5760405162461bcd60e51b815260206004820181905260248201527f546865207a65726f2d61646472657373206973206e6f7420616c6c6f7765642e604482015260640161099e565b600754604080516080810182526001600160a01b038881168252602080830189815283850189815260006060860181905287815260028085529690208551815473ffffffffffffffffffffffffffffffffffffffff191695169490941784559051600184015551805195975092949193612bca9390850192910190612c57565b50606091909101516003909101805460ff19169115159190911790556007805460019190600090612bfc908490613260565b909155505060405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a2509392505050565b6000806040516020840160008287838a8c6187965a03f198975050505050505050565b828054612c639061328f565b90600052602060002090601f016020900481019282612c855760008555612ccb565b82601f10612c9e57805160ff1916838001178555612ccb565b82800160010185558215612ccb579182015b82811115612ccb578251825591602001919060010190612cb0565b50612cd7929150612cdb565b5090565b5b80821115612cd75760008155600101612cdc565b60008083601f840112612d01578182fd5b50813567ffffffffffffffff811115612d18578182fd5b6020830191508360208083028501011115612d3257600080fd5b9250929050565b60008083601f840112612d4a578182fd5b50813567ffffffffffffffff811115612d61578182fd5b602083019150836020828501011115612d3257600080fd5b600060208284031215612d8a578081fd5b81356122f28161330b565b600060208284031215612da6578081fd5b81516122f28161330b565b60008060408385031215612dc3578081fd5b8235612dce8161330b565b91506020830135612dde8161330b565b809150509250929050565b60008060008060008060008060a0898b031215612e04578384fd5b8835612e0f8161330b565b97506020890135612e1f8161330b565b9650604089013567ffffffffffffffff80821115612e3b578586fd5b612e478c838d01612cf0565b909850965060608b0135915080821115612e5f578586fd5b612e6b8c838d01612cf0565b909650945060808b0135915080821115612e83578384fd5b50612e908b828c01612d39565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215612ebc578182fd5b8635612ec78161330b565b95506020870135612ed78161330b565b94506040870135935060608701359250608087013567ffffffffffffffff811115612f00578283fd5b612f0c89828a01612d39565b979a9699509497509295939492505050565b60008060408385031215612f30578182fd5b8235612f3b8161330b565b91506020830135612dde81613320565b600080600060608486031215612f5f578283fd5b8335612f6a8161330b565b925060208401359150604084013567ffffffffffffffff80821115612f8d578283fd5b818601915086601f830112612fa0578283fd5b813581811115612fb257612fb26132f5565b604051601f8201601f19908116603f01168101908382118183101715612fda57612fda6132f5565b81604052828152896020848701011115612ff2578586fd5b82602086016020830137856020848301015280955050505050509250925092565b600060208284031215613024578081fd5b81516122f281613320565b60008060408385031215613041578182fd5b8235612f3b81613320565b60006020828403121561305d578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146122f2578182fd5b60006020828403121561309d578081fd5b5035919050565b6000602082840312156130b5578081fd5b5051919050565b600080604083850312156130ce578182fd5b823591506020830135612dde8161330b565b6000806000606084860312156130f4578081fd5b8335925060208401356131068161330b565b929592945050506040919091013590565b6000806000806080858703121561312c578182fd5b8435935060208501359250604085013561314581613320565b9150606085013561315581613320565b939692955090935050565b60006001600160a01b038616825260208581840152608060408401528451806080850152825b818110156131a25786810183015185820160a001528201613186565b818111156131b3578360a083870101525b50601f01601f1916830160a00191506131d29050606083018415159052565b95945050505050565b6020808252825182820181905260009190848201906040850190845b8181101561321c5783516001600160a01b0316835292840192918401916001016131f7565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561321c57835183529284019291840191600101613244565b60008219821115613273576132736132df565b500190565b60008282101561328a5761328a6132df565b500390565b6002810460018216806132a357607f821691505b6020821081141561178357634e487b7160e01b600052602260045260246000fd5b60006000198214156132d8576132d86132df565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461191f57600080fd5b801515811461191f57600080fdfea26469706673582212202143822cc5a06f62c9b1d75ab52f7fc37cf1ef04ba3f5dbc79542677942665e764736f6c6343000802003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000801b308f0213445e070f0d0cc052db38c17eda5100000000000000000000000022de936854e40350d01f47724fd047d4de0f26a1000000000000000000000000000000000000000000000000000000000000000300000000000000000000000022de936854e40350d01f47724fd047d4de0f26a100000000000000000000000099723a4a9d9b3c3cecba16e2e3ed924abd1d55f6000000000000000000000000b224cb543fa10cf2983c557c029cd874c1ace0cc0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000831753dd7087cac61ab5644b308642cc1c33dc130000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa841740000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f6190000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000001bfd67037b42cf73acf2047067bd4f2c47d9bfd6

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000801b308f0213445e070f0d0cc052db38c17eda5100000000000000000000000022de936854e40350d01f47724fd047d4de0f26a1000000000000000000000000000000000000000000000000000000000000000300000000000000000000000022de936854e40350d01f47724fd047d4de0f26a100000000000000000000000099723a4a9d9b3c3cecba16e2e3ed924abd1d55f6000000000000000000000000b224cb543fa10cf2983c557c029cd874c1ace0cc0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000831753dd7087cac61ab5644b308642cc1c33dc130000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa841740000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f6190000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000001bfd67037b42cf73acf2047067bd4f2c47d9bfd6

-----Decoded View---------------
Arg [0] : _owners (address[]): 0x22de936854e40350d01f47724fd047d4de0f26a1,0x99723a4a9d9b3c3cecba16e2e3ed924abd1d55f6,0xb224cb543fa10cf2983c557c029cd874c1ace0cc
Arg [1] : allowedTokens (address[]): 0x831753dd7087cac61ab5644b308642cc1c33dc13,0x2791bca1f2de4661ed88a30c99a7a9449aa84174,0x7ceb23fd6bc0add59e62ac25578270cff1b9f619,0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270,0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6
Arg [2] : _required (uint256): 2
Arg [3] : registryAddress (address): 0x801b308f0213445e070f0d0cc052db38c17eda51
Arg [4] : withdrawAddress (address): 0x22de936854e40350d01f47724fd047d4de0f26a1

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 000000000000000000000000801b308f0213445e070f0d0cc052db38c17eda51
Arg [4] : 00000000000000000000000022de936854e40350d01f47724fd047d4de0f26a1
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 00000000000000000000000022de936854e40350d01f47724fd047d4de0f26a1
Arg [7] : 00000000000000000000000099723a4a9d9b3c3cecba16e2e3ed924abd1d55f6
Arg [8] : 000000000000000000000000b224cb543fa10cf2983c557c029cd874c1ace0cc
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [10] : 000000000000000000000000831753dd7087cac61ab5644b308642cc1c33dc13
Arg [11] : 0000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa84174
Arg [12] : 0000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f619
Arg [13] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Arg [14] : 0000000000000000000000001bfd67037b42cf73acf2047067bd4f2c47d9bfd6


Deployed ByteCode Sourcemap

44955:5297:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32963:9;:13;32959:81;;32998:30;;33018:9;18347:25:1;;33006:10:0;;32998:30;;18335:2:1;18320:18;32998:30:0;;;;;;;32959:81;44955:5297;;;;;16957:183;;;;;;;;;;-1:-1:-1;16957:183:0;;;;;:::i;:::-;;:::i;:::-;;;12107:14:1;;12100:22;12082:41;;12070:2;12055:18;16957:183:0;;;;;;;;29470:23;;;;;;;;;;-1:-1:-1;29470:23:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8718:55:1;;;8700:74;;8688:2;8673:18;29470:23:0;8655:125:1;37869:96:0;;;;;;;;;;-1:-1:-1;37949:8:0;;37869:96;;;18347:25:1;;;18335:2;18320:18;37869:96:0;18302:76:1;33788:524:0;;;;;;;;;;-1:-1:-1;33788:524:0;;;;;:::i;:::-;;:::i;35494:331::-;;;;;;;;;;-1:-1:-1;35494:331:0;;;;;:::i;:::-;;:::i;29424:39::-;;;;;;;;;;-1:-1:-1;29424:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29352:65;;;;;;;;;;-1:-1:-1;29352:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;49464:174;;;;;;;;;;-1:-1:-1;49464:174:0;;;;;:::i;:::-;49574:4;49603:27;;;:18;:27;;;;;;;;;49464:174;48530:226;;;;;;;;;;;;;:::i;47286:721::-;;;;;;;;;;-1:-1:-1;47286:721:0;;;;;:::i;:::-;;:::i;37384:368::-;;;;;;;;;;-1:-1:-1;37384:368:0;;;;;:::i;:::-;;:::i;33460:320::-;;;;;;;;;;-1:-1:-1;33460:320:0;;;;;:::i;:::-;;:::i;48129:194::-;;;;;;;;;;-1:-1:-1;48129:194:0;;;;;:::i;:::-;;:::i;25651:133::-;;;;;;;;;;;;;:::i;36733:365::-;;;;;;;;;;-1:-1:-1;36733:365:0;;;;;:::i;:::-;;:::i;48764:385::-;;;;;;;;;;-1:-1:-1;48764:385:0;;;;;:::i;:::-;;:::i;37106:270::-;;;;;;;;;;-1:-1:-1;37106:270:0;;;;;:::i;:::-;;:::i;29294:51::-;;;;;;;;;;-1:-1:-1;29294:51:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;37760:101::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;48331:191::-;;;;;;;;;;-1:-1:-1;48331:191:0;;;;;:::i;:::-;;:::i;38597:769::-;;;;;;;;;;-1:-1:-1;38597:769:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25938:615::-;;;;;;;;;;-1:-1:-1;25938:615:0;;;;;:::i;:::-;;:::i;26896:175::-;;;;;;;;;;-1:-1:-1;26896:175:0;;;;;:::i;:::-;;:::i;37973:616::-;;;;;;;;;;-1:-1:-1;37973:616:0;;;;;:::i;:::-;;:::i;29530:31::-;;;;;;;;;;;;;;;;34843:250;;;;;;;;;;-1:-1:-1;34843:250:0;;;;;:::i;:::-;;:::i;39595:246::-;;;;;;;;;;-1:-1:-1;39595:246:0;;;;;:::i;:::-;39811:22;39595:246;;;;;;;;;;;;;;12308:66:1;12296:79;;;12278:98;;12266:2;12251:18;39595:246:0;12233:149:1;35101:385:0;;;;;;;;;;-1:-1:-1;35101:385:0;;;;;:::i;:::-;;:::i;33055:283::-;;;;;;;;;;-1:-1:-1;33055:283:0;;;;;:::i;:::-;;:::i;29127:44::-;;;;;;;;;;;;29169:2;29127:44;;29500:23;;;;;;;;;;;;;;;;34320:515;;;;;;;;;;-1:-1:-1;34320:515:0;;;;;:::i;:::-;;:::i;49646:111::-;;;;;;;;;;-1:-1:-1;49733:16:0;;-1:-1:-1;;;;;49733:16:0;49646:111;;35833:778;;;;;;;;;;-1:-1:-1;35833:778:0;;;;;:::i;:::-;;:::i;46921:357::-;;;;;;:::i;:::-;;:::i;25792:138::-;;;;;;;;;;;;;:::i;26777:111::-;;;;;;;;;;;;26864:16;;;;;-1:-1:-1;;;;;26864:16:0;;26777:111;39374:213;;;;;;;;;;-1:-1:-1;39374:213:0;;;;;:::i;:::-;39563:16;39374:213;;;;;;;;;49271:185;;;;;;;;;;-1:-1:-1;49271:185:0;;;;;:::i;:::-;-1:-1:-1;;;;;49412:36:0;49383:4;49412:36;;;:22;:36;;;;;;;;;49271:185;26675:94;;;;;;;;;;-1:-1:-1;26752:9:0;;;;26675:94;;16957:183;17099:33;;;17070:4;17099:33;;;;;;;;;;;;;16957:183;;;;:::o;29470:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29470:23:0;;-1:-1:-1;29470:23:0;:::o;33788:524::-;29881:10;29903:4;29881:27;29859:128;;;;-1:-1:-1;;;29859:128:0;;14909:2:1;29859:128:0;;;14891:21:1;14948:2;14928:18;;;14921:30;14987:34;14967:18;;;14960:62;-1:-1:-1;;;15038:18:1;;;15031:49;15097:19;;29859:128:0;;;;;;;;;-1:-1:-1;;;;;30076:14:0;::::1;;::::0;;;:7:::1;:14;::::0;;;;;33915:5;;30076:14:::1;;30068:56;;;::::0;-1:-1:-1;;;30068:56:0;;14551:2:1;30068:56:0::1;::::0;::::1;14533:21:1::0;14590:2;14570:18;;;14563:30;14629:31;14609:18;;;14602:59;14678:18;;30068:56:0::1;14523:179:1::0;30068:56:0::1;-1:-1:-1::0;;;;;33938:14:0;::::2;33955:5;33938:14:::0;;;:7:::2;:14;::::0;;;;:22;;-1:-1:-1;;33938:22:0::2;::::0;;33971:181:::2;33995:6;:13:::0;:17:::2;::::0;34011:1:::2;::::0;33995:17:::2;:::i;:::-;33991:1;:21;33971:181;;;34049:5;-1:-1:-1::0;;;;;34036:18:0::2;:6;34043:1;34036:9;;;;;;-1:-1:-1::0;;;34036:9:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;34036:9:0::2;:18;34032:120;;;34087:6;34094:13:::0;;:17:::2;::::0;34110:1:::2;::::0;34094:17:::2;:::i;:::-;34087:25;;;;;;-1:-1:-1::0;;;34087:25:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;34075:6:::2;:9:::0;;-1:-1:-1;;;;;34087:25:0;;::::2;::::0;34082:1;;34075:9;::::2;;;-1:-1:-1::0;;;34075:9:0::2;;;;;;;;;;;;;;;;;:37;;;;;-1:-1:-1::0;;;;;34075:37:0::2;;;;;-1:-1:-1::0;;;;;34075:37:0::2;;;;;;34131:5;;34032:120;34014:3:::0;::::2;::::0;::::2;:::i;:::-;;;;33971:181;;;;34162:6;:12;;;;;-1:-1:-1::0;;;34162:12:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;;-1:-1:-1;;34162:12:0;;;;;-1:-1:-1;;34162:12:0::2;::::0;;;;;34222:6:::2;:13:::0;34211:8:::2;::::0;:24:::2;34207:62;;;34255:6;:13:::0;34237:32:::2;::::0;:17:::2;:32::i;:::-;34285:19;::::0;-1:-1:-1;;;;;34285:19:0;::::2;::::0;::::2;::::0;;;::::2;29998:1:::1;33788:524:::0;:::o;35494:331::-;35606:10;30076:14;;;;:7;:14;;;;;;;;30068:56;;;;-1:-1:-1;;;30068:56:0;;14551:2:1;30068:56:0;;;14533:21:1;14590:2;14570:18;;;14563:30;14629:31;14609:18;;;14602:59;14678:18;;30068:56:0;14523:179:1;30068:56:0;30613:28:::1;::::0;;;:13:::1;:28;::::0;;;;;;;35652:10:::1;30613:35:::0;;;;;;;;;35637:13;;35652:10;30613:35:::1;;30591:134;;;::::0;-1:-1:-1;;;30591:134:0;;17985:2:1;30591:134:0::1;::::0;::::1;17967:21:1::0;18024:2;18004:18;;;17997:30;18063:34;18043:18;;;18036:62;18134:19;18114:18;;;18107:47;18171:19;;30591:134:0::1;17957:239:1::0;30591:134:0::1;31066:27:::2;::::0;;;:12:::2;:27;::::0;;;;:36:::2;;::::0;35685:13;;31066:36:::2;;31065:37;31043:126;;;::::0;-1:-1:-1;;;31043:126:0;;17222:2:1;31043:126:0::2;::::0;::::2;17204:21:1::0;17261:2;17241:18;;;17234:30;17300:34;17280:18;;;17273:62;-1:-1:-1;;;17351:18:1;;;17344:37;17398:19;;31043:126:0::2;17194:229:1::0;31043:126:0::2;35759:5:::3;35716:28:::0;;;:13:::3;:28;::::0;;;;;;;35745:10:::3;35716:40:::0;;;;;;;;:48;;-1:-1:-1;;35716:48:0::3;::::0;;35780:37;35730:13;;35780:37:::3;::::0;::::3;30736:1:::2;30135::::1;;35494:331:::0;;:::o;48530:226::-;48586:10;30076:14;;;;:7;:14;;;;;;;;30068:56;;;;-1:-1:-1;;;30068:56:0;;14551:2:1;30068:56:0;;;14533:21:1;14590:2;14570:18;;;14563:30;14629:31;14609:18;;;14602:59;14678:18;;30068:56:0;14523:179:1;30068:56:0;48658:16:::1;::::0;:33:::1;::::0;48626:21:::1;::::0;-1:-1:-1;;;;;48658:16:0::1;::::0;:33;::::1;;;::::0;48626:21;;48609:14:::1;48658:33:::0;48609:14;48658:33;48626:21;48658:16;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;48723:16:0::1;::::0;48709:39:::1;::::0;18347:25:1;;;-1:-1:-1;;;;;48723:16:0;;::::1;::::0;48709:39:::1;::::0;18335:2:1;18320:18;48709:39:0::1;;;;;;;;30135:1;48530:226:::0;:::o;47286:721::-;24667:16;:14;:16::i;:::-;-1:-1:-1;;;;;47460:36:0;::::1;;::::0;;;:22:::1;:36;::::0;;;;;::::1;;47438:112;;;::::0;-1:-1:-1;;;47438:112:0;;15329:2:1;47438:112:0::1;::::0;::::1;15311:21:1::0;15368:2;15348:18;;;15341:30;15407:28;15387:18;;;15380:56;15453:18;;47438:112:0::1;15301:176:1::0;47438:112:0::1;47584:27;::::0;;;:18:::1;:27;::::0;;;;;::::1;;47583:28;47561:109;;;::::0;-1:-1:-1;;;47561:109:0;;16089:2:1;47561:109:0::1;::::0;::::1;16071:21:1::0;16128:2;16108:18;;;16101:30;16167:33;16147:18;;;16140:61;16218:18;;47561:109:0::1;16061:181:1::0;47561:109:0::1;47765:61;::::0;;;;47792:10:::1;47765:61;::::0;::::1;9597:34:1::0;47812:4:0::1;9647:18:1::0;;;9640:43;9699:18;;;9692:34;;;47711:12:0;;47681:20:::1;::::0;-1:-1:-1;;;;;47765:26:0;::::1;::::0;::::1;::::0;9509:18:1;;47765:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47737:89;;47845:7;47837:56;;;::::0;-1:-1:-1;;;47837:56:0;;15684:2:1;47837:56:0::1;::::0;::::1;15666:21:1::0;15723:2;15703:18;;;15696:30;15762:34;15742:18;;;15735:62;15833:6;15813:18;;;15806:34;15857:19;;47837:56:0::1;15656:226:1::0;47837:56:0::1;47906:27;::::0;;;:18:::1;:27;::::0;;;;;;:34;;-1:-1:-1;;47906:34:0::1;47936:4;47906:34;::::0;;47951:48;-1:-1:-1;;;;;47951:48:0;::::1;::::0;47925:7;;47951:48:::1;::::0;::::1;::::0;47992:6;18347:25:1;;18335:2;18320:18;;18302:76;47951:48:0::1;;;;;;;;24694:1;;47286:721:::0;;;:::o;37384:368::-;37508:13;;37539:205;37563:16;;37559:1;:20;37539:205;;;37622:7;:36;;;;-1:-1:-1;37634:15:0;;;;:12;:15;;;;;:24;;;;;37633:25;37622:36;37621:97;;;;37681:8;:36;;;;-1:-1:-1;37693:15:0;;;;:12;:15;;;;;:24;;;;;37681:36;37599:145;;;37734:10;37743:1;37734:10;;:::i;:::-;;;37599:145;37581:3;;;;:::i;:::-;;;;37539:205;;;;37384:368;;;;:::o;33460:320::-;29881:10;29903:4;29881:27;29859:128;;;;-1:-1:-1;;;29859:128:0;;14909:2:1;29859:128:0;;;14891:21:1;14948:2;14928:18;;;14921:30;14987:34;14967:18;;;14960:62;-1:-1:-1;;;15038:18:1;;;15031:49;15097:19;;29859:128:0;14881:241:1;29859:128:0;-1:-1:-1;;;;;30214:14:0;::::1;;::::0;;;:7:::1;:14;::::0;;;;;33584:5;;30214:14:::1;;30213:15;30205:53;;;::::0;-1:-1:-1;;;30205:53:0;;16868:2:1;30205:53:0::1;::::0;::::1;16850:21:1::0;16907:2;16887:18;;;16880:30;16946:27;16926:18;;;16919:55;16991:18;;30205:53:0::1;16840:175:1::0;30205:53:0::1;33608:5:::0;-1:-1:-1;;;;;31251:24:0;::::2;31243:69;;;::::0;-1:-1:-1;;;31243:69:0;;12589:2:1;31243:69:0::2;::::0;::::2;12571:21:1::0;;;12608:18;;;12601:30;12667:34;12647:18;;;12640:62;12719:18;;31243:69:0::2;12561:182:1::0;31243:69:0::2;33641:6:::3;:13:::0;:17:::3;::::0;33657:1:::3;33641:17;:::i;:::-;33660:8;;29169:2;31438:10;:29;;:73;;;;;31501:10;31488:9;:23;;31438:73;:108;;;;-1:-1:-1::0;31532:14:0;;::::3;31438:108;:144;;;;-1:-1:-1::0;31567:15:0;;::::3;31438:144;31416:236;;;::::0;-1:-1:-1;;;31416:236:0;;13794:2:1;31416:236:0::3;::::0;::::3;13776:21:1::0;13833:2;13813:18;;;13806:30;13872:34;13852:18;;;13845:62;13943:12;13923:18;;;13916:40;13973:19;;31416:236:0::3;13766:232:1::0;31416:236:0::3;-1:-1:-1::0;;;;;33686:14:0;::::4;;::::0;;;:7:::4;:14;::::0;;;;;:21;;-1:-1:-1;;33686:21:0::4;33703:4;33686:21:::0;;::::4;::::0;;;33718:6:::4;:18:::0;;;;::::4;::::0;;;;;::::4;::::0;;-1:-1:-1;;33718:18:0::4;::::0;::::4;::::0;;33752:20;::::4;::::0;33686:14;33752:20:::4;31323:1:::3;;30269::::2;29998::::1;33460:320:::0;:::o;48129:194::-;29881:10;29903:4;29881:27;29859:128;;;;-1:-1:-1;;;29859:128:0;;14909:2:1;29859:128:0;;;14891:21:1;14948:2;14928:18;;;14921:30;14987:34;14967:18;;;14960:62;-1:-1:-1;;;15038:18:1;;;15031:49;15097:19;;29859:128:0;14881:241:1;29859:128:0;48273:42:::1;48293:12;48307:7;48273:19;:42::i;:::-;48129:194:::0;;:::o;25651:133::-;24849:30;:28;:30::i;:::-;25743:4:::1;25731:16:::0;;-1:-1:-1;;25731:16:0::1;::::0;::::1;::::0;;25765:11:::1;::::0;::::1;::::0;25731:9:::1;::::0;25765:11:::1;25651:133::o:0;36733:365::-;36843:4;;;36893:175;36917:6;:13;36913:17;;36893:175;;;36956:28;;;;:13;:28;;;;;36985:6;:9;;36956:28;;;36992:1;;36985:9;;;;-1:-1:-1;;;36985:9:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36985:9:0;36956:39;;;;;;;;;;;;;;;36952:55;;;36997:10;37006:1;36997:10;;:::i;:::-;;;36952:55;37035:8;;37026:5;:17;37022:34;;;37052:4;37045:11;;;;;;37022:34;36932:3;;;;:::i;:::-;;;;36893:175;;;-1:-1:-1;37085:5:0;;36733:365;-1:-1:-1;;;36733:365:0:o;48764:385::-;48872:10;30076:14;;;;:7;:14;;;;;;;;30068:56;;;;-1:-1:-1;;;30068:56:0;;14551:2:1;30068:56:0;;;14533:21:1;14590:2;14570:18;;;14563:30;14629:31;14609:18;;;14602:59;14678:18;;30068:56:0;14523:179:1;30068:56:0;48971:38:::1;::::0;;;;49003:4:::1;48971:38;::::0;::::1;8700:74:1::0;48930:12:0;;48900:20:::1;::::0;-1:-1:-1;;;;;48971:23:0;::::1;::::0;::::1;::::0;8673:18:1;;48971:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49043:16;::::0;49020:48:::1;::::0;;;;-1:-1:-1;;;;;49043:16:0;;::::1;49020:48;::::0;::::1;9206:74:1::0;9296:18;;;9289:34;;;48954:55:0;;-1:-1:-1;49020:22:0;::::1;::::0;::::1;::::0;9179:18:1;;49020:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;49102:16:0::1;::::0;49086:55:::1;::::0;18347:25:1;;;-1:-1:-1;;;;;49086:55:0;;::::1;::::0;49102:16:::1;::::0;49086:55:::1;::::0;18335:2:1;18320:18;49086:55:0::1;;;;;;;30135:1;;48764:385:::0;;:::o;37106:270::-;37225:13;;37256:112;37280:6;:13;37276:17;;37256:112;;;37317:28;;;;:13;:28;;;;;37346:6;:9;;37317:28;;;37353:1;;37346:9;;;;-1:-1:-1;;;37346:9:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37346:9:0;37317:39;;;;;;;;;;;;;;;37313:55;;;37358:10;37367:1;37358:10;;:::i;:::-;;;37313:55;37295:3;;;;:::i;:::-;;;;37256:112;;;;37106:270;;;:::o;29294:51::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29294:51:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29294:51:0;;;;;;;-1:-1:-1;;29294:51:0;;;:::o;37760:101::-;37811:16;37847:6;37840:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37840:13:0;;;;;;;;;;;;;;;;;;;;;;;37760:101;:::o;48331:191::-;29881:10;29903:4;29881:27;29859:128;;;;-1:-1:-1;;;29859:128:0;;14909:2:1;29859:128:0;;;14891:21:1;14948:2;14928:18;;;14921:30;14987:34;14967:18;;;14960:62;-1:-1:-1;;;15038:18:1;;;15031:49;15097:19;;29859:128:0;14881:241:1;29859:128:0;48475:39:::1;48498:15;48475:22;:39::i;:::-;48331:191:::0;:::o;38597:769::-;38752:32;38797:35;38849:16;;38835:31;;;;;;-1:-1:-1;;;38835:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38835:31:0;;38797:69;;38877:13;38905:9;38925:280;38941:16;;38937:1;:20;38925:280;;;39000:7;:36;;;;-1:-1:-1;39012:15:0;;;;:12;:15;;;;;:24;;;;;39011:25;39000:36;38999:97;;;;39059:8;:36;;;;-1:-1:-1;39071:15:0;;;;:12;:15;;;;;:24;;;;;39059:36;38977:228;;;39159:1;39131:18;39150:5;39131:25;;;;;;-1:-1:-1;;;39131:25:0;;;;;;;;;;;;;;;;;;:29;39179:10;39188:1;39179:10;;:::i;:::-;;;38977:228;38959:3;;;;:::i;:::-;;;;38925:280;;;39247:9;39252:4;39247:2;:9;:::i;:::-;39233:24;;;;;;-1:-1:-1;;;39233:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39233:24:0;;39215:42;;39277:4;39273:8;;39268:90;39287:2;39283:1;:6;39268:90;;;39337:18;39356:1;39337:21;;;;;;-1:-1:-1;;;39337:21:0;;;;;;;;;;;;;;;39309:15;39329:4;39325:1;:8;;;;:::i;:::-;39309:25;;;;;;-1:-1:-1;;;39309:25:0;;;;;;;;;;;;;;;;;;:49;39291:3;;;;:::i;:::-;;;;39268:90;;;38597:769;;;;;;;;;:::o;25938:615::-;24751:20;:18;:20::i;:::-;26065:16:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;;;26065:34:0;::::1;;;::::0;;26129:19:::1;26864:16:::0;;;;;-1:-1:-1;;;;;26864:16:0;;26777:111;26129:19:::1;:66;::::0;;;;26167:27:::1;26129:66;::::0;::::1;12278:98:1::0;-1:-1:-1;;;;;26129:37:0;;;::::1;::::0;::::1;::::0;12251:18:1;;26129:66:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;26129:66:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;26129:66:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;26112:434;;26429:105;::::0;-1:-1:-1;;;26429:105:0;;13362:2:1;26429:105:0::1;::::0;::::1;13344:21:1::0;13401:2;13381:18;;;13374:30;13440:34;13420:18;;;13413:62;13511:33;13491:18;;;13484:61;13562:19;;26429:105:0::1;13334:253:1::0;26112:434:0::1;26279:17;26253:142;;;::::0;-1:-1:-1;;;26253:142:0;;13362:2:1;26253:142:0::1;::::0;::::1;13344:21:1::0;13401:2;13381:18;;;13374:30;13440:34;13420:18;;;13413:62;13511:33;13491:18;;;13484:61;13562:19;;26253:142:0::1;13334:253:1::0;26896:175:0;27003:7;27035:19;26864:16;;;;;-1:-1:-1;;;;;26864:16:0;;26777:111;27035:19;-1:-1:-1;;;;;27035:23:0;;27059:3;27035:28;;;;;;;;;;;;;18347:25:1;;18335:2;18320:18;;18302:76;27035:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27028:35;26896:175;-1:-1:-1;;26896:175:0:o;37973:616::-;38188:6;:13;38088:31;;38137:34;;38174:28;;;;;;-1:-1:-1;;;38174:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38174:28:0;;38137:65;;38213:13;38241:9;38261:194;38277:6;:13;38273:17;;38261:194;;;38314:28;;;;:13;:28;;;;;38343:6;:9;;38314:28;;;38350:1;;38343:9;;;;-1:-1:-1;;;38343:9:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38343:9:0;38314:39;;;;;;;;;;;;;;;38310:145;;;38401:6;38408:1;38401:9;;;;;;-1:-1:-1;;;38401:9:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38401:9:0;38374:17;38392:5;38374:24;;;;;;-1:-1:-1;;;38374:24:0;;;;;;;;;-1:-1:-1;;;;;38374:36:0;;;:24;;;;;;;;;;;:36;38429:10;38438:1;38429:10;;:::i;:::-;;;38310:145;38292:3;;;;:::i;:::-;;;;38261:194;;;38496:5;38482:20;;;;;;-1:-1:-1;;;38482:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38482:20:0;;38465:37;;38522:1;38518:5;;38513:68;38529:5;38525:1;:9;38513:68;;;38561:17;38579:1;38561:20;;;;;;-1:-1:-1;;;38561:20:0;;;;;;;;;;;;;;;38541:14;38556:1;38541:17;;;;;;-1:-1:-1;;;38541:17:0;;;;;;;;;-1:-1:-1;;;;;38541:40:0;;;:17;;;;;;;;;;;:40;38536:3;;;;:::i;:::-;;;;38513:68;;;37973:616;;;;;;:::o;34843:250::-;29881:10;29903:4;29881:27;29859:128;;;;-1:-1:-1;;;29859:128:0;;14909:2:1;29859:128:0;;;14891:21:1;14948:2;14928:18;;;14921:30;14987:34;14967:18;;;14960:62;-1:-1:-1;;;15038:18:1;;;15031:49;15097:19;;29859:128:0;14881:241:1;29859:128:0;34979:6:::1;:13:::0;34994:9;29169:2:::1;31438:29:::0;::::1;::::0;::::1;::::0;:73:::1;;;31501:10;31488:9;:23;;31438:73;:108;;;;-1:-1:-1::0;31532:14:0;;::::1;31438:108;:144;;;;-1:-1:-1::0;31567:15:0;;::::1;31438:144;31416:236;;;::::0;-1:-1:-1;;;31416:236:0;;13794:2:1;31416:236:0::1;::::0;::::1;13776:21:1::0;13833:2;13813:18;;;13806:30;13872:34;13852:18;;;13845:62;13943:12;13923:18;;;13916:40;13973:19;;31416:236:0::1;13766:232:1::0;31416:236:0::1;35021:8:::2;:20:::0;;;35057:28:::2;::::0;18347:25:1;;;35057:28:0::2;::::0;18335:2:1;18320:18;35057:28:0::2;;;;;;;29998:1:::1;;34843:250:::0;:::o;35101:385::-;35213:10;30076:14;;;;:7;:14;;;;;;;;30068:56;;;;-1:-1:-1;;;30068:56:0;;14551:2:1;30068:56:0;;;14533:21:1;14590:2;14570:18;;;14563:30;14629:31;14609:18;;;14602:59;14678:18;;30068:56:0;14523:179:1;30068:56:0;30420:3:::1;30369:27:::0;;;:12:::1;:27;::::0;;;;:39;35252:13;;-1:-1:-1;;;;;30369:39:0::1;30347:148;;;::::0;-1:-1:-1;;;30347:148:0;;12950:2:1;30347:148:0::1;::::0;::::1;12932:21:1::0;12989:2;12969:18;;;12962:30;13028:34;13008:18;;;13001:62;13099:13;13079:18;;;13072:41;13130:19;;30347:148:0::1;12922:233:1::0;30347:148:0::1;30847:28:::2;::::0;;;:13:::2;:28;::::0;;;;;;;35304:10:::2;30847:35:::0;;;;;;;;;35289:13;;35304:10;30847:35:::2;;30846:36;30824:136;;;::::0;-1:-1:-1;;;30824:136:0;;16449:2:1;30824:136:0::2;::::0;::::2;16431:21:1::0;16488:2;16468:18;;;16461:30;16527:34;16507:18;;;16500:62;16598:20;16578:18;;;16571:48;16636:19;;30824:136:0::2;16421:240:1::0;30824:136:0::2;35332:28:::3;::::0;;;:13:::3;:28;::::0;;;;;;;35361:10:::3;35332:40:::0;;;;;;;;:47;;-1:-1:-1;;35332:47:0::3;35375:4;35332:47;::::0;;35395:39;35346:13;;35395:39:::3;::::0;::::3;35445:33;35464:13;35445:18;:33::i;:::-;30506:1:::2;;30135::::1;35101:385:::0;;:::o;33055:283::-;33196:21;33246:40;33261:11;33274:5;33281:4;33246:14;:40::i;:::-;33230:56;;33297:33;33316:13;33297:18;:33::i;:::-;33055:283;;;;;:::o;34320:515::-;29881:10;29903:4;29881:27;29859:128;;;;-1:-1:-1;;;29859:128:0;;14909:2:1;29859:128:0;;;14891:21:1;14948:2;14928:18;;;14921:30;14987:34;14967:18;;;14960:62;-1:-1:-1;;;15038:18:1;;;15031:49;15097:19;;29859:128:0;14881:241:1;29859:128:0;-1:-1:-1;;;;;30076:14:0;::::1;;::::0;;;:7:::1;:14;::::0;;;;;34466:5;;30076:14:::1;;30068:56;;;::::0;-1:-1:-1;;;30068:56:0;;14551:2:1;30068:56:0::1;::::0;::::1;14533:21:1::0;14590:2;14570:18;;;14563:30;14629:31;14609:18;;;14602:59;14678:18;;30068:56:0::1;14523:179:1::0;30068:56:0::1;-1:-1:-1::0;;;;;30214:14:0;::::2;;::::0;;;:7:::2;:14;::::0;;;;;34500:8;;30214:14:::2;;30213:15;30205:53;;;::::0;-1:-1:-1;;;30205:53:0;;16868:2:1;30205:53:0::2;::::0;::::2;16850:21:1::0;16907:2;16887:18;;;16880:30;16946:27;16926:18;;;16919:55;16991:18;;30205:53:0::2;16840:175:1::0;30205:53:0::2;34531:9:::3;34526:160;34550:6;:13:::0;34546:17;::::3;34526:160;;;34600:5;-1:-1:-1::0;;;;;34587:18:0::3;:6;34594:1;34587:9;;;;;;-1:-1:-1::0;;;34587:9:0::3;;;;;;;;;;::::0;;;::::3;::::0;;;::::3;::::0;-1:-1:-1;;;;;34587:9:0::3;:18;34583:103;;;34638:8;34626:6;34633:1;34626:9;;;;;;-1:-1:-1::0;;;34626:9:0::3;;;;;;;;;;;;;;;;;:20;;;;;-1:-1:-1::0;;;;;34626:20:0::3;;;;;-1:-1:-1::0;;;;;34626:20:0::3;;;;;;34665:5;;34583:103;34565:3:::0;::::3;::::0;::::3;:::i;:::-;;;;34526:160;;;-1:-1:-1::0;;;;;;34696:14:0;;::::3;34713:5;34696:14:::0;;;:7:::3;:14;::::0;;;;;:22;;-1:-1:-1;;34696:22:0;;::::3;::::0;;;34729:17;;::::3;::::0;;;;;:24;;;;::::3;34696:22:::0;34729:24:::3;::::0;;;34769:19;;34696:14;;34769:19:::3;::::0;::::3;34804:23;::::0;-1:-1:-1;;;;;34804:23:0;::::3;::::0;::::3;::::0;;;::::3;30135:1:::2;29998::::1;34320:515:::0;;:::o;35833:778::-;35945:10;30076:14;;;;:7;:14;;;;;;;;30068:56;;;;-1:-1:-1;;;30068:56:0;;14551:2:1;30068:56:0;;;14533:21:1;14590:2;14570:18;;;14563:30;14629:31;14609:18;;;14602:59;14678:18;;30068:56:0;14523:179:1;30068:56:0;30613:28:::1;::::0;;;:13:::1;:28;::::0;;;;;;;35991:10:::1;30613:35:::0;;;;;;;;;35976:13;;35991:10;30613:35:::1;;30591:134;;;::::0;-1:-1:-1;;;30591:134:0;;17985:2:1;30591:134:0::1;::::0;::::1;17967:21:1::0;18024:2;18004:18;;;17997:30;18063:34;18043:18;;;18036:62;18134:19;18114:18;;;18107:47;18171:19;;30591:134:0::1;17957:239:1::0;30591:134:0::1;31066:27:::2;::::0;;;:12:::2;:27;::::0;;;;:36:::2;;::::0;36024:13;;31066:36:::2;;31065:37;31043:126;;;::::0;-1:-1:-1;;;31043:126:0;;17222:2:1;31043:126:0::2;::::0;::::2;17204:21:1::0;17261:2;17241:18;;;17234:30;17300:34;17280:18;;;17273:62;-1:-1:-1;;;17351:18:1;;;17344:37;17398:19;;31043:126:0::2;17194:229:1::0;31043:126:0::2;36059:26:::3;36071:13;36059:11;:26::i;:::-;36055:549;;;36102:23;36128:27:::0;;;:12:::3;:27;::::0;;;;;;;36170:12:::3;::::0;::::3;:19:::0;;-1:-1:-1;;36170:19:0::3;36185:4;36170:19:::0;;::::3;::::0;;;36262:15;;36300:9;;::::3;::::0;36332:8;;::::3;:15:::0;;36128:27;;36226:171:::3;::::0;-1:-1:-1;;;;;36262:15:0;;::::3;::::0;36300:9;;36332:8;:15:::3;::::0;::::3;:::i;:::-;;;36370:3;:8;;36226:171;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:171::i;:::-;36204:389;;;36437:24;::::0;36447:13;;36437:24:::3;::::0;;;::::3;36204:389;;;36507:31;::::0;36524:13;;36507:31:::3;::::0;;;::::3;36557:12;::::0;::::3;:20:::0;;-1:-1:-1;;36557:20:0::3;::::0;;36204:389:::3;36055:549;30736:1:::2;30135::::1;;35833:778:::0;;:::o;46921:357::-;24667:16;:14;:16::i;:::-;47082:27:::1;::::0;;;:18:::1;:27;::::0;;;;;::::1;;47081:28;47059:109;;;::::0;-1:-1:-1;;;47059:109:0;;16089:2:1;47059:109:0::1;::::0;::::1;16071:21:1::0;16128:2;16108:18;;;16101:30;16167:33;16147:18;;;16140:61;16218:18;;47059:109:0::1;16061:181:1::0;47059:109:0::1;47179:27;::::0;;;:18:::1;:27;::::0;;;;;;:34;;-1:-1:-1;;47179:34:0::1;47209:4;47179:34;::::0;;47224:46;47198:7;;47224:46:::1;::::0;::::1;::::0;47260:9:::1;18347:25:1::0;;18335:2;18320:18;;18302:76;47224:46:0::1;;;;;;;;46921:357:::0;:::o;25792:138::-;24849:30;:28;:30::i;:::-;25874:9:::1;:17:::0;;-1:-1:-1;;25874:17:0::1;::::0;;25909:13:::1;::::0;::::1;::::0;25886:5:::1;::::0;25909:13:::1;25792:138::o:0;27551:115::-;27610:9;;;;;:17;;;27602:56;;;;-1:-1:-1;;;27602:56:0;;17630:2:1;27602:56:0;;;17612:21:1;17669:2;17649:18;;;17642:30;17708:28;17688:18;;;17681:56;17754:18;;27602:56:0;17602:176:1;27602:56:0;27551:115::o;50064:185::-;-1:-1:-1;;;;;50148:36:0;;;;;;:22;:36;;;;;;;;;:46;;-1:-1:-1;;50148:46:0;;;;;;;;;;50205:36;;12082:41:1;;;50205:36:0;;12055:18:1;50205:36:0;12037:92:1;28080:226:0;28181:16;;;;;-1:-1:-1;;;;;28181:16:0;28167:10;:30;;:86;;;28232:21;28251:1;28232:18;:21::i;:::-;-1:-1:-1;;;;;28218:35:0;:10;-1:-1:-1;;;;;28218:35:0;;28167:86;28145:153;;;;-1:-1:-1;;;28145:153:0;;14205:2:1;28145:153:0;;;14187:21:1;14244:2;14224:18;;;14217:30;14283:19;14263:18;;;14256:47;14320:18;;28145:153:0;14177:167:1;49879:177:0;49963:16;:34;;-1:-1:-1;;49963:34:0;-1:-1:-1;;;;;49963:34:0;;;;;;;;50008:40;;8700:74:1;;;50008:40:0;;8688:2:1;8673:18;50008:40:0;;;;;;;49879:177;:::o;27793:128::-;27870:21;27889:1;27870:18;:21::i;41562:485::-;41714:21;41692:11;-1:-1:-1;;;;;31251:24:0;;31243:69;;;;-1:-1:-1;;;31243:69:0;;12589:2:1;31243:69:0;;;12571:21:1;;;12608:18;;;12601:30;12667:34;12647:18;;;12640:62;12719:18;;31243:69:0;12561:182:1;31243:69:0;41764:16:::1;::::0;41821:145:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;41821:145:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;-1:-1:-1;41821:145:0;;;;;;41791:27;;;:12:::1;:27:::0;;;;;;:175;;;;-1:-1:-1;;41791:175:0::1;::::0;::::1;::::0;;;::::1;::::0;;;;-1:-1:-1;41791:175:0;::::1;::::0;;;;41764:16;;-1:-1:-1;41821:145:0;;41791:27;;:175:::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;41791:175:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;41791:175:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41977:16:::1;:21:::0;;-1:-1:-1;;41977:16:0;-1:-1:-1;;41977:21:0::1;::::0;-1:-1:-1;;41977:21:0::1;:::i;:::-;::::0;;;-1:-1:-1;;42014:25:0::1;::::0;42025:13;;42014:25:::1;::::0;;;::::1;41562:485:::0;;;;;;:::o;40136:1113::-;40295:4;40312:11;40373:4;40367:11;40505:2;40499:4;40495:13;41135:1;41115;41013:10;40993:1;40969:5;40939:11;40631:5;40624;40620:17;40597:610;40587:620;40136:1113;-1:-1:-1;;;;;;;;40136:1113:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:398:1;;;141:3;134:4;126:6;122:17;118:27;108:2;;166:8;156;149:26;108:2;-1:-1:-1;196:20:1;;239:18;228:30;;225:2;;;278:8;268;261:26;225:2;322:4;314:6;310:17;298:29;;385:3;378:4;370;362:6;358:17;350:6;346:30;342:41;339:50;336:2;;;402:1;399;392:12;336:2;98:314;;;;;:::o;417:375::-;;;532:3;525:4;517:6;513:17;509:27;499:2;;557:8;547;540:26;499:2;-1:-1:-1;587:20:1;;630:18;619:30;;616:2;;;669:8;659;652:26;616:2;713:4;705:6;701:17;689:29;;765:3;758:4;749:6;741;737:19;733:30;730:39;727:2;;;782:1;779;772:12;797:257;;909:2;897:9;888:7;884:23;880:32;877:2;;;930:6;922;915:22;877:2;974:9;961:23;993:31;1018:5;993:31;:::i;1059:261::-;;1182:2;1170:9;1161:7;1157:23;1153:32;1150:2;;;1203:6;1195;1188:22;1150:2;1240:9;1234:16;1259:31;1284:5;1259:31;:::i;1595:398::-;;;1724:2;1712:9;1703:7;1699:23;1695:32;1692:2;;;1745:6;1737;1730:22;1692:2;1789:9;1776:23;1808:31;1833:5;1808:31;:::i;:::-;1858:5;-1:-1:-1;1915:2:1;1900:18;;1887:32;1928:33;1887:32;1928:33;:::i;:::-;1980:7;1970:17;;;1682:311;;;;;:::o;1998:1378::-;;;;;;;;;2267:3;2255:9;2246:7;2242:23;2238:33;2235:2;;;2289:6;2281;2274:22;2235:2;2333:9;2320:23;2352:31;2377:5;2352:31;:::i;:::-;2402:5;-1:-1:-1;2459:2:1;2444:18;;2431:32;2472:33;2431:32;2472:33;:::i;:::-;2524:7;-1:-1:-1;2582:2:1;2567:18;;2554:32;2605:18;2635:14;;;2632:2;;;2667:6;2659;2652:22;2632:2;2711:70;2773:7;2764:6;2753:9;2749:22;2711:70;:::i;:::-;2800:8;;-1:-1:-1;2685:96:1;-1:-1:-1;2888:2:1;2873:18;;2860:32;;-1:-1:-1;2904:16:1;;;2901:2;;;2938:6;2930;2923:22;2901:2;2982:72;3046:7;3035:8;3024:9;3020:24;2982:72;:::i;:::-;3073:8;;-1:-1:-1;2956:98:1;-1:-1:-1;3161:3:1;3146:19;;3133:33;;-1:-1:-1;3178:16:1;;;3175:2;;;3212:6;3204;3197:22;3175:2;;3256:60;3308:7;3297:8;3286:9;3282:24;3256:60;:::i;:::-;2225:1151;;;;-1:-1:-1;2225:1151:1;;-1:-1:-1;2225:1151:1;;;;;;3335:8;-1:-1:-1;;;2225:1151:1:o;3381:843::-;;;;;;;3580:3;3568:9;3559:7;3555:23;3551:33;3548:2;;;3602:6;3594;3587:22;3548:2;3646:9;3633:23;3665:31;3690:5;3665:31;:::i;:::-;3715:5;-1:-1:-1;3772:2:1;3757:18;;3744:32;3785:33;3744:32;3785:33;:::i;:::-;3837:7;-1:-1:-1;3891:2:1;3876:18;;3863:32;;-1:-1:-1;3942:2:1;3927:18;;3914:32;;-1:-1:-1;3997:3:1;3982:19;;3969:33;4025:18;4014:30;;4011:2;;;4062:6;4054;4047:22;4011:2;4106:58;4156:7;4147:6;4136:9;4132:22;4106:58;:::i;:::-;3538:686;;;;-1:-1:-1;3538:686:1;;-1:-1:-1;3538:686:1;;4183:8;;3538:686;-1:-1:-1;;;3538:686:1:o;4229:392::-;;;4355:2;4343:9;4334:7;4330:23;4326:32;4323:2;;;4376:6;4368;4361:22;4323:2;4420:9;4407:23;4439:31;4464:5;4439:31;:::i;:::-;4489:5;-1:-1:-1;4546:2:1;4531:18;;4518:32;4559:30;4518:32;4559:30;:::i;4626:1169::-;;;;4781:2;4769:9;4760:7;4756:23;4752:32;4749:2;;;4802:6;4794;4787:22;4749:2;4846:9;4833:23;4865:31;4890:5;4865:31;:::i;:::-;4915:5;-1:-1:-1;4967:2:1;4952:18;;4939:32;;-1:-1:-1;5022:2:1;5007:18;;4994:32;5045:18;5075:14;;;5072:2;;;5107:6;5099;5092:22;5072:2;5150:6;5139:9;5135:22;5125:32;;5195:7;5188:4;5184:2;5180:13;5176:27;5166:2;;5222:6;5214;5207:22;5166:2;5263;5250:16;5285:2;5281;5278:10;5275:2;;;5291:18;;:::i;:::-;5366:2;5360:9;5334:2;5420:13;;-1:-1:-1;;5416:22:1;;;5440:2;5412:31;5408:40;5396:53;;;5464:18;;;5484:22;;;5461:46;5458:2;;;5510:18;;:::i;:::-;5550:10;5546:2;5539:22;5585:2;5577:6;5570:18;5625:7;5620:2;5615;5611;5607:11;5603:20;5600:33;5597:2;;;5651:6;5643;5636:22;5597:2;5712;5707;5703;5699:11;5694:2;5686:6;5682:15;5669:46;5757:6;5752:2;5747;5739:6;5735:15;5731:24;5724:40;5783:6;5773:16;;;;;;;4739:1056;;;;;:::o;5800:255::-;;5920:2;5908:9;5899:7;5895:23;5891:32;5888:2;;;5941:6;5933;5926:22;5888:2;5978:9;5972:16;5997:28;6019:5;5997:28;:::i;6060:386::-;;;6183:2;6171:9;6162:7;6158:23;6154:32;6151:2;;;6204:6;6196;6189:22;6151:2;6248:9;6235:23;6267:28;6289:5;6267:28;:::i;6451:352::-;;6562:2;6550:9;6541:7;6537:23;6533:32;6530:2;;;6583:6;6575;6568:22;6530:2;6627:9;6614:23;6677:66;6670:5;6666:78;6659:5;6656:89;6646:2;;6764:6;6756;6749:22;6808:190;;6920:2;6908:9;6899:7;6895:23;6891:32;6888:2;;;6941:6;6933;6926:22;6888:2;-1:-1:-1;6969:23:1;;6878:120;-1:-1:-1;6878:120:1:o;7003:194::-;;7126:2;7114:9;7105:7;7101:23;7097:32;7094:2;;;7147:6;7139;7132:22;7094:2;-1:-1:-1;7175:16:1;;7084:113;-1:-1:-1;7084:113:1:o;7202:325::-;;;7331:2;7319:9;7310:7;7306:23;7302:32;7299:2;;;7352:6;7344;7337:22;7299:2;7393:9;7380:23;7370:33;;7453:2;7442:9;7438:18;7425:32;7466:31;7491:5;7466:31;:::i;7532:393::-;;;;7678:2;7666:9;7657:7;7653:23;7649:32;7646:2;;;7699:6;7691;7684:22;7646:2;7740:9;7727:23;7717:33;;7800:2;7789:9;7785:18;7772:32;7813:31;7838:5;7813:31;:::i;:::-;7636:289;;7863:5;;-1:-1:-1;;;7915:2:1;7900:18;;;;7887:32;;7636:289::o;7930:523::-;;;;;8087:3;8075:9;8066:7;8062:23;8058:33;8055:2;;;8109:6;8101;8094:22;8055:2;8150:9;8137:23;8127:33;;8207:2;8196:9;8192:18;8179:32;8169:42;;8261:2;8250:9;8246:18;8233:32;8274:28;8296:5;8274:28;:::i;:::-;8321:5;-1:-1:-1;8378:2:1;8363:18;;8350:32;8391:30;8350:32;8391:30;:::i;:::-;8045:408;;;;-1:-1:-1;8045:408:1;;-1:-1:-1;;8045:408:1:o;9737:871::-;;-1:-1:-1;;;;;9966:6:1;9962:55;9951:9;9944:74;10037:2;10075:6;10070:2;10059:9;10055:18;10048:34;10118:3;10113:2;10102:9;10098:18;10091:31;10151:6;10145:13;10195:6;10189:3;10178:9;10174:19;10167:35;10220:4;10233:141;10247:6;10244:1;10241:13;10233:141;;;10343:14;;;10339:23;;10333:30;10308:17;;;10327:3;10304:27;10297:67;10262:10;;10233:141;;;10392:6;10389:1;10386:13;10383:2;;;10463:4;10457:3;10448:6;10437:9;10433:22;10429:32;10422:46;10383:2;-1:-1:-1;10539:2:1;10518:15;-1:-1:-1;;10514:29:1;10499:45;;10546:3;10495:55;;-1:-1:-1;10559:43:1;;-1:-1:-1;10598:2:1;10583:18;;10575:6;8528:13;8521:21;8509:34;;8499:50;10559:43;9934:674;;;;;;;:::o;10613:684::-;10784:2;10836:21;;;10906:13;;10809:18;;;10928:22;;;10613:684;;10784:2;11007:15;;;;10981:2;10966:18;;;10613:684;11053:218;11067:6;11064:1;11061:13;11053:218;;;11132:13;;-1:-1:-1;;;;;11128:62:1;11116:75;;11246:15;;;;11211:12;;;;11089:1;11082:9;11053:218;;;-1:-1:-1;11288:3:1;;10764:533;-1:-1:-1;;;;;;10764:533:1:o;11302:635::-;11473:2;11525:21;;;11595:13;;11498:18;;;11617:22;;;11302:635;;11473:2;11696:15;;;;11670:2;11655:18;;;11302:635;11742:169;11756:6;11753:1;11750:13;11742:169;;;11817:13;;11805:26;;11886:15;;;;11851:12;;;;11778:1;11771:9;11742:169;;18383:128;;18454:1;18450:6;18447:1;18444:13;18441:2;;;18460:18;;:::i;:::-;-1:-1:-1;18496:9:1;;18431:80::o;18516:125::-;;18584:1;18581;18578:8;18575:2;;;18589:18;;:::i;:::-;-1:-1:-1;18626:9:1;;18565:76::o;18646:437::-;18731:1;18721:12;;18778:1;18768:12;;;18789:2;;18843:4;18835:6;18831:17;18821:27;;18789:2;18896;18888:6;18885:14;18865:18;18862:38;18859:2;;;-1:-1:-1;;;18930:1:1;18923:88;19034:4;19031:1;19024:15;19062:4;19059:1;19052:15;19088:135;;-1:-1:-1;;19148:17:1;;19145:2;;;19168:18;;:::i;:::-;-1:-1:-1;19215:1:1;19204:13;;19135:88::o;19228:184::-;-1:-1:-1;;;19277:1:1;19270:88;19377:4;19374:1;19367:15;19401:4;19398:1;19391:15;19417:184;-1:-1:-1;;;19466:1:1;19459:88;19566:4;19563:1;19556:15;19590:4;19587:1;19580:15;19606:154;-1:-1:-1;;;;;19685:5:1;19681:54;19674:5;19671:65;19661:2;;19750:1;19747;19740:12;19765:118;19851:5;19844:13;19837:21;19830:5;19827:32;19817:2;;19873:1;19870;19863:12

Swarm Source

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