Contract 0xC5E9dDebb09Cd64DfaCab4011A0D5cEDaf7c9BDb 15

 
Txn Hash
Method
Block
From
To
Value
0xc78260a27811aa47b4016af055f9f6fbac789f8f9758592fe03192a2f96406ddAdd Submission(pending)2022-08-11 14:18:4740 mins ago0xd009480783dd2ef95db5ffc01debceb9b11b78ec IN Proof of Humanity0.‍0012 Ether(Pending)(Pending)
0xca42c61e37d7cd795ed84261fd0afeffe83596196113e45e7b89532b16242be6Add Submission(pending)2022-08-11 12:17:182 hrs 42 mins ago0x9fbe55e7fdb11b353e5b491eeee3dc2ca72e9226 IN Proof of Humanity0 Ether(Pending)(Pending)
0x65758aff34935f351a0025db3d401a0631f4a460fc6a1ffab4a4bb9589c907f6Remove Submissio...(pending)2022-08-10 7:14:151 day 7 hrs ago0x5dce0b2f2bc6a806ad1ee43bcee0edd86877025c IN Proof of Humanity0.‍175 Ether(Pending)(Pending)
0xe011ce59d1f88a9b169012d6e4259f014c27f7bd0772d850c7aa839f598aea08Remove Submissio...(pending)2022-08-10 7:12:161 day 7 hrs ago0x5dce0b2f2bc6a806ad1ee43bcee0edd86877025c IN Proof of Humanity0.‍175 Ether(Pending)(Pending)
0xafddb302200f7d01e67abd9dc60d5709d999960d4dcf8f720d01996582f821d9Add Submission(pending)2022-08-08 10:58:363 days 4 hrs ago0x16930c3cd406029b3715b848a3a788b2d78c3f38 IN Proof of Humanity0.‍125 Ether(Pending)(Pending)
0x53b2b081495cabfec8595d039043a667cc819d3633cfa35a5e95562081c39512Withdraw Submiss...(pending)2022-08-07 2:40:104 days 12 hrs ago0x88b2bf83d287d5c0dcfa229fb1b32d4787475330 IN Proof of Humanity0 Ether(Pending)(Pending)
0x69de0653f8fccdee1826f53db466a07ff7c93e1548138850e838e1b1ca35409aAdd Submission(pending)2022-08-07 2:28:274 days 12 hrs ago0xf92770c0d9eb6d7ca92fe46986125c5902d4e1b5 IN Proof of Humanity0 Ether(Pending)(Pending)
0xa9354f2c6b13a5519aec0dc192b7d4811f4df512d68318e5baee56e966b31582Add Submission(pending)2022-08-07 2:00:264 days 12 hrs ago0xfd9126f70fe4a0c50ad48554b8eb89d111d58723 IN Proof of Humanity0.‍0002 Ether(Pending)(Pending)
0xfc6ff8c713ecada1e8448c5aa49b97bd3e68510ee1016137200f534ede92c6baAdd Submission(pending)2022-08-07 1:58:364 days 13 hrs ago0xf25171c1d7e8ca30a721b4e30af3ba8af38f098f IN Proof of Humanity0 Ether(Pending)(Pending)
0x87971731411fb6c8450c9190e6c294a6f9b37395435319a87e26ad34554d1b9bAdd Submission(pending)2022-08-07 1:57:244 days 13 hrs ago0xc67e31131c12ccad83a33c171b2df97a4fe1877e IN Proof of Humanity0.‍17 Ether(Pending)(Pending)
0xe0fe15fbae3933f47d472634a96aba1ee5e151ae0f4753c3e6d7705320b05f06Change State To ...153208502022-08-11 12:58:202 hrs 1 min ago0xf10b711fabc4c42aee138ba77c8d401af992e292 IN  Proof of Humanity0 Ether0.‍00153036 15
0x88b1e81d81524b02adedf0282e9852bd1098b64e7d4127094c10ab8666e3d591Fund Submission153206962022-08-11 12:25:192 hrs 34 mins ago0x1d302be1d0291d4c0b88aef5ab95c1b6dd4373b1 IN  Proof of Humanity0.‍125 Ether0.‍0041496 29.‍4492791
0x3c2f51e7e00942e830f37d55bbef0a93b59161e92e2c4f1add88569df7f7f18aAdd Submission153205162022-08-11 11:45:063 hrs 14 mins ago0xf10b711fabc4c42aee138ba77c8d401af992e292 IN  Proof of Humanity0 Ether0.‍00202574 15.‍20364873
0x55116bc4028f276a3293c8d2a50d25c63fecb682840b90c1ed03e4f0649ca0d5Change State To ...153204162022-08-11 11:22:063 hrs 37 mins ago0x918bd890ff76d2da0089dbb086d258da75960119 IN  Proof of Humanity0 Ether0.‍00113853 11.‍16076163
0x135f95aeebc8b3f5e21444a25df604b42c7489712696f2388a1dc5dd65375a61Change State To ...153204122022-08-11 11:21:033 hrs 38 mins ago0xdd7dad5c869726744ebe7b8f57d16d366bff7fa6 IN  Proof of Humanity0 Ether0.‍00103496 10.‍14429645
0x8bd99bc0077d71551e98e7e6529bd3f5056f6a895b912ddc89660cb9a6ebd403Fund Submission153192952022-08-11 7:02:147 hrs 57 mins ago0x1d302be1d0291d4c0b88aef5ab95c1b6dd4373b1 IN  Proof of Humanity0.‍125 Ether0.‍00236436 16.‍7795811
0x205bf0473a117bd249d24d475ded23e6f85039ffd7b1e8cec0844a6259ee1010Add Submission153192632022-08-11 6:52:148 hrs 7 mins ago0xb5da89902c1c0cbf3e5e667a737eb1eaff8a8f80 IN  Proof of Humanity0.‍125 Ether0.‍00172053 8
0x430772f1bbe52bcc1ebce591e6de9a79d06e3dfbbd2808a19e1355d5d384b57aFund Submission153192252022-08-11 6:44:438 hrs 14 mins ago0x1d302be1d0291d4c0b88aef5ab95c1b6dd4373b1 IN  Proof of Humanity0.‍125 Ether0.‍00117803 8.‍36110932
0x2202450fa6d96f7878828e45b55e3a15b780cf4eddeda278b45130c6349fb20eAdd Submission153191652022-08-11 6:34:088 hrs 25 mins ago0xdd7dad5c869726744ebe7b8f57d16d366bff7fa6 IN  Proof of Humanity0 Ether0.‍00143557 10.‍77426248
0x0d30ca5c43e79d2c6875e25d88e311d36b90e736cb19680ec6515191eff44b95Add Submission153191242022-08-11 6:24:278 hrs 34 mins ago0x918bd890ff76d2da0089dbb086d258da75960119 IN  Proof of Humanity0 Ether0.‍00181987 13.‍65975501
0xf516288524bd9b786f51280af4062198fe424aecf288f943d7ea141fc488269fAdd Vouch153180542022-08-11 2:20:2912 hrs 38 mins ago0xd97ee6ac650a8b0542496f3a0fdf45ec4cbd7b15 IN  Proof of Humanity0 Ether0.‍00145774 31.‍8603993
0x43fedc6b03569f6e0583c967b5f0379d7746497b01b28b83dc9b46ff517f48a0Fund Appeal153174692022-08-11 0:10:2114 hrs 48 mins ago0x4accc4d9ce68ae9168ba943fb4681bbfc5e2fd3f IN  Proof of Humanity0.‍15 Ether0.‍00876695 27.‍88738333
0xfe481470293c4591d27b6ff19517879a88d9f2e7d03157c5396ac9a6bbd414ceFund Appeal153174382022-08-11 0:03:2214 hrs 55 mins ago0x05a15b985af30d664f731f1cf2bee9c9dc0a1d0f IN  Proof of Humanity0.‍15 Ether0.‍00533328 30
0x202fb31383cf2105b79bd47ea1f0416176e4a2528882c76ef394e882ca7773c4Add Vouch153161592022-08-10 19:21:0419 hrs 38 mins ago0x45cbe4da4fb25f8efc1306ee6f10f6b07b4e5f8c IN  Proof of Humanity0 Ether0.‍00120288 26.‍29019781
0xe33a13a079f1271f08ad6c257986ec1848ce0029b67e56e3ed30b5d4c5573dccExecute Request153151852022-08-10 15:42:0123 hrs 17 mins ago0xfc3ba4a7c5529b82e972f7456ca9b97e41ce6f3d IN  Proof of Humanity0 Ether0.‍00241898 38.‍48570174
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xb7dfdf23df36a5a6f64363d0ca402abfae4d1e3dbe4c514d69847c5086c5ab32153212412022-08-11 14:32:0627 mins ago Proof of Humanity0x04b7f3027807c190ac8031566fad039157dc99920.‍125 Ether
0xbe9bfc48694a4942b743742c366337ffa7d9dbddb3dcdb85c8441e5d66621c2b153184542022-08-11 3:53:3411 hrs 5 mins ago Proof of Humanity0x8793074f2f1076452388882a3319969424fff89b0.‍125 Ether
0x43fedc6b03569f6e0583c967b5f0379d7746497b01b28b83dc9b46ff517f48a0153174692022-08-11 0:10:2114 hrs 48 mins ago Proof of Humanity 0x988b3a538b618c7a603e1c11ab82cd16dbe280690.‍075 Ether
0xecbfbb472b0b298302b6aebaeb1a438daa6906142154feb45324a8da8fe07cbe153161552022-08-10 19:20:2219 hrs 38 mins ago Proof of Humanity0xc02c6461b9216d8a4636df6f01b939957bd4941e0.‍125 Ether
0xe33a13a079f1271f08ad6c257986ec1848ce0029b67e56e3ed30b5d4c5573dcc153151852022-08-10 15:42:0123 hrs 17 mins ago Proof of Humanity0x5dce0b2f2bc6a806ad1ee43bcee0edd86877025c0.‍125 Ether
0x063b3432cc763a825351d22a45178623768e191338cf3a23d0d92c7945526db7153151802022-08-10 15:40:4623 hrs 18 mins ago Proof of Humanity0x5dce0b2f2bc6a806ad1ee43bcee0edd86877025c0.‍125 Ether
0x1937bb47bff50cffd5f834f9fb3b533e9cf5aa6dbfe5392d4e17c04427f30bbd153150172022-08-10 15:02:3823 hrs 56 mins ago Proof of Humanity0x26e78b5f903239b0eb5d26a2f95ac761fdd7f6e90.‍125 Ether
0x482c7410f278c8c0198a8d969b1b42bc3822669768892410d50f0a808f8d6b82153139272022-08-10 10:54:361 day 4 hrs ago Proof of Humanity0x5dce0b2f2bc6a806ad1ee43bcee0edd86877025c0.‍05 Ether
0x699c10a9044d1b7dc1e1057f5180321dfeb1eeb02a7fd5ec7bb4071e5c1b8f7e153092812022-08-09 17:25:251 day 21 hrs ago Proof of HumanityENS Name 0xkydo.eth0.‍125 Ether
0xdcd6158dc5936dd7535b90dd173c1c313dcbf9316d6449b69caa7490fd74d0d8153091492022-08-09 16:54:211 day 22 hrs ago Proof of Humanity0x5dce0b2f2bc6a806ad1ee43bcee0edd86877025c0.‍125 Ether
0xd56959466560418117f8626c612323e3c944d2665a0795aadd2b5421a3ab77ad153090152022-08-09 16:19:501 day 22 hrs ago Proof of Humanity0x5dce0b2f2bc6a806ad1ee43bcee0edd86877025c0.‍125 Ether
0x0723e228ff6b72cdab3d4d94ff692423725e79b7df14e7f2c88f3e511fd76b9b153086882022-08-09 15:04:061 day 23 hrs ago Proof of HumanityENS Name avsa.eth0.‍125 Ether
0x0723e228ff6b72cdab3d4d94ff692423725e79b7df14e7f2c88f3e511fd76b9b153086882022-08-09 15:04:061 day 23 hrs ago Proof of Humanity0x5dce0b2f2bc6a806ad1ee43bcee0edd86877025c0.‍125 Ether
0x0feda8e120747d4bbbdbe08ae1c22fd8d780ff504a909b71fe9f8defe5ce53a9153039242022-08-08 21:11:152 days 17 hrs ago Proof of Humanity0xb1ce232565483326a05ee715080833dfdade265b0.‍125 Ether
0x804eef3cf26166e2247001b51e9c97d45ad865e93a506708575235c9517a2155153037142022-08-08 20:26:452 days 18 hrs ago Proof of Humanity0xe7d228a4da3155dbd8e854b6f970ec79e156a7bc0.‍125 Ether
0x4fc3b8b120a1693fa588a9d6b55e13d7672a1c193515771d40eee34bb9b04e57153032862022-08-08 18:58:452 days 20 hrs ago Proof of Humanity0x183f062b6a8c39b9a9e71898741acf8f25e115610.‍125 Ether
0xda40723e69ca4b478a731a150a16475b22c686c646a6a820f3030bb5794b198b153030802022-08-08 18:11:562 days 20 hrs ago Proof of Humanity0xbb25c578f66353a3c97d96bb58b5600517fab80f0.‍125 Ether
0x7c8b072b44cfa5c3cb2ca67799ccc17a2e5f8db1980fee635ff368182f969155153010612022-08-08 10:36:553 days 4 hrs ago Proof of Humanity0x25c3c9008541ac9f987bad983ff90934454136150.‍125 Ether
0x1c0f3b31d532e9586d04da41ba2ff8cba226de057f248ef2678486e5986439a4152985622022-08-08 0:57:043 days 14 hrs ago Proof of Humanity0x99c4101b278a37231b6e5b4ae440b3feb5bc3e140.‍125 Ether
0x42963f8093407fa9a9630fff8b2823962982f5887d7b292896fa60d3581bc30d152976912022-08-07 21:46:293 days 17 hrs ago Proof of Humanity0x04b7f3027807c190ac8031566fad039157dc99920.‍125 Ether
0xed1502e6d5740c765ab604c99531adb90a8ddb6b73f06345809d06aaa3b9a010152967182022-08-07 18:07:343 days 20 hrs ago Proof of HumanityENS Name ethermaria64.eth0.‍125 Ether
0x92c9e47c86433f609b54252a7922a4e769474d1c9e77fb275a1dc1cd43e8430f152961022022-08-07 15:50:213 days 23 hrs ago Proof of Humanity0x997ac8eac5735574951ae86f81253c1886528eb30.‍125 Ether
0x31d257e37524a56d6db8dd7d0c01deba1b6abb191e06c5236fc5aa25ec99b8c0152955442022-08-07 14:00:234 days 58 mins ago Proof of Humanity0x26e78b5f903239b0eb5d26a2f95ac761fdd7f6e90.‍125 Ether
0xaa6ecd16b8d4a86a79b02e0202ed133887b80d8182f283d1bfa4deb37e77d231152941642022-08-07 8:46:174 days 6 hrs ago Proof of Humanity0x7a1ca0adfd4525d8b52189bb44f9183213605fe80.‍157 Ether
0xeb12fec5a35dcc7cd0eaa3f45d4412ce5b472628a4c0207b54d4c8ffa4e02da6152927942022-08-07 3:39:454 days 11 hrs ago Proof of Humanity0x5dce0b2f2bc6a806ad1ee43bcee0edd86877025c0.‍05 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ProofOfHumanity

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-03-10
*/

// File: https://github.com/kleros/ethereum-libraries/blob/39b54dec298117f9753d1a7dd2f08d596d26acdb/contracts/CappedMath.sol

/**
 *  @authors: [@mtsalenc]
 *  @reviewers: [@clesaege]
 *  @auditors: []
 *  @bounties: []
 *  @deployments: []
 */

pragma solidity ^0.5;


/**
 * @title CappedMath
 * @dev Math operations with caps for under and overflow.
 */
library CappedMath {
    uint constant private UINT_MAX = 2**256 - 1;
    uint64 constant private UINT64_MAX = 2**64 - 1;

    /**
     * @dev Adds two unsigned integers, returns 2^256 - 1 on overflow.
     */
    function addCap(uint _a, uint _b) internal pure returns (uint) {
        uint c = _a + _b;
        return c >= _a ? c : UINT_MAX;
    }

    /**
     * @dev Subtracts two integers, returns 0 on underflow.
     */
    function subCap(uint _a, uint _b) internal pure returns (uint) {
        if (_b > _a)
            return 0;
        else
            return _a - _b;
    }

    /**
     * @dev Multiplies two unsigned integers, returns 2^256 - 1 on overflow.
     */
    function mulCap(uint _a, uint _b) internal pure returns (uint) {
        // 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;

        uint c = _a * _b;
        return c / _a == _b ? c : UINT_MAX;
    }

    function addCap64(uint64 _a, uint64 _b) internal pure returns (uint64) {
        uint64 c = _a + _b;
        return c >= _a ? c : UINT64_MAX;
    }


    function subCap64(uint64 _a, uint64 _b) internal pure returns (uint64) {
        if (_b > _a)
            return 0;
        else
            return _a - _b;
    }

    function mulCap64(uint64 _a, uint64 _b) internal pure returns (uint64) {
        if (_a == 0)
            return 0;

        uint64 c = _a * _b;
        return c / _a == _b ? c : UINT64_MAX;
    }
}

// File: https://github.com/kleros/erc-792/blob/c00f37dacdbf296e038bbaec9ad86c6a2f4b48d1/contracts/erc-1497/IEvidence.sol

pragma solidity ^0.5;


/** @title IEvidence
 *  ERC-1497: Evidence Standard
 */
interface IEvidence {

    /** @dev To be emitted when meta-evidence is submitted.
     *  @param _metaEvidenceID Unique identifier of meta-evidence.
     *  @param _evidence A link to the meta-evidence JSON.
     */
    event MetaEvidence(uint indexed _metaEvidenceID, string _evidence);

    /** @dev To be raised when evidence is submitted. Should point to the resource (evidences are not to be stored on chain due to gas considerations).
     *  @param _arbitrator The arbitrator of the contract.
     *  @param _evidenceGroupID Unique identifier of the evidence group the evidence belongs to.
     *  @param _party The address of the party submiting the evidence. Note that 0x0 refers to evidence not submitted by any party.
     *  @param _evidence A URI to the evidence JSON file whose name should be its keccak256 hash followed by .json.
     */
    event Evidence(IArbitrator indexed _arbitrator, uint indexed _evidenceGroupID, address indexed _party, string _evidence);

    /** @dev To be emitted when a dispute is created to link the correct meta-evidence to the disputeID.
     *  @param _arbitrator The arbitrator of the contract.
     *  @param _disputeID ID of the dispute in the Arbitrator contract.
     *  @param _metaEvidenceID Unique identifier of meta-evidence.
     *  @param _evidenceGroupID Unique identifier of the evidence group that is linked to this dispute.
     */
    event Dispute(IArbitrator indexed _arbitrator, uint indexed _disputeID, uint _metaEvidenceID, uint _evidenceGroupID);

}

// File: https://github.com/kleros/erc-792/blob/c00f37dacdbf296e038bbaec9ad86c6a2f4b48d1/contracts/IArbitrator.sol

/**
 *  @title Arbitrator
 *  @author Clément Lesaege - <[email protected]>
 */

pragma solidity ^0.5;


/** @title Arbitrator
 *  Arbitrator abstract contract.
 *  When developing arbitrator contracts we need to:
 *  -Define the functions for dispute creation (createDispute) and appeal (appeal). Don't forget to store the arbitrated contract and the disputeID (which should be unique, may nbDisputes).
 *  -Define the functions for cost display (arbitrationCost and appealCost).
 *  -Allow giving rulings. For this a function must call arbitrable.rule(disputeID, ruling).
 */
interface IArbitrator {

    enum DisputeStatus {Waiting, Appealable, Solved}


    /** @dev To be emitted when a dispute is created.
     *  @param _disputeID ID of the dispute.
     *  @param _arbitrable The contract which created the dispute.
     */
    event DisputeCreation(uint indexed _disputeID, IArbitrable indexed _arbitrable);

    /** @dev To be emitted when a dispute can be appealed.
     *  @param _disputeID ID of the dispute.
     */
    event AppealPossible(uint indexed _disputeID, IArbitrable indexed _arbitrable);

    /** @dev To be emitted when the current ruling is appealed.
     *  @param _disputeID ID of the dispute.
     *  @param _arbitrable The contract which created the dispute.
     */
    event AppealDecision(uint indexed _disputeID, IArbitrable indexed _arbitrable);

    /** @dev Create a dispute. Must be called by the arbitrable contract.
     *  Must be paid at least arbitrationCost(_extraData).
     *  @param _choices Amount of choices the arbitrator can make in this dispute.
     *  @param _extraData Can be used to give additional info on the dispute to be created.
     *  @return disputeID ID of the dispute created.
     */
    function createDispute(uint _choices, bytes calldata _extraData) external payable returns(uint disputeID);

    /** @dev Compute the cost of arbitration. It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.
     *  @param _extraData Can be used to give additional info on the dispute to be created.
     *  @return cost Amount to be paid.
     */
    function arbitrationCost(bytes calldata _extraData) external view returns(uint cost);

    /** @dev Appeal a ruling. Note that it has to be called before the arbitrator contract calls rule.
     *  @param _disputeID ID of the dispute to be appealed.
     *  @param _extraData Can be used to give extra info on the appeal.
     */
    function appeal(uint _disputeID, bytes calldata _extraData) external payable;

    /** @dev Compute the cost of appeal. It is recommended not to increase it often, as it can be higly time and gas consuming for the arbitrated contracts to cope with fee augmentation.
     *  @param _disputeID ID of the dispute to be appealed.
     *  @param _extraData Can be used to give additional info on the dispute to be created.
     *  @return cost Amount to be paid.
     */
    function appealCost(uint _disputeID, bytes calldata _extraData) external view returns(uint cost);

    /** @dev Compute the start and end of the dispute's current or next appeal period, if possible. If not known or appeal is impossible: should return (0, 0).
     *  @param _disputeID ID of the dispute.
     *  @return The start and end of the period.
     */
    function appealPeriod(uint _disputeID) external view returns(uint start, uint end);

    /** @dev Return the status of a dispute.
     *  @param _disputeID ID of the dispute to rule.
     *  @return status The status of the dispute.
     */
    function disputeStatus(uint _disputeID) external view returns(DisputeStatus status);

    /** @dev Return the current ruling of a dispute. This is useful for parties to know if they should appeal.
     *  @param _disputeID ID of the dispute.
     *  @return ruling The ruling which has been given or the one which will be given if there is no appeal.
     */
    function currentRuling(uint _disputeID) external view returns(uint ruling);

}

// File: https://github.com/kleros/erc-792/blob/c00f37dacdbf296e038bbaec9ad86c6a2f4b48d1/contracts/IArbitrable.sol

/**
 *  @title IArbitrable
 *  @author Enrique Piqueras - <[email protected]>
 */

pragma solidity ^0.5;


/** @title IArbitrable
 *  Arbitrable interface.
 *  When developing arbitrable contracts, we need to:
 *  -Define the action taken when a ruling is received by the contract.
 *  -Allow dispute creation. For this a function must call arbitrator.createDispute.value(_fee)(_choices,_extraData);
 */
interface IArbitrable {

    /** @dev To be raised when a ruling is given.
     *  @param _arbitrator The arbitrator giving the ruling.
     *  @param _disputeID ID of the dispute in the Arbitrator contract.
     *  @param _ruling The ruling which was given.
     */
    event Ruling(IArbitrator indexed _arbitrator, uint indexed _disputeID, uint _ruling);

    /** @dev Give a ruling for a dispute. Must be called by the arbitrator.
     *  The purpose of this function is to ensure that the address calling it has the right to rule on the contract.
     *  @param _disputeID ID of the dispute in the Arbitrator contract.
     *  @param _ruling Ruling given by the arbitrator. Note that 0 is reserved for "Not able/wanting to make a decision".
     */
    function rule(uint _disputeID, uint _ruling) external;
}

// File: browser/github/Proof-Of-Humanity/Proof-Of-Humanity/contracts/ProofOfHumanity.sol

/**
 *  @authors: [@unknownunknown1, @nix1g]
 *  @reviewers: [@fnanni-0*, @mtsalenc*, @nix1g*, @clesaege*, @hbarcelos*, @ferittuncer]
 *  @auditors: []
 *  @bounties: []
 *  @deployments: []
 *  @tools: [MythX*]
 */

pragma solidity ^0.5.13;
pragma experimental ABIEncoderV2;

/**
 *  @title ProofOfHumanity
 *  This contract is a curated registry for people. The users are identified by their address and can be added or removed through the request-challenge protocol.
 *  In order to challenge a registration request the challenger must provide one of the four reasons.
 *  New registration requests firstly should gain sufficient amount of vouches from other registered users and only after that they can be accepted or challenged.
 *  The users who vouched for submission that lost the challenge with the reason Duplicate or DoesNotExist would be penalized with optional fine or ban period.
 *  NOTE: This contract trusts that the Arbitrator is honest and will not reenter or modify its costs during a call.
 *  The arbitrator must support appeal period.
 */
contract ProofOfHumanity is IArbitrable, IEvidence {
    using CappedMath for uint;
    using CappedMath for uint64;

    /* Constants and immutable */

    uint private constant RULING_OPTIONS = 2; // The amount of non 0 choices the arbitrator can give.
    uint private constant AUTO_PROCESSED_VOUCH = 10; // The number of vouches that will be automatically processed when executing a request.
    uint private constant FULL_REASONS_SET = 15; // Indicates that reasons' bitmap is full. 0b1111.
    uint private constant MULTIPLIER_DIVISOR = 10000; // Divisor parameter for multipliers.

    bytes32 private DOMAIN_SEPARATOR; // The EIP-712 domainSeparator specific to this deployed instance. It is used to verify the IsHumanVoucher's signature.
    bytes32 private constant IS_HUMAN_VOUCHER_TYPEHASH = 0xa9e3fa1df5c3dbef1e9cfb610fa780355a0b5e0acb0fa8249777ec973ca789dc; // The EIP-712 typeHash of IsHumanVoucher. keccak256("IsHumanVoucher(address vouchedSubmission,uint256 voucherExpirationTimestamp)").

    /* Enums */

    enum Status {
        None, // The submission doesn't have a pending status.
        Vouching, // The submission is in the state where it can be vouched for and crowdfunded.
        PendingRegistration, // The submission is in the state where it can be challenged. Or accepted to the list, if there are no challenges within the time limit.
        PendingRemoval // The submission is in the state where it can be challenged. Or removed from the list, if there are no challenges within the time limit.
    }

    enum Party {
        None, // Party per default when there is no challenger or requester. Also used for unconclusive ruling.
        Requester, // Party that made the request to change a status.
        Challenger // Party that challenged the request to change a status.
    }

    enum Reason {
        None, // No reason specified. This option should be used to challenge removal requests.
        IncorrectSubmission, // The submission does not comply with the submission rules.
        Deceased, // The submitter has existed but does not exist anymore.
        Duplicate, // The submitter is already registered. The challenger has to point to the identity already registered or to a duplicate submission.
        DoesNotExist // The submitter is not real. For example, this can be used for videos showing computer generated persons.
    }

    /* Structs */

    struct Submission {
        Status status; // The current status of the submission.
        bool registered; // Whether the submission is in the registry or not. Note that a registered submission won't have privileges (e.g. vouching) if its duration expired.
        bool hasVouched; // True if this submission used its vouch for another submission. This is set back to false once the vouch is processed.
        uint64 submissionTime; // The time when the submission was accepted to the list.
        uint64 index; // Index of a submission.
        Request[] requests; // List of status change requests made for the submission.
    }

    struct Request {
        bool disputed; // True if a dispute was raised. Note that the request can enter disputed state multiple times, once per reason.
        bool resolved; // True if the request is executed and/or all raised disputes are resolved.
        bool requesterLost; // True if the requester has already had a dispute that wasn't ruled in his favor.
        Reason currentReason; // Current reason a registration request was challenged with. Is left empty for removal requests.
        uint8 usedReasons; // Bitmap of the reasons used by challengers of this request.
        uint16 nbParallelDisputes; // Tracks the number of simultaneously raised disputes. Parallel disputes are only allowed for reason Duplicate.
        uint16 arbitratorDataID; // The index of the relevant arbitratorData struct. All the arbitrator info is stored in a separate struct to reduce gas cost.
        uint16 lastChallengeID; // The ID of the last challenge, which is equal to the total number of challenges for the request.
        uint32 lastProcessedVouch; // Stores the index of the last processed vouch in the array of vouches. It is used for partial processing of the vouches in resolved submissions.
        uint64 currentDuplicateIndex; // Stores the index of the duplicate submission provided by the challenger who is currently winning.
        uint64 challengePeriodStart; // Time when the submission can be challenged.
        address payable requester; // Address that made a request. It is left empty for the registration requests since it matches submissionID in that case.
        address payable ultimateChallenger; // Address of the challenger who won a dispute and who users that vouched for the request must pay the fines to.
        address[] vouches; // Stores the addresses of submissions that vouched for this request and whose vouches were used in this request.
        mapping(uint => Challenge) challenges; // Stores all the challenges of this request. challengeID -> Challenge.
        mapping(address => bool) challengeDuplicates; // Indicates whether a certain duplicate address has been used in a challenge or not.
    }

    // Some arrays below have 3 elements to map with the Party enums for better readability:
    // - 0: is unused, matches `Party.None`.
    // - 1: for `Party.Requester`.
    // - 2: for `Party.Challenger`.
    struct Round {
        uint[3] paidFees; // Tracks the fees paid by each side in this round.
        Party sideFunded; // Stores the side that successfully paid the appeal fees in the latest round. Note that if both sides have paid a new round is created.
        uint feeRewards; // Sum of reimbursable fees and stake rewards available to the parties that made contributions to the side that ultimately wins a dispute.
        mapping(address => uint[3]) contributions; // Maps contributors to their contributions for each side.
    }

    struct Challenge {
        uint disputeID; // The ID of the dispute related to the challenge.
        Party ruling; // Ruling given by the arbitrator of the dispute.
        uint16 lastRoundID; // The ID of the last round.
        uint64 duplicateSubmissionIndex; // Index of a submission, which is a supposed duplicate of a challenged submission. It is only used for reason Duplicate.
        address payable challenger; // Address that challenged the request.
        mapping(uint => Round) rounds; // Tracks the info of each funding round of the challenge.
    }

    // The data tied to the arbitrator that will be needed to recover the submission info for arbitrator's call.
    struct DisputeData {
        uint96 challengeID; // The ID of the challenge of the request.
        address submissionID; // The submission, which ongoing request was challenged.
    }

    struct ArbitratorData {
        IArbitrator arbitrator; // Address of the trusted arbitrator to solve disputes.
        uint96 metaEvidenceUpdates; // The meta evidence to be used in disputes.
        bytes arbitratorExtraData; // Extra data for the arbitrator.
    }

    /* Storage */

    address public governor; // The address that can make governance changes to the parameters of the contract.

    uint public submissionBaseDeposit; // The base deposit to make a new request for a submission.

    // Note that to ensure correct contract behaviour the sum of challengePeriodDuration and renewalPeriodDuration should be less than submissionDuration.
    uint64 public submissionDuration; // Time after which the registered submission will no longer be considered registered. The submitter has to reapply to the list to refresh it.
    uint64 public renewalPeriodDuration; //  The duration of the period when the registered submission can reapply.
    uint64 public challengePeriodDuration; // The time after which a request becomes executable if not challenged. Note that this value should be less than the time spent on potential dispute's resolution, to avoid complications of parallel dispute handling.

    uint64 public requiredNumberOfVouches; // The number of registered users that have to vouch for a new registration request in order for it to enter PendingRegistration state.

    uint public sharedStakeMultiplier; // Multiplier for calculating the fee stake that must be paid in the case where arbitrator refused to arbitrate.
    uint public winnerStakeMultiplier; // Multiplier for calculating the fee stake paid by the party that won the previous round.
    uint public loserStakeMultiplier; // Multiplier for calculating the fee stake paid by the party that lost the previous round.

    uint public submissionCounter; // The total count of all submissions that made a registration request at some point. Includes manually added submissions as well.

    ArbitratorData[] public arbitratorDataList; // Stores the arbitrator data of the contract. Updated each time the data is changed.

    mapping(address => Submission) private submissions; // Maps the submission ID to its data. submissions[submissionID]. It is private because of getSubmissionInfo().
    mapping(address => mapping(address => bool)) public vouches; // Indicates whether or not the voucher has vouched for a certain submission. vouches[voucherID][submissionID].
    mapping(address => mapping(uint => DisputeData)) public arbitratorDisputeIDToDisputeData; // Maps a dispute ID with its data. arbitratorDisputeIDToDisputeData[arbitrator][disputeID].

    /* Modifiers */

    modifier onlyGovernor {require(msg.sender == governor, "The caller must be the governor"); _;}

    /* Events */

    /**
     *  @dev Emitted when a vouch is added.
     *  @param _submissionID The submission that receives the vouch.
     *  @param _voucher The address that vouched.
     */
    event VouchAdded(address indexed _submissionID, address indexed _voucher);

    /**
     *  @dev Emitted when a vouch is removed.
     *  @param _submissionID The submission which vouch is removed.
     *  @param _voucher The address that removes its vouch.
     */
    event VouchRemoved(address indexed _submissionID, address indexed _voucher);

    /** @dev Emitted when the request to add a submission to the registry is made.
     *  @param _submissionID The ID of the submission.
     *  @param _requestID The ID of the newly created request.
     */
    event AddSubmission(address indexed _submissionID, uint _requestID);

    /** @dev Emitted when the reapplication request is made.
     *  @param _submissionID The ID of the submission.
     *  @param _requestID The ID of the newly created request.
     */
    event ReapplySubmission(address indexed _submissionID, uint _requestID);

    /** @dev Emitted when the removal request is made.
     *  @param _requester The address that made the request.
     *  @param _submissionID The ID of the submission.
     *  @param _requestID The ID of the newly created request.
     */
    event RemoveSubmission(address indexed _requester, address indexed _submissionID, uint _requestID);

    /** @dev Emitted when the submission is challenged.
     *  @param _submissionID The ID of the submission.
     *  @param _requestID The ID of the latest request.
     *  @param _challengeID The ID of the challenge.
     */
    event SubmissionChallenged(address indexed _submissionID, uint indexed _requestID, uint _challengeID);

    /** @dev To be emitted when someone contributes to the appeal process.
     *  @param _submissionID The ID of the submission.
     *  @param _challengeID The index of the challenge.
     *  @param _party The party which received the contribution.
     *  @param _contributor The address of the contributor.
     *  @param _amount The amount contributed.
     */
    event AppealContribution(address indexed _submissionID, uint indexed _challengeID, Party _party, address indexed _contributor, uint _amount);

    /** @dev Emitted when one of the parties successfully paid its appeal fees.
     *  @param _submissionID The ID of the submission.
     *  @param _challengeID The index of the challenge which appeal was funded.
     *  @param _side The side that is fully funded.
     */
    event HasPaidAppealFee(address indexed _submissionID, uint indexed _challengeID, Party _side);

    /** @dev Emitted when the challenge is resolved.
     *  @param _submissionID The ID of the submission.
     *  @param _requestID The ID of the latest request.
     *  @param _challengeID The ID of the challenge that was resolved.
     */
    event ChallengeResolved(address indexed _submissionID, uint indexed _requestID, uint _challengeID);

    /** @dev Emitted in the constructor using most of its parameters.
     *  This event is needed for Subgraph. ArbitratorExtraData and renewalPeriodDuration are not needed for this event.
     */
    event ArbitratorComplete(
        IArbitrator _arbitrator,
        address indexed _governor,
        uint _submissionBaseDeposit,
        uint _submissionDuration,
        uint _challengePeriodDuration,
        uint _requiredNumberOfVouches,
        uint _sharedStakeMultiplier,
        uint _winnerStakeMultiplier,
        uint _loserStakeMultiplier
    );

    /** @dev Constructor.
     *  @param _arbitrator The trusted arbitrator to resolve potential disputes.
     *  @param _arbitratorExtraData Extra data for the trusted arbitrator contract.
     *  @param _registrationMetaEvidence The URI of the meta evidence object for registration requests.
     *  @param _clearingMetaEvidence The URI of the meta evidence object for clearing requests.
     *  @param _submissionBaseDeposit The base deposit to make a request for a submission.
     *  @param _submissionDuration Time in seconds during which the registered submission won't automatically lose its status.
     *  @param _renewalPeriodDuration Value that defines the duration of submission's renewal period.
     *  @param _challengePeriodDuration The time in seconds during which the request can be challenged.
     *  @param _multipliers The array that contains fee stake multipliers to avoid 'stack too deep' error.
     *  @param _requiredNumberOfVouches The number of vouches the submission has to have to pass from Vouching to PendingRegistration state.
     */
    constructor(
        IArbitrator _arbitrator,
        bytes memory _arbitratorExtraData,
        string memory _registrationMetaEvidence,
        string memory _clearingMetaEvidence,
        uint _submissionBaseDeposit,
        uint64 _submissionDuration,
        uint64 _renewalPeriodDuration,
        uint64 _challengePeriodDuration,
        uint[3] memory _multipliers,
        uint64 _requiredNumberOfVouches
    ) public {
        emit MetaEvidence(0, _registrationMetaEvidence);
        emit MetaEvidence(1, _clearingMetaEvidence);

        governor = msg.sender;
        submissionBaseDeposit = _submissionBaseDeposit;
        submissionDuration = _submissionDuration;
        renewalPeriodDuration = _renewalPeriodDuration;
        challengePeriodDuration = _challengePeriodDuration;
        sharedStakeMultiplier = _multipliers[0];
        winnerStakeMultiplier = _multipliers[1];
        loserStakeMultiplier = _multipliers[2];
        requiredNumberOfVouches = _requiredNumberOfVouches;

        ArbitratorData storage arbitratorData = arbitratorDataList[arbitratorDataList.length++];
        arbitratorData.arbitrator = _arbitrator;
        arbitratorData.arbitratorExtraData = _arbitratorExtraData;
        emit ArbitratorComplete(_arbitrator, msg.sender, _submissionBaseDeposit, _submissionDuration, _challengePeriodDuration, _requiredNumberOfVouches, _multipliers[0], _multipliers[1], _multipliers[2]);

        // EIP-712.
        bytes32 DOMAIN_TYPEHASH = 0x8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866; // keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)").
        uint256 chainId;
        assembly { chainId := chainid } // block.chainid got introduced in Solidity v0.8.0.
        DOMAIN_SEPARATOR = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256("Proof of Humanity"), chainId, address(this)));
    }

    /* External and Public */

    // ************************ //
    // *      Governance      * //
    // ************************ //

    /** @dev Allows the governor to directly add new submissions to the list as a part of the seeding event.
     *  @param _submissionIDs The addresses of newly added submissions.
     *  @param _evidence The array of evidence links for each submission.
     *  @param _names The array of names of the submitters. This parameter is for Subgraph only and it won't be used in this function.
     */
    function addSubmissionManually(address[] calldata _submissionIDs, string[] calldata _evidence, string[] calldata _names) external onlyGovernor {
        uint counter = submissionCounter;
        uint arbitratorDataID = arbitratorDataList.length - 1;
        for (uint i = 0; i < _submissionIDs.length; i++) {
            Submission storage submission = submissions[_submissionIDs[i]];
            require(submission.requests.length == 0, "Submission already been created");
            submission.index = uint64(counter);
            counter++;

            Request storage request = submission.requests[submission.requests.length++];
            submission.registered = true;

            submission.submissionTime = uint64(now);
            request.arbitratorDataID = uint16(arbitratorDataID);
            request.resolved = true;

            if (bytes(_evidence[i]).length > 0)
                emit Evidence(arbitratorDataList[arbitratorDataID].arbitrator, uint(_submissionIDs[i]), msg.sender, _evidence[i]);
        }
        submissionCounter = counter;
    }

    /** @dev Allows the governor to directly remove a registered entry from the list as a part of the seeding event.
     *  @param _submissionID The address of a submission to remove.
     */
    function removeSubmissionManually(address _submissionID) external onlyGovernor {
        Submission storage submission = submissions[_submissionID];
        require(submission.registered && submission.status == Status.None, "Wrong status");
        submission.registered = false;
    }

    /** @dev Change the base amount required as a deposit to make a request for a submission.
     *  @param _submissionBaseDeposit The new base amount of wei required to make a new request.
     */
    function changeSubmissionBaseDeposit(uint _submissionBaseDeposit) external onlyGovernor {
        submissionBaseDeposit = _submissionBaseDeposit;
    }

    /** @dev Change the duration of the submission, renewal and challenge periods.
     *  @param _submissionDuration The new duration of the time the submission is considered registered.
     *  @param _renewalPeriodDuration The new value that defines the duration of submission's renewal period.
     *  @param _challengePeriodDuration The new duration of the challenge period. It should be lower than the time for a dispute.
     */
    function changeDurations(uint64 _submissionDuration, uint64 _renewalPeriodDuration, uint64 _challengePeriodDuration) external onlyGovernor {
        require(_challengePeriodDuration.addCap64(_renewalPeriodDuration) < _submissionDuration, "Incorrect inputs");
        submissionDuration = _submissionDuration;
        renewalPeriodDuration = _renewalPeriodDuration;
        challengePeriodDuration = _challengePeriodDuration;
    }

    /** @dev Change the number of vouches required for the request to pass to the pending state.
     *  @param _requiredNumberOfVouches The new required number of vouches.
     */
    function changeRequiredNumberOfVouches(uint64 _requiredNumberOfVouches) external onlyGovernor {
        requiredNumberOfVouches = _requiredNumberOfVouches;
    }

    /** @dev Change the proportion of arbitration fees that must be paid as fee stake by parties when there is no winner or loser (e.g. when the arbitrator refused to rule).
     *  @param _sharedStakeMultiplier Multiplier of arbitration fees that must be paid as fee stake. In basis points.
     */
    function changeSharedStakeMultiplier(uint _sharedStakeMultiplier) external onlyGovernor {
        sharedStakeMultiplier = _sharedStakeMultiplier;
    }

    /** @dev Change the proportion of arbitration fees that must be paid as fee stake by the winner of the previous round.
     *  @param _winnerStakeMultiplier Multiplier of arbitration fees that must be paid as fee stake. In basis points.
     */
    function changeWinnerStakeMultiplier(uint _winnerStakeMultiplier) external onlyGovernor {
        winnerStakeMultiplier = _winnerStakeMultiplier;
    }

    /** @dev Change the proportion of arbitration fees that must be paid as fee stake by the party that lost the previous round.
     *  @param _loserStakeMultiplier Multiplier of arbitration fees that must be paid as fee stake. In basis points.
     */
    function changeLoserStakeMultiplier(uint _loserStakeMultiplier) external onlyGovernor {
        loserStakeMultiplier = _loserStakeMultiplier;
    }

    /** @dev Change the governor of the contract.
     *  @param _governor The address of the new governor.
     */
    function changeGovernor(address _governor) external onlyGovernor {
        governor = _governor;
    }

    /** @dev Update the meta evidence used for disputes.
     *  @param _registrationMetaEvidence The meta evidence to be used for future registration request disputes.
     *  @param _clearingMetaEvidence The meta evidence to be used for future clearing request disputes.
     */
    function changeMetaEvidence(string calldata _registrationMetaEvidence, string calldata _clearingMetaEvidence) external onlyGovernor {
        ArbitratorData storage arbitratorData = arbitratorDataList[arbitratorDataList.length - 1];
        uint96 newMetaEvidenceUpdates = arbitratorData.metaEvidenceUpdates + 1;
        arbitratorDataList.push(ArbitratorData({
            arbitrator: arbitratorData.arbitrator,
            metaEvidenceUpdates: newMetaEvidenceUpdates,
            arbitratorExtraData: arbitratorData.arbitratorExtraData
        }));
        emit MetaEvidence(2 * newMetaEvidenceUpdates, _registrationMetaEvidence);
        emit MetaEvidence(2 * newMetaEvidenceUpdates + 1, _clearingMetaEvidence);
    }

    /** @dev Change the arbitrator to be used for disputes that may be raised in the next requests. The arbitrator is trusted to support appeal period and not reenter.
     *  @param _arbitrator The new trusted arbitrator to be used in the next requests.
     *  @param _arbitratorExtraData The extra data used by the new arbitrator.
     */
    function changeArbitrator(IArbitrator _arbitrator, bytes calldata _arbitratorExtraData) external onlyGovernor {
        ArbitratorData storage arbitratorData = arbitratorDataList[arbitratorDataList.length - 1];
        arbitratorDataList.push(ArbitratorData({
            arbitrator: _arbitrator,
            metaEvidenceUpdates: arbitratorData.metaEvidenceUpdates,
            arbitratorExtraData: _arbitratorExtraData
        }));
    }

    // ************************ //
    // *       Requests       * //
    // ************************ //

    /** @dev Make a request to add a new entry to the list. Paying the full deposit right away is not required as it can be crowdfunded later.
     *  @param _evidence A link to evidence using its URI.
     *  @param _name The name of the submitter. This parameter is for Subgraph only and it won't be used in this function.
     */
    function addSubmission(string calldata _evidence, string calldata _name) external payable {
        Submission storage submission = submissions[msg.sender];
        require(!submission.registered && submission.status == Status.None, "Wrong status");
        if (submission.requests.length == 0) {
            submission.index = uint64(submissionCounter);
            submissionCounter++;
        }
        submission.status = Status.Vouching;
        emit AddSubmission(msg.sender, submission.requests.length);
        requestRegistration(msg.sender, _evidence);
    }

    /** @dev Make a request to refresh a submissionDuration. Paying the full deposit right away is not required as it can be crowdfunded later.
     *  Note that the user can reapply even when current submissionDuration has not expired, but only after the start of renewal period.
     *  @param _evidence A link to evidence using its URI.
     *  @param _name The name of the submitter. This parameter is for Subgraph only and it won't be used in this function.
     */
    function reapplySubmission(string calldata _evidence, string calldata _name) external payable {
        Submission storage submission = submissions[msg.sender];
        require(submission.registered && submission.status == Status.None, "Wrong status");
        uint renewalAvailableAt = submission.submissionTime.addCap64(submissionDuration.subCap64(renewalPeriodDuration));
        require(now >= renewalAvailableAt, "Can't reapply yet");
        submission.status = Status.Vouching;
        emit ReapplySubmission(msg.sender, submission.requests.length);
        requestRegistration(msg.sender, _evidence);
    }

    /** @dev Make a request to remove a submission from the list. Requires full deposit. Accepts enough ETH to cover the deposit, reimburses the rest.
     *  Note that this request can't be made during the renewal period to avoid spam leading to submission's expiration.
     *  @param _submissionID The address of the submission to remove.
     *  @param _evidence A link to evidence using its URI.
     */
    function removeSubmission(address _submissionID, string calldata _evidence) external payable {
        Submission storage submission = submissions[_submissionID];
        require(submission.registered && submission.status == Status.None, "Wrong status");
        uint renewalAvailableAt = submission.submissionTime.addCap64(submissionDuration.subCap64(renewalPeriodDuration));
        require(now < renewalAvailableAt, "Can't remove after renewal");
        submission.status = Status.PendingRemoval;

        Request storage request = submission.requests[submission.requests.length++];
        request.requester = msg.sender;
        request.challengePeriodStart = uint64(now);

        uint arbitratorDataID = arbitratorDataList.length - 1;
        request.arbitratorDataID = uint16(arbitratorDataID);

        Round storage round = request.challenges[0].rounds[0];

        IArbitrator requestArbitrator = arbitratorDataList[arbitratorDataID].arbitrator;
        uint arbitrationCost = requestArbitrator.arbitrationCost(arbitratorDataList[arbitratorDataID].arbitratorExtraData);
        uint totalCost = arbitrationCost.addCap(submissionBaseDeposit);
        contribute(round, Party.Requester, msg.sender, msg.value, totalCost);

        require(round.paidFees[uint(Party.Requester)] >= totalCost, "You must fully fund your side");
        round.sideFunded = Party.Requester;

        emit RemoveSubmission(msg.sender, _submissionID, submission.requests.length - 1);

        if (bytes(_evidence).length > 0)
            emit Evidence(requestArbitrator, submission.requests.length - 1 + uint(_submissionID), msg.sender, _evidence);
    }

    /** @dev Fund the requester's deposit. Accepts enough ETH to cover the deposit, reimburses the rest.
     *  @param _submissionID The address of the submission which ongoing request to fund.
     */
    function fundSubmission(address _submissionID) external payable {
        Submission storage submission = submissions[_submissionID];
        require(submission.status == Status.Vouching, "Wrong status");
        Request storage request = submission.requests[submission.requests.length - 1];
        Challenge storage challenge = request.challenges[0];
        Round storage round = challenge.rounds[0];

        ArbitratorData storage arbitratorData = arbitratorDataList[request.arbitratorDataID];
        uint arbitrationCost = arbitratorData.arbitrator.arbitrationCost(arbitratorData.arbitratorExtraData);
        uint totalCost = arbitrationCost.addCap(submissionBaseDeposit);
        contribute(round, Party.Requester, msg.sender, msg.value, totalCost);

        if (round.paidFees[uint(Party.Requester)] >= totalCost)
            round.sideFunded = Party.Requester;
    }

    /** @dev Vouch for the submission. Note that the event spam is not an issue as it will be handled by the UI.
     *  @param _submissionID The address of the submission to vouch for.
     */
    function addVouch(address _submissionID) external {
        vouches[msg.sender][_submissionID] = true;
        emit VouchAdded(_submissionID, msg.sender);
    }

    /** @dev Remove the submission's vouch that has been added earlier. Note that the event spam is not an issue as it will be handled by the UI.
     *  @param _submissionID The address of the submission to remove vouch from.
     */
    function removeVouch(address _submissionID) external {
        vouches[msg.sender][_submissionID] = false;
        emit VouchRemoved(_submissionID, msg.sender);
    }

    /** @dev Allows to withdraw a mistakenly added submission while it's still in a vouching state.
     */
    function withdrawSubmission() external {
        Submission storage submission = submissions[msg.sender];
        require(submission.status == Status.Vouching, "Wrong status");
        Request storage request = submission.requests[submission.requests.length - 1];

        submission.status = Status.None;
        request.resolved = true;

        withdrawFeesAndRewards(msg.sender, msg.sender, submission.requests.length - 1, 0, 0); // Automatically withdraw for the requester.
    }

    /** @dev Change submission's state from Vouching to PendingRegistration if all conditions are met.
     *  @param _submissionID The address of the submission which status to change.
     *  @param _vouches Array of users whose vouches to count.
     *  @param _signatures Array of EIP-712 signatures of struct IsHumanVoucher (optional).
     *  @param _expirationTimestamps Array of expiration timestamps for each signature (optional).
     *  struct IsHumanVoucher {
     *      address vouchedSubmission;
     *      uint256 voucherExpirationTimestamp;
     *  }
     */
    function changeStateToPending(address _submissionID, address[] calldata _vouches, bytes[] calldata _signatures, uint[] calldata _expirationTimestamps) external {
        Submission storage submission = submissions[_submissionID];
        require(submission.status == Status.Vouching, "Wrong status");
        Request storage request = submission.requests[submission.requests.length - 1];
        /* solium-disable indentation */
        {
            Challenge storage challenge = request.challenges[0];
            Round storage round = challenge.rounds[0];
            require(round.sideFunded == Party.Requester, "Requester is not funded");
        }
        /* solium-enable indentation */
        uint timeOffset = now - submissionDuration; // Precompute the offset before the loop for efficiency and then compare it with the submission time to check the expiration.

        bytes2 PREFIX = "\x19\x01";
        for (uint i = 0; i < _signatures.length && request.vouches.length < requiredNumberOfVouches; i++) {
            address voucherAddress;
            /* solium-disable indentation */
            {
                // Get typed structure hash.
                bytes32 messageHash = keccak256(abi.encode(IS_HUMAN_VOUCHER_TYPEHASH, _submissionID, _expirationTimestamps[i]));
                bytes32 hash = keccak256(abi.encodePacked(PREFIX, DOMAIN_SEPARATOR, messageHash));

                // Decode the signature.
                bytes memory signature = _signatures[i];
                bytes32 r;
                bytes32 s;
                uint8 v;
                assembly {
                    r := mload(add(signature, 0x20))
                    s := mload(add(signature, 0x40))
                    v := byte(0, mload(add(signature, 0x60)))
                }
                if (v < 27) v += 27;
                require(v == 27 || v == 28, "Invalid signature");

                // Recover the signer's address.
                voucherAddress = ecrecover(hash, v, r, s);
            }
            /* solium-enable indentation */

            Submission storage voucher = submissions[voucherAddress];
            if (!voucher.hasVouched && voucher.registered && timeOffset <= voucher.submissionTime &&
            now < _expirationTimestamps[i] && _submissionID != voucherAddress) {
                request.vouches.push(voucherAddress);
                voucher.hasVouched = true;
                emit VouchAdded(_submissionID, voucherAddress);
            }
        }

        for (uint i = 0; i<_vouches.length && request.vouches.length<requiredNumberOfVouches; i++) {
            // Check that the vouch isn't currently used by another submission and the voucher has a right to vouch.
            Submission storage voucher = submissions[_vouches[i]];
            if (!voucher.hasVouched && voucher.registered && timeOffset <= voucher.submissionTime &&
            vouches[_vouches[i]][_submissionID] && _submissionID != _vouches[i]) {
                request.vouches.push(_vouches[i]);
                voucher.hasVouched = true;
            }
        }
        require(request.vouches.length >= requiredNumberOfVouches, "Not enough valid vouches");
        submission.status = Status.PendingRegistration;
        request.challengePeriodStart = uint64(now);
    }

    /** @dev Challenge the submission's request. Accepts enough ETH to cover the deposit, reimburses the rest.
     *  @param _submissionID The address of the submission which request to challenge.
     *  @param _reason The reason to challenge the request. Left empty for removal requests.
     *  @param _duplicateID The address of a supposed duplicate submission. Ignored if the reason is not Duplicate.
     *  @param _evidence A link to evidence using its URI. Ignored if not provided.
     */
    function challengeRequest(address _submissionID, Reason _reason, address _duplicateID, string calldata _evidence) external payable {
        Submission storage submission = submissions[_submissionID];
        if (submission.status == Status.PendingRegistration)
            require(_reason != Reason.None, "Reason must be specified");
        else if (submission.status == Status.PendingRemoval)
            require(_reason == Reason.None, "Reason must be left empty");
        else
            revert("Wrong status");

        Request storage request = submission.requests[submission.requests.length - 1];
        require(now - request.challengePeriodStart <= challengePeriodDuration, "Time to challenge has passed");

        Challenge storage challenge = request.challenges[request.lastChallengeID];
        /* solium-disable indentation */
        {
            Reason currentReason = request.currentReason;
            if (_reason == Reason.Duplicate) {
                require(submissions[_duplicateID].status > Status.None || submissions[_duplicateID].registered, "Wrong duplicate status");
                require(_submissionID != _duplicateID, "Can't be a duplicate of itself");
                require(currentReason == Reason.Duplicate || currentReason == Reason.None, "Another reason is active");
                require(!request.challengeDuplicates[_duplicateID], "Duplicate address already used");
                request.challengeDuplicates[_duplicateID] = true;
                challenge.duplicateSubmissionIndex = submissions[_duplicateID].index;
            } else
                require(!request.disputed, "The request is disputed");

            if (currentReason != _reason) {
                uint8 reasonBit = 1 << (uint8(_reason) - 1); // Get the bit that corresponds with reason's index.
                require((reasonBit & ~request.usedReasons) == reasonBit, "The reason has already been used");

                request.usedReasons ^= reasonBit; // Mark the bit corresponding with reason's index as 'true', to indicate that the reason was used.
                request.currentReason = _reason;
            }
        }
        /* solium-enable indentation */

        Round storage round = challenge.rounds[0];
        ArbitratorData storage arbitratorData = arbitratorDataList[request.arbitratorDataID];

        uint arbitrationCost = arbitratorData.arbitrator.arbitrationCost(arbitratorData.arbitratorExtraData);
        contribute(round, Party.Challenger, msg.sender, msg.value, arbitrationCost);
        require(round.paidFees[uint(Party.Challenger)] >= arbitrationCost, "You must fully fund your side");
        round.feeRewards = round.feeRewards.subCap(arbitrationCost);
        round.sideFunded = Party.None; // Set this back to 0, since it's no longer relevant as the new round is created.

        challenge.disputeID = arbitratorData.arbitrator.createDispute.value(arbitrationCost)(RULING_OPTIONS, arbitratorData.arbitratorExtraData);
        challenge.challenger = msg.sender;

        DisputeData storage disputeData = arbitratorDisputeIDToDisputeData[address(arbitratorData.arbitrator)][challenge.disputeID];
        disputeData.challengeID = uint96(request.lastChallengeID);
        disputeData.submissionID = _submissionID;

        request.disputed = true;
        request.nbParallelDisputes++;

        challenge.lastRoundID++;
        emit SubmissionChallenged(_submissionID, submission.requests.length - 1, disputeData.challengeID);

        request.lastChallengeID++;

        emit Dispute(
            arbitratorData.arbitrator,
            challenge.disputeID,
            submission.status == Status.PendingRegistration ? 2 * arbitratorData.metaEvidenceUpdates : 2 * arbitratorData.metaEvidenceUpdates + 1,
            submission.requests.length - 1 + uint(_submissionID)
        );

        if (bytes(_evidence).length > 0)
            emit Evidence(arbitratorData.arbitrator, submission.requests.length - 1 + uint(_submissionID), msg.sender, _evidence);
    }

    /** @dev Takes up to the total amount required to fund a side of an appeal. Reimburses the rest. Creates an appeal if both sides are fully funded.
     *  @param _submissionID The address of the submission which request to fund.
     *  @param _challengeID The index of a dispute, created for the request.
     *  @param _side The recipient of the contribution.
     */
    function fundAppeal(address _submissionID, uint _challengeID, Party _side) external payable {
        require(_side != Party.None); // You can only fund either requester or challenger.
        Submission storage submission = submissions[_submissionID];
        require(submission.status == Status.PendingRegistration || submission.status == Status.PendingRemoval, "Wrong status");
        Request storage request = submission.requests[submission.requests.length - 1];
        require(request.disputed, "No dispute to appeal");
        require(_challengeID < request.lastChallengeID, "Challenge out of bounds");

        Challenge storage challenge = request.challenges[_challengeID];
        ArbitratorData storage arbitratorData = arbitratorDataList[request.arbitratorDataID];

        (uint appealPeriodStart, uint appealPeriodEnd) = arbitratorData.arbitrator.appealPeriod(challenge.disputeID);
        require(now >= appealPeriodStart && now < appealPeriodEnd, "Appeal period is over");

        uint multiplier;
        /* solium-disable indentation */
        {
            Party winner = Party(arbitratorData.arbitrator.currentRuling(challenge.disputeID));
            if (winner == _side){
                multiplier = winnerStakeMultiplier;
            } else if (winner == Party.None){
                multiplier = sharedStakeMultiplier;
            } else {
                multiplier = loserStakeMultiplier;
                require(now-appealPeriodStart < (appealPeriodEnd-appealPeriodStart)/2, "Appeal period is over for loser");
            }
        }
        /* solium-enable indentation */

        Round storage round = challenge.rounds[challenge.lastRoundID];
        require(_side != round.sideFunded, "Side is already funded");

        uint appealCost = arbitratorData.arbitrator.appealCost(challenge.disputeID, arbitratorData.arbitratorExtraData);
        uint totalCost = appealCost.addCap((appealCost.mulCap(multiplier)) / MULTIPLIER_DIVISOR);
        uint contribution = contribute(round, _side, msg.sender, msg.value, totalCost);
        emit AppealContribution(_submissionID, _challengeID, _side, msg.sender, contribution);

        if (round.paidFees[uint(_side)] >= totalCost) {
            if (round.sideFunded == Party.None) {
                round.sideFunded = _side;
            } else {
                // Both sides are fully funded. Create an appeal.
                arbitratorData.arbitrator.appeal.value(appealCost)(challenge.disputeID, arbitratorData.arbitratorExtraData);
                challenge.lastRoundID++;
                round.feeRewards = round.feeRewards.subCap(appealCost);
                round.sideFunded = Party.None; // Set this back to default in the past round as it's no longer relevant.
            }
            emit HasPaidAppealFee(_submissionID, _challengeID, _side);
        }
    }

    /** @dev Execute a request if the challenge period passed and no one challenged the request.
     *  @param _submissionID The address of the submission with the request to execute.
     */
    function executeRequest(address _submissionID) external {
        Submission storage submission = submissions[_submissionID];
        uint requestID = submission.requests.length - 1;
        Request storage request = submission.requests[requestID];
        require(now - request.challengePeriodStart > challengePeriodDuration, "Can't execute yet");
        require(!request.disputed, "The request is disputed");
        address payable requester;
        if (submission.status == Status.PendingRegistration) {
            // It is possible for the requester to lose without a dispute if he was penalized for bad vouching while reapplying.
            if (!request.requesterLost) {
                submission.registered = true;
                submission.submissionTime = uint64(now);
            }
            requester = address(uint160(_submissionID));
        } else if (submission.status == Status.PendingRemoval) {
            submission.registered = false;
            requester = request.requester;
        } else
            revert("Incorrect status.");

        submission.status = Status.None;
        request.resolved = true;

        if (request.vouches.length != 0)
            processVouches(_submissionID, requestID, AUTO_PROCESSED_VOUCH);

        withdrawFeesAndRewards(requester, _submissionID, requestID, 0, 0); // Automatically withdraw for the requester.
    }

    /** @dev Processes vouches of the resolved request, so vouchings of users who vouched for it can be used in other submissions.
     *  Penalizes users who vouched for bad submissions.
     *  @param _submissionID The address of the submission which vouches to iterate.
     *  @param _requestID The ID of the request which vouches to iterate.
     *  @param _iterations The number of iterations to go through.
     */
    function processVouches(address _submissionID, uint _requestID, uint _iterations) public {
        Submission storage submission = submissions[_submissionID];
        Request storage request = submission.requests[_requestID];
        require(request.resolved, "Submission must be resolved");

        uint lastProcessedVouch = request.lastProcessedVouch;
        uint endIndex = _iterations.addCap(lastProcessedVouch);
        uint vouchCount = request.vouches.length;

        if (endIndex > vouchCount)
            endIndex = vouchCount;

        Reason currentReason = request.currentReason;
        // If the ultimate challenger is defined that means that the request was ruled in favor of the challenger.
        bool applyPenalty = request.ultimateChallenger != address(0x0) && (currentReason == Reason.Duplicate || currentReason == Reason.DoesNotExist);
        for (uint i = lastProcessedVouch; i < endIndex; i++) {
            Submission storage voucher = submissions[request.vouches[i]];
            voucher.hasVouched = false;
            if (applyPenalty) {
                // Check the situation when vouching address is in the middle of reapplication process.
                if (voucher.status == Status.Vouching || voucher.status == Status.PendingRegistration)
                    voucher.requests[voucher.requests.length - 1].requesterLost = true;

                voucher.registered = false;
            }
        }
        request.lastProcessedVouch = uint32(endIndex);
    }

    /** @dev Reimburses contributions if no disputes were raised. If a dispute was raised, sends the fee stake rewards and reimbursements proportionally to the contributions made to the winner of a dispute.
     *  @param _beneficiary The address that made contributions to a request.
     *  @param _submissionID The address of the submission with the request from which to withdraw.
     *  @param _requestID The request from which to withdraw.
     *  @param _challengeID The ID of the challenge from which to withdraw.
     *  @param _round The round from which to withdraw.
     */
    function withdrawFeesAndRewards(address payable _beneficiary, address _submissionID, uint _requestID, uint _challengeID, uint _round) public {
        Submission storage submission = submissions[_submissionID];
        Request storage request = submission.requests[_requestID];
        Challenge storage challenge = request.challenges[_challengeID];
        Round storage round = challenge.rounds[_round];
        require(request.resolved, "Submission must be resolved");
        require(_beneficiary != address(0x0), "Beneficiary must not be empty");

        Party ruling = challenge.ruling;
        uint reward;
        // Reimburse the payment if the last round wasn't fully funded.
        // Note that the 0 round is always considered funded if there is a challenge. If there was no challenge the requester will be reimbursed with the subsequent condition, since the ruling will be Party.None.
        if (_round != 0 && _round == challenge.lastRoundID) {
            reward = round.contributions[_beneficiary][uint(Party.Requester)] + round.contributions[_beneficiary][uint(Party.Challenger)];
        } else if (ruling == Party.None) {
            uint totalFeesInRound = round.paidFees[uint(Party.Challenger)] + round.paidFees[uint(Party.Requester)];
            uint claimableFees = round.contributions[_beneficiary][uint(Party.Challenger)] + round.contributions[_beneficiary][uint(Party.Requester)];
            reward = totalFeesInRound > 0 ? claimableFees * round.feeRewards / totalFeesInRound : 0;
        } else {
            // Challenger, who ultimately wins, will be able to get the deposit of the requester, even if he didn't participate in the initial dispute.
            if (_round == 0 && _beneficiary == request.ultimateChallenger && _challengeID == 0) {
                reward = round.feeRewards;
                round.feeRewards = 0;
            // This condition will prevent claiming a reward, intended for the ultimate challenger.
            } else if (request.ultimateChallenger==address(0x0) || _challengeID!=0 || _round!=0) {
                uint paidFees = round.paidFees[uint(ruling)];
                reward = paidFees > 0
                    ? (round.contributions[_beneficiary][uint(ruling)] * round.feeRewards) / paidFees
                    : 0;
            }
        }
        round.contributions[_beneficiary][uint(Party.Requester)] = 0;
        round.contributions[_beneficiary][uint(Party.Challenger)] = 0;
        _beneficiary.send(reward);
    }

    /** @dev Give a ruling for a dispute. Can only be called by the arbitrator. TRUSTED.
     *  Accounts for the situation where the winner loses a case due to paying less appeal fees than expected.
     *  @param _disputeID ID of the dispute in the arbitrator contract.
     *  @param _ruling Ruling given by the arbitrator. Note that 0 is reserved for "Refused to arbitrate".
     */
    function rule(uint _disputeID, uint _ruling) public {
        Party resultRuling = Party(_ruling);
        DisputeData storage disputeData = arbitratorDisputeIDToDisputeData[msg.sender][_disputeID];
        address submissionID = disputeData.submissionID;
        uint challengeID = disputeData.challengeID;
        Submission storage submission = submissions[submissionID];

        Request storage request = submission.requests[submission.requests.length - 1];
        Challenge storage challenge = request.challenges[challengeID];
        Round storage round = challenge.rounds[challenge.lastRoundID];
        ArbitratorData storage arbitratorData = arbitratorDataList[request.arbitratorDataID];

        require(address(arbitratorData.arbitrator) == msg.sender);
        require(!request.resolved);

        // The ruling is inverted if the loser paid its fees.
        if (round.sideFunded == Party.Requester) // If one side paid its fees, the ruling is in its favor. Note that if the other side had also paid, an appeal would have been created.
            resultRuling = Party.Requester;
        else if (round.sideFunded == Party.Challenger)
            resultRuling = Party.Challenger;

        emit Ruling(IArbitrator(msg.sender), _disputeID, uint(resultRuling));
        executeRuling(submissionID, challengeID, resultRuling);
    }

    /** @dev Submit a reference to evidence. EVENT.
     *  @param _submissionID The address of the submission which the evidence is related to.
     *  @param _evidence A link to an evidence using its URI.
     */
    function submitEvidence(address _submissionID, string calldata _evidence) external {
        Submission storage submission = submissions[_submissionID];
        Request storage request = submission.requests[submission.requests.length - 1];
        ArbitratorData storage arbitratorData = arbitratorDataList[request.arbitratorDataID];

        emit Evidence(arbitratorData.arbitrator, submission.requests.length - 1 + uint(_submissionID), msg.sender, _evidence);
    }

    /* Internal */

    /** @dev Make a request to register/reapply the submission. Paying the full deposit right away is not required as it can be crowdfunded later.
     *  @param _submissionID The address of the submission.
     *  @param _evidence A link to evidence using its URI.
     */
    function requestRegistration(address _submissionID, string memory _evidence) internal {
        Submission storage submission = submissions[_submissionID];
        Request storage request = submission.requests[submission.requests.length++];

        uint arbitratorDataID = arbitratorDataList.length - 1;
        request.arbitratorDataID = uint16(arbitratorDataID);

        Round storage round = request.challenges[0].rounds[0];

        IArbitrator requestArbitrator = arbitratorDataList[arbitratorDataID].arbitrator;
        uint arbitrationCost = requestArbitrator.arbitrationCost(arbitratorDataList[arbitratorDataID].arbitratorExtraData);
        uint totalCost = arbitrationCost.addCap(submissionBaseDeposit);
        contribute(round, Party.Requester, msg.sender, msg.value, totalCost);

        if (round.paidFees[uint(Party.Requester)] >= totalCost)
            round.sideFunded = Party.Requester;

        if (bytes(_evidence).length > 0)
            emit Evidence(requestArbitrator, submission.requests.length - 1 + uint(_submissionID), msg.sender, _evidence);
    }

    /** @dev Returns the contribution value and remainder from available ETH and required amount.
     *  @param _available The amount of ETH available for the contribution.
     *  @param _requiredAmount The amount of ETH required for the contribution.
     *  @return taken The amount of ETH taken.
     *  @return remainder The amount of ETH left from the contribution.
     */
    function calculateContribution(uint _available, uint _requiredAmount)
        internal
        pure
        returns(uint taken, uint remainder)
    {
        if (_requiredAmount > _available)
            return (_available, 0);

        remainder = _available - _requiredAmount;
        return (_requiredAmount, remainder);
    }

    /** @dev Make a fee contribution.
     *  @param _round The round to contribute to.
     *  @param _side The side to contribute to.
     *  @param _contributor The contributor.
     *  @param _amount The amount contributed.
     *  @param _totalRequired The total amount required for this side.
     *  @return The amount of fees contributed.
     */
    function contribute(Round storage _round, Party _side, address payable _contributor, uint _amount, uint _totalRequired) internal returns (uint) {
        uint contribution;
        uint remainingETH;
        (contribution, remainingETH) = calculateContribution(_amount, _totalRequired.subCap(_round.paidFees[uint(_side)]));
        _round.contributions[_contributor][uint(_side)] += contribution;
        _round.paidFees[uint(_side)] += contribution;
        _round.feeRewards += contribution;

        if (remainingETH != 0)
            _contributor.send(remainingETH);

        return contribution;
    }

    /** @dev Execute the ruling of a dispute.
     *  @param _submissionID ID of the submission.
     *  @param _challengeID ID of the challenge, related to the dispute.
     *  @param _winner Ruling given by the arbitrator. Note that 0 is reserved for "Refused to arbitrate".
     */
    function executeRuling(address _submissionID, uint _challengeID, Party _winner) internal {
        Submission storage submission = submissions[_submissionID];
        uint requestID = submission.requests.length - 1;
        Status status = submission.status;

        Request storage request = submission.requests[requestID];
        uint nbParallelDisputes = request.nbParallelDisputes;

        Challenge storage challenge = request.challenges[_challengeID];

        if (status == Status.PendingRemoval) {
            if (_winner == Party.Requester)
                submission.registered = false;

            submission.status = Status.None;
            request.resolved = true;
        } else if (status == Status.PendingRegistration) {
            // For a registration request there can be more than one dispute.
            if (_winner == Party.Requester) {
                if (nbParallelDisputes == 1) {
                    // Check whether or not the requester won all of his previous disputes for current reason.
                    if (!request.requesterLost) {
                        if (request.usedReasons == FULL_REASONS_SET) {
                            // All reasons being used means the request can't be challenged again, so we can update its status.
                            submission.status = Status.None;
                            submission.registered = true;
                            submission.submissionTime = uint64(now);
                            request.resolved = true;
                        } else {
                            // Refresh the state of the request so it can be challenged again.
                            request.disputed = false;
                            request.challengePeriodStart = uint64(now);
                            request.currentReason = Reason.None;
                        }
                    } else {
                        submission.status = Status.None;
                        request.resolved = true;
                    }
                }
            // Challenger won or it’s a tie.
            } else {
                request.requesterLost = true;
                // Update the status of the submission if there is no more disputes left.
                if (nbParallelDisputes == 1) {
                    submission.status = Status.None;
                    request.resolved = true;
                }
                // Store the challenger that made the requester lose. Update the challenger if there is a duplicate with lower submission time, which is indicated by submission's index.
                if (_winner==Party.Challenger && (request.ultimateChallenger==address(0x0) || challenge.duplicateSubmissionIndex<request.currentDuplicateIndex)) {
                    request.ultimateChallenger = challenge.challenger;
                    request.currentDuplicateIndex = challenge.duplicateSubmissionIndex;
                }
            }
        }
        // Decrease the number of parallel disputes each time the dispute is resolved. Store the rulings of each dispute for correct distribution of rewards.
        request.nbParallelDisputes--;
        challenge.ruling = _winner;
        emit ChallengeResolved(_submissionID, requestID, _challengeID);
    }

    // ************************ //
    // *       Getters        * //
    // ************************ //

    /** @dev Returns true if the submission is registered and not expired.
     *  @param _submissionID The address of the submission.
     *  @return Whether the submission is registered or not.
     */
    function isRegistered(address _submissionID) external view returns (bool) {
        Submission storage submission = submissions[_submissionID];
        return submission.registered && now - submission.submissionTime <= submissionDuration;
    }

    /** @dev Gets the number of times the arbitrator data was updated.
     *  @return The number of arbitrator data updates.
     */
    function getArbitratorDataListCount() external view returns (uint) {
        return arbitratorDataList.length;
    }

    /** @dev Checks whether the duplicate address has been used in challenging the request or not.
     *  @param _submissionID The address of the submission to check.
     *  @param _requestID The request to check.
     *  @param _duplicateID The duplicate to check.
     *  @return Whether the duplicate has been used.
     */
    function checkRequestDuplicates(address _submissionID, uint _requestID, address _duplicateID) external view returns (bool) {
        Request storage request = submissions[_submissionID].requests[_requestID];
        return request.challengeDuplicates[_duplicateID];
    }

    /** @dev Gets the contributions made by a party for a given round of a given challenge of a request.
     *  @param _submissionID The address of the submission.
     *  @param _requestID The request to query.
     *  @param _challengeID the challenge to query.
     *  @param _round The round to query.
     *  @param _contributor The address of the contributor.
     *  @return The contributions.
     */
    function getContributions(
        address _submissionID,
        uint _requestID,
        uint _challengeID,
        uint _round,
        address _contributor
    ) external view returns(uint[3] memory contributions) {
        Request storage request = submissions[_submissionID].requests[_requestID];
        Challenge storage challenge = request.challenges[_challengeID];
        Round storage round = challenge.rounds[_round];
        contributions = round.contributions[_contributor];
    }

    /** @dev Returns the information of the submission. Includes length of requests array.
     *  @param _submissionID The address of the queried submission.
     *  @return The information of the submission.
     */
    function getSubmissionInfo(address _submissionID)
        external
        view
        returns (
            Status status,
            uint64 submissionTime,
            uint64 index,
            bool registered,
            bool hasVouched,
            uint numberOfRequests
        )
    {
        Submission storage submission = submissions[_submissionID];
        return (
            submission.status,
            submission.submissionTime,
            submission.index,
            submission.registered,
            submission.hasVouched,
            submission.requests.length
        );
    }

    /** @dev Gets the information of a particular challenge of the request.
     *  @param _submissionID The address of the queried submission.
     *  @param _requestID The request to query.
     *  @param _challengeID The challenge to query.
     *  @return The information of the challenge.
     */
    function getChallengeInfo(address _submissionID, uint _requestID, uint _challengeID)
        external
        view
        returns (
            uint16 lastRoundID,
            address challenger,
            uint disputeID,
            Party ruling,
            uint64 duplicateSubmissionIndex
        )
    {
        Request storage request = submissions[_submissionID].requests[_requestID];
        Challenge storage challenge = request.challenges[_challengeID];
        return (
            challenge.lastRoundID,
            challenge.challenger,
            challenge.disputeID,
            challenge.ruling,
            challenge.duplicateSubmissionIndex
        );
    }

    /** @dev Gets information of a request of a submission.
     *  @param _submissionID The address of the queried submission.
     *  @param _requestID The request to be queried.
     *  @return The request information.
     */
    function getRequestInfo(address _submissionID, uint _requestID)
        external
        view
        returns (
            bool disputed,
            bool resolved,
            bool requesterLost,
            Reason currentReason,
            uint16 nbParallelDisputes,
            uint16 lastChallengeID,
            uint16 arbitratorDataID,
            address payable requester,
            address payable ultimateChallenger,
            uint8 usedReasons
        )
    {
        Request storage request = submissions[_submissionID].requests[_requestID];
        return (
            request.disputed,
            request.resolved,
            request.requesterLost,
            request.currentReason,
            request.nbParallelDisputes,
            request.lastChallengeID,
            request.arbitratorDataID,
            request.requester,
            request.ultimateChallenger,
            request.usedReasons
        );
    }

    /** @dev Gets the number of vouches of a particular request.
     *  @param _submissionID The address of the queried submission.
     *  @param _requestID The request to query.
     *  @return The current number of vouches.
     */
    function getNumberOfVouches(address _submissionID, uint _requestID) external view returns (uint) {
        Request storage request = submissions[_submissionID].requests[_requestID];
        return request.vouches.length;
    }

    /** @dev Gets the information of a round of a request.
     *  @param _submissionID The address of the queried submission.
     *  @param _requestID The request to query.
     *  @param _challengeID The challenge to query.
     *  @param _round The round to query.
     *  @return The round information.
     */
    function getRoundInfo(address _submissionID, uint _requestID, uint _challengeID, uint _round)
        external
        view
        returns (
            bool appealed,
            uint[3] memory paidFees,
            Party sideFunded,
            uint feeRewards
        )
    {
        Request storage request = submissions[_submissionID].requests[_requestID];
        Challenge storage challenge = request.challenges[_challengeID];
        Round storage round = challenge.rounds[_round];
        appealed = _round < (challenge.lastRoundID);
        return (
            appealed,
            round.paidFees,
            round.sideFunded,
            round.feeRewards
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IArbitrator","name":"_arbitrator","type":"address"},{"internalType":"bytes","name":"_arbitratorExtraData","type":"bytes"},{"internalType":"string","name":"_registrationMetaEvidence","type":"string"},{"internalType":"string","name":"_clearingMetaEvidence","type":"string"},{"internalType":"uint256","name":"_submissionBaseDeposit","type":"uint256"},{"internalType":"uint64","name":"_submissionDuration","type":"uint64"},{"internalType":"uint64","name":"_renewalPeriodDuration","type":"uint64"},{"internalType":"uint64","name":"_challengePeriodDuration","type":"uint64"},{"internalType":"uint256[3]","name":"_multipliers","type":"uint256[3]"},{"internalType":"uint64","name":"_requiredNumberOfVouches","type":"uint64"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_submissionID","type":"address"},{"indexed":false,"internalType":"uint256","name":"_requestID","type":"uint256"}],"name":"AddSubmission","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_submissionID","type":"address"},{"indexed":true,"internalType":"uint256","name":"_challengeID","type":"uint256"},{"indexed":false,"internalType":"enum ProofOfHumanity.Party","name":"_party","type":"uint8"},{"indexed":true,"internalType":"address","name":"_contributor","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"AppealContribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IArbitrator","name":"_arbitrator","type":"address"},{"indexed":true,"internalType":"address","name":"_governor","type":"address"},{"indexed":false,"internalType":"uint256","name":"_submissionBaseDeposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_submissionDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_challengePeriodDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_requiredNumberOfVouches","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_sharedStakeMultiplier","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_winnerStakeMultiplier","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_loserStakeMultiplier","type":"uint256"}],"name":"ArbitratorComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_submissionID","type":"address"},{"indexed":true,"internalType":"uint256","name":"_requestID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_challengeID","type":"uint256"}],"name":"ChallengeResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IArbitrator","name":"_arbitrator","type":"address"},{"indexed":true,"internalType":"uint256","name":"_disputeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_metaEvidenceID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_evidenceGroupID","type":"uint256"}],"name":"Dispute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IArbitrator","name":"_arbitrator","type":"address"},{"indexed":true,"internalType":"uint256","name":"_evidenceGroupID","type":"uint256"},{"indexed":true,"internalType":"address","name":"_party","type":"address"},{"indexed":false,"internalType":"string","name":"_evidence","type":"string"}],"name":"Evidence","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_submissionID","type":"address"},{"indexed":true,"internalType":"uint256","name":"_challengeID","type":"uint256"},{"indexed":false,"internalType":"enum ProofOfHumanity.Party","name":"_side","type":"uint8"}],"name":"HasPaidAppealFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_metaEvidenceID","type":"uint256"},{"indexed":false,"internalType":"string","name":"_evidence","type":"string"}],"name":"MetaEvidence","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_submissionID","type":"address"},{"indexed":false,"internalType":"uint256","name":"_requestID","type":"uint256"}],"name":"ReapplySubmission","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_requester","type":"address"},{"indexed":true,"internalType":"address","name":"_submissionID","type":"address"},{"indexed":false,"internalType":"uint256","name":"_requestID","type":"uint256"}],"name":"RemoveSubmission","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IArbitrator","name":"_arbitrator","type":"address"},{"indexed":true,"internalType":"uint256","name":"_disputeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_ruling","type":"uint256"}],"name":"Ruling","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_submissionID","type":"address"},{"indexed":true,"internalType":"uint256","name":"_requestID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_challengeID","type":"uint256"}],"name":"SubmissionChallenged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_submissionID","type":"address"},{"indexed":true,"internalType":"address","name":"_voucher","type":"address"}],"name":"VouchAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_submissionID","type":"address"},{"indexed":true,"internalType":"address","name":"_voucher","type":"address"}],"name":"VouchRemoved","type":"event"},{"constant":false,"inputs":[{"internalType":"string","name":"_evidence","type":"string"},{"internalType":"string","name":"_name","type":"string"}],"name":"addSubmission","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_submissionIDs","type":"address[]"},{"internalType":"string[]","name":"_evidence","type":"string[]"},{"internalType":"string[]","name":"_names","type":"string[]"}],"name":"addSubmissionManually","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"}],"name":"addVouch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"arbitratorDataList","outputs":[{"internalType":"contract IArbitrator","name":"arbitrator","type":"address"},{"internalType":"uint96","name":"metaEvidenceUpdates","type":"uint96"},{"internalType":"bytes","name":"arbitratorExtraData","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"arbitratorDisputeIDToDisputeData","outputs":[{"internalType":"uint96","name":"challengeID","type":"uint96"},{"internalType":"address","name":"submissionID","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"challengePeriodDuration","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"},{"internalType":"enum ProofOfHumanity.Reason","name":"_reason","type":"uint8"},{"internalType":"address","name":"_duplicateID","type":"address"},{"internalType":"string","name":"_evidence","type":"string"}],"name":"challengeRequest","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IArbitrator","name":"_arbitrator","type":"address"},{"internalType":"bytes","name":"_arbitratorExtraData","type":"bytes"}],"name":"changeArbitrator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint64","name":"_submissionDuration","type":"uint64"},{"internalType":"uint64","name":"_renewalPeriodDuration","type":"uint64"},{"internalType":"uint64","name":"_challengePeriodDuration","type":"uint64"}],"name":"changeDurations","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_governor","type":"address"}],"name":"changeGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_loserStakeMultiplier","type":"uint256"}],"name":"changeLoserStakeMultiplier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_registrationMetaEvidence","type":"string"},{"internalType":"string","name":"_clearingMetaEvidence","type":"string"}],"name":"changeMetaEvidence","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint64","name":"_requiredNumberOfVouches","type":"uint64"}],"name":"changeRequiredNumberOfVouches","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_sharedStakeMultiplier","type":"uint256"}],"name":"changeSharedStakeMultiplier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"},{"internalType":"address[]","name":"_vouches","type":"address[]"},{"internalType":"bytes[]","name":"_signatures","type":"bytes[]"},{"internalType":"uint256[]","name":"_expirationTimestamps","type":"uint256[]"}],"name":"changeStateToPending","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_submissionBaseDeposit","type":"uint256"}],"name":"changeSubmissionBaseDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_winnerStakeMultiplier","type":"uint256"}],"name":"changeWinnerStakeMultiplier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"},{"internalType":"uint256","name":"_requestID","type":"uint256"},{"internalType":"address","name":"_duplicateID","type":"address"}],"name":"checkRequestDuplicates","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"}],"name":"executeRequest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"},{"internalType":"uint256","name":"_challengeID","type":"uint256"},{"internalType":"enum ProofOfHumanity.Party","name":"_side","type":"uint8"}],"name":"fundAppeal","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"}],"name":"fundSubmission","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getArbitratorDataListCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"},{"internalType":"uint256","name":"_requestID","type":"uint256"},{"internalType":"uint256","name":"_challengeID","type":"uint256"}],"name":"getChallengeInfo","outputs":[{"internalType":"uint16","name":"lastRoundID","type":"uint16"},{"internalType":"address","name":"challenger","type":"address"},{"internalType":"uint256","name":"disputeID","type":"uint256"},{"internalType":"enum ProofOfHumanity.Party","name":"ruling","type":"uint8"},{"internalType":"uint64","name":"duplicateSubmissionIndex","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"},{"internalType":"uint256","name":"_requestID","type":"uint256"},{"internalType":"uint256","name":"_challengeID","type":"uint256"},{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"address","name":"_contributor","type":"address"}],"name":"getContributions","outputs":[{"internalType":"uint256[3]","name":"contributions","type":"uint256[3]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"},{"internalType":"uint256","name":"_requestID","type":"uint256"}],"name":"getNumberOfVouches","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"},{"internalType":"uint256","name":"_requestID","type":"uint256"}],"name":"getRequestInfo","outputs":[{"internalType":"bool","name":"disputed","type":"bool"},{"internalType":"bool","name":"resolved","type":"bool"},{"internalType":"bool","name":"requesterLost","type":"bool"},{"internalType":"enum ProofOfHumanity.Reason","name":"currentReason","type":"uint8"},{"internalType":"uint16","name":"nbParallelDisputes","type":"uint16"},{"internalType":"uint16","name":"lastChallengeID","type":"uint16"},{"internalType":"uint16","name":"arbitratorDataID","type":"uint16"},{"internalType":"address payable","name":"requester","type":"address"},{"internalType":"address payable","name":"ultimateChallenger","type":"address"},{"internalType":"uint8","name":"usedReasons","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"},{"internalType":"uint256","name":"_requestID","type":"uint256"},{"internalType":"uint256","name":"_challengeID","type":"uint256"},{"internalType":"uint256","name":"_round","type":"uint256"}],"name":"getRoundInfo","outputs":[{"internalType":"bool","name":"appealed","type":"bool"},{"internalType":"uint256[3]","name":"paidFees","type":"uint256[3]"},{"internalType":"enum ProofOfHumanity.Party","name":"sideFunded","type":"uint8"},{"internalType":"uint256","name":"feeRewards","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"}],"name":"getSubmissionInfo","outputs":[{"internalType":"enum ProofOfHumanity.Status","name":"status","type":"uint8"},{"internalType":"uint64","name":"submissionTime","type":"uint64"},{"internalType":"uint64","name":"index","type":"uint64"},{"internalType":"bool","name":"registered","type":"bool"},{"internalType":"bool","name":"hasVouched","type":"bool"},{"internalType":"uint256","name":"numberOfRequests","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"loserStakeMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"},{"internalType":"uint256","name":"_requestID","type":"uint256"},{"internalType":"uint256","name":"_iterations","type":"uint256"}],"name":"processVouches","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_evidence","type":"string"},{"internalType":"string","name":"_name","type":"string"}],"name":"reapplySubmission","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"},{"internalType":"string","name":"_evidence","type":"string"}],"name":"removeSubmission","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"}],"name":"removeSubmissionManually","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"}],"name":"removeVouch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"renewalPeriodDuration","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"requiredNumberOfVouches","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_disputeID","type":"uint256"},{"internalType":"uint256","name":"_ruling","type":"uint256"}],"name":"rule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sharedStakeMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"submissionBaseDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"submissionCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"submissionDuration","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_submissionID","type":"address"},{"internalType":"string","name":"_evidence","type":"string"}],"name":"submitEvidence","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"vouches","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"winnerStakeMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_beneficiary","type":"address"},{"internalType":"address","name":"_submissionID","type":"address"},{"internalType":"uint256","name":"_requestID","type":"uint256"},{"internalType":"uint256","name":"_challengeID","type":"uint256"},{"internalType":"uint256","name":"_round","type":"uint256"}],"name":"withdrawFeesAndRewards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawSubmission","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162006311380380620063118339810160408190526200003491620004af565b6000600080516020620062f18339815191528960405162000056919062000760565b60405180910390a26001600080516020620062f18339815191528860405162000080919062000760565b60405180910390a260018054336001600160a01b03199091161781556002879055600380548451600455602085015160055560408501516006556001600160401b0319166001600160401b0388811691909117600160401b600160801b031916680100000000000000008883160217600160801b600160c01b031916600160801b87831602176001600160c01b0316600160c01b918516919091021790556008805460009262000134908390830162000260565b815481106200013f57fe5b60009182526020918290206002919091020180546001600160a01b0319166001600160a01b038e161781558b5190925062000183916001840191908d019062000294565b50337fe313403816674ac13a5fd6524fafc793584c317c3c947825b71a753b0c155b208c8989888789600060200201518a600160200201518b60026020020151604051620001d9989796959493929190620006d9565b60405180910390a26040517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8669046908290620002159062000686565b6040519081900381206200023192918490309060200162000693565b6040516020818303038152906040528051906020012060008190555050505050505050505050505050620008a2565b8154818355818111156200028f576002028160020283600052602060002091820191016200028f919062000319565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002d757805160ff191683800117855562000307565b8280016001018555821562000307579182015b8281111562000307578251825591602001919060010190620002ea565b50620003159291506200034a565b5090565b6200034791905b80821115620003155760008082556200033d600183018262000367565b5060020162000320565b90565b6200034791905b8082111562000315576000815560010162000351565b50805460018160011615610100020316600290046000825580601f106200038f5750620003af565b601f016020900490600052602060002090810190620003af91906200034a565b50565b600082601f830112620003c457600080fd5b6003620003db620003d582620007a1565b6200077a565b91508183856020840282011115620003f257600080fd5b60005b838110156200042257816200040b888262000495565b8452506020928301929190910190600101620003f5565b5050505092915050565b600082601f8301126200043e57600080fd5b81516200044f620003d582620007bf565b915080825260208301602083018583830111156200046c57600080fd5b6200047983828462000838565b50505092915050565b80516200048f8162000875565b92915050565b80516200048f816200088c565b80516200048f8162000897565b6000806000806000806000806000806101808b8d031215620004d057600080fd5b6000620004de8d8d62000482565b9a505060208b01516001600160401b03811115620004fb57600080fd5b620005098d828e016200042c565b99505060408b01516001600160401b038111156200052657600080fd5b620005348d828e016200042c565b98505060608b01516001600160401b038111156200055157600080fd5b6200055f8d828e016200042c565b9750506080620005728d828e0162000495565b96505060a0620005858d828e01620004a2565b95505060c0620005988d828e01620004a2565b94505060e0620005ab8d828e01620004a2565b935050610100620005bf8d828e01620003b2565b925050610160620005d38d828e01620004a2565b9150509295989b9194979a5092959850565b620005f081620007f9565b82525050565b620005f08162000347565b620005f08162000806565b60006200061982620007e7565b620006258185620007eb565b93506200063781856020860162000838565b62000642816200086b565b9093019392505050565b60006200065b601183620007f4565b7050726f6f66206f662048756d616e69747960781b815260110192915050565b620005f0816200082b565b60006200048f826200064c565b60808101620006a38287620005f6565b620006b26020830186620005f6565b620006c16040830185620005f6565b620006d06060830184620005e5565b95945050505050565b6101008101620006ea828b62000601565b620006f9602083018a620005f6565b6200070860408301896200067b565b6200071760608301886200067b565b6200072660808301876200067b565b6200073560a0830186620005f6565b6200074460c0830185620005f6565b6200075360e0830184620005f6565b9998505050505050505050565b602080825281016200077381846200060c565b9392505050565b6040518181016001600160401b03811182821017156200079957600080fd5b604052919050565b60006001600160401b03821115620007b857600080fd5b5060200290565b60006001600160401b03821115620007d657600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b919050565b60006200048f8262000813565b60006200048f82620007f9565b6001600160a01b031690565b6001600160401b031690565b60006200048f826200081f565b60005b83811015620008555781810151838201526020016200083b565b8381111562000865576000848401525b50505050565b601f01601f191690565b620008808162000806565b8114620003af57600080fd5b620008808162000347565b62000880816200081f565b615a3f80620008b26000396000f3fe6080604052600436106102925760003560e01c806390d7c13c1161015a578063ce52b9f4116100c1578063e4c0aaf41161007a578063e4c0aaf4146107cd578063ec0e71ba146107ed578063f40e0aed1461081c578063f4934cdb1461082f578063f633c29314610842578063f65ab1be1461085757610292565b8063ce52b9f414610706578063d64240de1461071b578063d706be311461074c578063d7e9f1781461076c578063dd254cd31461077f578063deb8f707146107ad57610292565b8063a84dc70e11610113578063a84dc70e14610641578063adc7faba14610671578063b4dfe93d14610691578063ba7079ca146106b1578063bb0b86ff146106d1578063c3c5a547146106e657610292565b806390d7c13c1461058757806392239dff1461059c57806397973043146105bc5780639a72e0b3146105ee578063a27456bb1461060e578063a6c6ecc91461062157610292565b806341658341116101fe5780636e112409116101b75780636e112409146104d25780636e98762d1461050857806376c23ff1146105285780637b9433831461053d57806384d1c91a14610552578063876c63d41461057257610292565b806341658341146104375780634690d55a1461044c5780635a9ef3411461045f5780635bb5e55b1461047257806361b9054114610492578063649a08bf146104b257610292565b80632d9489c6116102505780632d9489c6146103755780632e8485061461038a578063311a6c56146103aa57806332fe596f146103ca57806333e5d047146103ea5780633a8363c21461040a57610292565b806282a36d146102975780630b337be6146102c25780630c340a24146102ef57806312ce3525146103115780631d5120851461033357806326bafe5f14610355575b600080fd5b3480156102a357600080fd5b506102ac610877565b6040516102b99190615822565b60405180910390f35b3480156102ce57600080fd5b506102e26102dd366004614635565b61088d565b6040516102b991906153cf565b3480156102fb57600080fd5b506103046108ad565b6040516102b991906153b3565b34801561031d57600080fd5b5061033161032c366004614aee565b6108bc565b005b34801561033f57600080fd5b506103486108f4565b6040516102b991906157f4565b34801561036157600080fd5b50610331610370366004614b97565b6108fa565b34801561038157600080fd5b506102ac6109c6565b34801561039657600080fd5b506102e26103a5366004614825565b6109dc565b3480156103b657600080fd5b506103316103c5366004614b2a565b610a3d565b3480156103d657600080fd5b506103316103e53660046145a2565b610be6565b3480156103f657600080fd5b50610331610405366004614aee565b610c3e565b34801561041657600080fd5b5061042a610425366004614959565b610c6d565b6040516102b991906153c1565b34801561044357600080fd5b50610348610d1a565b61033161045a366004614a80565b610d20565b61033161046d366004614a80565b610e3c565b34801561047e57600080fd5b5061033161048d3660046147a0565b610f8d565b34801561049e57600080fd5b506103316104ad3660046149c1565b611053565b3480156104be57600080fd5b506103316104cd3660046148b5565b6112e3565b3480156104de57600080fd5b506104f26104ed3660046147f5565b6114d3565b6040516102b99a99989796959493929190615412565b34801561051457600080fd5b506103316105233660046145a2565b6115aa565b34801561053457600080fd5b50610348611737565b34801561054957600080fd5b5061034861173d565b34801561055e57600080fd5b5061033161056d3660046145a2565b611743565b34801561057e57600080fd5b506102ac611798565b34801561059357600080fd5b506103486117ae565b3480156105a857600080fd5b506103316105b7366004614aee565b6117b5565b3480156105c857600080fd5b506105dc6105d73660046145a2565b6117e4565b6040516102b99695949392919061556b565b3480156105fa57600080fd5b506103316106093660046145c0565b61183b565b61033161061c3660046145a2565b611acb565b34801561062d57600080fd5b5061033161063c3660046145a2565b611c59565b34801561064d57600080fd5b5061066161065c3660046148f8565b611ce8565b6040516102b994939291906153dd565b34801561067d57600080fd5b5061033161068c366004614aee565b611dbb565b34801561069d57600080fd5b506103316106ac36600461466f565b611dea565b3480156106bd57600080fd5b506103316106cc366004614a5f565b612459565b3480156106dd57600080fd5b50610348612591565b3480156106f257600080fd5b506102e26107013660046145a2565b612597565b34801561071257600080fd5b506103316125e9565b34801561072757600080fd5b5061073b6107363660046148b5565b612685565b6040516102b99594939291906157a8565b34801561075857600080fd5b50610331610767366004614a80565b612728565b61033161077a366004614872565b612951565b34801561078b57600080fd5b5061079f61079a3660046147f5565b612f15565b6040516102b992919061583e565b3480156107b957600080fd5b506103486107c83660046147f5565b612f4d565b3480156107d957600080fd5b506103316107e83660046145a2565b612f95565b3480156107f957600080fd5b5061080d610808366004614aee565b612fe1565b6040516102b993929190615515565b61033161082a366004614723565b6130b2565b61033161083d3660046147a0565b613947565b34801561084e57600080fd5b506102ac613c83565b34801561086357600080fd5b50610331610872366004614b79565b613c92565b600354600160801b90046001600160401b031681565b600a60209081526000928352604080842090915290825290205460ff1681565b6001546001600160a01b031681565b6001546001600160a01b031633146108ef5760405162461bcd60e51b81526004016108e690615748565b60405180910390fd5b600455565b60065481565b6001546001600160a01b031633146109245760405162461bcd60e51b81526004016108e690615748565b6001600160401b03808416906109429083168463ffffffff613ce416565b6001600160401b0316106109685760405162461bcd60e51b81526004016108e690615638565b6003805467ffffffffffffffff19166001600160401b03948516176fffffffffffffffff00000000000000001916600160401b938516939093029290921767ffffffffffffffff60801b1916600160801b9190931602919091179055565b600354600160c01b90046001600160401b031681565b6001600160a01b0383166000908152600960205260408120600101805482919085908110610a0657fe5b600091825260208083206001600160a01b03871684526005600690930201919091019052604090205460ff169150505b9392505050565b6000816002811115610a4b57fe5b336000908152600b6020908152604080832087845282528083208054600160601b81046001600160a01b03168086526009909452918420600181018054969750919593946001600160601b0390931693909291906000198101908110610aad57fe5b60009182526020808320868452600460069093020191820181526040808420600181015461ffff6101009091048116865260028201909352908420835460088054959750929591949193600160381b90910416908110610b0957fe5b6000918252602090912060029091020180549091506001600160a01b03163314610b3257600080fd5b8354610100900460ff1615610b4657600080fd5b6001600383015460ff166002811115610b5b57fe5b1415610b6a5760019850610b8a565b6002600383015460ff166002811115610b7f57fe5b1415610b8a57600298505b8a337f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e756222768b6002811115610bb957fe5b604051610bc691906157f4565b60405180910390a3610bd987878b613d14565b5050505050505050505050565b336000818152600a602090815260408083206001600160a01b0386168085529252808320805460ff191660011790555190917fc5482a4357210d662eeea6fa4589e76e47bdb84517a3b9da4f8b7576ae00170191a350565b6001546001600160a01b03163314610c685760405162461bcd60e51b81526004016108e690615748565b600255565b610c75614377565b6001600160a01b0386166000908152600960205260408120600101805487908110610c9c57fe5b6000918252602080832088845260069290920290910160048101825260408084208885526002810184528185206001600160a01b03891686526005810190945293819020815160608101928390529295509060039082845b815481526020019060010190808311610cf4575050505050935050505095945050505050565b60045481565b3360009081526009602052604090208054610100900460ff16158015610d5557506000815460ff166003811115610d5357fe5b145b610d715760405162461bcd60e51b81526004016108e690615708565b6001810154610dac576007805482546001600160401b03909116600160581b0267ffffffffffffffff60581b19909116178255805460010190555b805460ff19166001908117825581015460405133917f803727a67d35270dc2c090dc4f9cba1f9818a7200e65c2087eca187851fd6b1991610ded91906157f4565b60405180910390a2610e353386868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061400992505050565b5050505050565b3360009081526009602052604090208054610100900460ff168015610e7057506000815460ff166003811115610e6e57fe5b145b610e8c5760405162461bcd60e51b81526004016108e690615708565b600354600090610ed190610eb9906001600160401b0380821691600160401b90041663ffffffff6141fc16565b8354630100000090046001600160401b031690613ce4565b6001600160401b0316905080421015610efc5760405162461bcd60e51b81526004016108e6906156b8565b815460ff19166001908117835582015460405133917ff6cfccc832db8edf362f395f01d696c7da2db840d97eb1ec1ac44c980143990e91610f3d91906157f4565b60405180910390a2610f853387878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061400992505050565b505050505050565b6001600160a01b03831660009081526009602052604081206001810180549192916000198101908110610fbc57fe5b90600052602060002090600602019050600060088260000160079054906101000a900461ffff1661ffff1681548110610ff157fe5b600091825260209091206001850154600290920201805460405191935033926000196001600160a01b038b811690920101929116906000805160206159dd83398151915290611043908a908a906155c5565b60405180910390a4505050505050565b6001546001600160a01b0316331461107d5760405162461bcd60e51b81526004016108e690615748565b6007546008546000190160005b878110156112d6576000600960008b8b858181106110a457fe5b90506020020160206110b991908101906145a2565b6001600160a01b0316815260208101919091526040016000206001810154909150156110f75760405162461bcd60e51b81526004016108e690615728565b805467ffffffffffffffff60581b1916600160581b6001600160401b0386160217815560018082018054958201956000926111359083908301614395565b8154811061113f57fe5b600091825260208220845461010061ff001991821681176affffffffffffffff00000019166301000000426001600160401b031602178755600693909302909101805461ffff60381b1916600160381b61ffff8a160217909116909117815591508989858181106111ac57fe5b602002820190508035601e19368490030181126111c857600080fd5b909101602081019150356001600160401b038111156111e657600080fd5b368190038213156111f657600080fd5b905011156112cc57338b8b8581811061120b57fe5b905060200201602061122091908101906145a2565b6001600160a01b03166008868154811061123657fe5b60009182526020909120600290910201546001600160a01b03166000805160206159dd8339815191528c8c8881811061126b57fe5b602002820190508035601e193684900301811261128757600080fd5b909101602081019150356001600160401b038111156112a557600080fd5b368190038213156112b557600080fd5b6040516112c39291906155c5565b60405180910390a45b505060010161108a565b5050600755505050505050565b6001600160a01b03831660009081526009602052604081206001810180549192918590811061130e57fe5b600091825260209091206006909102018054909150610100900460ff166113475760405162461bcd60e51b81526004016108e6906156f8565b805463ffffffff600160581b90910481169060009061136a908690849061422916565b60038401549091508082111561137e578091505b83546002850154630100000090910460ff16906000906001600160a01b0316158015906113cb575060038260048111156113b457fe5b14806113cb575060048260048111156113c957fe5b145b9050845b848110156114a5576000600960008960030184815481106113ec57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805462ff0000191681559050821561149c576001815460ff16600381111561143457fe5b148061144f57506002815460ff16600381111561144d57fe5b145b156114925760018181018054600019810190811061146957fe5b600091825260209091206006909102018054911515620100000262ff0000199092169190911790555b805461ff00191681555b506001016113cf565b5050845463ffffffff909316600160581b0263ffffffff60581b199093169290921790935550505050505050565b6000806000806000806000806000806000600960008e6001600160a01b03166001600160a01b031681526020019081526020016000206001018c8154811061151757fe5b600091825260209091206006909102018054600182015460029092015460ff8083169e50610100830481169d5062010000830481169c506301000000830481169b5061ffff65010000000000840481169b50600160481b840481169a50600160381b84041698506001600160a01b039384169750921694506401000000009004169150509295989b9194979a5092959850565b6001600160a01b03811660009081526009602052604081206001810180549192600019830192909190839081106115dd57fe5b600091825260209091206003546006909202018054909250600160801b9091046001600160401b03908116600160b81b909204164203116116305760405162461bcd60e51b81526004016108e6906156a8565b805460ff16156116525760405162461bcd60e51b81526004016108e690615718565b60006002845460ff16600381111561166657fe5b14156116b157815462010000900460ff166116aa57835461010061ff0019909116176affffffffffffffff00000019166301000000426001600160401b0316021784555b50836116fe565b6003845460ff1660038111156116c357fe5b14156116e65750825461ff001916835560018101546001600160a01b03166116fe565b60405162461bcd60e51b81526004016108e690615648565b835460ff19168455815461ff001916610100178255600382015415611729576117298584600a6112e3565b610e3581868560008061183b565b60075481565b60055481565b336000818152600a602090815260408083206001600160a01b0386168085529252808320805460ff191690555190917fd6f782ad61ba30c1b39b77f1bf37061e68733360288a441e70d08c0a91b0cbc591a350565b600354600160401b90046001600160401b031681565b6008545b90565b6001546001600160a01b031633146117df5760405162461bcd60e51b81526004016108e690615748565b600655565b6001600160a01b03166000908152600960205260409020805460019091015460ff808316936001600160401b0363010000008504811694600160581b81049091169361010082048416936201000090920490911691565b6001600160a01b03841660009081526009602052604081206001810180549192918690811061186657fe5b600091825260208083208784526004600690930201918201815260408084208785526002810190925290922081549193509060ff610100909104166118bd5760405162461bcd60e51b81526004016108e6906156f8565b6001600160a01b0389166118e35760405162461bcd60e51b81526004016108e690615668565b600182015460ff166000861580159061190857506001840154610100900461ffff1687145b1561193957506001600160a01b038a1660009081526005830160205260409020600281015460019091015401611a7f565b600082600281111561194757fe5b14156119a6576001808401546002808601546001600160a01b038f1660009081526005880160205260409020938401549390910154910191018161198c57600061199d565b81856004015482028161199b57fe5b045b92505050611a7f565b861580156119c3575060028501546001600160a01b038c81169116145b80156119cd575087155b156119e357506004820180546000909155611a7f565b60028501546001600160a01b031615806119fc57508715155b80611a0657508615155b15611a7f57600083836002811115611a1a57fe5b60038110611a2457fe5b0154905060008111611a37576000611a7b565b60048401546001600160a01b038d1660009081526005860160205260409020829190856002811115611a6557fe5b60038110611a6f57fe5b01540281611a7957fe5b045b9150505b6001600160a01b038b16600081815260058501602052604080822060018101839055600201829055516108fc84150291849190818181858888f150505050505050505050505050505050565b6001600160a01b03811660009081526009602052604090206001815460ff166003811115611af557fe5b14611b125760405162461bcd60e51b81526004016108e690615708565b600181018054600091906000198101908110611b2a57fe5b600091825260208083208380526006929092029091016004810182526040808420600281019093528320815460088054939650939491939192600160381b90910461ffff16908110611b7857fe5b600091825260208220600290910201805460405163f7434ea960e01b81529193506001600160a01b03169063f7434ea990611bba906001860190600401615504565b60206040518083038186803b158015611bd257600080fd5b505afa158015611be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c0a9190810190614b0c565b90506000611c236002548361422990919063ffffffff16565b9050611c3384600133348561423e565b5080846001015410611c4f5760038401805460ff191660011790555b5050505050505050565b6001546001600160a01b03163314611c835760405162461bcd60e51b81526004016108e690615748565b6001600160a01b03811660009081526009602052604090208054610100900460ff168015611cc057506000815460ff166003811115611cbe57fe5b145b611cdc5760405162461bcd60e51b81526004016108e690615708565b805461ff001916905550565b6000611cf2614377565b6001600160a01b038616600090815260096020526040812060010180548291829189908110611d1d57fe5b600091825260208083208a84526006929092029091016004818101835260408085208b865260028101909452938490206001840154600380830154938301548751606081019889905261010090930461ffff168e109c50949750949591948b94869460ff1693909291859182845b815481526020019060010190808311611d8b57505050505092509650965096509650505050945094509450949050565b6001546001600160a01b03163314611de55760405162461bcd60e51b81526004016108e690615748565b600555565b6001600160a01b03871660009081526009602052604090206001815460ff166003811115611e1457fe5b14611e315760405162461bcd60e51b81526004016108e690615708565b600181018054600091906000198101908110611e4957fe5b60009182526020808320838052600460069093020191820181526040808420600281019092529092209092506001600382015460ff166002811115611e8a57fe5b14611ea75760405162461bcd60e51b81526004016108e690615688565b50506003546001600160401b0316420361190160f01b60005b8781108015611ee557506003805490850154600160c01b9091046001600160401b0316115b15612206576000807fa9e3fa1df5c3dbef1e9cfb610fa780355a0b5e0acb0fa8249777ec973ca789dc8e8a8a86818110611f1b57fe5b90506020020135604051602001611f34939291906154a7565b60405160208183030381529060405280519060200120905060008460005483604051602001611f659392919061537c565b60405160208183030381529060405280519060200120905060608c8c86818110611f8b57fe5b602002820190508035601e1936849003018112611fa757600080fd5b909101602081019150356001600160401b03811115611fc557600080fd5b36819003821315611fd557600080fd5b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506020850151604086015160608701519697509095909450901a915050601b81101561202e57601b015b8060ff16601b148061204357508060ff16601c145b61205f5760405162461bcd60e51b81526004016108e690615678565b6001858285856040516000815260200160405260405161208294939291906154cf565b6020604051602081039080840390855afa1580156120a4573d6000803e3d6000fd5b505060408051601f1901516001600160a01b03811660009081526009602052919091208054919950975062010000900460ff1615955050841593506120f39250505057508054610100900460ff165b801561211057508054630100000090046001600160401b03168511155b801561212d575088888481811061212357fe5b9050602002013542105b801561214b5750816001600160a01b03168e6001600160a01b031614155b156121fc57856003018290806001815401808255809150509060018203906000526020600020016000909192909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055505060018160000160026101000a81548160ff021916908315150217905550816001600160a01b03168e6001600160a01b03167fc5482a4357210d662eeea6fa4589e76e47bdb84517a3b9da4f8b7576ae00170160405160405180910390a35b5050600101611ec0565b5060005b898110801561222f57506003805490850154600160c01b9091046001600160401b0316115b156123e5576000600960008d8d8581811061224657fe5b905060200201602061225b91908101906145a2565b6001600160a01b031681526020810191909152604001600020805490915062010000900460ff1615801561229557508054610100900460ff165b80156122b257508054630100000090046001600160401b03168411155b80156123305750600a60008d8d858181106122c957fe5b90506020020160206122de91908101906145a2565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a900460ff165b801561236e57508b8b8381811061234357fe5b905060200201602061235891908101906145a2565b6001600160a01b03168d6001600160a01b031614155b156123dc57846003018c8c8481811061238357fe5b905060200201602061239891908101906145a2565b81546001810183556000928352602090922090910180546001600160a01b039092166001600160a01b0319909216919091179055805462ff00001916620100001781555b5060010161220a565b506003805490840154600160c01b9091046001600160401b0316111561241d5760405162461bcd60e51b81526004016108e690615618565b5050815460ff191660021790915580546001600160401b034216600160b81b0267ffffffffffffffff60b81b1990911617905550505050505050565b6001546001600160a01b031633146124835760405162461bcd60e51b81526004016108e690615748565b6008805460009190600019810190811061249957fe5b9060005260206000209060020201905060086040518060600160405280866001600160a01b031681526020018360000160149054906101000a90046001600160601b03166001600160601b0316815260200185858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250508354600181810180875595835260209283902085516002909302018054848701516001600160601b0316600160a01b026001600160a01b039485166001600160a01b03199092169190911790931692909217825560408501518051929450611c4f93918501929101906143c6565b60025481565b6001600160a01b03811660009081526009602052604081208054610100900460ff1680156125e0575060035481546001600160401b039182166301000000909104909116420311155b9150505b919050565b3360009081526009602052604090206001815460ff16600381111561260a57fe5b146126275760405162461bcd60e51b81526004016108e690615708565b60018101805460009190600019810190811061263f57fe5b600091825260208220845460ff1916855560069190910201805461ff00191661010017815560018401549092506126819133918291600019909101908061183b565b5050565b600080600080600080600960008a6001600160a01b03166001600160a01b0316815260200190815260200160002060010188815481106126c157fe5b600091825260208083209983526006919091029098016004019097525050604090942060018101549054610100820461ffff1698600160581b83046001600160a01b0316985090965060ff8216955063010000009091046001600160401b03169350915050565b6001546001600160a01b031633146127525760405162461bcd60e51b81526004016108e690615748565b6008805460009190600019810190811061276857fe5b60009182526020918290206002918202018054604080516060810182526001600160a01b0383168152600160a01b9092046001600160601b03908116600190810191821684880152808501805484516101009382161593909302600019011696909604601f81018890048802820188018452808252949750909560089593949285019391929083018282801561283f5780601f106128145761010080835404028352916020019161283f565b820191906000526020600020905b81548152906001019060200180831161282257829003601f168201915b50505091909252505081546001818101808555600094855260209485902084516002909402018054868601516001600160601b0316600160a01b026001600160a01b039586166001600160a01b0319909216919091179094169390931783556040840151805191956128b6938501929101906143c6565b50505050806002026001600160601b03167f61606860eb6c87306811e2695215385101daab53bd6ab4e9f9049aead9363c7d87876040516128f89291906155c5565b60405180910390a2806002026001016001600160601b03167f61606860eb6c87306811e2695215385101daab53bd6ab4e9f9049aead9363c7d85856040516129419291906155c5565b60405180910390a2505050505050565b600081600281111561295f57fe5b141561296a57600080fd5b6001600160a01b03831660009081526009602052604090206002815460ff16600381111561299457fe5b14806129af57506003815460ff1660038111156129ad57fe5b145b6129cb5760405162461bcd60e51b81526004016108e690615708565b6001810180546000919060001981019081106129e357fe5b60009182526020909120600690910201805490915060ff16612a175760405162461bcd60e51b81526004016108e6906156d8565b8054600160481b900461ffff168410612a425760405162461bcd60e51b81526004016108e6906155f8565b600084815260048201602052604081208254600880549293929091600160381b900461ffff16908110612a7157fe5b6000918252602082206002909102018054845460405163afe15cfb60e01b815292945083926001600160a01b039092169163afe15cfb91612ab4916004016157f4565b604080518083038186803b158015612acb57600080fd5b505afa158015612adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b039190810190614b49565b91509150814210158015612b1657508042105b612b325760405162461bcd60e51b81526004016108e690615608565b82548454604051631c3db16d60e01b815260009283926001600160a01b0390911691631c3db16d91612b66916004016157f4565b60206040518083038186803b158015612b7e57600080fd5b505afa158015612b92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612bb69190810190614b0c565b6002811115612bc157fe5b9050886002811115612bcf57fe5b816002811115612bdb57fe5b1415612beb576005549150612c34565b6000816002811115612bf957fe5b1415612c09576004549150612c34565b600654915060028484030484420310612c345760405162461bcd60e51b81526004016108e690615768565b506001850154610100900461ffff166000908152600280870160205260409091206003810154909160ff90911690811115612c6b57fe5b896002811115612c7757fe5b1415612c955760405162461bcd60e51b81526004016108e690615738565b8454865460405163791f8b7360e11b81526000926001600160a01b03169163f23f16e691612ccb919060018b0190600401615802565b60206040518083038186803b158015612ce357600080fd5b505afa158015612cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d1b9190810190614b0c565b90506000612d4b612710612d35848763ffffffff61431616565b81612d3c57fe5b8491900463ffffffff61422916565b90506000612d5c848d33348661423e565b9050336001600160a01b03168d8f6001600160a01b03167f9294febeba62e3f0e89187b59ba1235acc7fdbdebf15d6ede13c7b43adfa66dc8f85604051612da4929190615550565b60405180910390a481848d6002811115612dba57fe5b60038110612dc457fe5b015410612f05576000600385015460ff166002811115612de057fe5b1415612e0b576003840180548d919060ff19166001836002811115612e0157fe5b0217905550612ec2565b8754895460405163093225f160e31b81526001600160a01b03909216916349912f88918691612e42919060018e0190600401615802565b6000604051808303818588803b158015612e5b57600080fd5b505af1158015612e6f573d6000803e3d6000fd5b5050506001808c01805461ffff61010080830482169094011690920262ffff001990921691909117905550506004840154612eb0908463ffffffff61434016565b600485015560038401805460ff191690555b8c8e6001600160a01b03167f642c5385391e218917cf658cc1365fdffc24183646b08706ed51281972d1dc808e604051612efc9190615542565b60405180910390a35b5050505050505050505050505050565b600b6020908152600092835260408084209091529082529020546001600160601b03811690600160601b90046001600160a01b031682565b6001600160a01b0382166000908152600960205260408120600101805482919084908110612f7757fe5b60009182526020909120600360069092020101549150505b92915050565b6001546001600160a01b03163314612fbf5760405162461bcd60e51b81526004016108e690615748565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60088181548110612fee57fe5b60009182526020918290206002918202018054600180830180546040805161010094831615949094026000190190911695909504601f81018790048702830187019095528482526001600160a01b0383169650600160a01b9092046001600160601b031694929390928301828280156130a85780601f1061307d576101008083540402835291602001916130a8565b820191906000526020600020905b81548152906001019060200180831161308b57829003601f168201915b5050505050905083565b6001600160a01b03851660009081526009602052604090206002815460ff1660038111156130dc57fe5b14156131135760008560048111156130f057fe5b141561310e5760405162461bcd60e51b81526004016108e690615628565b61316e565b6003815460ff16600381111561312557fe5b141561315657600085600481111561313957fe5b1461310e5760405162461bcd60e51b81526004016108e690615778565b60405162461bcd60e51b81526004016108e690615708565b60018101805460009190600019810190811061318657fe5b600091825260209091206003546006909202018054909250600160801b9091046001600160401b03908116600160b81b90920416420311156131da5760405162461bcd60e51b81526004016108e6906156c8565b8054600160481b810461ffff1660009081526004830160205260409020906301000000900460ff16600388600481111561321057fe5b141561339a576001600160a01b03871660009081526009602052604081205460ff16600381111561323d57fe5b118061326657506001600160a01b038716600090815260096020526040902054610100900460ff165b6132825760405162461bcd60e51b81526004016108e690615758565b866001600160a01b0316896001600160a01b031614156132b45760405162461bcd60e51b81526004016108e690615798565b60038160048111156132c257fe5b14806132d9575060008160048111156132d757fe5b145b6132f55760405162461bcd60e51b81526004016108e6906156e8565b6001600160a01b038716600090815260058401602052604090205460ff16156133305760405162461bcd60e51b81526004016108e690615658565b6001600160a01b038716600090815260058401602090815260408083208054600160ff19909116811790915560099092529091205490830180546affffffffffffffff0000001916600160581b9092046001600160401b03166301000000029190911790556133bc565b825460ff16156133bc5760405162461bcd60e51b81526004016108e690615718565b8760048111156133c857fe5b8160048111156133d457fe5b1461347257600060018960048111156133e957fe5b0360ff166001901b90508060ff168460000160049054906101000a900460ff1619821660ff161461342c5760405162461bcd60e51b81526004016108e6906155e8565b835460ff640100000000808304821684189091160264ff0000000019909116178085558990859063ff0000001916630100000083600481111561346b57fe5b0217905550505b50600080805260028201602052604081208354600880549293929091600160381b900461ffff169081106134a257fe5b600091825260208220600290910201805460405163f7434ea960e01b81529193506001600160a01b03169063f7434ea9906134e4906001860190600401615504565b60206040518083038186803b1580156134fc57600080fd5b505afa158015613510573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506135349190810190614b0c565b905061354483600233348561423e565b5080836002015410156135695760405162461bcd60e51b81526004016108e690615788565b600483015461357e908263ffffffff61434016565b60048481019190915560038401805460ff19169055825460405163c13517e160e01b81526001600160a01b039091169163c13517e19184916135c891600291600189019101615802565b6020604051808303818588803b1580156135e157600080fd5b505af11580156135f5573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525061361a9190810190614b0c565b84600001819055503384600101600b6101000a8154816001600160a01b0302191690836001600160a01b031602179055506000600b60008460000160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060008660000154815260200190815260200160002090508560000160099054906101000a900461ffff1661ffff168160000160006101000a8154816001600160601b0302191690836001600160601b031602179055508b81600001600c6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060018660000160006101000a81548160ff02191690831515021790555085600001600581819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff1602179055505084600101600181819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff1602179055505060018760010180549050038c6001600160a01b03167f28ec07f413c7805003c29837f7f1b3799f30f7f87a1e1b5b9aaee94f665218ac8360000160009054906101000a90046001600160601b03166040516137ee9190615830565b60405180910390a38554600161ffff600160481b80840482169290920116026affff00000000000000000019909116178655845483546001600160a01b03167f74baab670a4015ab2f1b467c5252a96141a2573f2908e58a92081e80d3cfde3d60028a5460ff16600381111561386057fe5b14613888578560000160149054906101000a90046001600160601b031660020260010161389e565b8554600160a01b90046001600160601b03166002025b8f6001600160a01b031660018c6001018054905003016040516138c2929190615859565b60405180910390a3871561393957336001600160a01b03168c6001600160a01b03166001896001018054905003018460000160009054906101000a90046001600160a01b03166001600160a01b03166000805160206159dd8339815191528c8c6040516139309291906155c5565b60405180910390a45b505050505050505050505050565b6001600160a01b03831660009081526009602052604090208054610100900460ff16801561398457506000815460ff16600381111561398257fe5b145b6139a05760405162461bcd60e51b81526004016108e690615708565b6003546000906139cd90610eb9906001600160401b0380821691600160401b90041663ffffffff6141fc16565b6001600160401b031690508042106139f75760405162461bcd60e51b81526004016108e690615698565b815460ff1916600317825560018083018054600092613a199083908301614395565b81548110613a2357fe5b60009182526020808320600160069093020191820180546001600160a01b0319163317905581546001600160401b034216600160b81b0267ffffffffffffffff60b81b19909116178083556008805461ffff600019909101908116600160381b0261ffff60381b19909316929092178455848052600484018352604080862060020190935291842082549395509093909290919084908110613ac157fe5b60009182526020822060029091020154600880546001600160a01b039092169350839163f7434ea9919087908110613af557fe5b90600052602060002090600202016001016040518263ffffffff1660e01b8152600401613b229190615504565b60206040518083038186803b158015613b3a57600080fd5b505afa158015613b4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613b729190810190614b0c565b90506000613b8b6002548361422990919063ffffffff16565b9050613b9b84600133348561423e565b508084600101541015613bc05760405162461bcd60e51b81526004016108e690615788565b60038401805460ff191660019081179091558801546040516001600160a01b038d169133917fd63ca5272e9e07a30a33cc438f956428bf02359db9798ce3fe30140dadf8d74191613c1791600019909101906157f4565b60405180910390a38815610bd957336001600160a01b03168b6001600160a01b031660018a600101805490500301846001600160a01b03166000805160206159dd8339815191528d8d604051613c6e9291906155c5565b60405180910390a45050505050505050505050565b6003546001600160401b031681565b6001546001600160a01b03163314613cbc5760405162461bcd60e51b81526004016108e690615748565b600380546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b60008282016001600160401b038085169082161015613d0a576001600160401b03613d0c565b805b949350505050565b6001600160a01b03831660009081526009602052604081206001810180548254929360001982019360ff1692909184908110613d4c57fe5b600091825260208083206006909202909101805489845260048201909252604090922091925061ffff6501000000000090910416906003846003811115613d8f57fe5b1415613dcd576001876002811115613da357fe5b1415613db357855461ff00191686555b855460ff19168655825461ff001916610100178355613f72565b6002846003811115613ddb57fe5b1415613f72576001876002811115613def57fe5b1415613e94578160011415613e8f57825462010000900460ff16613db357825460ff64010000000090910416600f1415613e6157855461010061ffff1990911681176affffffffffffffff00000019166301000000426001600160401b031602178755835461ff001916178355613e8f565b825460ff67ffffffffffffffff60b81b011916600160b81b426001600160401b0316021763ff000000191683555b613f72565b825462ff00001916620100001783556001821415613ec257855460ff19168655825461ff0019166101001783555b6002876002811115613ed057fe5b148015613f12575060028301546001600160a01b03161580613f12575082546001820154600160781b9091046001600160401b03908116630100000090920416105b15613f7257600181018054600285018054600160581b9092046001600160a01b03166001600160a01b031990921691909117905554835467ffffffffffffffff60781b191663010000009091046001600160401b0316600160781b021783555b825460001961ffff65010000000000808404821692909201160266ffff00000000001990911617835560018181018054899260ff1990911690836002811115613fb757fe5b021790555084896001600160a01b03167fb6759576305cce1591ca803d5fbf22b83b8a7465c093df7b013cb829e98718e18a604051613ff691906157f4565b60405180910390a3505050505050505050565b6001600160a01b038216600090815260096020526040812060018082018054929392909161403a9083908301614395565b8154811061404457fe5b60009182526020808320600880546006909402909101805461ffff600019909501948516600160381b0261ffff60381b1990911617815584805260048101835260408086206002019093529184208154929550929391849081106140a457fe5b60009182526020822060029091020154600880546001600160a01b039092169350839163f7434ea99190879081106140d857fe5b90600052602060002090600202016001016040518263ffffffff1660e01b81526004016141059190615504565b60206040518083038186803b15801561411d57600080fd5b505afa158015614131573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506141559190810190614b0c565b9050600061416e6002548361422990919063ffffffff16565b905061417e84600133348561423e565b508084600101541061419a5760038401805460ff191660011790555b8751156141f157336001600160a01b0316896001600160a01b0316600189600101805490500301846001600160a01b03166000805160206159dd8339815191528b6040516141e891906155d7565b60405180910390a45b505050505050505050565b6000826001600160401b0316826001600160401b0316111561422057506000612f8f565b50808203612f8f565b600082820183811015613d0a57600019613d0c565b600080806142748561426f8a8a600281111561425657fe5b6003811061426057fe5b0154879063ffffffff61434016565b614352565b6001600160a01b038816600090815260058b0160205260409020919350915082908860028111156142a157fe5b600381106142ab57fe5b018054909101905581888860028111156142c157fe5b600381106142cb57fe5b0180549091019055600488018054830190558015614309576040516001600160a01b0387169082156108fc029083906000818181858888f150505050505b5090505b95945050505050565b60008261432557506000612f8f565b8282028284828161433257fe5b0414613d0a57600019613d0c565b60008282111561422057506000612f8f565b6000808383111561436857508290506000614370565b508190508083035b9250929050565b60405180606001604052806003906020820280388339509192915050565b8154818355818111156143c1576006028160060283600052602060002091820191016143c19190614444565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061440757805160ff1916838001178555614434565b82800160010185558215614434579182015b82811115614434578251825591602001919060010190614419565b50614440929150614498565b5090565b6117b291905b808211156144405780546001600160f81b03191681556001810180546001600160a01b03199081169091556002820180549091169055600061448f60038301826144b2565b5060060161444a565b6117b291905b80821115614440576000815560010161449e565b50805460008255906000526020600020908101906144d09190614498565b50565b8035612f8f81615993565b60008083601f8401126144f057600080fd5b5081356001600160401b0381111561450757600080fd5b60208301915083602082028301111561437057600080fd5b60008083601f84011261453157600080fd5b5081356001600160401b0381111561454857600080fd5b60208301915083600182028301111561437057600080fd5b8035612f8f816159a7565b8035612f8f816159b0565b8035612f8f816159bd565b8035612f8f816159ca565b8051612f8f816159ca565b8035612f8f816159d3565b6000602082840312156145b457600080fd5b6000613d0c84846144d3565b600080600080600060a086880312156145d857600080fd5b60006145e488886144d3565b95505060206145f5888289016144d3565b945050604061460688828901614581565b935050606061461788828901614581565b925050608061462888828901614581565b9150509295509295909350565b6000806040838503121561464857600080fd5b600061465485856144d3565b9250506020614665858286016144d3565b9150509250929050565b60008060008060008060006080888a03121561468a57600080fd5b60006146968a8a6144d3565b97505060208801356001600160401b038111156146b257600080fd5b6146be8a828b016144de565b965096505060408801356001600160401b038111156146dc57600080fd5b6146e88a828b016144de565b945094505060608801356001600160401b0381111561470657600080fd5b6147128a828b016144de565b925092505092959891949750929550565b60008060008060006080868803121561473b57600080fd5b600061474788886144d3565b955050602061475888828901614576565b9450506040614769888289016144d3565b93505060608601356001600160401b0381111561478557600080fd5b6147918882890161451f565b92509250509295509295909350565b6000806000604084860312156147b557600080fd5b60006147c186866144d3565b93505060208401356001600160401b038111156147dd57600080fd5b6147e98682870161451f565b92509250509250925092565b6000806040838503121561480857600080fd5b600061481485856144d3565b925050602061466585828601614581565b60008060006060848603121561483a57600080fd5b600061484686866144d3565b935050602061485786828701614581565b9250506040614868868287016144d3565b9150509250925092565b60008060006060848603121561488757600080fd5b600061489386866144d3565b93505060206148a486828701614581565b92505060406148688682870161456b565b6000806000606084860312156148ca57600080fd5b60006148d686866144d3565b93505060206148e786828701614581565b925050604061486886828701614581565b6000806000806080858703121561490e57600080fd5b600061491a87876144d3565b945050602061492b87828801614581565b935050604061493c87828801614581565b925050606061494d87828801614581565b91505092959194509250565b600080600080600060a0868803121561497157600080fd5b600061497d88886144d3565b955050602061498e88828901614581565b945050604061499f88828901614581565b93505060606149b088828901614581565b9250506080614628888289016144d3565b600080600080600080606087890312156149da57600080fd5b86356001600160401b038111156149f057600080fd5b6149fc89828a016144de565b965096505060208701356001600160401b03811115614a1a57600080fd5b614a2689828a016144de565b945094505060408701356001600160401b03811115614a4457600080fd5b614a5089828a016144de565b92509250509295509295509295565b600080600060408486031215614a7457600080fd5b60006147c18686614560565b60008060008060408587031215614a9657600080fd5b84356001600160401b03811115614aac57600080fd5b614ab88782880161451f565b945094505060208501356001600160401b03811115614ad657600080fd5b614ae28782880161451f565b95989497509550505050565b600060208284031215614b0057600080fd5b6000613d0c8484614581565b600060208284031215614b1e57600080fd5b6000613d0c848461458c565b60008060408385031215614b3d57600080fd5b60006148148585614581565b60008060408385031215614b5c57600080fd5b6000614b68858561458c565b92505060206146658582860161458c565b600060208284031215614b8b57600080fd5b6000613d0c8484614597565b600080600060608486031215614bac57600080fd5b6000614bb88686614597565b9350506020614bc986828701614597565b925050604061486886828701614597565b6000614be68383614c63565b505060200190565b614bf78161588c565b82525050565b614c0681615873565b614c1081846125e4565b9250614c1b826117b2565b8060005b83811015610f85578151614c338782614bda565b9650614c3e8361587d565b925050600101614c1f565b614bf781615897565b614bf7614c5e8261589c565b6117b2565b614bf7816117b2565b614bf7614c5e826117b2565b6000614c8382615879565b614c8d8185615883565b9350614c9d81856020860161593b565b614ca68161596b565b9093019392505050565b600081546001811660008114614ccd5760018114614cf357614d32565b607f6002830416614cde8187615883565b60ff1984168152955050602085019250614d32565b60028204614d018187615883565b9550614d0c85615867565b60005b82811015614d2b57815488820152600190910190602001614d0f565b8701945050505b505092915050565b614bf7816158a9565b614bf781615903565b614bf78161590e565b614bf781615919565b6000614d6a8385615883565b9350614d7783858461592f565b614ca68361596b565b6000614d8d602083615883565b7f54686520726561736f6e2068617320616c7265616479206265656e2075736564815260200192915050565b6000614dc6601783615883565b7f4368616c6c656e6765206f7574206f6620626f756e6473000000000000000000815260200192915050565b6000614dff601583615883565b7420b83832b0b6103832b934b7b21034b99037bb32b960591b815260200192915050565b6000614e30601883615883565b7f4e6f7420656e6f7567682076616c696420766f75636865730000000000000000815260200192915050565b6000614e69601883615883565b7f526561736f6e206d757374206265207370656369666965640000000000000000815260200192915050565b6000614ea2601083615883565b6f496e636f727265637420696e7075747360801b815260200192915050565b6000614ece601183615883565b7024b731b7b93932b1ba1039ba30ba3ab99760791b815260200192915050565b6000614efb601e83615883565b7f4475706c6963617465206164647265737320616c726561647920757365640000815260200192915050565b6000614f34601d83615883565b7f42656e6566696369617279206d757374206e6f7420626520656d707479000000815260200192915050565b6000614f6d601183615883565b70496e76616c6964207369676e617475726560781b815260200192915050565b6000614f9a601783615883565b7f526571756573746572206973206e6f742066756e646564000000000000000000815260200192915050565b6000614fd3601a83615883565b7f43616e27742072656d6f76652061667465722072656e6577616c000000000000815260200192915050565b600061500c601183615883565b7010d85b89dd08195e1958dd5d19481e595d607a1b815260200192915050565b6000615039601183615883565b7010d85b89dd081c99585c1c1b1e481e595d607a1b815260200192915050565b6000615066601c83615883565b7f54696d6520746f206368616c6c656e6765206861732070617373656400000000815260200192915050565b600061509f601483615883565b73139bc8191a5cdc1d5d19481d1bc8185c1c19585b60621b815260200192915050565b60006150cf601883615883565b7f416e6f7468657220726561736f6e206973206163746976650000000000000000815260200192915050565b6000615108601b83615883565b7f5375626d697373696f6e206d757374206265207265736f6c7665640000000000815260200192915050565b6000615141600c83615883565b6b57726f6e672073746174757360a01b815260200192915050565b6000615169601783615883565b7f5468652072657175657374206973206469737075746564000000000000000000815260200192915050565b60006151a2601f83615883565b7f5375626d697373696f6e20616c7265616479206265656e206372656174656400815260200192915050565b60006151db601683615883565b7514da5919481a5cc8185b1c9958591e48199d5b99195960521b815260200192915050565b600061520d601f83615883565b7f5468652063616c6c6572206d7573742062652074686520676f7665726e6f7200815260200192915050565b6000615246601683615883565b7557726f6e67206475706c69636174652073746174757360501b815260200192915050565b6000615278601f83615883565b7f41707065616c20706572696f64206973206f76657220666f72206c6f73657200815260200192915050565b60006152b1601983615883565b7f526561736f6e206d757374206265206c65667420656d70747900000000000000815260200192915050565b60006152ea601d83615883565b7f596f75206d7573742066756c6c792066756e6420796f75722073696465000000815260200192915050565b6000615323601e83615883565b7f43616e27742062652061206475706c6963617465206f6620697473656c660000815260200192915050565b614bf7816158d2565b614bf7816158e5565b614bf7816158f1565b614bf781615924565b614bf7816158f7565b60006153888286614c52565b6002820191506153988285614c6c565b6020820191506153a88284614c6c565b506020019392505050565b60208101612f8f8284614bee565b60608101612f8f8284614bfd565b60208101612f8f8284614c49565b60c081016153eb8287614c49565b6153f86020830186614bfd565b6154056080830185614d43565b61430d60a0830184614c63565b6101408101615421828d614c49565b61542e602083018c614c49565b61543b604083018b614c49565b615448606083018a614d4c565b615455608083018961534f565b61546260a083018861534f565b61546f60c083018761534f565b61547c60e0830186614bee565b61548a610100830185614bee565b615498610120830184615361565b9b9a5050505050505050505050565b606081016154b58286614c63565b6154c26020830185614bee565b613d0c6040830184614c63565b608081016154dd8287614c63565b6154ea6020830186615361565b6154f76040830185614c63565b61430d6060830184614c63565b60208082528101610a368184614cb0565b606081016155238286614d3a565b6155306020830185615373565b818103604083015261430d8184614c78565b60208101612f8f8284614d43565b6040810161555e8285614d43565b610a366020830184614c63565b60c081016155798289614d55565b6155866020830188615358565b6155936040830187615358565b6155a06060830186614c49565b6155ad6080830185614c49565b6155ba60a0830184614c63565b979650505050505050565b60208082528101613d0c818486614d5e565b60208082528101610a368184614c78565b60208082528101612f8f81614d80565b60208082528101612f8f81614db9565b60208082528101612f8f81614df2565b60208082528101612f8f81614e23565b60208082528101612f8f81614e5c565b60208082528101612f8f81614e95565b60208082528101612f8f81614ec1565b60208082528101612f8f81614eee565b60208082528101612f8f81614f27565b60208082528101612f8f81614f60565b60208082528101612f8f81614f8d565b60208082528101612f8f81614fc6565b60208082528101612f8f81614fff565b60208082528101612f8f8161502c565b60208082528101612f8f81615059565b60208082528101612f8f81615092565b60208082528101612f8f816150c2565b60208082528101612f8f816150fb565b60208082528101612f8f81615134565b60208082528101612f8f8161515c565b60208082528101612f8f81615195565b60208082528101612f8f816151ce565b60208082528101612f8f81615200565b60208082528101612f8f81615239565b60208082528101612f8f8161526b565b60208082528101612f8f816152a4565b60208082528101612f8f816152dd565b60208082528101612f8f81615316565b60a081016157b6828861534f565b6157c36020830187614bee565b6157d06040830186614c63565b6157dd6060830185614d43565b6157ea6080830184615358565b9695505050505050565b60208101612f8f8284614c63565b604081016158108285614c63565b8181036020830152613d0c8184614cb0565b60208101612f8f8284615358565b60208101612f8f828461536a565b6040810161584c8285615373565b610a366020830184614bee565b6040810161555e828561536a565b60009081526020902090565b50600390565b5190565b60200190565b90815260200190565b6000612f8f826158d9565b151590565b6001600160f01b03191690565b6000612f8f8261588c565b806125e481615975565b806125e48161597f565b806125e481615989565b61ffff1690565b6001600160a01b031690565b6001600160401b031690565b60ff1690565b6001600160601b031690565b6000612f8f826158b4565b6000612f8f826158be565b6000612f8f826158c8565b6000612f8f826158f7565b82818337506000910152565b60005b8381101561595657818101518382015260200161593e565b83811115615965576000848401525b50505050565b601f01601f191690565b600381106144d057fe5b600581106144d057fe5b600481106144d057fe5b61599c8161588c565b81146144d057600080fd5b61599c816158a9565b600381106144d057600080fd5b600581106144d057600080fd5b61599c816117b2565b61599c816158e556fedccf2f8b2cc26eafcd61905cba744cff4b81d14740725f6376390dc6298a6a3ca365627a7a72315820590606406739dd1c71a5083187f4563207095773c469e460b371ac02ef05e7836c6578706572696d656e74616cf564736f6c6343000511004061606860eb6c87306811e2695215385101daab53bd6ab4e9f9049aead9363c7d000000000000000000000000988b3a538b618c7a603e1c11ab82cd16dbe28069000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000001e187e00000000000000000000000000000000000000000000000000000000001e187e00000000000000000000000000000000000000000000000000000000000049d40000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000004e200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005a2f697066732f516d5156396e4b6d4a52396f364152714777513139633837596478653471675535475a4e50636176644d3548784d2f70726f6f662d6f662d68756d616e6974792d72656769737472792d706f6c6963792e706466000000000000000000000000000000000000000000000000000000000000000000000000005a2f697066732f516d5156396e4b6d4a52396f364152714777513139633837596478653471675535475a4e50636176644d3548784d2f70726f6f662d6f662d68756d616e6974792d72656769737472792d706f6c6963792e706466000000000000

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

000000000000000000000000988b3a538b618c7a603e1c11ab82cd16dbe28069000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000001e187e00000000000000000000000000000000000000000000000000000000001e187e00000000000000000000000000000000000000000000000000000000000049d40000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000004e200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005a2f697066732f516d5156396e4b6d4a52396f364152714777513139633837596478653471675535475a4e50636176644d3548784d2f70726f6f662d6f662d68756d616e6974792d72656769737472792d706f6c6963792e706466000000000000000000000000000000000000000000000000000000000000000000000000005a2f697066732f516d5156396e4b6d4a52396f364152714777513139633837596478653471675535475a4e50636176644d3548784d2f70726f6f662d6f662d68756d616e6974792d72656769737472792d706f6c6963792e706466000000000000

-----Decoded View---------------
Arg [0] : _arbitrator (address): 0x988b3a538b618c7a603e1c11ab82cd16dbe28069
Arg [1] : _arbitratorExtraData (bytes): 0x00000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000003
Arg [2] : _registrationMetaEvidence (string): /ipfs/QmQV9nKmJR9o6ARqGwQ19c87Ydxe4qgU5GZNPcavdM5HxM/proof-of-humanity-registry-policy.pdf
Arg [3] : _clearingMetaEvidence (string): /ipfs/QmQV9nKmJR9o6ARqGwQ19c87Ydxe4qgU5GZNPcavdM5HxM/proof-of-humanity-registry-policy.pdf
Arg [4] : _submissionBaseDeposit (uint256): 100000000000000000
Arg [5] : _submissionDuration (uint64): 31557600
Arg [6] : _renewalPeriodDuration (uint64): 31557600
Arg [7] : _challengePeriodDuration (uint64): 302400
Arg [8] : _multipliers (uint256[3]): 10000,10000,20000
Arg [9] : _requiredNumberOfVouches (uint64): 1

-----Encoded View---------------
23 Constructor Arguments found :
Arg [0] : 000000000000000000000000988b3a538b618c7a603e1c11ab82cd16dbe28069
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [4] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [5] : 0000000000000000000000000000000000000000000000000000000001e187e0
Arg [6] : 0000000000000000000000000000000000000000000000000000000001e187e0
Arg [7] : 0000000000000000000000000000000000000000000000000000000000049d40
Arg [8] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [9] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [10] : 0000000000000000000000000000000000000000000000000000000000004e20
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [15] : 000000000000000000000000000000000000000000000000000000000000005a
Arg [16] : 2f697066732f516d5156396e4b6d4a52396f3641527147775131396338375964
Arg [17] : 78653471675535475a4e50636176644d3548784d2f70726f6f662d6f662d6875
Arg [18] : 6d616e6974792d72656769737472792d706f6c6963792e706466000000000000
Arg [19] : 000000000000000000000000000000000000000000000000000000000000005a
Arg [20] : 2f697066732f516d5156396e4b6d4a52396f3641527147775131396338375964
Arg [21] : 78653471675535475a4e50636176644d3548784d2f70726f6f662d6f662d6875
Arg [22] : 6d616e6974792d72656769737472792d706f6c6963792e706466000000000000


Deployed ByteCode Sourcemap

