ETH Price: $2,676.11 (+1.41%)
Gas: 11 Gwei

Contract

0xEC7Bb44fd9a199abA45176aBb67d4FF5058490bF
 

Overview

ETH Balance

0.5 ETH

Eth Value

$1,338.05 (@ $2,676.11/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute Pull Pay...132319952021-09-15 18:41:231061 days ago1631731283IN
0xEC7Bb44f...5058490bF
0 ETH0.02248031258
Register Pull Pa...132254882021-09-14 18:40:371062 days ago1631644837IN
0xEC7Bb44f...5058490bF
0 ETH0.036162584
Register Pull Pa...131994982021-09-10 17:53:251066 days ago1631296405IN
0xEC7Bb44f...5058490bF
0 ETH0.0576878134
Register Pull Pa...131028272021-08-26 19:07:371081 days ago1630004857IN
0xEC7Bb44f...5058490bF
0 ETH0.04950681115
Execute Pull Pay...123298472021-04-28 15:52:521201 days ago1619625172IN
0xEC7Bb44f...5058490bF
0 ETH0.0124583143
Execute Pull Pay...116929242021-01-20 14:46:421299 days ago1611154002IN
0xEC7Bb44f...5058490bF
0 ETH0.0052920678
Delete Pull Paym...116862772021-01-19 14:28:581300 days ago1611066538IN
0xEC7Bb44f...5058490bF
0 ETH0.00596505105
Register Pull Pa...116862362021-01-19 14:20:291300 days ago1611066029IN
0xEC7Bb44f...5058490bF
0 ETH0.05360097143
Register Pull Pa...116456302021-01-13 8:46:041307 days ago1610527564IN
0xEC7Bb44f...5058490bF
0 ETH0.0296117279
Register Pull Pa...115528822020-12-30 3:21:121321 days ago1609298472IN
0xEC7Bb44f...5058490bF
0 ETH0.0688551167
Execute Pull Pay...114713792020-12-17 15:02:581333 days ago1608217378IN
0xEC7Bb44f...5058490bF
0 ETH0.01044843154
Delete Pull Paym...114365422020-12-12 6:50:041339 days ago1607755804IN
0xEC7Bb44f...5058490bF
0 ETH0.0007505628
Delete Pull Paym...114365422020-12-12 6:50:041339 days ago1607755804IN
0xEC7Bb44f...5058490bF
0 ETH0.0007502328
Delete Pull Paym...114365422020-12-12 6:50:041339 days ago1607755804IN
0xEC7Bb44f...5058490bF
0 ETH0.0016474929
Delete Pull Paym...114365412020-12-12 6:49:541339 days ago1607755794IN
0xEC7Bb44f...5058490bF
0 ETH0.0015903428
Delete Pull Paym...114365402020-12-12 6:49:411339 days ago1607755781IN
0xEC7Bb44f...5058490bF
0 ETH0.0015906828
Delete Pull Paym...114365402020-12-12 6:49:411339 days ago1607755781IN
0xEC7Bb44f...5058490bF
0 ETH0.0015906828
Delete Pull Paym...114365392020-12-12 6:49:291339 days ago1607755769IN
0xEC7Bb44f...5058490bF
0 ETH0.0015906828
Delete Pull Paym...114365382020-12-12 6:49:071339 days ago1607755747IN
0xEC7Bb44f...5058490bF
0 ETH0.0007505628
Delete Pull Paym...114365382020-12-12 6:49:071339 days ago1607755747IN
0xEC7Bb44f...5058490bF
0 ETH0.0007505628
Delete Pull Paym...114365382020-12-12 6:49:071339 days ago1607755747IN
0xEC7Bb44f...5058490bF
0 ETH0.0017611131
Delete Pull Paym...114365382020-12-12 6:49:071339 days ago1607755747IN
0xEC7Bb44f...5058490bF
0 ETH0.0017611131
Delete Pull Paym...114365372020-12-12 6:48:451339 days ago1607755725IN
0xEC7Bb44f...5058490bF
0 ETH0.0017611131
Delete Pull Paym...114365372020-12-12 6:48:451339 days ago1607755725IN
0xEC7Bb44f...5058490bF
0 ETH0.0017611131
Delete Pull Paym...114365372020-12-12 6:48:451339 days ago1607755725IN
0xEC7Bb44f...5058490bF
0 ETH0.0008309831
View all transactions

Latest 8 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
110462792020-10-13 8:45:041399 days ago1602578704
0xEC7Bb44f...5058490bF
0.5 ETH
104626672020-07-15 7:12:511489 days ago1594797171
0xEC7Bb44f...5058490bF
0.5 ETH
104533972020-07-13 20:32:461490 days ago1594672366
0xEC7Bb44f...5058490bF
0.5 ETH
104182032020-07-08 9:54:421496 days ago1594202082
0xEC7Bb44f...5058490bF
0.5 ETH
103364252020-06-25 17:55:301508 days ago1593107730
0xEC7Bb44f...5058490bF
0.5 ETH
96580532020-03-12 17:28:071613 days ago1584034087
0xEC7Bb44f...5058490bF
0.5 ETH
96379972020-03-09 15:19:131616 days ago1583767153
0xEC7Bb44f...5058490bF
0.5 ETH
95794782020-02-29 15:27:131625 days ago1582990033
0xEC7Bb44f...5058490bF
0.5 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PumaPayPullPaymentV2_2

Compiler Version
v0.5.10+commit.5a6ea5b1

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2020-02-25
*/

pragma solidity 0.5.10;

/**
 * @title ERC20 interface
 * @dev see https://eips.ethereum.org/EIPS/eip-20
 */
interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

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

    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

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

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

/**
 * @title PayableOwnable
 * @dev The PayableOwnable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 * PayableOwnable is extended from open-zeppelin Ownable smart contract, with the difference of making the owner
 * a payable address.
 */
contract PayableOwnable {
    address payable internal _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor() internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    /**
     * @return the address of the owner.
     */
    function owner() public view returns (address payable) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     * @notice Renouncing to ownership will leave the contract without an owner.
     * It will not be possible to call the functions with the `onlyOwner`
     * modifier anymore.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address payable newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address payable newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/// @title PumaPay Pull Payment V2.1 - Contract that facilitates our pull payment protocol
/// V2.1 of the protocol removes the notion of the `pull payment executors` i.e. the addresses
/// that can execute a pull payment `executePullPayment()`. That function is now publicly available.
/// We are also changing the `pullPayments` mapping. Instead of having address -> address -> PullPayment,
/// ot will be address -> bytes32 -> PullPayment, with bytes32 being the pull payment ID.
/// @author PumaPay Dev Team - <[email protected]>
contract PumaPayPullPaymentV2_2 is PayableOwnable {
    using SafeMath for uint256;
    /// ===============================================================================================================
    ///                                      Events
    /// ===============================================================================================================
    event LogExecutorAdded(address executor);
    event LogExecutorRemoved(address executor);
    event LogSmartContractActorFunded(string actorRole, address actor, uint256 timestamp);
    event LogPaymentRegistered(
        address customerAddress,
        bytes32 paymentID,
        bytes32 businessID,
        bytes32 uniqueReferenceID
    );
    event LogPaymentCancelled(
        address customerAddress,
        bytes32 paymentID,
        bytes32 businessID,
        bytes32 uniqueReferenceID
    );
    event LogPullPaymentExecuted(
        address customerAddress,
        bytes32 paymentID,
        bytes32 businessID,
        bytes32 uniqueReferenceID,
        uint256 amountInPMA,
        uint256 conversionRate
    );
    /// ===============================================================================================================
    ///                                      Constants
    /// ===============================================================================================================

    uint256 constant private RATE_CALCULATION_NUMBER = 10 ** 26;    /// Check `calculatePMAFromFiat()` for more details
    uint256 constant private OVERFLOW_LIMITER_NUMBER = 10 ** 20;    /// 1e^20 - Prevent numeric overflows
    /// @dev The following variables are not needed any more, but are kept hre for clarity on the calculation that
    /// is being done for the PMA to Fiat from rate.
    /// uint256 constant private DECIMAL_FIXER = 10 ** 10; /// 1e^10 - This transforms the Rate from decimals to uint256
    /// uint256 constant private FIAT_TO_CENT_FIXER = 100; /// Fiat currencies have 100 cents in 1 basic monetary unit.
    uint256 constant private ONE_ETHER = 1 ether;                                  /// PumaPay token has 18 decimals - same as one ETHER
    uint256 constant private FUNDING_AMOUNT = 0.5 ether;                           /// Amount to transfer to owner/executor
    uint256 constant private MINIMUM_AMOUNT_OF_ETH_FOR_OPERATORS = 0.15 ether;     /// min amount of ETH for owner/executor
    bytes32 constant private TYPE_SINGLE_PULL_PAYMENT = "2";
    bytes32 constant private TYPE_RECURRING_PULL_PAYMENT = "3";
    bytes32 constant private TYPE_RECURRING_PULL_PAYMENT_WITH_INITIAL = "4";
    bytes32 constant private TYPE_PULL_PAYMENT_WITH_FREE_TRIAL = "5";
    bytes32 constant private TYPE_PULL_PAYMENT_WITH_PAID_TRIAL = "6";
    bytes32 constant private TYPE_SINGLE_DYNAMIC_PULL_PAYMENT = "7";
    bytes32 constant private EMPTY_BYTES32 = "";
    /// ===============================================================================================================
    ///                                      Members
    /// ===============================================================================================================
    IERC20 public token;
    mapping(address => bool) public executors;
    mapping(bytes32 => PullPayment) public pullPayments;

    struct PullPayment {
        bytes32[3] paymentIds;                  /// [0] paymentID / [1] businessID / [2] uniqueReferenceID
        bytes32 paymentType;                    /// Type of Pull Payment - must be one of the defined pull payment types
        string currency;                        /// 3-letter abbr i.e. 'EUR' / 'USD' etc.
        uint256 initialConversionRate;          /// conversion rate for first payment execution
        uint256 initialPaymentAmountInCents;    /// initial payment amount in fiat in cents
        uint256 fiatAmountInCents;              /// payment amount in fiat in cents
        uint256 frequency;                      /// how often merchant can pull - in seconds
        uint256 numberOfPayments;               /// amount of pull payments merchant can make
        uint256 startTimestamp;                 /// when subscription starts - in seconds
        uint256 trialPeriod;                    /// trial period of the pull payment - in seconds
        uint256 nextPaymentTimestamp;           /// timestamp of next payment
        uint256 lastPaymentTimestamp;           /// timestamp of last payment
        uint256 cancelTimestamp;                /// timestamp the payment was cancelled
        address treasuryAddress;                /// address which pma tokens will be transfer to on execution
        address executorAddress;                /// address that can execute the pull payment
    }
    /// ===============================================================================================================
    ///                                      Modifiers
    /// ===============================================================================================================
    modifier isExecutor() {
        require(executors[msg.sender], "msg.sender not an executor");
        _;
    }
    modifier executorExists(address _executor) {
        require(executors[_executor], "Executor does not exists.");
        _;
    }
    modifier executorDoesNotExists(address _executor) {
        require(!executors[_executor], "Executor already exists.");
        _;
    }
    modifier paymentExists(bytes32 _paymentID) {
        require(pullPayments[_paymentID].paymentIds[0] != "", "Pull Payment does not exists.");
        _;
    }
    modifier paymentNotCancelled(bytes32 _paymentID) {
        require(pullPayments[_paymentID].cancelTimestamp == 0, "Pull Payment is cancelled");
        _;
    }
    modifier isValidPullPaymentExecutionRequest(
        bytes32 _paymentID,
        uint256 _paymentNumber) {
        require(pullPayments[_paymentID].numberOfPayments == _paymentNumber,
            "Invalid pull payment execution request - Pull payment number of payment is invalid");
        require((pullPayments[_paymentID].initialPaymentAmountInCents > 0 ||
        (now >= pullPayments[_paymentID].startTimestamp &&
        now >= pullPayments[_paymentID].nextPaymentTimestamp)
            ), "Invalid pull payment execution request - Time of execution is invalid."
        );
        require(pullPayments[_paymentID].numberOfPayments > 0,
            "Invalid pull payment execution request - Number of payments is zero.");
        require(
            (pullPayments[_paymentID].cancelTimestamp == 0 ||
        pullPayments[_paymentID].cancelTimestamp >
        pullPayments[_paymentID].nextPaymentTimestamp),
            "Invalid pull payment execution request - Pull payment is cancelled");
        require(keccak256(
            abi.encodePacked(pullPayments[_paymentID].paymentIds[0])
        ) == keccak256(abi.encodePacked(_paymentID)),
            "Invalid pull payment execution request - Payment ID not matching.");
        _;
    }
    modifier isValidDeletionRequest(bytes32 _paymentID, address _customerAddress) {
        require(_paymentID != EMPTY_BYTES32, "Invalid deletion request - Payment ID is empty.");
        require(_customerAddress != address(0), "Invalid deletion request - Client address is ZERO_ADDRESS.");
        _;
    }
    modifier isValidAddress(address _address) {
        require(_address != address(0), "Invalid address - ZERO_ADDRESS provided");
        _;
    }
    modifier validAmount(uint256 _amount) {
        require(_amount > 0, "Invalid amount - Must be higher than zero");
        require(_amount <= OVERFLOW_LIMITER_NUMBER, "Invalid amount - Must be lower than the overflow limit.");
        _;
    }
    /// ===============================================================================================================
    ///                                      Constructor
    /// ===============================================================================================================
    /// @dev Contract constructor - sets the token address that the contract facilitates.
    /// @param _token Token Address.
    constructor(address _token)
    public {
        require(_token != address(0), "Invalid address for token - ZERO_ADDRESS provided");
        token = IERC20(_token);
    }
    // @notice Will receive any eth sent to the contract
    function() external payable {
    }
    /// ===============================================================================================================
    ///                                      Public Functions - Owner Only
    /// ===============================================================================================================
    /// @dev Adds a new executor. - can be executed only by the onwer.
    /// When adding a new executor 0.5 ETH is transferred to allow the executor to pay for gas.
    /// The balance of the owner is also checked and if funding is needed 0.5 ETH is transferred.
    /// @param _executor - address of the executor which cannot be zero address.
    function addExecutor(address payable _executor)
    public
    onlyOwner
    isValidAddress(_executor)
    executorDoesNotExists(_executor)
    {
        executors[_executor] = true;
        if (isFundingNeeded(_executor)) {
            _executor.transfer(FUNDING_AMOUNT);
            emit LogSmartContractActorFunded("executor", _executor, now);
        }

        if (isFundingNeeded(owner())) {
            owner().transfer(FUNDING_AMOUNT);
            emit LogSmartContractActorFunded("owner", owner(), now);
        }
        emit LogExecutorAdded(_executor);
    }
    /// @dev Removes a new executor. - can be executed only by the owner.
    /// The balance of the owner is checked and if funding is needed 0.5 ETH is transferred.
    /// @param _executor - address of the executor which cannot be zero address.
    function removeExecutor(address payable _executor)
    public
    onlyOwner
    isValidAddress(_executor)
    executorExists(_executor)
    {
        executors[_executor] = false;
        if (isFundingNeeded(owner())) {
            owner().transfer(FUNDING_AMOUNT);
            emit LogSmartContractActorFunded("owner", owner(), now);
        }
        emit LogExecutorRemoved(_executor);
    }
    /// ===============================================================================================================
    ///                                      Public Functions - Executors Only
    /// ===============================================================================================================
    /// @dev Registers a new pull payment to the PumaPay Pull Payment Contract - The registration can be executed only
    /// by one of the executors of the PumaPay Pull Payment Contract
    /// and the PumaPay Pull Payment Contract checks that the pull payment has been singed by the customer of the account.
    /// If the pull payment doesn't have a trial period, the first execution will take place.'
    /// The pull payment is updated accordingly in terms of how many payments can happen, and when is the next payment date.
    /// (For more details on the above check the 'executePullPayment' method.
    /// The balance of the executor (msg.sender) is checked and if funding is needed 0.5 ETH is transferred.
    /// Emits 'LogPaymentRegistered' with customer address, pull payment executor address and paymentID.
    /// @param v - recovery ID of the ETH signature. - https://github.com/ethereum/EIPs/issues/155
    /// @param r - R output of ECDSA signature.
    /// @param s - S output of ECDSA signature.
    /// @param _paymentDetails - all the relevant id-related details for the payment.
    /// @param _addresses - all the relevant addresses for the payment.
    /// @param _paymentAmounts - all the relevant amounts for the payment.
    /// @param _paymentTimestamps - all the relevant timestamps for the payment.
    /// @param _currency - currency of the payment / 3-letter abbr i.e. 'EUR'.
    function registerPullPayment(
        uint8 v,
        bytes32 r,
        bytes32 s,
        bytes32[4] memory _paymentDetails, // 0 paymentID, 1 businessID, 2 uniqueReferenceID, 3 paymentType
        address[3] memory _addresses, // 0 customer, 1 executor, 2 treasury
        uint256[3] memory _paymentAmounts, // 0 _initialConversionRate, 1 _fiatAmountInCents, 2 _initialPaymentAmountInCents
        uint256[4] memory _paymentTimestamps, // 0 _frequency, 1 _numberOfPayments, 2 _startTimestamp, 3 _trialPeriod
        string memory _currency
    )
    public
    isExecutor()
    {
        require(pullPayments[_paymentDetails[0]].paymentIds[0] == "", "Pull Payment already exists.");
        require(_paymentDetails[0] != EMPTY_BYTES32, "Payment ID is empty.");
        require(_paymentDetails[1] != EMPTY_BYTES32, "Business ID is empty.");
        require(_paymentDetails[2] != EMPTY_BYTES32, "Unique Reference ID is empty.");
        require(_paymentDetails[3] != EMPTY_BYTES32, "Payment Type is empty.");
        require(_addresses[0] != address(0), "Customer Address is ZERO_ADDRESS.");
        require(_addresses[1] != address(0), "Treasury Address is ZERO_ADDRESS.");
        require(_paymentAmounts[0] > 0, "Initial conversion rate is zero.");
        require(_paymentAmounts[1] > 0, "Payment amount in fiat is zero.");
        require(_paymentAmounts[2] >= 0, "Initial payment amount in fiat is less than zero.");
        require(_paymentTimestamps[0] > 0, "Payment frequency is zero.");
        require(_paymentTimestamps[1] > 0, "Payment number of payments is zero.");
        require(_paymentTimestamps[2] > 0, "Payment start time is zero.");
        require(_paymentTimestamps[3] >= 0, "Payment trial period is less than zero.");
        require(_paymentAmounts[0] <= OVERFLOW_LIMITER_NUMBER, "Initial conversion rate is higher thant the overflow limit.");
        require(_paymentAmounts[1] <= OVERFLOW_LIMITER_NUMBER, "Payment amount in fiat is higher thant the overflow limit.");
        require(_paymentAmounts[2] <= OVERFLOW_LIMITER_NUMBER, "Payment initial amount in fiat is higher thant the overflow limit.");
        require(_paymentTimestamps[0] <= OVERFLOW_LIMITER_NUMBER, "Payment frequency is higher thant the overflow limit.");
        require(_paymentTimestamps[1] <= OVERFLOW_LIMITER_NUMBER, "Payment number of payments is higher thant the overflow limit.");
        require(_paymentTimestamps[2] <= OVERFLOW_LIMITER_NUMBER, "Payment start time is higher thant the overflow limit.");
        require(_paymentTimestamps[3] <= OVERFLOW_LIMITER_NUMBER, "Payment trial period is higher thant the overflow limit.");
        require(bytes(_currency).length > 0, "Currency is empty");
        pullPayments[_paymentDetails[0]].paymentIds[0] = _paymentDetails[0];
        pullPayments[_paymentDetails[0]].paymentType = _paymentDetails[3];
        pullPayments[_paymentDetails[0]].executorAddress = _addresses[1];
        pullPayments[_paymentDetails[0]].treasuryAddress = _addresses[2];
        pullPayments[_paymentDetails[0]].initialConversionRate = _paymentAmounts[0];
        pullPayments[_paymentDetails[0]].fiatAmountInCents = _paymentAmounts[1];
        pullPayments[_paymentDetails[0]].initialPaymentAmountInCents = _paymentAmounts[2];
        pullPayments[_paymentDetails[0]].frequency = _paymentTimestamps[0];
        pullPayments[_paymentDetails[0]].numberOfPayments = _paymentTimestamps[1];
        pullPayments[_paymentDetails[0]].startTimestamp = _paymentTimestamps[2];
        pullPayments[_paymentDetails[0]].trialPeriod = _paymentTimestamps[3];
        pullPayments[_paymentDetails[0]].currency = _currency;
        require(isValidRegistration(
                v,
                r,
                s,
                _addresses[0],
                pullPayments[_paymentDetails[0]]),
            "Invalid pull payment registration - ECRECOVER_FAILED"
        );
        pullPayments[_paymentDetails[0]].paymentIds[1] = _paymentDetails[1];
        pullPayments[_paymentDetails[0]].paymentIds[2] = _paymentDetails[2];
        pullPayments[_paymentDetails[0]].cancelTimestamp = 0;
        /// @dev In case of a free trial period the start timestamp of the payment
        /// is the start timestamp that was signed by the customer + the trial period.
        /// A payment is not needed during registration.
        if (_paymentDetails[3] == TYPE_PULL_PAYMENT_WITH_FREE_TRIAL) {
            pullPayments[_paymentDetails[0]].nextPaymentTimestamp = _paymentTimestamps[2] + _paymentTimestamps[3];
            pullPayments[_paymentDetails[0]].lastPaymentTimestamp = 0;
            /// @dev In case of a recurring payment with initial amount
            /// the first payment of the 'initialPaymentAmountInCents' and 'initialConversionRate'
            /// will happen on registration.
            /// Once it happens, we set the next payment timestamp as
            /// the start timestamp signed by the customer + trial period
        } else if (_paymentDetails[3] == TYPE_RECURRING_PULL_PAYMENT_WITH_INITIAL) {
            require(executePullPaymentOnRegistration(
                    [_paymentDetails[0], _paymentDetails[1], _paymentDetails[2]], // 0 paymentID, 1 businessID, 2 uniqueReferenceID
                    [_addresses[0], _addresses[1], _addresses[2]], // 0 Customer Address, 1 executor Address, 2 Treasury Address
                    [_paymentAmounts[2], _paymentAmounts[0]] // 0 initialPaymentAmountInCents, 1 initialConversionRate
                ));
            pullPayments[_paymentDetails[0]].lastPaymentTimestamp = now;
            pullPayments[_paymentDetails[0]].nextPaymentTimestamp = _paymentTimestamps[2] + _paymentTimestamps[0];
            /// @dev In the case od a paid trial, the first payment happens
            /// on registration using the 'initialPaymentAmountInCents' and 'initialConversionRate'.
            /// When the first payment takes place we set the next payment timestamp
            /// as the start timestamp that was signed by the customer + the trial period
        } else if (_paymentDetails[3] == TYPE_PULL_PAYMENT_WITH_PAID_TRIAL) {
            require(executePullPaymentOnRegistration(
                    [_paymentDetails[0], _paymentDetails[1], _paymentDetails[2]], /// paymentID , businessID , uniqueReferenceID
                    [_addresses[0], _addresses[1], _addresses[2]], // 0 Customer Address, 1 executor Address, 2 Treasury Address
                    [_paymentAmounts[2], _paymentAmounts[0]] /// 0 initialPaymentAmountInCents, 1 initialConversionRate
                ));
            pullPayments[_paymentDetails[0]].lastPaymentTimestamp = now;
            pullPayments[_paymentDetails[0]].nextPaymentTimestamp = _paymentTimestamps[2] + _paymentTimestamps[3];
            /// @dev For the rest of the cases the first payment happens on registration
            /// using the 'fiatAmountInCents' and 'initialConversionRate'.
            /// When the first payment takes place, the number of payment is decreased by 1,
            /// and the next payment timestamp is set to the start timestamp signed by the
            /// customer + the frequency of the payment.
        } else {
            require(executePullPaymentOnRegistration(
                    [_paymentDetails[0], _paymentDetails[1], _paymentDetails[2]], /// paymentID , businessID , uniqueReferenceID
                    [_addresses[0], _addresses[1], _addresses[2]], // 0 Customer Address, 1 executor Address, 2 Treasury Address
                    [_paymentAmounts[1], _paymentAmounts[0]] /// fiatAmountInCents, initialConversionRate
                ));
            pullPayments[_paymentDetails[0]].lastPaymentTimestamp = now;
            pullPayments[_paymentDetails[0]].nextPaymentTimestamp = _paymentTimestamps[2] + _paymentTimestamps[0];
            pullPayments[_paymentDetails[0]].numberOfPayments = _paymentTimestamps[1] - 1;
        }
        if (isFundingNeeded(msg.sender)) {
            msg.sender.transfer(FUNDING_AMOUNT);
            emit LogSmartContractActorFunded("executor", msg.sender, now);
        }
        emit LogPaymentRegistered(_addresses[0], _paymentDetails[0], _paymentDetails[1], _paymentDetails[2]);
    }
    /// @dev Deletes a pull payment for a pull payment executor - The deletion needs can be executed only by one of the
    /// executors of the PumaPay Pull Payment Contract
    /// and the PumaPay Pull Payment Contract checks that the pull payment executor and the paymentID have
    /// been singed by the customer of the account.
    /// This method sets the cancellation of the pull payment in the pull payments array for this pull payment executor specified.
    /// The balance of the executor (msg.sender) is checked and if funding is needed 0.5 ETH is transferred.
    /// Emits 'LogPaymentCancelled' with pull payment executor address and paymentID.
    /// @param v - recovery ID of the ETH signature. - https://github.com/ethereum/EIPs/issues/155
    /// @param r - R output of ECDSA signature.
    /// @param s - S output of ECDSA signature.
    /// @param _paymentID - ID of the payment.
    /// @param _customerAddress - customer address that is linked to this pull payment.
    /// @param _pullPaymentExecutor - address that is allowed to execute this pull payment.
    function deletePullPayment(
        uint8 v,
        bytes32 r,
        bytes32 s,
        bytes32 _paymentID,
        address _customerAddress,
        address _pullPaymentExecutor
    )
    public
    isExecutor()
    paymentExists(_paymentID)
    paymentNotCancelled(_paymentID)
    isValidDeletionRequest(_paymentID, _customerAddress)
    {
        require(isValidDeletion(v, r, s, _paymentID, _customerAddress, _pullPaymentExecutor), "Invalid deletion - ECRECOVER_FAILED.");
        pullPayments[_paymentID].cancelTimestamp = now;
        if (isFundingNeeded(msg.sender)) {
            msg.sender.transfer(FUNDING_AMOUNT);
            emit LogSmartContractActorFunded("executor", msg.sender, now);
        }
        emit LogPaymentCancelled(
            _customerAddress,
            _paymentID,
            pullPayments[_paymentID].paymentIds[1],
            pullPayments[_paymentID].paymentIds[2]
        );
    }
    /// ===============================================================================================================
    ///                                      Public Functions
    /// ===============================================================================================================
    /// @dev Executes a pull payment for the msg.sender - The pull payment should exist and the payment request
    /// should be valid in terms of when it can be executed.
    /// Emits 'LogPullPaymentExecuted' with customer address, msg.sender as the pull payment executor address and the paymentID.
    /// Use Case: Single/Recurring Fixed Pull Payment
    /// ------------------------------------------------
    /// We calculate the amount in PMA using the conversion rate specified when calling the method.
    /// From the 'conversionRate' and the 'fiatAmountInCents' we calculate the amount of PMA that
    /// the business need to receive in their treasuryAddress.
    /// The smart contract transfers from the customer account to the treasury wallet the amount in PMA.
    /// After execution we set the last payment timestamp to NOW, the next payment timestamp is incremented by
    /// the frequency and the number of payments is decreased by 1.
    /// @param _customerAddress - address of the customer from which the msg.sender requires to pull funds.
    /// @param _paymentID - ID of the payment.
    /// @param _paymentDetails - Payment details - [0] conversion rate // [1] payment Number
    function executePullPayment(address _customerAddress, bytes32 _paymentID, uint256[2] memory _paymentDetails)
    public
    paymentExists(_paymentID)
    isValidPullPaymentExecutionRequest(_paymentID, _paymentDetails[1])
    validAmount(_paymentDetails[0])
    returns (bool)
    {
        uint256 conversionRate = _paymentDetails[0];
        address customerAddress = _customerAddress;
        bytes32[3] memory paymentIds = pullPayments[_paymentID].paymentIds;
        address treasury = pullPayments[_paymentID].treasuryAddress;
        uint256 amountInPMA = calculatePMAFromFiat(pullPayments[paymentIds[0]].fiatAmountInCents, conversionRate);

        pullPayments[paymentIds[0]].nextPaymentTimestamp =
        pullPayments[paymentIds[0]].nextPaymentTimestamp + pullPayments[paymentIds[0]].frequency;
        pullPayments[paymentIds[0]].numberOfPayments = pullPayments[paymentIds[0]].numberOfPayments - 1;
        pullPayments[paymentIds[0]].lastPaymentTimestamp = now;
        require(token.transferFrom(
                customerAddress,
                treasury,
                amountInPMA
            ));
        emit LogPullPaymentExecuted(
            customerAddress,
            paymentIds[0],
            paymentIds[1],
            paymentIds[2],
            amountInPMA,
            conversionRate
        );
        return true;
    }

    /// ===============================================================================================================
    ///                                      Internal Functions
    /// ===============================================================================================================
    /// @dev The new version of the smart contract allows for the first execution to happen on registration,
    /// unless the pull payment has free trial. Check the comments on 'registerPullPayment' method for more details.
    function executePullPaymentOnRegistration(
        bytes32[3] memory _paymentDetails, // 0 paymentID, 1 businessID, 2 uniqueReferenceID
        address[3] memory _addresses, // 0 customer Address, 1, executor Address, 2 treasury Address
        uint256[2] memory _paymentAmounts // 0 _fiatAmountInCents, 1 _conversionRate
    )
    internal
    returns (bool) {
        uint256 amountInPMA = calculatePMAFromFiat(_paymentAmounts[0], _paymentAmounts[1]);
        require(token.transferFrom(_addresses[0], _addresses[2], amountInPMA));
        emit LogPullPaymentExecuted(
            _addresses[0],
            _paymentDetails[0],
            _paymentDetails[1],
            _paymentDetails[2],
            amountInPMA,
            _paymentAmounts[1]
        );
        return true;
    }

    /// @dev Calculates the PMA Rate for the fiat currency specified - The rate is set every 10 minutes by our PMA server
    /// for the currencies specified in the smart contract.
    /// @param _fiatAmountInCents - payment amount in fiat CENTS so that is always integer
    /// @param _conversionRate - conversion rate with which the payment needs to take place
    /// RATE CALCULATION EXAMPLE
    /// ------------------------
    /// RATE ==> 1 PMA = 0.01 USD$
    /// 1 USD$ = 1/0.01 PMA = 100 PMA
    /// Start the calculation from one ether - PMA Token has 18 decimals
    /// Multiply by the DECIMAL_FIXER (1e+10) to fix the multiplication of the rate
    /// Multiply with the fiat amount in cents
    /// Divide by the Rate of PMA to Fiat in cents
    /// Divide by the FIAT_TO_CENT_FIXER to fix the _fiatAmountInCents
    /// ---------------------------------------------------------------------------------------------------------------
    /// To save on gas, we have 'pre-calculated' the equation below and have set a constant in its place.
    /// ONE_ETHER.mul(DECIMAL_FIXER).div(FIAT_TO_CENT_FIXER) = RATE_CALCULATION_NUMBER
    /// ONE_ETHER = 10^18           |
    /// DECIMAL_FIXER = 10^10       |   => 10^18 * 10^10 / 100 ==> 10^26  => RATE_CALCULATION_NUMBER = 10^26
    /// FIAT_TO_CENT_FIXER = 100    |
    /// NOTE: The aforementioned value is linked to the OVERFLOW_LIMITER_NUMBER which is set to 10^20.
    /// ---------------------------------------------------------------------------------------------------------------
    function calculatePMAFromFiat(uint256 _fiatAmountInCents, uint256 _conversionRate)
    internal
    pure
    validAmount(_fiatAmountInCents)
    validAmount(_conversionRate)
    returns (uint256) {
        return RATE_CALCULATION_NUMBER.mul(_fiatAmountInCents).div(_conversionRate);
    }
    /// @dev Checks if a registration request is valid by comparing the v, r, s params
    /// and the hashed params with the customer address.
    /// @param v - recovery ID of the ETH signature. - https://github.com/ethereum/EIPs/issues/155
    /// @param r - R output of ECDSA signature.
    /// @param s - S output of ECDSA signature.
    /// @param _customerAddress - customer address that is linked to this pull payment.
    /// @param _pullPayment - pull payment to be validated.
    /// @return bool - if the v, r, s params with the hashed params match the customer address
    function isValidRegistration(
        uint8 v,
        bytes32 r,
        bytes32 s,
        address _customerAddress,
        PullPayment memory _pullPayment
    )
    internal
    pure
    returns (bool)
    {
        return ecrecover(
            keccak256(
                abi.encodePacked(
                    _pullPayment.executorAddress,
                    _pullPayment.paymentIds[0],
                    _pullPayment.paymentType,
                    _pullPayment.treasuryAddress,
                    _pullPayment.currency,
                    _pullPayment.initialPaymentAmountInCents,
                    _pullPayment.fiatAmountInCents,
                    _pullPayment.frequency,
                    _pullPayment.numberOfPayments,
                    _pullPayment.startTimestamp,
                    _pullPayment.trialPeriod
                )
            ),
            v, r, s) == _customerAddress;
    }
    /// @dev Checks if a deletion request is valid by comparing the v, r, s params
    /// and the hashed params with the customer address.
    /// @param v - recovery ID of the ETH signature. - https://github.com/ethereum/EIPs/issues/155
    /// @param r - R output of ECDSA signature.
    /// @param s - S output of ECDSA signature.
    /// @param _paymentID - ID of the payment.
    /// @param _customerAddress - customer address that is linked to this pull payment.
    /// @param _pullPaymentExecutor - address that is allowed to execute this pull payment.
    /// @return bool - if the v, r, s params with the hashed params match the customer address
    function isValidDeletion(
        uint8 v,
        bytes32 r,
        bytes32 s,
        bytes32 _paymentID,
        address _customerAddress,
        address _pullPaymentExecutor
    )
    internal
    view
    returns (bool)
    {
        return ecrecover(
            keccak256(
                abi.encodePacked(
                    _paymentID,
                    _pullPaymentExecutor
                )
            ), v, r, s) == _customerAddress
        && keccak256(
            abi.encodePacked(pullPayments[_paymentID].paymentIds[0])
        ) == keccak256(abi.encodePacked(_paymentID)
        );
    }
    /// @dev Checks if the address of an owner/executor needs to be funded.
    /// The minimum amount the owner/executors should always have is 0.15 ETH
    /// @param _address - address of owner/executors that the balance is checked against.
    /// @return bool - whether the address needs more ETH.
    function isFundingNeeded(address _address)
    private
    view
    returns (bool) {
        return address(_address).balance <= MINIMUM_AMOUNT_OF_ETH_FOR_OPERATORS;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"pullPayments","outputs":[{"name":"paymentType","type":"bytes32"},{"name":"currency","type":"string"},{"name":"initialConversionRate","type":"uint256"},{"name":"initialPaymentAmountInCents","type":"uint256"},{"name":"fiatAmountInCents","type":"uint256"},{"name":"frequency","type":"uint256"},{"name":"numberOfPayments","type":"uint256"},{"name":"startTimestamp","type":"uint256"},{"name":"trialPeriod","type":"uint256"},{"name":"nextPaymentTimestamp","type":"uint256"},{"name":"lastPaymentTimestamp","type":"uint256"},{"name":"cancelTimestamp","type":"uint256"},{"name":"treasuryAddress","type":"address"},{"name":"executorAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_executor","type":"address"}],"name":"addExecutor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_executor","type":"address"}],"name":"removeExecutor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"_paymentDetails","type":"bytes32[4]"},{"name":"_addresses","type":"address[3]"},{"name":"_paymentAmounts","type":"uint256[3]"},{"name":"_paymentTimestamps","type":"uint256[4]"},{"name":"_currency","type":"string"}],"name":"registerPullPayment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"executors","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"_paymentID","type":"bytes32"},{"name":"_customerAddress","type":"address"},{"name":"_pullPaymentExecutor","type":"address"}],"name":"deletePullPayment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_customerAddress","type":"address"},{"name":"_paymentID","type":"bytes32"},{"name":"_paymentDetails","type":"uint256[2]"}],"name":"executePullPayment","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_token","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"executor","type":"address"}],"name":"LogExecutorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"executor","type":"address"}],"name":"LogExecutorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"actorRole","type":"string"},{"indexed":false,"name":"actor","type":"address"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"LogSmartContractActorFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"customerAddress","type":"address"},{"indexed":false,"name":"paymentID","type":"bytes32"},{"indexed":false,"name":"businessID","type":"bytes32"},{"indexed":false,"name":"uniqueReferenceID","type":"bytes32"}],"name":"LogPaymentRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"customerAddress","type":"address"},{"indexed":false,"name":"paymentID","type":"bytes32"},{"indexed":false,"name":"businessID","type":"bytes32"},{"indexed":false,"name":"uniqueReferenceID","type":"bytes32"}],"name":"LogPaymentCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"customerAddress","type":"address"},{"indexed":false,"name":"paymentID","type":"bytes32"},{"indexed":false,"name":"businessID","type":"bytes32"},{"indexed":false,"name":"uniqueReferenceID","type":"bytes32"},{"indexed":false,"name":"amountInPMA","type":"uint256"},{"indexed":false,"name":"conversionRate","type":"uint256"}],"name":"LogPullPaymentExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60806040523480156200001157600080fd5b5060405162004be638038062004be6833981810160405260208110156200003757600080fd5b8101908080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200018c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018062004bb56031913960400191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506149d780620001de6000396000f3fe6080604052600436106100a75760003560e01c80638f32d59b116100645780638f32d59b1461050e5780639ac2a0111461053d578063d8516935146105a6578063f2fde38b14610642578063fbe77c6614610693578063fc0c546a14610747576100a7565b806306751135146100a95780631f5a0bbe1461021057806324788429146102615780633f72b458146102b2578063715018a6146104a05780638da5cb5b146104b7575b005b3480156100b557600080fd5b506100e2600480360360208110156100cc57600080fd5b810190808035906020019092919050505061079e565b604051808f8152602001806020018e81526020018d81526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182810382528f818151815260200191508051906020019080838360005b838110156101c85780820151818401526020810190506101ad565b50505050905090810190601f1680156101f55780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390f35b34801561021c57600080fd5b5061025f6004803603602081101561023357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108e2565b005b34801561026d57600080fd5b506102b06004803603602081101561028457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d14565b005b3480156102be57600080fd5b5061049e60048036036102408110156102d657600080fd5b81019080803560ff169060200190929190803590602001909291908035906020019092919080608001906004806020026040519081016040528092919082600460200280828437600081840152601f19601f820116905080830192505050505050919291929080606001906003806020026040519081016040528092919082600360200280828437600081840152601f19601f820116905080830192505050505050919291929080606001906003806020026040519081016040528092919082600360200280828437600081840152601f19601f820116905080830192505050505050919291929080608001906004806020026040519081016040528092919082600460200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561041857600080fd5b82018360208201111561042a57600080fd5b8035906020019184600183028401116401000000008311171561044c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611043565b005b3480156104ac57600080fd5b506104b5612baf565b005b3480156104c357600080fd5b506104cc612c7f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561051a57600080fd5b50610523612ca8565b604051808215151515815260200191505060405180910390f35b34801561054957600080fd5b5061058c6004803603602081101561056057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cff565b604051808215151515815260200191505060405180910390f35b3480156105b257600080fd5b50610640600480360360c08110156105c957600080fd5b81019080803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d1f565b005b34801561064e57600080fd5b506106916004803603602081101561066557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613238565b005b34801561069f57600080fd5b5061072d600480360360808110156106b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f8201169050808301925050505050509192919290505050613255565b604051808215151515815260200191505060405180910390f35b34801561075357600080fd5b5061075c613aa5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6003602052806000526040600020600091509050806003015490806004018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108505780601f1061082557610100808354040283529160200191610850565b820191906000526020600020905b81548152906001019060200180831161083357829003601f168201915b50505050509080600501549080600601549080600701549080600801549080600901549080600a01549080600b01549080600c01549080600d01549080600e01549080600f0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060100160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508e565b6108ea612ca8565b6108f357600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061497c6027913960400191505060405180910390fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610a3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4578656375746f7220616c7265616479206578697374732e000000000000000081525060200191505060405180910390fd5b6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610a9c83613acb565b15610b95578273ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015610aef573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705834260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f6578656375746f72000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b610ba5610ba0612c7f565b613acb565b15610cac57610bb2612c7f565b73ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015610bff573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705610c29612c7f565b4260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260058152602001807f6f776e6572000000000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7f8002cf25aa76b379f7f97c8fe71f2bb091370573ab719fd656612219aae890ba83604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b610d1c612ca8565b610d2557600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061497c6027913960400191505060405180910390fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4578656375746f7220646f6573206e6f74206578697374732e0000000000000081525060200191505060405180910390fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610ed4610ecf612c7f565b613acb565b15610fdb57610ee1612c7f565b73ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015610f2e573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705610f58612c7f565b4260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260058152602001807f6f776e6572000000000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7f67c86b0b9218d30f0d89e72b9aafcace5cd51e46f60fdf6f3323877952e21c4b83604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611102576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d73672e73656e646572206e6f7420616e206578656375746f7200000000000081525060200191505060405180910390fd5b6000600360008760006004811061111557fe5b6020020151815260200190815260200160002060000160006003811061113757fe5b0154146111ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f50756c6c205061796d656e7420616c7265616479206578697374732e0000000081525060200191505060405180910390fd5b6000801916856000600481106111be57fe5b60200201511415611237576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061796d656e7420494420697320656d7074792e00000000000000000000000081525060200191505060405180910390fd5b60008019168560016004811061124957fe5b602002015114156112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f427573696e65737320494420697320656d7074792e000000000000000000000081525060200191505060405180910390fd5b6000801916856002600481106112d457fe5b6020020151141561134d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f556e69717565205265666572656e636520494420697320656d7074792e00000081525060200191505060405180910390fd5b60008019168560036004811061135f57fe5b602002015114156113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5061796d656e74205479706520697320656d7074792e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16846000600381106113fd57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16141561146f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806146cd6021913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168460016003811061149457fe5b602002015173ffffffffffffffffffffffffffffffffffffffff161415611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147a86021913960400191505060405180910390fd5b60008360006003811061151557fe5b60200201511161158d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f496e697469616c20636f6e76657273696f6e2072617465206973207a65726f2e81525060200191505060405180910390fd5b60008360016003811061159c57fe5b602002015111611614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5061796d656e7420616d6f756e7420696e2066696174206973207a65726f2e0081525060200191505060405180910390fd5b60008360026003811061162357fe5b6020020151101561167f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806148b76031913960400191505060405180910390fd5b60008260006004811061168e57fe5b602002015111611706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5061796d656e74206672657175656e6379206973207a65726f2e00000000000081525060200191505060405180910390fd5b60008260016004811061171557fe5b602002015111611770576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146686023913960400191505060405180910390fd5b60008260026004811061177f57fe5b6020020151116117f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f5061796d656e742073746172742074696d65206973207a65726f2e000000000081525060200191505060405180910390fd5b60008260036004811061180657fe5b60200201511015611862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061450f6027913960400191505060405180910390fd5b68056bc75e2d631000008360006003811061187957fe5b602002015111156118d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001806145ca603b913960400191505060405180910390fd5b68056bc75e2d63100000836001600381106118ec57fe5b60200201511115611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614734603a913960400191505060405180910390fd5b68056bc75e2d631000008360026003811061195f57fe5b602002015111156119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806145886042913960600191505060405180910390fd5b68056bc75e2d63100000826000600481106119d257fe5b60200201511115611a2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806149116035913960400191505060405180910390fd5b68056bc75e2d6310000082600160048110611a4557fe5b60200201511115611aa1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806147c9603e913960400191505060405180910390fd5b68056bc75e2d6310000082600260048110611ab857fe5b60200201511115611b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806149466036913960400191505060405180910390fd5b68056bc75e2d6310000082600360048110611b2b57fe5b60200201511115611b87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806148486038913960400191505060405180910390fd5b6000815111611bfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f43757272656e637920697320656d70747900000000000000000000000000000081525060200191505060405180910390fd5b84600060048110611c0b57fe5b60200201516003600087600060048110611c2157fe5b60200201518152602001908152602001600020600001600060038110611c4357fe5b018190555084600360048110611c5557fe5b60200201516003600087600060048110611c6b57fe5b602002015181526020019081526020016000206003018190555083600160038110611c9257fe5b60200201516003600087600060048110611ca857fe5b6020020151815260200190815260200160002060100160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600260038110611d0957fe5b60200201516003600087600060048110611d1f57fe5b60200201518152602001908152602001600020600f0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600060038110611d8057fe5b60200201516003600087600060048110611d9657fe5b602002015181526020019081526020016000206005018190555082600160038110611dbd57fe5b60200201516003600087600060048110611dd357fe5b602002015181526020019081526020016000206007018190555082600260038110611dfa57fe5b60200201516003600087600060048110611e1057fe5b602002015181526020019081526020016000206006018190555081600060048110611e3757fe5b60200201516003600087600060048110611e4d57fe5b602002015181526020019081526020016000206008018190555081600160048110611e7457fe5b60200201516003600087600060048110611e8a57fe5b602002015181526020019081526020016000206009018190555081600260048110611eb157fe5b60200201516003600087600060048110611ec757fe5b60200201518152602001908152602001600020600a018190555081600360048110611eee57fe5b60200201516003600087600060048110611f0457fe5b60200201518152602001908152602001600020600b0181905550806003600087600060048110611f3057fe5b602002015181526020019081526020016000206004019080519060200190611f599291906143df565b506121a888888887600060038110611f6d57fe5b6020020151600360008b600060048110611f8357fe5b60200201518152602001908152602001600020604051806101e001604052908160008201600380602002604051908101604052809291908260038015611fde576020028201915b815481526020019060010190808311611fca575b5050505050815260200160038201548152602001600482018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561208a5780601f1061205f5761010080835404028352916020019161208a565b820191906000526020600020905b81548152906001019060200180831161206d57829003601f168201915b505050505081526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e8201548152602001600f820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016010820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050613af7565b6121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806146346034913960400191505060405180910390fd5b8460016004811061220a57fe5b6020020151600360008760006004811061222057fe5b6020020151815260200190815260200160002060000160016003811061224257fe5b01819055508460026004811061225457fe5b6020020151600360008760006004811061226a57fe5b6020020151815260200190815260200160002060000160026003811061228c57fe5b0181905550600060036000876000600481106122a457fe5b60200201518152602001908152602001600020600e01819055507f3500000000000000000000000000000000000000000000000000000000000000856003600481106122ec57fe5b60200201511415612379578160036004811061230457fe5b60200201518260026004811061231657fe5b602002015101600360008760006004811061232d57fe5b60200201518152602001908152602001600020600c01819055506000600360008760006004811061235a57fe5b60200201518152602001908152602001600020600d01819055506129e4565b7f3400000000000000000000000000000000000000000000000000000000000000856003600481106123a757fe5b6020020151141561259b576125116040518060600160405280876000600481106123cd57fe5b60200201518152602001876001600481106123e457fe5b60200201518152602001876002600481106123fb57fe5b602002015181525060405180606001604052808760006003811061241b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018760016003811061245e57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001876002600381106124a157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506040518060400160405280876002600381106124ed57fe5b602002015181526020018760006003811061250457fe5b6020020151815250613cf9565b61251a57600080fd5b42600360008760006004811061252c57fe5b60200201518152602001908152602001600020600d01819055508160006004811061255357fe5b60200201518260026004811061256557fe5b602002015101600360008760006004811061257c57fe5b60200201518152602001908152602001600020600c01819055506129e3565b7f3600000000000000000000000000000000000000000000000000000000000000856003600481106125c957fe5b602002015114156127bd576127336040518060600160405280876000600481106125ef57fe5b602002015181526020018760016004811061260657fe5b602002015181526020018760026004811061261d57fe5b602002015181525060405180606001604052808760006003811061263d57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018760016003811061268057fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001876002600381106126c357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060405180604001604052808760026003811061270f57fe5b602002015181526020018760006003811061272657fe5b6020020151815250613cf9565b61273c57600080fd5b42600360008760006004811061274e57fe5b60200201518152602001908152602001600020600d01819055508160036004811061277557fe5b60200201518260026004811061278757fe5b602002015101600360008760006004811061279e57fe5b60200201518152602001908152602001600020600c01819055506129e2565b61291c6040518060600160405280876000600481106127d857fe5b60200201518152602001876001600481106127ef57fe5b602002015181526020018760026004811061280657fe5b602002015181525060405180606001604052808760006003811061282657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018760016003811061286957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001876002600381106128ac57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506040518060400160405280876001600381106128f857fe5b602002015181526020018760006003811061290f57fe5b6020020151815250613cf9565b61292557600080fd5b42600360008760006004811061293757fe5b60200201518152602001908152602001600020600d01819055508160006004811061295e57fe5b60200201518260026004811061297057fe5b602002015101600360008760006004811061298757fe5b60200201518152602001908152602001600020600c01819055506001826001600481106129b057fe5b60200201510360036000876000600481106129c757fe5b60200201518152602001908152602001600020600901819055505b5b5b6129ed33613acb565b15612ae6573373ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015612a40573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705334260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f6578656375746f72000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7fc0028b6a3e328c438fb316cb08abd17e0f2132ef9c24f0404864f57e4488812d84600060038110612b1457fe5b602002015186600060048110612b2657fe5b602002015187600160048110612b3857fe5b602002015188600260048110612b4a57fe5b6020020151604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390a15050505050505050565b612bb7612ca8565b612bc057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60026020528060005260406000206000915054906101000a900460ff1681565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612dde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d73672e73656e646572206e6f7420616e206578656375746f7200000000000081525060200191505060405180910390fd5b82600060036000838152602001908152602001600020600001600060038110612e0357fe5b01541415612e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f50756c6c205061796d656e7420646f6573206e6f74206578697374732e00000081525060200191505060405180910390fd5b83600060036000838152602001908152602001600020600e015414612f06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f50756c6c205061796d656e742069732063616e63656c6c65640000000000000081525060200191505060405180910390fd5b84846000801916821415612f65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614605602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061476e603a913960400191505060405180910390fd5b612ff98a8a8a8a8a8a613f59565b61304e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806144a76024913960400191505060405180910390fd5b4260036000898152602001908152602001600020600e018190555061307233613acb565b1561316b573373ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f193505050501580156130c5573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705334260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f6578656375746f72000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7fc85a0b1d6f3141384cf8132808219851926be1209fa52f30c8713b3f3c6da18c8688600360008b81526020019081526020016000206000016001600381106131b057fe5b0154600360008c81526020019081526020016000206000016002600381106131d457fe5b0154604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390a150505050505050505050565b613240612ca8565b61324957600080fd5b613252816140d3565b50565b60008260006003600083815260200190815260200160002060000160006003811061327c57fe5b015414156132f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f50756c6c205061796d656e7420646f6573206e6f74206578697374732e00000081525060200191505060405180910390fd5b838360016002811061330057fe5b602002015180600360008481526020019081526020016000206009015414613373576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260528152602001806145366052913960600191505060405180910390fd5b6000600360008481526020019081526020016000206006015411806133d0575060036000838152602001908152602001600020600a015442101580156133cf575060036000838152602001908152602001600020600c01544210155b5b613425576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260468152602001806146ee6046913960600191505060405180910390fd5b6000600360008481526020019081526020016000206009015411613494576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001806144cb6044913960600191505060405180910390fd5b600060036000848152602001908152602001600020600e015414806134e4575060036000838152602001908152602001600020600c015460036000848152602001908152602001600020600e0154115b613539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604281526020018061468b6042913960600191505060405180910390fd5b8160405160200180828152602001915050604051602081830303815290604052805190602001206003600084815260200190815260200160002060000160006003811061358257fe5b0154604051602001808281526020019150506040516020818303038152906040528051906020012014613600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260418152602001806148076041913960600191505060405180910390fd5b8460006002811061360d57fe5b60200201516000811161366b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148e86029913960400191505060405180910390fd5b68056bc75e2d631000008111156136cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806148806037913960400191505060405180910390fd5b6000866000600281106136dc57fe5b6020020151905060008990506136f061445f565b600360008b815260200190815260200160002060000160038060200260405190810160405280929190826003801561373d576020028201915b815481526020019060010190808311613729575b505050505090506000600360008c8152602001908152602001600020600f0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006137b2600360008560006003811061379557fe5b6020020151815260200190815260200160002060070154866141cb565b905060036000846000600381106137c557fe5b602002015181526020019081526020016000206008015460036000856000600381106137ed57fe5b60200201518152602001908152602001600020600c015401600360008560006003811061381657fe5b60200201518152602001908152602001600020600c01819055506001600360008560006003811061384357fe5b602002015181526020019081526020016000206009015403600360008560006003811061386c57fe5b602002015181526020019081526020016000206009018190555042600360008560006003811061389857fe5b60200201518152602001908152602001600020600d0181905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8584846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561398f57600080fd5b505af11580156139a3573d6000803e3d6000fd5b505050506040513d60208110156139b957600080fd5b81019080805190602001909291905050506139d357600080fd5b7f1a5c297cf93353fa05129304db62d9b76b2ebe8b3a31f577aa3e2cd46c6f82828484600060038110613a0257fe5b602002015185600160038110613a1457fe5b602002015186600260038110613a2657fe5b6020020151858a604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a1600199505050505050505050509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000670214e8348c4f00008273ffffffffffffffffffffffffffffffffffffffff163111159050919050565b60008273ffffffffffffffffffffffffffffffffffffffff166001836101c001518460000151600060038110613b2957fe5b60200201518560200151866101a00151876040015188608001518960a001518a60c001518b60e001518c61010001518d6101200151604051602001808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018b81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140188805190602001908083835b60208310613c0a5780518252602082019150602081019050602083039250613be7565b6001836020036101000a0380198251168184511680821785525050505050509050018781526020018681526020018581526020018481526020018381526020018281526020019b5050505050505050505050506040516020818303038152906040528051906020012088888860405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015613ccd573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600080613d2883600060028110613d0c57fe5b602002015184600160028110613d1e57fe5b60200201516141cb565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd85600060038110613d7557fe5b602002015186600260038110613d8757fe5b6020020151846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015613e2957600080fd5b505af1158015613e3d573d6000803e3d6000fd5b505050506040513d6020811015613e5357600080fd5b8101908080519060200190929190505050613e6d57600080fd5b7f1a5c297cf93353fa05129304db62d9b76b2ebe8b3a31f577aa3e2cd46c6f828284600060038110613e9b57fe5b602002015186600060038110613ead57fe5b602002015187600160038110613ebf57fe5b602002015188600260038110613ed157fe5b60200201518588600160028110613ee457fe5b6020020151604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a160019150509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff1660018584604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012089898960405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561402c573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff161480156140c757508360405160200180828152602001915050604051602081830303815290604052805190602001206003600086815260200190815260200160002060000160006003811061409d57fe5b01546040516020018082815260200191505060405160208183030381529060405280519060200120145b90509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561410d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008260008111614227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148e86029913960400191505060405180910390fd5b68056bc75e2d63100000811115614289576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806148806037913960400191505060405180910390fd5b82600081116142e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148e86029913960400191505060405180910390fd5b68056bc75e2d63100000811115614345576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806148806037913960400191505060405180910390fd5b61437584614367876a52b7d2dcc80cd2e400000061437f90919063ffffffff16565b6143b990919063ffffffff16565b9250505092915050565b60008083141561439257600090506143b3565b60008284029050828482816143a357fe5b04146143ae57600080fd5b809150505b92915050565b60008082116143c757600080fd5b60008284816143d257fe5b0490508091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061442057805160ff191683800117855561444e565b8280016001018555821561444e579182015b8281111561444d578251825591602001919060010190614432565b5b50905061445b9190614481565b5090565b6040518060600160405280600390602082028038833980820191505090505090565b6144a391905b8082111561449f576000816000905550600101614487565b5090565b9056fe496e76616c69642064656c6574696f6e202d2045435245434f5645525f4641494c45442e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d204e756d626572206f66207061796d656e7473206973207a65726f2e5061796d656e7420747269616c20706572696f64206973206c657373207468616e207a65726f2e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d2050756c6c207061796d656e74206e756d626572206f66207061796d656e7420697320696e76616c69645061796d656e7420696e697469616c20616d6f756e7420696e206669617420697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e697469616c20636f6e76657273696f6e207261746520697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642064656c6574696f6e2072657175657374202d205061796d656e7420494420697320656d7074792e496e76616c69642070756c6c207061796d656e7420726567697374726174696f6e202d2045435245434f5645525f4641494c45445061796d656e74206e756d626572206f66207061796d656e7473206973207a65726f2e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d2050756c6c207061796d656e742069732063616e63656c6c6564437573746f6d65722041646472657373206973205a45524f5f414444524553532e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d2054696d65206f6620657865637574696f6e20697320696e76616c69642e5061796d656e7420616d6f756e7420696e206669617420697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642064656c6574696f6e2072657175657374202d20436c69656e742061646472657373206973205a45524f5f414444524553532e54726561737572792041646472657373206973205a45524f5f414444524553532e5061796d656e74206e756d626572206f66207061796d656e747320697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d205061796d656e74204944206e6f74206d61746368696e672e5061796d656e7420747269616c20706572696f6420697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c696420616d6f756e74202d204d757374206265206c6f776572207468616e20746865206f766572666c6f77206c696d69742e496e697469616c207061796d656e7420616d6f756e7420696e2066696174206973206c657373207468616e207a65726f2e496e76616c696420616d6f756e74202d204d75737420626520686967686572207468616e207a65726f5061796d656e74206672657175656e637920697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e5061796d656e742073746172742074696d6520697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642061646472657373202d205a45524f5f414444524553532070726f7669646564a265627a7a7230582078bec68d1480cf9101c04257d6aeaaa02ed94a3a5a1c89ae0c41f943ddacef6564736f6c634300050a0032496e76616c6964206164647265737320666f7220746f6b656e202d205a45524f5f414444524553532070726f7669646564000000000000000000000000846c66cf71c43f80403b51fe3906b3599d63336f

Deployed Bytecode

0x6080604052600436106100a75760003560e01c80638f32d59b116100645780638f32d59b1461050e5780639ac2a0111461053d578063d8516935146105a6578063f2fde38b14610642578063fbe77c6614610693578063fc0c546a14610747576100a7565b806306751135146100a95780631f5a0bbe1461021057806324788429146102615780633f72b458146102b2578063715018a6146104a05780638da5cb5b146104b7575b005b3480156100b557600080fd5b506100e2600480360360208110156100cc57600080fd5b810190808035906020019092919050505061079e565b604051808f8152602001806020018e81526020018d81526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182810382528f818151815260200191508051906020019080838360005b838110156101c85780820151818401526020810190506101ad565b50505050905090810190601f1680156101f55780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390f35b34801561021c57600080fd5b5061025f6004803603602081101561023357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108e2565b005b34801561026d57600080fd5b506102b06004803603602081101561028457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d14565b005b3480156102be57600080fd5b5061049e60048036036102408110156102d657600080fd5b81019080803560ff169060200190929190803590602001909291908035906020019092919080608001906004806020026040519081016040528092919082600460200280828437600081840152601f19601f820116905080830192505050505050919291929080606001906003806020026040519081016040528092919082600360200280828437600081840152601f19601f820116905080830192505050505050919291929080606001906003806020026040519081016040528092919082600360200280828437600081840152601f19601f820116905080830192505050505050919291929080608001906004806020026040519081016040528092919082600460200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561041857600080fd5b82018360208201111561042a57600080fd5b8035906020019184600183028401116401000000008311171561044c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611043565b005b3480156104ac57600080fd5b506104b5612baf565b005b3480156104c357600080fd5b506104cc612c7f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561051a57600080fd5b50610523612ca8565b604051808215151515815260200191505060405180910390f35b34801561054957600080fd5b5061058c6004803603602081101561056057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cff565b604051808215151515815260200191505060405180910390f35b3480156105b257600080fd5b50610640600480360360c08110156105c957600080fd5b81019080803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d1f565b005b34801561064e57600080fd5b506106916004803603602081101561066557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613238565b005b34801561069f57600080fd5b5061072d600480360360808110156106b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f8201169050808301925050505050509192919290505050613255565b604051808215151515815260200191505060405180910390f35b34801561075357600080fd5b5061075c613aa5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6003602052806000526040600020600091509050806003015490806004018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108505780601f1061082557610100808354040283529160200191610850565b820191906000526020600020905b81548152906001019060200180831161083357829003601f168201915b50505050509080600501549080600601549080600701549080600801549080600901549080600a01549080600b01549080600c01549080600d01549080600e01549080600f0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060100160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508e565b6108ea612ca8565b6108f357600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061497c6027913960400191505060405180910390fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610a3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4578656375746f7220616c7265616479206578697374732e000000000000000081525060200191505060405180910390fd5b6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610a9c83613acb565b15610b95578273ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015610aef573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705834260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f6578656375746f72000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b610ba5610ba0612c7f565b613acb565b15610cac57610bb2612c7f565b73ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015610bff573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705610c29612c7f565b4260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260058152602001807f6f776e6572000000000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7f8002cf25aa76b379f7f97c8fe71f2bb091370573ab719fd656612219aae890ba83604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b610d1c612ca8565b610d2557600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061497c6027913960400191505060405180910390fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4578656375746f7220646f6573206e6f74206578697374732e0000000000000081525060200191505060405180910390fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610ed4610ecf612c7f565b613acb565b15610fdb57610ee1612c7f565b73ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015610f2e573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705610f58612c7f565b4260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260058152602001807f6f776e6572000000000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7f67c86b0b9218d30f0d89e72b9aafcace5cd51e46f60fdf6f3323877952e21c4b83604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611102576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d73672e73656e646572206e6f7420616e206578656375746f7200000000000081525060200191505060405180910390fd5b6000600360008760006004811061111557fe5b6020020151815260200190815260200160002060000160006003811061113757fe5b0154146111ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f50756c6c205061796d656e7420616c7265616479206578697374732e0000000081525060200191505060405180910390fd5b6000801916856000600481106111be57fe5b60200201511415611237576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061796d656e7420494420697320656d7074792e00000000000000000000000081525060200191505060405180910390fd5b60008019168560016004811061124957fe5b602002015114156112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f427573696e65737320494420697320656d7074792e000000000000000000000081525060200191505060405180910390fd5b6000801916856002600481106112d457fe5b6020020151141561134d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f556e69717565205265666572656e636520494420697320656d7074792e00000081525060200191505060405180910390fd5b60008019168560036004811061135f57fe5b602002015114156113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5061796d656e74205479706520697320656d7074792e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16846000600381106113fd57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16141561146f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806146cd6021913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168460016003811061149457fe5b602002015173ffffffffffffffffffffffffffffffffffffffff161415611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147a86021913960400191505060405180910390fd5b60008360006003811061151557fe5b60200201511161158d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f496e697469616c20636f6e76657273696f6e2072617465206973207a65726f2e81525060200191505060405180910390fd5b60008360016003811061159c57fe5b602002015111611614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5061796d656e7420616d6f756e7420696e2066696174206973207a65726f2e0081525060200191505060405180910390fd5b60008360026003811061162357fe5b6020020151101561167f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806148b76031913960400191505060405180910390fd5b60008260006004811061168e57fe5b602002015111611706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5061796d656e74206672657175656e6379206973207a65726f2e00000000000081525060200191505060405180910390fd5b60008260016004811061171557fe5b602002015111611770576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146686023913960400191505060405180910390fd5b60008260026004811061177f57fe5b6020020151116117f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f5061796d656e742073746172742074696d65206973207a65726f2e000000000081525060200191505060405180910390fd5b60008260036004811061180657fe5b60200201511015611862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061450f6027913960400191505060405180910390fd5b68056bc75e2d631000008360006003811061187957fe5b602002015111156118d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001806145ca603b913960400191505060405180910390fd5b68056bc75e2d63100000836001600381106118ec57fe5b60200201511115611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614734603a913960400191505060405180910390fd5b68056bc75e2d631000008360026003811061195f57fe5b602002015111156119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806145886042913960600191505060405180910390fd5b68056bc75e2d63100000826000600481106119d257fe5b60200201511115611a2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806149116035913960400191505060405180910390fd5b68056bc75e2d6310000082600160048110611a4557fe5b60200201511115611aa1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806147c9603e913960400191505060405180910390fd5b68056bc75e2d6310000082600260048110611ab857fe5b60200201511115611b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806149466036913960400191505060405180910390fd5b68056bc75e2d6310000082600360048110611b2b57fe5b60200201511115611b87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806148486038913960400191505060405180910390fd5b6000815111611bfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f43757272656e637920697320656d70747900000000000000000000000000000081525060200191505060405180910390fd5b84600060048110611c0b57fe5b60200201516003600087600060048110611c2157fe5b60200201518152602001908152602001600020600001600060038110611c4357fe5b018190555084600360048110611c5557fe5b60200201516003600087600060048110611c6b57fe5b602002015181526020019081526020016000206003018190555083600160038110611c9257fe5b60200201516003600087600060048110611ca857fe5b6020020151815260200190815260200160002060100160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600260038110611d0957fe5b60200201516003600087600060048110611d1f57fe5b60200201518152602001908152602001600020600f0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600060038110611d8057fe5b60200201516003600087600060048110611d9657fe5b602002015181526020019081526020016000206005018190555082600160038110611dbd57fe5b60200201516003600087600060048110611dd357fe5b602002015181526020019081526020016000206007018190555082600260038110611dfa57fe5b60200201516003600087600060048110611e1057fe5b602002015181526020019081526020016000206006018190555081600060048110611e3757fe5b60200201516003600087600060048110611e4d57fe5b602002015181526020019081526020016000206008018190555081600160048110611e7457fe5b60200201516003600087600060048110611e8a57fe5b602002015181526020019081526020016000206009018190555081600260048110611eb157fe5b60200201516003600087600060048110611ec757fe5b60200201518152602001908152602001600020600a018190555081600360048110611eee57fe5b60200201516003600087600060048110611f0457fe5b60200201518152602001908152602001600020600b0181905550806003600087600060048110611f3057fe5b602002015181526020019081526020016000206004019080519060200190611f599291906143df565b506121a888888887600060038110611f6d57fe5b6020020151600360008b600060048110611f8357fe5b60200201518152602001908152602001600020604051806101e001604052908160008201600380602002604051908101604052809291908260038015611fde576020028201915b815481526020019060010190808311611fca575b5050505050815260200160038201548152602001600482018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561208a5780601f1061205f5761010080835404028352916020019161208a565b820191906000526020600020905b81548152906001019060200180831161206d57829003601f168201915b505050505081526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e8201548152602001600f820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016010820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050613af7565b6121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806146346034913960400191505060405180910390fd5b8460016004811061220a57fe5b6020020151600360008760006004811061222057fe5b6020020151815260200190815260200160002060000160016003811061224257fe5b01819055508460026004811061225457fe5b6020020151600360008760006004811061226a57fe5b6020020151815260200190815260200160002060000160026003811061228c57fe5b0181905550600060036000876000600481106122a457fe5b60200201518152602001908152602001600020600e01819055507f3500000000000000000000000000000000000000000000000000000000000000856003600481106122ec57fe5b60200201511415612379578160036004811061230457fe5b60200201518260026004811061231657fe5b602002015101600360008760006004811061232d57fe5b60200201518152602001908152602001600020600c01819055506000600360008760006004811061235a57fe5b60200201518152602001908152602001600020600d01819055506129e4565b7f3400000000000000000000000000000000000000000000000000000000000000856003600481106123a757fe5b6020020151141561259b576125116040518060600160405280876000600481106123cd57fe5b60200201518152602001876001600481106123e457fe5b60200201518152602001876002600481106123fb57fe5b602002015181525060405180606001604052808760006003811061241b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018760016003811061245e57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001876002600381106124a157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506040518060400160405280876002600381106124ed57fe5b602002015181526020018760006003811061250457fe5b6020020151815250613cf9565b61251a57600080fd5b42600360008760006004811061252c57fe5b60200201518152602001908152602001600020600d01819055508160006004811061255357fe5b60200201518260026004811061256557fe5b602002015101600360008760006004811061257c57fe5b60200201518152602001908152602001600020600c01819055506129e3565b7f3600000000000000000000000000000000000000000000000000000000000000856003600481106125c957fe5b602002015114156127bd576127336040518060600160405280876000600481106125ef57fe5b602002015181526020018760016004811061260657fe5b602002015181526020018760026004811061261d57fe5b602002015181525060405180606001604052808760006003811061263d57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018760016003811061268057fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001876002600381106126c357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060405180604001604052808760026003811061270f57fe5b602002015181526020018760006003811061272657fe5b6020020151815250613cf9565b61273c57600080fd5b42600360008760006004811061274e57fe5b60200201518152602001908152602001600020600d01819055508160036004811061277557fe5b60200201518260026004811061278757fe5b602002015101600360008760006004811061279e57fe5b60200201518152602001908152602001600020600c01819055506129e2565b61291c6040518060600160405280876000600481106127d857fe5b60200201518152602001876001600481106127ef57fe5b602002015181526020018760026004811061280657fe5b602002015181525060405180606001604052808760006003811061282657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018760016003811061286957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001876002600381106128ac57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506040518060400160405280876001600381106128f857fe5b602002015181526020018760006003811061290f57fe5b6020020151815250613cf9565b61292557600080fd5b42600360008760006004811061293757fe5b60200201518152602001908152602001600020600d01819055508160006004811061295e57fe5b60200201518260026004811061297057fe5b602002015101600360008760006004811061298757fe5b60200201518152602001908152602001600020600c01819055506001826001600481106129b057fe5b60200201510360036000876000600481106129c757fe5b60200201518152602001908152602001600020600901819055505b5b5b6129ed33613acb565b15612ae6573373ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015612a40573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705334260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f6578656375746f72000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7fc0028b6a3e328c438fb316cb08abd17e0f2132ef9c24f0404864f57e4488812d84600060038110612b1457fe5b602002015186600060048110612b2657fe5b602002015187600160048110612b3857fe5b602002015188600260048110612b4a57fe5b6020020151604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390a15050505050505050565b612bb7612ca8565b612bc057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60026020528060005260406000206000915054906101000a900460ff1681565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612dde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d73672e73656e646572206e6f7420616e206578656375746f7200000000000081525060200191505060405180910390fd5b82600060036000838152602001908152602001600020600001600060038110612e0357fe5b01541415612e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f50756c6c205061796d656e7420646f6573206e6f74206578697374732e00000081525060200191505060405180910390fd5b83600060036000838152602001908152602001600020600e015414612f06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f50756c6c205061796d656e742069732063616e63656c6c65640000000000000081525060200191505060405180910390fd5b84846000801916821415612f65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614605602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061476e603a913960400191505060405180910390fd5b612ff98a8a8a8a8a8a613f59565b61304e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806144a76024913960400191505060405180910390fd5b4260036000898152602001908152602001600020600e018190555061307233613acb565b1561316b573373ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f193505050501580156130c5573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705334260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f6578656375746f72000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7fc85a0b1d6f3141384cf8132808219851926be1209fa52f30c8713b3f3c6da18c8688600360008b81526020019081526020016000206000016001600381106131b057fe5b0154600360008c81526020019081526020016000206000016002600381106131d457fe5b0154604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390a150505050505050505050565b613240612ca8565b61324957600080fd5b613252816140d3565b50565b60008260006003600083815260200190815260200160002060000160006003811061327c57fe5b015414156132f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f50756c6c205061796d656e7420646f6573206e6f74206578697374732e00000081525060200191505060405180910390fd5b838360016002811061330057fe5b602002015180600360008481526020019081526020016000206009015414613373576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260528152602001806145366052913960600191505060405180910390fd5b6000600360008481526020019081526020016000206006015411806133d0575060036000838152602001908152602001600020600a015442101580156133cf575060036000838152602001908152602001600020600c01544210155b5b613425576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260468152602001806146ee6046913960600191505060405180910390fd5b6000600360008481526020019081526020016000206009015411613494576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001806144cb6044913960600191505060405180910390fd5b600060036000848152602001908152602001600020600e015414806134e4575060036000838152602001908152602001600020600c015460036000848152602001908152602001600020600e0154115b613539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604281526020018061468b6042913960600191505060405180910390fd5b8160405160200180828152602001915050604051602081830303815290604052805190602001206003600084815260200190815260200160002060000160006003811061358257fe5b0154604051602001808281526020019150506040516020818303038152906040528051906020012014613600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260418152602001806148076041913960600191505060405180910390fd5b8460006002811061360d57fe5b60200201516000811161366b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148e86029913960400191505060405180910390fd5b68056bc75e2d631000008111156136cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806148806037913960400191505060405180910390fd5b6000866000600281106136dc57fe5b6020020151905060008990506136f061445f565b600360008b815260200190815260200160002060000160038060200260405190810160405280929190826003801561373d576020028201915b815481526020019060010190808311613729575b505050505090506000600360008c8152602001908152602001600020600f0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006137b2600360008560006003811061379557fe5b6020020151815260200190815260200160002060070154866141cb565b905060036000846000600381106137c557fe5b602002015181526020019081526020016000206008015460036000856000600381106137ed57fe5b60200201518152602001908152602001600020600c015401600360008560006003811061381657fe5b60200201518152602001908152602001600020600c01819055506001600360008560006003811061384357fe5b602002015181526020019081526020016000206009015403600360008560006003811061386c57fe5b602002015181526020019081526020016000206009018190555042600360008560006003811061389857fe5b60200201518152602001908152602001600020600d0181905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8584846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561398f57600080fd5b505af11580156139a3573d6000803e3d6000fd5b505050506040513d60208110156139b957600080fd5b81019080805190602001909291905050506139d357600080fd5b7f1a5c297cf93353fa05129304db62d9b76b2ebe8b3a31f577aa3e2cd46c6f82828484600060038110613a0257fe5b602002015185600160038110613a1457fe5b602002015186600260038110613a2657fe5b6020020151858a604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a1600199505050505050505050509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000670214e8348c4f00008273ffffffffffffffffffffffffffffffffffffffff163111159050919050565b60008273ffffffffffffffffffffffffffffffffffffffff166001836101c001518460000151600060038110613b2957fe5b60200201518560200151866101a00151876040015188608001518960a001518a60c001518b60e001518c61010001518d6101200151604051602001808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018b81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140188805190602001908083835b60208310613c0a5780518252602082019150602081019050602083039250613be7565b6001836020036101000a0380198251168184511680821785525050505050509050018781526020018681526020018581526020018481526020018381526020018281526020019b5050505050505050505050506040516020818303038152906040528051906020012088888860405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015613ccd573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600080613d2883600060028110613d0c57fe5b602002015184600160028110613d1e57fe5b60200201516141cb565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd85600060038110613d7557fe5b602002015186600260038110613d8757fe5b6020020151846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015613e2957600080fd5b505af1158015613e3d573d6000803e3d6000fd5b505050506040513d6020811015613e5357600080fd5b8101908080519060200190929190505050613e6d57600080fd5b7f1a5c297cf93353fa05129304db62d9b76b2ebe8b3a31f577aa3e2cd46c6f828284600060038110613e9b57fe5b602002015186600060038110613ead57fe5b602002015187600160038110613ebf57fe5b602002015188600260038110613ed157fe5b60200201518588600160028110613ee457fe5b6020020151604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a160019150509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff1660018584604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012089898960405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561402c573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff161480156140c757508360405160200180828152602001915050604051602081830303815290604052805190602001206003600086815260200190815260200160002060000160006003811061409d57fe5b01546040516020018082815260200191505060405160208183030381529060405280519060200120145b90509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561410d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008260008111614227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148e86029913960400191505060405180910390fd5b68056bc75e2d63100000811115614289576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806148806037913960400191505060405180910390fd5b82600081116142e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148e86029913960400191505060405180910390fd5b68056bc75e2d63100000811115614345576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806148806037913960400191505060405180910390fd5b61437584614367876a52b7d2dcc80cd2e400000061437f90919063ffffffff16565b6143b990919063ffffffff16565b9250505092915050565b60008083141561439257600090506143b3565b60008284029050828482816143a357fe5b04146143ae57600080fd5b809150505b92915050565b60008082116143c757600080fd5b60008284816143d257fe5b0490508091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061442057805160ff191683800117855561444e565b8280016001018555821561444e579182015b8281111561444d578251825591602001919060010190614432565b5b50905061445b9190614481565b5090565b6040518060600160405280600390602082028038833980820191505090505090565b6144a391905b8082111561449f576000816000905550600101614487565b5090565b9056fe496e76616c69642064656c6574696f6e202d2045435245434f5645525f4641494c45442e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d204e756d626572206f66207061796d656e7473206973207a65726f2e5061796d656e7420747269616c20706572696f64206973206c657373207468616e207a65726f2e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d2050756c6c207061796d656e74206e756d626572206f66207061796d656e7420697320696e76616c69645061796d656e7420696e697469616c20616d6f756e7420696e206669617420697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e697469616c20636f6e76657273696f6e207261746520697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642064656c6574696f6e2072657175657374202d205061796d656e7420494420697320656d7074792e496e76616c69642070756c6c207061796d656e7420726567697374726174696f6e202d2045435245434f5645525f4641494c45445061796d656e74206e756d626572206f66207061796d656e7473206973207a65726f2e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d2050756c6c207061796d656e742069732063616e63656c6c6564437573746f6d65722041646472657373206973205a45524f5f414444524553532e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d2054696d65206f6620657865637574696f6e20697320696e76616c69642e5061796d656e7420616d6f756e7420696e206669617420697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642064656c6574696f6e2072657175657374202d20436c69656e742061646472657373206973205a45524f5f414444524553532e54726561737572792041646472657373206973205a45524f5f414444524553532e5061796d656e74206e756d626572206f66207061796d656e747320697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d205061796d656e74204944206e6f74206d61746368696e672e5061796d656e7420747269616c20706572696f6420697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c696420616d6f756e74202d204d757374206265206c6f776572207468616e20746865206f766572666c6f77206c696d69742e496e697469616c207061796d656e7420616d6f756e7420696e2066696174206973206c657373207468616e207a65726f2e496e76616c696420616d6f756e74202d204d75737420626520686967686572207468616e207a65726f5061796d656e74206672657175656e637920697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e5061796d656e742073746172742074696d6520697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642061646472657373202d205a45524f5f414444524553532070726f7669646564a265627a7a7230582078bec68d1480cf9101c04257d6aeaaa02ed94a3a5a1c89ae0c41f943ddacef6564736f6c634300050a0032

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

000000000000000000000000846c66cf71c43f80403b51fe3906b3599d63336f

-----Decoded View---------------
Arg [0] : _token (address): 0x846C66cf71C43f80403B51fE3906B3599D63336f

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000846c66cf71c43f80403b51fe3906b3599d63336f


Deployed Bytecode Sourcemap

5584:32059:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8888:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8888:51:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8888:51:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8888:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14814:587;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14814:587:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14814:587:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;15658:406;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15658:406:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15658:406:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;17819:8307;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17819:8307:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;17819:8307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17819:8307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17819:8307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17819:8307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17819:8307:0;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;17819:8307:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;17819:8307:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;17819:8307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17819:8307:0;;;;;;;;;;;;;;;:::i;:::-;;4254:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4254:140:0;;;:::i;:::-;;3533:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3533:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3876:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3876:92:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8840:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8840:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8840:41:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27227:946;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27227:946:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;27227:946:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4571:117;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4571:117:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4571:117:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;29704:1380;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29704:1380:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;29704:1380:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;29704:1380:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8814:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8814:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8888:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14814:587::-;3753:9;:7;:9::i;:::-;3745:18;;;;;;14909:9;13112:1;13092:22;;:8;:22;;;;13084:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14947:9;11034;:20;11044:9;11034:20;;;;;;;;;;;;;;;;;;;;;;;;;11033:21;11025:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14997:4;14974:9;:20;14984:9;14974:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;15016:26;15032:9;15016:15;:26::i;:::-;15012:168;;;15059:9;:18;;:34;7843:9;15059:34;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15059:34:0;15113:55;15153:9;15164:3;15113:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15012:168;15196:24;15212:7;:5;:7::i;:::-;15196:15;:24::i;:::-;15192:159;;;15237:7;:5;:7::i;:::-;:16;;:32;7843:9;15237:32;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15237:32:0;15289:50;15326:7;:5;:7::i;:::-;15335:3;15289:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15192:159;15366:27;15383:9;15366:27;;;;;;;;;;;;;;;;;;;;;;13169:1;3774;14814:587;:::o;15658:406::-;3753:9;:7;:9::i;:::-;3745:18;;;;;;15756:9;13112:1;13092:22;;:8;:22;;;;13084:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15787:9;10888;:20;10898:9;10888:20;;;;;;;;;;;;;;;;;;;;;;;;;10880:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15837:5;15814:9;:20;15824:9;15814:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;15857:24;15873:7;:5;:7::i;:::-;15857:15;:24::i;:::-;15853:159;;;15898:7;:5;:7::i;:::-;:16;;:32;7843:9;15898:32;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15898:32:0;15950:50;15987:7;:5;:7::i;:::-;15996:3;15950:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15853:159;16027:29;16046:9;16027:29;;;;;;;;;;;;;;;;;;;;;;13169:1;3774;15658:406;:::o;17819:8307::-;10748:9;:21;10758:10;10748:21;;;;;;;;;;;;;;;;;;;;;;;;;10740:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18432:52;:12;:32;18445:15;18461:1;18445:18;;;;;;;;;;;18432:32;;;;;;;;;;;:43;;18476:1;18432:46;;;;;;;;;:52;18424:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18558:13;18536:35;;;:15;18552:1;18536:18;;;;;;;;;;;:35;;18528:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18637:13;18615:35;;;:15;18631:1;18615:18;;;;;;;;;;;:35;;18607:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18717:13;18695:35;;;:15;18711:1;18695:18;;;;;;;;;;;:35;;18687:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18805:13;18783:35;;;:15;18799:1;18783:18;;;;;;;;;;;:35;;18775:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18889:1;18864:27;;:10;18875:1;18864:13;;;;;;;;;;;:27;;;;18856:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18973:1;18948:27;;:10;18959:1;18948:13;;;;;;;;;;;:27;;;;18940:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19053:1;19032:15;19048:1;19032:18;;;;;;;;;;;:22;19024:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19131:1;19110:15;19126:1;19110:18;;;;;;;;;;;:22;19102:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19209:1;19187:15;19203:1;19187:18;;;;;;;;;;;:23;;19179:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19307:1;19283:18;19302:1;19283:21;;;;;;;;;;;:25;19275:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19382:1;19358:18;19377:1;19358:21;;;;;;;;;;;:25;19350:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19466:1;19442:18;19461:1;19442:21;;;;;;;;;;;:25;19434:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19543:1;19518:18;19537:1;19518:21;;;;;;;;;;;:26;;19510:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;19607:15;19623:1;19607:18;;;;;;;;;;;:45;;19599:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;19735:15;19751:1;19735:18;;;;;;;;;;;:45;;19727:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;19862:15;19878:1;19862:18;;;;;;;;;;;:45;;19854:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;19997:18;20016:1;19997:21;;;;;;;;;;;:48;;19989:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;20122:18;20141:1;20122:21;;;;;;;;;;;:48;;20114:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;20256:18;20275:1;20256:21;;;;;;;;;;;:48;;20248:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;20382:18;20401:1;20382:21;;;;;;;;;;;:48;;20374:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20536:1;20516:9;20510:23;:27;20502:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20619:15;20635:1;20619:18;;;;;;;;;;;20570:12;:32;20583:15;20599:1;20583:18;;;;;;;;;;;20570:32;;;;;;;;;;;:43;;20614:1;20570:46;;;;;;;;:67;;;;20695:15;20711:1;20695:18;;;;;;;;;;;20648:12;:32;20661:15;20677:1;20661:18;;;;;;;;;;;20648:32;;;;;;;;;;;:44;;:65;;;;20775:10;20786:1;20775:13;;;;;;;;;;;20724:12;:32;20737:15;20753:1;20737:18;;;;;;;;;;;20724:32;;;;;;;;;;;:48;;;:64;;;;;;;;;;;;;;;;;;20850:10;20861:1;20850:13;;;;;;;;;;;20799:12;:32;20812:15;20828:1;20812:18;;;;;;;;;;;20799:32;;;;;;;;;;;:48;;;:64;;;;;;;;;;;;;;;;;;20931:15;20947:1;20931:18;;;;;;;;;;;20874:12;:32;20887:15;20903:1;20887:18;;;;;;;;;;;20874:32;;;;;;;;;;;:54;;:75;;;;21013:15;21029:1;21013:18;;;;;;;;;;;20960:12;:32;20973:15;20989:1;20973:18;;;;;;;;;;;20960:32;;;;;;;;;;;:50;;:71;;;;21105:15;21121:1;21105:18;;;;;;;;;;;21042:12;:32;21055:15;21071:1;21055:18;;;;;;;;;;;21042:32;;;;;;;;;;;:60;;:81;;;;21179:18;21198:1;21179:21;;;;;;;;;;;21134:12;:32;21147:15;21163:1;21147:18;;;;;;;;;;;21134:32;;;;;;;;;;;:42;;:66;;;;21263:18;21282:1;21263:21;;;;;;;;;;;21211:12;:32;21224:15;21240:1;21224:18;;;;;;;;;;;21211:32;;;;;;;;;;;:49;;:73;;;;21345:18;21364:1;21345:21;;;;;;;;;;;21295:12;:32;21308:15;21324:1;21308:18;;;;;;;;;;;21295:32;;;;;;;;;;;:47;;:71;;;;21424:18;21443:1;21424:21;;;;;;;;;;;21377:12;:32;21390:15;21406:1;21390:18;;;;;;;;;;;21377:32;;;;;;;;;;;:44;;:68;;;;21500:9;21456:12;:32;21469:15;21485:1;21469:18;;;;;;;;;;;21456:32;;;;;;;;;;;:41;;:53;;;;;;;;;;;;:::i;:::-;;21528:163;21566:1;21586;21606;21626:10;21637:1;21626:13;;;;;;;;;;;21658:12;:32;21671:15;21687:1;21671:18;;;;;;;;;;;21658:32;;;;;;;;;;;21528:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:163::i;:::-;21520:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21831:15;21847:1;21831:18;;;;;;;;;;;21782:12;:32;21795:15;21811:1;21795:18;;;;;;;;;;;21782:32;;;;;;;;;;;:43;;21826:1;21782:46;;;;;;;;:67;;;;21909:15;21925:1;21909:18;;;;;;;;;;;21860:12;:32;21873:15;21889:1;21873:18;;;;;;;;;;;21860:32;;;;;;;;;;;:43;;21904:1;21860:46;;;;;;;;:67;;;;21989:1;21938:12;:32;21951:15;21967:1;21951:18;;;;;;;;;;;21938:32;;;;;;;;;;;:48;;:52;;;;22257:33;22235:15;22251:1;22235:18;;;;;;;;;;;:55;22231:3596;;;22387:18;22406:1;22387:21;;;;;;;;;;;22363:18;22382:1;22363:21;;;;;;;;;;;:45;22307:12;:32;22320:15;22336:1;22320:18;;;;;;;;;;;22307:32;;;;;;;;;;;:53;;:101;;;;22479:1;22423:12;:32;22436:15;22452:1;22436:18;;;;;;;;;;;22423:32;;;;;;;;;;;:53;;:57;;;;22231:3596;;;22889:40;22867:15;22883:1;22867:18;;;;;;;;;;;:62;22863:2964;;;22954:435;;;;;;;;;23010:15;23026:1;23010:18;;;;;;;;;;;22954:435;;;;23030:15;23046:1;23030:18;;;;;;;;;;;22954:435;;;;23050:15;23066:1;23050:18;;;;;;;;;;;22954:435;;;;;;;;;;;23143:10;23154:1;23143:13;;;;;;;;;;;22954:435;;;;;;;;23158:10;23169:1;23158:13;;;;;;;;;;;22954:435;;;;;;;;23173:10;23184:1;23173:13;;;;;;;;;;;22954:435;;;;;;;;;;;;;;;23273:15;23289:1;23273:18;;;;;;;;;;;22954:435;;;;23293:15;23309:1;23293:18;;;;;;;;;;;22954:435;;;:32;:435::i;:::-;22946:444;;;;;;23461:3;23405:12;:32;23418:15;23434:1;23418:18;;;;;;;;;;;23405:32;;;;;;;;;;;:53;;:59;;;;23559:18;23578:1;23559:21;;;;;;;;;;;23535:18;23554:1;23535:21;;;;;;;;;;;:45;23479:12;:32;23492:15;23508:1;23492:18;;;;;;;;;;;23479:32;;;;;;;;;;;:53;;:101;;;;22863:2964;;;23980:33;23958:15;23974:1;23958:18;;;;;;;;;;;:55;23954:1873;;;24038:433;;;;;;;;;24094:15;24110:1;24094:18;;;;;;;;;;;24038:433;;;;24114:15;24130:1;24114:18;;;;;;;;;;;24038:433;;;;24134:15;24150:1;24134:18;;;;;;;;;;;24038:433;;;;;;;;;;;24224:10;24235:1;24224:13;;;;;;;;;;;24038:433;;;;;;;;24239:10;24250:1;24239:13;;;;;;;;;;;24038:433;;;;;;;;24254:10;24265:1;24254:13;;;;;;;;;;;24038:433;;;;;;;;;;;;;;;24354:15;24370:1;24354:18;;;;;;;;;;;24038:433;;;;24374:15;24390:1;24374:18;;;;;;;;;;;24038:433;;;:32;:433::i;:::-;24030:442;;;;;;24543:3;24487:12;:32;24500:15;24516:1;24500:18;;;;;;;;;;;24487:32;;;;;;;;;;;:53;;:59;;;;24641:18;24660:1;24641:21;;;;;;;;;;;24617:18;24636:1;24617:21;;;;;;;;;;;:45;24561:12;:32;24574:15;24590:1;24574:18;;;;;;;;;;;24561:32;;;;;;;;;;;:53;;:101;;;;23954:1873;;;25113:419;;;;;;;;;25169:15;25185:1;25169:18;;;;;;;;;;;25113:419;;;;25189:15;25205:1;25189:18;;;;;;;;;;;25113:419;;;;25209:15;25225:1;25209:18;;;;;;;;;;;25113:419;;;;;;;;;;;25299:10;25310:1;25299:13;;;;;;;;;;;25113:419;;;;;;;;25314:10;25325:1;25314:13;;;;;;;;;;;25113:419;;;;;;;;25329:10;25340:1;25329:13;;;;;;;;;;;25113:419;;;;;;;;;;;;;;;25429:15;25445:1;25429:18;;;;;;;;;;;25113:419;;;;25449:15;25465:1;25449:18;;;;;;;;;;;25113:419;;;:32;:419::i;:::-;25105:428;;;;;;25604:3;25548:12;:32;25561:15;25577:1;25561:18;;;;;;;;;;;25548:32;;;;;;;;;;;:53;;:59;;;;25702:18;25721:1;25702:21;;;;;;;;;;;25678:18;25697:1;25678:21;;;;;;;;;;;:45;25622:12;:32;25635:15;25651:1;25635:18;;;;;;;;;;;25622:32;;;;;;;;;;;:53;;:101;;;;25814:1;25790:18;25809:1;25790:21;;;;;;;;;;;:25;25738:12;:32;25751:15;25767:1;25751:18;;;;;;;;;;;25738:32;;;;;;;;;;;:49;;:77;;;;23954:1873;22863:2964;22231:3596;25841:27;25857:10;25841:15;:27::i;:::-;25837:171;;;25885:10;:19;;:35;7843:9;25885:35;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25885:35:0;25940:56;25980:10;25992:3;25940:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25837:171;26023:95;26044:10;26055:1;26044:13;;;;;;;;;;;26059:15;26075:1;26059:18;;;;;;;;;;;26079:15;26095:1;26079:18;;;;;;;;;;;26099:15;26115:1;26099:18;;;;;;;;;;;26023:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17819:8307;;;;;;;;:::o;4254:140::-;3753:9;:7;:9::i;:::-;3745:18;;;;;;4353:1;4316:40;;4337:6;;;;;;;;;;;4316:40;;;;;;;;;;;;4384:1;4367:6;;:19;;;;;;;;;;;;;;;;;;4254:140::o;3533:87::-;3571:15;3606:6;;;;;;;;;;;3599:13;;3533:87;:::o;3876:92::-;3916:4;3954:6;;;;;;;;;;;3940:20;;:10;:20;;;3933:27;;3876:92;:::o;8840:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;27227:946::-;10748:9;:21;10758:10;10748:21;;;;;;;;;;;;;;;;;;;;;;;;;10740:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27471:10;11171:44;:12;:24;11184:10;11171:24;;;;;;;;;;;:35;;11207:1;11171:38;;;;;;;;;:44;;11163:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27508:10;11387:1;11343:12;:24;11356:10;11343:24;;;;;;;;;;;:40;;;:45;11335:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27548:10;27560:16;12828:13;12814:27;;;:10;:27;;12806:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12940:1;12912:30;;:16;:30;;;;12904:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27602:76;27618:1;27621;27624;27627:10;27639:16;27657:20;27602:15;:76::i;:::-;27594:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27773:3;27730:12;:24;27743:10;27730:24;;;;;;;;;;;:40;;:46;;;;27791:27;27807:10;27791:15;:27::i;:::-;27787:171;;;27835:10;:19;;:35;7843:9;27835:35;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27835:35:0;27890:56;27930:10;27942:3;27890:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27787:171;27973:192;28007:16;28038:10;28063:12;:24;28076:10;28063:24;;;;;;;;;;;:35;;28099:1;28063:38;;;;;;;;;28116:12;:24;28129:10;28116:24;;;;;;;;;;;:35;;28152:1;28116:38;;;;;;;;;27973:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11429:1;;11260;10811;27227:946;;;;;;:::o;4571:117::-;3753:9;:7;:9::i;:::-;3745:18;;;;;;4652:28;4671:8;4652:18;:28::i;:::-;4571:117;:::o;29704:1380::-;29979:4;29844:10;11171:44;:12;:24;11184:10;11171:24;;;;;;;;;;;:35;;11207:1;11171:38;;;;;;;;;:44;;11163:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29896:10;29908:15;29924:1;29908:18;;;;;;;;;;;11615:14;11570:12;:24;11583:10;11570:24;;;;;;;;;;;:41;;;:59;11562:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11804:1;11749:12;:24;11762:10;11749:24;;;;;;;;;;;:52;;;:56;:182;;;;11826:12;:24;11839:10;11826:24;;;;;;;;;;;:39;;;11819:3;:46;;:111;;;;;11885:12;:24;11898:10;11885:24;;;;;;;;;;;:45;;;11878:3;:52;;11819:111;11749:182;11740:291;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12094:1;12050:12;:24;12063:10;12050:24;;;;;;;;;;;:41;;;:45;12042:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12259:1;12215:12;:24;12228:10;12215:24;;;;;;;;;;;:40;;;:45;:155;;;;12325:12;:24;12338:10;12325:24;;;;;;;;;;;:45;;;12273:12;:24;12286:10;12273:24;;;;;;;;;;;:40;;;:97;12215:155;12192:263;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12596:10;12579:28;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12579:28:0;;;12569:39;;;;;;12515:12;:24;12528:10;12515:24;;;;;;;;;;;:35;;12551:1;12515:38;;;;;;;;;12498:56;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12498:56:0;;;12474:91;;;;;;:134;12466:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29945:15;29961:1;29945:18;;;;;;;;;;;13251:1;13241:7;:11;13233:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;13317:7;:34;;13309:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30001:22;30026:15;30042:1;30026:18;;;;;;;;;;;30001:43;;30055:23;30081:16;30055:42;;30108:28;;:::i;:::-;30139:12;:24;30152:10;30139:24;;;;;;;;;;;:35;;30108:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30185:16;30204:12;:24;30217:10;30204:24;;;;;;;;;;;:40;;;;;;;;;;;;30185:59;;30255:19;30277:83;30298:12;:27;30311:10;30322:1;30311:13;;;;;;;;;;;30298:27;;;;;;;;;;;:45;;;30345:14;30277:20;:83::i;:::-;30255:105;;30484:12;:27;30497:10;30508:1;30497:13;;;;;;;;;;;30484:27;;;;;;;;;;;:37;;;30433:12;:27;30446:10;30457:1;30446:13;;;;;;;;;;;30433:27;;;;;;;;;;;:48;;;:88;30373:12;:27;30386:10;30397:1;30386:13;;;;;;;;;;;30373:27;;;;;;;;;;;:48;;:148;;;;30626:1;30579:12;:27;30592:10;30603:1;30592:13;;;;;;;;;;;30579:27;;;;;;;;;;;:44;;;:48;30532:12;:27;30545:10;30556:1;30545:13;;;;;;;;;;;30532:27;;;;;;;;;;;:44;;:95;;;;30689:3;30638:12;:27;30651:10;30662:1;30651:13;;;;;;;;;;;30638:27;;;;;;;;;;;:48;;:54;;;;30711:5;;;;;;;;;;;:18;;;30748:15;30782:8;30809:11;30711:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30711:124:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30711:124:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30711:124:0;;;;;;;;;;;;;;;;30703:133;;;;;;30852:202;30889:15;30919:10;30930:1;30919:13;;;;;;;;;;;30947:10;30958:1;30947:13;;;;;;;;;;;30975:10;30986:1;30975:13;;;;;;;;;;;31003:11;31029:14;30852:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31072:4;31065:11;;;;;;;12702:1;11260;;29704:1380;;;;;;:::o;8814:19::-;;;;;;;;;;;;;:::o;37464:176::-;37544:4;7989:10;37576:8;37568:25;;;:64;;37561:71;;37464:176;;;:::o;34903:943::-;35112:4;35822:16;35141:697;;:677;35232:12;:28;;;35283:12;:23;;;35307:1;35283:26;;;;;;;;;;;35332:12;:24;;;35379:12;:28;;;35430:12;:21;;;35474:12;:40;;;35537:12;:30;;;35590:12;:22;;;35635:12;:29;;;35687:12;:27;;;35737:12;:24;;;35193:587;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;35193:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;35193:587:0;;;35165:630;;;;;;35810:1;35813;35816;35141:677;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35141:677:0;;;;;;;;:697;;;35134:704;;34903:943;;;;;;;:::o;31627:805::-;31987:4;32004:19;32026:60;32047:15;32063:1;32047:18;;;;;;;;;;;32067:15;32083:1;32067:18;;;;;;;;;;;32026:20;:60::i;:::-;32004:82;;32105:5;;;;;;;;;;;:18;;;32124:10;32135:1;32124:13;;;;;;;;;;;32139:10;32150:1;32139:13;;;;;;;;;;;32154:11;32105:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32105:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32105:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32105:61:0;;;;;;;;;;;;;;;;32097:70;;;;;;32183:219;32220:10;32231:1;32220:13;;;;;;;;;;;32248:15;32264:1;32248:18;;;;;;;;;;;32281:15;32297:1;32281:18;;;;;;;;;;;32314:15;32330:1;32314:18;;;;;;;;;;;32347:11;32373:15;32389:1;32373:18;;;;;;;;;;;32183:219;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32420:4;32413:11;;;31627:805;;;;;:::o;36518:633::-;36749:4;36970:16;36778:208;;:188;36869:10;36902:20;36830:111;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;36830:111:0;;;36802:154;;;;;;36958:1;36961;36964;36778:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36778:188:0;;;;;;;;:208;;;:365;;;;;37121:10;37104:28;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;37104:28:0;;;37094:49;;;;;;37040:12;:24;37053:10;37040:24;;;;;;;;;;;:35;;37076:1;37040:38;;;;;;;;;37023:56;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;37023:56:0;;;36999:91;;;;;;:144;36778:365;36771:372;;36518:633;;;;;;;;:::o;4838:195::-;4940:1;4920:22;;:8;:22;;;;4912:31;;;;;;4988:8;4959:38;;4980:6;;;;;;;;;;;4959:38;;;;;;;;;;;;5017:8;5008:6;;:17;;;;;;;;;;;;;;;;;;4838:195;:::o;34012:295::-;34204:7;34136:18;13251:1;13241:7;:11;13233:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;13317:7;:34;;13309:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34173:15;13251:1;13241:7;:11;13233:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;13317:7;:34;;13309:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34231:68;34283:15;34231:47;34259:18;7073:8;34231:27;;:47;;;;:::i;:::-;:51;;:68;;;;:::i;:::-;34224:75;;13422:1;34012:295;;;;;:::o;997:433::-;1055:7;1304:1;1299;:6;1295:47;;;1329:1;1322:8;;;;1295:47;1354:9;1370:1;1366;:5;1354:17;;1399:1;1394;1390;:5;;;;;;:10;1382:19;;;;;;1421:1;1414:8;;;997:433;;;;;:::o;1565:303::-;1623:7;1722:1;1718;:5;1710:14;;;;;;1735:9;1751:1;1747;:5;;;;;;1735:17;;1859:1;1852:8;;;1565:303;;;;:::o;5584:32059::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;5584:32059:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://78bec68d1480cf9101c04257d6aeaaa02ed94a3a5a1c89ae0c41f943ddacef65

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.