Contract 0xd42ef222d33e3cb771dda783f48885e15c9d5ced 1

Contract Overview

Balance:
66,584.402808026781956148 HT

HT Value:
$948,161.90 (@ $14.24/HT)

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xe3b811658e7e101b1dc87ea5305616705facff6be35be7e2c2ed0d5ae8f3b97aOp Position83308652021-09-17 13:46:594 mins ago0xb5dbc27e89f085a9307c6be23381879da0f7262d IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.0023322285
0x6cdf82e1f91e5f65e72cc18c556d4928f16e1b26992d90d467f96a3bd11be802Op Position83308332021-09-17 13:45:235 mins ago0xb5dbc27e89f085a9307c6be23381879da0f7262d IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.00177680475
0x62c2a9d9ae9c13572e55acea77cbf364050ac2921a719d96ac8985c1e4608175Withdraw83307342021-09-17 13:40:2610 mins ago0x1992fda0451bb387d2ebe5292acb1c39feac1ae6 IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.000273078
0x5b5cebc465357724c1977ddfe5b5ba02e932720c5a5588dd880860207d95dc67Deposit83307202021-09-17 13:39:4411 mins ago0xdaf9d152ba915692dbbcd6a4a8ad626ffe9129b2 IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.00028607175
0x7022233a1328839e1803710f082cbf949653af95684b56f2ed260392e0a78dcbWithdraw83306432021-09-17 13:35:5315 mins ago0x2a32614f55587b128c79711f1b2ae884a041a32f IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.0002722995
0x285f750ca4a44fb29368b6c671bc58858b5983e676c6db064194977c8395b905Withdraw83306312021-09-17 13:35:1716 mins ago0x2a32614f55587b128c79711f1b2ae884a041a32f IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.000273051
0xbfdc010b53d981015d56290cc0b3dc4e253969ef4580b80edf03aaa0ce30bbc3Op Position83306192021-09-17 13:34:4116 mins ago0x9b9d278fa5fc49b6ff9954fa1acbd9ba4d03f4bb IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.0021947625
0xc7de62baa2865882812ca16f4b09d34dec65a444b1b84ae298f355c977296a1aDeposit83305832021-09-17 13:32:5318 mins ago0x22f9f2ed05f7f5c686246e1aceee557e760e0994 IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.0003256155
0x8176a4e0cd2d66029ec18fe98884385ba65c71519698d106cfc712c0c432da8cOp Position83304202021-09-17 13:24:4426 mins ago0x810bf1c0167cb409f5929ac7990b6165696009d2 IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.0016294545
0x9d447f65af91968bdb3e7b93c4d9558dca5e89bd9a4d214ef0a530aa02e07cf2Op Position83304082021-09-17 13:24:0827 mins ago0xa9fb4b4d4d52fc23085762e9d6ef466f5c90f50f IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced35 HT0.001999332
0xe0508fd7a4472bdf4be668930bb40362603c3e9dd5145b1d5a7a36ac18df242bOp Position83303812021-09-17 13:22:4728 mins ago0xa9fb4b4d4d52fc23085762e9d6ef466f5c90f50f IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.00228338325
0x598be7d6da1757fb4ec085fdbcd61720399021330f6ae947636e871388812cdeOp Position83303682021-09-17 13:22:0829 mins ago0xa9fb4b4d4d52fc23085762e9d6ef466f5c90f50f IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.001549566
0xf96e9fcdc55a4936f36004e806f8a4d5c34648548ae42a189c92d91d88dfdf81Deposit83303652021-09-17 13:21:5929 mins ago0x6568dac91751540448b384b25112e808aa85d1b4 IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.0002918655
0xafe7dda26df8aab2b6dd69b4d2dac87b72ed006c8cbb09640be9b2c1a182d5c1Op Position83303562021-09-17 13:21:3229 mins ago0x167c99c9701348d12cebfa52bf3bf40e8ae4f282 IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.001836198
0xb55bf63a451328990e6a21b2fd089c6674f8f1d5880aa3d4021fa5ae87a38a1eOp Position83303532021-09-17 13:21:2329 mins ago0xdd0f4c2e5a1f1fb2061070301798cbd9093e2014 IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.0019783395
0x778f9c1cebc03904e37bafdd46d46a7d9f0c1586a1dd8d41002c8fbf042e718cOp Position83303442021-09-17 13:20:5630 mins ago0xa9fb4b4d4d52fc23085762e9d6ef466f5c90f50f IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.00220842675
0xc140069157d77ae61baee0467705cc0eec328fe0ae6c83208e40ecdbc61e664dOp Position83303392021-09-17 13:20:4130 mins ago0xdd0f4c2e5a1f1fb2061070301798cbd9093e2014 IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.00131637825
0xaeb26947bc1498bcffc9986110116435e6b9882910e9d3cc344b3bb67bd30a31Withdraw83302922021-09-17 13:18:2032 mins ago0x91a0e269427834a18229c43b24784a994e5bb63b IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.000273105
0x24f948f644a3a3e6dadfb667870e5d894f455cc82f33ad27359d16c9df38df24Op Position83302772021-09-17 13:17:3533 mins ago0x9b9d278fa5fc49b6ff9954fa1acbd9ba4d03f4bb IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.00125408025
0x0f532ee180533d2cb669dc2f5aa1cd77ee237a89fc89262d975a03cafdfbbe9fOp Position83302182021-09-17 13:14:3836 mins ago0x4a0f2965a06089c6f311c5ad091073bdacc3667e IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.0018264015
0x6c79d79a270ab79aea6b24a9bc5f211148f554f4492332c022809a7beb3b37e9Op Position83301702021-09-17 13:12:1439 mins ago0xc10a3b3d608be2f6d30d2675208330f0639e3638 IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0.12971793 HT0.001760319
0x20421a3dffebf4b10e1c9d9c7ed36c923a9c1e38b34152c3b0647ea12648bbeeDeposit83301322021-09-17 13:10:2040 mins ago0xfc57badd8d85794fc82beb8296dea84f3a935cc8 IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.0002887335
0xd273a13bd291900653fc25a85e9fa37a792db48c4219d2155e0aad3deda7facdOp Position83301242021-09-17 13:09:5641 mins ago0xa4cca9561437e05f882fa466e8ebc9f356c0cd16 IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.00115682175
0x5a7da91168b41f85f17ea7618c79a031192fafd5b6eb3f3a7c128250be0365dfOp Position83300912021-09-17 13:08:1743 mins ago0xa4cca9561437e05f882fa466e8ebc9f356c0cd16 IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0.09832815 HT0.00174727575
0x0f2942a1238249e6355eb6fb95e89ddb0bb294be54ed26bd56d2e2b8f046525bOp Position83300852021-09-17 13:07:5943 mins ago0xa9fb4b4d4d52fc23085762e9d6ef466f5c90f50f IN  0xd42ef222d33e3cb771dda783f48885e15c9d5ced0 HT0.0022849785
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x68b40c5da533c7d6400008bec0af8c8f446e734a70367cf9c48a41d1d8e389ab83306342021-09-17 13:35:2615 mins ago 0x4d643681d9e7f4b15a26bd85c84f44bdc3fd31a0 0xd42ef222d33e3cb771dda783f48885e15c9d5ced241.758005960547577278 HT
0x9d447f65af91968bdb3e7b93c4d9558dca5e89bd9a4d214ef0a530aa02e07cf283304082021-09-17 13:24:0827 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced 0x158713931e312da65ec48a57aaca18a05543badc35 HT
0xb55bf63a451328990e6a21b2fd089c6674f8f1d5880aa3d4021fa5ae87a38a1e83303532021-09-17 13:21:2329 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced 0x9c4fd97af7f2061acf91211f57c88fe7ebc1c620293.267700675771 HT
0xc140069157d77ae61baee0467705cc0eec328fe0ae6c83208e40ecdbc61e664d83303392021-09-17 13:20:4130 mins ago 0xebc7b94e0e9151148ae2bdef6b55f094b71dbf45 0xd42ef222d33e3cb771dda783f48885e15c9d5ced296.10991892043261448 HT
0x6c79d79a270ab79aea6b24a9bc5f211148f554f4492332c022809a7beb3b37e983301702021-09-17 13:12:1439 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced 0x944e964f5d1b4a3c09d9aaa957de5785b907c88e0.12971793 HT
0x5a7da91168b41f85f17ea7618c79a031192fafd5b6eb3f3a7c128250be0365df83300912021-09-17 13:08:1743 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced 0x944e964f5d1b4a3c09d9aaa957de5785b907c88e0.09832815 HT
0x2bf89a69cb786df9f719219b69f3e0439337fb6e1a96a5e2fff9713ed8d57dac83292082021-09-17 12:24:061 hr 27 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced 0x4d643681d9e7f4b15a26bd85c84f44bdc3fd31a022.976997551328006741 HT
0x61c52d6cb78e6f86a5a37a4bc37b8913108090e733ee02af210eda18241401dc83291392021-09-17 12:20:391 hr 30 mins ago 0x158713931e312da65ec48a57aaca18a05543badc 0xd42ef222d33e3cb771dda783f48885e15c9d5ced2 wei
0x61c52d6cb78e6f86a5a37a4bc37b8913108090e733ee02af210eda18241401dc83291392021-09-17 12:20:391 hr 30 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced 0x158713931e312da65ec48a57aaca18a05543badc93.52361552992146 HT
0x4843db06b9558fd26c08ff485b77f5fad26854bb9b5a4ed71afd2bcf7ce9c72083290332021-09-17 12:15:211 hr 35 mins ago 0x4d643681d9e7f4b15a26bd85c84f44bdc3fd31a0 0xd42ef222d33e3cb771dda783f48885e15c9d5ced23.014708570712997353 HT
0x6d760840211128136dccb85955a7c70de1f52ce21416fcc009b046f34d3d32a383286522021-09-17 11:56:181 hr 55 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced0xbfef9cb0e0bfc34087af07cbad4312a0f64b817b724.008851916156751068 HT
0x1b0e762352027e0ef8f947a9cc85282c459526aaa89f1ae88a384bbf88a580c883283332021-09-17 11:40:212 hrs 10 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced0xc758a653adb0d3623c9505c669f712716410d124664.201753802038405504 HT
0x3905805774261dddb682ab5d35f2faa0d2b9e8e94fca319d9a40194ef6c03acd83274892021-09-17 10:58:092 hrs 53 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced 0x944e964f5d1b4a3c09d9aaa957de5785b907c88e0.1145294 HT
0xd968200ab8d3e0f9bc486d285cdfc4100b27b3687062b03d4a73ded3d40ed7a483260432021-09-17 9:45:514 hrs 5 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced 0x67fa892f2df9330ea0aeed1f0b6070fb9e3520110.002695197449976266 HT
0x17009679b4bd923f89a7879ff688ebf469ea91ff1b7214d240b8bd9864c6135783260362021-09-17 9:45:304 hrs 5 mins ago 0x67fa892f2df9330ea0aeed1f0b6070fb9e352011 0xd42ef222d33e3cb771dda783f48885e15c9d5ced2 wei
0x17009679b4bd923f89a7879ff688ebf469ea91ff1b7214d240b8bd9864c6135783260362021-09-17 9:45:304 hrs 5 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced 0x67fa892f2df9330ea0aeed1f0b6070fb9e3520110.002 HT
0x0e9110026d89b54f2bd6ed762034f30a277bf9ac3ef801c493a04568cec477c983256612021-09-17 9:26:454 hrs 24 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced0x4b74d1317f03c33826d17c3782003458f69985c30.709288023207741288 HT
0xb072e395e37449174a3d4b5d7c4ab8b7ffc4ce07e5fc624674cc39480fea47b083252412021-09-17 9:05:454 hrs 45 mins ago 0x4ace0fa2598faa3ac0ad5d9e05fa44195c3fbfff 0xd42ef222d33e3cb771dda783f48885e15c9d5ced42.744081710283425 HT
0x46f949c86800675140fabda4b957951f7fe01f1f726527fe0dd1b424f0d5d1e983251882021-09-17 9:03:064 hrs 48 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced0xb06e2e3aeb5195f81d2ff5b5de2c49cd4591c46c2 wei
0x46f949c86800675140fabda4b957951f7fe01f1f726527fe0dd1b424f0d5d1e983251882021-09-17 9:03:064 hrs 48 mins ago 0x67fa892f2df9330ea0aeed1f0b6070fb9e352011 0xd42ef222d33e3cb771dda783f48885e15c9d5ced2 wei
0x46f949c86800675140fabda4b957951f7fe01f1f726527fe0dd1b424f0d5d1e983251882021-09-17 9:03:064 hrs 48 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced 0x67fa892f2df9330ea0aeed1f0b6070fb9e3520110.40998989 HT
0x007d9777297a4587918a8bba804af996e350a0f888d248fb3695c2035ce8d51483249452021-09-17 8:50:575 hrs ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced 0x944e964f5d1b4a3c09d9aaa957de5785b907c88e1.68776027 HT
0x270ccfd666dc40a9e5d5ce3ff8c65197854275a05dbe43322e26f820e52da2df83246232021-09-17 8:34:515 hrs 16 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced0x8f570e5003b70a88d44c8e7dc94021f93a524ff9100.000185185791813754 HT
0x869c646ec2c7a7381303ccb8dd9456ddf3242a5904515c58e0cc51c36d0b1f1b83245582021-09-17 8:31:365 hrs 19 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced0xe01f001238b43f1f285df82910a735b7071a704163.000108443812058198 HT
0xf5783a26359040b549b6d05df0ab94819c056f4a04f2bdaf073db24b1e1de29b83241182021-09-17 8:09:365 hrs 41 mins ago 0xd42ef222d33e3cb771dda783f48885e15c9d5ced 0x944e964f5d1b4a3c09d9aaa957de5785b907c88e0.3 HT
[ Download CSV Export 
Loading

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x9cbc85d501d0175aa228301e3be8ef737fd19fff

Contract Name:
Bank

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-03-08
*/

// File: openzeppelin-solidity-2.3.0/contracts/utils/ReentrancyGuard.sol

pragma solidity ^0.5.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier
 * available, which can be aplied 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.
 */
contract ReentrancyGuard {
    /// @dev counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor () internal {
        // The counter starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardCounter = 1;
    }

    /**
     * @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() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

// File: openzeppelin-solidity-2.3.0/contracts/ownership/Ownable.sol

pragma solidity ^0.5.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be aplied to your functions to restrict their use to
 * the owner.
 */
contract Ownable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * > Note: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: openzeppelin-solidity-2.3.0/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

// File: openzeppelin-solidity-2.3.0/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */
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.
     *
     * > 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: openzeppelin-solidity-2.3.0/contracts/token/ERC20/ERC20.sol

pragma solidity ^0.5.0;



/**
 * @dev Implementation of the `IERC20` interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using `_mint`.
 * For a generic mechanism see `ERC20Mintable`.
 *
 * *For a detailed writeup see our guide [How to implement supply
 * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an `Approval` event is emitted on calls to `transferFrom`.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard `decreaseAllowance` and `increaseAllowance`
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See `IERC20.approve`.
 */
contract ERC20 is IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    /**
     * @dev See `IERC20.totalSupply`.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See `IERC20.balanceOf`.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See `IERC20.transfer`.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    /**
     * @dev See `IERC20.allowance`.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See `IERC20.approve`.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev See `IERC20.transferFrom`.
     *
     * Emits an `Approval` event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of `ERC20`;
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `value`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to `transfer`, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a `Transfer` event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a `Transfer` event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

     /**
     * @dev Destoys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a `Transfer` event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 value) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _totalSupply = _totalSupply.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an `Approval` event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    /**
     * @dev Destoys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See `_burn` and `_approve`.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
    }
}

// File: openzeppelin-solidity-2.3.0/contracts/math/Math.sol

pragma solidity ^0.5.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

// File: contracts/SafeToken.sol

pragma solidity ^0.5.16;

interface ERC20Interface {
    function balanceOf(address user) external view returns (uint256);
}

library SafeToken {
    function myBalance(address token) internal view returns (uint256) {
        return ERC20Interface(token).balanceOf(address(this));
    }

    function balanceOf(address token, address user) internal view returns (uint256) {
        return ERC20Interface(token).balanceOf(user);
    }

    function safeApprove(address token, address to, uint256 value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeApprove");
    }

    function safeTransfer(address token, address to, uint256 value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeTransfer");
    }

    function safeTransferFrom(address token, address from, address to, uint256 value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeTransferFrom");
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call.value(value)(new bytes(0));
        require(success, "!safeTransferETH");
    }
}

// File: contracts/PToken.sol

pragma solidity ^0.5.16;






contract PToken is ERC20, Ownable {
    using SafeToken for address;
    using SafeMath for uint256;

    string public name = "";
    string public symbol = "";
    uint8 public decimals = 18;

    event Mint(address sender, address account, uint amount);
    event Burn(address sender, address account, uint amount);

    constructor(string memory _symbol) public {
        name = _symbol;
        symbol = _symbol;
    }

    function mint(address account, uint256 amount) public onlyOwner {
        _mint(account, amount);
        emit Mint(msg.sender, account, amount);
    }

    function burn(address account, uint256 value) public onlyOwner {
        _burn(account, value);
        emit Burn(msg.sender, account, value);
    }
}

// File: contracts/PTokenFactory.sol

pragma solidity ^0.5.16;


contract PTokenFactory {

    function genPToken(string memory _symbol) public returns(address) {
        return address(new PToken(_symbol));
    }
}

// File: contracts/Goblin.sol

pragma solidity ^0.5.16;

interface Goblin {

    /// @dev Work on a (potentially new) position. Optionally send surplus token back to Bank.
    function work(uint256 id, address user, address borrowToken, uint256 borrow, uint256 debt, bytes calldata data) external payable;

    /// @dev Return the amount of ETH wei to get back if we are to liquidate the position.
    function health(uint256 id, address borrowToken) external view returns (uint256);

    /// @dev Liquidate the given position to token need. Send all ETH back to Bank.
    function liquidate(uint256 id, address user, address borrowToken) external;
}

// File: contracts/interfaces/IBankConfig.sol

pragma solidity ^0.5.16;

interface IBankConfig {

    function getInterestRate(uint256 debt, uint256 floating) external view returns (uint256);

    function getReserveBps() external view returns (uint256);

    function getLiquidateBps() external view returns (uint256);
}

// File: contracts/Bank.sol

pragma solidity ^0.5.16;









contract Bank is PTokenFactory, Ownable, ReentrancyGuard {
    using SafeToken for address;
    using SafeMath for uint256;

    event OpPosition(uint256 indexed id, uint256 debt, uint back);
    event Liquidate(uint256 indexed id, address indexed killer, uint256 prize, uint256 left);

    struct TokenBank {
        address tokenAddr;
        address pTokenAddr;
        bool isOpen;
        bool canDeposit;
        bool canWithdraw;
        uint256 totalVal;
        uint256 totalDebt;
        uint256 totalDebtShare;
        uint256 totalReserve;
        uint256 lastInterestTime;
    }

    struct Production {
        address coinToken;
        address currencyToken;
        address borrowToken;
        bool isOpen;
        bool canBorrow;
        address goblin;
        uint256 minDebt;
        uint256 openFactor;
        uint256 liquidateFactor;
    }

    struct Position {
        address owner;
        uint256 productionId;
        uint256 debtShare;
    }

    IBankConfig config;

    mapping(address => TokenBank) public banks;

    mapping(uint256 => Production) public productions;
    uint256 public currentPid = 1;

    mapping(uint256 => Position) public positions;
    uint256 public currentPos = 1;

    modifier onlyEOA() {
        require(msg.sender == tx.origin, "not eoa");
        _;
    }

    constructor() public {}

    /// read
    function positionInfo(uint256 posId) public view returns (uint256, uint256, uint256, address) {
        Position storage pos = positions[posId];
        Production storage prod = productions[pos.productionId];

        return (pos.productionId, Goblin(prod.goblin).health(posId, prod.borrowToken),
            debtShareToVal(prod.borrowToken, pos.debtShare), pos.owner);
    }

    function totalToken(address token) public view returns (uint256) {
        TokenBank storage bank = banks[token];
        require(bank.isOpen, 'token not exists');

        uint balance = token == address(0)? address(this).balance: SafeToken.myBalance(token);
        balance = bank.totalVal < balance? bank.totalVal: balance;

        return balance.add(bank.totalDebt).sub(bank.totalReserve);
    }

    function debtShareToVal(address token, uint256 debtShare) public view returns (uint256) {
        TokenBank storage bank = banks[token];
        require(bank.isOpen, 'token not exists');

        if (bank.totalDebtShare == 0) return debtShare;
        return debtShare.mul(bank.totalDebt).div(bank.totalDebtShare);
    }

    function debtValToShare(address token, uint256 debtVal) public view returns (uint256) {
        TokenBank storage bank = banks[token];
        require(bank.isOpen, 'token not exists');

        if (bank.totalDebt == 0) return debtVal;
        return debtVal.mul(bank.totalDebtShare).div(bank.totalDebt);
    }


    /// write
    function deposit(address token, uint256 amount) external payable nonReentrant {
        TokenBank storage bank = banks[token];
        require(bank.isOpen && bank.canDeposit, 'Token not exist or cannot deposit');

        calInterest(token);

        if (token == address(0)) {//HT
            amount = msg.value;
        } else {
            SafeToken.safeTransferFrom(token, msg.sender, address(this), amount);
        }

        bank.totalVal = bank.totalVal.add(amount);
        uint256 total = totalToken(token).sub(amount);
        uint256 pTotal = PToken(bank.pTokenAddr).totalSupply();

        uint256 pAmount = (total == 0 || pTotal == 0) ? amount: amount.mul(pTotal).div(total);
        PToken(bank.pTokenAddr).mint(msg.sender, pAmount);
    }

    function withdraw(address token, uint256 pAmount) external nonReentrant {
        TokenBank storage bank = banks[token];
        require(bank.isOpen && bank.canWithdraw, 'Token not exist or cannot withdraw');

        calInterest(token);

        uint256 amount = pAmount.mul(totalToken(token)).div(PToken(bank.pTokenAddr).totalSupply());
        bank.totalVal = bank.totalVal.sub(amount);

        PToken(bank.pTokenAddr).burn(msg.sender, pAmount);

        if (token == address(0)) {//HT
            SafeToken.safeTransferETH(msg.sender, amount);
        } else {
            SafeToken.safeTransfer(token, msg.sender, amount);
        }
    }

    function opPosition(uint256 posId, uint256 pid, uint256 borrow, bytes calldata data)
    external payable onlyEOA nonReentrant {

        if (posId == 0) {
            posId = currentPos;
            currentPos ++;
            positions[posId].owner = msg.sender;
            positions[posId].productionId = pid;

        } else {
            require(posId < currentPos, "bad position id");
            require(positions[posId].owner == msg.sender, "not position owner");

            pid = positions[posId].productionId;
        }

        Production storage production = productions[pid];
        require(production.isOpen, 'Production not exists');

        require(borrow == 0 || production.canBorrow, "Production can not borrow");
        calInterest(production.borrowToken);

        uint256 debt = _removeDebt(positions[posId], production).add(borrow);
        bool isBorrowHt = production.borrowToken == address(0);

        uint256 sendHT = msg.value;
        uint256 beforeToken = 0;
        if (isBorrowHt) {
            sendHT = sendHT.add(borrow);
            require(sendHT <= address(this).balance && debt <= banks[production.borrowToken].totalVal, "insufficient HT in the bank");
            beforeToken = address(this).balance.sub(sendHT);

        } else {
            beforeToken = SafeToken.myBalance(production.borrowToken);
            require(borrow <= beforeToken && debt <= banks[production.borrowToken].totalVal, "insufficient borrowToken in the bank");
            beforeToken = beforeToken.sub(borrow);
            SafeToken.safeApprove(production.borrowToken, production.goblin, borrow);
        }

        Goblin(production.goblin).work.value(sendHT)(posId, msg.sender, production.borrowToken, borrow, debt, data);

        uint256 backToken = isBorrowHt? (address(this).balance.sub(beforeToken)) :
            SafeToken.myBalance(production.borrowToken).sub(beforeToken);

        if(backToken > debt) { //没有借款, 有剩余退款
            backToken = backToken.sub(debt);
            debt = 0;

            isBorrowHt? SafeToken.safeTransferETH(msg.sender, backToken):
                SafeToken.safeTransfer(production.borrowToken, msg.sender, backToken);

        } else if (debt > backToken) { //有借款
            debt = debt.sub(backToken);
            backToken = 0;

            require(debt >= production.minDebt, "too small debt size");
            uint256 health = Goblin(production.goblin).health(posId, production.borrowToken);
            require(health.mul(production.openFactor) >= debt.mul(10000), "bad work factor");

            _addDebt(positions[posId], production, debt);
        }
        emit OpPosition(posId, debt, backToken);
    }

    function liquidate(uint256 posId) external payable onlyEOA nonReentrant {
        Position storage pos = positions[posId];
        require(pos.debtShare > 0, "no debt");
        Production storage production = productions[pos.productionId];

        uint256 debt = _removeDebt(pos, production);

        uint256 health = Goblin(production.goblin).health(posId, production.borrowToken);
        require(health.mul(production.liquidateFactor) < debt.mul(10000), "can't liquidate");

        bool isHT = production.borrowToken == address(0);
        uint256 before = isHT? address(this).balance: SafeToken.myBalance(production.borrowToken);

        Goblin(production.goblin).liquidate(posId, pos.owner, production.borrowToken);

        uint256 back = isHT? address(this).balance: SafeToken.myBalance(production.borrowToken);
        back = back.sub(before);

        uint256 prize = back.mul(config.getLiquidateBps()).div(10000);
        uint256 rest = back.sub(prize);
        uint256 left = 0;

        if (prize > 0) {
            isHT? SafeToken.safeTransferETH(msg.sender, prize): SafeToken.safeTransfer(production.borrowToken, msg.sender, prize);
        }
        if (rest > debt) {
            left = rest.sub(debt);
            isHT? SafeToken.safeTransferETH(pos.owner, left): SafeToken.safeTransfer(production.borrowToken, pos.owner, left);
        } else {
            banks[production.borrowToken].totalVal = banks[production.borrowToken].totalVal.sub(debt).add(rest);
        }
        emit Liquidate(posId, msg.sender, prize, left);
    }

    function _addDebt(Position storage pos, Production storage production, uint256 debtVal) internal {
        if (debtVal == 0) {
            return;
        }

        TokenBank storage bank = banks[production.borrowToken];

        uint256 debtShare = debtValToShare(production.borrowToken, debtVal);
        pos.debtShare = pos.debtShare.add(debtShare);

        bank.totalVal = bank.totalVal.sub(debtVal);
        bank.totalDebtShare = bank.totalDebtShare.add(debtShare);
        bank.totalDebt = bank.totalDebt.add(debtVal);
    }

    function _removeDebt(Position storage pos, Production storage production) internal returns (uint256) {
        TokenBank storage bank = banks[production.borrowToken];

        uint256 debtShare = pos.debtShare;
        if (debtShare > 0) {
            uint256 debtVal = debtShareToVal(production.borrowToken, debtShare);
            pos.debtShare = 0;

            bank.totalVal = bank.totalVal.add(debtVal);
            bank.totalDebtShare = bank.totalDebtShare.sub(debtShare);
            bank.totalDebt = bank.totalDebt.sub(debtVal);
            return debtVal;
        } else {
            return 0;
        }
    }

    function updateConfig(IBankConfig _config) external onlyOwner {
        config = _config;
    }

    function addToken(address token, string calldata _symbol) external onlyOwner {
        TokenBank storage bank = banks[token];
        require(!bank.isOpen, 'token already exists');

        bank.isOpen = true;
        address pToken = genPToken(_symbol);
        bank.tokenAddr = token;
        bank.pTokenAddr = pToken;
        bank.canDeposit = true;
        bank.canWithdraw = true;
        bank.totalVal = 0;
        bank.totalDebt = 0;
        bank.totalDebtShare = 0;
        bank.totalReserve = 0;
        bank.lastInterestTime = now;
    }

    function updateToken(address token, bool canDeposit, bool canWithdraw) external onlyOwner {
        TokenBank storage bank = banks[token];
        require(bank.isOpen, 'token not exists');

        bank.canDeposit = canDeposit;
        bank.canWithdraw = canWithdraw;
    }

    function opProduction(uint256 pid, bool isOpen, bool canBorrow,
        address coinToken, address currencyToken, address borrowToken, address goblin,
        uint256 minDebt, uint256 openFactor, uint256 liquidateFactor) external onlyOwner {

        if(pid == 0){
            pid = currentPid;
            currentPid ++;
        } else {
            require(pid < currentPid, "bad production id");
        }

        Production storage production = productions[pid];
        production.isOpen = isOpen;
        production.canBorrow = canBorrow;
        // 地址一旦设置, 就不要再改, 可以添加新币对!
        production.coinToken = coinToken;
        production.currencyToken = currencyToken;
        production.borrowToken = borrowToken;
        production.goblin = goblin;

        production.minDebt = minDebt;
        production.openFactor = openFactor;
        production.liquidateFactor = liquidateFactor;
    }

    function calInterest(address token) public {
        TokenBank storage bank = banks[token];
        require(bank.isOpen, 'token not exists');

        if (now > bank.lastInterestTime) {
            uint256 timePast = now.sub(bank.lastInterestTime);
            uint256 totalDebt = bank.totalDebt;
            uint256 totalBalance = totalToken(token);

            uint256 ratePerSec = config.getInterestRate(totalDebt, totalBalance);
            uint256 interest = ratePerSec.mul(timePast).mul(totalDebt).div(1e18);

            uint256 toReserve = interest.mul(config.getReserveBps()).div(10000);
            bank.totalReserve = bank.totalReserve.add(toReserve);
            bank.totalDebt = bank.totalDebt.add(interest);
            bank.lastInterestTime = now;
        }
    }

    function withdrawReserve(address token, address to, uint256 value) external onlyOwner nonReentrant {
        TokenBank storage bank = banks[token];
        require(bank.isOpen, 'token not exists');

        uint balance = token == address(0)? address(this).balance: SafeToken.myBalance(token);
        if(balance >= bank.totalVal.add(value)) {
            //非deposit存入
        } else {
            bank.totalReserve = bank.totalReserve.sub(value);
            bank.totalVal = bank.totalVal.sub(value);
        }

        if (token == address(0)) {
            SafeToken.safeTransferETH(to, value);
        } else {
            SafeToken.safeTransfer(token, to, value);
        }
    }

    function() external payable {}
}

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"killer","type":"address"},{"indexed":false,"internalType":"uint256","name":"prize","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"left","type":"uint256"}],"name":"Liquidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"back","type":"uint256"}],"name":"OpPosition","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"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"addToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"banks","outputs":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"address","name":"pTokenAddr","type":"address"},{"internalType":"bool","name":"isOpen","type":"bool"},{"internalType":"bool","name":"canDeposit","type":"bool"},{"internalType":"bool","name":"canWithdraw","type":"bool"},{"internalType":"uint256","name":"totalVal","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"totalDebtShare","type":"uint256"},{"internalType":"uint256","name":"totalReserve","type":"uint256"},{"internalType":"uint256","name":"lastInterestTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"calInterest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"currentPid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentPos","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"debtShare","type":"uint256"}],"name":"debtShareToVal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"debtVal","type":"uint256"}],"name":"debtValToShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"genPToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"posId","type":"uint256"}],"name":"liquidate","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"posId","type":"uint256"},{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"borrow","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"opPosition","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"bool","name":"isOpen","type":"bool"},{"internalType":"bool","name":"canBorrow","type":"bool"},{"internalType":"address","name":"coinToken","type":"address"},{"internalType":"address","name":"currencyToken","type":"address"},{"internalType":"address","name":"borrowToken","type":"address"},{"internalType":"address","name":"goblin","type":"address"},{"internalType":"uint256","name":"minDebt","type":"uint256"},{"internalType":"uint256","name":"openFactor","type":"uint256"},{"internalType":"uint256","name":"liquidateFactor","type":"uint256"}],"name":"opProduction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"posId","type":"uint256"}],"name":"positionInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"positions","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"productionId","type":"uint256"},{"internalType":"uint256","name":"debtShare","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"productions","outputs":[{"internalType":"address","name":"coinToken","type":"address"},{"internalType":"address","name":"currencyToken","type":"address"},{"internalType":"address","name":"borrowToken","type":"address"},{"internalType":"bool","name":"isOpen","type":"bool"},{"internalType":"bool","name":"canBorrow","type":"bool"},{"internalType":"address","name":"goblin","type":"address"},{"internalType":"uint256","name":"minDebt","type":"uint256"},{"internalType":"uint256","name":"openFactor","type":"uint256"},{"internalType":"uint256","name":"liquidateFactor","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"totalToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IBankConfig","name":"_config","type":"address"}],"name":"updateConfig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"canDeposit","type":"bool"},{"internalType":"bool","name":"canWithdraw","type":"bool"}],"name":"updateToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"pAmount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdrawReserve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526001600555600160075534801561001a57600080fd5b50600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360018055614386806100776000396000f3fe6080604052600436106200016a5760003560e01c806380c3b8c211620000c75780639f776b6a11620000795780639f776b6a1462000792578063ae1914f814620007aa578063b2fd231f14620007f1578063c879d8c61462000809578063f2fde38b1462000846578063f3fef3a3146200087d576200016a565b806380c3b8c2146200058c57806389097a6a146200061f5780638bc6715e146200067c5780638da5cb5b14620006f85780638f32d59b146200071057806399fbab88146200073c576200016a565b8063415f12401162000121578063415f1240146200047057806347e7ef2414620004905780635cf3b15f14620004bf5780636cc919c814620004f6578063715018a6146200052d5780637db2768c1462000545576200016a565b806306175e9f146200016c57806315292f5314620002425780632512c19514620002cd5780632c8da560146200031c57806330c426f814620003b05780633e834e031462000439575b005b3480156200017957600080fd5b5062000226600480360360208110156200019257600080fd5b810190602081018135640100000000811115620001ae57600080fd5b820183602082011115620001c157600080fd5b80359060200191846001830284011164010000000083111715620001e457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550620008ba945050505050565b604080516001600160a01b039092168252519081900360200190f35b3480156200024f57600080fd5b5062000270600480360360208110156200026857600080fd5b50356200095a565b604080516001600160a01b039a8b168152988a1660208a01529689168888015294151560608801529215156080870152951660a085015260c084019490945260e08301939093526101008201929092529051908190036101200190f35b348015620002da57600080fd5b506200030a60048036036040811015620002f357600080fd5b506001600160a01b038135169060200135620009bb565b60408051918252519081900360200190f35b3480156200032957600080fd5b506200016a600480360360408110156200034257600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156200036e57600080fd5b8201836020820111156200038157600080fd5b80359060200191846001830284011164010000000083111715620003a457600080fd5b50909250905062000a74565b6200016a60048036036080811015620003c857600080fd5b81359160208101359160408201359190810190608081016060820135640100000000811115620003f757600080fd5b8201836020820111156200040a57600080fd5b803590602001918460018302840111640100000000831117156200042d57600080fd5b50909250905062000bfc565b3480156200044657600080fd5b506200016a600480360360208110156200045f57600080fd5b50356001600160a01b0316620013e2565b6200016a600480360360208110156200048857600080fd5b50356200162e565b6200016a60048036036040811015620004a857600080fd5b506001600160a01b03813516906020013562001ade565b348015620004cc57600080fd5b506200030a60048036036020811015620004e557600080fd5b50356001600160a01b031662001d3c565b3480156200050357600080fd5b506200016a600480360360208110156200051c57600080fd5b50356001600160a01b031662001e14565b3480156200053a57600080fd5b506200016a62001e81565b3480156200055257600080fd5b506200016a600480360360608110156200056b57600080fd5b506001600160a01b0381351690602081013515159060400135151562001f16565b3480156200059957600080fd5b50620005c360048036036020811015620005b257600080fd5b50356001600160a01b031662002001565b604080516001600160a01b039b8c16815299909a1660208a0152961515888a01529415156060880152921515608087015260a086019190915260c085015260e08401526101008301526101208201529051908190036101400190f35b3480156200062c57600080fd5b506200064d600480360360208110156200064557600080fd5b50356200206d565b604080519485526020850193909352838301919091526001600160a01b03166060830152519081900360800190f35b3480156200068957600080fd5b506200016a6004803603610140811015620006a357600080fd5b50803590602081013515159060408101351515906001600160a01b036060820135811691608081013582169160a082013581169160c08101359091169060e08101359061010081013590610120013562002153565b3480156200070557600080fd5b5062000226620022a4565b3480156200071d57600080fd5b5062000728620022b3565b604080519115158252519081900360200190f35b3480156200074957600080fd5b506200076a600480360360208110156200076257600080fd5b5035620022c4565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b3480156200079f57600080fd5b506200030a620022ef565b348015620007b757600080fd5b506200016a60048036036060811015620007d057600080fd5b506001600160a01b03813581169160208101359091169060400135620022f5565b348015620007fe57600080fd5b506200030a620024b8565b3480156200081657600080fd5b506200030a600480360360408110156200082f57600080fd5b506001600160a01b038135169060200135620024be565b3480156200085357600080fd5b506200016a600480360360208110156200086c57600080fd5b50356001600160a01b031662002560565b3480156200088a57600080fd5b506200016a60048036036040811015620008a357600080fd5b506001600160a01b038135169060200135620025b9565b600081604051620008cb9062003135565b60208082528251818301528251829160408301919085019080838360005b8381101562000903578181015183820152602001620008e9565b50505050905090810190601f168015620009315780820380516001836020036101000a031916815260200191505b5092505050604051809103906000f08015801562000953573d6000803e3d6000fd5b5092915050565b600460208190526000918252604090912080546001820154600283015460038401549484015460058501546006909501546001600160a01b0394851696938516958386169560ff600160a01b8604811696600160a81b909604169416929189565b6001600160a01b03821660009081526003602052604081206001810154600160a01b900460ff1662000a27576040805162461bcd60e51b815260206004820152601060248201526f746f6b656e206e6f742065786973747360801b604482015290519081900360640190fd5b600481015462000a3b578291505062000a6e565b62000a6a816004015462000a5d836003015486620027f190919063ffffffff16565b9063ffffffff6200285616565b9150505b92915050565b62000a7e620022b3565b62000abf576040805162461bcd60e51b815260206004820181905260248201526000805160206200430e833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090206001810154600160a01b900460ff161562000b30576040805162461bcd60e51b8152602060048201526014602482015273746f6b656e20616c72656164792065786973747360601b604482015290519081900360640190fd5b60018101805460ff60a01b1916600160a01b179055604080516020601f850181900481028201810190925283815260009162000b8891908690869081908401838280828437600092019190915250620008ba92505050565b82546001600160a01b039687166001600160a01b031991821617845560018401805460ff60b01b1960ff60a81b199990941692169190911796909616600160a81b1716600160b01b179094556000600282018190556003820181905560048201819055600582015542600690910155505050565b33321462000c3b576040805162461bcd60e51b81526020600482015260076024820152666e6f7420656f6160c81b604482015290519081900360640190fd5b600180548101908190558562000c8357600780546001808201909255600081815260066020526040902080546001600160a01b03191633178155909101869055955062000d42565b600754861062000ccc576040805162461bcd60e51b815260206004820152600f60248201526e189859081c1bdcda5d1a5bdb881a59608a1b604482015290519081900360640190fd5b6000868152600660205260409020546001600160a01b0316331462000d2d576040805162461bcd60e51b81526020600482015260126024820152713737ba103837b9b4ba34b7b71037bbb732b960711b604482015290519081900360640190fd5b60008681526006602052604090206001015494505b60008581526004602052604090206002810154600160a01b900460ff1662000da9576040805162461bcd60e51b815260206004820152601560248201527450726f64756374696f6e206e6f742065786973747360581b604482015290519081900360640190fd5b84158062000dc257506002810154600160a81b900460ff165b62000e14576040805162461bcd60e51b815260206004820152601960248201527f50726f64756374696f6e2063616e206e6f7420626f72726f7700000000000000604482015290519081900360640190fd5b600281015462000e2d906001600160a01b0316620013e2565b600087815260066020526040812062000e5b90879062000e4e9085620028c2565b9063ffffffff6200298316565b60028301549091506001600160a01b031615346000821562000f265762000e89828a63ffffffff6200298316565b915047821115801562000eba57506002808601546001600160a01b0316600090815260036020526040902001548411155b62000f0c576040805162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e7420485420696e207468652062616e6b0000000000604482015290519081900360640190fd5b62000f1e478363ffffffff620029de16565b905062000fe5565b600285015462000f3f906001600160a01b031662002a3c565b905080891115801562000f7057506002808601546001600160a01b0316600090815260036020526040902001548411155b62000fad5760405162461bcd60e51b81526004018080602001828103825260248152602001806200432e6024913960400191505060405180910390fd5b62000fbf818a63ffffffff620029de16565b6002860154600387015491925062000fe5916001600160a01b0391821691168b62002abb565b8460030160009054906101000a90046001600160a01b03166001600160a01b03166362896f1e838d338960020160009054906101000a90046001600160a01b03168e8a8f8f6040518963ffffffff1660e01b815260040180888152602001876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050985050505050505050506000604051808303818588803b158015620010d257600080fd5b505af1158015620010e7573d6000803e3d6000fd5b5050505050600083620011275760028601546200112190839062001114906001600160a01b031662002a3c565b9063ffffffff620029de16565b62001139565b62001139478363ffffffff620029de16565b905084811115620011955762001156818663ffffffff620029de16565b90506000945083620011835760028601546200117d906001600160a01b0316338362002c1c565b6200118f565b6200118f338262002d77565b62001354565b808511156200135457620011b0858263ffffffff620029de16565b945060009050856004015485101562001206576040805162461bcd60e51b8152602060048201526013602482015272746f6f20736d616c6c20646562742073697a6560681b604482015290519081900360640190fd5b60008660030160009054906101000a90046001600160a01b03166001600160a01b031663ee9e9bc98e8960020160009054906101000a90046001600160a01b03166040518363ffffffff1660e01b815260040180838152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b1580156200129557600080fd5b505afa158015620012aa573d6000803e3d6000fd5b505050506040513d6020811015620012c157600080fd5b50519050620012d98661271063ffffffff620027f116565b6005880154620012f190839063ffffffff620027f116565b101562001337576040805162461bcd60e51b815260206004820152600f60248201526e3130b2103bb7b935903330b1ba37b960891b604482015290519081900360640190fd5b60008d81526006602052604090206200135290888862002e78565b505b604080518681526020810183905281518e927f1d2404099727da061c9dd3ca867e4296c2a118f3cf04d89ccb4a6163f442290a928290030190a25050505050506001548114620013da576040805162461bcd60e51b815260206004820152601f602482015260008051602062004264833981519152604482015290519081900360640190fd5b505050505050565b6001600160a01b03811660009081526003602052604090206001810154600160a01b900460ff166200144e576040805162461bcd60e51b815260206004820152601060248201526f746f6b656e206e6f742065786973747360801b604482015290519081900360640190fd5b80600601544211156200162a57600062001476826006015442620029de90919063ffffffff16565b600383015490915060006200148b8562001d3c565b6002546040805163c6dfa13f60e01b8152600481018690526024810184905290519293506000926001600160a01b039092169163c6dfa13f91604480820192602092909190829003018186803b158015620014e557600080fd5b505afa158015620014fa573d6000803e3d6000fd5b505050506040513d60208110156200151157600080fd5b50519050600062001548670de0b6b3a764000062000a5d866200153b868a63ffffffff620027f116565b9063ffffffff620027f116565b90506000620015e261271062000a5d600260009054906101000a90046001600160a01b03166001600160a01b031663249c11bd6040518163ffffffff1660e01b815260040160206040518083038186803b158015620015a657600080fd5b505afa158015620015bb573d6000803e3d6000fd5b505050506040513d6020811015620015d257600080fd5b5051859063ffffffff620027f116565b6005880154909150620015fc908263ffffffff6200298316565b6005880155600387015462001618908363ffffffff6200298316565b60038801555050426006860155505050505b5050565b3332146200166d576040805162461bcd60e51b81526020600482015260076024820152666e6f7420656f6160c81b604482015290519081900360640190fd5b6001805481019081905560008281526006602052604090206002810154620016c6576040805162461bcd60e51b81526020600482015260076024820152661b9bc81919589d60ca1b604482015290519081900360640190fd5b6001810154600090815260046020526040812090620016e68383620028c2565b600383015460028401546040805163ee9e9bc960e01b8152600481018a90526001600160a01b0392831660248201529051939450600093919092169163ee9e9bc9916044808301926020929190829003018186803b1580156200174857600080fd5b505afa1580156200175d573d6000803e3d6000fd5b505050506040513d60208110156200177457600080fd5b505190506200178c8261271063ffffffff620027f116565b6006840154620017a490839063ffffffff620027f116565b10620017e9576040805162461bcd60e51b815260206004820152600f60248201526e63616e2774206c697175696461746560881b604482015290519081900360640190fd5b60028301546001600160a01b0316156000816200181f57600285015462001819906001600160a01b031662002a3c565b62001821565b475b60038601548754600288015460408051630180cdbb60e21b8152600481018e90526001600160a01b03938416602482015291831660448301525193945091169163060336ec9160648082019260009290919082900301818387803b1580156200188957600080fd5b505af11580156200189e573d6000803e3d6000fd5b50505050600082620018c9576002860154620018c3906001600160a01b031662002a3c565b620018cb565b475b9050620018df818363ffffffff620029de16565b905060006200193d61271062000a5d600260009054906101000a90046001600160a01b03166001600160a01b031663c8792e246040518163ffffffff1660e01b815260040160206040518083038186803b158015620015a657600080fd5b9050600062001953838363ffffffff620029de16565b905060008215620019915785620019855760028901546200197f906001600160a01b0316338562002c1c565b62001991565b62001991338462002d77565b87821115620019f757620019ac828963ffffffff620029de16565b905085620019da5760028901548a54620019d4916001600160a01b0390811691168362002c1c565b620019f1565b8954620019f1906001600160a01b03168262002d77565b62001a4f565b6002808a01546001600160a01b03166000908152600360205260409020015462001a2f90839062000e4e908b63ffffffff620029de16565b6002808b01546001600160a01b0316600090815260036020526040902001555b6040805184815260208101839052815133928f927fd47e75cd6a3c0e59e63919b525eb69ce3bfd7f8de011363e440f2c58273f74d9929081900390910190a35050505050505050505060015481146200162a576040805162461bcd60e51b815260206004820152601f602482015260008051602062004264833981519152604482015290519081900360640190fd5b6001805481018082556001600160a01b038416600090815260036020526040902091820154909190600160a01b900460ff16801562001b2857506001810154600160a81b900460ff165b62001b655760405162461bcd60e51b8152600401808060200182810382526021815260200180620042cc6021913960400191505060405180910390fd5b62001b7084620013e2565b6001600160a01b03841662001b885734925062001b96565b62001b968433308662002f2c565b600281015462001bad908463ffffffff6200298316565b6002820155600062001bc484620011148762001d3c565b905060008260010160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801562001c1957600080fd5b505afa15801562001c2e573d6000803e3d6000fd5b505050506040513d602081101562001c4557600080fd5b50519050600082158062001c57575081155b62001c795762001c738362000a5d888563ffffffff620027f116565b62001c7b565b855b6001850154604080516340c10f1960e01b81523360048201526024810184905290519293506001600160a01b03909116916340c10f199160448082019260009290919082900301818387803b15801562001cd457600080fd5b505af115801562001ce9573d6000803e3d6000fd5b5050505050505050600154811462001d37576040805162461bcd60e51b815260206004820152601f602482015260008051602062004264833981519152604482015290519081900360640190fd5b505050565b6001600160a01b03811660009081526003602052604081206001810154600160a01b900460ff1662001da8576040805162461bcd60e51b815260206004820152601060248201526f746f6b656e206e6f742065786973747360801b604482015290519081900360640190fd5b60006001600160a01b0384161562001dcb5762001dc58462002a3c565b62001dcd565b475b90508082600201541062001de2578062001de8565b81600201545b905062001e0c8260050154620011148460030154846200298390919063ffffffff16565b949350505050565b62001e1e620022b3565b62001e5f576040805162461bcd60e51b815260206004820181905260248201526000805160206200430e833981519152604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b62001e8b620022b3565b62001ecc576040805162461bcd60e51b815260206004820181905260248201526000805160206200430e833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b62001f20620022b3565b62001f61576040805162461bcd60e51b815260206004820181905260248201526000805160206200430e833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090206001810154600160a01b900460ff1662001fcd576040805162461bcd60e51b815260206004820152601060248201526f746f6b656e206e6f742065786973747360801b604482015290519081900360640190fd5b6001018054911515600160b01b0260ff60b01b19931515600160a81b0260ff60a81b19909316929092179290921617905550565b600360208190526000918252604090912080546001820154600283015493830154600484015460058501546006909501546001600160a01b03948516969484169560ff600160a01b8604811696600160a81b8704821696600160b01b900490911694909390929091908a565b60008181526006602090815260408083206001810154808552600480855283862060038101546002820154865163ee9e9bc960e01b81529384018a90526001600160a01b039081166024850152955188978897889796949593169263ee9e9bc99260448083019392829003018186803b158015620020ea57600080fd5b505afa158015620020ff573d6000803e3d6000fd5b505050506040513d60208110156200211657600080fd5b50516002808401549085015462002137916001600160a01b031690620009bb565b935491999098509296506001600160a01b031694509092505050565b6200215d620022b3565b6200219e576040805162461bcd60e51b815260206004820181905260248201526000805160206200430e833981519152604482015290519081900360640190fd5b89620021b7576005805460018101909155995062002202565b6005548a1062002202576040805162461bcd60e51b8152602060048201526011602482015270189859081c1c9bd91d58dd1a5bdb881a59607a1b604482015290519081900360640190fd5b6000998a52600460208190526040909a2060028101805482546001600160a01b03199081166001600160a01b039b8c1617845560018401805482169a8c169a909a1790995560ff60a01b1916600160a01b9b15159b909b029a909a1760ff60a81b1916600160a81b9915159990990298909817861694871694909417909755600386018054909416919094161790915593820155600581019190915560060155565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b6006602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b60075481565b620022ff620022b3565b62002340576040805162461bcd60e51b815260206004820181905260248201526000805160206200430e833981519152604482015290519081900360640190fd5b6001805481018082556001600160a01b038516600090815260036020526040902091820154909190600160a01b900460ff16620023b7576040805162461bcd60e51b815260206004820152601060248201526f746f6b656e206e6f742065786973747360801b604482015290519081900360640190fd5b60006001600160a01b03861615620023da57620023d48662002a3c565b620023dc565b475b6002830154909150620023f6908563ffffffff6200298316565b811062002403576200243c565b60058201546200241a908563ffffffff620029de16565b6005830155600282015462002436908563ffffffff620029de16565b60028301555b6001600160a01b0386166200245d5762002457858562002d77565b6200246a565b6200246a86868662002c1c565b50506001548114620024b2576040805162461bcd60e51b815260206004820152601f602482015260008051602062004264833981519152604482015290519081900360640190fd5b50505050565b60055481565b6001600160a01b03821660009081526003602052604081206001810154600160a01b900460ff166200252a576040805162461bcd60e51b815260206004820152601060248201526f746f6b656e206e6f742065786973747360801b604482015290519081900360640190fd5b60038101546200253e578291505062000a6e565b62000a6a816003015462000a5d836004015486620027f190919063ffffffff16565b6200256a620022b3565b620025ab576040805162461bcd60e51b815260206004820181905260248201526000805160206200430e833981519152604482015290519081900360640190fd5b620025b68162003093565b50565b6001805481018082556001600160a01b038416600090815260036020526040902091820154909190600160a01b900460ff1680156200260357506001810154600160b01b900460ff165b620026405760405162461bcd60e51b8152600401808060200182810382526022815260200180620042846022913960400191505060405180910390fd5b6200264b84620013e2565b6000620026ed8260010160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015620026a257600080fd5b505afa158015620026b7573d6000803e3d6000fd5b505050506040513d6020811015620026ce57600080fd5b505162000a5d620026df8862001d3c565b879063ffffffff620027f116565b600283015490915062002707908263ffffffff620029de16565b6002830155600182015460408051632770a7eb60e21b81523360048201526024810187905290516001600160a01b0390921691639dc29fac9160448082019260009290919082900301818387803b1580156200276257600080fd5b505af115801562002777573d6000803e3d6000fd5b505050506001600160a01b0385166200279c5762002796338262002d77565b620027a9565b620027a985338362002c1c565b5050600154811462001d37576040805162461bcd60e51b815260206004820152601f602482015260008051602062004264833981519152604482015290519081900360640190fd5b600082620028025750600062000a6e565b828202828482816200281057fe5b04146200284f5760405162461bcd60e51b8152600401808060200182810382526021815260200180620042ed6021913960400191505060405180910390fd5b9392505050565b6000808211620028ad576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481620028b957fe5b04949350505050565b6002808201546001600160a01b03166000908152600360205260408120918401549091908015620029775760028401546000906200290a906001600160a01b031683620009bb565b60006002808901919091558401549091506200292d908263ffffffff6200298316565b6002840155600483015462002949908363ffffffff620029de16565b6004840155600383015462002965908263ffffffff620029de16565b60039093019290925550905062000a6e565b60009250505062000a6e565b6000828201838110156200284f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008282111562002a36576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801562002a8757600080fd5b505afa15801562002a9c573d6000803e3d6000fd5b505050506040513d602081101562002ab357600080fd5b505192915050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b6020831062002b3a5780518252601f19909201916020918201910162002b19565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811462002b9e576040519150601f19603f3d011682016040523d82523d6000602084013e62002ba3565b606091505b509150915081801562002bd457508051158062002bd4575080806020019051602081101562002bd157600080fd5b50515b62002c15576040805162461bcd60e51b815260206004820152600c60248201526b2173616665417070726f766560a01b604482015290519081900360640190fd5b5050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831062002c9b5780518252601f19909201916020918201910162002c7a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811462002cff576040519150601f19603f3d011682016040523d82523d6000602084013e62002d04565b606091505b509150915081801562002d3557508051158062002d35575080806020019051602081101562002d3257600080fd5b50515b62002c15576040805162461bcd60e51b815260206004820152600d60248201526c10b9b0b332aa3930b739b332b960991b604482015290519081900360640190fd5b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831062002dc55780518252601f19909201916020918201910162002da4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811462002e29576040519150601f19603f3d011682016040523d82523d6000602084013e62002e2e565b606091505b505090508062001d37576040805162461bcd60e51b815260206004820152601060248201526f042e6c2cccaa8e4c2dce6cccae48aa8960831b604482015290519081900360640190fd5b8062002e845762001d37565b60028201546001600160a01b031660008181526003602052604081209162002ead9084620024be565b600286015490915062002ec7908263ffffffff6200298316565b60028087019190915582015462002ee5908463ffffffff620029de16565b6002830155600482015462002f01908263ffffffff6200298316565b6004830155600382015462002f1d908463ffffffff6200298316565b82600301819055505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831062002fb35780518252601f19909201916020918201910162002f92565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811462003017576040519150601f19603f3d011682016040523d82523d6000602084013e6200301c565b606091505b50915091508180156200304d5750805115806200304d57508080602001905160208110156200304a57600080fd5b50515b620013da576040805162461bcd60e51b815260206004820152601160248201527021736166655472616e7366657246726f6d60781b604482015290519081900360640190fd5b6001600160a01b038116620030da5760405162461bcd60e51b8152600401808060200182810382526026815260200180620042a66026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61112080620031448339019056fe60a06040819052600060808190526200001b91600491620001ae565b506040805160208101918290526000908190526200003c91600591620001ae565b506006805460ff191660121790553480156200005757600080fd5b506040516200112038038062001120833981810160405260208110156200007d57600080fd5b81019080805160405193929190846401000000008211156200009e57600080fd5b908301906020820185811115620000b457600080fd5b8251640100000000811182820188101715620000cf57600080fd5b82525081516020918201929091019080838360005b83811015620000fe578181015183820152602001620000e4565b50505050905090810190601f1680156200012c5780820380516001836020036101000a031916815260200191505b506040819052600380546001600160a01b0319163317908190556001600160a01b03169350600092507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091508290a3805162000190906004906020840190620001ae565b508051620001a6906005906020840190620001ae565b505062000253565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001f157805160ff191683800117855562000221565b8280016001018555821562000221579182015b828111156200022157825182559160200191906001019062000204565b506200022f92915062000233565b5090565b6200025091905b808211156200022f57600081556001016200023a565b90565b610ebd80620002636000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c8063715018a6116100a25780639dc29fac116100715780639dc29fac146102f7578063a457c2d714610323578063a9059cbb1461034f578063dd62ed3e1461037b578063f2fde38b146103a95761010b565b8063715018a6146102bb5780638da5cb5b146102c35780638f32d59b146102e757806395d89b41146102ef5761010b565b8063313ce567116100de578063313ce5671461021d578063395093511461023b57806340c10f191461026757806370a08231146102955761010b565b806306fdde0314610110578063095ea7b31461018d57806318160ddd146101cd57806323b872dd146101e7575b600080fd5b6101186103cf565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561015257818101518382015260200161013a565b50505050905090810190601f16801561017f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101b9600480360360408110156101a357600080fd5b506001600160a01b03813516906020013561045d565b604080519115158252519081900360200190f35b6101d5610473565b60408051918252519081900360200190f35b6101b9600480360360608110156101fd57600080fd5b506001600160a01b03813581169160208101359091169060400135610479565b6102256104d0565b6040805160ff9092168252519081900360200190f35b6101b96004803603604081101561025157600080fd5b506001600160a01b0381351690602001356104d9565b6102936004803603604081101561027d57600080fd5b506001600160a01b038135169060200135610515565b005b6101d5600480360360208110156102ab57600080fd5b50356001600160a01b03166105b2565b6102936105cd565b6102cb61065e565b604080516001600160a01b039092168252519081900360200190f35b6101b961066d565b61011861067e565b6102936004803603604081101561030d57600080fd5b506001600160a01b0381351690602001356106d9565b6101b96004803603604081101561033957600080fd5b506001600160a01b038135169060200135610776565b6101b96004803603604081101561036557600080fd5b506001600160a01b0381351690602001356107b2565b6101d56004803603604081101561039157600080fd5b506001600160a01b03813581169160200135166107bf565b610293600480360360208110156103bf57600080fd5b50356001600160a01b03166107ea565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104555780601f1061042a57610100808354040283529160200191610455565b820191906000526020600020905b81548152906001019060200180831161043857829003601f168201915b505050505081565b600061046a33848461083d565b50600192915050565b60025490565b6000610486848484610929565b6001600160a01b0384166000908152600160209081526040808320338085529252909120546104c69186916104c1908663ffffffff610a6b16565b61083d565b5060019392505050565b60065460ff1681565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161046a9185906104c1908663ffffffff610ac816565b61051d61066d565b61055c576040805162461bcd60e51b81526020600482018190526024820152600080516020610dff833981519152604482015290519081900360640190fd5b6105668282610b29565b604080513381526001600160a01b038416602082015280820183905290517fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f89181900360600190a15050565b6001600160a01b031660009081526020819052604090205490565b6105d561066d565b610614576040805162461bcd60e51b81526020600482018190526024820152600080516020610dff833981519152604482015290519081900360640190fd5b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380546001600160a01b0319169055565b6003546001600160a01b031690565b6003546001600160a01b0316331490565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104555780601f1061042a57610100808354040283529160200191610455565b6106e161066d565b610720576040805162461bcd60e51b81526020600482018190526024820152600080516020610dff833981519152604482015290519081900360640190fd5b61072a8282610c19565b604080513381526001600160a01b038416602082015280820183905290517fbac40739b0d4ca32fa2d82fc91630465ba3eddd1598da6fca393b26fb63b94539181900360600190a15050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161046a9185906104c1908663ffffffff610a6b16565b600061046a338484610929565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6107f261066d565b610831576040805162461bcd60e51b81526020600482018190526024820152600080516020610dff833981519152604482015290519081900360640190fd5b61083a81610cf2565b50565b6001600160a01b0383166108825760405162461bcd60e51b8152600401808060200182810382526024815260200180610e656024913960400191505060405180910390fd5b6001600160a01b0382166108c75760405162461bcd60e51b8152600401808060200182810382526022815260200180610ddd6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661096e5760405162461bcd60e51b8152600401808060200182810382526025815260200180610e406025913960400191505060405180910390fd5b6001600160a01b0382166109b35760405162461bcd60e51b8152600401808060200182810382526023815260200180610d946023913960400191505060405180910390fd5b6001600160a01b0383166000908152602081905260409020546109dc908263ffffffff610a6b16565b6001600160a01b038085166000908152602081905260408082209390935590841681522054610a11908263ffffffff610ac816565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082821115610ac2576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015610b22576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216610b84576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254610b97908263ffffffff610ac816565b6002556001600160a01b038216600090815260208190526040902054610bc3908263ffffffff610ac816565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216610c5e5760405162461bcd60e51b8152600401808060200182810382526021815260200180610e1f6021913960400191505060405180910390fd5b600254610c71908263ffffffff610a6b16565b6002556001600160a01b038216600090815260208190526040902054610c9d908263ffffffff610a6b16565b6001600160a01b038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b6001600160a01b038116610d375760405162461bcd60e51b8152600401808060200182810382526026815260200180610db76026913960400191505060405180910390fd5b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0319166001600160a01b039290921691909117905556fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a72315820cb9bd50988f409f80a0c362607cd36de77fc69fddb325ad94d1c3518742de7a564736f6c634300051000325265656e7472616e637947756172643a207265656e7472616e742063616c6c00546f6b656e206e6f74206578697374206f722063616e6e6f742077697468647261774f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373546f6b656e206e6f74206578697374206f722063616e6e6f74206465706f736974536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572696e73756666696369656e7420626f72726f77546f6b656e20696e207468652062616e6ba265627a7a72315820629963919872789c4e483a0a5226901c03e6d469d93ba00c83dfcc220d0e234864736f6c63430005100032

Deployed ByteCode Sourcemap

23484:13387:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22278:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22278:120:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22278:120:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;22278:120:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22278:120:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;22278:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;22278:120:0;;-1:-1:-1;22278:120:0;;-1:-1:-1;;;;;22278:120:0:i;:::-;;;;-1:-1:-1;;;;;22278:120:0;;;;;;;;;;;;;;24579:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24579:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24579:49:0;;:::i;:::-;;;;-1:-1:-1;;;;;24579:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25715:326;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25715:326:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25715:326:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33498:562;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33498:562:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;33498:562:0;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;33498:562:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;33498:562:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;33498:562:0;;-1:-1:-1;33498:562:0;-1:-1:-1;33498:562:0;:::i;27837:2761::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;27837:2761:0;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;27837:2761:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27837:2761:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;27837:2761:0;;-1:-1:-1;27837:2761:0;-1:-1:-1;27837:2761:0;:::i;35319:796::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35319:796:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35319:796:0;-1:-1:-1;;;;;35319:796:0;;:::i;30606:1584::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30606:1584:0;;:::i;26389:772::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26389:772:0;;;;;;;;:::i;25299:408::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25299:408:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25299:408:0;-1:-1:-1;;;;;25299:408:0;;:::i;33393:97::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33393:97:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33393:97:0;-1:-1:-1;;;;;33393:97:0;;:::i;3309:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3309:140:0;;;:::i;34068:279::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34068:279:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;34068:279:0;;;;;;;;;;;;;;;;;:::i;24528:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24528:42:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24528:42:0;-1:-1:-1;;;;;24528:42:0;;:::i;:::-;;;;-1:-1:-1;;;;;24528:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24909:382;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24909:382:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24909:382:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24909:382:0;;;;;;;;;;;;;;34355:956;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34355:956:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;34355:956:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34355:956:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2498:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2498:79:0;;;:::i;2864:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2864:92:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;24673:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24673:45:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24673:45:0;;:::i;:::-;;;;-1:-1:-1;;;;;24673:45:0;;;;;;;;;;;;;;;;;;;;;;;;;24725:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24725:29:0;;;:::i;36123:707::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36123:707:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36123:707:0;;;;;;;;;;;;;;;;;:::i;24635:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24635:29:0;;;:::i;26049:315::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26049:315:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26049:315:0;;;;;;;;:::i;3604:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3604:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3604:109:0;-1:-1:-1;;;;;3604:109:0;;:::i;27169:660::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27169:660:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27169:660:0;;;;;;;;:::i;22278:120::-;22335:7;22381;22370:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;22370:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;22355:35:0;22278:120;-1:-1:-1;;22278:120:0:o;24579:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24579:49:0;;;;;;;;;;;;;-1:-1:-1;;;24579:49:0;;;;;-1:-1:-1;;;24579:49:0;;;;;;;;;:::o;25715:326::-;-1:-1:-1;;;;;25839:12:0;;25794:7;25839:12;;;:5;:12;;;;;25870:11;;;;-1:-1:-1;;;25870:11:0;;;;25862:40;;;;;-1:-1:-1;;;25862:40:0;;;;;;;;;;;;-1:-1:-1;;;25862:40:0;;;;;;;;;;;;;;;25919:19;;;;25915:46;;25952:9;25945:16;;;;;25915:46;25979:54;26013:4;:19;;;25979:29;25993:4;:14;;;25979:9;:13;;:29;;;;:::i;:::-;:33;:54;:33;:54;:::i;:::-;25972:61;;;25715:326;;;;;:::o;33498:562::-;2710:9;:7;:9::i;:::-;2702:54;;;;;-1:-1:-1;;;2702:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2702:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33611:12:0;;33586:22;33611:12;;;:5;:12;;;;;33643:11;;;;-1:-1:-1;;;33643:11:0;;;;33642:12;33634:45;;;;;-1:-1:-1;;;33634:45:0;;;;;;;;;;;;-1:-1:-1;;;33634:45:0;;;;;;;;;;;;;;;33706:4;33692:11;;:18;;-1:-1:-1;;;;33692:18:0;-1:-1:-1;;;33692:18:0;;;33738;;;;;;;;;;;;;;;;;;;;;;33692;;33738;;;33748:7;;;;;;33738:18;;33748:7;;;;33738:18;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;33738:9:0;;-1:-1:-1;;;33738:18:0:i;:::-;33767:22;;-1:-1:-1;;;;;33767:22:0;;;-1:-1:-1;;;;;;33767:22:0;;;;;;;33800:15;;:24;;-1:-1:-1;;;;;;;;33800:24:0;;;;;;;;;;33835:22;;;;-1:-1:-1;;;33835:22:0;33868:23;-1:-1:-1;;;33868:23:0;;;;33767:14;33902:13;;;:17;;;33930:14;;;:18;;;33959:19;;;:23;;;33993:17;;;:21;34049:3;34025:21;;;;:27;-1:-1:-1;;;33498:562:0:o;27837:2761::-;24801:10;24815:9;24801:23;24793:43;;;;;-1:-1:-1;;;24793:43:0;;;;;;;;;;;;-1:-1:-1;;;24793:43:0;;;;;;;;;;;;;;;1426:1;1409:18;;;;;;;;27982:10;27978:404;;28017:10;;;28042:13;;;;;;;:10;28070:16;;;:9;:16;;;;;:35;;-1:-1:-1;;;;;;28070:35:0;28095:10;28070:35;;;28120:29;;;:35;;;28017:10;-1:-1:-1;27978:404:0;;;28206:10;;28198:5;:18;28190:46;;;;;-1:-1:-1;;;28190:46:0;;;;;;;;;;;;-1:-1:-1;;;28190:46:0;;;;;;;;;;;;;;;28259:16;;;;:9;:16;;;;;:22;-1:-1:-1;;;;;28259:22:0;28285:10;28259:36;28251:67;;;;;-1:-1:-1;;;28251:67:0;;;;;;;;;;;;-1:-1:-1;;;28251:67:0;;;;;;;;;;;;;;;28341:16;;;;:9;:16;;;;;:29;;;;-1:-1:-1;27978:404:0;28394:29;28426:16;;;:11;:16;;;;;28461:17;;;;-1:-1:-1;;;28461:17:0;;;;28453:51;;;;;-1:-1:-1;;;28453:51:0;;;;;;;;;;;;-1:-1:-1;;;28453:51:0;;;;;;;;;;;;;;;28525:11;;;:35;;-1:-1:-1;28540:20:0;;;;-1:-1:-1;;;28540:20:0;;;;28525:35;28517:73;;;;;-1:-1:-1;;;28517:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28613:22;;;;28601:35;;-1:-1:-1;;;;;28613:22:0;28601:11;:35::i;:::-;28649:12;28676:16;;;:9;:16;;;;;28664:53;;28710:6;;28664:41;;28694:10;28664:11;:41::i;:::-;:45;:53;:45;:53;:::i;:::-;28746:22;;;;28649:68;;-1:-1:-1;;;;;;28746:22:0;:36;28812:9;28728:15;28866:634;;;;28906:18;:6;28917;28906:18;:10;:18;:::i;:::-;28897:27;;28957:21;28947:6;:31;;:81;;;;-1:-1:-1;28996:22:0;;;;;-1:-1:-1;;;;;28996:22:0;28990:29;;;;:5;:29;;;;;:38;;28982:46;;;28947:81;28939:121;;;;;-1:-1:-1;;;28939:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29089:33;:21;29115:6;29089:33;:25;:33;:::i;:::-;29075:47;;28866:634;;;29191:22;;;;29171:43;;-1:-1:-1;;;;;29191:22:0;29171:19;:43::i;:::-;29157:57;;29247:11;29237:6;:21;;:71;;;;-1:-1:-1;29276:22:0;;;;;-1:-1:-1;;;;;29276:22:0;29270:29;;;;:5;:29;;;;;:38;;29262:46;;;29237:71;29229:120;;;;-1:-1:-1;;;29229:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29378:23;:11;29394:6;29378:23;:15;:23;:::i;:::-;29438:22;;;;29462:17;;;;29364:37;;-1:-1:-1;29416:72:0;;-1:-1:-1;;;;;29438:22:0;;;;29462:17;29481:6;29416:21;:72::i;:::-;29519:10;:17;;;;;;;;;;-1:-1:-1;;;;;29519:17:0;-1:-1:-1;;;;;29512:30:0;;29549:6;29557:5;29564:10;29576;:22;;;;;;;;;;-1:-1:-1;;;;;29576:22:0;29600:6;29608:4;29614;;29512:107;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29512:107:0;-1:-1:-1;;;;;29512:107:0;;;;;;-1:-1:-1;;;;;29512:107:0;-1:-1:-1;;;;;29512:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;29512:107:0;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29512:107:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29512:107:0;;;;;29632:17;29652:10;:128;;29740:22;;;;29720:60;;29768:11;;29720:43;;-1:-1:-1;;;;;29740:22:0;29720:19;:43::i;:::-;:47;:60;:47;:60;:::i;:::-;29652:128;;;29665:38;:21;29691:11;29665:38;:25;:38;:::i;:::-;29632:148;;29808:4;29796:9;:16;29793:748;;;29873:19;:9;29887:4;29873:19;:13;:19;:::i;:::-;29861:31;;29914:1;29907:8;;29932:10;:148;;30034:22;;;;30011:69;;-1:-1:-1;;;;;30034:22:0;30058:10;30070:9;30011:22;:69::i;:::-;29932:148;;;29944:48;29970:10;29982:9;29944:25;:48::i;:::-;29793:748;;;30111:9;30104:4;:16;30100:441;;;30156:19;:4;30165:9;30156:19;:8;:19;:::i;:::-;30149:26;;30202:1;30190:13;;30236:10;:18;;;30228:4;:26;;30220:58;;;;;-1:-1:-1;;;30220:58:0;;;;;;;;;;;;-1:-1:-1;;;30220:58:0;;;;;;;;;;;;;;;30293:14;30317:10;:17;;;;;;;;;;-1:-1:-1;;;;;30317:17:0;-1:-1:-1;;;;;30310:32:0;;30343:5;30350:10;:22;;;;;;;;;;-1:-1:-1;;;;;30350:22:0;30310:63;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30310:63:0;-1:-1:-1;;;;;30310:63:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30310:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30310:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30310:63:0;;-1:-1:-1;30433:15:0;:4;30442:5;30433:15;:8;:15;:::i;:::-;30407:21;;;;30396:33;;:6;;:33;:10;:33;:::i;:::-;:52;;30388:80;;;;;-1:-1:-1;;;30388:80:0;;;;;;;;;;;;-1:-1:-1;;;30388:80:0;;;;;;;;;;;;;;;30494:16;;;;:9;:16;;;;;30485:44;;30512:10;30524:4;30485:8;:44::i;:::-;30100:441;;30556:34;;;;;;;;;;;;;;30567:5;;30556:34;;;;;;;;1485:1;;;;;;1521:13;;1505:12;:29;1497:73;;;;;-1:-1:-1;;;1497:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1497:73:0;;;;;;;;;;;;;;;24847:1;27837:2761;;;;;:::o;35319:796::-;-1:-1:-1;;;;;35398:12:0;;35373:22;35398:12;;;:5;:12;;;;;35429:11;;;;-1:-1:-1;;;35429:11:0;;;;35421:40;;;;;-1:-1:-1;;;35421:40:0;;;;;;;;;;;;-1:-1:-1;;;35421:40:0;;;;;;;;;;;;;;;35484:4;:21;;;35478:3;:27;35474:634;;;35522:16;35541:30;35549:4;:21;;;35541:3;:7;;:30;;;;:::i;:::-;35606:14;;;;35522:49;;-1:-1:-1;35586:17:0;35658;35669:5;35658:10;:17::i;:::-;35713:6;;:47;;;-1:-1:-1;;;35713:47:0;;;;;;;;;;;;;;;;35635:40;;-1:-1:-1;35692:18:0;;-1:-1:-1;;;;;35713:6:0;;;;:22;;:47;;;;;;;;;;;;;;;:6;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;35713:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35713:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35713:47:0;;-1:-1:-1;35775:16:0;35794:49;35838:4;35794:39;35823:9;35794:24;35713:47;35809:8;35794:24;:14;:24;:::i;:::-;:28;:39;:28;:39;:::i;:49::-;35775:68;;35860:17;35880:47;35921:5;35880:36;35893:6;;;;;;;;;-1:-1:-1;;;;;35893:6:0;-1:-1:-1;;;;;35893:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35893:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35893:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35893:22:0;35880:8;;:36;:12;:36;:::i;:47::-;35962:17;;;;35860:67;;-1:-1:-1;35962:32:0;;35860:67;35962:32;:21;:32;:::i;:::-;35942:17;;;:52;36026:14;;;;:28;;36045:8;36026:28;:18;:28;:::i;:::-;36009:14;;;:45;-1:-1:-1;;36093:3:0;36069:21;;;:27;-1:-1:-1;;;;35474:634:0;35319:796;;:::o;30606:1584::-;24801:10;24815:9;24801:23;24793:43;;;;;-1:-1:-1;;;24793:43:0;;;;;;;;;;;;-1:-1:-1;;;24793:43:0;;;;;;;;;;;;;;;1426:1;1409:18;;;;;;;;:13;30712:16;;;:9;:16;;;;;30747:13;;;;30739:37;;;;;-1:-1:-1;;;30739:37:0;;;;;;;;;;;;-1:-1:-1;;;30739:37:0;;;;;;;;;;;;;;;30831:16;;;;30787:29;30819;;;:11;:29;;;;;;30876:28;30831:3;30819:29;30876:11;:28::i;:::-;30941:17;;;;30974:22;;;;30934:63;;;-1:-1:-1;;;30934:63:0;;;;;;;;-1:-1:-1;;;;;30974:22:0;;;30934:63;;;;;;30861:43;;-1:-1:-1;30917:14:0;;30941:17;;;;;30934:32;;:63;;;;;;;;;;;;;;30941:17;30934:63;;;5:2:-1;;;;30:1;27;20:12;5:2;30934:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30934:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30934:63:0;;-1:-1:-1;31057:15:0;:4;31066:5;31057:15;:8;:15;:::i;:::-;31027:26;;;;31016:38;;:6;;:38;:10;:38;:::i;:::-;:56;31008:84;;;;;-1:-1:-1;;;31008:84:0;;;;;;;;;;;;-1:-1:-1;;;31008:84:0;;;;;;;;;;;;;;;31117:22;;;;-1:-1:-1;;;;;31117:22:0;:36;31105:9;31117:36;31181:72;;31230:22;;;;31210:43;;-1:-1:-1;;;;;31230:22:0;31210:19;:43::i;:::-;31181:72;;;31187:21;31181:72;31273:17;;;;31309:9;;31320:22;;;;31266:77;;;-1:-1:-1;;;31266:77:0;;;;;;;;-1:-1:-1;;;;;31309:9:0;;;31266:77;;;;31320:22;;;31266:77;;;;;31164:89;;-1:-1:-1;31273:17:0;;;31266:35;;:77;;;;;31273:17;;31266:77;;;;;;;;31273:17;;31266:77;;;5:2:-1;;;;30:1;27;20:12;5:2;31266:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31266:77:0;;;;31356:12;31371:4;:72;;31420:22;;;;31400:43;;-1:-1:-1;;;;;31420:22:0;31400:19;:43::i;:::-;31371:72;;;31377:21;31371:72;31356:87;-1:-1:-1;31461:16:0;31356:87;31470:6;31461:16;:8;:16;:::i;:::-;31454:23;;31490:13;31506:45;31545:5;31506:34;31515:6;;;;;;;;;-1:-1:-1;;;;;31515:6:0;-1:-1:-1;;;;;31515:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;31506:45:0;31490:61;-1:-1:-1;31562:12:0;31577:15;:4;31490:61;31577:15;:8;:15;:::i;:::-;31562:30;-1:-1:-1;31603:12:0;31636:9;;31632:159;;31662:4;:117;;31737:22;;;;31714:65;;-1:-1:-1;;;;;31737:22:0;31761:10;31773:5;31714:22;:65::i;:::-;31662:117;;;31668:44;31694:10;31706:5;31668:25;:44::i;:::-;31812:4;31805;:11;31801:325;;;31840:14;:4;31849;31840:14;:8;:14;:::i;:::-;31833:21;;31869:4;:113;;31942:22;;;;31966:9;;31919:63;;-1:-1:-1;;;;;31942:22:0;;;;31966:9;31977:4;31919:22;:63::i;:::-;31869:113;;;31901:9;;31875:42;;-1:-1:-1;;;;;31901:9:0;31912:4;31875:25;:42::i;:::-;31801:325;;;32062:22;;;;;-1:-1:-1;;;;;32062:22:0;32056:29;;;;:5;:29;;;;;:38;;:58;;32109:4;;32056:48;;32099:4;32056:48;:42;:48;:::i;:58::-;32021:22;;;;;-1:-1:-1;;;;;32021:22:0;32015:29;;;;:5;:29;;;;;:38;:99;31801:325;32141:41;;;;;;;;;;;;;;32158:10;;32151:5;;32141:41;;;;;;;;;;;1485:1;;;;;;;;;;1521:13;;1505:12;:29;1497:73;;;;;-1:-1:-1;;;1497:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1497:73:0;;;;;;;;;;;;;;26389:772;1426:1;1409:18;;;;;;;-1:-1:-1;;;;;26503:12:0;;-1:-1:-1;26503:12:0;;;:5;:12;;;;;26534:11;;;;1409:18;;26503:12;-1:-1:-1;;;26534:11:0;;;;:30;;;;-1:-1:-1;26549:15:0;;;;-1:-1:-1;;;26549:15:0;;;;26534:30;26526:76;;;;-1:-1:-1;;;26526:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26615:18;26627:5;26615:11;:18::i;:::-;-1:-1:-1;;;;;26650:19:0;;26646:175;;26699:9;26690:18;;26646:175;;;26741:68;26768:5;26775:10;26795:4;26802:6;26741:26;:68::i;:::-;26849:13;;;;:25;;26867:6;26849:25;:17;:25;:::i;:::-;26833:13;;;:41;26885:13;26901:29;26923:6;26901:17;26912:5;26901:10;:17::i;:29::-;26885:45;;26941:14;26965:4;:15;;;;;;;;;;-1:-1:-1;;;;;26965:15:0;-1:-1:-1;;;;;26958:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26958:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26958:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26958:37:0;;-1:-1:-1;27008:15:0;27027:10;;;:25;;-1:-1:-1;27041:11:0;;27027:25;27026:67;;27064:29;27087:5;27064:18;:6;27075;27064:18;:10;:18;:::i;:29::-;27026:67;;;27056:6;27026:67;27111:15;;;;27104:49;;;-1:-1:-1;;;27104:49:0;;27133:10;27104:49;;;;;;;;;;;;27008:85;;-1:-1:-1;;;;;;27111:15:0;;;;27104:28;;:49;;;;;27111:15;;27104:49;;;;;;;;27111:15;;27104:49;;;5:2:-1;;;;30:1;27;20:12;5:2;27104:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27104:49:0;;;;1485:1;;;;1521:13;;1505:12;:29;1497:73;;;;;-1:-1:-1;;;1497:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1497:73:0;;;;;;;;;;;;;;;26389:772;;;:::o;25299:408::-;-1:-1:-1;;;;;25400:12:0;;25355:7;25400:12;;;:5;:12;;;;;25431:11;;;;-1:-1:-1;;;25431:11:0;;;;25423:40;;;;;-1:-1:-1;;;25423:40:0;;;;;;;;;;;;-1:-1:-1;;;25423:40:0;;;;;;;;;;;;;;;25476:12;-1:-1:-1;;;;;25491:19:0;;;:70;;25535:26;25555:5;25535:19;:26::i;:::-;25491:70;;;25512:21;25491:70;25476:85;;25598:7;25582:4;:13;;;:23;:47;;25622:7;25582:47;;;25607:4;:13;;;25582:47;25572:57;;25649:50;25681:4;:17;;;25649:27;25661:4;:14;;;25649:7;:11;;:27;;;;:::i;:50::-;25642:57;25299:408;-1:-1:-1;;;;25299:408:0:o;33393:97::-;2710:9;:7;:9::i;:::-;2702:54;;;;;-1:-1:-1;;;2702:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2702:54:0;;;;;;;;;;;;;;;33466:6;:16;;-1:-1:-1;;;;;;33466:16:0;-1:-1:-1;;;;;33466:16:0;;;;;;;;;;33393:97::o;3309:140::-;2710:9;:7;:9::i;:::-;2702:54;;;;;-1:-1:-1;;;2702:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2702:54:0;;;;;;;;;;;;;;;3408:1;3392:6;;3371:40;;-1:-1:-1;;;;;3392:6:0;;;;3371:40;;3408:1;;3371:40;3439:1;3422:19;;-1:-1:-1;;;;;;3422:19:0;;;3309:140::o;34068:279::-;2710:9;:7;:9::i;:::-;2702:54;;;;;-1:-1:-1;;;2702:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2702:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34194:12:0;;34169:22;34194:12;;;:5;:12;;;;;34225:11;;;;-1:-1:-1;;;34225:11:0;;;;34217:40;;;;;-1:-1:-1;;;34217:40:0;;;;;;;;;;;;-1:-1:-1;;;34217:40:0;;;;;;;;;;;;;;;34270:15;;:28;;34309:30;;;-1:-1:-1;;;34309:30:0;-1:-1:-1;;;;34270:28:0;;;-1:-1:-1;;;34270:28:0;-1:-1:-1;;;;34270:28:0;;;;;;;34309:30;;;;;;;-1:-1:-1;34068:279:0:o;24528:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24528:42:0;;;;;;;;;-1:-1:-1;;;24528:42:0;;;;;-1:-1:-1;;;24528:42:0;;;;;-1:-1:-1;;;24528:42:0;;;;;;;;;;;;;;:::o;24909:382::-;24967:7;25037:16;;;:9;:16;;;;;;;;25102;;;;25090:29;;;:11;:29;;;;;;25165:11;;;;25192:16;;;;25158:51;;-1:-1:-1;;;25158:51:0;;;;;;;;-1:-1:-1;;;;;25192:16:0;;;25158:51;;;;;;24967:7;;;;;;25037:16;25090:29;;25165:11;;;25158:26;;:51;;;;;25037:16;25158:51;;;;;25165:11;25158:51;;;5:2:-1;;;;30:1;27;20:12;5:2;25158:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25158:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25158:51:0;25239:16;;;;;25257:13;;;;25224:47;;-1:-1:-1;;;;;25239:16:0;;25224:14;:47::i;:::-;25273:9;;25132:151;;;;-1:-1:-1;25273:9:0;;-1:-1:-1;;;;;;25273:9:0;;-1:-1:-1;24909:382:0;;-1:-1:-1;;;24909:382:0:o;34355:956::-;2710:9;:7;:9::i;:::-;2702:54;;;;;-1:-1:-1;;;2702:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2702:54:0;;;;;;;;;;;;;;;34613:8;34610:162;;34643:10;;;34668:13;;;;;;34643:10;-1:-1:-1;34610:162:0;;;34728:10;;34722:3;:16;34714:46;;;;;-1:-1:-1;;;34714:46:0;;;;;;;;;;;;-1:-1:-1;;;34714:46:0;;;;;;;;;;;;;;;34784:29;34816:16;;;:11;:16;;;;;;;;34843:17;;;:26;;34995:32;;-1:-1:-1;;;;;;34995:32:0;;;-1:-1:-1;;;;;34995:32:0;;;;;;-1:-1:-1;35038:24:0;;:40;;;;;;;;;;;;;;-1:-1:-1;;;;34843:26:0;-1:-1:-1;;;34843:26:0;;;;;;;;;;;-1:-1:-1;;;;34880:32:0;-1:-1:-1;;;34880:32:0;;;;;;;;;;;35089:36;;;;;;;;;;;;35136:17;;;:26;;;;;;;;;;;;;35175:18;;;:28;35214:21;;;:34;;;;35259:26;;:44;34355:956::o;2498:79::-;2536:7;2563:6;-1:-1:-1;;;;;2563:6:0;2498:79;:::o;2864:92::-;2904:4;2942:6;-1:-1:-1;;;;;2942:6:0;2928:10;:20;;2864:92::o;24673:45::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24673:45:0;;;;;;:::o;24725:29::-;;;;:::o;36123:707::-;2710:9;:7;:9::i;:::-;2702:54;;;;;-1:-1:-1;;;2702:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2702:54:0;;;;;;;;;;;;;;;1426:1;1409:18;;;;;;;-1:-1:-1;;;;;36258:12:0;;-1:-1:-1;36258:12:0;;;:5;:12;;;;;36289:11;;;;1409:18;;36258:12;-1:-1:-1;;;36289:11:0;;;;36281:40;;;;;-1:-1:-1;;;36281:40:0;;;;;;;;;;;;-1:-1:-1;;;36281:40:0;;;;;;;;;;;;;;;36334:12;-1:-1:-1;;;;;36349:19:0;;;:70;;36393:26;36413:5;36393:19;:26::i;:::-;36349:70;;;36370:21;36349:70;36444:13;;;;36334:85;;-1:-1:-1;36444:24:0;;36462:5;36444:24;:17;:24;:::i;:::-;36433:7;:35;36430:220;;;;;36555:17;;;;:28;;36577:5;36555:28;:21;:28;:::i;:::-;36535:17;;;:48;36614:13;;;;:24;;36632:5;36614:24;:17;:24;:::i;:::-;36598:13;;;:40;36430:220;-1:-1:-1;;;;;36666:19:0;;36662:161;;36702:36;36728:2;36732:5;36702:25;:36::i;:::-;36662:161;;;36771:40;36794:5;36801:2;36805:5;36771:22;:40::i;:::-;1485:1;;1521:13;;1505:12;:29;1497:73;;;;;-1:-1:-1;;;1497:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1497:73:0;;;;;;;;;;;;;;;2767:1;36123:707;;;:::o;24635:29::-;;;;:::o;26049:315::-;-1:-1:-1;;;;;26171:12:0;;26126:7;26171:12;;;:5;:12;;;;;26202:11;;;;-1:-1:-1;;;26202:11:0;;;;26194:40;;;;;-1:-1:-1;;;26194:40:0;;;;;;;;;;;;-1:-1:-1;;;26194:40:0;;;;;;;;;;;;;;;26251:14;;;;26247:39;;26279:7;26272:14;;;;;26247:39;26304:52;26341:4;:14;;;26304:32;26316:4;:19;;;26304:7;:11;;:32;;;;:::i;3604:109::-;2710:9;:7;:9::i;:::-;2702:54;;;;;-1:-1:-1;;;2702:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2702:54:0;;;;;;;;;;;;;;;3677:28;3696:8;3677:18;:28::i;:::-;3604:109;:::o;27169:660::-;1426:1;1409:18;;;;;;;-1:-1:-1;;;;;27277:12:0;;-1:-1:-1;27277:12:0;;;:5;:12;;;;;27308:11;;;;1409:18;;27277:12;-1:-1:-1;;;27308:11:0;;;;:31;;;;-1:-1:-1;27323:16:0;;;;-1:-1:-1;;;27323:16:0;;;;27308:31;27300:78;;;;-1:-1:-1;;;27300:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27391:18;27403:5;27391:11;:18::i;:::-;27422:14;27439:73;27481:4;:15;;;;;;;;;;-1:-1:-1;;;;;27481:15:0;-1:-1:-1;;;;;27474:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27474:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27474:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27474:37:0;27439:30;27451:17;27462:5;27451:10;:17::i;:::-;27439:7;;:30;:11;:30;:::i;:73::-;27539:13;;;;27422:90;;-1:-1:-1;27539:25:0;;27422:90;27539:25;:17;:25;:::i;:::-;27523:13;;;:41;27584:15;;;;27577:49;;;-1:-1:-1;;;27577:49:0;;27606:10;27577:49;;;;;;;;;;;;-1:-1:-1;;;;;27584:15:0;;;;27577:28;;:49;;;;;27584:15;;27577:49;;;;;;;;27584:15;;27577:49;;;5:2:-1;;;;30:1;27;20:12;5:2;27577:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;;;;27643:19:0;;27639:183;;27683:45;27709:10;27721:6;27683:25;:45::i;:::-;27639:183;;;27761:49;27784:5;27791:10;27803:6;27761:22;:49::i;:::-;1485:1;;1521:13;;1505:12;:29;1497:73;;;;;-1:-1:-1;;;1497:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1497:73:0;;;;;;;;;;;;;;5873:470;5931:7;6175:6;6171:47;;-1:-1:-1;6205:1:0;6198:8;;6171:47;6242:5;;;6246:1;6242;:5;:1;6266:5;;;;;:10;6258:56;;;;-1:-1:-1;;;6258:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6334:1;5873:470;-1:-1:-1;;;5873:470:0:o;6811:333::-;6869:7;6968:1;6964;:5;6956:44;;;;;-1:-1:-1;;;6956:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7011:9;7027:1;7023;:5;;;;;;;6811:333;-1:-1:-1;;;;6811:333:0:o;32751:634::-;32894:22;;;;;-1:-1:-1;;;;;32894:22:0;32843:7;32888:29;;;:5;:29;;;;;32950:13;;;;32843:7;;32888:29;32978:13;;32974:404;;33041:22;;;;33008:15;;33026:49;;-1:-1:-1;;;;;33041:22:0;33065:9;33026:14;:49::i;:::-;33106:1;33090:13;;;;:17;;;;33140:13;;;33008:67;;-1:-1:-1;33140:26:0;;33008:67;33140:26;:17;:26;:::i;:::-;33124:13;;;:42;33203:19;;;;:34;;33227:9;33203:34;:23;:34;:::i;:::-;33181:19;;;:56;33269:14;;;;:27;;33288:7;33269:27;:18;:27;:::i;:::-;33252:14;;;;:44;;;;-1:-1:-1;33318:7:0;-1:-1:-1;33311:14:0;;32974:404;33365:1;33358:8;;;;;;4982:181;5040:7;5072:5;;;5096:6;;;;5088:46;;;;;-1:-1:-1;;;5088:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5438:184;5496:7;5529:1;5524;:6;;5516:49;;;;;-1:-1:-1;;;5516:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5588:5:0;;;5438:184::o;19757:138::-;19841:46;;;-1:-1:-1;;;19841:46:0;;19881:4;19841:46;;;;;;19814:7;;-1:-1:-1;;;;;19841:31:0;;;;;:46;;;;;;;;;;;;;;;:31;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;19841:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19841:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19841:46:0;;19757:138;-1:-1:-1;;19757:138:0:o;20054:343::-;20250:45;;;-1:-1:-1;;;;;20250:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20250:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20239:57:0;;;;20204:12;;20218:17;;20239:10;;;;20250:45;20239:57;;;25:18:-1;20239:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20239:57:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;20203:93:0;;;;20315:7;:57;;;;-1:-1:-1;20327:11:0;;:16;;:44;;;20358:4;20347:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20347:24:0;20327:44;20307:82;;;;;-1:-1:-1;;;20307:82:0;;;;;;;;;;;;-1:-1:-1;;;20307:82:0;;;;;;;;;;;;;;;20054:343;;;;;:::o;20405:346::-;20603:45;;;-1:-1:-1;;;;;20603:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20603:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20592:57:0;;;;20557:12;;20571:17;;20592:10;;;;20603:45;20592:57;;;25:18:-1;20592:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20592:57:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;20556:93:0;;;;20668:7;:57;;;;-1:-1:-1;20680:11:0;;:16;;:44;;;20711:4;20700:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20700:24:0;20680:44;20660:83;;;;;-1:-1:-1;;;20660:83:0;;;;;;;;;;;;-1:-1:-1;;;20660:83:0;;;;;;;;;;;;;;21153:180;21265:12;;;21226;21265;;;;;;;;;-1:-1:-1;;;;;21244:7:0;;;21258:5;;21244:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;21244:34:0;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;21225:53:0;;;21297:7;21289:36;;;;;-1:-1:-1;;;21289:36:0;;;;;;;;;;;;-1:-1:-1;;;21289:36:0;;;;;;;;;;;;;;32198:545;32310:12;32306:51;;32339:7;;32306:51;32400:22;;;;-1:-1:-1;;;;;32400:22:0;32369;32394:29;;;:5;:29;;;;;;32456:47;;32495:7;32456:14;:47::i;:::-;32530:13;;;;32436:67;;-1:-1:-1;32530:28:0;;32436:67;32530:28;:17;:28;:::i;:::-;32514:13;;;;:44;;;;32587:13;;;:26;;32605:7;32587:26;:17;:26;:::i;:::-;32571:13;;;:42;32646:19;;;;:34;;32670:9;32646:34;:23;:34;:::i;:::-;32624:19;;;:56;32708:14;;;;:27;;32727:7;32708:27;:18;:27;:::i;:::-;32691:4;:14;;:44;;;;32198:545;;;;;:::o;20759:386::-;20987:51;;;-1:-1:-1;;;;;20987:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20987:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20976:63:0;;;;20941:12;;20955:17;;20976:10;;;;20987:51;20976:63;;;25:18:-1;20976:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20976:63:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;20940:99:0;;;;21058:7;:57;;;;-1:-1:-1;21070:11:0;;:16;;:44;;;21101:4;21090:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21090:24:0;21070:44;21050:87;;;;;-1:-1:-1;;;21050:87:0;;;;;;;;;;;;-1:-1:-1;;;21050:87:0;;;;;;;;;;;;;;3819:229;-1:-1:-1;;;;;3893:22:0;;3885:73;;;;-1:-1:-1;;;3885:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3995:6;;;3974:38;;-1:-1:-1;;;;;3974:38:0;;;;3995:6;;;3974:38;;;4023:6;:17;;-1:-1:-1;;;;;;4023:17:0;-1:-1:-1;;;;;4023:17:0;;;;;;;;;;3819:229::o;23484:13387::-;;;;;;;;:::o

Swarm Source

bzzr://629963919872789c4e483a0a5226901c03e6d469d93ba00c83dfcc220d0e2348
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading