Contract 0x213a1b1d08f2715ae054ade98deed8a8f1cc937e 2

Contract Overview

Balance:
0 MATIC
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xd330593bbe1d9974d9a0fa8e1f95fafe9418fe8ee27a77421619f9a9b4b689b60x60806040203819492021-10-19 14:45:1993 days 17 hrs ago0x718ea873be9c83ff05525f7bb060606fa53c7bf8 IN  Create: HermesImplementation0 MATIC0.3608745100
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
HermesImplementation

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-12-05
*/

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

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

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

// File: contracts/interfaces/IUniswapV2Router.sol


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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: contracts/interfaces/IERC20Token.sol


abstract contract IERC20Token is IERC20 {
    function upgrade(uint256 value) public virtual;
}

// File: contracts/Ownable.sol


contract Ownable {
    address private _owner;

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

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == msg.sender || _owner == address(0x0), "Ownable: caller is not the owner");
        _;
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: contracts/FundsRecovery.sol



contract FundsRecovery is Ownable, ReentrancyGuard {
    address payable internal fundsDestination;
    IERC20Token public token;

    event DestinationChanged(address indexed previousDestination, address indexed newDestination);

    /**
     * Setting new destination of funds recovery.
     */
    function setFundsDestination(address payable _newDestination) public virtual onlyOwner {
        require(_newDestination != address(0));
        emit DestinationChanged(fundsDestination, _newDestination);
        fundsDestination = _newDestination;
    }

    /**
     * Getting funds destination address.
     */
    function getFundsDestination() public view returns (address) {
        return fundsDestination;
    }

    /**
     * Possibility to recover funds in case they were sent to this address before smart contract deployment
     */
    function claimEthers() public nonReentrant {
        require(fundsDestination != address(0));
        fundsDestination.transfer(address(this).balance);
    }

    /**
       Transfers selected tokens into owner address.
    */
    function claimTokens(address _token) public nonReentrant {
        require(fundsDestination != address(0));
        require(_token != address(token), "native token funds can't be recovered");
        uint256 _amount = IERC20Token(_token).balanceOf(address(this));
        IERC20Token(_token).transfer(fundsDestination, _amount);
    }
}

// File: contracts/Utils.sol

contract Utils {
    function getChainID() internal view returns (uint256) {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }
        return chainID;
    }

    function max(uint a, uint b) internal pure returns (uint) {
        return a > b ? a : b;
    }

    function min(uint a, uint b) internal pure returns (uint) {
        return a < b ? a : b;
    }

    function round(uint a, uint m) internal pure returns (uint ) {
        return ((a + m - 1) / m) * m;
    }
}

// File: contracts/HermesImplementation.sol

interface IdentityRegistry {
    function isRegistered(address _identity) external view returns (bool);
    function minimalHermesStake() external view returns (uint256);
    function getChannelAddress(address _identity, address _hermesId) external view returns (address);
    function getBeneficiary(address _identity) external view returns (address);
    function setBeneficiary(address _identity, address _newBeneficiary, bytes memory _signature) external;
}

// Hermes (channel balance provided by Herms, no staking/loans)
contract HermesImplementation is FundsRecovery, Utils {
    using ECDSA for bytes32;

    string constant STAKE_RETURN_PREFIX = "Stake return request";
    uint256 constant DELAY_SECONDS = 259200;   // 3 days
    uint256 constant UNIT_SECONDS = 3600;      // 1 unit = 1 hour = 3600 seconds
    uint16 constant PUNISHMENT_PERCENT = 4;    // 0.04%

    IdentityRegistry internal registry;
    address internal operator;                 // TODO have master operator who could change operator or manage funds

    uint256 internal totalStake;               // total amount staked by providers

    uint256 internal minStake;                 // minimal possible provider's stake (channel opening during promise settlement will use it)
    uint256 internal maxStake;                 // maximal allowed provider's stake
    uint256 internal hermesStake;              // hermes stake is used to prove hermes' sustainability
    uint256 internal closingTimelock;          // blocknumber after which getting stake back will become possible
    IUniswapV2Router internal dex;             // any uniswap v2 compatible dex router address

    enum Status { Active, Paused, Punishment, Closed } // hermes states
    Status internal status;

    struct HermesFee {
        uint16 value;                      // subprocent amount. e.g. 2.5% = 250
        uint64 validFrom;                  // timestamp from which fee is valid
    }
    HermesFee public lastFee;              // default fee to look for
    HermesFee public previousFee;          // previous fee is used if last fee is still not active

    // Our channel don't have balance, because we're always rebalancing into stake amount.
    struct Channel {
        uint256 settled;                   // total amount already settled by provider
        uint256 stake;                     // amount staked by identity to guarante channel size, it also serves as channel balance
        uint256 lastUsedNonce;             // last known nonce, is used to protect signature based calls from replay attack
        uint256 timelock;                  // blocknumber after which channel balance can be decreased
    }
    mapping(bytes32 => Channel) public channels;

    struct Punishment {
        uint256 activationBlockTime;       // block timestamp in which punishment was activated
        uint256 amount;                    // total amount of tokens locked because of punishment
    }
    Punishment public punishment;

    function getOperator() public view returns (address) {
        return operator;
    }

    function getChannelId(address _identity) public view returns (bytes32) {
        return keccak256(abi.encodePacked(_identity, address(this)));
    }

    function getChannelId(address _identity, string memory _type) public view returns (bytes32) {
        return keccak256(abi.encodePacked(_identity, address(this), _type));
    }

    function getRegistry() public view returns (address) {
        return address(registry);
    }

    function getActiveFee() public view returns (uint256) {
        HermesFee memory _activeFee = (block.timestamp >= lastFee.validFrom) ? lastFee : previousFee;
        return uint256(_activeFee.value);
    }

    function getHermesStake() public view returns (uint256) {
        return hermesStake;
    }

    function getStakeThresholds() public view returns (uint256, uint256) {
        return (minStake, maxStake);
    }

    // Returns hermes state
    // Active - all operations are allowed.
    // Paused - no new channel openings.
    // Punishment - don't allow to open new channels, rebalance and withdraw funds.
    // Closed - no new channels, no rebalance, no stake increase.
    function getStatus() public view returns (Status) {
        return status;
    }

    event PromiseSettled(address indexed identity, bytes32 indexed channelId, address indexed beneficiary, uint256 amountSentToBeneficiary, uint256 fees, bytes32 lock);
    event NewStake(bytes32 indexed channelId, uint256 stakeAmount);
    event MinStakeValueUpdated(uint256 newMinStake);
    event MaxStakeValueUpdated(uint256 newMaxStake);
    event HermesFeeUpdated(uint16 newFee, uint64 validFrom);
    event HermesClosed(uint256 blockTimestamp);
    event ChannelOpeningPaused();
    event ChannelOpeningActivated();
    event FundsWithdrawned(uint256 amount, address beneficiary);
    event HermesStakeIncreased(uint256 newStake);
    event HermesPunishmentActivated(uint256 activationBlockTime);
    event HermesPunishmentDeactivated();

    modifier onlyOperator() {
        require(msg.sender == operator, "Hermes: only hermes operator can call this function");
        _;
    }

    /*
      ------------------------------------------- SETUP -------------------------------------------
    */

    // Because of proxy pattern this function is used insted of constructor.
    // Have to be called right after proxy deployment.
    function initialize(address _token, address _operator, uint16 _fee, uint256 _minStake, uint256 _maxStake, address payable _dexAddress) public virtual {
        require(!isInitialized(), "Hermes: have to be not initialized");
        require(_token != address(0), "Hermes: token can't be deployd into zero address");
        require(_operator != address(0), "Hermes: operator have to be set");
        require(_fee <= 5000, "Hermes: fee can't be bigger than 50%");
        require(_maxStake > _minStake, "Hermes: maxStake have to be bigger than minStake");

        registry = IdentityRegistry(msg.sender);
        token = IERC20Token(_token);
        operator = _operator;
        lastFee = HermesFee(_fee, uint64(block.timestamp));
        minStake = _minStake;
        maxStake = _maxStake;
        hermesStake = token.balanceOf(address(this));

        // Approving all myst for dex, because MYST token's `transferFrom` is cheaper when there is approval of uint(-1)
        token.approve(_dexAddress, type(uint256).max);
        dex = IUniswapV2Router(_dexAddress);
    }

    function isInitialized() public view returns (bool) {
        return operator != address(0);
    }

    /*
      -------------------------------------- MAIN FUNCTIONALITY -----------------------------------
    */

    // Open incoming payments (also known as provider) channel. Can be called only by Registry.
    function openChannel(address _identity, uint256 _amountToStake) public {
        require(msg.sender == address(registry), "Hermes: only registry can open channels");
        require(getStatus() == Status.Active, "Hermes: have to be in active state");
        require(_amountToStake >= minStake, "Hermes: min stake amount not reached");
        _increaseStake(getChannelId(_identity), _amountToStake, false);
    }

    // Settle promise
    // _preimage is random number generated by receiver used in HTLC
    function _settlePromise(
        bytes32 _channelId,
        uint256 _amount,
        uint256 _transactorFee,
        bytes32 _preimage,
        bytes memory _signature,
        bool _takeFee,
        bool _ignoreStake
    ) private returns (uint256, uint256) {
        require(
            isHermesActive(),
            "Hermes: hermes have to be in active state"
        ); // if hermes is not active, then users can only take stake back
        require(
            validatePromise(_channelId, _amount, _transactorFee, _preimage, _signature),
            "Hermes: have to be properly signed payment promise"
        );

        Channel storage _channel = channels[_channelId];
        require(_channel.settled > 0 || _channel.stake >= minStake || _ignoreStake, "Hermes: not enough stake");

        // If there are not enought funds to rebalance we have to enable punishment mode.
        uint256 _availableBalance = availableBalance();
        if (_availableBalance < _channel.stake) {
            status = Status.Punishment;
            punishment.activationBlockTime = block.timestamp;
            emit HermesPunishmentActivated(block.timestamp);
        }

        // Calculate amount of tokens to be claimed.
        uint256 _unpaidAmount = _amount - _channel.settled;
        require(_unpaidAmount > _transactorFee, "Hermes: amount to settle should cover transactor fee");

        // It is not allowed to settle more than maxStake / _channel.stake and than available balance.
        uint256 _maxSettlementAmount = max(maxStake, _channel.stake);
        if (_unpaidAmount > _availableBalance || _unpaidAmount > _maxSettlementAmount) {
               _unpaidAmount = min(_availableBalance, _maxSettlementAmount);
        }

        _channel.settled = _channel.settled + _unpaidAmount; // Increase already paid amount.
        uint256 _fees = _transactorFee + (_takeFee ? calculateHermesFee(_unpaidAmount) : 0);

        // Pay transactor fee
        if (_transactorFee > 0) {
            token.transfer(msg.sender, _transactorFee);
        }

        uint256 _amountToTransfer = _unpaidAmount -_fees;

        return (_amountToTransfer, _fees);
    }

    function settlePromise(address _identity, uint256 _amount, uint256 _transactorFee, bytes32 _preimage, bytes memory _signature) public {
        address _beneficiary = registry.getBeneficiary(_identity);
        require(_beneficiary != address(0), "Hermes: identity have to be registered, beneficiary have to be set");

        // Settle promise and transfer calculated amount into beneficiary wallet
        bytes32 _channelId = getChannelId(_identity);
        (uint256 _amountToTransfer, uint256 _fees) = _settlePromise(_channelId, _amount, _transactorFee, _preimage, _signature, true, false);
        token.transfer(_beneficiary, _amountToTransfer);

        emit PromiseSettled(_identity, _channelId, _beneficiary, _amountToTransfer, _fees, _preimage);
    }

    function payAndSettle(address _identity, uint256 _amount, uint256 _transactorFee, bytes32 _preimage, bytes memory _signature, address _beneficiary, bytes memory _beneficiarySignature) public {
        bytes32 _channelId = getChannelId(_identity, "withdrawal");

        // Validate beneficiary to be signed by identity and be attached to given promise
        address _signer = keccak256(abi.encodePacked(getChainID(), _channelId, _amount, _preimage, _beneficiary)).recover(_beneficiarySignature);
        require(_signer == _identity, "Hermes: payAndSettle request should be properly signed");

        (uint256 _amountToTransfer, uint256 _fees) = _settlePromise(_channelId, _amount, _transactorFee, _preimage, _signature, false, true);
        token.transfer(_beneficiary, _amountToTransfer);

        emit PromiseSettled(_identity, _channelId, _beneficiary, _amountToTransfer, _fees, _preimage);
    }

    function settleWithBeneficiary(address _identity, uint256 _amount, uint256 _transactorFee, bytes32 _preimage, bytes memory _promiseSignature, address _newBeneficiary, bytes memory _beneficiarySignature) public {
        // Update beneficiary address
        registry.setBeneficiary(_identity, _newBeneficiary, _beneficiarySignature);

        // Settle promise and transfer calculated amount into beneficiary wallet
        bytes32 _channelId = getChannelId(_identity);
        (uint256 _amountToTransfer, uint256 _fees) = _settlePromise(_channelId, _amount, _transactorFee, _preimage, _promiseSignature, true, false);
        token.transfer(_newBeneficiary, _amountToTransfer);

        emit PromiseSettled(_identity, _channelId, _newBeneficiary, _amountToTransfer, _fees, _preimage);
    }

    function settleWithDEX(address _identity, uint256 _amount, uint256 _transactorFee, bytes32 _preimage, bytes memory _signature) public {
        address _beneficiary = registry.getBeneficiary(_identity);
        require(_beneficiary != address(0), "Hermes: identity have to be registered, beneficiary have to be set");

        // Calculate amount to transfer and settle promise
        bytes32 _channelId = getChannelId(_identity);
        (uint256 _amountToTransfer, uint256 _fees) = _settlePromise(_channelId, _amount, _transactorFee, _preimage, _signature, true, false);

        // Transfer funds into beneficiary wallet via DEX
        uint amountOutMin = 0;
        address[] memory path = new address[](2);
        path[0] = address(token);
        path[1] = dex.WETH();

        dex.swapExactTokensForETH(_amountToTransfer, amountOutMin, path, _beneficiary, block.timestamp);

        emit PromiseSettled(_identity, _channelId, _beneficiary, _amountToTransfer, _fees, _preimage);
    }

    /*
      -------------------------------------- STAKE MANAGEMENT --------------------------------------
    */

    function _increaseStake(bytes32 _channelId, uint256 _amountToAdd, bool _duringSettlement) internal {
        Channel storage _channel = channels[_channelId];
        uint256 _newStakeAmount = _channel.stake +_amountToAdd;
        require(_newStakeAmount <= maxStake, "Hermes: total amount to stake can't be bigger than maximally allowed");
        require(_newStakeAmount >= minStake, "Hermes: stake can't be less than required min stake");

        // We don't transfer tokens during settlements, they already locked in hermes contract.
        if (!_duringSettlement) {
            require(token.transferFrom(msg.sender, address(this), _amountToAdd), "Hermes: token transfer should succeed");
        }

        _channel.stake = _newStakeAmount;
        totalStake = totalStake + _amountToAdd;

        emit NewStake(_channelId, _newStakeAmount);
    }

    // Anyone can increase channel's capacity by staking more into hermes
    function increaseStake(bytes32 _channelId, uint256 _amount) public {
        require(getStatus() != Status.Closed, "hermes should be not closed");
        _increaseStake(_channelId, _amount, false);
    }

    // Settlement which will increase channel stake instead of transfering funds into beneficiary wallet.
    function settleIntoStake(address _identity, uint256 _amount, uint256 _transactorFee, bytes32 _preimage, bytes memory _signature) public {
        bytes32 _channelId = getChannelId(_identity);
        (uint256 _stakeIncreaseAmount, uint256 _paidFees) = _settlePromise(_channelId, _amount, _transactorFee, _preimage, _signature, true, true);
        emit PromiseSettled(_identity, _channelId, address(this), _stakeIncreaseAmount, _paidFees, _preimage);
        _increaseStake(_channelId, _stakeIncreaseAmount, true);
    }

    // Withdraw part of stake. This will also decrease channel balance.
    function decreaseStake(address _identity, uint256 _amount, uint256 _transactorFee, bytes memory _signature) public {
        bytes32 _channelId = getChannelId(_identity);
        require(isChannelOpened(_channelId), "Hermes: channel has to be opened");
        require(_amount >= _transactorFee, "Hermes: amount should be bigger than transactor fee");

        Channel storage _channel = channels[_channelId];
        require(_amount <= _channel.stake, "Hermes: can't withdraw more than the current stake");

        // Verify signature
        _channel.lastUsedNonce = _channel.lastUsedNonce + 1;
        address _signer = keccak256(abi.encodePacked(STAKE_RETURN_PREFIX, getChainID(), _channelId, _amount, _transactorFee, _channel.lastUsedNonce)).recover(_signature);
        require(getChannelId(_signer) == _channelId, "Hermes: have to be signed by channel party");

        uint256 _newStakeAmount = _channel.stake - _amount;
        require(_newStakeAmount == 0 || _newStakeAmount >= minStake, "Hermes: stake can't be less than required min stake");

        // Update channel state
        _channel.stake = _newStakeAmount;
        totalStake = totalStake - _amount;

        // Pay transacor fee then withdraw the rest
        if (_transactorFee > 0) {
            token.transfer(msg.sender, _transactorFee);
        }

        address _beneficiary = registry.getBeneficiary(_identity);
        token.transfer(_beneficiary, _amount - _transactorFee);

        emit NewStake(_channelId, _newStakeAmount);
    }

    /*
      ---------------------------------------------------------------------------------------------
    */

    // Hermes is in Emergency situation when its status is `Punishment`.
    function resolveEmergency() public {
        require(getStatus() == Status.Punishment, "Hermes: should be in punishment status");

        // 0.04% of total channels amount per time unit
        uint256 _punishmentPerUnit = round(totalStake * PUNISHMENT_PERCENT, 100) / 100;

        // No punishment during first time unit
        uint256 _unit = getUnitTime();
        uint256 _timePassed = block.timestamp - punishment.activationBlockTime;
        uint256 _punishmentUnits = round(_timePassed, _unit) / _unit - 1;

        uint256 _punishmentAmount = _punishmentUnits * _punishmentPerUnit;
        punishment.amount = punishment.amount + _punishmentAmount;  // XXX alternativelly we could send tokens into BlackHole (0x0000000...)

        uint256 _shouldHave = minimalExpectedBalance() + maxStake;  // hermes should have funds for at least one maxStake settlement
        uint256 _currentBalance = token.balanceOf(address(this));

        // If there are not enough available funds, they have to be topuped from msg.sender.
        if (_currentBalance < _shouldHave) {
            token.transferFrom(msg.sender, address(this), _shouldHave - _currentBalance);
        }

        // Disable punishment mode
        status = Status.Active;

        emit HermesPunishmentDeactivated();
    }

    function getUnitTime() internal pure virtual returns (uint256) {
        return UNIT_SECONDS;
    }

    function setMinStake(uint256 _newMinStake) public onlyOwner {
        require(isHermesActive(), "Hermes: has to be active");
        require(_newMinStake < maxStake, "Hermes: minStake has to be smaller than maxStake");
        minStake = _newMinStake;
        emit MinStakeValueUpdated(_newMinStake);
    }

    function setMaxStake(uint256 _newMaxStake) public onlyOwner {
        require(isHermesActive(), "Hermes: has to be active");
        require(_newMaxStake > minStake, "Hermes: maxStake has to be bigger than minStake");
        maxStake = _newMaxStake;
        emit MaxStakeValueUpdated(_newMaxStake);
    }

    function setHermesFee(uint16 _newFee) public onlyOwner {
        require(getStatus() != Status.Closed, "Hermes: should be not closed");
        require(_newFee <= 5000, "Hermes: fee can't be bigger than 50%");
        require(block.timestamp >= lastFee.validFrom, "Hermes: can't update inactive fee");

        // New fee will start be valid after delay time will pass
        uint64 _validFrom = uint64(getTimelock());

        previousFee = lastFee;
        lastFee = HermesFee(_newFee, _validFrom);

        emit HermesFeeUpdated(_newFee, _validFrom);
    }

    function increaseHermesStake(uint256 _additionalStake) public onlyOwner {
        if (availableBalance() < _additionalStake) {
            uint256 _diff = _additionalStake - availableBalance();
            token.transferFrom(msg.sender, address(this), _diff);
        }

        hermesStake = hermesStake + _additionalStake;

        emit HermesStakeIncreased(hermesStake);
    }

    // Hermes's available funds withdrawal. Can be done only if hermes is not closed and not in punishment mode.
    // Hermes can't withdraw stake, locked in channel funds and funds lended to him.
    function withdraw(address _beneficiary, uint256 _amount) public onlyOwner {
        require(isHermesActive(), "Hermes: have to be active");
        require(availableBalance() >= _amount, "Hermes: should be enough funds available to withdraw");

        token.transfer(_beneficiary, _amount);

        emit FundsWithdrawned(_amount, _beneficiary);
    }

    // Returns funds amount not locked in any channel, not staked and not lended from providers.
    function availableBalance() public view returns (uint256) {
        uint256 _totalLockedAmount = minimalExpectedBalance();
        uint256 _currentBalance = token.balanceOf(address(this));
        if (_totalLockedAmount > _currentBalance) {
            return uint256(0);
        }
        return _currentBalance - _totalLockedAmount;
    }

    // Returns true if channel is opened.
    function isChannelOpened(bytes32 _channelId) public view returns (bool) {
        return channels[_channelId].settled != 0 || channels[_channelId].stake != 0;
    }

    // If Hermes is not closed and is not in punishment mode, he is active.
    function isHermesActive() public view returns (bool) {
        Status _status = getStatus();
        return _status != Status.Punishment && _status != Status.Closed;
    }

    function pauseChannelOpening() public onlyOperator {
        require(getStatus() == Status.Active, "Hermes: have to be in active state");
        status = Status.Paused;
        emit ChannelOpeningPaused();
    }

    function activateChannelOpening() public onlyOperator {
        require(getStatus() == Status.Paused, "Hermes: have to be in paused state");
        status = Status.Active;
        emit ChannelOpeningActivated();
    }

    function closeHermes() public onlyOwner {
        require(isHermesActive(), "Hermes: should be active");
        status = Status.Closed;
        closingTimelock = getEmergencyTimelock();
        emit HermesClosed(block.timestamp);
    }

    function getStakeBack(address _beneficiary) public onlyOwner {
        require(getStatus() == Status.Closed, "Hermes: have to be closed");
        require(block.timestamp > closingTimelock, "Hermes: timelock period should be already passed");

        uint256 _amount = token.balanceOf(address(this)) - punishment.amount;
        token.transfer(_beneficiary, _amount);
    }

    /*
      ------------------------------------------ HELPERS ------------------------------------------
    */
    // Returns timestamp until which exit request should be locked
    function getTimelock() internal view virtual returns (uint256) {
        return block.timestamp + DELAY_SECONDS;
    }

    function calculateHermesFee(uint256 _amount) public view returns (uint256) {
        return round((_amount * getActiveFee() / 100), 100) / 100;
    }

    // Funds which always have to be holded in hermes smart contract.
    function minimalExpectedBalance() public view returns (uint256) {
        return max(hermesStake, punishment.amount) + totalStake;
    }

    function getEmergencyTimelock() internal view virtual returns (uint256) {
        return block.timestamp + DELAY_SECONDS * 100; // 300 days
    }

    function validatePromise(bytes32 _channelId, uint256 _amount, uint256 _transactorFee, bytes32 _preimage, bytes memory _signature) public view returns (bool) {
        bytes32 _hashlock = keccak256(abi.encodePacked(_preimage));
        address _signer = keccak256(abi.encodePacked(getChainID(), _channelId, _amount, _transactorFee, _hashlock)).recover(_signature);
        return _signer == operator;
    }
}