10616:64871:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18502:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18502:37:0;;;:::i;:::-;;;;;;;;;;;;;;;;19838:59;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19838:59:0;;;;;;;;:::i;:::-;;;;;;;;17830:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17830:23:0;;;:::i;:::-;;;;;;;;31023:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31023:153:0;;;;;;;;:::i;:::-;;19230:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19230:32:0;;;:::i;:::-;;;;;;;;29922:435;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29922:435:0;;;;;;;;:::i;18764:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18764:37:0;;;:::i;69681:274::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;69681:274:0;;;;;;;;:::i;59693:1366::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;59693:1366:0;;;;;;;;:::i;39595:163::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39595:163:0;;;;;;;;:::i;29320:153::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29320:153:0;;;;;;;;:::i;70381:506::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;70381:506:0;;;;;;;;:::i;:::-;;;;;;;;18946:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18946:33:0;;;:::i;34511:578::-;;;;;;;;;:::i;35573:622::-;;;;;;;;;:::i;61286:473::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;61286:473:0;;;;;;;;:::i;27532:1085::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27532:1085:0;;;;;;;;:::i;54645:1521::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54645:1521:0;;;;;;;;:::i;72999:970::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;72999:970:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;52801:1408;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;52801:1408:0;;;;;;;;:::i;19363:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19363:29:0;;;:::i;19099:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19099:33:0;;;:::i;40004:169::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40004:169:0;;;;;;;;:::i;18385:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18385:35:0;;;:::i;69220:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69220:118:0;;;:::i;31854:149::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31854:149:0;;;;;;;;:::i;71117:625::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;71117:625:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;56768:2525;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56768:2525:0;;;;;;;;:::i;38499:891::-;;;;;;;;;:::i;28821:289::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28821:289:0;;;;;;;;:::i;74778:706::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;74778:706:0;;;;;;;;:::i;:::-;;;;;;;;;;;31436:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31436:153:0;;;;;;;;:::i;41379:3342::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41379:3342:0;;;;;;;;:::i;33611:445::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33611:445:0;;;;;;;;:::i;17945:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17945:33:0;;;:::i;68828:247::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;68828:247:0;;;;;;;;:::i;40291:493::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40291:493:0;;;:::i;72058:698::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;72058:698:0;;;;;;;;:::i;:::-;;;;;;;;;;;;32527:730;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32527:730:0;;;;;;;;:::i;49702:2895::-;;;;;;;;;:::i;20016:88::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20016:88:0;;;;;;;;:::i;:::-;;;;;;;;;74218:229;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;74218:229:0;;;;;;;;:::i;32130:104::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32130:104:0;;;;;;;;:::i;19532:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19532:42:0;;;;;;;;:::i;:::-;;;;;;;;;;45234:4081;;;;;;;;;:::i;36617:1668::-;;;;;;;;;:::i;18203:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18203:32:0;;;:::i;30549:163::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30549:163:0;;;;;;;;:::i;18502:37::-;;;-1:-1:-1;;;18502:37:0;;-1:-1:-1;;;;;18502:37:0;;:::o;19838:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17830:23::-;;;-1:-1:-1;;;;;17830:23:0;;:::o;31023:153::-;20274:8;;-1:-1:-1;;;;;20274:8:0;20260:10;:22;20252:66;;;;-1:-1:-1;;;20252:66:0;;;;;;;;;;;;;;;;;31122:21;:46;31023:153::o;19230:32::-;;;;:::o;29922:435::-;20274:8;;-1:-1:-1;;;;;20274:8:0;20260:10;:22;20252:66;;;;-1:-1:-1;;;20252:66:0;;;;;;;;;-1:-1:-1;;;;;30080:79:0;;;;:57;;:33;;30114:22;30080:57;:33;:57;:::i;:::-;-1:-1:-1;;;;;30080:79:0;;30072:108;;;;-1:-1:-1;;;30072:108:0;;;;;;;;;30191:18;:40;;-1:-1:-1;;30191:40:0;-1:-1:-1;;;;;30191:40:0;;;;-1:-1:-1;;30242:46:0;-1:-1:-1;;;30242:46:0;;;;;;;;;;;-1:-1:-1;;;;30299:50:0;-1:-1:-1;;;30299:50:0;;;;;;;;;;;29922:435::o;18764:37::-;;;-1:-1:-1;;;18764:37:0;;-1:-1:-1;;;;;18764:37:0;;:::o;69681:274::-;-1:-1:-1;;;;;69841:26:0;;69798:4;69841:26;;;:11;:26;;;;;:35;;:47;;69798:4;;69841:35;69877:10;;69841:47;;;;;;;;;;;;;;-1:-1:-1;;;;;69906:41:0;;;;:27;69841:47;;;;;69906:27;;;;:41;;;;;;;;;-1:-1:-1;;69681:274:0;;;;;;:::o;59693:1366::-;59756:18;59783:7;59777:14;;;;;;;;59869:10;59802:31;59836:44;;;:32;:44;;;;;;;;:56;;;;;;;;59926:24;;-1:-1:-1;;;59926:24:0;;-1:-1:-1;;;;;59926:24:0;60046:25;;;:11;:25;;;;;;59980:23;60110:19;;60130:26;;59756:35;;-1:-1:-1;59836:56:0;;59926:24;;-1:-1:-1;;;;;59980:23:0;;;;60046:25;;59802:31;60110:19;-1:-1:-1;;60130:30:0;;;60110:51;;;;;;;;;;;;;;60202:31;;;:18;60110:51;;;;;60202:18;;;:31;;;;;;60283:21;;;;;;;;;;;60266:39;;:16;;;:39;;;;;;60375:24;;60356:18;:44;;60110:51;;-1:-1:-1;60202:31:0;;60266:39;;60110:51;;-1:-1:-1;;;60375:24:0;;;;;60356:44;;;;;;;;;;;;;;;;;;;60429:25;;60356:44;;-1:-1:-1;;;;;;60429:25:0;60459:10;60421:48;60413:57;;;;;;60490:16;;;;;;;60489:17;60481:26;;;;;;60607:15;60587:16;;;;;;:35;;;;;;;;;60583:322;;;60788:15;60773:30;;60583:322;;;60843:16;60823;;;;;;:36;;;;;;;;;60819:86;;;60889:16;60874:31;;60819:86;60955:10;60942;60923:63;60972:12;60967:18;;;;;;;;60923:63;;;;;;;;;;;;;;;60997:54;61011:12;61025:11;61038:12;60997:13;:54::i;:::-;59693:1366;;;;;;;;;;;:::o;39595:163::-;39664:10;39656:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;39656:34:0;;;;;;;;;;:41;;-1:-1:-1;;39656:41:0;39693:4;39656:41;;;39713:37;39656:34;;39713:37;;;39595:163;:::o;29320:153::-;20274:8;;-1:-1:-1;;;;;20274:8:0;20260:10;:22;20252:66;;;;-1:-1:-1;;;20252:66:0;;;;;;;;;29419:21;:46;29320:153::o;70381:506::-;70575:28;;:::i;:::-;-1:-1:-1;;;;;70642:26:0;;70616:23;70642:26;;;:11;:26;;;;;:35;;:47;;70678:10;;70642:47;;;;;;;;;;;;;;70730:32;;;70642:47;;;;;;;;70730:18;;;:32;;;;;;70795:24;;;:16;;;:24;;;;;-1:-1:-1;;;;;70846:33:0;;;;:19;;;:33;;;;;;;70830:49;;;;;;;;;70642:47;;-1:-1:-1;70846:33:0;70830:49;;70846:33;70830:49;;;;;;;;;;;;;;;;;;;;;;;;70381:506;;;;;;;;;;:::o;18946:33::-;;;;:::o;34511:578::-;34656:10;34612:29;34644:23;;;:11;:23;;;;;34687:21;;;;;;;34686:22;:58;;;;-1:-1:-1;34733:11:0;34712:17;;;;:32;;;;;;;;;34686:58;34678:83;;;;-1:-1:-1;;;34678:83:0;;;;;;;;;34776:19;;;:26;34772:142;;34850:17;;;34824:44;;-1:-1:-1;;;;;34824:44:0;;;-1:-1:-1;;;34824:44:0;-1:-1:-1;;;;34824:44:0;;;;;;34883:19;;-1:-1:-1;34883:19:0;;;34772:142;34924:35;;-1:-1:-1;;34924:35:0;34944:15;34924:35;;;;;35001:19;;:26;34975:53;;34989:10;;34975:53;;;;35001:26;34975:53;;;;;;;;;;35039:42;35059:10;35071:9;;35039:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;35039:19:0;;-1:-1:-1;;;35039:42:0:i;:::-;34511:578;;;;;:::o;35573:622::-;35722:10;35678:29;35710:23;;;:11;:23;;;;;35752:21;;;;;;;:57;;;;-1:-1:-1;35798:11:0;35777:17;;;;:32;;;;;;;;;35752:57;35744:82;;;;-1:-1:-1;;;35744:82:0;;;;;;;;;35926:21;;35837:23;;35863:86;;35898:50;;-1:-1:-1;;;;;35898:18:0;;;;-1:-1:-1;;;35926:21:0;;;35898:50;:27;:50;:::i;:::-;35863:25;;;;;-1:-1:-1;;;;;35863:25:0;;:34;:86::i;:::-;-1:-1:-1;;;;;35837:112:0;;;35975:18;35968:3;:25;;35960:55;;;;-1:-1:-1;;;35960:55:0;;;;;;;;;36026:35;;-1:-1:-1;;36026:35:0;36046:15;36026:35;;;;;36107:19;;:26;36077:57;;36095:10;;36077:57;;;;36107:26;36077:57;;;;;;;;;;36145:42;36165:10;36177:9;;36145:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36145:19:0;;-1:-1:-1;;;36145:42:0:i;:::-;35573:622;;;;;;:::o;61286:473::-;-1:-1:-1;;;;;61412:26:0;;61380:29;61412:26;;;:11;:26;;;;;61475:19;;;61495:26;;61412;;61380:29;-1:-1:-1;;61495:30:0;;;61475:51;;;;;;;;;;;;;;;;61449:77;;61537:37;61577:18;61596:7;:24;;;;;;;;;;;;61577:44;;;;;;;;;;;;;;;;;;61704:1;61675:19;;:26;61577:44;;;;;61648:25;;61639:112;;61577:44;;-1:-1:-1;61729:10:0;;-1:-1:-1;;;;;;;61708:19:0;;;61675:52;;;;;61648:25;;;-1:-1:-1;;;;;;;;;;;61639:112:0;;;61741:9;;;;61639:112;;;;;;;;;;61286:473;;;;;;:::o;27532:1085::-;20274:8;;-1:-1:-1;;;;;20274:8:0;20260:10;:22;20252:66;;;;-1:-1:-1;;;20252:66:0;;;;;;;;;27701:17;;27753:18;:25;-1:-1:-1;;27753:29:0;27686:12;27793:779;27810:25;;;27793:779;;;27857:29;27889:11;:30;27901:14;;27916:1;27901:17;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27889:30:0;;;;;;;;;;;;-1:-1:-1;27889:30:0;27942:19;;;:26;27889:30;;-1:-1:-1;27942:31:0;27934:75;;;;-1:-1:-1;;;27934:75:0;;;;;;;;;28024:34;;-1:-1:-1;;;;28024:34:0;-1:-1:-1;;;;;;;;28024:34:0;;;;;;-1:-1:-1;28125:19:0;;;28145:28;;28073:9;;;;-1:-1:-1;;28145:28:0;;28125:19;;28145:28;;;:::i;:::-;28125:49;;;;;;;;;;;;;;;28189:28;;;-1:-1:-1;;28189:28:0;;;;;-1:-1:-1;;28234:39:0;;28269:3;-1:-1:-1;;;;;28234:39:0;;;;;28125:49;;;;;;;;28288:51;;-1:-1:-1;;;;28288:51:0;-1:-1:-1;;;28288:51:0;;;;;28354:23;;;;;;;;28125:49;-1:-1:-1;28404:9:0;;28414:1;28404:12;;;;;;;;;;;;-1:-1:-1;30:25;;-1:-1;;100:14;96:29;;;92:48;68:73;;58:2;;155:1;152;145:12;58:2;174:33;;;69:4;55:19;;;-1:-1;16:22;-1:-1;;;;;82:30;;79:2;;;125:1;122;115:12;79:2;155:14;151:38;;;137:53;;134:2;;;203:1;200;193:12;134:2;28398:26:0;;:30;28394:166;;;28535:10;28515:14;;28530:1;28515:17;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28510:23:0;28461:18;28480:16;28461:36;;;;;;;;;;;;;;;;;;;;;:47;-1:-1:-1;;;;;28461:47:0;-1:-1:-1;;;;;;;;;;;28547:9:0;;28557:1;28547:12;;;;;;;;;;;;-1:-1:-1;30:25;;-1:-1;;100:14;96:29;;;92:48;68:73;;58:2;;155:1;152;145:12;58:2;174:33;;;69:4;55:19;;;-1:-1;16:22;-1:-1;;;;;82:30;;79:2;;;125:1;122;115:12;79:2;155:14;151:38;;;137:53;;134:2;;;203:1;200;193:12;134:2;28452:108:0;;;;;;;;;;;;;;;;28394:166;-1:-1:-1;;27837:3:0;;27793:779;;;-1:-1:-1;;28582:17:0;:27;-1:-1:-1;;;;;;27532:1085:0:o;54645:1521::-;-1:-1:-1;;;;;54777:26:0;;54745:29;54777:26;;;:11;:26;;;;;54840:19;;;:31;;54777:26;;54745:29;54860:10;;54840:31;;;;;;;;;;;;;;;;;;;54890:16;;54840:31;;-1:-1:-1;54890:16:0;;;;;54882:56;;;;-1:-1:-1;;;54882:56:0;;;;;;;;;54977:26;;;-1:-1:-1;;;54977:26:0;;;;;;54951:23;;55030:38;;:11;;54977:26;;55030:18;:38;:::i;:::-;55097:15;;;:22;55014:54;;-1:-1:-1;55136:21:0;;;55132:61;;;55183:10;55172:21;;55132:61;55229:21;;55397:26;;;;55229:21;;;;;;;55206:20;;-1:-1:-1;;;;;55397:26:0;:42;;;;:121;;-1:-1:-1;55461:16:0;55444:13;:33;;;;;;;;;:73;;;-1:-1:-1;55498:19:0;55481:13;:36;;;;;;;;;55444:73;55377:141;-1:-1:-1;55543:18:0;55529:574;55567:8;55563:1;:12;55529:574;;;55597:26;55626:11;:31;55638:7;:15;;55654:1;55638:18;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55638:18:0;55626:31;;;;;;;;;;;;55672:26;;-1:-1:-1;;55672:26:0;;;55626:31;-1:-1:-1;55713:379:0;;;;55877:15;55859:14;;;;:33;;;;;;;;;:81;;;-1:-1:-1;55914:26:0;55896:14;;;;:44;;;;;;;;;55859:81;55855:174;;;56025:4;55963:16;;;55980:23;;-1:-1:-1;;55980:27:0;;;55963:45;;;;;;;;;;;;;;;;;;;:66;;;;;;;-1:-1:-1;;55963:66:0;;;;;;;;;55855:174;56050:26;;-1:-1:-1;;56050:26:0;;;55713:379;-1:-1:-1;55577:3:0;;55529:574;;;-1:-1:-1;;56113:45:0;;;;;;-1:-1:-1;;;56113:45:0;-1:-1:-1;;;;56113:45:0;;;;;;;;;;-1:-1:-1;;;;;;;54645:1521:0:o;72999:970::-;73127:13;73155;73183:18;73216:20;73251:25;73291:22;73328:23;73366:25;73406:34;73455:17;73500:23;73526:11;:26;73538:13;-1:-1:-1;;;;;73526:26:0;-1:-1:-1;;;;;73526:26:0;;;;;;;;;;;;:35;;73562:10;73526:47;;;;;;;;;;;;;;;;;;;;;73606:16;;;73858:17;;;73668:21;73890:26;;;;73606:16;;;;;-1:-1:-1;73606:16:0;73637;;;;;-1:-1:-1;73668:21:0;;;;;;-1:-1:-1;73704:21:0;;;;;;-1:-1:-1;73740:26:0;;;;;;;-1:-1:-1;;;;73781:23:0;;;;;-1:-1:-1;;;;73819:24:0;;;;-1:-1:-1;;;;;;73858:17:0;;;;-1:-1:-1;73890:26:0;;;-1:-1:-1;73931:19:0;;;;;-1:-1:-1;;72999:970:0;;;;;;;;;;;;;:::o;52801:1408::-;-1:-1:-1;;;;;52900:26:0;;52868:29;52900:26;;;:11;:26;;;;;52983:1;52954:19;;:26;;52900;;-1:-1:-1;;52954:30:0;;;52868:29;;52954:19;:30;;53021;;;;;;;;;;;;;;53107:23;;53021:30;;;;;53076:28;;53021:30;;-1:-1:-1;;;;53107:23:0;;;-1:-1:-1;;;;;53107:23:0;;;-1:-1:-1;;;53076:28:0;;;;53070:3;:34;:60;53062:90;;;;-1:-1:-1;;;53062:90:0;;;;;;;;;53172:16;;;;53171:17;53163:53;;;;-1:-1:-1;;;53163:53:0;;;;;;;;;53227:25;53288:26;53267:17;;;;:47;;;;;;;;;53263:616;;;53466:21;;;;;;;53461:149;;53508:28;;;-1:-1:-1;;53508:28:0;;;;-1:-1:-1;;53555:39:0;;53590:3;-1:-1:-1;;;;;53555:39:0;;;;;53461:149;-1:-1:-1;53652:13:0;53263:616;;;53710:21;53689:17;;;;:42;;;;;;;;;53685:194;;;-1:-1:-1;53748:29:0;;-1:-1:-1;;53748:29:0;;;:21;53804:17;;;-1:-1:-1;;;;;53804:17:0;53685:194;;;53852:27;;-1:-1:-1;;;53852:27:0;;;;;;;;53685:194;53892:31;;-1:-1:-1;;53892:31:0;;;53934:23;;-1:-1:-1;;53934:23:0;;;;;53974:15;;;:22;:27;53970:108;;54016:62;54031:13;54046:9;10927:2;54016:14;:62::i;:::-;54091:65;54114:9;54125:13;54140:9;54151:1;54154;54091:22;:65::i;19363:29::-;;;;:::o;19099:33::-;;;;:::o;40004:169::-;40076:10;40105:5;40068:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;40068:34:0;;;;;;;;;;:42;;-1:-1:-1;;40068:42:0;;;40126:39;40068:34;;40126:39;;;40004:169;:::o;18385:35::-;;;-1:-1:-1;;;18385:35:0;;-1:-1:-1;;;;;18385:35:0;;:::o;69220:118::-;69305:18;:25;69220:118;;:::o;31854:149::-;20274:8;;-1:-1:-1;;;;;20274:8:0;20260:10;:22;20252:66;;;;-1:-1:-1;;;20252:66:0;;;;;;;;;31951:20;:44;31854:149::o;71117:625::-;-1:-1:-1;;;;;71463:26:0;71231:13;71463:26;;;:11;:26;;;;;71522:17;;;71697:19;;;:26;71522:17;;;;;-1:-1:-1;;;;;71554:25:0;;;;;;-1:-1:-1;;;71594:16:0;;;;;;71522:17;71625:21;;;;;71661;;;;;;;;71117:625::o;56768:2525::-;-1:-1:-1;;;;;56952:26:0;;56920:29;56952:26;;;:11;:26;;;;;57015:19;;;:31;;56952:26;;56920:29;57035:10;;57015:31;;;;;;;;;;;;;;57087:32;;;:18;57015:31;;;;;57087:18;;;:32;;;;;;57152:24;;;:16;;;:24;;;;;;57195:16;;57015:31;;-1:-1:-1;57152:24:0;57195:16;;;;;;57187:56;;;;-1:-1:-1;;;57187:56:0;;;;;;;;;-1:-1:-1;;;;;57262:28:0;;57254:70;;;;-1:-1:-1;;;57254:70:0;;;;;;;;;57352:16;;;;;;57337:12;57692:11;;;;;:46;;-1:-1:-1;57717:21:0;;;;;;;;;57707:31;;57692:46;57688:1419;;;-1:-1:-1;;;;;;57823:33:0;;;;;;:19;;;:33;;;;;57862:16;57823:57;;;57803:15;57764:56;;;;:116;57688:1419;;;57912:10;57902:6;:20;;;;;;;;;57898:1209;;;58024:15;58004:37;;;;57983:16;57963:38;;;;-1:-1:-1;;;;;58137:33:0;;57939:21;58137:33;;;:19;;;:33;;;;;:56;;;;58077:57;;;;;57963:78;;;58077:116;58217:20;:78;;58294:1;58217:78;;;58275:16;58256:5;:16;;;58240:13;:32;:51;;;;;;58217:78;58208:87;;57898:1209;;;;;58485:11;;:57;;;;-1:-1:-1;58516:26:0;;;;-1:-1:-1;;;;;58500:42:0;;;58516:26;;58500:42;58485:57;:78;;;;-1:-1:-1;58546:17:0;;58485:78;58481:615;;;-1:-1:-1;58593:16:0;;;;;58647:1;58628:20;;;58481:615;;;58775:26;;;;-1:-1:-1;;;;;58775:26:0;:40;;:59;;-1:-1:-1;58819:15:0;;;58775:59;:72;;;-1:-1:-1;58838:9:0;;;58775:72;58771:325;;;58868:13;58884:5;58904:6;58899:12;;;;;;;;58884:28;;;;;;;;;58868:44;;58951:1;58940:8;:12;:140;;59079:1;58940:140;;;59027:16;;;;-1:-1:-1;;;;;58977:33:0;;;;;;:19;;;:33;;;;;59047:8;;59027:16;59016:6;59011:12;;;;;;;;58977:47;;;;;;;;;:66;58976:79;;;;;;58940:140;58931:149;;58771:325;;-1:-1:-1;;;;;59117:33:0;;59176:1;59117:33;;;:19;;;:33;;;;;;59156:15;59117:56;;:60;;;59227:16;59188:57;:61;;;59260:25;;;;;;;;;;59176:1;59260:25;;59117:33;59260:25;;-1:-1:-1;;;;;;;;;;;;;;;;56768:2525:0:o;38499:891::-;-1:-1:-1;;;;;38606:26:0;;38574:29;38606:26;;;:11;:26;;;;;38672:15;38651:17;;;;:36;;;;;;;;;38643:61;;;;-1:-1:-1;;;38643:61:0;;;;;;;;;38741:19;;;38761:26;;38715:23;;38741:19;-1:-1:-1;;38761:30:0;;;38741:51;;;;;;;;;;;;;;38833:21;;;38741:51;;;;;;;;38833:18;;;:21;;;;;;38887:16;;;:19;;;;;38978:24;;38959:18;:44;;38741:51;;-1:-1:-1;38833:21:0;;38887:19;;38741:51;;-1:-1:-1;;;38978:24:0;;;;;;38959:44;;;;;;;;;;;;;;;;;;39037:25;;:77;;-1:-1:-1;;;39037:77:0;;38959:44;;-1:-1:-1;;;;;;39037:25:0;;:41;;:77;;:25;39079:34;;;39037:77;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39037:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39037:77:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39037:77:0;;;;;;;;;39014:100;;39125:14;39142:45;39165:21;;39142:15;:22;;:45;;;;:::i;:::-;39125:62;;39198:68;39209:5;39216:15;39233:10;39245:9;39256;39198:10;:68::i;:::-;-1:-1:-1;39324:9:0;39283:5;39303:15;39283:37;;:50;39279:103;;39348:16;;;:34;;-1:-1:-1;;39348:34:0;39367:15;39348:34;;;39279:103;38499:891;;;;;;;;:::o;28821:289::-;20274:8;;-1:-1:-1;;;;;20274:8:0;20260:10;:22;20252:66;;;;-1:-1:-1;;;20252:66:0;;;;;;;;;-1:-1:-1;;;;;28943:26:0;;28911:29;28943:26;;;:11;:26;;;;;28988:21;;;;;;;:57;;;;-1:-1:-1;29034:11:0;29013:17;;;;:32;;;;;;;;;28988:57;28980:82;;;;-1:-1:-1;;;28980:82:0;;;;;;;;;29073:29;;-1:-1:-1;;29073:29:0;;;-1:-1:-1;28821:289:0:o;74778:706::-;74936:13;74964:23;;:::i;:::-;-1:-1:-1;;;;;75102:26:0;;75002:16;75102:26;;;:11;:26;;;;;:35;;:47;;75002:16;;;;75138:10;;75102:47;;;;;;;;;;;;;;75190:32;;;75102:47;;;;;;;;75190:18;;;;:32;;;;;;75255:24;;;:16;;;:24;;;;;;;75311:21;;;;75418:16;;;;;75449;;;;75344:132;;;;;;;;;75311:21;;;;;;75301:32;;;-1:-1:-1;75102:47:0;;-1:-1:-1;75190:32:0;;75255:24;;75301:32;;75255:24;;75418:16;;;75449;;75344:132;75255:24;;;75344:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74778:706;;;;;;;;;:::o;31436:153::-;20274:8;;-1:-1:-1;;;;;20274:8:0;20260:10;:22;20252:66;;;;-1:-1:-1;;;20252:66:0;;;;;;;;;31535:21;:46;31436:153::o;41379:3342::-;-1:-1:-1;;;;;41582:26:0;;41550:29;41582:26;;;:11;:26;;;;;41648:15;41627:17;;;;:36;;;;;;;;;41619:61;;;;-1:-1:-1;;;41619:61:0;;;;;;;;;41717:19;;;41737:26;;41691:23;;41717:19;-1:-1:-1;;41737:30:0;;;41717:51;;;;;;;;;;;;;;41866:21;;;:18;41717:51;;;;;41866:18;;;:21;;;;;;41924:16;;;:19;;;;;;41717:51;;-1:-1:-1;41986:15:0;41966:16;;;;;;:35;;;;;;;;;41958:71;;;;-1:-1:-1;;;41958:71:0;;;;;;;;;-1:-1:-1;;42116:18:0;;-1:-1:-1;;;;;42116:18:0;42110:3;:24;-1:-1:-1;;;42092:15:0;42310:1599;42327:22;;;:74;;;;-1:-1:-1;42378:23:0;;;42353:15;;;:22;-1:-1:-1;;;42378:23:0;;;-1:-1:-1;;;;;42378:23:0;-1:-1:-1;42327:74:0;42310:1599;;;42423:22;;11432:66;42641:13;42656:21;;42678:1;42656:24;;;;;;;;;;;;;42603:78;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;42603:78:0;;;42593:89;;;;;;42571:111;;42701:12;42743:6;42751:16;;42769:11;42726:55;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;42726:55:0;;;42716:66;;;;;;42701:81;;42845:22;42870:11;;42882:1;42870:14;;;;;;;;;;;;-1:-1:-1;30:25;;-1:-1;;100:14;96:29;;;92:48;68:73;;58:2;;155:1;152;145:12;58:2;174:33;;;69:4;55:19;;;-1:-1;16:22;-1:-1;;;;;82:30;;79:2;;;125:1;122;115:12;79:2;155:14;151:38;;;137:53;;134:2;;;203:1;200;193:12;134:2;42845:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;-1:-1;43043:4:0;43028:20;;43022:27;43097:4;43082:20;;43076:27;43159:4;43144:20;;43138:27;42845:39;;-1:-1:-1;43022:27:0;;43076;;-1:-1:-1;43130:36:0;;;-1:-1:-1;;43211:2:0;43207:6;;43203:19;;;43220:2;43215:7;43203:19;43249:1;:7;;43254:2;43249:7;:18;;;;43260:1;:7;;43265:2;43260:7;43249:18;43241:48;;;;-1:-1:-1;;;43241:48:0;;;;;;;;;43377:24;43387:4;43393:1;43396;43399;43377:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;43377:24:0;;;-1:-1:-1;;43377:24:0;;-1:-1:-1;;;;;43507:27:0;;43478:26;43507:27;;;:11;43377:24;43507:27;;;;;43554:18;;43377:24;;-1:-1:-1;43507:27:0;-1:-1:-1;43554:18:0;;;;;43553:19;;-1:-1:-1;;43553:41:0;;;-1:-1:-1;43553:41:0;;-1:-1:-1;;;43553:41:0;-1:-1:-1;43576:18:0;;;;;;;43553:41;:81;;;;-1:-1:-1;43612:22:0;;;;;-1:-1:-1;;;;;43612:22:0;43598:36;;;43553:81;:128;;;;;43657:21;;43679:1;43657:24;;;;;;;;;;;;;43651:3;:30;43553:128;:163;;;;;43702:14;-1:-1:-1;;;;;43685:31:0;:13;-1:-1:-1;;;;;43685:31:0;;;43553:163;43549:349;;;43737:7;:15;;43758:14;43737:36;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;43737:36:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43737:36:0;;;;;-1:-1:-1;;;;;43737:36:0;;;;;;;43813:4;43792:7;:18;;;:25;;;;;;;;;;;;;;;;;;43867:14;-1:-1:-1;;;;;43841:41:0;43852:13;-1:-1:-1;;;;;43841:41:0;;;;;;;;;;;43549:349;-1:-1:-1;;42403:3:0;;42310:1599;;;-1:-1:-1;43926:6:0;43921:586;43938:17;;;:67;;;;-1:-1:-1;43982:23:0;;;43959:15;;;:22;-1:-1:-1;;;43982:23:0;;;-1:-1:-1;;;;;43982:23:0;-1:-1:-1;43938:67:0;43921:586;;;44145:26;44174:11;:24;44186:8;;44195:1;44186:11;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44174:24:0;;;;;;;;;;;;-1:-1:-1;44174:24:0;44218:18;;44174:24;;-1:-1:-1;44218:18:0;;;;;44217:19;:41;;;;-1:-1:-1;44240:18:0;;;;;;;44217:41;:81;;;;-1:-1:-1;44276:22:0;;;;;-1:-1:-1;;;;;44276:22:0;44262:36;;;44217:81;:133;;;;;44315:7;:20;44323:8;;44332:1;44323:11;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44315:20:0;-1:-1:-1;;;;;44315:20:0;;;;;;;;;;;;:35;44336:13;-1:-1:-1;;;;;44315:35:0;-1:-1:-1;;;;;44315:35:0;;;;;;;;;;;;;;;;;;;;;;44217:133;:165;;;;;44371:8;;44380:1;44371:11;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44354:28:0;:13;-1:-1:-1;;;;;44354:28:0;;;44217:165;44213:283;;;44403:7;:15;;44424:8;;44433:1;44424:11;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;39:1;23:18;;45:23;;-1:-1;44403:33:0;;;;;;;;;;;;-1:-1:-1;;;;;44403:33:0;;;-1:-1:-1;;;;;;44403:33:0;;;;;;;;;44455:25;;-1:-1:-1;;44455:25:0;;;;;44213:283;-1:-1:-1;44007:3:0;;43921:586;;;-1:-1:-1;44551:23:0;;;44525:15;;;:22;-1:-1:-1;;;44551:23:0;;;-1:-1:-1;;;;;44551:23:0;-1:-1:-1;44525:49:0;44517:86;;;;-1:-1:-1;;;44517:86:0;;;;;;;;;-1:-1:-1;;44614:46:0;;-1:-1:-1;;44614:46:0;44634:26;44614:46;;;;44671:42;;-1:-1:-1;;;;;44709:3:0;44671:42;-1:-1:-1;;;44671:42:0;-1:-1:-1;;;;44671:42:0;;;;;;-1:-1:-1;;;;;;;41379:3342:0:o;33611:445::-;20274:8;;-1:-1:-1;;;;;20274:8:0;20260:10;:22;20252:66;;;;-1:-1:-1;;;20252:66:0;;;;;;;;;33772:18;33791:25;;33732:37;;33772:18;-1:-1:-1;;33791:29:0;;;33772:49;;;;;;;;;;;;;;;;33732:89;;33832:18;33856:191;;;;;;;;33898:11;-1:-1:-1;;;;;33856:191:0;;;;;33945:14;:34;;;;;;;;;;-1:-1:-1;;;;;33945:34:0;-1:-1:-1;;;;;33856:191:0;;;;;34015:20;;33856:191;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;-1:-1;33856:191:0;;;;-1:-1:-1;;27:10;;39:1;23:18;;;45:23;;;33832:216:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33832:216:0;-1:-1:-1;;;33832:216:0;-1:-1:-1;;;;;33832:216:0;;;-1:-1:-1;;;;;;33832:216:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33832:216:0;;;;;;;;;;:::i;17945:33::-;;;;:::o;68828:247::-;-1:-1:-1;;;;;68945:26:0;;68896:4;68945:26;;;:11;:26;;;;;68989:21;;;;;;;:78;;;;-1:-1:-1;69049:18:0;;69020:25;;-1:-1:-1;;;;;69049:18:0;;;69020:25;;;;;;;69014:3;:31;:53;;68989:78;68982:85;;;68828:247;;;;:::o;40291:493::-;40385:10;40341:29;40373:23;;;:11;:23;;;;;40436:15;40415:17;;;;:36;;;;;;;;;40407:61;;;;-1:-1:-1;;;40407:61:0;;;;;;;;;40505:19;;;40525:26;;40479:23;;40505:19;-1:-1:-1;;40525:30:0;;;40505:51;;;;;;;;;;;;;40569:31;;-1:-1:-1;;40569:31:0;;;40505:51;;;;;;40611:23;;-1:-1:-1;;40611:23:0;;;;;-1:-1:-1;40694:19:0;;:26;40505:51;;-1:-1:-1;40647:84:0;;40670:10;;;;-1:-1:-1;;40694:30:0;;;;40505:51;40647:22;:84::i;:::-;40291:493;;:::o;72058:698::-;72207:18;72240;72273:14;72302:12;72329:31;72388:23;72414:11;:26;72426:13;-1:-1:-1;;;;;72414:26:0;-1:-1:-1;;;;;72414:26:0;;;;;;;;;;;;:35;;72450:10;72414:47;;;;;;;;;;;;;;;;72502:32;;;72414:47;;;;;;;;72502:18;;:32;;;-1:-1:-1;;72502:32:0;;;;72567:21;;;;72638:19;;72567:21;;;;;;-1:-1:-1;;;72603:20:0;;-1:-1:-1;;;;;72603:20:0;;-1:-1:-1;72638:19:0;;-1:-1:-1;72672:16:0;;;;-1:-1:-1;72703:34:0;;;;-1:-1:-1;;;;;72703:34:0;;-1:-1:-1;72058:698:0;-1:-1:-1;;72058:698:0:o;32527:730::-;20274:8;;-1:-1:-1;;;;;20274:8:0;20260:10;:22;20252:66;;;;-1:-1:-1;;;20252:66:0;;;;;;;;;32710:18;32729:25;;32670:37;;32710:18;-1:-1:-1;;32729:29:0;;;32710:49;;;;;;;;;;;;;;;;;;;;32802:34;;32875:207;;;;;;;;-1:-1:-1;;;;;32917:25:0;;32875:207;;-1:-1:-1;;;32802:34:0;;;-1:-1:-1;;;;;32802:34:0;;;32839:1;32802:38;;;32875:207;;;;;;;33036:34;;;32875:207;;;;32802:34;32875:207;;;;;;;;-1:-1:-1;;32875:207:0;;;;;;;;;;;;;;;;;;;;;;;32710:49;;-1:-1:-1;32802:38:0;;32851:18;;32875:207;;;;;;;;;;;33036:34;32875:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32875:207:0;;;;-1:-1:-1;;27:10;;39:1;23:18;;;45:23;;;-1:-1;32851:232:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32851:232:0;-1:-1:-1;;;32851:232:0;-1:-1:-1;;;;;32851:232:0;;;-1:-1:-1;;;;;;32851:232:0;;;;;;;;;;;;;;;;;;;;;;23:18:-1;;32851:232:0;;;;;;;;;:::i;:::-;;;;;33116:22;33112:1;:26;-1:-1:-1;;;;;33099:67:0;;33140:25;;33099:67;;;;;;;;;;;;;;;;33199:22;33195:1;:26;33224:1;33195:30;-1:-1:-1;;;;;33182:67:0;;33227:21;;33182:67;;;;;;;;;;;;;;;;20320:1;;32527:730;;;;:::o;49702:2895::-;49822:10;49813:5;:19;;;;;;;;;;49805:28;;;;;;-1:-1:-1;;;;;49929:26:0;;49897:29;49929:26;;;:11;:26;;;;;49995;49974:17;;;;:47;;;;;;;;;:93;;;-1:-1:-1;50046:21:0;50025:17;;;;:42;;;;;;;;;49974:93;49966:118;;;;-1:-1:-1;;;49966:118:0;;;;;;;;;50121:19;;;50141:26;;50095:23;;50121:19;-1:-1:-1;;50141:30:0;;;50121:51;;;;;;;;;;;;;;;;;;;50191:16;;50121:51;;-1:-1:-1;50191:16:0;;50183:49;;;;-1:-1:-1;;;50183:49:0;;;;;;;;;50266:23;;-1:-1:-1;;;50266:23:0;;;;50251:38;;50243:74;;;;-1:-1:-1;;;50243:74:0;;;;;;;;;50330:27;50360:32;;;:18;;;:32;;;;;50462:24;;50443:18;:44;;50360:32;;50330:27;50443:18;;-1:-1:-1;;;50462:24:0;;;;;50443:44;;;;;;;;;;;;;;;;;;50549:25;;50588:19;;50549:59;;-1:-1:-1;;;50549:59:0;;50443:44;;-1:-1:-1;50443:44:0;;-1:-1:-1;;;;;50549:25:0;;;;:38;;:59;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50549:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50549:59:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50549:59:0;;;;;;;;;50500:108;;;;50634:17;50627:3;:24;;:49;;;;;50661:15;50655:3;:21;50627:49;50619:83;;;;-1:-1:-1;;;50619:83:0;;;;;;;;;50819:25;;50859:19;;50819:60;;-1:-1:-1;;;50819:60:0;;50715:15;;;;-1:-1:-1;;;;;50819:25:0;;;;:39;;:60;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50819:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50819:60:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50819:60:0;;;;;;;;;50813:67;;;;;;;;50798:82;;50909:5;50899:15;;;;;;;;:6;:15;;;;;;;;;50895:387;;;50947:21;;50934:34;;50895:387;;;51004:10;50994:6;:20;;;;;;;;;50990:292;;;51047:21;;51034:34;;50990:292;;;51122:20;;;-1:-1:-1;51229:1:0;51194:33;;;51193:37;51173:17;51169:3;:21;:61;51161:105;;;;-1:-1:-1;;;51161:105:0;;;;;;;;;-1:-1:-1;51385:21:0;;;;;;;;;51346:19;51368:39;;;:16;;;;:39;;;;;;51435:16;;;;51368:39;;51435:16;;;;;51426:25;;;;;;;:5;:25;;;;;;;;;;51418:60;;;;-1:-1:-1;;;51418:60:0;;;;;;;;;51509:25;;51546:19;;51509:93;;-1:-1:-1;;;51509:93:0;;51491:15;;-1:-1:-1;;;;;51509:25:0;;:36;;:93;;51546:19;51509:25;51567:34;;;51509:93;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51509:93:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51509:93:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51509:93:0;;;;;;;;;51491:111;-1:-1:-1;51613:14:0;51630:71;11168:5;51649:29;51491:111;51667:10;51649:29;:17;:29;:::i;:::-;51648:52;;;;;51630:10;;51648:52;;51630:71;:17;:71;:::i;:::-;51613:88;;51712:17;51732:58;51743:5;51750;51757:10;51769:9;51780;51732:10;:58::i;:::-;51712:78;;51861:10;-1:-1:-1;;;;;51806:80:0;51840:12;51825:13;-1:-1:-1;;;;;51806:80:0;;51854:5;51873:12;51806:80;;;;;;;;;;;;;;;;51934:9;51903:5;51923;51918:11;;;;;;;;51903:27;;;;;;;;;:40;51899:691;;51984:10;51964:16;;;;;;:30;;;;;;;;;51960:547;;;52015:16;;;:24;;52034:5;;52015:16;-1:-1:-1;;52015:24:0;;52034:5;52015:24;;;;;;;;;;;;;51960:547;;;52147:25;;52198:19;;52147:107;;-1:-1:-1;;;52147:107:0;;-1:-1:-1;;;;;52147:25:0;;;;:32;;52186:10;;52147:107;;52198:19;52147:25;52219:34;;;52147:107;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52147:107:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;52273:21:0;;;;:23;;;;;;;;;;;;;;;;-1:-1:-1;;52273:23:0;;;;;;;;;-1:-1:-1;;52334:16:0;;;;:35;;52358:10;52334:35;:23;:35;:::i;:::-;52315:16;;;:54;52388:16;;;:29;;-1:-1:-1;;52388:29:0;;;51960:547;52558:12;52543:13;-1:-1:-1;;;;;52526:52:0;;52572:5;52526:52;;;;;;;;;;;;;;;51899:691;49702:2895;;;;;;;;;;;;;;:::o;20016:88::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20016:88:0;;;-1:-1:-1;;;20016:88:0;;-1:-1:-1;;;;;20016:88:0;;:::o;74218:229::-;-1:-1:-1;;;;;74352:26:0;;74309:4;74352:26;;;:11;:26;;;;;:35;;:47;;74309:4;;74352:35;74388:10;;74352:47;;;;;;;;;;;;;;74417:15;74352:47;;;;;74417:15;:22;;-1:-1:-1;;74218:229:0;;;;;:::o;32130:104::-;20274:8;;-1:-1:-1;;;;;20274:8:0;20260:10;:22;20252:66;;;;-1:-1:-1;;;20252:66:0;;;;;;;;;32206:8;:20;;-1:-1:-1;;;;;;32206:20:0;-1:-1:-1;;;;;32206:20:0;;;;;;;;;;32130:104::o;19532:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19532:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19532:42:0;;;-1:-1:-1;;;;19532:42:0;;;-1:-1:-1;;;;;19532:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45234:4081::-;-1:-1:-1;;;;;45408:26:0;;45376:29;45408:26;;;:11;:26;;;;;45470;45449:17;;;;:47;;;;;;;;;45445:313;;;45530:11;45519:7;:22;;;;;;;;;;45511:59;;;;-1:-1:-1;;;45511:59:0;;;;;;;;;45445:313;;;45611:21;45590:17;;;;:42;;;;;;;;;45586:172;;;45666:11;45655:7;:22;;;;;;;;;45647:60;;;;-1:-1:-1;;;45647:60:0;;;;;;;;45586:172;45736:22;;-1:-1:-1;;;45736:22:0;;;;;;;;45586:172;45797:19;;;45817:26;;45771:23;;45797:19;-1:-1:-1;;45817:30:0;;;45797:51;;;;;;;;;;;;;;45905:23;;45797:51;;;;;45873:28;;45797:51;;-1:-1:-1;;;;45905:23:0;;;-1:-1:-1;;;;;45905:23:0;;;-1:-1:-1;;;45873:28:0;;;;45867:3;:34;:61;;45859:102;;;;-1:-1:-1;;;45859:102:0;;;;;;;;;46023:23;;-1:-1:-1;;;46023:23:0;;;;45974:27;46004:43;;;:18;;;:43;;;;;;46138:21;;;;;;46178:7;:27;;;;;;;;;46174:735;;;-1:-1:-1;;;;;46234:25:0;;46269:11;46234:25;;;:11;:25;;;;;:32;;;:46;;;;;;;;;:86;;;-1:-1:-1;;;;;;46284:25:0;;;;;;:11;:25;;;;;:36;;;;;;46234:86;46226:121;;;;-1:-1:-1;;;46226:121:0;;;;;;;;;46391:12;-1:-1:-1;;;;;46374:29:0;:13;-1:-1:-1;;;;;46374:29:0;;;46366:72;;;;-1:-1:-1;;;46366:72:0;;;;;;;;;46482:16;46465:13;:33;;;;;;;;;:65;;;-1:-1:-1;46519:11:0;46502:13;:28;;;;;;;;;46465:65;46457:102;;;;-1:-1:-1;;;46457:102:0;;;;;;;;;-1:-1:-1;;;;;46587:41:0;;;;;;:27;;;:41;;;;;;;;46586:42;46578:85;;;;-1:-1:-1;;;46578:85:0;;;;;;;;;-1:-1:-1;;;;;46682:41:0;;;;;;:27;;;:41;;;;;;;;:48;;46726:4;-1:-1:-1;;46682:48:0;;;;;;;;46786:11;:25;;;;;;:31;46749:34;;;:68;;-1:-1:-1;;46749:68:0;-1:-1:-1;;;46786:31:0;;;-1:-1:-1;;;;;46786:31:0;46749:68;;;;;;;;46174:735;;;46865:16;;;;46864:17;46856:53;;;;-1:-1:-1;;;46856:53:0;;;;;;;;;46947:7;46930:24;;;;;;;;:13;:24;;;;;;;;;46926:474;;46975:15;47016:1;47005:7;46999:14;;;;;;;;:18;46993:25;;:1;:25;;46975:43;;47136:9;47098:47;;47112:7;:19;;;;;;;;;;;;47111:20;47099:9;:32;47098:47;;;47090:92;;;;-1:-1:-1;;;47090:92:0;;;;;;;;;47203:32;;;;;;;;;;;;;;;-1:-1:-1;;47203:32:0;;;;;;;47377:7;;47203;;-1:-1:-1;;47353:31:0;;47377:7;47203:19;47353:31;;;;;;;;;;;;46926:474;;-1:-1:-1;47464:19:0;47486;;;:16;;;:19;;;;;47575:24;;47556:18;:44;;47486:19;;47464;47556:18;;-1:-1:-1;;;47575:24:0;;;;;47556:44;;;;;;;;;;;;;;;;;;47636:25;;:77;;-1:-1:-1;;;47636:77:0;;47556:44;;-1:-1:-1;;;;;;47636:25:0;;:41;;:77;;:25;47678:34;;;47636:77;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47636:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47636:77:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;47636:77:0;;;;;;;;;47613:100;;47724:75;47735:5;47742:16;47760:10;47772:9;47783:15;47724:10;:75::i;:::-;-1:-1:-1;47860:15:0;47818:5;47838:16;47818:38;;:57;;47810:99;;;;-1:-1:-1;;;47810:99:0;;;;;;;;;47939:16;;;;:40;;47963:15;47939:40;:23;:40;:::i;:::-;47920:16;;;;:59;;;;47990:16;;;:29;;-1:-1:-1;;47990:29:0;;;48136:25;;:114;;-1:-1:-1;;;48136:114:0;;-1:-1:-1;;;;;48136:25:0;;;;:39;;48182:15;;48136:114;;10818:1;;47990:29;48215:34;;;48136:114;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48136:114:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48136:114:0;;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48136:114:0;;;;;;;;;48114:9;:19;;:136;;;;48284:10;48261:9;:20;;;:33;;;;;-1:-1:-1;;;;;48261:33:0;;;;;-1:-1:-1;;;;;48261:33:0;;;;;;48307:31;48341:32;:68;48382:14;:25;;;;;;;;;;-1:-1:-1;;;;;48382:25:0;-1:-1:-1;;;;;48341:68:0;-1:-1:-1;;;;;48341:68:0;;;;;;;;;;;;:89;48410:9;:19;;;48341:89;;;;;;;;;;;48307:123;;48474:7;:23;;;;;;;;;;;;48467:31;;48441:11;:23;;;:57;;;;;-1:-1:-1;;;;;48441:57:0;;;;;-1:-1:-1;;;;;48441:57:0;;;;;;48536:13;48509:11;:24;;;:40;;;;;-1:-1:-1;;;;;48509:40:0;;;;;-1:-1:-1;;;;;48509:40:0;;;;;;48581:4;48562:7;:16;;;:23;;;;;;;;;;;;;;;;;;48596:7;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48637:9;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48741:1;48712:10;:19;;:26;;;;:30;48697:13;-1:-1:-1;;;;;48676:92:0;;48744:11;:23;;;;;;;;;;-1:-1:-1;;;;;48744:23:0;48676:92;;;;;;;;;;;;;;;48781:25;;;;-1:-1:-1;;;48781:25:0;;;;;;;;;;;-1:-1:-1;;48781:25:0;;;;;;48886:19;;48846:25;;-1:-1:-1;;;;;48846:25:0;48824:307;48941:26;48920:17;;;;:47;;;;;;;;;:133;;49015:14;:34;;;;;;;;;;-1:-1:-1;;;;;49015:34:0;49011:1;:38;49052:1;49011:42;48920:133;;;48974:34;;-1:-1:-1;;;48974:34:0;;-1:-1:-1;;;;;48974:34:0;48970:1;:38;48920:133;49106:13;-1:-1:-1;;;;;49101:19:0;49097:1;49068:10;:19;;:26;;;;:30;:52;48824:307;;;;;;;;;;;;;;;;49148:27;;49144:163;;49285:10;-1:-1:-1;;;;;49195:112:0;49269:13;-1:-1:-1;;;;;49264:19:0;49260:1;49231:10;:19;;:26;;;;:30;:52;49204:14;:25;;;;;;;;;;-1:-1:-1;;;;;49204:25:0;-1:-1:-1;;;;;49195:112:0;-1:-1:-1;;;;;;;;;;;49297:9:0;;49195:112;;;;;;;;;;;;;;;;49144:163;45234:4081;;;;;;;;;;;;:::o;36617:1668::-;-1:-1:-1;;;;;36753:26:0;;36721:29;36753:26;;;:11;:26;;;;;36798:21;;;;;;;:57;;;;-1:-1:-1;36844:11:0;36823:17;;;;:32;;;;;;;;;36798:57;36790:82;;;;-1:-1:-1;;;36790:82:0;;;;;;;;;36972:21;;36883:23;;36909:86;;36944:50;;-1:-1:-1;;;;;36944:18:0;;;;-1:-1:-1;;;36972:21:0;;;36944:50;:27;:50;:::i;36909:86::-;-1:-1:-1;;;;;36883:112:0;;;37020:18;37014:3;:24;37006:63;;;;-1:-1:-1;;;37006:63:0;;;;;;;;;37080:41;;-1:-1:-1;;37080:41:0;37100:21;37080:41;;;;37160:19;;;37180:28;;-1:-1:-1;;37180:28:0;;37160:19;;37180:28;;;:::i;:::-;37160:49;;;;;;;;;;;;;;;;37220:17;37160:49;;;;;37220:17;;;:30;;-1:-1:-1;;;;;;37220:30:0;37240:10;37220:30;;;37261:42;;-1:-1:-1;;;;;37299:3:0;37261:42;-1:-1:-1;;;37261:42:0;-1:-1:-1;;;;37261:42:0;;;;;;;37340:18;:25;;37380:51;-1:-1:-1;;37340:29:0;;;37380:51;;;-1:-1:-1;;;37380:51:0;-1:-1:-1;;;;37380:51:0;;;;;;;;;37466:21;;;:18;;;:21;;;;;;:28;;:31;;;;;;37542:36;;37160:49;;-1:-1:-1;37340:29:0;;37466:31;;37160:49;;37340:18;:29;;37542:36;;;;;;;;;;;;;;;;;;:47;37657:18;:36;;-1:-1:-1;;;;;37542:47:0;;;;-1:-1:-1;37542:47:0;;37623:33;;37657:18;37676:16;;37657:36;;;;;;;;;;;;;;;;:56;;37623:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37623:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37623:91:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;37623:91:0;;;;;;;;;37600:114;;37725:14;37742:45;37765:21;;37742:15;:22;;:45;;;;:::i;:::-;37725:62;;37798:68;37809:5;37816:15;37833:10;37845:9;37856;37798:10;:68::i;:::-;-1:-1:-1;37928:9:0;37887:5;37907:15;37887:37;;:50;;37879:92;;;;-1:-1:-1;;;37879:92:0;;;;;;;;;37982:16;;;:34;;-1:-1:-1;;37982:34:0;38001:15;37982:34;;;;;;38078:19;;:26;38034:75;;-1:-1:-1;;;;;38034:75:0;;;38051:10;;38034:75;;;;-1:-1:-1;;38078:30:0;;;;38034:75;;;;;;;;;;38126:27;;38122:155;;38255:10;-1:-1:-1;;;;;38173:104:0;38239:13;-1:-1:-1;;;;;38234:19:0;38230:1;38201:10;:19;;:26;;;;:30;:52;38182:17;-1:-1:-1;;;;;38173:104:0;-1:-1:-1;;;;;;;;;;;38267:9:0;;38173:104;;;;;;;;;;;;;;;;36617:1668;;;;;;;;;;;:::o;18203:32::-;;;-1:-1:-1;;;;;18203:32:0;;:::o;30549:163::-;20274:8;;-1:-1:-1;;;;;20274:8:0;20260:10;:22;20252:66;;;;-1:-1:-1;;;20252:66:0;;;;;;;;;30654:23;:50;;-1:-1:-1;;;;;30654:50:0;;;-1:-1:-1;;;30654:50:0;-1:-1:-1;;;;;30654:50:0;;;;;;;;;30549:163::o;1503:150::-;1566:6;1596:7;;;-1:-1:-1;;;;;1621:7:0;;;;;;;;:24;;-1:-1:-1;;;;;1621:24:0;;;1631:1;1621:24;1614:31;1503:150;-1:-1:-1;;;;1503:150:0:o;65184:3318::-;-1:-1:-1;;;;;65316:26:0;;65284:29;65316:26;;;:11;:26;;;;;65399:1;65370:19;;:26;;65427:17;;65316:26;;-1:-1:-1;;65370:30:0;;;65427:17;;;65284:29;;65370:30;;65483;;;;;;;;;;;;;;;;;;;;;65550:26;;65619:32;;;:18;;;:32;;;;;;;65483:30;;-1:-1:-1;65550:26:0;;;;;;;65678:21;65668:6;:31;;;;;;;;;65664:2523;;;65731:15;65720:7;:26;;;;;;;;;65716:78;;;65765:29;;-1:-1:-1;;65765:29:0;;;65716:78;65811:31;;-1:-1:-1;;65811:31:0;;;65857:23;;-1:-1:-1;;65857:23:0;;;;;65664:2523;;;65912:26;65902:6;:36;;;;;;;;;65898:2289;;;66049:15;66038:7;:26;;;;;;;;;66034:2142;;;66089:18;66111:1;66089:23;66085:1170;;;66254:21;;;;;;;66249:987;;66308:19;;;;;;;;11065:2;66308:39;66304:771;;;66509:31;;66571:28;-1:-1:-1;;66571:28:0;;;;;-1:-1:-1;;66630:39:0;;66665:3;-1:-1:-1;;;;;66630:39:0;;;;;66700:23;;-1:-1:-1;;66700:23:0;;;;66304:771;;;66884:24;;-1:-1:-1;;;;;;66939:42:0;-1:-1:-1;;;66977:3:0;-1:-1:-1;;;;;66939:42:0;;;-1:-1:-1;;67012:35:0;;;66304:771;66034:2142;;;67343:28;;-1:-1:-1;;67343:28:0;;;;;67367:4;67485:23;;67481:149;;;67533:31;;-1:-1:-1;;67533:31:0;;;67587:23;;-1:-1:-1;;67587:23:0;;;;;67481:149;67848:16;67839:7;:25;;;;;;;;;:139;;;;-1:-1:-1;67869:26:0;;;;-1:-1:-1;;;;;67869:26:0;:40;;:108;;-1:-1:-1;67948:29:0;;67913:34;;;;-1:-1:-1;;;67948:29:0;;;-1:-1:-1;;;;;67948:29:0;;;67913:34;;;;;:64;67869:108;67835:326;;;68032:20;;;;;68003:26;;;:49;;-1:-1:-1;;;68032:20:0;;;-1:-1:-1;;;;;68032:20:0;-1:-1:-1;;;;;;68003:49:0;;;;;;;;;68107:34;68075:66;;-1:-1:-1;;;;68075:66:0;68107:34;;;;-1:-1:-1;;;;;68107:34:0;-1:-1:-1;;;68075:66:0;;;;67835:326;68356:28;;-1:-1:-1;;68356:28:0;;;;;;;;;;;;;-1:-1:-1;;68356:28:0;;;;;;;68395:16;;;:26;;68414:7;;-1:-1:-1;;68395:26:0;;;;68414:7;68395:26;;;;;;;;;;;;;68470:9;68455:13;-1:-1:-1;;;;;68437:57:0;;68481:12;68437:57;;;;;;;;;;;;;;;65184:3318;;;;;;;;;:::o;62067:1096::-;-1:-1:-1;;;;;62196:26:0;;62164:29;62196:26;;;:11;:26;;;;;62259:19;;;;62279:28;;62196:26;;62164:29;62259:19;;62279:28;;62259:19;;62279:28;;;:::i;:::-;62259:49;;;;;;;;;;;;;;;;62345:18;:25;;62259:49;;;;;;;62385:51;;;-1:-1:-1;;62345:29:0;;;62385:51;;;-1:-1:-1;;;62385:51:0;-1:-1:-1;;;;62385:51:0;;;;;;62471:21;;;:18;;;:21;;;;;;:28;;:31;;;;;;62547:36;;62259:49;;-1:-1:-1;62345:29:0;;62259:49;62345:29;;62547:36;;;;;;;;;;;;;;;;;;:47;62662:18;:36;;-1:-1:-1;;;;;62547:47:0;;;;-1:-1:-1;62547:47:0;;62628:33;;62662:18;62681:16;;62662:36;;;;;;;;;;;;;;;;:56;;62628:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62628:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62628:91:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;62628:91:0;;;;;;;;;62605:114;;62730:14;62747:45;62770:21;;62747:15;:22;;:45;;;;:::i;:::-;62730:62;;62803:68;62814:5;62821:15;62838:10;62850:9;62861;62803:10;:68::i;:::-;-1:-1:-1;62929:9:0;62888:5;62908:15;62888:37;;:50;62884:103;;62953:16;;;:34;;-1:-1:-1;;62953:34:0;62972:15;62953:34;;;62884:103;63004:23;;:27;63000:155;;63133:10;-1:-1:-1;;;;;63051:104:0;63117:13;-1:-1:-1;;;;;63112:19:0;63108:1;63079:10;:19;;:26;;;;:30;:52;63060:17;-1:-1:-1;;;;;63051:104:0;-1:-1:-1;;;;;;;;;;;63145:9:0;63051:104;;;;;;;;;;;;;;;63000:155;62067:1096;;;;;;;;;:::o;1663:167::-;1726:6;1754:2;-1:-1:-1;;;;;1749:7:0;:2;-1:-1:-1;;;;;1749:7:0;;1745:77;;;-1:-1:-1;1778:1:0;1771:8;;1745:77;-1:-1:-1;1815:7:0;;;1808:14;;595:138;652:4;678:7;;;703;;;;:22;;-1:-1:-1;;703:22:0;;64268:618;64406:4;;;64510:83;64532:7;64541:51;64563:6;64584:5;64579:11;;;;;;;;64563:28;;;;;;;;;64541:14;;:51;:21;:51;:::i;:::-;64510:21;:83::i;:::-;-1:-1:-1;;;;;64604:34:0;;;;;;:20;;;:34;;;;;64479:114;;-1:-1:-1;64479:114:0;-1:-1:-1;64479:114:0;;64644:5;64639:11;;;;;;;;64604:47;;;;;;;;:63;;;;;;;64710:12;64678:6;64699:5;64694:11;;;;;;;;64678:28;;;;;;;;:44;;;;;;;64733:17;;;:33;;;;;;64783:17;;64779:67;;64815:31;;-1:-1:-1;;;;;64815:17:0;;;:31;;;;;64833:12;;64815:31;;;;64833:12;64815:17;:31;;-1:-1:-1;;;;;64779:67:0;-1:-1:-1;64866:12:0;-1:-1:-1;64268:618:0;;;;;;;;:::o;1083:412::-;1140:4;1383:7;1379:34;;-1:-1:-1;1412:1:0;1405:8;;1379:34;1435:7;;;1440:2;1435;:7;:2;1460:6;;;;;:12;:27;;-1:-1:-1;;1460:27:0;;820:159;877:4;903:2;898;:7;894:77;;;-1:-1:-1;927:1:0;920:8;;63558:339;63677:10;63689:14;63743:10;63725:15;:28;63721:69;;;-1:-1:-1;63776:10:0;;-1:-1:-1;63788:1:0;63768:22;;63721:69;-1:-1:-1;63828:15:0;;-1:-1:-1;63815:28:0;;;63558:339;;;;;;:::o;10616:64871::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;10616:64871:0;;;-1:-1:-1;;10616:64871:0:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10616:64871:0;;;-1:-1:-1;10616:64871:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;10616:64871:0;;;;;;;;-1:-1:-1;;;;;;10616:64871:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;313:352;;;443:3;436:4;428:6;424:17;420:27;410:2;;461:1;458;451:12;410:2;-1:-1;481:20;;-1:-1;;;;;510:30;;507:2;;;553:1;550;543:12;507:2;587:4;579:6;575:17;563:29;;638:3;630:4;622:6;618:17;608:8;604:32;601:41;598:2;;;655:1;652;645:12;1833:336;;;1947:3;1940:4;1932:6;1928:17;1924:27;1914:2;;1965:1;1962;1955:12;1914:2;-1:-1;1985:20;;-1:-1;;;;;2014:30;;2011:2;;;2057:1;2054;2047:12;2011:2;2091:4;2083:6;2079:17;2067:29;;2142:3;2134:4;2126:6;2122:17;2112:8;2108:32;2105:41;2102:2;;;2159:1;2156;2149:12;2177:168;2263:20;;2288:52;2263:20;2288:52;;2352:148;2428:20;;2453:42;2428:20;2453:42;;2507:150;2584:20;;2609:43;2584:20;2609:43;;3024:130;3091:20;;3116:33;3091:20;3116:33;;3161:134;3239:13;;3257:33;3239:13;3257:33;;3302:128;3368:20;;3393:32;3368:20;3393:32;;3437:241;;3541:2;3529:9;3520:7;3516:23;3512:32;3509:2;;;3557:1;3554;3547:12;3509:2;3592:1;3609:53;3654:7;3634:9;3609:53;;3685:759;;;;;;3865:3;3853:9;3844:7;3840:23;3836:33;3833:2;;;3882:1;3879;3872:12;3833:2;3917:1;3934:61;3987:7;3967:9;3934:61;;;3924:71;;3896:105;4032:2;4050:53;4095:7;4086:6;4075:9;4071:22;4050:53;;;4040:63;;4011:98;4140:2;4158:53;4203:7;4194:6;4183:9;4179:22;4158:53;;;4148:63;;4119:98;4248:2;4266:53;4311:7;4302:6;4291:9;4287:22;4266:53;;;4256:63;;4227:98;4356:3;4375:53;4420:7;4411:6;4400:9;4396:22;4375:53;;;4365:63;;4335:99;3827:617;;;;;;;;;4451:366;;;4572:2;4560:9;4551:7;4547:23;4543:32;4540:2;;;4588:1;4585;4578:12;4540:2;4623:1;4640:53;4685:7;4665:9;4640:53;;;4630:63;;4602:97;4730:2;4748:53;4793:7;4784:6;4773:9;4769:22;4748:53;;;4738:63;;4709:98;4534:283;;;;;;4824:1099;;;;;;;;5091:3;5079:9;5070:7;5066:23;5062:33;5059:2;;;5108:1;5105;5098:12;5059:2;5143:1;5160:53;5205:7;5185:9;5160:53;;;5150:63;;5122:97;5278:2;5267:9;5263:18;5250:32;-1:-1;;;;;5294:6;5291:30;5288:2;;;5334:1;5331;5324:12;5288:2;5362:80;5434:7;5425:6;5414:9;5410:22;5362:80;;;5352:90;;;;5229:219;5507:2;5496:9;5492:18;5479:32;-1:-1;;;;;5523:6;5520:30;5517:2;;;5563:1;5560;5553:12;5517:2;5591:87;5670:7;5661:6;5650:9;5646:22;5591:87;;;5581:97;;;;5458:226;5743:2;5732:9;5728:18;5715:32;-1:-1;;;;;5759:6;5756:30;5753:2;;;5799:1;5796;5789:12;5753:2;5827:80;5899:7;5890:6;5879:9;5875:22;5827:80;;;5817:90;;;;5694:219;5053:870;;;;;;;;;;;5930:763;;;;;;6115:3;6103:9;6094:7;6090:23;6086:33;6083:2;;;6132:1;6129;6122:12;6083:2;6167:1;6184:53;6229:7;6209:9;6184:53;;;6174:63;;6146:97;6274:2;6292:63;6347:7;6338:6;6327:9;6323:22;6292:63;;;6282:73;;6253:108;6392:2;6410:53;6455:7;6446:6;6435:9;6431:22;6410:53;;;6400:63;;6371:98;6528:2;6517:9;6513:18;6500:32;-1:-1;;;;;6544:6;6541:30;6538:2;;;6584:1;6581;6574:12;6538:2;6612:65;6669:7;6660:6;6649:9;6645:22;6612:65;;;6602:75;;;;6479:204;6077:616;;;;;;;;;6700:492;;;;6841:2;6829:9;6820:7;6816:23;6812:32;6809:2;;;6857:1;6854;6847:12;6809:2;6892:1;6909:53;6954:7;6934:9;6909:53;;;6899:63;;6871:97;7027:2;7016:9;7012:18;6999:32;-1:-1;;;;;7043:6;7040:30;7037:2;;;7083:1;7080;7073:12;7037:2;7111:65;7168:7;7159:6;7148:9;7144:22;7111:65;;;7101:75;;;;6978:204;6803:389;;;;;;7199:366;;;7320:2;7308:9;7299:7;7295:23;7291:32;7288:2;;;7336:1;7333;7326:12;7288:2;7371:1;7388:53;7433:7;7413:9;7388:53;;;7378:63;;7350:97;7478:2;7496:53;7541:7;7532:6;7521:9;7517:22;7496:53;;7572:491;;;;7710:2;7698:9;7689:7;7685:23;7681:32;7678:2;;;7726:1;7723;7716:12;7678:2;7761:1;7778:53;7823:7;7803:9;7778:53;;;7768:63;;7740:97;7868:2;7886:53;7931:7;7922:6;7911:9;7907:22;7886:53;;;7876:63;;7847:98;7976:2;7994:53;8039:7;8030:6;8019:9;8015:22;7994:53;;;7984:63;;7955:98;7672:391;;;;;;8070:509;;;;8217:2;8205:9;8196:7;8192:23;8188:32;8185:2;;;8233:1;8230;8223:12;8185:2;8268:1;8285:53;8330:7;8310:9;8285:53;;;8275:63;;8247:97;8375:2;8393:53;8438:7;8429:6;8418:9;8414:22;8393:53;;;8383:63;;8354:98;8483:2;8501:62;8555:7;8546:6;8535:9;8531:22;8501:62;;8586:491;;;;8724:2;8712:9;8703:7;8699:23;8695:32;8692:2;;;8740:1;8737;8730:12;8692:2;8775:1;8792:53;8837:7;8817:9;8792:53;;;8782:63;;8754:97;8882:2;8900:53;8945:7;8936:6;8925:9;8921:22;8900:53;;;8890:63;;8861:98;8990:2;9008:53;9053:7;9044:6;9033:9;9029:22;9008:53;;9084:617;;;;;9239:3;9227:9;9218:7;9214:23;9210:33;9207:2;;;9256:1;9253;9246:12;9207:2;9291:1;9308:53;9353:7;9333:9;9308:53;;;9298:63;;9270:97;9398:2;9416:53;9461:7;9452:6;9441:9;9437:22;9416:53;;;9406:63;;9377:98;9506:2;9524:53;9569:7;9560:6;9549:9;9545:22;9524:53;;;9514:63;;9485:98;9614:2;9632:53;9677:7;9668:6;9657:9;9653:22;9632:53;;;9622:63;;9593:98;9201:500;;;;;;;;9708:743;;;;;;9880:3;9868:9;9859:7;9855:23;9851:33;9848:2;;;9897:1;9894;9887:12;9848:2;9932:1;9949:53;9994:7;9974:9;9949:53;;;9939:63;;9911:97;10039:2;10057:53;10102:7;10093:6;10082:9;10078:22;10057:53;;;10047:63;;10018:98;10147:2;10165:53;10210:7;10201:6;10190:9;10186:22;10165:53;;;10155:63;;10126:98;10255:2;10273:53;10318:7;10309:6;10298:9;10294:22;10273:53;;;10263:63;;10234:98;10363:3;10382:53;10427:7;10418:6;10407:9;10403:22;10382:53;;10458:991;;;;;;;10717:2;10705:9;10696:7;10692:23;10688:32;10685:2;;;10733:1;10730;10723:12;10685:2;10768:31;;-1:-1;;;;;10808:30;;10805:2;;;10851:1;10848;10841:12;10805:2;10879:80;10951:7;10942:6;10931:9;10927:22;10879:80;;;10869:90;;;;10747:218;11024:2;11013:9;11009:18;10996:32;-1:-1;;;;;11040:6;11037:30;11034:2;;;11080:1;11077;11070:12;11034:2;11108:88;11188:7;11179:6;11168:9;11164:22;11108:88;;;11098:98;;;;10975:227;11261:2;11250:9;11246:18;11233:32;-1:-1;;;;;11277:6;11274:30;11271:2;;;11317:1;11314;11307:12;11271:2;11345:88;11425:7;11416:6;11405:9;11401:22;11345:88;;;11335:98;;;;11212:227;10679:770;;;;;;;;;11456:528;;;;11615:2;11603:9;11594:7;11590:23;11586:32;11583:2;;;11631:1;11628;11621:12;11583:2;11666:1;11683:72;11747:7;11727:9;11683:72;;11991:618;;;;;12152:2;12140:9;12131:7;12127:23;12123:32;12120:2;;;12168:1;12165;12158:12;12120:2;12203:31;;-1:-1;;;;;12243:30;;12240:2;;;12286:1;12283;12276:12;12240:2;12314:65;12371:7;12362:6;12351:9;12347:22;12314:65;;;12304:75;;;;12182:203;12444:2;12433:9;12429:18;12416:32;-1:-1;;;;;12460:6;12457:30;12454:2;;;12500:1;12497;12490:12;12454:2;12528:65;12585:7;12576:6;12565:9;12561:22;12528:65;;;12114:495;;;;-1:-1;12518:75;-1:-1;;;;12114:495;12616:241;;12720:2;12708:9;12699:7;12695:23;12691:32;12688:2;;;12736:1;12733;12726:12;12688:2;12771:1;12788:53;12833:7;12813:9;12788:53;;12864:263;;12979:2;12967:9;12958:7;12954:23;12950:32;12947:2;;;12995:1;12992;12985:12;12947:2;13030:1;13047:64;13103:7;13083:9;13047:64;;13134:366;;;13255:2;13243:9;13234:7;13230:23;13226:32;13223:2;;;13271:1;13268;13261:12;13223:2;13306:1;13323:53;13368:7;13348:9;13323:53;;13507:399;;;13639:2;13627:9;13618:7;13614:23;13610:32;13607:2;;;13655:1;13652;13645:12;13607:2;13690:1;13707:64;13763:7;13743:9;13707:64;;;13697:74;;13669:108;13808:2;13826:64;13882:7;13873:6;13862:9;13858:22;13826:64;;13913:239;;14016:2;14004:9;13995:7;13991:23;13987:32;13984:2;;;14032:1;14029;14022:12;13984:2;14067:1;14084:52;14128:7;14108:9;14084:52;;14159:485;;;;14294:2;14282:9;14273:7;14269:23;14265:32;14262:2;;;14310:1;14307;14300:12;14262:2;14345:1;14362:52;14406:7;14386:9;14362:52;;;14352:62;;14324:96;14451:2;14469:52;14513:7;14504:6;14493:9;14489:22;14469:52;;;14459:62;;14430:97;14558:2;14576:52;14620:7;14611:6;14600:9;14596:22;14576:52;;14652:173;;14739:46;14781:3;14773:6;14739:46;;;-1:-1;;14814:4;14805:14;;14732:93;14833:137;14932:32;14958:5;14932:32;;;14927:3;14920:45;14914:56;;;15130:660;15263:52;15309:5;15263:52;;;15328:84;15405:6;15400:3;15328:84;;;15321:91;;15433:54;15481:5;15433:54;;;15507:7;15535:1;15520:258;15545:6;15542:1;15539:13;15520:258;;;15612:6;15606:13;15633:63;15692:3;15677:13;15633:63;;;15626:70;;15713:58;15764:6;15713:58;;;15703:68;-1:-1;;15567:1;15560:9;15520:258;;15798:104;15875:21;15890:5;15875:21;;15909:148;16008:43;16027:23;16044:5;16027:23;;;16008:43;;16064:113;16147:24;16165:5;16147:24;;16184:152;16285:45;16305:24;16323:5;16305:24;;16343:335;;16449:34;16477:5;16449:34;;;16495:70;16558:6;16553:3;16495:70;;;16488:77;;16570:52;16615:6;16610:3;16603:4;16596:5;16592:16;16570:52;;;16643:29;16665:6;16643:29;;;16634:39;;;;16429:249;-1:-1;;;16429:249;16708:818;;16825:5;16819:12;16859:1;16848:9;16844:17;16872:1;16867:247;;;;17125:1;17120:400;;;;16837:683;;16867:247;16945:4;16941:1;16930:9;16926:17;16922:28;16964:70;17027:6;17022:3;16964:70;;;-1:-1;;17053:25;;17041:38;;16957:77;-1:-1;;17102:4;17093:14;;;-1:-1;16867:247;;17120:400;17189:1;17178:9;17174:17;17205:70;17268:6;17263:3;17205:70;;;17198:77;;17297:37;17328:5;17297:37;;;17350:1;17358:130;17372:6;17369:1;17366:13;17358:130;;;17431:14;;17418:11;;;17411:35;17478:1;17465:15;;;;17394:4;17387:12;17358:130;;;17502:11;;;-1:-1;;;16837:683;;16795:731;;;;;;17534:164;17636:56;17686:5;17636:56;;17705:140;17795:44;17833:5;17795:44;;17852:142;17943:45;17982:5;17943:45;;18001:142;18092:45;18131:5;18092:45;;18175:300;;18291:71;18355:6;18350:3;18291:71;;;18284:78;;18374:43;18410:6;18405:3;18398:5;18374:43;;;18439:29;18461:6;18439:29;;19167:332;;19327:67;19391:2;19386:3;19327:67;;;19427:34;19407:55;;19490:2;19481:12;;19313:186;-1:-1;;19313:186;19508:323;;19668:67;19732:2;19727:3;19668:67;;;19768:25;19748:46;;19822:2;19813:12;;19654:177;-1:-1;;19654:177;19840:321;;20000:67;20064:2;20059:3;20000:67;;;-1:-1;;;20080:44;;20152:2;20143:12;;19986:175;-1:-1;;19986:175;20170:324;;20330:67;20394:2;20389:3;20330:67;;;20430:26;20410:47;;20485:2;20476:12;;20316:178;-1:-1;;20316:178;20503:324;;20663:67;20727:2;20722:3;20663:67;;;20763:26;20743:47;;20818:2;20809:12;;20649:178;-1:-1;;20649:178;20836:316;;20996:67;21060:2;21055:3;20996:67;;;-1:-1;;;21076:39;;21143:2;21134:12;;20982:170;-1:-1;;20982:170;21161:317;;21321:67;21385:2;21380:3;21321:67;;;-1:-1;;;21401:40;;21469:2;21460:12;;21307:171;-1:-1;;21307:171;21487:330;;21647:67;21711:2;21706:3;21647:67;;;21747:32;21727:53;;21808:2;21799:12;;21633:184;-1:-1;;21633:184;21826:329;;21986:67;22050:2;22045:3;21986:67;;;22086:31;22066:52;;22146:2;22137:12;;21972:183;-1:-1;;21972:183;22164:317;;22324:67;22388:2;22383:3;22324:67;;;-1:-1;;;22404:40;;22472:2;22463:12;;22310:171;-1:-1;;22310:171;22490:323;;22650:67;22714:2;22709:3;22650:67;;;22750:25;22730:46;;22804:2;22795:12;;22636:177;-1:-1;;22636:177;22822:326;;22982:67;23046:2;23041:3;22982:67;;;23082:28;23062:49;;23139:2;23130:12;;22968:180;-1:-1;;22968:180;23157:317;;23317:67;23381:2;23376:3;23317:67;;;-1:-1;;;23397:40;;23465:2;23456:12;;23303:171;-1:-1;;23303:171;23483:317;;23643:67;23707:2;23702:3;23643:67;;;-1:-1;;;23723:40;;23791:2;23782:12;;23629:171;-1:-1;;23629:171;23809:328;;23969:67;24033:2;24028:3;23969:67;;;24069:30;24049:51;;24128:2;24119:12;;23955:182;-1:-1;;23955:182;24146:320;;24306:67;24370:2;24365:3;24306:67;;;-1:-1;;;24386:43;;24457:2;24448:12;;24292:174;-1:-1;;24292:174;24475:324;;24635:67;24699:2;24694:3;24635:67;;;24735:26;24715:47;;24790:2;24781:12;;24621:178;-1:-1;;24621:178;24808:327;;24968:67;25032:2;25027:3;24968:67;;;25068:29;25048:50;;25126:2;25117:12;;24954:181;-1:-1;;24954:181;25144:312;;25304:67;25368:2;25363:3;25304:67;;;-1:-1;;;25384:35;;25447:2;25438:12;;25290:166;-1:-1;;25290:166;25465:323;;25625:67;25689:2;25684:3;25625:67;;;25725:25;25705:46;;25779:2;25770:12;;25611:177;-1:-1;;25611:177;25797:331;;25957:67;26021:2;26016:3;25957:67;;;26057:33;26037:54;;26119:2;26110:12;;25943:185;-1:-1;;25943:185;26137:322;;26297:67;26361:2;26356:3;26297:67;;;-1:-1;;;26377:45;;26450:2;26441:12;;26283:176;-1:-1;;26283:176;26468:331;;26628:67;26692:2;26687:3;26628:67;;;26728:33;26708:54;;26790:2;26781:12;;26614:185;-1:-1;;26614:185;26808:322;;26968:67;27032:2;27027:3;26968:67;;;-1:-1;;;27048:45;;27121:2;27112:12;;26954:176;-1:-1;;26954:176;27139:331;;27299:67;27363:2;27358:3;27299:67;;;27399:33;27379:54;;27461:2;27452:12;;27285:185;-1:-1;;27285:185;27479:325;;27639:67;27703:2;27698:3;27639:67;;;27739:27;27719:48;;27795:2;27786:12;;27625:179;-1:-1;;27625:179;27813:329;;27973:67;28037:2;28032:3;27973:67;;;28073:31;28053:52;;28133:2;28124:12;;27959:183;-1:-1;;27959:183;28151:330;;28311:67;28375:2;28370:3;28311:67;;;28411:32;28391:53;;28472:2;28463:12;;28297:184;-1:-1;;28297:184;28489:110;28570:23;28587:5;28570:23;;28836:110;28917:23;28934:5;28917:23;;28953:107;29032:22;29048:5;29032:22;;29067:124;29149:36;29179:5;29149:36;;29198:110;29279:23;29296:5;29279:23;;29315:517;;29488:73;29557:3;29548:6;29488:73;;;29583:1;29578:3;29574:11;29567:18;;29596:75;29667:3;29658:6;29596:75;;;29693:2;29688:3;29684:12;29677:19;;29707:75;29778:3;29769:6;29707:75;;;-1:-1;29804:2;29795:12;;29476:356;-1:-1;;;29476:356;29839:213;29957:2;29942:18;;29971:71;29946:9;30015:6;29971:71;;30059:305;30223:2;30208:18;;30237:117;30212:9;30327:6;30237:117;;30371:201;30483:2;30468:18;;30497:65;30472:9;30535:6;30497:65;;30579:643;30828:3;30813:19;;30843:65;30817:9;30881:6;30843:65;;;30919:118;31033:2;31022:9;31018:18;31009:6;30919:118;;;31048:80;31123:3;31112:9;31108:19;31099:6;31048:80;;;31139:73;31207:3;31196:9;31192:19;31183:6;31139:73;;31229:1243;31611:3;31596:19;;31626:65;31600:9;31664:6;31626:65;;;31702:66;31764:2;31753:9;31749:18;31740:6;31702:66;;;31779;31841:2;31830:9;31826:18;31817:6;31779:66;;;31856:80;31932:2;31921:9;31917:18;31908:6;31856:80;;;31947:71;32013:3;32002:9;31998:19;31989:6;31947:71;;;32029;32095:3;32084:9;32080:19;32071:6;32029:71;;;32111;32177:3;32166:9;32162:19;32153:6;32111:71;;;32193:89;32277:3;32266:9;32262:19;32253:6;32193:89;;;32293;32377:3;32366:9;32362:19;32353:6;32293:89;;;32393:69;32457:3;32446:9;32442:19;32433:6;32393:69;;;31582:890;;;;;;;;;;;;;;32479:435;32653:2;32638:18;;32667:71;32642:9;32711:6;32667:71;;;32749:72;32817:2;32806:9;32802:18;32793:6;32749:72;;;32832;32900:2;32889:9;32885:18;32876:6;32832:72;;32921:539;33119:3;33104:19;;33134:71;33108:9;33178:6;33134:71;;;33216:68;33280:2;33269:9;33265:18;33256:6;33216:68;;;33295:72;33363:2;33352:9;33348:18;33339:6;33295:72;;;33378;33446:2;33435:9;33431:18;33422:6;33378:72;;33467:291;33600:2;33614:47;;;33585:18;;33675:73;33585:18;33734:6;33675:73;;33765:545;33970:2;33955:18;;33984:90;33959:9;34047:6;33984:90;;;34085:70;34151:2;34140:9;34136:18;34127:6;34085:70;;;34203:9;34197:4;34193:20;34188:2;34177:9;34173:18;34166:48;34228:72;34295:4;34286:6;34228:72;;34317:227;34442:2;34427:18;;34456:78;34431:9;34507:6;34456:78;;34551:338;34704:2;34689:18;;34718:78;34693:9;34769:6;34718:78;;;34807:72;34875:2;34864:9;34860:18;34851:6;34807:72;;34896:755;35146:3;35131:19;;35161:79;35135:9;35213:6;35161:79;;;35251:70;35317:2;35306:9;35302:18;35293:6;35251:70;;;35332;35398:2;35387:9;35383:18;35374:6;35332:70;;;35413:66;35475:2;35464:9;35460:18;35451:6;35413:66;;;35490:67;35552:3;35541:9;35537:19;35528:6;35490:67;;;35568:73;35636:3;35625:9;35621:19;35612:6;35568:73;;;35117:534;;;;;;;;;;35658:313;35802:2;35816:47;;;35787:18;;35877:84;35787:18;35947:6;35939;35877:84;;36306:301;36444:2;36458:47;;;36429:18;;36519:78;36429:18;36583:6;36519:78;;36614:407;36805:2;36819:47;;;36790:18;;36880:131;36790:18;36880:131;;37028:407;37219:2;37233:47;;;37204:18;;37294:131;37204:18;37294:131;;37442:407;37633:2;37647:47;;;37618:18;;37708:131;37618:18;37708:131;;37856:407;38047:2;38061:47;;;38032:18;;38122:131;38032:18;38122:131;;38270:407;38461:2;38475:47;;;38446:18;;38536:131;38446:18;38536:131;;38684:407;38875:2;38889:47;;;38860:18;;38950:131;38860:18;38950:131;;39098:407;39289:2;39303:47;;;39274:18;;39364:131;39274:18;39364:131;;39512:407;39703:2;39717:47;;;39688:18;;39778:131;39688:18;39778:131;;39926:407;40117:2;40131:47;;;40102:18;;40192:131;40102:18;40192:131;;40340:407;40531:2;40545:47;;;40516:18;;40606:131;40516:18;40606:131;;40754:407;40945:2;40959:47;;;40930:18;;41020:131;40930:18;41020:131;;41168:407;41359:2;41373:47;;;41344:18;;41434:131;41344:18;41434:131;;41582:407;41773:2;41787:47;;;41758:18;;41848:131;41758:18;41848:131;;41996:407;42187:2;42201:47;;;42172:18;;42262:131;42172:18;42262:131;;42410:407;42601:2;42615:47;;;42586:18;;42676:131;42586:18;42676:131;;42824:407;43015:2;43029:47;;;43000:18;;43090:131;43000:18;43090:131;;43238:407;43429:2;43443:47;;;43414:18;;43504:131;43414:18;43504:131;;43652:407;43843:2;43857:47;;;43828:18;;43918:131;43828:18;43918:131;;44066:407;44257:2;44271:47;;;44242:18;;44332:131;44242:18;44332:131;;44480:407;44671:2;44685:47;;;44656:18;;44746:131;44656:18;44746:131;;44894:407;45085:2;45099:47;;;45070:18;;45160:131;45070:18;45160:131;;45308:407;45499:2;45513:47;;;45484:18;;45574:131;45484:18;45574:131;;45722:407;45913:2;45927:47;;;45898:18;;45988:131;45898:18;45988:131;;46136:407;46327:2;46341:47;;;46312:18;;46402:131;46312:18;46402:131;;46550:407;46741:2;46755:47;;;46726:18;;46816:131;46726:18;46816:131;;46964:407;47155:2;47169:47;;;47140:18;;47230:131;47140:18;47230:131;;47378:407;47569:2;47583:47;;;47554:18;;47644:131;47554:18;47644:131;;47792:407;47983:2;47997:47;;;47968:18;;48058:131;47968:18;48058:131;;48206:665;48439:3;48424:19;;48454:69;48428:9;48496:6;48454:69;;;48534:72;48602:2;48591:9;48587:18;48578:6;48534:72;;;48617;48685:2;48674:9;48670:18;48661:6;48617:72;;;48700:79;48775:2;48764:9;48760:18;48751:6;48700:79;;;48790:71;48856:3;48845:9;48841:19;48832:6;48790:71;;;48410:461;;;;;;;;;48878:213;48996:2;48981:18;;49010:71;48985:9;49054:6;49010:71;;49098:402;49259:2;49244:18;;49273:71;49248:9;49317:6;49273:71;;;49392:9;49386:4;49382:20;49377:2;49366:9;49362:18;49355:48;49417:73;49485:4;49476:6;49417:73;;49507:209;49623:2;49608:18;;49637:69;49612:9;49679:6;49637:69;;49723:211;49840:2;49825:18;;49854:70;49829:9;49897:6;49854:70;;49941:320;50085:2;50070:18;;50099:69;50074:9;50141:6;50099:69;;;50179:72;50247:2;50236:9;50232:18;50223:6;50179:72;;50268:322;50413:2;50398:18;;50427:70;50402:9;50470:6;50427:70;;50701:157;;50795:14;;;50837:4;50824:18;;;50754:104;50865:108;-1:-1;50959:4;;50937:36;50980:117;51063:12;;51034:63;51233:106;51329:4;51320:14;;51306:33;51496:162;51598:19;;;51647:4;51638:14;;51591:67;51838:91;;51900:24;51918:5;51900:24;;52042:85;52108:13;52101:21;;52084:43;52134:144;-1:-1;;;;;;52195:78;;52178:100;52364:110;;52445:24;52463:5;52445:24;;52481:124;52552:5;52558:42;52552:5;52558:42;;52612:126;52684:5;52690:43;52684:5;52690:43;;52745:126;52817:5;52823:43;52817:5;52823:43;;52878:84;52950:6;52939:18;;52922:40;52969:121;-1:-1;;;;;53031:54;;53014:76;53176:96;-1:-1;;;;;53237:30;;53220:52;53279:81;53350:4;53339:16;;53322:38;53367:104;-1:-1;;;;;53428:38;;53411:60;53778:124;;53864:33;53891:5;53864:33;;53909:126;;53996:34;54024:5;53996:34;;54042:126;;54129:34;54157:5;54129:34;;54175:106;;54253:23;54270:5;54253:23;;54289:145;54370:6;54365:3;54360;54347:30;-1:-1;54426:1;54408:16;;54401:27;54340:94;54443:268;54508:1;54515:101;54529:6;54526:1;54523:13;54515:101;;;54596:11;;;54590:18;54577:11;;;54570:39;54551:2;54544:10;54515:101;;;54631:6;54628:1;54625:13;54622:2;;;54696:1;54687:6;54682:3;54678:16;54671:27;54622:2;54492:219;;;;;54880:97;54968:2;54948:14;-1:-1;;54944:28;;54928:49;54985:100;55063:1;55056:5;55053:12;55043:2;;55069:9;55092:101;55171:1;55164:5;55161:12;55151:2;;55177:9;55200:101;55279:1;55272:5;55269:12;55259:2;;55285:9;55308:117;55377:24;55395:5;55377:24;;;55370:5;55367:35;55357:2;;55416:1;55413;55406:12;55572:155;55660:43;55697:5;55660:43;;55734:103;55812:1;55805:5;55802:12;55792:2;;55828:1;55825;55818:12;55844:104;55923:1;55916:5;55913:12;55903:2;;55939:1;55936;55929:12;55955:117;56024:24;56042:5;56024:24;;56079:115;56147:23;56164:5;56147:23;

Swarm Source

bzzr://590606406739dd1c71a5083187f4563207095773c469e460b371ac02ef05e783
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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