Contract ABI

[{"anonymous":false,"inputs":[],"name":"ChannelOpeningActivated","type":"event"},{"anonymous":false,"inputs":[],"name":"ChannelOpeningPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousDestination","type":"address"},{"indexed":true,"internalType":"address","name":"newDestination","type":"address"}],"name":"DestinationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"}],"name":"FundsWithdrawned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blockTimestamp","type":"uint256"}],"name":"HermesClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newFee","type":"uint16"},{"indexed":false,"internalType":"uint64","name":"validFrom","type":"uint64"}],"name":"HermesFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"activationBlockTime","type":"uint256"}],"name":"HermesPunishmentActivated","type":"event"},{"anonymous":false,"inputs":[],"name":"HermesPunishmentDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newStake","type":"uint256"}],"name":"HermesStakeIncreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxStake","type":"uint256"}],"name":"MaxStakeValueUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinStake","type":"uint256"}],"name":"MinStakeValueUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"channelId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"stakeAmount","type":"uint256"}],"name":"NewStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"identity","type":"address"},{"indexed":true,"internalType":"bytes32","name":"channelId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountSentToBeneficiary","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fees","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"lock","type":"bytes32"}],"name":"PromiseSettled","type":"event"},{"inputs":[],"name":"activateChannelOpening","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculateHermesFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"channels","outputs":[{"internalType":"uint256","name":"settled","type":"uint256"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"lastUsedNonce","type":"uint256"},{"internalType":"uint256","name":"timelock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimEthers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeHermes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"decreaseStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getActiveFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"string","name":"_type","type":"string"}],"name":"getChannelId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"}],"name":"getChannelId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundsDestination","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHermesStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"getStakeBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getStakeThresholds","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStatus","outputs":[{"internalType":"enum HermesImplementation.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_additionalStake","type":"uint256"}],"name":"increaseHermesStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_channelId","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"increaseStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"uint256","name":"_minStake","type":"uint256"},{"internalType":"uint256","name":"_maxStake","type":"uint256"},{"internalType":"address payable","name":"_dexAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_channelId","type":"bytes32"}],"name":"isChannelOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isHermesActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastFee","outputs":[{"internalType":"uint16","name":"value","type":"uint16"},{"internalType":"uint64","name":"validFrom","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimalExpectedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"uint256","name":"_amountToStake","type":"uint256"}],"name":"openChannel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseChannelOpening","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"bytes","name":"_beneficiarySignature","type":"bytes"}],"name":"payAndSettle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"previousFee","outputs":[{"internalType":"uint16","name":"value","type":"uint16"},{"internalType":"uint64","name":"validFrom","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"punishment","outputs":[{"internalType":"uint256","name":"activationBlockTime","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resolveEmergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newDestination","type":"address"}],"name":"setFundsDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newFee","type":"uint16"}],"name":"setHermesFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxStake","type":"uint256"}],"name":"setMaxStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMinStake","type":"uint256"}],"name":"setMinStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"settleIntoStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"settlePromise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"},{"internalType":"bytes","name":"_promiseSignature","type":"bytes"},{"internalType":"address","name":"_newBeneficiary","type":"address"},{"internalType":"bytes","name":"_beneficiarySignature","type":"bytes"}],"name":"settleWithBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"settleWithDEX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_channelId","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"validatePromise","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5060018055613fe9806100246000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c80637295973a1161015c578063bc96a1e9116100ce578063eb295b2711610087578063eb295b27146105c0578063f2fde38b146105d3578063f3fef3a3146105e6578063f58c5b6e146105f9578063fbb46b981461060a578063fc0c546a1461061257600080fd5b8063bc96a1e91461055a578063df8de3e714610562578063e1791b2d14610575578063e1c6648714610588578063e58473f2146105a7578063e7f43c68146105af57600080fd5b806394c7915d1161012057806394c7915d146104e35780639801134e146104eb5780639ed9903e1461052c578063aa606dee14610537578063ab2f0e511461053f578063ae10ed841461054757600080fd5b80637295973a1461044f5780637a7ebd7b146104625780638c80fd90146104b75780638d886fac146104ca5780638da5cb5b146104d257600080fd5b80634e69d560116101f55780636931b550116101b95780636931b550146103e8578063699a0885146103f05780636e9094ea146104035780636fc148371461041657806370603a7f1461042957806371d2ff1b1461043c57600080fd5b80634e69d5601461037057806352a8e78d1461038a57806353d2a0ff1461039d5780635ab1bd53146103b05780636138dda7146103d557600080fd5b806324f453d11161024757806324f453d1146102fd578063306db49b1461031057806338df102414610318578063392e53cd1461032b57806339f976261461034a57806348d9f01e1461035d57600080fd5b806302062d12146102845780630684cd201461029957806315c73afd146102c15780631f4f12c6146102c9578063238e130a146102ea575b600080fd5b610297610292366004613724565b610625565b005b600f546010546102a7919082565b604080519283526020830191909152015b60405180910390f35b6102976108cd565b6102dc6102d7366004613790565b610b5a565b6040519081526020016102b8565b6102976102f83660046137a9565b610b8f565b61029761030b3660046137c6565b610c3c565b6009546102dc565b610297610326366004613809565b610d59565b6005546001600160a01b031615155b60405190151581526020016102b8565b610297610358366004613824565b610f41565b61029761036b366004613724565b610fbb565b600b54600160a01b900460ff166040516102b8919061385c565b610297610398366004613884565b61115b565b6102976103ab366004613884565b61134d565b6004546001600160a01b03165b6040516001600160a01b0390911681526020016102b8565b6102976103e33660046137a9565b6114a8565b6102976116d1565b6102976103fe36600461392b565b61177e565b61033a610411366004613790565b611add565b610297610424366004613790565b611b0c565b61033a610437366004613999565b611c3e565b61029761044a366004613724565b611cc4565b61029761045d3660046139e3565b611d3d565b610497610470366004613790565b600e6020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102b8565b6102976104c5366004613790565b612194565b6102dc6122c0565b6000546001600160a01b03166103bd565b6102dc61231b565b600c5461050a9061ffff8116906201000090046001600160401b031682565b6040805161ffff90931683526001600160401b039091166020830152016102b8565b6007546008546102a7565b610297612340565b6102dc6123e5565b610297610555366004613790565b612495565b61033a6125c7565b6102976105703660046137a9565b61261a565b6102dc610583366004613a45565b6127fd565b600d5461050a9061ffff8116906201000090046001600160401b031682565b610297612832565b6005546001600160a01b03166103bd565b6102dc6105ce3660046137a9565b612917565b6102976105e13660046137a9565b612960565b6102976105f43660046137c6565b612a5e565b6002546001600160a01b03166103bd565b610297612c27565b6003546103bd906001600160a01b031681565b6004805460405163505a1b3160e01b81526001600160a01b03888116938201939093526000929091169063505a1b319060240160206040518083038186803b15801561067057600080fd5b505afa158015610684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a89190613aa8565b90506001600160a01b0381166106d95760405162461bcd60e51b81526004016106d090613ac5565b60405180910390fd5b60006106e487612917565b90506000806106fa838989898960016000612d01565b604080516002808252606082018352939550919350600092839291602083019080368337505060035482519293506001600160a01b03169183915060009061074457610744613b2d565b6001600160a01b03928316602091820292909201810191909152600b54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561079857600080fd5b505afa1580156107ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d09190613aa8565b816001815181106107e3576107e3613b2d565b6001600160a01b039283166020918202929092010152600b546040516318cbafe560e01b81529116906318cbafe590610828908790869086908c904290600401613b43565b600060405180830381600087803b15801561084257600080fd5b505af1158015610856573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261087e9190810190613bb4565b5060408051858152602081018590529081018990526001600160a01b038088169187918e1690600080516020613f94833981519152906060015b60405180910390a45050505050505050505050565b6002600b54600160a01b900460ff1660038111156108ed576108ed613846565b146109495760405162461bcd60e51b815260206004820152602660248201527f4865726d65733a2073686f756c6420626520696e2070756e6973686d656e742060448201526573746174757360d01b60648201526084016106d0565b6000606461096a600461ffff166006546109639190613c6f565b6064613059565b6109749190613c8e565b600f54909150610e109060009061098b9042613cb0565b9050600060018361099c8486613059565b6109a69190613c8e565b6109b09190613cb0565b905060006109be8583613c6f565b6010549091506109cf908290613cc7565b6010556008546000906109e061231b565b6109ea9190613cc7565b6003546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b158015610a3357600080fd5b505afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190613cdf565b905081811015610b1b576003546001600160a01b03166323b872dd3330610a928587613cb0565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b158015610ae157600080fd5b505af1158015610af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b199190613cf8565b505b600b805460ff60a01b191690556040517f5dc43dfad9aedde473e812a66ff033b91a2b1ee060e7dc0746a1a14a4a3bd47c90600090a150505050505050565b60006064610b7f6064610b6b6122c0565b610b759086613c6f565b6109639190613c8e565b610b899190613c8e565b92915050565b6000546001600160a01b0316331480610bb157506000546001600160a01b0316155b610bcd5760405162461bcd60e51b81526004016106d090613d1a565b6001600160a01b038116610be057600080fd5b6002546040516001600160a01b038084169216907fe1a66d77649cf0a57b9937073549f30f1c82bb865aaf066d2f299e37a62c6aad90600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b03163314610ca65760405162461bcd60e51b815260206004820152602760248201527f4865726d65733a206f6e6c792072656769737472792063616e206f70656e206360448201526668616e6e656c7360c81b60648201526084016106d0565b6000600b54600160a01b900460ff166003811115610cc657610cc6613846565b14610ce35760405162461bcd60e51b81526004016106d090613d4f565b600754811015610d415760405162461bcd60e51b8152602060048201526024808201527f4865726d65733a206d696e207374616b6520616d6f756e74206e6f742072656160448201526318da195960e21b60648201526084016106d0565b610d55610d4d83612917565b82600061308e565b5050565b6000546001600160a01b0316331480610d7b57506000546001600160a01b0316155b610d975760405162461bcd60e51b81526004016106d090613d1a565b6003600b54600160a01b900460ff166003811115610db757610db7613846565b1415610e055760405162461bcd60e51b815260206004820152601c60248201527f4865726d65733a2073686f756c64206265206e6f7420636c6f7365640000000060448201526064016106d0565b6113888161ffff161115610e2b5760405162461bcd60e51b81526004016106d090613d91565b600c546201000090046001600160401b0316421015610e965760405162461bcd60e51b815260206004820152602160248201527f4865726d65733a2063616e27742075706461746520696e6163746976652066656044820152606560f81b60648201526084016106d0565b6000610ea0613296565b600c8054600d80546001600160401b03620100008085048216810269ffffffffffffffffffff1993841661ffff8088169190911791909117909455604080518082018252948a168086529288166020958601819052918202939095168217929092179094558251938452908301529192507fea76eb91f1817e0757719ea43e0733faf6f1121425bde387d1dd91badb9d403b91015b60405180910390a15050565b6003600b54600160a01b900460ff166003811115610f6157610f61613846565b1415610faf5760405162461bcd60e51b815260206004820152601b60248201527f6865726d65732073686f756c64206265206e6f7420636c6f736564000000000060448201526064016106d0565b610d558282600061308e565b6004805460405163505a1b3160e01b81526001600160a01b03888116938201939093526000929091169063505a1b319060240160206040518083038186803b15801561100657600080fd5b505afa15801561101a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103e9190613aa8565b90506001600160a01b0381166110665760405162461bcd60e51b81526004016106d090613ac5565b600061107187612917565b9050600080611087838989898960016000612d01565b60035460405163a9059cbb60e01b81529294509092506001600160a01b03169063a9059cbb906110bd9087908690600401613dd5565b602060405180830381600087803b1580156110d757600080fd5b505af11580156110eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110f9190613cf8565b5060408051838152602081018390529081018790526001600160a01b038086169185918c1690600080516020613f948339815191529060600160405180910390a4505050505050505050565b6000611189886040518060400160405280600a8152602001691dda5d1a191c985dd85b60b21b8152506127fd565b905060006111f18346604080516020810192909252810185905260608082018c9052608082018a905287901b6bffffffffffffffffffffffff191660a082015260b4015b604051602081830303815290604052805190602001206132a590919063ffffffff16565b9050886001600160a01b0316816001600160a01b0316146112735760405162461bcd60e51b815260206004820152603660248201527f4865726d65733a20706179416e64536574746c6520726571756573742073686f6044820152751d5b19081899481c1c9bdc195c9b1e481cda59db995960521b60648201526084016106d0565b600080611287848b8b8b8b60006001612d01565b60035460405163a9059cbb60e01b81529294509092506001600160a01b03169063a9059cbb906112bd9089908690600401613dd5565b602060405180830381600087803b1580156112d757600080fd5b505af11580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190613cf8565b5060408051838152602081018390529081018990526001600160a01b038088169186918e1690600080516020613f94833981519152906060016108b8565b6004805460405163d0171d7960e01b81526001600160a01b039091169163d0171d7991611380918b918791879101613e1e565b600060405180830381600087803b15801561139a57600080fd5b505af11580156113ae573d6000803e3d6000fd5b5050505060006113bd88612917565b90506000806113d3838a8a8a8a60016000612d01565b60035460405163a9059cbb60e01b81529294509092506001600160a01b03169063a9059cbb906114099088908690600401613dd5565b602060405180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145b9190613cf8565b5060408051838152602081018390529081018890526001600160a01b038087169185918d1690600080516020613f948339815191529060600160405180910390a450505050505050505050565b6000546001600160a01b03163314806114ca57506000546001600160a01b0316155b6114e65760405162461bcd60e51b81526004016106d090613d1a565b6003600b54600160a01b900460ff16600381111561150657611506613846565b146115535760405162461bcd60e51b815260206004820152601960248201527f4865726d65733a206861766520746f20626520636c6f7365640000000000000060448201526064016106d0565b600a5442116115bd5760405162461bcd60e51b815260206004820152603060248201527f4865726d65733a2074696d656c6f636b20706572696f642073686f756c64206260448201526f1948185b1c9958591e481c185cdcd95960821b60648201526084016106d0565b6010546003546040516370a0823160e01b8152306004820152600092916001600160a01b0316906370a082319060240160206040518083038186803b15801561160557600080fd5b505afa158015611619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163d9190613cdf565b6116479190613cb0565b60035460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb9061167a9085908590600401613dd5565b602060405180830381600087803b15801561169457600080fd5b505af11580156116a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cc9190613cf8565b505050565b600260015414156117245760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106d0565b60026001819055546001600160a01b031661173e57600080fd5b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611777573d6000803e3d6000fd5b5060018055565b6005546001600160a01b0316156117e25760405162461bcd60e51b815260206004820152602260248201527f4865726d65733a206861766520746f206265206e6f7420696e697469616c697a604482015261195960f21b60648201526084016106d0565b6001600160a01b0386166118515760405162461bcd60e51b815260206004820152603060248201527f4865726d65733a20746f6b656e2063616e2774206265206465706c6f7964206960448201526f6e746f207a65726f206164647265737360801b60648201526084016106d0565b6001600160a01b0385166118a75760405162461bcd60e51b815260206004820152601f60248201527f4865726d65733a206f70657261746f72206861766520746f206265207365740060448201526064016106d0565b6113888461ffff1611156118cd5760405162461bcd60e51b81526004016106d090613d91565b8282116119355760405162461bcd60e51b815260206004820152603060248201527f4865726d65733a206d61785374616b65206861766520746f206265206269676760448201526f6572207468616e206d696e5374616b6560801b60648201526084016106d0565b60048054336001600160a01b03199182161782556003805482166001600160a01b038a8116918217909255600580549093169189169190911790915560408051808201825261ffff8816808252426001600160401b03166020909201829052600c805469ffffffffffffffffffff19169091176201000090920291909117905560078690556008859055516370a0823160e01b81523092810192909252906370a082319060240160206040518083038186803b1580156119f457600080fd5b505afa158015611a08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2c9190613cdf565b60095560035460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390611a6390849060001990600401613dd5565b602060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab59190613cf8565b50600b80546001600160a01b0319166001600160a01b03929092169190911790555050505050565b6000818152600e6020526040812054151580610b895750506000908152600e6020526040902060010154151590565b6000546001600160a01b0316331480611b2e57506000546001600160a01b0316155b611b4a5760405162461bcd60e51b81526004016106d090613d1a565b611b526125c7565b611b995760405162461bcd60e51b81526020600482015260186024820152774865726d65733a2068617320746f2062652061637469766560401b60448201526064016106d0565b6007548111611c025760405162461bcd60e51b815260206004820152602f60248201527f4865726d65733a206d61785374616b652068617320746f20626520626967676560448201526e72207468616e206d696e5374616b6560881b60648201526084016106d0565b60088190556040518181527f53f4fb18cb329155d5af04681c1d0846d0484d7de33791619c6988ca61910e3d906020015b60405180910390a150565b60008083604051602001611c5491815260200190565b6040516020818303038152906040528051906020012090506000611ca784611c794690565b60408051602081019290925281018b9052606081018a90526080810189905260a0810185905260c0016111cd565b6005546001600160a01b0390811691161498975050505050505050565b6000611ccf86612917565b9050600080611ce48388888888600180612d01565b60408051838152602081018390529081018890529193509150309084906001600160a01b038b1690600080516020613f948339815191529060600160405180910390a4611d338383600161308e565b5050505050505050565b6000611d4885612917565b9050611d5381611add565b611d9f5760405162461bcd60e51b815260206004820181905260248201527f4865726d65733a206368616e6e656c2068617320746f206265206f70656e656460448201526064016106d0565b82841015611e0b5760405162461bcd60e51b815260206004820152603360248201527f4865726d65733a20616d6f756e742073686f756c6420626520626967676572206044820152727468616e207472616e736163746f722066656560681b60648201526084016106d0565b6000818152600e602052604090206001810154851115611e885760405162461bcd60e51b815260206004820152603260248201527f4865726d65733a2063616e2774207769746864726177206d6f7265207468616e604482015271207468652063757272656e74207374616b6560701b60648201526084016106d0565b6002810154611e98906001613cc7565b600282015560408051808201909152601481527314dd185ad9481c995d1d5c9b881c995c5d595cdd60621b6020820152600090611eee9085904660028601546040516111cd93929189918d918d91602001613e6b565b905082611efa82612917565b14611f5a5760405162461bcd60e51b815260206004820152602a60248201527f4865726d65733a206861766520746f206265207369676e6564206279206368616044820152696e6e656c20706172747960b01b60648201526084016106d0565b6000868360010154611f6c9190613cb0565b9050801580611f7d57506007548110155b611f995760405162461bcd60e51b81526004016106d090613ea7565b60018301819055600654611fae908890613cb0565b600655851561203d5760035460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611fe99033908a90600401613dd5565b602060405180830381600087803b15801561200357600080fd5b505af1158015612017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203b9190613cf8565b505b6004805460405163505a1b3160e01b81526001600160a01b038b8116938201939093526000929091169063505a1b319060240160206040518083038186803b15801561208857600080fd5b505afa15801561209c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c09190613aa8565b6003549091506001600160a01b031663a9059cbb826120df8a8c613cb0565b6040518363ffffffff1660e01b81526004016120fc929190613dd5565b602060405180830381600087803b15801561211657600080fd5b505af115801561212a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214e9190613cf8565b50847fc5f0715c45dab2e8f14871936119e3c64fd5841d397130c2d1db743d142522cb8360405161218191815260200190565b60405180910390a2505050505050505050565b6000546001600160a01b03163314806121b657506000546001600160a01b0316155b6121d25760405162461bcd60e51b81526004016106d090613d1a565b6121da6125c7565b6122215760405162461bcd60e51b81526020600482015260186024820152774865726d65733a2068617320746f2062652061637469766560401b60448201526064016106d0565b600854811061228b5760405162461bcd60e51b815260206004820152603060248201527f4865726d65733a206d696e5374616b652068617320746f20626520736d616c6c60448201526f6572207468616e206d61785374616b6560801b60648201526084016106d0565b60078190556040518181527fb9e5e6e8db1283ee860f3856d8383e40665c58a5264ede5e6ed8ec1afb03125190602001611c33565b600c5460009081906201000090046001600160401b03164210156122e557600d6122e8565b600c5b60408051808201909152905461ffff8116808352620100009091046001600160401b031660209092019190915292915050565b6000600654612331600954600f600101546132c9565b61233b9190613cc7565b905090565b6005546001600160a01b0316331461236a5760405162461bcd60e51b81526004016106d090613efa565b6000600b54600160a01b900460ff16600381111561238a5761238a613846565b146123a75760405162461bcd60e51b81526004016106d090613d4f565b600b805460ff60a01b1916600160a01b1790556040517f1f4cd5d6edef8a0c4dbe6d547fdc42e0f3575167257553271f2366f9d497f67e90600090a1565b6000806123f061231b565b6003546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561243957600080fd5b505afa15801561244d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124719190613cdf565b9050808211156124845760009250505090565b61248e8282613cb0565b9250505090565b6000546001600160a01b03163314806124b757506000546001600160a01b0316155b6124d35760405162461bcd60e51b81526004016106d090613d1a565b806124dc6123e5565b10156125845760006124ec6123e5565b6124f69083613cb0565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390529192506001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561254957600080fd5b505af115801561255d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125819190613cf8565b50505b806009546125929190613cc7565b60098190556040519081527feb10b8b69c3eb290299237eaee4760bf1c02734ce3dc7740d6f2017b5ca3ed9190602001611c33565b6000806125de600b5460ff600160a01b9091041690565b905060028160038111156125f4576125f4613846565b141580156126145750600381600381111561261157612611613846565b14155b91505090565b6002600154141561266d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106d0565b60026001819055546001600160a01b031661268757600080fd5b6003546001600160a01b03828116911614156126f35760405162461bcd60e51b815260206004820152602560248201527f6e617469766520746f6b656e2066756e64732063616e2774206265207265636f6044820152641d995c995960da1b60648201526084016106d0565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561273557600080fd5b505afa158015612749573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276d9190613cdf565b60025460405163a9059cbb60e01b81529192506001600160a01b038085169263a9059cbb926127a29216908590600401613dd5565b602060405180830381600087803b1580156127bc57600080fd5b505af11580156127d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f49190613cf8565b50506001805550565b600082308360405160200161281493929190613f4d565b60405160208183030381529060405280519060200120905092915050565b6000546001600160a01b031633148061285457506000546001600160a01b0316155b6128705760405162461bcd60e51b81526004016106d090613d1a565b6128786125c7565b6128c45760405162461bcd60e51b815260206004820152601860248201527f4865726d65733a2073686f756c6420626520616374697665000000000000000060448201526064016106d0565b600b805460ff60a01b1916600360a01b1790556128df6132df565b600a556040514281527ffa9b0c2718819d67ceaec4f97d36185c2f1d22bdc5ff18f44c52cd56a5dd8e459060200160405180910390a1565b6040516bffffffffffffffffffffffff19606083811b8216602084015230901b166034820152600090604801604051602081830303815290604052805190602001209050919050565b6000546001600160a01b031633148061298257506000546001600160a01b0316155b61299e5760405162461bcd60e51b81526004016106d090613d1a565b6001600160a01b038116612a035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106d0565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331480612a8057506000546001600160a01b0316155b612a9c5760405162461bcd60e51b81526004016106d090613d1a565b612aa46125c7565b612af05760405162461bcd60e51b815260206004820152601960248201527f4865726d65733a206861766520746f206265206163746976650000000000000060448201526064016106d0565b80612af96123e5565b1015612b645760405162461bcd60e51b815260206004820152603460248201527f4865726d65733a2073686f756c6420626520656e6f7567682066756e647320616044820152737661696c61626c6520746f20776974686472617760601b60648201526084016106d0565b60035460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612b969085908590600401613dd5565b602060405180830381600087803b158015612bb057600080fd5b505af1158015612bc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be89190613cf8565b50604080518281526001600160a01b03841660208201527fa2e147ce2b7cb83d9c07e397bb806f23dd42c42e86ea45e1611d6e50eb1ec8bf9101610f35565b6005546001600160a01b03163314612c515760405162461bcd60e51b81526004016106d090613efa565b6001600b54600160a01b900460ff166003811115612c7157612c71613846565b14612cc95760405162461bcd60e51b815260206004820152602260248201527f4865726d65733a206861766520746f20626520696e2070617573656420737461604482015261746560f01b60648201526084016106d0565b600b805460ff60a01b191690556040517f2d8b6ec230798e206d536342a28b7b61cc8fcfafb1d27c11c5519b3c42eb7df890600090a1565b600080612d0c6125c7565b612d6a5760405162461bcd60e51b815260206004820152602960248201527f4865726d65733a206865726d6573206861766520746f20626520696e2061637460448201526869766520737461746560b81b60648201526084016106d0565b612d778989898989611c3e565b612dde5760405162461bcd60e51b815260206004820152603260248201527f4865726d65733a206861766520746f2062652070726f7065726c79207369676e6044820152716564207061796d656e742070726f6d69736560701b60648201526084016106d0565b6000898152600e602052604090208054151580612e015750600754816001015410155b80612e095750835b612e555760405162461bcd60e51b815260206004820152601860248201527f4865726d65733a206e6f7420656e6f756768207374616b65000000000000000060448201526064016106d0565b6000612e5f6123e5565b90508160010154811015612eb957600b805460ff60a01b1916600160a11b17905542600f81905560408051918252517f23dc47ee5d995fb521fbe4351f353f3177d7b9d9e15bdd01ed358764c25d96299181900360200190a15b8154600090612ec8908c613cb0565b9050898111612f365760405162461bcd60e51b815260206004820152603460248201527f4865726d65733a20616d6f756e7420746f20736574746c652073686f756c6420604482015273636f766572207472616e736163746f722066656560601b60648201526084016106d0565b6000612f4860085485600101546132c9565b905082821180612f5757508082115b15612f6957612f6683826132f9565b91505b8354612f76908390613cc7565b8455600088612f86576000612f8f565b612f8f83610b5a565b612f99908d613cc7565b90508b1561303857600360009054906101000a90046001600160a01b03166001600160a01b031663a9059cbb338e6040518363ffffffff1660e01b8152600401612fe4929190613dd5565b602060405180830381600087803b158015612ffe57600080fd5b505af1158015613012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130369190613cf8565b505b60006130448285613cb0565b9f919e50909c50505050505050505050505050565b6000818060016130698287613cc7565b6130739190613cb0565b61307d9190613c8e565b6130879190613c6f565b9392505050565b6000838152600e6020526040812060018101549091906130af908590613cc7565b90506008548111156131375760405162461bcd60e51b8152602060048201526044602482018190527f4865726d65733a20746f74616c20616d6f756e7420746f207374616b65206361908201527f6e277420626520626967676572207468616e206d6178696d616c6c7920616c6c6064820152631bddd95960e21b608482015260a4016106d0565b6007548110156131595760405162461bcd60e51b81526004016106d090613ea7565b82613242576003546040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b03909116906323b872dd90606401602060405180830381600087803b1580156131b057600080fd5b505af11580156131c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e89190613cf8565b6132425760405162461bcd60e51b815260206004820152602560248201527f4865726d65733a20746f6b656e207472616e736665722073686f756c6420737560448201526418d8d9595960da1b60648201526084016106d0565b60018201819055600654613257908590613cc7565b60065560405181815285907fc5f0715c45dab2e8f14871936119e3c64fd5841d397130c2d1db743d142522cb9060200160405180910390a25050505050565b600061233b6203f48042613cc7565b60008060006132b48585613308565b915091506132c181613378565b509392505050565b60008183116132d85781613087565b5090919050565b60006132ef6203f4806064613c6f565b61233b9042613cc7565b60008183106132d85781613087565b60008082516041141561333f5760208301516040840151606085015160001a61333387828585613536565b94509450505050613371565b825160401415613369576020830151604084015161335e868383613623565b935093505050613371565b506000905060025b9250929050565b600081600481111561338c5761338c613846565b14156133955750565b60018160048111156133a9576133a9613846565b14156133f75760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106d0565b600281600481111561340b5761340b613846565b14156134595760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106d0565b600381600481111561346d5761346d613846565b14156134c65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106d0565b60048160048111156134da576134da613846565b14156135335760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106d0565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561356d575060009050600361361a565b8460ff16601b1415801561358557508460ff16601c14155b15613596575060009050600461361a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156135ea573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166136135760006001925092505061361a565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161364487828885613536565b935093505050935093915050565b6001600160a01b038116811461353357600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156136a5576136a5613667565b604052919050565b60006001600160401b038311156136c6576136c6613667565b6136d9601f8401601f191660200161367d565b90508281528383830111156136ed57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261371557600080fd5b613087838335602085016136ad565b600080600080600060a0868803121561373c57600080fd5b853561374781613652565b945060208601359350604086013592506060860135915060808601356001600160401b0381111561377757600080fd5b61378388828901613704565b9150509295509295909350565b6000602082840312156137a257600080fd5b5035919050565b6000602082840312156137bb57600080fd5b813561308781613652565b600080604083850312156137d957600080fd5b82356137e481613652565b946020939093013593505050565b803561ffff8116811461380457600080fd5b919050565b60006020828403121561381b57600080fd5b613087826137f2565b6000806040838503121561383757600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b602081016004831061387e57634e487b7160e01b600052602160045260246000fd5b91905290565b600080600080600080600060e0888a03121561389f57600080fd5b87356138aa81613652565b965060208801359550604088013594506060880135935060808801356001600160401b03808211156138db57600080fd5b6138e78b838c01613704565b945060a08a013591506138f982613652565b90925060c0890135908082111561390f57600080fd5b5061391c8a828b01613704565b91505092959891949750929550565b60008060008060008060c0878903121561394457600080fd5b863561394f81613652565b9550602087013561395f81613652565b945061396d604088016137f2565b9350606087013592506080870135915060a087013561398b81613652565b809150509295509295509295565b600080600080600060a086880312156139b157600080fd5b8535945060208601359350604086013592506060860135915060808601356001600160401b0381111561377757600080fd5b600080600080608085870312156139f957600080fd5b8435613a0481613652565b9350602085013592506040850135915060608501356001600160401b03811115613a2d57600080fd5b613a3987828801613704565b91505092959194509250565b60008060408385031215613a5857600080fd5b8235613a6381613652565b915060208301356001600160401b03811115613a7e57600080fd5b8301601f81018513613a8f57600080fd5b613a9e858235602084016136ad565b9150509250929050565b600060208284031215613aba57600080fd5b815161308781613652565b60208082526042908201527f4865726d65733a206964656e74697479206861766520746f206265207265676960408201527f7374657265642c2062656e6566696369617279206861766520746f2062652073606082015261195d60f21b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b935784516001600160a01b031683529383019391830191600101613b6e565b50506001600160a01b03969096166060850152505050608001529392505050565b60006020808385031215613bc757600080fd5b82516001600160401b0380821115613bde57600080fd5b818501915085601f830112613bf257600080fd5b815181811115613c0457613c04613667565b8060051b9150613c1584830161367d565b8181529183018401918481019088841115613c2f57600080fd5b938501935b83851015613c4d57845182529385019390850190613c34565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613c8957613c89613c59565b500290565b600082613cab57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015613cc257613cc2613c59565b500390565b60008219821115613cda57613cda613c59565b500190565b600060208284031215613cf157600080fd5b5051919050565b600060208284031215613d0a57600080fd5b8151801515811461308757600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f4865726d65733a206861766520746f20626520696e2061637469766520737461604082015261746560f01b606082015260800190565b60208082526024908201527f4865726d65733a206665652063616e277420626520626967676572207468616e6040820152632035302560e01b606082015260800190565b6001600160a01b03929092168252602082015260400190565b60005b83811015613e09578181015183820152602001613df1565b83811115613e18576000848401525b50505050565b600060018060a01b038086168352808516602084015250606060408301528251806060840152613e55816080850160208701613dee565b601f01601f191691909101608001949350505050565b60008751613e7d818460208c01613dee565b9190910195865250602085019390935260408401919091526060830152608082015260a001919050565b60208082526033908201527f4865726d65733a207374616b652063616e2774206265206c657373207468616e604082015272207265717569726564206d696e207374616b6560681b606082015260800190565b60208082526033908201527f4865726d65733a206f6e6c79206865726d6573206f70657261746f722063616e6040820152721031b0b636103a3434b990333ab731ba34b7b760691b606082015260800190565b60006bffffffffffffffffffffffff19808660601b168352808560601b166014840152508251613f84816028850160208701613dee565b9190910160280194935050505056febe62ac0eb86179a8bcebe2f194ee1a147982a61a2ee67ff7e70b3fad25ec16d7a26469706673582212204cc2bde00a492991e1a9b527ecd1f700144af50a7ca16cc861339d416b82691164736f6c63430008090033

Deployed ByteCode Sourcemap

21601:23336:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33283:1010;;;;;;:::i;:::-;;:::i;:::-;;24072:28;;;;;;;;;;;;;;2038:25:1;;;2094:2;2079:18;;2072:34;;;;2011:18;24072:28:0;;;;;;;;38047:1317;;;:::i;43994:151::-;;;;;;:::i;:::-;;:::i;:::-;;;2448:25:1;;;2436:2;2421:18;43994:151:0;2302:177:1;19303:258:0;;;;;;:::i;:::-;;:::i;28035:418::-;;;;;;:::i;:::-;;:::i;24868:93::-;24942:11;;24868:93;;40118:572;;;;;;:::i;:::-;;:::i;27711:100::-;27781:8;;-1:-1:-1;;;;;27781:8:0;:22;;27711:100;;;3582:14:1;;3575:22;3557:41;;3545:2;3530:18;27711:100:0;3417:187:1;35373:207:0;;;;;;:::i;:::-;;:::i;30771:772::-;;;;;;:::i;:::-;;:::i;25360:82::-;25428:6;;-1:-1:-1;;;25428:6:0;;;;25360:82;;;;;;:::i;31551:915::-;;;;;;:::i;:::-;;:::i;32474:801::-;;;;;;:::i;:::-;;:::i;24548:96::-;24627:8;;-1:-1:-1;;;;;24627:8:0;24548:96;;;-1:-1:-1;;;;;5530:32:1;;;5512:51;;5500:2;5485:18;24548:96:0;5366:203:1;43293:380:0;;;;;;:::i;:::-;;:::i;19868:160::-;;;:::i;26611:1092::-;;;;;;:::i;:::-;;:::i;42157:166::-;;;;;;:::i;:::-;;:::i;39800:310::-;;;;;;:::i;:::-;;:::i;44525:409::-;;;;;;:::i;:::-;;:::i;35695:525::-;;;;;;:::i;:::-;;:::i;36301:1545::-;;;;;;:::i;:::-;;:::i;23792:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8191:25:1;;;8247:2;8232:18;;8225:34;;;;8275:18;;;8268:34;8333:2;8318:18;;8311:34;8178:3;8163:19;23792:43:0;7960:391:1;39481:311:0;;;;;;:::i;:::-;;:::i;24652:208::-;;;:::i;15797:79::-;15835:7;15862:6;-1:-1:-1;;;;;15862:6:0;15797:79;;44224:138;;;:::i;23048:24::-;;;;;;;;;;;;-1:-1:-1;;;;;23048:24:0;;;;;;;8556:6:1;8544:19;;;8526:38;;-1:-1:-1;;;;;8600:31:1;;;8595:2;8580:18;;8573:59;8499:18;23048:24:0;8356:282:1;24969:115:0;25057:8;;25067;;24969:115;;42590:216;;;:::i;41759:347::-;;;:::i;40698:388::-;;;;;;:::i;:::-;;:::i;42408:174::-;;;:::i;20107:339::-;;;;;;:::i;:::-;;:::i;24362:178::-;;;;;;:::i;:::-;;:::i;23119:28::-;;;;;;;;;;;;-1:-1:-1;;;;;23119:28:0;;;43044:241;;;:::i;24109:87::-;24180:8;;-1:-1:-1;;;;;24180:8:0;24109:87;;24204:150;;;;;;:::i;:::-;;:::i;16035:244::-;;;;;;:::i;:::-;;:::i;41294:359::-;;;;;;:::i;:::-;;:::i;19630:103::-;19709:16;;-1:-1:-1;;;;;19709:16:0;19630:103;;42814:222;;;:::i;19099:24::-;;;;;-1:-1:-1;;;;;19099:24:0;;;33283:1010;33451:8;;;:34;;-1:-1:-1;;;33451:34:0;;-1:-1:-1;;;;;5530:32:1;;;33451:34:0;;;5512:51:1;;;;33428:20:0;;33451:8;;;;:23;;5485:18:1;;33451:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33428:57;-1:-1:-1;;;;;;33504:26:0;;33496:105;;;;-1:-1:-1;;;33496:105:0;;;;;;;:::i;:::-;;;;;;;;;33674:18;33695:23;33708:9;33695:12;:23::i;:::-;33674:44;;33730:25;33757:13;33774:87;33789:10;33801:7;33810:14;33826:9;33837:10;33849:4;33855:5;33774:14;:87::i;:::-;33989:16;;;34003:1;33989:16;;;;;;;;33729:132;;-1:-1:-1;33729:132:0;;-1:-1:-1;33933:17:0;;;;33989:16;;;;;;;;;-1:-1:-1;;34034:5:0;;34016:7;;;;-1:-1:-1;;;;;;34034:5:0;;34016:7;;-1:-1:-1;34034:5:0;;34016:7;;;;:::i;:::-;-1:-1:-1;;;;;34016:24:0;;;:7;;;;;;;;;;:24;;;;34061:3;;:10;;;-1:-1:-1;;;34061:10:0;;;;:3;;;;;:8;;:10;;;;;34016:7;;34061:10;;;;;:3;:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34051:4;34056:1;34051:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34051:20:0;;;:7;;;;;;;;;:20;34084:3;;:95;;-1:-1:-1;;;34084:95:0;;:3;;;:25;;:95;;34110:17;;34129:12;;34143:4;;34149:12;;34163:15;;34084:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34084:95:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;34197:88:0;;;12625:25:1;;;12681:2;12666:18;;12659:34;;;12709:18;;;12702:34;;;-1:-1:-1;;;;;34197:88:0;;;;34223:10;;34197:88;;;-1:-1:-1;;;;;;;;;;;34197:88:0;12613:2:1;12598:18;34197:88:0;;;;;;;;33417:876;;;;;;33283:1010;;;;;:::o;38047:1317::-;38116:17;25428:6;;-1:-1:-1;;;25428:6:0;;;;38101:32;;;;;;;;:::i;:::-;;38093:83;;;;-1:-1:-1;;;38093:83:0;;12949:2:1;38093:83:0;;;12931:21:1;12988:2;12968:18;;;12961:30;13027:34;13007:18;;;13000:62;-1:-1:-1;;;13078:18:1;;;13071:36;13124:19;;38093:83:0;12747:402:1;38093:83:0;38246:26;38321:3;38275:43;21938:1;38281:31;;:10;;:31;;;;:::i;:::-;38314:3;38275:5;:43::i;:::-;:49;;;;:::i;:::-;38466:10;:30;38246:78;;-1:-1:-1;21851:4:0;;38386:13;;38448:48;;:15;:48;:::i;:::-;38426:70;;38507:24;38570:1;38562:5;38534:25;38540:11;38553:5;38534;:25::i;:::-;:33;;;;:::i;:::-;:37;;;;:::i;:::-;38507:64;-1:-1:-1;38584:25:0;38612:37;38631:18;38507:64;38612:37;:::i;:::-;38680:17;;38584:65;;-1:-1:-1;38680:37:0;;38584:65;;38680:37;:::i;:::-;38660:17;:57;38853:8;;38804:19;;38826:24;:22;:24::i;:::-;:35;;;;:::i;:::-;38964:5;;:30;;-1:-1:-1;;;38964:30:0;;38988:4;38964:30;;;5512:51:1;38804:57:0;;-1:-1:-1;38938:23:0;;-1:-1:-1;;;;;38964:5:0;;;;:15;;5485:18:1;;38964:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38938:56;;39123:11;39105:15;:29;39101:138;;;39151:5;;-1:-1:-1;;;;;39151:5:0;:18;39170:10;39190:4;39197:29;39211:15;39197:11;:29;:::i;:::-;39151:76;;-1:-1:-1;;;;;;39151:76:0;;;;;;;-1:-1:-1;;;;;14391:15:1;;;39151:76:0;;;14373:34:1;14443:15;;;;14423:18;;;14416:43;14475:18;;;14468:34;14308:18;;39151:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39101:138;39287:6;:22;;-1:-1:-1;;;;39287:22:0;;;39327:29;;;;39296:13;;39327:29;38082:1282;;;;;;;38047:1317::o;43994:151::-;44060:7;44134:3;44087:44;44121:3;44104:14;:12;:14::i;:::-;44094:24;;:7;:24;:::i;:::-;:30;;;;:::i;44087:44::-;:50;;;;:::i;:::-;44080:57;43994:151;-1:-1:-1;;43994:151:0:o;19303:258::-;15924:6;;-1:-1:-1;;;;;15924:6:0;15934:10;15924:20;;:46;;-1:-1:-1;15966:3:0;15948:6;-1:-1:-1;;;;;15948:6:0;:22;15924:46;15916:91;;;;-1:-1:-1;;;15916:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19409:29:0;::::1;19401:38;;;::::0;::::1;;19474:16;::::0;19455:53:::1;::::0;-1:-1:-1;;;;;19455:53:0;;::::1;::::0;19474:16:::1;::::0;19455:53:::1;::::0;19474:16:::1;::::0;19455:53:::1;19519:16;:34:::0;;-1:-1:-1;;;;;;19519:34:0::1;-1:-1:-1::0;;;;;19519:34:0;;;::::1;::::0;;;::::1;::::0;;19303:258::o;28035:418::-;28147:8;;-1:-1:-1;;;;;28147:8:0;28125:10;:31;28117:83;;;;-1:-1:-1;;;28117:83:0;;15358:2:1;28117:83:0;;;15340:21:1;15397:2;15377:18;;;15370:30;15436:34;15416:18;;;15409:62;-1:-1:-1;;;15487:18:1;;;15480:37;15534:19;;28117:83:0;15156:403:1;28117:83:0;28234:13;25428:6;;-1:-1:-1;;;25428:6:0;;;;28219:28;;;;;;;;:::i;:::-;;28211:75;;;;-1:-1:-1;;;28211:75:0;;;;;;;:::i;:::-;28323:8;;28305:14;:26;;28297:75;;;;-1:-1:-1;;;28297:75:0;;16169:2:1;28297:75:0;;;16151:21:1;16208:2;16188:18;;;16181:30;16247:34;16227:18;;;16220:62;-1:-1:-1;;;16298:18:1;;;16291:34;16342:19;;28297:75:0;15967:400:1;28297:75:0;28383:62;28398:23;28411:9;28398:12;:23::i;:::-;28423:14;28439:5;28383:14;:62::i;:::-;28035:418;;:::o;40118:572::-;15924:6;;-1:-1:-1;;;;;15924:6:0;15934:10;15924:20;;:46;;-1:-1:-1;15966:3:0;15948:6;-1:-1:-1;;;;;15948:6:0;:22;15924:46;15916:91;;;;-1:-1:-1;;;15916:91:0;;;;;;;:::i;:::-;40207:13:::1;25428:6:::0;;-1:-1:-1;;;25428:6:0;;;;40192:28:::1;;;;;;;;:::i;:::-;;;40184:69;;;::::0;-1:-1:-1;;;40184:69:0;;16574:2:1;40184:69:0::1;::::0;::::1;16556:21:1::0;16613:2;16593:18;;;16586:30;16652;16632:18;;;16625:58;16700:18;;40184:69:0::1;16372:352:1::0;40184:69:0::1;40283:4;40272:7;:15;;;;40264:64;;;;-1:-1:-1::0;;;40264:64:0::1;;;;;;;:::i;:::-;40366:7;:17:::0;;;::::1;-1:-1:-1::0;;;;;40366:17:0::1;40347:15;:36;;40339:82;;;::::0;-1:-1:-1;;;40339:82:0;;17336:2:1;40339:82:0::1;::::0;::::1;17318:21:1::0;17375:2;17355:18;;;17348:30;17414:34;17394:18;;;17387:62;-1:-1:-1;;;17465:18:1;;;17458:31;17506:19;;40339:82:0::1;17134:397:1::0;40339:82:0::1;40501:17;40528:13;:11;:13::i;:::-;40569:7;40555:21:::0;;:11:::1;:21:::0;;-1:-1:-1;;;;;40555:21:0;;;::::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;40555:21:0;;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;40597:30:::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;;;;::::1;;::::0;;::::1;::::0;;;40587:40;;::::1;::::0;;;;;;;;;::::1;::::0;;;40645:37;;8526:38:1;;;8580:18;;;8573:59;40597:30:0;;-1:-1:-1;40645:37:0::1;::::0;8499:18:1;40645:37:0::1;;;;;;;;40173:517;40118:572:::0;:::o;35373:207::-;35474:13;25428:6;;-1:-1:-1;;;25428:6:0;;;;35459:28;;;;;;;;:::i;:::-;;;35451:68;;;;-1:-1:-1;;;35451:68:0;;17738:2:1;35451:68:0;;;17720:21:1;17777:2;17757:18;;;17750:30;17816:29;17796:18;;;17789:57;17863:18;;35451:68:0;17536:351:1;35451:68:0;35530:42;35545:10;35557:7;35566:5;35530:14;:42::i;30771:772::-;30939:8;;;:34;;-1:-1:-1;;;30939:34:0;;-1:-1:-1;;;;;5530:32:1;;;30939:34:0;;;5512:51:1;;;;30916:20:0;;30939:8;;;;:23;;5485:18:1;;30939:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30916:57;-1:-1:-1;;;;;;30992:26:0;;30984:105;;;;-1:-1:-1;;;30984:105:0;;;;;;;:::i;:::-;31184:18;31205:23;31218:9;31205:12;:23::i;:::-;31184:44;;31240:25;31267:13;31284:87;31299:10;31311:7;31320:14;31336:9;31347:10;31359:4;31365:5;31284:14;:87::i;:::-;31382:5;;:47;;-1:-1:-1;;;31382:47:0;;31239:132;;-1:-1:-1;31239:132:0;;-1:-1:-1;;;;;;31382:5:0;;:14;;:47;;31397:12;;31239:132;;31382:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;31447:88:0;;;12625:25:1;;;12681:2;12666:18;;12659:34;;;12709:18;;;12702:34;;;-1:-1:-1;;;;;31447:88:0;;;;31473:10;;31447:88;;;-1:-1:-1;;;;;;;;;;;31447:88:0;12613:2:1;12598:18;31447:88:0;;;;;;;30905:638;;;;30771:772;;;;;:::o;31551:915::-;31753:18;31774:37;31787:9;31774:37;;;;;;;;;;;;;-1:-1:-1;;;31774:37:0;;;:12;:37::i;:::-;31753:58;-1:-1:-1;31915:15:0;31933:118;32029:21;20633:9;31943:76;;;;;;18412:19:1;;;;18447:12;;18440:28;;;18484:12;;;;18477:28;;;18521:12;;;18514:28;;;18577:15;;;-1:-1:-1;;18573:53:1;18558:13;;;18551:76;18643:13;;31943:76:0;;;;;;;;;;;;;31933:87;;;;;;:95;;:118;;;;:::i;:::-;31915:136;;32081:9;-1:-1:-1;;;;;32070:20:0;:7;-1:-1:-1;;;;;32070:20:0;;32062:87;;;;-1:-1:-1;;;32062:87:0;;18869:2:1;32062:87:0;;;18851:21:1;18908:2;18888:18;;;18881:30;18947:34;18927:18;;;18920:62;-1:-1:-1;;;18998:18:1;;;18991:52;19060:19;;32062:87:0;18667:418:1;32062:87:0;32163:25;32190:13;32207:87;32222:10;32234:7;32243:14;32259:9;32270:10;32282:5;32289:4;32207:14;:87::i;:::-;32305:5;;:47;;-1:-1:-1;;;32305:47:0;;32162:132;;-1:-1:-1;32162:132:0;;-1:-1:-1;;;;;;32305:5:0;;:14;;:47;;32320:12;;32162:132;;32305:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32370:88:0;;;12625:25:1;;;12681:2;12666:18;;12659:34;;;12709:18;;;12702:34;;;-1:-1:-1;;;;;32370:88:0;;;;32396:10;;32370:88;;;-1:-1:-1;;;;;;;;;;;32370:88:0;12613:2:1;12598:18;32370:88:0;12423:319:1;32474:801:0;32734:8;;;:74;;-1:-1:-1;;;32734:74:0;;-1:-1:-1;;;;;32734:8:0;;;;:23;;:74;;32758:9;;32769:15;;32786:21;;32734:74;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32903:18;32924:23;32937:9;32924:12;:23::i;:::-;32903:44;;32959:25;32986:13;33003:94;33018:10;33030:7;33039:14;33055:9;33066:17;33085:4;33091:5;33003:14;:94::i;:::-;33108:5;;:50;;-1:-1:-1;;;33108:50:0;;32958:139;;-1:-1:-1;32958:139:0;;-1:-1:-1;;;;;;33108:5:0;;:14;;:50;;33123:15;;32958:139;;33108:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;33176:91:0;;;12625:25:1;;;12681:2;12666:18;;12659:34;;;12709:18;;;12702:34;;;-1:-1:-1;;;;;33176:91:0;;;;33202:10;;33176:91;;;-1:-1:-1;;;;;;;;;;;33176:91:0;12613:2:1;12598:18;33176:91:0;;;;;;;32684:591;;;32474:801;;;;;;;:::o;43293:380::-;15924:6;;-1:-1:-1;;;;;15924:6:0;15934:10;15924:20;;:46;;-1:-1:-1;15966:3:0;15948:6;-1:-1:-1;;;;;15948:6:0;:22;15924:46;15916:91;;;;-1:-1:-1;;;15916:91:0;;;;;;;:::i;:::-;43388:13:::1;25428:6:::0;;-1:-1:-1;;;25428:6:0;;;;43373:28:::1;;;;;;;;:::i;:::-;;43365:66;;;::::0;-1:-1:-1;;;43365:66:0;;20141:2:1;43365:66:0::1;::::0;::::1;20123:21:1::0;20180:2;20160:18;;;20153:30;20219:27;20199:18;;;20192:55;20264:18;;43365:66:0::1;19939:349:1::0;43365:66:0::1;43468:15;;43450;:33;43442:94;;;::::0;-1:-1:-1;;;43442:94:0;;20495:2:1;43442:94:0::1;::::0;::::1;20477:21:1::0;20534:2;20514:18;;;20507:30;20573:34;20553:18;;;20546:62;-1:-1:-1;;;20624:18:1;;;20617:46;20680:19;;43442:94:0::1;20293:412:1::0;43442:94:0::1;43600:17:::0;;43567:5:::1;::::0;:30:::1;::::0;-1:-1:-1;;;43567:30:0;;43591:4:::1;43567:30;::::0;::::1;5512:51:1::0;43549:15:0::1;::::0;43600:17;-1:-1:-1;;;;;43567:5:0::1;::::0;:15:::1;::::0;5485:18:1;;43567:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;43628:5;::::0;:37:::1;::::0;-1:-1:-1;;;43628:37:0;;43549:68;;-1:-1:-1;;;;;;43628:5:0::1;::::0;:14:::1;::::0;:37:::1;::::0;43643:12;;43549:68;;43628:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43354:319;43293:380:::0;:::o;19868:160::-;18004:1;18600:7;;:19;;18592:63;;;;-1:-1:-1;;;18592:63:0;;20912:2:1;18592:63:0;;;20894:21:1;20951:2;20931:18;;;20924:30;20990:33;20970:18;;;20963:61;21041:18;;18592:63:0;20710:355:1;18592:63:0;18004:1;18733:7;:18;;;19930:16;-1:-1:-1;;;;;19930:16:0::1;19922:39;;;::::0;::::1;;19972:16;::::0;:48:::1;::::0;-1:-1:-1;;;;;19972:16:0;;::::1;::::0;19998:21:::1;19972:48:::0;::::1;;;::::0;:16:::1;:48:::0;:16;:48;19998:21;19972:16;:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;17960:1:0;18912:22;;19868:160::o;26611:1092::-;27781:8;;-1:-1:-1;;;;;27781:8:0;:22;26772:63;;;;-1:-1:-1;;;26772:63:0;;21272:2:1;26772:63:0;;;21254:21:1;21311:2;21291:18;;;21284:30;21350:34;21330:18;;;21323:62;-1:-1:-1;;;21401:18:1;;;21394:32;21443:19;;26772:63:0;21070:398:1;26772:63:0;-1:-1:-1;;;;;26854:20:0;;26846:81;;;;-1:-1:-1;;;26846:81:0;;21675:2:1;26846:81:0;;;21657:21:1;21714:2;21694:18;;;21687:30;21753:34;21733:18;;;21726:62;-1:-1:-1;;;21804:18:1;;;21797:46;21860:19;;26846:81:0;21473:412:1;26846:81:0;-1:-1:-1;;;;;26946:23:0;;26938:67;;;;-1:-1:-1;;;26938:67:0;;22092:2:1;26938:67:0;;;22074:21:1;22131:2;22111:18;;;22104:30;22170:33;22150:18;;;22143:61;22221:18;;26938:67:0;21890:355:1;26938:67:0;27032:4;27024;:12;;;;27016:61;;;;-1:-1:-1;;;27016:61:0;;;;;;;:::i;:::-;27108:9;27096;:21;27088:82;;;;-1:-1:-1;;;27088:82:0;;22452:2:1;27088:82:0;;;22434:21:1;22491:2;22471:18;;;22464:30;22530:34;22510:18;;;22503:62;-1:-1:-1;;;22581:18:1;;;22574:46;22637:19;;27088:82:0;22250:412:1;27088:82:0;27183:8;:39;;27211:10;-1:-1:-1;;;;;;27183:39:0;;;;;;27233:5;:27;;;;-1:-1:-1;;;;;27233:27:0;;;;;;;;;27271:8;:20;;;;;;;;;;;;;;;27312:40;;;;;;;;;;;;;;27335:15;-1:-1:-1;;;;;27312:40:0;;;;;;;;27302:7;:50;;-1:-1:-1;;27302:50:0;;;;;;;;;;;;;;27363:8;:20;;;27394:8;:20;;;27439:30;-1:-1:-1;;;27439:30:0;;27463:4;27439:30;;;5512:51:1;;;;27233:27:0;27439:15;;5485:18:1;;27439:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27425:11;:44;27604:5;;:45;;-1:-1:-1;;;27604:45:0;;-1:-1:-1;;;;;27604:5:0;;;;:13;;:45;;27618:11;;-1:-1:-1;;27631:17:0;27604:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;27660:3:0;:35;;-1:-1:-1;;;;;;27660:35:0;-1:-1:-1;;;;;27660:35:0;;;;;;;;;;-1:-1:-1;;;;;26611:1092:0:o;42157:166::-;42223:4;42247:20;;;:8;:20;;;;;:28;:33;;;:68;;-1:-1:-1;;42284:20:0;;;;:8;:20;;;;;:26;;;:31;;;42157:166::o;39800:310::-;15924:6;;-1:-1:-1;;;;;15924:6:0;15934:10;15924:20;;:46;;-1:-1:-1;15966:3:0;15948:6;-1:-1:-1;;;;;15948:6:0;:22;15924:46;15916:91;;;;-1:-1:-1;;;15916:91:0;;;;;;;:::i;:::-;39879:16:::1;:14;:16::i;:::-;39871:53;;;::::0;-1:-1:-1;;;39871:53:0;;23156:2:1;39871:53:0::1;::::0;::::1;23138:21:1::0;23195:2;23175:18;;;23168:30;-1:-1:-1;;;23214:18:1;;;23207:54;23278:18;;39871:53:0::1;22954:348:1::0;39871:53:0::1;39958:8;;39943:12;:23;39935:83;;;::::0;-1:-1:-1;;;39935:83:0;;23509:2:1;39935:83:0::1;::::0;::::1;23491:21:1::0;23548:2;23528:18;;;23521:30;23587:34;23567:18;;;23560:62;-1:-1:-1;;;23638:18:1;;;23631:45;23693:19;;39935:83:0::1;23307:411:1::0;39935:83:0::1;40029:8;:23:::0;;;40068:34:::1;::::0;2448:25:1;;;40068:34:0::1;::::0;2436:2:1;2421:18;40068:34:0::1;;;;;;;;39800:310:::0;:::o;44525:409::-;44676:4;44693:17;44740:9;44723:27;;;;;;23852:19:1;;23896:2;23887:12;;23723:182;44723:27:0;;;;;;;;;;;;;44713:38;;;;;;44693:58;;44762:15;44780:109;44878:10;44807:12;20633:9;;20507:178;44807:12;44790:78;;;;;;24151:19:1;;;;24186:12;;24179:28;;;24223:12;;;24216:28;;;24260:12;;;24253:28;;;24297:13;;;24290:29;;;24335:13;;44790:78:0;23910:444:1;44780:109:0;44918:8;;-1:-1:-1;;;;;44918:8:0;;;44907:19;;;;44525:409;-1:-1:-1;;;;;;;;44525:409:0:o;35695:525::-;35842:18;35863:23;35876:9;35863:12;:23::i;:::-;35842:44;;35898:28;35928:17;35949:86;35964:10;35976:7;35985:14;36001:9;36012:10;36024:4;36030;35949:14;:86::i;:::-;36051:96;;;12625:25:1;;;12681:2;12666:18;;12659:34;;;12709:18;;;12702:34;;;35897:138:0;;-1:-1:-1;35897:138:0;-1:-1:-1;36097:4:0;;36077:10;;-1:-1:-1;;;;;36051:96:0;;;-1:-1:-1;;;;;;;;;;;36051:96:0;12613:2:1;12598:18;36051:96:0;;;;;;;36158:54;36173:10;36185:20;36207:4;36158:14;:54::i;:::-;35831:389;;;35695:525;;;;;:::o;36301:1545::-;36427:18;36448:23;36461:9;36448:12;:23::i;:::-;36427:44;;36490:27;36506:10;36490:15;:27::i;:::-;36482:72;;;;-1:-1:-1;;;36482:72:0;;24561:2:1;36482:72:0;;;24543:21:1;;;24580:18;;;24573:30;24639:34;24619:18;;;24612:62;24691:18;;36482:72:0;24359:356:1;36482:72:0;36584:14;36573:7;:25;;36565:89;;;;-1:-1:-1;;;36565:89:0;;24922:2:1;36565:89:0;;;24904:21:1;24961:2;24941:18;;;24934:30;25000:34;24980:18;;;24973:62;-1:-1:-1;;;25051:18:1;;;25044:49;25110:19;;36565:89:0;24720:415:1;36565:89:0;36667:24;36694:20;;;:8;:20;;;;;36744:14;;;;36733:25;;;36725:88;;;;-1:-1:-1;;;36725:88:0;;25342:2:1;36725:88:0;;;25324:21:1;25381:2;25361:18;;;25354:30;25420:34;25400:18;;;25393:62;-1:-1:-1;;;25471:18:1;;;25464:48;25529:19;;36725:88:0;25140:414:1;36725:88:0;36880:22;;;;:26;;36905:1;36880:26;:::i;:::-;36855:22;;;:51;36962:19;;;;;;;;;;;;-1:-1:-1;;;36962:19:0;;;;36917:15;;36935:143;;37067:10;;20633:9;37034:22;;;;36945:112;;;;;;36997:10;;37009:7;;37018:14;;36945:112;;;:::i;36935:143::-;36917:161;;37122:10;37097:21;37110:7;37097:12;:21::i;:::-;:35;37089:90;;;;-1:-1:-1;;;37089:90:0;;26408:2:1;37089:90:0;;;26390:21:1;26447:2;26427:18;;;26420:30;26486:34;26466:18;;;26459:62;-1:-1:-1;;;26537:18:1;;;26530:40;26587:19;;37089:90:0;26206:406:1;37089:90:0;37192:23;37235:7;37218:8;:14;;;:24;;;;:::i;:::-;37192:50;-1:-1:-1;37261:20:0;;;:51;;;37304:8;;37285:15;:27;;37261:51;37253:115;;;;-1:-1:-1;;;37253:115:0;;;;;;;:::i;:::-;37414:14;;;:32;;;37470:10;;:20;;37483:7;;37470:20;:::i;:::-;37457:10;:33;37560:18;;37556:93;;37595:5;;:42;;-1:-1:-1;;;37595:42:0;;-1:-1:-1;;;;;37595:5:0;;;;:14;;:42;;37610:10;;37622:14;;37595:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37556:93;37684:8;;;:34;;-1:-1:-1;;;37684:34:0;;-1:-1:-1;;;;;5530:32:1;;;37684:34:0;;;5512:51:1;;;;37661:20:0;;37684:8;;;;:23;;5485:18:1;;37684:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37729:5;;37661:57;;-1:-1:-1;;;;;;37729:5:0;:14;37661:57;37758:24;37768:14;37758:7;:24;:::i;:::-;37729:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37810:10;37801:37;37822:15;37801:37;;;;2448:25:1;;2436:2;2421:18;;2302:177;37801:37:0;;;;;;;;36416:1430;;;;;36301:1545;;;;:::o;39481:311::-;15924:6;;-1:-1:-1;;;;;15924:6:0;15934:10;15924:20;;:46;;-1:-1:-1;15966:3:0;15948:6;-1:-1:-1;;;;;15948:6:0;:22;15924:46;15916:91;;;;-1:-1:-1;;;15916:91:0;;;;;;;:::i;:::-;39560:16:::1;:14;:16::i;:::-;39552:53;;;::::0;-1:-1:-1;;;39552:53:0;;23156:2:1;39552:53:0::1;::::0;::::1;23138:21:1::0;23195:2;23175:18;;;23168:30;-1:-1:-1;;;23214:18:1;;;23207:54;23278:18;;39552:53:0::1;22954:348:1::0;39552:53:0::1;39639:8;;39624:12;:23;39616:84;;;::::0;-1:-1:-1;;;39616:84:0;;27239:2:1;39616:84:0::1;::::0;::::1;27221:21:1::0;27278:2;27258:18;;;27251:30;27317:34;27297:18;;;27290:62;-1:-1:-1;;;27368:18:1;;;27361:46;27424:19;;39616:84:0::1;27037:412:1::0;39616:84:0::1;39711:8;:23:::0;;;39750:34:::1;::::0;2448:25:1;;;39750:34:0::1;::::0;2436:2:1;2421:18;39750:34:0::1;2302:177:1::0;24652:208:0;24767:7;:17;24697:7;;;;24767:17;;;-1:-1:-1;;;;;24767:17:0;24748:15;:36;;24747:62;;24798:11;24747:62;;;24788:7;24747:62;24717:92;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24717:92:0;;;;;;;;;;;-1:-1:-1;;24652:208:0:o;44224:138::-;44279:7;44344:10;;44306:35;44310:11;;44323:10;:17;;;44306:3;:35::i;:::-;:48;;;;:::i;:::-;44299:55;;44224:138;:::o;42590:216::-;26266:8;;-1:-1:-1;;;;;26266:8:0;26252:10;:22;26244:86;;;;-1:-1:-1;;;26244:86:0;;;;;;;:::i;:::-;42675:13:::1;25428:6:::0;;-1:-1:-1;;;25428:6:0;;;;42660:28:::1;;;;;;;;:::i;:::-;;42652:75;;;;-1:-1:-1::0;;;42652:75:0::1;;;;;;;:::i;:::-;42738:6;:22:::0;;-1:-1:-1;;;;42738:22:0::1;-1:-1:-1::0;;;42738:22:0::1;::::0;;42776::::1;::::0;::::1;::::0;-1:-1:-1;;42776:22:0::1;42590:216::o:0;41759:347::-;41808:7;41828:26;41857:24;:22;:24::i;:::-;41918:5;;:30;;-1:-1:-1;;;41918:30:0;;41942:4;41918:30;;;5512:51:1;41828:53:0;;-1:-1:-1;41892:23:0;;-1:-1:-1;;;;;41918:5:0;;;;:15;;5485:18:1;;41918:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41892:56;;41984:15;41963:18;:36;41959:86;;;42031:1;42016:17;;;;41759:347;:::o;41959:86::-;42062:36;42080:18;42062:15;:36;:::i;:::-;42055:43;;;;41759:347;:::o;40698:388::-;15924:6;;-1:-1:-1;;;;;15924:6:0;15934:10;15924:20;;:46;;-1:-1:-1;15966:3:0;15948:6;-1:-1:-1;;;;;15948:6:0;:22;15924:46;15916:91;;;;-1:-1:-1;;;15916:91:0;;;;;;;:::i;:::-;40806:16:::1;40785:18;:16;:18::i;:::-;:37;40781:190;;;40839:13;40874:18;:16;:18::i;:::-;40855:37;::::0;:16;:37:::1;:::i;:::-;40907:5;::::0;:52:::1;::::0;-1:-1:-1;;;40907:52:0;;40926:10:::1;40907:52;::::0;::::1;14373:34:1::0;40946:4:0::1;14423:18:1::0;;;14416:43;14475:18;;;14468:34;;;40839:53:0;;-1:-1:-1;;;;;;40907:5:0::1;::::0;:18:::1;::::0;14308::1;;40907:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40824:147;40781:190;41011:16;40997:11;;:30;;;;:::i;:::-;40983:11;:44:::0;;;41045:33:::1;::::0;2448:25:1;;;41045:33:0::1;::::0;2436:2:1;2421:18;41045:33:0::1;2302:177:1::0;42408:174:0;42455:4;42472:14;42489:11;25428:6;;;-1:-1:-1;;;25428:6:0;;;;;25360:82;42489:11;42472:28;-1:-1:-1;42529:17:0;42518:7;:28;;;;;;;;:::i;:::-;;;:56;;;;-1:-1:-1;42561:13:0;42550:7;:24;;;;;;;;:::i;:::-;;;42518:56;42511:63;;;42408:174;:::o;20107:339::-;18004:1;18600:7;;:19;;18592:63;;;;-1:-1:-1;;;18592:63:0;;20912:2:1;18592:63:0;;;20894:21:1;20951:2;20931:18;;;20924:30;20990:33;20970:18;;;20963:61;21041:18;;18592:63:0;20710:355:1;18592:63:0;18004:1;18733:7;:18;;;20183:16;-1:-1:-1;;;;;20183:16:0::1;20175:39;;;::::0;::::1;;20251:5;::::0;-1:-1:-1;;;;;20233:24:0;;::::1;20251:5:::0;::::1;20233:24;;20225:74;;;::::0;-1:-1:-1;;;20225:74:0;;28076:2:1;20225:74:0::1;::::0;::::1;28058:21:1::0;28115:2;28095:18;;;28088:30;28154:34;28134:18;;;28127:62;-1:-1:-1;;;28205:18:1;;;28198:35;28250:19;;20225:74:0::1;27874:401:1::0;20225:74:0::1;20328:44;::::0;-1:-1:-1;;;20328:44:0;;20366:4:::1;20328:44;::::0;::::1;5512:51:1::0;20310:15:0::1;::::0;-1:-1:-1;;;;;20328:29:0;::::1;::::0;::::1;::::0;5485:18:1;;20328:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20412:16;::::0;20383:55:::1;::::0;-1:-1:-1;;;20383:55:0;;20310:62;;-1:-1:-1;;;;;;20383:28:0;;::::1;::::0;::::1;::::0;:55:::1;::::0;20412:16:::1;::::0;20310:62;;20383:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;17960:1:0;18912:22;;-1:-1:-1;20107:339:0:o;24362:178::-;24445:7;24499:9;24518:4;24525:5;24482:49;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24472:60;;;;;;24465:67;;24362:178;;;;:::o;43044:241::-;15924:6;;-1:-1:-1;;;;;15924:6:0;15934:10;15924:20;;:46;;-1:-1:-1;15966:3:0;15948:6;-1:-1:-1;;;;;15948:6:0;:22;15924:46;15916:91;;;;-1:-1:-1;;;15916:91:0;;;;;;;:::i;:::-;43103:16:::1;:14;:16::i;:::-;43095:53;;;::::0;-1:-1:-1;;;43095:53:0;;28988:2:1;43095:53:0::1;::::0;::::1;28970:21:1::0;29027:2;29007:18;;;29000:30;29066:26;29046:18;;;29039:54;29110:18;;43095:53:0::1;28786:348:1::0;43095:53:0::1;43159:6;:22:::0;;-1:-1:-1;;;;43159:22:0::1;-1:-1:-1::0;;;43159:22:0::1;::::0;;43210::::1;:20;:22::i;:::-;43192:15;:40:::0;43248:29:::1;::::0;43261:15:::1;2448:25:1::0;;43248:29:0::1;::::0;2436:2:1;2421:18;43248:29:0::1;;;;;;;43044:241::o:0;24204:150::-;24303:42;;-1:-1:-1;;29366:2:1;29362:15;;;29358:24;;24303:42:0;;;29346:37:1;24339:4:0;29417:15:1;;29413:24;29399:12;;;29392:46;24266:7:0;;29454:12:1;;24303:42:0;;;;;;;;;;;;24293:53;;;;;;24286:60;;24204:150;;;:::o;16035:244::-;15924:6;;-1:-1:-1;;;;;15924:6:0;15934:10;15924:20;;:46;;-1:-1:-1;15966:3:0;15948:6;-1:-1:-1;;;;;15948:6:0;:22;15924:46;15916:91;;;;-1:-1:-1;;;15916:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16124:22:0;::::1;16116:73;;;::::0;-1:-1:-1;;;16116:73:0;;29679:2:1;16116:73:0::1;::::0;::::1;29661:21:1::0;29718:2;29698:18;;;29691:30;29757:34;29737:18;;;29730:62;-1:-1:-1;;;29808:18:1;;;29801:36;29854:19;;16116:73:0::1;29477:402:1::0;16116:73:0::1;16226:6;::::0;;16205:38:::1;::::0;-1:-1:-1;;;;;16205:38:0;;::::1;::::0;16226:6;::::1;::::0;16205:38:::1;::::0;::::1;16254:6;:17:::0;;-1:-1:-1;;;;;;16254:17:0::1;-1:-1:-1::0;;;;;16254:17:0;;;::::1;::::0;;;::::1;::::0;;16035:244::o;41294:359::-;15924:6;;-1:-1:-1;;;;;15924:6:0;15934:10;15924:20;;:46;;-1:-1:-1;15966:3:0;15948:6;-1:-1:-1;;;;;15948:6:0;:22;15924:46;15916:91;;;;-1:-1:-1;;;15916:91:0;;;;;;;:::i;:::-;41387:16:::1;:14;:16::i;:::-;41379:54;;;::::0;-1:-1:-1;;;41379:54:0;;30086:2:1;41379:54:0::1;::::0;::::1;30068:21:1::0;30125:2;30105:18;;;30098:30;30164:27;30144:18;;;30137:55;30209:18;;41379:54:0::1;29884:349:1::0;41379:54:0::1;41474:7;41452:18;:16;:18::i;:::-;:29;;41444:94;;;::::0;-1:-1:-1;;;41444:94:0;;30440:2:1;41444:94:0::1;::::0;::::1;30422:21:1::0;30479:2;30459:18;;;30452:30;30518:34;30498:18;;;30491:62;-1:-1:-1;;;30569:18:1;;;30562:50;30629:19;;41444:94:0::1;30238:416:1::0;41444:94:0::1;41551:5;::::0;:37:::1;::::0;-1:-1:-1;;;41551:37:0;;-1:-1:-1;;;;;41551:5:0;;::::1;::::0;:14:::1;::::0;:37:::1;::::0;41566:12;;41580:7;;41551:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;41606:39:0::1;::::0;;30833:25:1;;;-1:-1:-1;;;;;30894:32:1;;30889:2;30874:18;;30867:60;41606:39:0::1;::::0;30806:18:1;41606:39:0::1;30659:274:1::0;42814:222:0;26266:8;;-1:-1:-1;;;;;26266:8:0;26252:10;:22;26244:86;;;;-1:-1:-1;;;26244:86:0;;;;;;;:::i;:::-;42902:13:::1;25428:6:::0;;-1:-1:-1;;;25428:6:0;;;;42887:28:::1;;;;;;;;:::i;:::-;;42879:75;;;::::0;-1:-1:-1;;;42879:75:0;;31140:2:1;42879:75:0::1;::::0;::::1;31122:21:1::0;31179:2;31159:18;;;31152:30;31218:34;31198:18;;;31191:62;-1:-1:-1;;;31269:18:1;;;31262:32;31311:19;;42879:75:0::1;30938:398:1::0;42879:75:0::1;42965:6;:22:::0;;-1:-1:-1;;;;42965:22:0::1;::::0;;43003:25:::1;::::0;::::1;::::0;42974:13:::1;::::0;43003:25:::1;42814:222::o:0;28554:2209::-;28804:7;28813;28855:16;:14;:16::i;:::-;28833:107;;;;-1:-1:-1;;;28833:107:0;;31543:2:1;28833:107:0;;;31525:21:1;31582:2;31562:18;;;31555:30;31621:34;31601:18;;;31594:62;-1:-1:-1;;;31672:18:1;;;31665:39;31721:19;;28833:107:0;31341:405:1;28833:107:0;29037:75;29053:10;29065:7;29074:14;29090:9;29101:10;29037:15;:75::i;:::-;29015:175;;;;-1:-1:-1;;;29015:175:0;;31953:2:1;29015:175:0;;;31935:21:1;31992:2;31972:18;;;31965:30;32031:34;32011:18;;;32004:62;-1:-1:-1;;;32082:18:1;;;32075:48;32140:19;;29015:175:0;31751:414:1;29015:175:0;29203:24;29230:20;;;:8;:20;;;;;29269:16;;:20;;;:50;;;29311:8;;29293;:14;;;:26;;29269:50;:66;;;;29323:12;29269:66;29261:103;;;;-1:-1:-1;;;29261:103:0;;32372:2:1;29261:103:0;;;32354:21:1;32411:2;32391:18;;;32384:30;32450:26;32430:18;;;32423:54;32494:18;;29261:103:0;32170:348:1;29261:103:0;29468:25;29496:18;:16;:18::i;:::-;29468:46;;29549:8;:14;;;29529:17;:34;29525:218;;;29580:6;:26;;-1:-1:-1;;;;29580:26:0;-1:-1:-1;;;29580:26:0;;;29654:15;29621:10;:48;;;29689:42;;;2448:25:1;;;29689:42:0;;;;;;2436:2:1;29689:42:0;;;29525:218;29843:16;;29809:21;;29833:26;;:7;:26;:::i;:::-;29809:50;;29894:14;29878:13;:30;29870:95;;;;-1:-1:-1;;;29870:95:0;;32725:2:1;29870:95:0;;;32707:21:1;32764:2;32744:18;;;32737:30;32803:34;32783:18;;;32776:62;-1:-1:-1;;;32854:18:1;;;32847:50;32914:19;;29870:95:0;32523:416:1;29870:95:0;30082:28;30113:29;30117:8;;30127;:14;;;30113:3;:29::i;:::-;30082:60;;30173:17;30157:13;:33;:73;;;;30210:20;30194:13;:36;30157:73;30153:169;;;30266:44;30270:17;30289:20;30266:3;:44::i;:::-;30250:60;;30153:169;30353:16;;:32;;30372:13;;30353:32;:::i;:::-;30334:51;;:16;30463:8;:48;;30510:1;30463:48;;;30474:33;30493:13;30474:18;:33::i;:::-;30445:67;;:14;:67;:::i;:::-;30429:83;-1:-1:-1;30560:18:0;;30556:93;;30595:5;;;;;;;;;-1:-1:-1;;;;;30595:5:0;-1:-1:-1;;;;;30595:14:0;;30610:10;30622:14;30595:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30556:93;30661:25;30689:20;30704:5;30689:13;:20;:::i;:::-;30661:48;30749:5;;-1:-1:-1;28554:2209:0;;-1:-1:-1;;;;;;;;;;;;;28554:2209:0:o;20903:108::-;20957:4;21002:1;;20992;20984:5;21002:1;20984;:5;:::i;:::-;:9;;;;:::i;:::-;20983:15;;;;:::i;:::-;20982:21;;;;:::i;:::-;20975:28;20903:108;-1:-1:-1;;;20903:108:0:o;34421:869::-;34531:24;34558:20;;;:8;:20;;;;;34615:14;;;;34558:20;;34531:24;34615:28;;34631:12;;34615:28;:::i;:::-;34589:54;;34681:8;;34662:15;:27;;34654:108;;;;-1:-1:-1;;;34654:108:0;;33146:2:1;34654:108:0;;;33128:21:1;33185:2;33165:18;;;33158:30;;;33224:34;33204:18;;;33197:62;33295:34;33275:18;;;33268:62;-1:-1:-1;;;33346:19:1;;;33339:35;33391:19;;34654:108:0;32944:472:1;34654:108:0;34800:8;;34781:15;:27;;34773:91;;;;-1:-1:-1;;;34773:91:0;;;;;;;:::i;:::-;34979:17;34974:160;;35021:5;;:59;;-1:-1:-1;;;35021:59:0;;35040:10;35021:59;;;14373:34:1;35060:4:0;14423:18:1;;;14416:43;14475:18;;;14468:34;;;-1:-1:-1;;;;;35021:5:0;;;;:18;;14308::1;;35021:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35013:109;;;;-1:-1:-1;;;35013:109:0;;33623:2:1;35013:109:0;;;33605:21:1;33662:2;33642:18;;;33635:30;33701:34;33681:18;;;33674:62;-1:-1:-1;;;33752:18:1;;;33745:35;33797:19;;35013:109:0;33421:401:1;35013:109:0;35146:14;;;:32;;;35202:10;;:25;;35215:12;;35202:25;:::i;:::-;35189:10;:38;35245:37;;2448:25:1;;;35254:10:0;;35245:37;;2436:2:1;2421:18;35245:37:0;;;;;;;34520:770;;34421:869;;;:::o;43866:120::-;43920:7;43947:31;21794:6;43947:15;:31;:::i;4366:231::-;4444:7;4465:17;4484:18;4506:27;4517:4;4523:9;4506:10;:27::i;:::-;4464:69;;;;4544:18;4556:5;4544:11;:18::i;:::-;-1:-1:-1;4580:9:0;4366:231;-1:-1:-1;;;4366:231:0:o;20693:97::-;20745:4;20773:1;20769;:5;:13;;20781:1;20769:13;;;-1:-1:-1;20777:1:0;;20693:97;-1:-1:-1;20693:97:0:o;44370:147::-;44433:7;44478:19;21794:6;44494:3;44478:19;:::i;:::-;44460:37;;:15;:37;:::i;20798:97::-;20850:4;20878:1;20874;:5;:13;;20886:1;20874:13;;2256:1308;2337:7;2346:12;2571:9;:16;2591:2;2571:22;2567:990;;;2867:4;2852:20;;2846:27;2917:4;2902:20;;2896:27;2975:4;2960:20;;2954:27;2610:9;2946:36;3018:25;3029:4;2946:36;2846:27;2896;3018:10;:25::i;:::-;3011:32;;;;;;;;;2567:990;3065:9;:16;3085:2;3065:22;3061:496;;;3340:4;3325:20;;3319:27;3391:4;3376:20;;3370:27;3433:23;3444:4;3319:27;3370;3433:10;:23::i;:::-;3426:30;;;;;;;;3061:496;-1:-1:-1;3505:1:0;;-1:-1:-1;3509:35:0;3061:496;2256:1308;;;;;:::o;527:643::-;605:20;596:5;:29;;;;;;;;:::i;:::-;;592:571;;;527:643;:::o;592:571::-;703:29;694:5;:38;;;;;;;;:::i;:::-;;690:473;;;749:34;;-1:-1:-1;;;749:34:0;;34029:2:1;749:34:0;;;34011:21:1;34068:2;34048:18;;;34041:30;34107:26;34087:18;;;34080:54;34151:18;;749:34:0;33827:348:1;690:473:0;814:35;805:5;:44;;;;;;;;:::i;:::-;;801:362;;;866:41;;-1:-1:-1;;;866:41:0;;34382:2:1;866:41:0;;;34364:21:1;34421:2;34401:18;;;34394:30;34460:33;34440:18;;;34433:61;34511:18;;866:41:0;34180:355:1;801:362:0;938:30;929:5;:39;;;;;;;;:::i;:::-;;925:238;;;985:44;;-1:-1:-1;;;985:44:0;;34742:2:1;985:44:0;;;34724:21:1;34781:2;34761:18;;;34754:30;34820:34;34800:18;;;34793:62;-1:-1:-1;;;34871:18:1;;;34864:32;34913:19;;985:44:0;34540:398:1;925:238:0;1060:30;1051:5;:39;;;;;;;;:::i;:::-;;1047:116;;;1107:44;;-1:-1:-1;;;1107:44:0;;35145:2:1;1107:44:0;;;35127:21:1;35184:2;35164:18;;;35157:30;35223:34;35203:18;;;35196:62;-1:-1:-1;;;35274:18:1;;;35267:32;35316:19;;1107:44:0;34943:398:1;1047:116:0;527:643;:::o;5865:1632::-;5996:7;;6930:66;6917:79;;6913:163;;;-1:-1:-1;7029:1:0;;-1:-1:-1;7033:30:0;7013:51;;6913:163;7090:1;:7;;7095:2;7090:7;;:18;;;;;7101:1;:7;;7106:2;7101:7;;7090:18;7086:102;;;-1:-1:-1;7141:1:0;;-1:-1:-1;7145:30:0;7125:51;;7086:102;7302:24;;;7285:14;7302:24;;;;;;;;;35573:25:1;;;35646:4;35634:17;;35614:18;;;35607:45;;;;35668:18;;;35661:34;;;35711:18;;;35704:34;;;7302:24:0;;35545:19:1;;7302:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7302:24:0;;-1:-1:-1;;7302:24:0;;;-1:-1:-1;;;;;;;7341:20:0;;7337:103;;7394:1;7398:29;7378:50;;;;;;;7337:103;7460:6;-1:-1:-1;7468:20:0;;-1:-1:-1;5865:1632:0;;;;;;;;:::o;4860:391::-;4974:7;;-1:-1:-1;;;;;5075:75:0;;5177:3;5173:12;;;5187:2;5169:21;5218:25;5229:4;5169:21;5238:1;5075:75;5218:10;:25::i;:::-;5211:32;;;;;;4860:391;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:127;211:10;206:3;202:20;199:1;192:31;242:4;239:1;232:15;266:4;263:1;256:15;282:275;353:2;347:9;418:2;399:13;;-1:-1:-1;;395:27:1;383:40;;-1:-1:-1;;;;;438:34:1;;474:22;;;435:62;432:88;;;500:18;;:::i;:::-;536:2;529:22;282:275;;-1:-1:-1;282:275:1:o;562:406::-;626:5;-1:-1:-1;;;;;652:6:1;649:30;646:56;;;682:18;;:::i;:::-;720:57;765:2;744:15;;-1:-1:-1;;740:29:1;771:4;736:40;720:57;:::i;:::-;711:66;;800:6;793:5;786:21;840:3;831:6;826:3;822:16;819:25;816:45;;;857:1;854;847:12;816:45;906:6;901:3;894:4;887:5;883:16;870:43;960:1;953:4;944:6;937:5;933:18;929:29;922:40;562:406;;;;;:::o;973:220::-;1015:5;1068:3;1061:4;1053:6;1049:17;1045:27;1035:55;;1086:1;1083;1076:12;1035:55;1108:79;1183:3;1174:6;1161:20;1154:4;1146:6;1142:17;1108:79;:::i;1198:661::-;1302:6;1310;1318;1326;1334;1387:3;1375:9;1366:7;1362:23;1358:33;1355:53;;;1404:1;1401;1394:12;1355:53;1443:9;1430:23;1462:31;1487:5;1462:31;:::i;:::-;1512:5;-1:-1:-1;1564:2:1;1549:18;;1536:32;;-1:-1:-1;1615:2:1;1600:18;;1587:32;;-1:-1:-1;1666:2:1;1651:18;;1638:32;;-1:-1:-1;1721:3:1;1706:19;;1693:33;-1:-1:-1;;;;;1738:30:1;;1735:50;;;1781:1;1778;1771:12;1735:50;1804:49;1845:7;1836:6;1825:9;1821:22;1804:49;:::i;:::-;1794:59;;;1198:661;;;;;;;;:::o;2117:180::-;2176:6;2229:2;2217:9;2208:7;2204:23;2200:32;2197:52;;;2245:1;2242;2235:12;2197:52;-1:-1:-1;2268:23:1;;2117:180;-1:-1:-1;2117:180:1:o;2484:255::-;2551:6;2604:2;2592:9;2583:7;2579:23;2575:32;2572:52;;;2620:1;2617;2610:12;2572:52;2659:9;2646:23;2678:31;2703:5;2678:31;:::i;2744:315::-;2812:6;2820;2873:2;2861:9;2852:7;2848:23;2844:32;2841:52;;;2889:1;2886;2879:12;2841:52;2928:9;2915:23;2947:31;2972:5;2947:31;:::i;:::-;2997:5;3049:2;3034:18;;;;3021:32;;-1:-1:-1;;;2744:315:1:o;3064:159::-;3131:20;;3191:6;3180:18;;3170:29;;3160:57;;3213:1;3210;3203:12;3160:57;3064:159;;;:::o;3228:184::-;3286:6;3339:2;3327:9;3318:7;3314:23;3310:32;3307:52;;;3355:1;3352;3345:12;3307:52;3378:28;3396:9;3378:28;:::i;3609:248::-;3677:6;3685;3738:2;3726:9;3717:7;3713:23;3709:32;3706:52;;;3754:1;3751;3744:12;3706:52;-1:-1:-1;;3777:23:1;;;3847:2;3832:18;;;3819:32;;-1:-1:-1;3609:248:1:o;3862:127::-;3923:10;3918:3;3914:20;3911:1;3904:31;3954:4;3951:1;3944:15;3978:4;3975:1;3968:15;3994:339;4137:2;4122:18;;4170:1;4159:13;;4149:144;;4215:10;4210:3;4206:20;4203:1;4196:31;4250:4;4247:1;4240:15;4278:4;4275:1;4268:15;4149:144;4302:25;;;3994:339;:::o;4338:1023::-;4469:6;4477;4485;4493;4501;4509;4517;4570:3;4558:9;4549:7;4545:23;4541:33;4538:53;;;4587:1;4584;4577:12;4538:53;4626:9;4613:23;4645:31;4670:5;4645:31;:::i;:::-;4695:5;-1:-1:-1;4747:2:1;4732:18;;4719:32;;-1:-1:-1;4798:2:1;4783:18;;4770:32;;-1:-1:-1;4849:2:1;4834:18;;4821:32;;-1:-1:-1;4904:3:1;4889:19;;4876:33;-1:-1:-1;;;;;4958:14:1;;;4955:34;;;4985:1;4982;4975:12;4955:34;5008:49;5049:7;5040:6;5029:9;5025:22;5008:49;:::i;:::-;4998:59;;5109:3;5098:9;5094:19;5081:33;5066:48;;5123:33;5148:7;5123:33;:::i;:::-;5175:7;;-1:-1:-1;5235:3:1;5220:19;;5207:33;;5252:16;;;5249:36;;;5281:1;5278;5271:12;5249:36;;5304:51;5347:7;5336:8;5325:9;5321:24;5304:51;:::i;:::-;5294:61;;;4338:1023;;;;;;;;;;:::o;5826:748::-;5937:6;5945;5953;5961;5969;5977;6030:3;6018:9;6009:7;6005:23;6001:33;5998:53;;;6047:1;6044;6037:12;5998:53;6086:9;6073:23;6105:31;6130:5;6105:31;:::i;:::-;6155:5;-1:-1:-1;6212:2:1;6197:18;;6184:32;6225:33;6184:32;6225:33;:::i;:::-;6277:7;-1:-1:-1;6303:37:1;6336:2;6321:18;;6303:37;:::i;:::-;6293:47;;6387:2;6376:9;6372:18;6359:32;6349:42;;6438:3;6427:9;6423:19;6410:33;6400:43;;6495:3;6484:9;6480:19;6467:33;6509;6534:7;6509:33;:::i;:::-;6561:7;6551:17;;;5826:748;;;;;;;;:::o;6764:594::-;6868:6;6876;6884;6892;6900;6953:3;6941:9;6932:7;6928:23;6924:33;6921:53;;;6970:1;6967;6960:12;6921:53;7006:9;6993:23;6983:33;;7063:2;7052:9;7048:18;7035:32;7025:42;;7114:2;7103:9;7099:18;7086:32;7076:42;;7165:2;7154:9;7150:18;7137:32;7127:42;;7220:3;7209:9;7205:19;7192:33;-1:-1:-1;;;;;7240:6:1;7237:30;7234:50;;;7280:1;7277;7270:12;7363:592;7458:6;7466;7474;7482;7535:3;7523:9;7514:7;7510:23;7506:33;7503:53;;;7552:1;7549;7542:12;7503:53;7591:9;7578:23;7610:31;7635:5;7610:31;:::i;:::-;7660:5;-1:-1:-1;7712:2:1;7697:18;;7684:32;;-1:-1:-1;7763:2:1;7748:18;;7735:32;;-1:-1:-1;7818:2:1;7803:18;;7790:32;-1:-1:-1;;;;;7834:30:1;;7831:50;;;7877:1;7874;7867:12;7831:50;7900:49;7941:7;7932:6;7921:9;7917:22;7900:49;:::i;:::-;7890:59;;;7363:592;;;;;;;:::o;8643:585::-;8721:6;8729;8782:2;8770:9;8761:7;8757:23;8753:32;8750:52;;;8798:1;8795;8788:12;8750:52;8837:9;8824:23;8856:31;8881:5;8856:31;:::i;:::-;8906:5;-1:-1:-1;8962:2:1;8947:18;;8934:32;-1:-1:-1;;;;;8978:30:1;;8975:50;;;9021:1;9018;9011:12;8975:50;9044:22;;9097:4;9089:13;;9085:27;-1:-1:-1;9075:55:1;;9126:1;9123;9116:12;9075:55;9149:73;9214:7;9209:2;9196:16;9191:2;9187;9183:11;9149:73;:::i;:::-;9139:83;;;8643:585;;;;;:::o;9642:251::-;9712:6;9765:2;9753:9;9744:7;9740:23;9736:32;9733:52;;;9781:1;9778;9771:12;9733:52;9813:9;9807:16;9832:31;9857:5;9832:31;:::i;9898:470::-;10100:2;10082:21;;;10139:2;10119:18;;;10112:30;10178:34;10173:2;10158:18;;10151:62;10249:34;10244:2;10229:18;;10222:62;-1:-1:-1;;;10315:3:1;10300:19;;10293:33;10358:3;10343:19;;9898:470::o;10373:127::-;10434:10;10429:3;10425:20;10422:1;10415:31;10465:4;10462:1;10455:15;10489:4;10486:1;10479:15;10505:972;10759:4;10807:3;10796:9;10792:19;10838:6;10827:9;10820:25;10864:2;10902:6;10897:2;10886:9;10882:18;10875:34;10945:3;10940:2;10929:9;10925:18;10918:31;10969:6;11004;10998:13;11035:6;11027;11020:22;11073:3;11062:9;11058:19;11051:26;;11112:2;11104:6;11100:15;11086:29;;11133:1;11143:195;11157:6;11154:1;11151:13;11143:195;;;11222:13;;-1:-1:-1;;;;;11218:39:1;11206:52;;11313:15;;;;11278:12;;;;11254:1;11172:9;11143:195;;;-1:-1:-1;;;;;;;11394:32:1;;;;11389:2;11374:18;;11367:60;-1:-1:-1;;;11458:3:1;11443:19;11436:35;11355:3;10505:972;-1:-1:-1;;;10505:972:1:o;11482:936::-;11577:6;11608:2;11651;11639:9;11630:7;11626:23;11622:32;11619:52;;;11667:1;11664;11657:12;11619:52;11700:9;11694:16;-1:-1:-1;;;;;11770:2:1;11762:6;11759:14;11756:34;;;11786:1;11783;11776:12;11756:34;11824:6;11813:9;11809:22;11799:32;;11869:7;11862:4;11858:2;11854:13;11850:27;11840:55;;11891:1;11888;11881:12;11840:55;11920:2;11914:9;11942:2;11938;11935:10;11932:36;;;11948:18;;:::i;:::-;11994:2;11991:1;11987:10;11977:20;;12017:28;12041:2;12037;12033:11;12017:28;:::i;:::-;12079:15;;;12149:11;;;12145:20;;;12110:12;;;;12177:19;;;12174:39;;;12209:1;12206;12199:12;12174:39;12233:11;;;;12253:135;12269:6;12264:3;12261:15;12253:135;;;12335:10;;12323:23;;12286:12;;;;12366;;;;12253:135;;;12407:5;11482:936;-1:-1:-1;;;;;;;;11482:936:1:o;13154:127::-;13215:10;13210:3;13206:20;13203:1;13196:31;13246:4;13243:1;13236:15;13270:4;13267:1;13260:15;13286:168;13326:7;13392:1;13388;13384:6;13380:14;13377:1;13374:21;13369:1;13362:9;13355:17;13351:45;13348:71;;;13399:18;;:::i;:::-;-1:-1:-1;13439:9:1;;13286:168::o;13459:217::-;13499:1;13525;13515:132;;13569:10;13564:3;13560:20;13557:1;13550:31;13604:4;13601:1;13594:15;13632:4;13629:1;13622:15;13515:132;-1:-1:-1;13661:9:1;;13459:217::o;13681:125::-;13721:4;13749:1;13746;13743:8;13740:34;;;13754:18;;:::i;:::-;-1:-1:-1;13791:9:1;;13681:125::o;13811:128::-;13851:3;13882:1;13878:6;13875:1;13872:13;13869:39;;;13888:18;;:::i;:::-;-1:-1:-1;13924:9:1;;13811:128::o;13944:184::-;14014:6;14067:2;14055:9;14046:7;14042:23;14038:32;14035:52;;;14083:1;14080;14073:12;14035:52;-1:-1:-1;14106:16:1;;13944:184;-1:-1:-1;13944:184:1:o;14513:277::-;14580:6;14633:2;14621:9;14612:7;14608:23;14604:32;14601:52;;;14649:1;14646;14639:12;14601:52;14681:9;14675:16;14734:5;14727:13;14720:21;14713:5;14710:32;14700:60;;14756:1;14753;14746:12;14795:356;14997:2;14979:21;;;15016:18;;;15009:30;15075:34;15070:2;15055:18;;15048:62;15142:2;15127:18;;14795:356::o;15564:398::-;15766:2;15748:21;;;15805:2;15785:18;;;15778:30;15844:34;15839:2;15824:18;;15817:62;-1:-1:-1;;;15910:2:1;15895:18;;15888:32;15952:3;15937:19;;15564:398::o;16729:400::-;16931:2;16913:21;;;16970:2;16950:18;;;16943:30;17009:34;17004:2;16989:18;;16982:62;-1:-1:-1;;;17075:2:1;17060:18;;17053:34;17119:3;17104:19;;16729:400::o;17892:274::-;-1:-1:-1;;;;;18084:32:1;;;;18066:51;;18148:2;18133:18;;18126:34;18054:2;18039:18;;17892:274::o;19090:258::-;19162:1;19172:113;19186:6;19183:1;19180:13;19172:113;;;19262:11;;;19256:18;19243:11;;;19236:39;19208:2;19201:10;19172:113;;;19303:6;19300:1;19297:13;19294:48;;;19338:1;19329:6;19324:3;19320:16;19313:27;19294:48;;19090:258;;;:::o;19353:581::-;19519:4;19565:1;19561;19556:3;19552:11;19548:19;19606:2;19598:6;19594:15;19583:9;19576:34;19658:2;19650:6;19646:15;19641:2;19630:9;19626:18;19619:43;;19698:2;19693;19682:9;19678:18;19671:30;19730:6;19724:13;19773:6;19768:2;19757:9;19753:18;19746:34;19789:67;19849:6;19843:3;19832:9;19828:19;19823:2;19815:6;19811:15;19789:67;:::i;:::-;19917:2;19896:15;-1:-1:-1;;19892:29:1;19877:45;;;;19924:3;19873:55;;19353:581;-1:-1:-1;;;;19353:581:1:o;25559:642::-;25830:3;25868:6;25862:13;25884:53;25930:6;25925:3;25918:4;25910:6;25906:17;25884:53;:::i;:::-;25959:16;;;;25984:21;;;-1:-1:-1;26032:4:1;26021:16;;26014:32;;;;26073:2;26062:14;;26055:30;;;;26112:2;26101:14;;26094:30;26151:3;26140:15;;26133:31;26191:3;26180:15;;25559:642;-1:-1:-1;25559:642:1:o;26617:415::-;26819:2;26801:21;;;26858:2;26838:18;;;26831:30;26897:34;26892:2;26877:18;;26870:62;-1:-1:-1;;;26963:2:1;26948:18;;26941:49;27022:3;27007:19;;26617:415::o;27454:::-;27656:2;27638:21;;;27695:2;27675:18;;;27668:30;27734:34;27729:2;27714:18;;27707:62;-1:-1:-1;;;27800:2:1;27785:18;;27778:49;27859:3;27844:19;;27454:415::o;28280:501::-;28467:3;28499:26;28495:31;28568:2;28559:6;28555:2;28551:15;28547:24;28542:3;28535:37;28623:2;28614:6;28610:2;28606:15;28602:24;28597:2;28592:3;28588:12;28581:46;;28656:6;28650:13;28672:62;28727:6;28722:2;28717:3;28713:12;28706:4;28698:6;28694:17;28672:62;:::i;:::-;28754:16;;;;28772:2;28750:25;;28280:501;-1:-1:-1;;;;28280:501:1:o

Swarm Source

ipfs://4cc2bde00a492991e1a9b527ecd1f700144af50a7ca16cc861339d416b826911
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading