Source Code
Overview
POL Balance
0 POL
Token Holdings
More Info
ContractCreator
Multichain Info
N/A
Latest 8 from a total of 8 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 7026912 | 122 days ago | IN | 5 POL | 0.00003156 | ||||
Set Min Stake | 7026864 | 122 days ago | IN | 0 POL | 0.00004404 | ||||
Set Max Stake | 7026665 | 122 days ago | IN | 0 POL | 0.00005138 | ||||
Increase Hermes ... | 6823787 | 127 days ago | IN | 0 POL | 0.00006587 | ||||
Set Funds Destin... | 6744197 | 129 days ago | IN | 0 POL | 0.00004616 | ||||
Set Funds Destin... | 6709441 | 130 days ago | IN | 0 POL | 0.00007179 | ||||
Initialize | 6559637 | 134 days ago | IN | 0 POL | 0.00068622 | ||||
0x60806040 | 6198698 | 143 days ago | IN | 0 POL | 0.18776487 |
Loading...
Loading
Contract Name:
HermesImplementation
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.9; import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import { IUniswapV2Router } from "./interfaces/IUniswapV2Router.sol"; import { IERC20Token } from "./interfaces/IERC20Token.sol"; import { FundsRecovery } from "./FundsRecovery.sol"; import { Utils } from "./Utils.sol"; interface IdentityRegistry { function isRegistered(address _identity) external view returns (bool); function minimalHermesStake() external view returns (uint256); function getChannelAddress(address _identity, address _hermesId) external view returns (address); function getBeneficiary(address _identity) external view returns (address); function setBeneficiary(address _identity, address _newBeneficiary, bytes memory _signature) external; } // Hermes (channel balance provided by Herms, no staking/loans) contract HermesImplementation is FundsRecovery, Utils { using ECDSA for bytes32; string constant STAKE_RETURN_PREFIX = "Stake return request"; uint256 constant DELAY_SECONDS = 259200; // 3 days uint256 constant UNIT_SECONDS = 3600; // 1 unit = 1 hour = 3600 seconds uint16 constant PUNISHMENT_PERCENT = 4; // 0.04% IdentityRegistry internal registry; address internal operator; // TODO have master operator who could change operator or manage funds uint256 internal totalStake; // total amount staked by providers uint256 internal minStake; // minimal possible provider's stake (channel opening during promise settlement will use it) uint256 internal maxStake; // maximal allowed provider's stake uint256 internal hermesStake; // hermes stake is used to prove hermes' sustainability uint256 internal closingTimelock; // blocknumber after which getting stake back will become possible IUniswapV2Router internal dex; // any uniswap v2 compatible dex router address enum Status { Active, Paused, Punishment, Closed } // hermes states Status internal status; struct HermesFee { uint16 value; // subprocent amount. e.g. 2.5% = 250 uint64 validFrom; // timestamp from which fee is valid } HermesFee public lastFee; // default fee to look for HermesFee public previousFee; // previous fee is used if last fee is still not active // Our channel don't have balance, because we're always rebalancing into stake amount. struct Channel { uint256 settled; // total amount already settled by provider uint256 stake; // amount staked by identity to guarante channel size, it also serves as channel balance uint256 lastUsedNonce; // last known nonce, is used to protect signature based calls from replay attack uint256 timelock; // blocknumber after which channel balance can be decreased } mapping(bytes32 => Channel) public channels; struct Punishment { uint256 activationBlockTime; // block timestamp in which punishment was activated uint256 amount; // total amount of tokens locked because of punishment } Punishment public punishment; function getOperator() public view returns (address) { return operator; } function getChannelId(address _identity) public view returns (bytes32) { return keccak256(abi.encodePacked(_identity, address(this))); } function getChannelId(address _identity, string memory _type) public view returns (bytes32) { return keccak256(abi.encodePacked(_identity, address(this), _type)); } function getRegistry() public view returns (address) { return address(registry); } function getActiveFee() public view returns (uint256) { HermesFee memory _activeFee = (block.timestamp >= lastFee.validFrom) ? lastFee : previousFee; return uint256(_activeFee.value); } function getHermesStake() public view returns (uint256) { return hermesStake; } function getStakeThresholds() public view returns (uint256, uint256) { return (minStake, maxStake); } // Returns hermes state // Active - all operations are allowed. // Paused - no new channel openings. // Punishment - don't allow to open new channels, rebalance and withdraw funds. // Closed - no new channels, no rebalance, no stake increase. function getStatus() public view returns (Status) { return status; } event PromiseSettled(address indexed identity, bytes32 indexed channelId, address indexed beneficiary, uint256 amountSentToBeneficiary, uint256 fees, bytes32 lock); event NewStake(bytes32 indexed channelId, uint256 stakeAmount); event MinStakeValueUpdated(uint256 newMinStake); event MaxStakeValueUpdated(uint256 newMaxStake); event HermesFeeUpdated(uint16 newFee, uint64 validFrom); event HermesClosed(uint256 blockTimestamp); event ChannelOpeningPaused(); event ChannelOpeningActivated(); event FundsWithdrawned(uint256 amount, address beneficiary); event HermesStakeIncreased(uint256 newStake); event HermesPunishmentActivated(uint256 activationBlockTime); event HermesPunishmentDeactivated(); modifier onlyOperator() { require(msg.sender == operator, "Hermes: only hermes operator can call this function"); _; } /* ------------------------------------------- SETUP ------------------------------------------- */ // Because of proxy pattern this function is used insted of constructor. // Have to be called right after proxy deployment. function initialize(address _token, address _operator, uint16 _fee, uint256 _minStake, uint256 _maxStake, address payable _dexAddress) public virtual { require(!isInitialized(), "Hermes: have to be not initialized"); require(_token != address(0), "Hermes: token can't be deployd into zero address"); require(_operator != address(0), "Hermes: operator have to be set"); require(_fee <= 5000, "Hermes: fee can't be bigger than 50%"); require(_maxStake > _minStake, "Hermes: maxStake have to be bigger than minStake"); registry = IdentityRegistry(msg.sender); token = IERC20Token(_token); operator = _operator; lastFee = HermesFee(_fee, uint64(block.timestamp)); minStake = _minStake; maxStake = _maxStake; hermesStake = token.balanceOf(address(this)); // Approving all myst for dex, because MYST token's `transferFrom` is cheaper when there is approval of uint(-1) token.approve(_dexAddress, type(uint256).max); dex = IUniswapV2Router(_dexAddress); transferOwnership(_operator); } function isInitialized() public view returns (bool) { return operator != address(0); } /* -------------------------------------- MAIN FUNCTIONALITY ----------------------------------- */ // Open incoming payments (also known as provider) channel. Can be called only by Registry. function openChannel(address _identity, uint256 _amountToStake) public { require(msg.sender == address(registry), "Hermes: only registry can open channels"); require(getStatus() == Status.Active, "Hermes: have to be in active state"); require(_amountToStake >= minStake, "Hermes: min stake amount not reached"); _increaseStake(getChannelId(_identity), _amountToStake, false); } // Settle promise // _preimage is random number generated by receiver used in HTLC function _settlePromise( bytes32 _channelId, uint256 _amount, uint256 _transactorFee, bytes32 _preimage, bytes memory _signature, bool _takeFee, bool _ignoreStake ) private returns (uint256, uint256) { require( isHermesActive(), "Hermes: hermes have to be in active state" ); // if hermes is not active, then users can only take stake back require( validatePromise(_channelId, _amount, _transactorFee, _preimage, _signature), "Hermes: have to be properly signed payment promise" ); Channel storage _channel = channels[_channelId]; require(_channel.settled > 0 || _channel.stake >= minStake || _ignoreStake, "Hermes: not enough stake"); // If there are not enought funds to rebalance we have to enable punishment mode. uint256 _availableBalance = availableBalance(); if (_availableBalance < _channel.stake) { status = Status.Punishment; punishment.activationBlockTime = block.timestamp; emit HermesPunishmentActivated(block.timestamp); } // Calculate amount of tokens to be claimed. uint256 _unpaidAmount = _amount - _channel.settled; require(_unpaidAmount > _transactorFee, "Hermes: amount to settle should cover transactor fee"); // It is not allowed to settle more than maxStake / _channel.stake and than available balance. uint256 _maxSettlementAmount = max(maxStake, _channel.stake); if (_unpaidAmount > _availableBalance || _unpaidAmount > _maxSettlementAmount) { _unpaidAmount = min(_availableBalance, _maxSettlementAmount); } _channel.settled = _channel.settled + _unpaidAmount; // Increase already paid amount. uint256 _fees = _transactorFee + (_takeFee ? calculateHermesFee(_unpaidAmount) : 0); // Pay transactor fee if (_transactorFee > 0) { token.transfer(msg.sender, _transactorFee); } uint256 _amountToTransfer = _unpaidAmount -_fees; return (_amountToTransfer, _fees); } function settlePromise(address _identity, uint256 _amount, uint256 _transactorFee, bytes32 _preimage, bytes memory _signature) public { address _beneficiary = registry.getBeneficiary(_identity); require(_beneficiary != address(0), "Hermes: identity have to be registered, beneficiary have to be set"); // Settle promise and transfer calculated amount into beneficiary wallet bytes32 _channelId = getChannelId(_identity); (uint256 _amountToTransfer, uint256 _fees) = _settlePromise(_channelId, _amount, _transactorFee, _preimage, _signature, true, false); token.transfer(_beneficiary, _amountToTransfer); emit PromiseSettled(_identity, _channelId, _beneficiary, _amountToTransfer, _fees, _preimage); } function payAndSettle(address _identity, uint256 _amount, uint256 _transactorFee, bytes32 _preimage, bytes memory _signature, address _beneficiary, bytes memory _beneficiarySignature) public { bytes32 _channelId = getChannelId(_identity, "withdrawal"); // Validate beneficiary to be signed by identity and be attached to given promise address _signer = keccak256(abi.encodePacked(getChainID(), _channelId, _amount, _preimage, _beneficiary)).recover(_beneficiarySignature); require(_signer == _identity, "Hermes: payAndSettle request should be properly signed"); (uint256 _amountToTransfer, uint256 _fees) = _settlePromise(_channelId, _amount, _transactorFee, _preimage, _signature, false, true); token.transfer(_beneficiary, _amountToTransfer); emit PromiseSettled(_identity, _channelId, _beneficiary, _amountToTransfer, _fees, _preimage); } function settleWithBeneficiary(address _identity, uint256 _amount, uint256 _transactorFee, bytes32 _preimage, bytes memory _promiseSignature, address _newBeneficiary, bytes memory _beneficiarySignature) public { // Update beneficiary address registry.setBeneficiary(_identity, _newBeneficiary, _beneficiarySignature); // Settle promise and transfer calculated amount into beneficiary wallet bytes32 _channelId = getChannelId(_identity); (uint256 _amountToTransfer, uint256 _fees) = _settlePromise(_channelId, _amount, _transactorFee, _preimage, _promiseSignature, true, false); token.transfer(_newBeneficiary, _amountToTransfer); emit PromiseSettled(_identity, _channelId, _newBeneficiary, _amountToTransfer, _fees, _preimage); } function settleWithDEX(address _identity, uint256 _amount, uint256 _transactorFee, bytes32 _preimage, bytes memory _signature) public { address _beneficiary = registry.getBeneficiary(_identity); require(_beneficiary != address(0), "Hermes: identity have to be registered, beneficiary have to be set"); // Calculate amount to transfer and settle promise bytes32 _channelId = getChannelId(_identity); (uint256 _amountToTransfer, uint256 _fees) = _settlePromise(_channelId, _amount, _transactorFee, _preimage, _signature, true, false); // Transfer funds into beneficiary wallet via DEX uint amountOutMin = 0; address[] memory path = new address[](2); path[0] = address(token); path[1] = dex.WETH(); dex.swapExactTokensForETH(_amountToTransfer, amountOutMin, path, _beneficiary, block.timestamp); emit PromiseSettled(_identity, _channelId, _beneficiary, _amountToTransfer, _fees, _preimage); } /* -------------------------------------- STAKE MANAGEMENT -------------------------------------- */ function _increaseStake(bytes32 _channelId, uint256 _amountToAdd, bool _duringSettlement) internal { Channel storage _channel = channels[_channelId]; uint256 _newStakeAmount = _channel.stake +_amountToAdd; require(_newStakeAmount <= maxStake, "Hermes: total amount to stake can't be bigger than maximally allowed"); require(_newStakeAmount >= minStake, "Hermes: stake can't be less than required min stake"); // We don't transfer tokens during settlements, they already locked in hermes contract. if (!_duringSettlement) { require(token.transferFrom(msg.sender, address(this), _amountToAdd), "Hermes: token transfer should succeed"); } _channel.stake = _newStakeAmount; totalStake = totalStake + _amountToAdd; emit NewStake(_channelId, _newStakeAmount); } // Anyone can increase channel's capacity by staking more into hermes function increaseStake(bytes32 _channelId, uint256 _amount) public { require(getStatus() != Status.Closed, "hermes should be not closed"); _increaseStake(_channelId, _amount, false); } // Settlement which will increase channel stake instead of transfering funds into beneficiary wallet. function settleIntoStake(address _identity, uint256 _amount, uint256 _transactorFee, bytes32 _preimage, bytes memory _signature) public { bytes32 _channelId = getChannelId(_identity); (uint256 _stakeIncreaseAmount, uint256 _paidFees) = _settlePromise(_channelId, _amount, _transactorFee, _preimage, _signature, true, true); emit PromiseSettled(_identity, _channelId, address(this), _stakeIncreaseAmount, _paidFees, _preimage); _increaseStake(_channelId, _stakeIncreaseAmount, true); } // Withdraw part of stake. This will also decrease channel balance. function decreaseStake(address _identity, uint256 _amount, uint256 _transactorFee, bytes memory _signature) public { bytes32 _channelId = getChannelId(_identity); require(isChannelOpened(_channelId), "Hermes: channel has to be opened"); require(_amount >= _transactorFee, "Hermes: amount should be bigger than transactor fee"); Channel storage _channel = channels[_channelId]; require(_amount <= _channel.stake, "Hermes: can't withdraw more than the current stake"); // Verify signature _channel.lastUsedNonce = _channel.lastUsedNonce + 1; address _signer = keccak256(abi.encodePacked(STAKE_RETURN_PREFIX, getChainID(), _channelId, _amount, _transactorFee, _channel.lastUsedNonce)).recover(_signature); require(getChannelId(_signer) == _channelId, "Hermes: have to be signed by channel party"); uint256 _newStakeAmount = _channel.stake - _amount; require(_newStakeAmount == 0 || _newStakeAmount >= minStake, "Hermes: stake can't be less than required min stake"); // Update channel state _channel.stake = _newStakeAmount; totalStake = totalStake - _amount; // Pay transacor fee then withdraw the rest if (_transactorFee > 0) { token.transfer(msg.sender, _transactorFee); } address _beneficiary = registry.getBeneficiary(_identity); token.transfer(_beneficiary, _amount - _transactorFee); emit NewStake(_channelId, _newStakeAmount); } /* --------------------------------------------------------------------------------------------- */ // Hermes is in Emergency situation when its status is `Punishment`. function resolveEmergency() public { require(getStatus() == Status.Punishment, "Hermes: should be in punishment status"); // 0.04% of total channels amount per time unit uint256 _punishmentPerUnit = round(totalStake * PUNISHMENT_PERCENT, 100) / 100; // No punishment during first time unit uint256 _unit = getUnitTime(); uint256 _timePassed = block.timestamp - punishment.activationBlockTime; uint256 _punishmentUnits = round(_timePassed, _unit) / _unit - 1; uint256 _punishmentAmount = _punishmentUnits * _punishmentPerUnit; punishment.amount = punishment.amount + _punishmentAmount; // XXX alternativelly we could send tokens into BlackHole (0x0000000...) uint256 _shouldHave = minimalExpectedBalance() + maxStake; // hermes should have funds for at least one maxStake settlement uint256 _currentBalance = token.balanceOf(address(this)); // If there are not enough available funds, they have to be topuped from msg.sender. if (_currentBalance < _shouldHave) { token.transferFrom(msg.sender, address(this), _shouldHave - _currentBalance); } // Disable punishment mode status = Status.Active; emit HermesPunishmentDeactivated(); } function getUnitTime() internal pure virtual returns (uint256) { return UNIT_SECONDS; } function setMinStake(uint256 _newMinStake) public onlyOwner { require(isHermesActive(), "Hermes: has to be active"); require(_newMinStake < maxStake, "Hermes: minStake has to be smaller than maxStake"); minStake = _newMinStake; emit MinStakeValueUpdated(_newMinStake); } function setMaxStake(uint256 _newMaxStake) public onlyOwner { require(isHermesActive(), "Hermes: has to be active"); require(_newMaxStake > minStake, "Hermes: maxStake has to be bigger than minStake"); maxStake = _newMaxStake; emit MaxStakeValueUpdated(_newMaxStake); } function setHermesFee(uint16 _newFee) public onlyOwner { require(getStatus() != Status.Closed, "Hermes: should be not closed"); require(_newFee <= 5000, "Hermes: fee can't be bigger than 50%"); require(block.timestamp >= lastFee.validFrom, "Hermes: can't update inactive fee"); // New fee will start be valid after delay time will pass uint64 _validFrom = uint64(getTimelock()); previousFee = lastFee; lastFee = HermesFee(_newFee, _validFrom); emit HermesFeeUpdated(_newFee, _validFrom); } function increaseHermesStake(uint256 _additionalStake) public onlyOwner { if (availableBalance() < _additionalStake) { uint256 _diff = _additionalStake - availableBalance(); token.transferFrom(msg.sender, address(this), _diff); } hermesStake = hermesStake + _additionalStake; emit HermesStakeIncreased(hermesStake); } // Hermes's available funds withdrawal. Can be done only if hermes is not closed and not in punishment mode. // Hermes can't withdraw stake, locked in channel funds and funds lended to him. function withdraw(address _beneficiary, uint256 _amount) public onlyOwner { require(isHermesActive(), "Hermes: have to be active"); require(availableBalance() >= _amount, "Hermes: should be enough funds available to withdraw"); token.transfer(_beneficiary, _amount); emit FundsWithdrawned(_amount, _beneficiary); } // Returns funds amount not locked in any channel, not staked and not lended from providers. function availableBalance() public view returns (uint256) { uint256 _totalLockedAmount = minimalExpectedBalance(); uint256 _currentBalance = token.balanceOf(address(this)); if (_totalLockedAmount > _currentBalance) { return uint256(0); } return _currentBalance - _totalLockedAmount; } // Returns true if channel is opened. function isChannelOpened(bytes32 _channelId) public view returns (bool) { return channels[_channelId].settled != 0 || channels[_channelId].stake != 0; } // If Hermes is not closed and is not in punishment mode, he is active. function isHermesActive() public view returns (bool) { Status _status = getStatus(); return _status != Status.Punishment && _status != Status.Closed; } function pauseChannelOpening() public onlyOperator { require(getStatus() == Status.Active, "Hermes: have to be in active state"); status = Status.Paused; emit ChannelOpeningPaused(); } function activateChannelOpening() public onlyOperator { require(getStatus() == Status.Paused, "Hermes: have to be in paused state"); status = Status.Active; emit ChannelOpeningActivated(); } function closeHermes() public onlyOwner { require(isHermesActive(), "Hermes: should be active"); status = Status.Closed; closingTimelock = getEmergencyTimelock(); emit HermesClosed(block.timestamp); } function getStakeBack(address _beneficiary) public onlyOwner { require(getStatus() == Status.Closed, "Hermes: have to be closed"); require(block.timestamp > closingTimelock, "Hermes: timelock period should be already passed"); uint256 _amount = token.balanceOf(address(this)) - punishment.amount; token.transfer(_beneficiary, _amount); } /* ------------------------------------------ HELPERS ------------------------------------------ */ // Returns timestamp until which exit request should be locked function getTimelock() internal view virtual returns (uint256) { return block.timestamp + DELAY_SECONDS; } function calculateHermesFee(uint256 _amount) public view returns (uint256) { return round((_amount * getActiveFee() / 100), 100) / 100; } // Funds which always have to be holded in hermes smart contract. function minimalExpectedBalance() public view returns (uint256) { return max(hermesStake, punishment.amount) + totalStake; } function getEmergencyTimelock() internal view virtual returns (uint256) { return block.timestamp + DELAY_SECONDS * 100; // 300 days } function validatePromise(bytes32 _channelId, uint256 _amount, uint256 _transactorFee, bytes32 _preimage, bytes memory _signature) public view returns (bool) { bytes32 _hashlock = keccak256(abi.encodePacked(_preimage)); address _signer = keccak256(abi.encodePacked(getChainID(), _channelId, _amount, _transactorFee, _hashlock)).recover(_signature); return _signer == operator; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.9; import { IERC20Token } from "./interfaces/IERC20Token.sol"; import { Ownable } from "./Ownable.sol"; import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; contract FundsRecovery is Ownable, ReentrancyGuard { address payable internal fundsDestination; IERC20Token public token; event DestinationChanged(address indexed previousDestination, address indexed newDestination); /** * Setting new destination of funds recovery. */ function setFundsDestination(address payable _newDestination) public virtual onlyOwner { require(_newDestination != address(0)); emit DestinationChanged(fundsDestination, _newDestination); fundsDestination = _newDestination; } /** * Getting funds destination address. */ function getFundsDestination() public view returns (address) { return fundsDestination; } /** * Possibility to recover funds in case they were sent to this address before smart contract deployment */ function claimEthers() public nonReentrant { require(fundsDestination != address(0)); fundsDestination.transfer(address(this).balance); } /** Transfers selected tokens into owner address. */ function claimTokens(address _token) public nonReentrant { require(fundsDestination != address(0)); require(_token != address(token), "native token funds can't be recovered"); uint256 _amount = IERC20Token(_token).balanceOf(address(this)); IERC20Token(_token).transfer(fundsDestination, _amount); } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.9; contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == msg.sender || _owner == address(0x0), "Ownable: caller is not the owner"); _; } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.9; contract Utils { function getChainID() internal view returns (uint256) { uint256 chainID; assembly { chainID := chainid() } return chainID; } function max(uint a, uint b) internal pure returns (uint) { return a > b ? a : b; } function min(uint a, uint b) internal pure returns (uint) { return a < b ? a : b; } function round(uint a, uint m) internal pure returns (uint ) { return ((a + m - 1) / m) * m; } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.4; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; abstract contract IERC20Token is IERC20 { function upgrade(uint256 value) public virtual; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.4; interface IUniswapV2Router { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "london", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
[{"anonymous":false,"inputs":[],"name":"ChannelOpeningActivated","type":"event"},{"anonymous":false,"inputs":[],"name":"ChannelOpeningPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousDestination","type":"address"},{"indexed":true,"internalType":"address","name":"newDestination","type":"address"}],"name":"DestinationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"}],"name":"FundsWithdrawned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blockTimestamp","type":"uint256"}],"name":"HermesClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newFee","type":"uint16"},{"indexed":false,"internalType":"uint64","name":"validFrom","type":"uint64"}],"name":"HermesFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"activationBlockTime","type":"uint256"}],"name":"HermesPunishmentActivated","type":"event"},{"anonymous":false,"inputs":[],"name":"HermesPunishmentDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newStake","type":"uint256"}],"name":"HermesStakeIncreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxStake","type":"uint256"}],"name":"MaxStakeValueUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinStake","type":"uint256"}],"name":"MinStakeValueUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"channelId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"stakeAmount","type":"uint256"}],"name":"NewStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"identity","type":"address"},{"indexed":true,"internalType":"bytes32","name":"channelId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountSentToBeneficiary","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fees","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"lock","type":"bytes32"}],"name":"PromiseSettled","type":"event"},{"inputs":[],"name":"activateChannelOpening","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculateHermesFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"channels","outputs":[{"internalType":"uint256","name":"settled","type":"uint256"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"lastUsedNonce","type":"uint256"},{"internalType":"uint256","name":"timelock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimEthers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeHermes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"decreaseStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getActiveFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"string","name":"_type","type":"string"}],"name":"getChannelId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"}],"name":"getChannelId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundsDestination","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHermesStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"getStakeBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getStakeThresholds","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStatus","outputs":[{"internalType":"enum HermesImplementation.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_additionalStake","type":"uint256"}],"name":"increaseHermesStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_channelId","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"increaseStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"uint256","name":"_minStake","type":"uint256"},{"internalType":"uint256","name":"_maxStake","type":"uint256"},{"internalType":"address payable","name":"_dexAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_channelId","type":"bytes32"}],"name":"isChannelOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isHermesActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastFee","outputs":[{"internalType":"uint16","name":"value","type":"uint16"},{"internalType":"uint64","name":"validFrom","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimalExpectedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"uint256","name":"_amountToStake","type":"uint256"}],"name":"openChannel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseChannelOpening","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"bytes","name":"_beneficiarySignature","type":"bytes"}],"name":"payAndSettle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"previousFee","outputs":[{"internalType":"uint16","name":"value","type":"uint16"},{"internalType":"uint64","name":"validFrom","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"punishment","outputs":[{"internalType":"uint256","name":"activationBlockTime","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resolveEmergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newDestination","type":"address"}],"name":"setFundsDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newFee","type":"uint16"}],"name":"setHermesFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxStake","type":"uint256"}],"name":"setMaxStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMinStake","type":"uint256"}],"name":"setMinStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"settleIntoStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"settlePromise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"},{"internalType":"bytes","name":"_promiseSignature","type":"bytes"},{"internalType":"address","name":"_newBeneficiary","type":"address"},{"internalType":"bytes","name":"_beneficiarySignature","type":"bytes"}],"name":"settleWithBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"settleWithDEX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_channelId","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"validatePromise","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5060018055613fee806100246000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c80637295973a1161015c578063bc96a1e9116100ce578063eb295b2711610087578063eb295b27146105c0578063f2fde38b146105d3578063f3fef3a3146105e6578063f58c5b6e146105f9578063fbb46b981461060a578063fc0c546a1461061257600080fd5b8063bc96a1e91461055a578063df8de3e714610562578063e1791b2d14610575578063e1c6648714610588578063e58473f2146105a7578063e7f43c68146105af57600080fd5b806394c7915d1161012057806394c7915d146104e35780639801134e146104eb5780639ed9903e1461052c578063aa606dee14610537578063ab2f0e511461053f578063ae10ed841461054757600080fd5b80637295973a1461044f5780637a7ebd7b146104625780638c80fd90146104b75780638d886fac146104ca5780638da5cb5b146104d257600080fd5b80634e69d560116101f55780636931b550116101b95780636931b550146103e8578063699a0885146103f05780636e9094ea146104035780636fc148371461041657806370603a7f1461042957806371d2ff1b1461043c57600080fd5b80634e69d5601461037057806352a8e78d1461038a57806353d2a0ff1461039d5780635ab1bd53146103b05780636138dda7146103d557600080fd5b806324f453d11161024757806324f453d1146102fd578063306db49b1461031057806338df102414610318578063392e53cd1461032b57806339f976261461034a57806348d9f01e1461035d57600080fd5b806302062d12146102845780630684cd201461029957806315c73afd146102c15780631f4f12c6146102c9578063238e130a146102ea575b600080fd5b610297610292366004613729565b610625565b005b600f546010546102a7919082565b604080519283526020830191909152015b60405180910390f35b6102976108cd565b6102dc6102d7366004613795565b610b5a565b6040519081526020016102b8565b6102976102f83660046137ae565b610b8f565b61029761030b3660046137cb565b610c3c565b6009546102dc565b61029761032636600461380e565b610d59565b6005546001600160a01b031615155b60405190151581526020016102b8565b610297610358366004613829565b610f41565b61029761036b366004613729565b610fbb565b600b54600160a01b900460ff166040516102b89190613861565b610297610398366004613889565b61115b565b6102976103ab366004613889565b61134d565b6004546001600160a01b03165b6040516001600160a01b0390911681526020016102b8565b6102976103e33660046137ae565b6114a8565b6102976116d1565b6102976103fe366004613930565b61177e565b61033a610411366004613795565b611ae2565b610297610424366004613795565b611b11565b61033a61043736600461399e565b611c43565b61029761044a366004613729565b611cc9565b61029761045d3660046139e8565b611d42565b610497610470366004613795565b600e6020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102b8565b6102976104c5366004613795565b612199565b6102dc6122c5565b6000546001600160a01b03166103bd565b6102dc612320565b600c5461050a9061ffff8116906201000090046001600160401b031682565b6040805161ffff90931683526001600160401b039091166020830152016102b8565b6007546008546102a7565b610297612345565b6102dc6123ea565b610297610555366004613795565b61249a565b61033a6125cc565b6102976105703660046137ae565b61261f565b6102dc610583366004613a4a565b612802565b600d5461050a9061ffff8116906201000090046001600160401b031682565b610297612837565b6005546001600160a01b03166103bd565b6102dc6105ce3660046137ae565b61291c565b6102976105e13660046137ae565b612965565b6102976105f43660046137cb565b612a63565b6002546001600160a01b03166103bd565b610297612c2c565b6003546103bd906001600160a01b031681565b6004805460405163505a1b3160e01b81526001600160a01b03888116938201939093526000929091169063505a1b319060240160206040518083038186803b15801561067057600080fd5b505afa158015610684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a89190613aad565b90506001600160a01b0381166106d95760405162461bcd60e51b81526004016106d090613aca565b60405180910390fd5b60006106e48761291c565b90506000806106fa838989898960016000612d06565b604080516002808252606082018352939550919350600092839291602083019080368337505060035482519293506001600160a01b03169183915060009061074457610744613b32565b6001600160a01b03928316602091820292909201810191909152600b54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561079857600080fd5b505afa1580156107ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d09190613aad565b816001815181106107e3576107e3613b32565b6001600160a01b039283166020918202929092010152600b546040516318cbafe560e01b81529116906318cbafe590610828908790869086908c904290600401613b48565b600060405180830381600087803b15801561084257600080fd5b505af1158015610856573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261087e9190810190613bb9565b5060408051858152602081018590529081018990526001600160a01b038088169187918e1690600080516020613f99833981519152906060015b60405180910390a45050505050505050505050565b6002600b54600160a01b900460ff1660038111156108ed576108ed61384b565b146109495760405162461bcd60e51b815260206004820152602660248201527f4865726d65733a2073686f756c6420626520696e2070756e6973686d656e742060448201526573746174757360d01b60648201526084016106d0565b6000606461096a600461ffff166006546109639190613c74565b606461305e565b6109749190613c93565b600f54909150610e109060009061098b9042613cb5565b9050600060018361099c848661305e565b6109a69190613c93565b6109b09190613cb5565b905060006109be8583613c74565b6010549091506109cf908290613ccc565b6010556008546000906109e0612320565b6109ea9190613ccc565b6003546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b158015610a3357600080fd5b505afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190613ce4565b905081811015610b1b576003546001600160a01b03166323b872dd3330610a928587613cb5565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b158015610ae157600080fd5b505af1158015610af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b199190613cfd565b505b600b805460ff60a01b191690556040517f5dc43dfad9aedde473e812a66ff033b91a2b1ee060e7dc0746a1a14a4a3bd47c90600090a150505050505050565b60006064610b7f6064610b6b6122c5565b610b759086613c74565b6109639190613c93565b610b899190613c93565b92915050565b6000546001600160a01b0316331480610bb157506000546001600160a01b0316155b610bcd5760405162461bcd60e51b81526004016106d090613d1f565b6001600160a01b038116610be057600080fd5b6002546040516001600160a01b038084169216907fe1a66d77649cf0a57b9937073549f30f1c82bb865aaf066d2f299e37a62c6aad90600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b03163314610ca65760405162461bcd60e51b815260206004820152602760248201527f4865726d65733a206f6e6c792072656769737472792063616e206f70656e206360448201526668616e6e656c7360c81b60648201526084016106d0565b6000600b54600160a01b900460ff166003811115610cc657610cc661384b565b14610ce35760405162461bcd60e51b81526004016106d090613d54565b600754811015610d415760405162461bcd60e51b8152602060048201526024808201527f4865726d65733a206d696e207374616b6520616d6f756e74206e6f742072656160448201526318da195960e21b60648201526084016106d0565b610d55610d4d8361291c565b826000613093565b5050565b6000546001600160a01b0316331480610d7b57506000546001600160a01b0316155b610d975760405162461bcd60e51b81526004016106d090613d1f565b6003600b54600160a01b900460ff166003811115610db757610db761384b565b1415610e055760405162461bcd60e51b815260206004820152601c60248201527f4865726d65733a2073686f756c64206265206e6f7420636c6f7365640000000060448201526064016106d0565b6113888161ffff161115610e2b5760405162461bcd60e51b81526004016106d090613d96565b600c546201000090046001600160401b0316421015610e965760405162461bcd60e51b815260206004820152602160248201527f4865726d65733a2063616e27742075706461746520696e6163746976652066656044820152606560f81b60648201526084016106d0565b6000610ea061329b565b600c8054600d80546001600160401b03620100008085048216810269ffffffffffffffffffff1993841661ffff8088169190911791909117909455604080518082018252948a168086529288166020958601819052918202939095168217929092179094558251938452908301529192507fea76eb91f1817e0757719ea43e0733faf6f1121425bde387d1dd91badb9d403b91015b60405180910390a15050565b6003600b54600160a01b900460ff166003811115610f6157610f6161384b565b1415610faf5760405162461bcd60e51b815260206004820152601b60248201527f6865726d65732073686f756c64206265206e6f7420636c6f736564000000000060448201526064016106d0565b610d5582826000613093565b6004805460405163505a1b3160e01b81526001600160a01b03888116938201939093526000929091169063505a1b319060240160206040518083038186803b15801561100657600080fd5b505afa15801561101a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103e9190613aad565b90506001600160a01b0381166110665760405162461bcd60e51b81526004016106d090613aca565b60006110718761291c565b9050600080611087838989898960016000612d06565b60035460405163a9059cbb60e01b81529294509092506001600160a01b03169063a9059cbb906110bd9087908690600401613dda565b602060405180830381600087803b1580156110d757600080fd5b505af11580156110eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110f9190613cfd565b5060408051838152602081018390529081018790526001600160a01b038086169185918c1690600080516020613f998339815191529060600160405180910390a4505050505050505050565b6000611189886040518060400160405280600a8152602001691dda5d1a191c985dd85b60b21b815250612802565b905060006111f18346604080516020810192909252810185905260608082018c9052608082018a905287901b6bffffffffffffffffffffffff191660a082015260b4015b604051602081830303815290604052805190602001206132aa90919063ffffffff16565b9050886001600160a01b0316816001600160a01b0316146112735760405162461bcd60e51b815260206004820152603660248201527f4865726d65733a20706179416e64536574746c6520726571756573742073686f6044820152751d5b19081899481c1c9bdc195c9b1e481cda59db995960521b60648201526084016106d0565b600080611287848b8b8b8b60006001612d06565b60035460405163a9059cbb60e01b81529294509092506001600160a01b03169063a9059cbb906112bd9089908690600401613dda565b602060405180830381600087803b1580156112d757600080fd5b505af11580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190613cfd565b5060408051838152602081018390529081018990526001600160a01b038088169186918e1690600080516020613f99833981519152906060016108b8565b6004805460405163d0171d7960e01b81526001600160a01b039091169163d0171d7991611380918b918791879101613e23565b600060405180830381600087803b15801561139a57600080fd5b505af11580156113ae573d6000803e3d6000fd5b5050505060006113bd8861291c565b90506000806113d3838a8a8a8a60016000612d06565b60035460405163a9059cbb60e01b81529294509092506001600160a01b03169063a9059cbb906114099088908690600401613dda565b602060405180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145b9190613cfd565b5060408051838152602081018390529081018890526001600160a01b038087169185918d1690600080516020613f998339815191529060600160405180910390a450505050505050505050565b6000546001600160a01b03163314806114ca57506000546001600160a01b0316155b6114e65760405162461bcd60e51b81526004016106d090613d1f565b6003600b54600160a01b900460ff1660038111156115065761150661384b565b146115535760405162461bcd60e51b815260206004820152601960248201527f4865726d65733a206861766520746f20626520636c6f7365640000000000000060448201526064016106d0565b600a5442116115bd5760405162461bcd60e51b815260206004820152603060248201527f4865726d65733a2074696d656c6f636b20706572696f642073686f756c64206260448201526f1948185b1c9958591e481c185cdcd95960821b60648201526084016106d0565b6010546003546040516370a0823160e01b8152306004820152600092916001600160a01b0316906370a082319060240160206040518083038186803b15801561160557600080fd5b505afa158015611619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163d9190613ce4565b6116479190613cb5565b60035460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb9061167a9085908590600401613dda565b602060405180830381600087803b15801561169457600080fd5b505af11580156116a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cc9190613cfd565b505050565b600260015414156117245760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106d0565b60026001819055546001600160a01b031661173e57600080fd5b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611777573d6000803e3d6000fd5b5060018055565b6005546001600160a01b0316156117e25760405162461bcd60e51b815260206004820152602260248201527f4865726d65733a206861766520746f206265206e6f7420696e697469616c697a604482015261195960f21b60648201526084016106d0565b6001600160a01b0386166118515760405162461bcd60e51b815260206004820152603060248201527f4865726d65733a20746f6b656e2063616e2774206265206465706c6f7964206960448201526f6e746f207a65726f206164647265737360801b60648201526084016106d0565b6001600160a01b0385166118a75760405162461bcd60e51b815260206004820152601f60248201527f4865726d65733a206f70657261746f72206861766520746f206265207365740060448201526064016106d0565b6113888461ffff1611156118cd5760405162461bcd60e51b81526004016106d090613d96565b8282116119355760405162461bcd60e51b815260206004820152603060248201527f4865726d65733a206d61785374616b65206861766520746f206265206269676760448201526f6572207468616e206d696e5374616b6560801b60648201526084016106d0565b60048054336001600160a01b03199182161782556003805482166001600160a01b038a8116918217909255600580549093169189169190911790915560408051808201825261ffff8816808252426001600160401b03166020909201829052600c805469ffffffffffffffffffff19169091176201000090920291909117905560078690556008859055516370a0823160e01b81523092810192909252906370a082319060240160206040518083038186803b1580156119f457600080fd5b505afa158015611a08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2c9190613ce4565b60095560035460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390611a6390849060001990600401613dda565b602060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab59190613cfd565b50600b80546001600160a01b0319166001600160a01b038316179055611ada85612965565b505050505050565b6000818152600e6020526040812054151580610b895750506000908152600e6020526040902060010154151590565b6000546001600160a01b0316331480611b3357506000546001600160a01b0316155b611b4f5760405162461bcd60e51b81526004016106d090613d1f565b611b576125cc565b611b9e5760405162461bcd60e51b81526020600482015260186024820152774865726d65733a2068617320746f2062652061637469766560401b60448201526064016106d0565b6007548111611c075760405162461bcd60e51b815260206004820152602f60248201527f4865726d65733a206d61785374616b652068617320746f20626520626967676560448201526e72207468616e206d696e5374616b6560881b60648201526084016106d0565b60088190556040518181527f53f4fb18cb329155d5af04681c1d0846d0484d7de33791619c6988ca61910e3d906020015b60405180910390a150565b60008083604051602001611c5991815260200190565b6040516020818303038152906040528051906020012090506000611cac84611c7e4690565b60408051602081019290925281018b9052606081018a90526080810189905260a0810185905260c0016111cd565b6005546001600160a01b0390811691161498975050505050505050565b6000611cd48661291c565b9050600080611ce98388888888600180612d06565b60408051838152602081018390529081018890529193509150309084906001600160a01b038b1690600080516020613f998339815191529060600160405180910390a4611d3883836001613093565b5050505050505050565b6000611d4d8561291c565b9050611d5881611ae2565b611da45760405162461bcd60e51b815260206004820181905260248201527f4865726d65733a206368616e6e656c2068617320746f206265206f70656e656460448201526064016106d0565b82841015611e105760405162461bcd60e51b815260206004820152603360248201527f4865726d65733a20616d6f756e742073686f756c6420626520626967676572206044820152727468616e207472616e736163746f722066656560681b60648201526084016106d0565b6000818152600e602052604090206001810154851115611e8d5760405162461bcd60e51b815260206004820152603260248201527f4865726d65733a2063616e2774207769746864726177206d6f7265207468616e604482015271207468652063757272656e74207374616b6560701b60648201526084016106d0565b6002810154611e9d906001613ccc565b600282015560408051808201909152601481527314dd185ad9481c995d1d5c9b881c995c5d595cdd60621b6020820152600090611ef39085904660028601546040516111cd93929189918d918d91602001613e70565b905082611eff8261291c565b14611f5f5760405162461bcd60e51b815260206004820152602a60248201527f4865726d65733a206861766520746f206265207369676e6564206279206368616044820152696e6e656c20706172747960b01b60648201526084016106d0565b6000868360010154611f719190613cb5565b9050801580611f8257506007548110155b611f9e5760405162461bcd60e51b81526004016106d090613eac565b60018301819055600654611fb3908890613cb5565b60065585156120425760035460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611fee9033908a90600401613dda565b602060405180830381600087803b15801561200857600080fd5b505af115801561201c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120409190613cfd565b505b6004805460405163505a1b3160e01b81526001600160a01b038b8116938201939093526000929091169063505a1b319060240160206040518083038186803b15801561208d57600080fd5b505afa1580156120a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c59190613aad565b6003549091506001600160a01b031663a9059cbb826120e48a8c613cb5565b6040518363ffffffff1660e01b8152600401612101929190613dda565b602060405180830381600087803b15801561211b57600080fd5b505af115801561212f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121539190613cfd565b50847fc5f0715c45dab2e8f14871936119e3c64fd5841d397130c2d1db743d142522cb8360405161218691815260200190565b60405180910390a2505050505050505050565b6000546001600160a01b03163314806121bb57506000546001600160a01b0316155b6121d75760405162461bcd60e51b81526004016106d090613d1f565b6121df6125cc565b6122265760405162461bcd60e51b81526020600482015260186024820152774865726d65733a2068617320746f2062652061637469766560401b60448201526064016106d0565b60085481106122905760405162461bcd60e51b815260206004820152603060248201527f4865726d65733a206d696e5374616b652068617320746f20626520736d616c6c60448201526f6572207468616e206d61785374616b6560801b60648201526084016106d0565b60078190556040518181527fb9e5e6e8db1283ee860f3856d8383e40665c58a5264ede5e6ed8ec1afb03125190602001611c38565b600c5460009081906201000090046001600160401b03164210156122ea57600d6122ed565b600c5b60408051808201909152905461ffff8116808352620100009091046001600160401b031660209092019190915292915050565b6000600654612336600954600f600101546132ce565b6123409190613ccc565b905090565b6005546001600160a01b0316331461236f5760405162461bcd60e51b81526004016106d090613eff565b6000600b54600160a01b900460ff16600381111561238f5761238f61384b565b146123ac5760405162461bcd60e51b81526004016106d090613d54565b600b805460ff60a01b1916600160a01b1790556040517f1f4cd5d6edef8a0c4dbe6d547fdc42e0f3575167257553271f2366f9d497f67e90600090a1565b6000806123f5612320565b6003546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561243e57600080fd5b505afa158015612452573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124769190613ce4565b9050808211156124895760009250505090565b6124938282613cb5565b9250505090565b6000546001600160a01b03163314806124bc57506000546001600160a01b0316155b6124d85760405162461bcd60e51b81526004016106d090613d1f565b806124e16123ea565b10156125895760006124f16123ea565b6124fb9083613cb5565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390529192506001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561254e57600080fd5b505af1158015612562573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125869190613cfd565b50505b806009546125979190613ccc565b60098190556040519081527feb10b8b69c3eb290299237eaee4760bf1c02734ce3dc7740d6f2017b5ca3ed9190602001611c38565b6000806125e3600b5460ff600160a01b9091041690565b905060028160038111156125f9576125f961384b565b14158015612619575060038160038111156126165761261661384b565b14155b91505090565b600260015414156126725760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106d0565b60026001819055546001600160a01b031661268c57600080fd5b6003546001600160a01b03828116911614156126f85760405162461bcd60e51b815260206004820152602560248201527f6e617469766520746f6b656e2066756e64732063616e2774206265207265636f6044820152641d995c995960da1b60648201526084016106d0565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561273a57600080fd5b505afa15801561274e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127729190613ce4565b60025460405163a9059cbb60e01b81529192506001600160a01b038085169263a9059cbb926127a79216908590600401613dda565b602060405180830381600087803b1580156127c157600080fd5b505af11580156127d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f99190613cfd565b50506001805550565b600082308360405160200161281993929190613f52565b60405160208183030381529060405280519060200120905092915050565b6000546001600160a01b031633148061285957506000546001600160a01b0316155b6128755760405162461bcd60e51b81526004016106d090613d1f565b61287d6125cc565b6128c95760405162461bcd60e51b815260206004820152601860248201527f4865726d65733a2073686f756c6420626520616374697665000000000000000060448201526064016106d0565b600b805460ff60a01b1916600360a01b1790556128e46132e4565b600a556040514281527ffa9b0c2718819d67ceaec4f97d36185c2f1d22bdc5ff18f44c52cd56a5dd8e459060200160405180910390a1565b6040516bffffffffffffffffffffffff19606083811b8216602084015230901b166034820152600090604801604051602081830303815290604052805190602001209050919050565b6000546001600160a01b031633148061298757506000546001600160a01b0316155b6129a35760405162461bcd60e51b81526004016106d090613d1f565b6001600160a01b038116612a085760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106d0565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331480612a8557506000546001600160a01b0316155b612aa15760405162461bcd60e51b81526004016106d090613d1f565b612aa96125cc565b612af55760405162461bcd60e51b815260206004820152601960248201527f4865726d65733a206861766520746f206265206163746976650000000000000060448201526064016106d0565b80612afe6123ea565b1015612b695760405162461bcd60e51b815260206004820152603460248201527f4865726d65733a2073686f756c6420626520656e6f7567682066756e647320616044820152737661696c61626c6520746f20776974686472617760601b60648201526084016106d0565b60035460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612b9b9085908590600401613dda565b602060405180830381600087803b158015612bb557600080fd5b505af1158015612bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bed9190613cfd565b50604080518281526001600160a01b03841660208201527fa2e147ce2b7cb83d9c07e397bb806f23dd42c42e86ea45e1611d6e50eb1ec8bf9101610f35565b6005546001600160a01b03163314612c565760405162461bcd60e51b81526004016106d090613eff565b6001600b54600160a01b900460ff166003811115612c7657612c7661384b565b14612cce5760405162461bcd60e51b815260206004820152602260248201527f4865726d65733a206861766520746f20626520696e2070617573656420737461604482015261746560f01b60648201526084016106d0565b600b805460ff60a01b191690556040517f2d8b6ec230798e206d536342a28b7b61cc8fcfafb1d27c11c5519b3c42eb7df890600090a1565b600080612d116125cc565b612d6f5760405162461bcd60e51b815260206004820152602960248201527f4865726d65733a206865726d6573206861766520746f20626520696e2061637460448201526869766520737461746560b81b60648201526084016106d0565b612d7c8989898989611c43565b612de35760405162461bcd60e51b815260206004820152603260248201527f4865726d65733a206861766520746f2062652070726f7065726c79207369676e6044820152716564207061796d656e742070726f6d69736560701b60648201526084016106d0565b6000898152600e602052604090208054151580612e065750600754816001015410155b80612e0e5750835b612e5a5760405162461bcd60e51b815260206004820152601860248201527f4865726d65733a206e6f7420656e6f756768207374616b65000000000000000060448201526064016106d0565b6000612e646123ea565b90508160010154811015612ebe57600b805460ff60a01b1916600160a11b17905542600f81905560408051918252517f23dc47ee5d995fb521fbe4351f353f3177d7b9d9e15bdd01ed358764c25d96299181900360200190a15b8154600090612ecd908c613cb5565b9050898111612f3b5760405162461bcd60e51b815260206004820152603460248201527f4865726d65733a20616d6f756e7420746f20736574746c652073686f756c6420604482015273636f766572207472616e736163746f722066656560601b60648201526084016106d0565b6000612f4d60085485600101546132ce565b905082821180612f5c57508082115b15612f6e57612f6b83826132fe565b91505b8354612f7b908390613ccc565b8455600088612f8b576000612f94565b612f9483610b5a565b612f9e908d613ccc565b90508b1561303d57600360009054906101000a90046001600160a01b03166001600160a01b031663a9059cbb338e6040518363ffffffff1660e01b8152600401612fe9929190613dda565b602060405180830381600087803b15801561300357600080fd5b505af1158015613017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303b9190613cfd565b505b60006130498285613cb5565b9f919e50909c50505050505050505050505050565b60008180600161306e8287613ccc565b6130789190613cb5565b6130829190613c93565b61308c9190613c74565b9392505050565b6000838152600e6020526040812060018101549091906130b4908590613ccc565b905060085481111561313c5760405162461bcd60e51b8152602060048201526044602482018190527f4865726d65733a20746f74616c20616d6f756e7420746f207374616b65206361908201527f6e277420626520626967676572207468616e206d6178696d616c6c7920616c6c6064820152631bddd95960e21b608482015260a4016106d0565b60075481101561315e5760405162461bcd60e51b81526004016106d090613eac565b82613247576003546040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b03909116906323b872dd90606401602060405180830381600087803b1580156131b557600080fd5b505af11580156131c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ed9190613cfd565b6132475760405162461bcd60e51b815260206004820152602560248201527f4865726d65733a20746f6b656e207472616e736665722073686f756c6420737560448201526418d8d9595960da1b60648201526084016106d0565b6001820181905560065461325c908590613ccc565b60065560405181815285907fc5f0715c45dab2e8f14871936119e3c64fd5841d397130c2d1db743d142522cb9060200160405180910390a25050505050565b60006123406203f48042613ccc565b60008060006132b9858561330d565b915091506132c68161337d565b509392505050565b60008183116132dd578161308c565b5090919050565b60006132f46203f4806064613c74565b6123409042613ccc565b60008183106132dd578161308c565b6000808251604114156133445760208301516040840151606085015160001a6133388782858561353b565b94509450505050613376565b82516040141561336e5760208301516040840151613363868383613628565b935093505050613376565b506000905060025b9250929050565b60008160048111156133915761339161384b565b141561339a5750565b60018160048111156133ae576133ae61384b565b14156133fc5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106d0565b60028160048111156134105761341061384b565b141561345e5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106d0565b60038160048111156134725761347261384b565b14156134cb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106d0565b60048160048111156134df576134df61384b565b14156135385760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106d0565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613572575060009050600361361f565b8460ff16601b1415801561358a57508460ff16601c14155b1561359b575060009050600461361f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156135ef573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166136185760006001925092505061361f565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016136498782888561353b565b935093505050935093915050565b6001600160a01b038116811461353857600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156136aa576136aa61366c565b604052919050565b60006001600160401b038311156136cb576136cb61366c565b6136de601f8401601f1916602001613682565b90508281528383830111156136f257600080fd5b828260208301376000602084830101529392505050565b600082601f83011261371a57600080fd5b61308c838335602085016136b2565b600080600080600060a0868803121561374157600080fd5b853561374c81613657565b945060208601359350604086013592506060860135915060808601356001600160401b0381111561377c57600080fd5b61378888828901613709565b9150509295509295909350565b6000602082840312156137a757600080fd5b5035919050565b6000602082840312156137c057600080fd5b813561308c81613657565b600080604083850312156137de57600080fd5b82356137e981613657565b946020939093013593505050565b803561ffff8116811461380957600080fd5b919050565b60006020828403121561382057600080fd5b61308c826137f7565b6000806040838503121561383c57600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b602081016004831061388357634e487b7160e01b600052602160045260246000fd5b91905290565b600080600080600080600060e0888a0312156138a457600080fd5b87356138af81613657565b965060208801359550604088013594506060880135935060808801356001600160401b03808211156138e057600080fd5b6138ec8b838c01613709565b945060a08a013591506138fe82613657565b90925060c0890135908082111561391457600080fd5b506139218a828b01613709565b91505092959891949750929550565b60008060008060008060c0878903121561394957600080fd5b863561395481613657565b9550602087013561396481613657565b9450613972604088016137f7565b9350606087013592506080870135915060a087013561399081613657565b809150509295509295509295565b600080600080600060a086880312156139b657600080fd5b8535945060208601359350604086013592506060860135915060808601356001600160401b0381111561377c57600080fd5b600080600080608085870312156139fe57600080fd5b8435613a0981613657565b9350602085013592506040850135915060608501356001600160401b03811115613a3257600080fd5b613a3e87828801613709565b91505092959194509250565b60008060408385031215613a5d57600080fd5b8235613a6881613657565b915060208301356001600160401b03811115613a8357600080fd5b8301601f81018513613a9457600080fd5b613aa3858235602084016136b2565b9150509250929050565b600060208284031215613abf57600080fd5b815161308c81613657565b60208082526042908201527f4865726d65733a206964656e74697479206861766520746f206265207265676960408201527f7374657265642c2062656e6566696369617279206861766520746f2062652073606082015261195d60f21b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b985784516001600160a01b031683529383019391830191600101613b73565b50506001600160a01b03969096166060850152505050608001529392505050565b60006020808385031215613bcc57600080fd5b82516001600160401b0380821115613be357600080fd5b818501915085601f830112613bf757600080fd5b815181811115613c0957613c0961366c565b8060051b9150613c1a848301613682565b8181529183018401918481019088841115613c3457600080fd5b938501935b83851015613c5257845182529385019390850190613c39565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613c8e57613c8e613c5e565b500290565b600082613cb057634e487b7160e01b600052601260045260246000fd5b500490565b600082821015613cc757613cc7613c5e565b500390565b60008219821115613cdf57613cdf613c5e565b500190565b600060208284031215613cf657600080fd5b5051919050565b600060208284031215613d0f57600080fd5b8151801515811461308c57600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f4865726d65733a206861766520746f20626520696e2061637469766520737461604082015261746560f01b606082015260800190565b60208082526024908201527f4865726d65733a206665652063616e277420626520626967676572207468616e6040820152632035302560e01b606082015260800190565b6001600160a01b03929092168252602082015260400190565b60005b83811015613e0e578181015183820152602001613df6565b83811115613e1d576000848401525b50505050565b600060018060a01b038086168352808516602084015250606060408301528251806060840152613e5a816080850160208701613df3565b601f01601f191691909101608001949350505050565b60008751613e82818460208c01613df3565b9190910195865250602085019390935260408401919091526060830152608082015260a001919050565b60208082526033908201527f4865726d65733a207374616b652063616e2774206265206c657373207468616e604082015272207265717569726564206d696e207374616b6560681b606082015260800190565b60208082526033908201527f4865726d65733a206f6e6c79206865726d6573206f70657261746f722063616e6040820152721031b0b636103a3434b990333ab731ba34b7b760691b606082015260800190565b60006bffffffffffffffffffffffff19808660601b168352808560601b166014840152508251613f89816028850160208701613df3565b9190910160280194935050505056febe62ac0eb86179a8bcebe2f194ee1a147982a61a2ee67ff7e70b3fad25ec16d7a264697066735822122090aba2fc18c82091cd1bb5c63d63843b27d8aedf7fda2c3b28c60b34f9dd31c964736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061027f5760003560e01c80637295973a1161015c578063bc96a1e9116100ce578063eb295b2711610087578063eb295b27146105c0578063f2fde38b146105d3578063f3fef3a3146105e6578063f58c5b6e146105f9578063fbb46b981461060a578063fc0c546a1461061257600080fd5b8063bc96a1e91461055a578063df8de3e714610562578063e1791b2d14610575578063e1c6648714610588578063e58473f2146105a7578063e7f43c68146105af57600080fd5b806394c7915d1161012057806394c7915d146104e35780639801134e146104eb5780639ed9903e1461052c578063aa606dee14610537578063ab2f0e511461053f578063ae10ed841461054757600080fd5b80637295973a1461044f5780637a7ebd7b146104625780638c80fd90146104b75780638d886fac146104ca5780638da5cb5b146104d257600080fd5b80634e69d560116101f55780636931b550116101b95780636931b550146103e8578063699a0885146103f05780636e9094ea146104035780636fc148371461041657806370603a7f1461042957806371d2ff1b1461043c57600080fd5b80634e69d5601461037057806352a8e78d1461038a57806353d2a0ff1461039d5780635ab1bd53146103b05780636138dda7146103d557600080fd5b806324f453d11161024757806324f453d1146102fd578063306db49b1461031057806338df102414610318578063392e53cd1461032b57806339f976261461034a57806348d9f01e1461035d57600080fd5b806302062d12146102845780630684cd201461029957806315c73afd146102c15780631f4f12c6146102c9578063238e130a146102ea575b600080fd5b610297610292366004613729565b610625565b005b600f546010546102a7919082565b604080519283526020830191909152015b60405180910390f35b6102976108cd565b6102dc6102d7366004613795565b610b5a565b6040519081526020016102b8565b6102976102f83660046137ae565b610b8f565b61029761030b3660046137cb565b610c3c565b6009546102dc565b61029761032636600461380e565b610d59565b6005546001600160a01b031615155b60405190151581526020016102b8565b610297610358366004613829565b610f41565b61029761036b366004613729565b610fbb565b600b54600160a01b900460ff166040516102b89190613861565b610297610398366004613889565b61115b565b6102976103ab366004613889565b61134d565b6004546001600160a01b03165b6040516001600160a01b0390911681526020016102b8565b6102976103e33660046137ae565b6114a8565b6102976116d1565b6102976103fe366004613930565b61177e565b61033a610411366004613795565b611ae2565b610297610424366004613795565b611b11565b61033a61043736600461399e565b611c43565b61029761044a366004613729565b611cc9565b61029761045d3660046139e8565b611d42565b610497610470366004613795565b600e6020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102b8565b6102976104c5366004613795565b612199565b6102dc6122c5565b6000546001600160a01b03166103bd565b6102dc612320565b600c5461050a9061ffff8116906201000090046001600160401b031682565b6040805161ffff90931683526001600160401b039091166020830152016102b8565b6007546008546102a7565b610297612345565b6102dc6123ea565b610297610555366004613795565b61249a565b61033a6125cc565b6102976105703660046137ae565b61261f565b6102dc610583366004613a4a565b612802565b600d5461050a9061ffff8116906201000090046001600160401b031682565b610297612837565b6005546001600160a01b03166103bd565b6102dc6105ce3660046137ae565b61291c565b6102976105e13660046137ae565b612965565b6102976105f43660046137cb565b612a63565b6002546001600160a01b03166103bd565b610297612c2c565b6003546103bd906001600160a01b031681565b6004805460405163505a1b3160e01b81526001600160a01b03888116938201939093526000929091169063505a1b319060240160206040518083038186803b15801561067057600080fd5b505afa158015610684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a89190613aad565b90506001600160a01b0381166106d95760405162461bcd60e51b81526004016106d090613aca565b60405180910390fd5b60006106e48761291c565b90506000806106fa838989898960016000612d06565b604080516002808252606082018352939550919350600092839291602083019080368337505060035482519293506001600160a01b03169183915060009061074457610744613b32565b6001600160a01b03928316602091820292909201810191909152600b54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561079857600080fd5b505afa1580156107ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d09190613aad565b816001815181106107e3576107e3613b32565b6001600160a01b039283166020918202929092010152600b546040516318cbafe560e01b81529116906318cbafe590610828908790869086908c904290600401613b48565b600060405180830381600087803b15801561084257600080fd5b505af1158015610856573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261087e9190810190613bb9565b5060408051858152602081018590529081018990526001600160a01b038088169187918e1690600080516020613f99833981519152906060015b60405180910390a45050505050505050505050565b6002600b54600160a01b900460ff1660038111156108ed576108ed61384b565b146109495760405162461bcd60e51b815260206004820152602660248201527f4865726d65733a2073686f756c6420626520696e2070756e6973686d656e742060448201526573746174757360d01b60648201526084016106d0565b6000606461096a600461ffff166006546109639190613c74565b606461305e565b6109749190613c93565b600f54909150610e109060009061098b9042613cb5565b9050600060018361099c848661305e565b6109a69190613c93565b6109b09190613cb5565b905060006109be8583613c74565b6010549091506109cf908290613ccc565b6010556008546000906109e0612320565b6109ea9190613ccc565b6003546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b158015610a3357600080fd5b505afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190613ce4565b905081811015610b1b576003546001600160a01b03166323b872dd3330610a928587613cb5565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b158015610ae157600080fd5b505af1158015610af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b199190613cfd565b505b600b805460ff60a01b191690556040517f5dc43dfad9aedde473e812a66ff033b91a2b1ee060e7dc0746a1a14a4a3bd47c90600090a150505050505050565b60006064610b7f6064610b6b6122c5565b610b759086613c74565b6109639190613c93565b610b899190613c93565b92915050565b6000546001600160a01b0316331480610bb157506000546001600160a01b0316155b610bcd5760405162461bcd60e51b81526004016106d090613d1f565b6001600160a01b038116610be057600080fd5b6002546040516001600160a01b038084169216907fe1a66d77649cf0a57b9937073549f30f1c82bb865aaf066d2f299e37a62c6aad90600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b03163314610ca65760405162461bcd60e51b815260206004820152602760248201527f4865726d65733a206f6e6c792072656769737472792063616e206f70656e206360448201526668616e6e656c7360c81b60648201526084016106d0565b6000600b54600160a01b900460ff166003811115610cc657610cc661384b565b14610ce35760405162461bcd60e51b81526004016106d090613d54565b600754811015610d415760405162461bcd60e51b8152602060048201526024808201527f4865726d65733a206d696e207374616b6520616d6f756e74206e6f742072656160448201526318da195960e21b60648201526084016106d0565b610d55610d4d8361291c565b826000613093565b5050565b6000546001600160a01b0316331480610d7b57506000546001600160a01b0316155b610d975760405162461bcd60e51b81526004016106d090613d1f565b6003600b54600160a01b900460ff166003811115610db757610db761384b565b1415610e055760405162461bcd60e51b815260206004820152601c60248201527f4865726d65733a2073686f756c64206265206e6f7420636c6f7365640000000060448201526064016106d0565b6113888161ffff161115610e2b5760405162461bcd60e51b81526004016106d090613d96565b600c546201000090046001600160401b0316421015610e965760405162461bcd60e51b815260206004820152602160248201527f4865726d65733a2063616e27742075706461746520696e6163746976652066656044820152606560f81b60648201526084016106d0565b6000610ea061329b565b600c8054600d80546001600160401b03620100008085048216810269ffffffffffffffffffff1993841661ffff8088169190911791909117909455604080518082018252948a168086529288166020958601819052918202939095168217929092179094558251938452908301529192507fea76eb91f1817e0757719ea43e0733faf6f1121425bde387d1dd91badb9d403b91015b60405180910390a15050565b6003600b54600160a01b900460ff166003811115610f6157610f6161384b565b1415610faf5760405162461bcd60e51b815260206004820152601b60248201527f6865726d65732073686f756c64206265206e6f7420636c6f736564000000000060448201526064016106d0565b610d5582826000613093565b6004805460405163505a1b3160e01b81526001600160a01b03888116938201939093526000929091169063505a1b319060240160206040518083038186803b15801561100657600080fd5b505afa15801561101a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103e9190613aad565b90506001600160a01b0381166110665760405162461bcd60e51b81526004016106d090613aca565b60006110718761291c565b9050600080611087838989898960016000612d06565b60035460405163a9059cbb60e01b81529294509092506001600160a01b03169063a9059cbb906110bd9087908690600401613dda565b602060405180830381600087803b1580156110d757600080fd5b505af11580156110eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110f9190613cfd565b5060408051838152602081018390529081018790526001600160a01b038086169185918c1690600080516020613f998339815191529060600160405180910390a4505050505050505050565b6000611189886040518060400160405280600a8152602001691dda5d1a191c985dd85b60b21b815250612802565b905060006111f18346604080516020810192909252810185905260608082018c9052608082018a905287901b6bffffffffffffffffffffffff191660a082015260b4015b604051602081830303815290604052805190602001206132aa90919063ffffffff16565b9050886001600160a01b0316816001600160a01b0316146112735760405162461bcd60e51b815260206004820152603660248201527f4865726d65733a20706179416e64536574746c6520726571756573742073686f6044820152751d5b19081899481c1c9bdc195c9b1e481cda59db995960521b60648201526084016106d0565b600080611287848b8b8b8b60006001612d06565b60035460405163a9059cbb60e01b81529294509092506001600160a01b03169063a9059cbb906112bd9089908690600401613dda565b602060405180830381600087803b1580156112d757600080fd5b505af11580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190613cfd565b5060408051838152602081018390529081018990526001600160a01b038088169186918e1690600080516020613f99833981519152906060016108b8565b6004805460405163d0171d7960e01b81526001600160a01b039091169163d0171d7991611380918b918791879101613e23565b600060405180830381600087803b15801561139a57600080fd5b505af11580156113ae573d6000803e3d6000fd5b5050505060006113bd8861291c565b90506000806113d3838a8a8a8a60016000612d06565b60035460405163a9059cbb60e01b81529294509092506001600160a01b03169063a9059cbb906114099088908690600401613dda565b602060405180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145b9190613cfd565b5060408051838152602081018390529081018890526001600160a01b038087169185918d1690600080516020613f998339815191529060600160405180910390a450505050505050505050565b6000546001600160a01b03163314806114ca57506000546001600160a01b0316155b6114e65760405162461bcd60e51b81526004016106d090613d1f565b6003600b54600160a01b900460ff1660038111156115065761150661384b565b146115535760405162461bcd60e51b815260206004820152601960248201527f4865726d65733a206861766520746f20626520636c6f7365640000000000000060448201526064016106d0565b600a5442116115bd5760405162461bcd60e51b815260206004820152603060248201527f4865726d65733a2074696d656c6f636b20706572696f642073686f756c64206260448201526f1948185b1c9958591e481c185cdcd95960821b60648201526084016106d0565b6010546003546040516370a0823160e01b8152306004820152600092916001600160a01b0316906370a082319060240160206040518083038186803b15801561160557600080fd5b505afa158015611619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163d9190613ce4565b6116479190613cb5565b60035460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb9061167a9085908590600401613dda565b602060405180830381600087803b15801561169457600080fd5b505af11580156116a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cc9190613cfd565b505050565b600260015414156117245760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106d0565b60026001819055546001600160a01b031661173e57600080fd5b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611777573d6000803e3d6000fd5b5060018055565b6005546001600160a01b0316156117e25760405162461bcd60e51b815260206004820152602260248201527f4865726d65733a206861766520746f206265206e6f7420696e697469616c697a604482015261195960f21b60648201526084016106d0565b6001600160a01b0386166118515760405162461bcd60e51b815260206004820152603060248201527f4865726d65733a20746f6b656e2063616e2774206265206465706c6f7964206960448201526f6e746f207a65726f206164647265737360801b60648201526084016106d0565b6001600160a01b0385166118a75760405162461bcd60e51b815260206004820152601f60248201527f4865726d65733a206f70657261746f72206861766520746f206265207365740060448201526064016106d0565b6113888461ffff1611156118cd5760405162461bcd60e51b81526004016106d090613d96565b8282116119355760405162461bcd60e51b815260206004820152603060248201527f4865726d65733a206d61785374616b65206861766520746f206265206269676760448201526f6572207468616e206d696e5374616b6560801b60648201526084016106d0565b60048054336001600160a01b03199182161782556003805482166001600160a01b038a8116918217909255600580549093169189169190911790915560408051808201825261ffff8816808252426001600160401b03166020909201829052600c805469ffffffffffffffffffff19169091176201000090920291909117905560078690556008859055516370a0823160e01b81523092810192909252906370a082319060240160206040518083038186803b1580156119f457600080fd5b505afa158015611a08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2c9190613ce4565b60095560035460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390611a6390849060001990600401613dda565b602060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab59190613cfd565b50600b80546001600160a01b0319166001600160a01b038316179055611ada85612965565b505050505050565b6000818152600e6020526040812054151580610b895750506000908152600e6020526040902060010154151590565b6000546001600160a01b0316331480611b3357506000546001600160a01b0316155b611b4f5760405162461bcd60e51b81526004016106d090613d1f565b611b576125cc565b611b9e5760405162461bcd60e51b81526020600482015260186024820152774865726d65733a2068617320746f2062652061637469766560401b60448201526064016106d0565b6007548111611c075760405162461bcd60e51b815260206004820152602f60248201527f4865726d65733a206d61785374616b652068617320746f20626520626967676560448201526e72207468616e206d696e5374616b6560881b60648201526084016106d0565b60088190556040518181527f53f4fb18cb329155d5af04681c1d0846d0484d7de33791619c6988ca61910e3d906020015b60405180910390a150565b60008083604051602001611c5991815260200190565b6040516020818303038152906040528051906020012090506000611cac84611c7e4690565b60408051602081019290925281018b9052606081018a90526080810189905260a0810185905260c0016111cd565b6005546001600160a01b0390811691161498975050505050505050565b6000611cd48661291c565b9050600080611ce98388888888600180612d06565b60408051838152602081018390529081018890529193509150309084906001600160a01b038b1690600080516020613f998339815191529060600160405180910390a4611d3883836001613093565b5050505050505050565b6000611d4d8561291c565b9050611d5881611ae2565b611da45760405162461bcd60e51b815260206004820181905260248201527f4865726d65733a206368616e6e656c2068617320746f206265206f70656e656460448201526064016106d0565b82841015611e105760405162461bcd60e51b815260206004820152603360248201527f4865726d65733a20616d6f756e742073686f756c6420626520626967676572206044820152727468616e207472616e736163746f722066656560681b60648201526084016106d0565b6000818152600e602052604090206001810154851115611e8d5760405162461bcd60e51b815260206004820152603260248201527f4865726d65733a2063616e2774207769746864726177206d6f7265207468616e604482015271207468652063757272656e74207374616b6560701b60648201526084016106d0565b6002810154611e9d906001613ccc565b600282015560408051808201909152601481527314dd185ad9481c995d1d5c9b881c995c5d595cdd60621b6020820152600090611ef39085904660028601546040516111cd93929189918d918d91602001613e70565b905082611eff8261291c565b14611f5f5760405162461bcd60e51b815260206004820152602a60248201527f4865726d65733a206861766520746f206265207369676e6564206279206368616044820152696e6e656c20706172747960b01b60648201526084016106d0565b6000868360010154611f719190613cb5565b9050801580611f8257506007548110155b611f9e5760405162461bcd60e51b81526004016106d090613eac565b60018301819055600654611fb3908890613cb5565b60065585156120425760035460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611fee9033908a90600401613dda565b602060405180830381600087803b15801561200857600080fd5b505af115801561201c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120409190613cfd565b505b6004805460405163505a1b3160e01b81526001600160a01b038b8116938201939093526000929091169063505a1b319060240160206040518083038186803b15801561208d57600080fd5b505afa1580156120a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c59190613aad565b6003549091506001600160a01b031663a9059cbb826120e48a8c613cb5565b6040518363ffffffff1660e01b8152600401612101929190613dda565b602060405180830381600087803b15801561211b57600080fd5b505af115801561212f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121539190613cfd565b50847fc5f0715c45dab2e8f14871936119e3c64fd5841d397130c2d1db743d142522cb8360405161218691815260200190565b60405180910390a2505050505050505050565b6000546001600160a01b03163314806121bb57506000546001600160a01b0316155b6121d75760405162461bcd60e51b81526004016106d090613d1f565b6121df6125cc565b6122265760405162461bcd60e51b81526020600482015260186024820152774865726d65733a2068617320746f2062652061637469766560401b60448201526064016106d0565b60085481106122905760405162461bcd60e51b815260206004820152603060248201527f4865726d65733a206d696e5374616b652068617320746f20626520736d616c6c60448201526f6572207468616e206d61785374616b6560801b60648201526084016106d0565b60078190556040518181527fb9e5e6e8db1283ee860f3856d8383e40665c58a5264ede5e6ed8ec1afb03125190602001611c38565b600c5460009081906201000090046001600160401b03164210156122ea57600d6122ed565b600c5b60408051808201909152905461ffff8116808352620100009091046001600160401b031660209092019190915292915050565b6000600654612336600954600f600101546132ce565b6123409190613ccc565b905090565b6005546001600160a01b0316331461236f5760405162461bcd60e51b81526004016106d090613eff565b6000600b54600160a01b900460ff16600381111561238f5761238f61384b565b146123ac5760405162461bcd60e51b81526004016106d090613d54565b600b805460ff60a01b1916600160a01b1790556040517f1f4cd5d6edef8a0c4dbe6d547fdc42e0f3575167257553271f2366f9d497f67e90600090a1565b6000806123f5612320565b6003546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561243e57600080fd5b505afa158015612452573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124769190613ce4565b9050808211156124895760009250505090565b6124938282613cb5565b9250505090565b6000546001600160a01b03163314806124bc57506000546001600160a01b0316155b6124d85760405162461bcd60e51b81526004016106d090613d1f565b806124e16123ea565b10156125895760006124f16123ea565b6124fb9083613cb5565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390529192506001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561254e57600080fd5b505af1158015612562573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125869190613cfd565b50505b806009546125979190613ccc565b60098190556040519081527feb10b8b69c3eb290299237eaee4760bf1c02734ce3dc7740d6f2017b5ca3ed9190602001611c38565b6000806125e3600b5460ff600160a01b9091041690565b905060028160038111156125f9576125f961384b565b14158015612619575060038160038111156126165761261661384b565b14155b91505090565b600260015414156126725760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106d0565b60026001819055546001600160a01b031661268c57600080fd5b6003546001600160a01b03828116911614156126f85760405162461bcd60e51b815260206004820152602560248201527f6e617469766520746f6b656e2066756e64732063616e2774206265207265636f6044820152641d995c995960da1b60648201526084016106d0565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561273a57600080fd5b505afa15801561274e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127729190613ce4565b60025460405163a9059cbb60e01b81529192506001600160a01b038085169263a9059cbb926127a79216908590600401613dda565b602060405180830381600087803b1580156127c157600080fd5b505af11580156127d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f99190613cfd565b50506001805550565b600082308360405160200161281993929190613f52565b60405160208183030381529060405280519060200120905092915050565b6000546001600160a01b031633148061285957506000546001600160a01b0316155b6128755760405162461bcd60e51b81526004016106d090613d1f565b61287d6125cc565b6128c95760405162461bcd60e51b815260206004820152601860248201527f4865726d65733a2073686f756c6420626520616374697665000000000000000060448201526064016106d0565b600b805460ff60a01b1916600360a01b1790556128e46132e4565b600a556040514281527ffa9b0c2718819d67ceaec4f97d36185c2f1d22bdc5ff18f44c52cd56a5dd8e459060200160405180910390a1565b6040516bffffffffffffffffffffffff19606083811b8216602084015230901b166034820152600090604801604051602081830303815290604052805190602001209050919050565b6000546001600160a01b031633148061298757506000546001600160a01b0316155b6129a35760405162461bcd60e51b81526004016106d090613d1f565b6001600160a01b038116612a085760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106d0565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331480612a8557506000546001600160a01b0316155b612aa15760405162461bcd60e51b81526004016106d090613d1f565b612aa96125cc565b612af55760405162461bcd60e51b815260206004820152601960248201527f4865726d65733a206861766520746f206265206163746976650000000000000060448201526064016106d0565b80612afe6123ea565b1015612b695760405162461bcd60e51b815260206004820152603460248201527f4865726d65733a2073686f756c6420626520656e6f7567682066756e647320616044820152737661696c61626c6520746f20776974686472617760601b60648201526084016106d0565b60035460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612b9b9085908590600401613dda565b602060405180830381600087803b158015612bb557600080fd5b505af1158015612bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bed9190613cfd565b50604080518281526001600160a01b03841660208201527fa2e147ce2b7cb83d9c07e397bb806f23dd42c42e86ea45e1611d6e50eb1ec8bf9101610f35565b6005546001600160a01b03163314612c565760405162461bcd60e51b81526004016106d090613eff565b6001600b54600160a01b900460ff166003811115612c7657612c7661384b565b14612cce5760405162461bcd60e51b815260206004820152602260248201527f4865726d65733a206861766520746f20626520696e2070617573656420737461604482015261746560f01b60648201526084016106d0565b600b805460ff60a01b191690556040517f2d8b6ec230798e206d536342a28b7b61cc8fcfafb1d27c11c5519b3c42eb7df890600090a1565b600080612d116125cc565b612d6f5760405162461bcd60e51b815260206004820152602960248201527f4865726d65733a206865726d6573206861766520746f20626520696e2061637460448201526869766520737461746560b81b60648201526084016106d0565b612d7c8989898989611c43565b612de35760405162461bcd60e51b815260206004820152603260248201527f4865726d65733a206861766520746f2062652070726f7065726c79207369676e6044820152716564207061796d656e742070726f6d69736560701b60648201526084016106d0565b6000898152600e602052604090208054151580612e065750600754816001015410155b80612e0e5750835b612e5a5760405162461bcd60e51b815260206004820152601860248201527f4865726d65733a206e6f7420656e6f756768207374616b65000000000000000060448201526064016106d0565b6000612e646123ea565b90508160010154811015612ebe57600b805460ff60a01b1916600160a11b17905542600f81905560408051918252517f23dc47ee5d995fb521fbe4351f353f3177d7b9d9e15bdd01ed358764c25d96299181900360200190a15b8154600090612ecd908c613cb5565b9050898111612f3b5760405162461bcd60e51b815260206004820152603460248201527f4865726d65733a20616d6f756e7420746f20736574746c652073686f756c6420604482015273636f766572207472616e736163746f722066656560601b60648201526084016106d0565b6000612f4d60085485600101546132ce565b905082821180612f5c57508082115b15612f6e57612f6b83826132fe565b91505b8354612f7b908390613ccc565b8455600088612f8b576000612f94565b612f9483610b5a565b612f9e908d613ccc565b90508b1561303d57600360009054906101000a90046001600160a01b03166001600160a01b031663a9059cbb338e6040518363ffffffff1660e01b8152600401612fe9929190613dda565b602060405180830381600087803b15801561300357600080fd5b505af1158015613017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303b9190613cfd565b505b60006130498285613cb5565b9f919e50909c50505050505050505050505050565b60008180600161306e8287613ccc565b6130789190613cb5565b6130829190613c93565b61308c9190613c74565b9392505050565b6000838152600e6020526040812060018101549091906130b4908590613ccc565b905060085481111561313c5760405162461bcd60e51b8152602060048201526044602482018190527f4865726d65733a20746f74616c20616d6f756e7420746f207374616b65206361908201527f6e277420626520626967676572207468616e206d6178696d616c6c7920616c6c6064820152631bddd95960e21b608482015260a4016106d0565b60075481101561315e5760405162461bcd60e51b81526004016106d090613eac565b82613247576003546040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b03909116906323b872dd90606401602060405180830381600087803b1580156131b557600080fd5b505af11580156131c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ed9190613cfd565b6132475760405162461bcd60e51b815260206004820152602560248201527f4865726d65733a20746f6b656e207472616e736665722073686f756c6420737560448201526418d8d9595960da1b60648201526084016106d0565b6001820181905560065461325c908590613ccc565b60065560405181815285907fc5f0715c45dab2e8f14871936119e3c64fd5841d397130c2d1db743d142522cb9060200160405180910390a25050505050565b60006123406203f48042613ccc565b60008060006132b9858561330d565b915091506132c68161337d565b509392505050565b60008183116132dd578161308c565b5090919050565b60006132f46203f4806064613c74565b6123409042613ccc565b60008183106132dd578161308c565b6000808251604114156133445760208301516040840151606085015160001a6133388782858561353b565b94509450505050613376565b82516040141561336e5760208301516040840151613363868383613628565b935093505050613376565b506000905060025b9250929050565b60008160048111156133915761339161384b565b141561339a5750565b60018160048111156133ae576133ae61384b565b14156133fc5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106d0565b60028160048111156134105761341061384b565b141561345e5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106d0565b60038160048111156134725761347261384b565b14156134cb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106d0565b60048160048111156134df576134df61384b565b14156135385760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106d0565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613572575060009050600361361f565b8460ff16601b1415801561358a57508460ff16601c14155b1561359b575060009050600461361f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156135ef573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166136185760006001925092505061361f565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016136498782888561353b565b935093505050935093915050565b6001600160a01b038116811461353857600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156136aa576136aa61366c565b604052919050565b60006001600160401b038311156136cb576136cb61366c565b6136de601f8401601f1916602001613682565b90508281528383830111156136f257600080fd5b828260208301376000602084830101529392505050565b600082601f83011261371a57600080fd5b61308c838335602085016136b2565b600080600080600060a0868803121561374157600080fd5b853561374c81613657565b945060208601359350604086013592506060860135915060808601356001600160401b0381111561377c57600080fd5b61378888828901613709565b9150509295509295909350565b6000602082840312156137a757600080fd5b5035919050565b6000602082840312156137c057600080fd5b813561308c81613657565b600080604083850312156137de57600080fd5b82356137e981613657565b946020939093013593505050565b803561ffff8116811461380957600080fd5b919050565b60006020828403121561382057600080fd5b61308c826137f7565b6000806040838503121561383c57600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b602081016004831061388357634e487b7160e01b600052602160045260246000fd5b91905290565b600080600080600080600060e0888a0312156138a457600080fd5b87356138af81613657565b965060208801359550604088013594506060880135935060808801356001600160401b03808211156138e057600080fd5b6138ec8b838c01613709565b945060a08a013591506138fe82613657565b90925060c0890135908082111561391457600080fd5b506139218a828b01613709565b91505092959891949750929550565b60008060008060008060c0878903121561394957600080fd5b863561395481613657565b9550602087013561396481613657565b9450613972604088016137f7565b9350606087013592506080870135915060a087013561399081613657565b809150509295509295509295565b600080600080600060a086880312156139b657600080fd5b8535945060208601359350604086013592506060860135915060808601356001600160401b0381111561377c57600080fd5b600080600080608085870312156139fe57600080fd5b8435613a0981613657565b9350602085013592506040850135915060608501356001600160401b03811115613a3257600080fd5b613a3e87828801613709565b91505092959194509250565b60008060408385031215613a5d57600080fd5b8235613a6881613657565b915060208301356001600160401b03811115613a8357600080fd5b8301601f81018513613a9457600080fd5b613aa3858235602084016136b2565b9150509250929050565b600060208284031215613abf57600080fd5b815161308c81613657565b60208082526042908201527f4865726d65733a206964656e74697479206861766520746f206265207265676960408201527f7374657265642c2062656e6566696369617279206861766520746f2062652073606082015261195d60f21b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b985784516001600160a01b031683529383019391830191600101613b73565b50506001600160a01b03969096166060850152505050608001529392505050565b60006020808385031215613bcc57600080fd5b82516001600160401b0380821115613be357600080fd5b818501915085601f830112613bf757600080fd5b815181811115613c0957613c0961366c565b8060051b9150613c1a848301613682565b8181529183018401918481019088841115613c3457600080fd5b938501935b83851015613c5257845182529385019390850190613c39565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613c8e57613c8e613c5e565b500290565b600082613cb057634e487b7160e01b600052601260045260246000fd5b500490565b600082821015613cc757613cc7613c5e565b500390565b60008219821115613cdf57613cdf613c5e565b500190565b600060208284031215613cf657600080fd5b5051919050565b600060208284031215613d0f57600080fd5b8151801515811461308c57600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f4865726d65733a206861766520746f20626520696e2061637469766520737461604082015261746560f01b606082015260800190565b60208082526024908201527f4865726d65733a206665652063616e277420626520626967676572207468616e6040820152632035302560e01b606082015260800190565b6001600160a01b03929092168252602082015260400190565b60005b83811015613e0e578181015183820152602001613df6565b83811115613e1d576000848401525b50505050565b600060018060a01b038086168352808516602084015250606060408301528251806060840152613e5a816080850160208701613df3565b601f01601f191691909101608001949350505050565b60008751613e82818460208c01613df3565b9190910195865250602085019390935260408401919091526060830152608082015260a001919050565b60208082526033908201527f4865726d65733a207374616b652063616e2774206265206c657373207468616e604082015272207265717569726564206d696e207374616b6560681b606082015260800190565b60208082526033908201527f4865726d65733a206f6e6c79206865726d6573206f70657261746f722063616e6040820152721031b0b636103a3434b990333ab731ba34b7b760691b606082015260800190565b60006bffffffffffffffffffffffff19808660601b168352808560601b166014840152508251613f89816028850160208701613df3565b9190910160280194935050505056febe62ac0eb86179a8bcebe2f194ee1a147982a61a2ee67ff7e70b3fad25ec16d7a264697066735822122090aba2fc18c82091cd1bb5c63d63843b27d8aedf7fda2c3b28c60b34f9dd31c964736f6c63430008090033
Deployed Bytecode Sourcemap
886:22895:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12374:993;;;;;;:::i;:::-;;:::i;:::-;;3315:28;;;;;;;;;;;;;;2038:25:9;;;2094:2;2079:18;;2072:34;;;;2011:18;3315:28:4;;;;;;;;17047:1291;;;:::i;22856:149::-;;;;;;:::i;:::-;;:::i;:::-;;;2448:25:9;;;2436:2;2421:18;22856:149:4;2302:177:9;551:254:3;;;;;;:::i;:::-;;:::i;7224:413:4:-;;;;;;:::i;:::-;;:::i;4088:91::-;4161:11;;4088:91;;19072:560;;;;;;:::i;:::-;;:::i;6909:98::-;6978:8;;-1:-1:-1;;;;;6978:8:4;:22;;6909:98;;;3582:14:9;;3575:22;3557:41;;3545:2;3530:18;6909:98:4;3417:187:9;14423:204:4;;;;;;:::i;:::-;;:::i;9899:762::-;;;;;;:::i;:::-;;:::i;4567:80::-;4634:6;;-1:-1:-1;;;4634:6:4;;;;4567:80;;;;;;:::i;10667:904::-;;;;;;:::i;:::-;;:::i;11577:791::-;;;;;;:::i;:::-;;:::i;3777:94::-;3855:8;;-1:-1:-1;;;;;3855:8:4;3777:94;;;-1:-1:-1;;;;;5529:32:9;;;5511:51;;5499:2;5484:18;3777:94:4;5365:203:9;22171:374:4;;;;;;:::i;:::-;;:::i;1100:157:3:-;;;:::i;5790:1113:4:-;;;;;;:::i;:::-;;:::i;21064:164::-;;;;;;:::i;:::-;;:::i;18761:305::-;;;;;;:::i;:::-;;:::i;23374:405::-;;;;;;:::i;:::-;;:::i;14739:520::-;;;;;;:::i;:::-;;:::i;15337:1516::-;;;;;;:::i;:::-;;:::i;3041:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8190:25:9;;;8246:2;8231:18;;8224:34;;;;8274:18;;;8267:34;8332:2;8317:18;;8310:34;8177:3;8162:19;3041:43:4;7959:391:9;18449:306:4;;;;;;:::i;:::-;;:::i;3877:205::-;;;:::i;202:77:5:-;240:7;266:6;-1:-1:-1;;;;;266:6:5;202:77;;23081:136:4;;;:::i;2307:24::-;;;;;;;;;;;;-1:-1:-1;;;;;2307:24:4;;;;;;;8555:6:9;8543:19;;;8525:38;;-1:-1:-1;;;;;8599:31:9;;;8594:2;8579:18;;8572:59;8498:18;2307:24:4;8355:282:9;4185:113:4;4272:8;;4282;;4185:113;;21487:212;;;:::i;20676:340::-;;;:::i;19638:379::-;;;;;;:::i;:::-;;:::i;21310:171::-;;;:::i;1331:334:3:-;;;;;;:::i;:::-;;:::i;3595:176:4:-;;;;;;:::i;:::-;;:::i;2377:28::-;;;;;;;;;;;;-1:-1:-1;;;;;2377:28:4;;;21929:236;;;:::i;3350:85::-;3420:8;;-1:-1:-1;;;;;3420:8:4;3350:85;;3441:148;;;;;;:::i;:::-;;:::i;431:240:5:-;;;;;;:::i;:::-;;:::i;20221:352:4:-;;;;;;:::i;:::-;;:::i;869:101:3:-;947:16;;-1:-1:-1;;;;;947:16:3;869:101;;21705:218:4;;;:::i;354:24:3:-;;;;;-1:-1:-1;;;;;354:24:3;;;12374:993:4;12541:8;;;:34;;-1:-1:-1;;;12541:34:4;;-1:-1:-1;;;;;5529:32:9;;;12541:34:4;;;5511:51:9;;;;12518:20:4;;12541:8;;;;:23;;5484:18:9;;12541:34:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12518:57;-1:-1:-1;;;;;;12593:26:4;;12585:105;;;;-1:-1:-1;;;12585:105:4;;;;;;;:::i;:::-;;;;;;;;;12760:18;12781:23;12794:9;12781:12;:23::i;:::-;12760:44;;12815:25;12842:13;12859:87;12874:10;12886:7;12895:14;12911:9;12922:10;12934:4;12940:5;12859:14;:87::i;:::-;13070:16;;;13084:1;13070:16;;;;;;;;12814:132;;-1:-1:-1;12814:132:4;;-1:-1:-1;13015:17:4;;;;13070:16;;;;;;;;;-1:-1:-1;;13114:5:4;;13096:7;;;;-1:-1:-1;;;;;;13114:5:4;;13096:7;;-1:-1:-1;13114:5:4;;13096:7;;;;:::i;:::-;-1:-1:-1;;;;;13096:24:4;;;:7;;;;;;;;;;:24;;;;13140:3;;:10;;;-1:-1:-1;;;13140:10:4;;;;:3;;;;;:8;;:10;;;;;13096:7;;13140:10;;;;;:3;:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13130:4;13135:1;13130:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13130:20:4;;;:7;;;;;;;;;:20;13161:3;;:95;;-1:-1:-1;;;13161:95:4;;:3;;;:25;;:95;;13187:17;;13206:12;;13220:4;;13226:12;;13240:15;;13161:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13161:95:4;;;;;;;;;;;;:::i;:::-;-1:-1:-1;13272:88:4;;;12625:25:9;;;12681:2;12666:18;;12659:34;;;12709:18;;;12702:34;;;-1:-1:-1;;;;;13272:88:4;;;;13298:10;;13272:88;;;-1:-1:-1;;;;;;;;;;;13272:88:4;12613:2:9;12598:18;13272:88:4;;;;;;;;12508:859;;;;;;12374:993;;;;;:::o;17047:1291::-;17115:17;4634:6;;-1:-1:-1;;;4634:6:4;;;;17100:32;;;;;;;;:::i;:::-;;17092:83;;;;-1:-1:-1;;;17092:83:4;;12949:2:9;17092:83:4;;;12931:21:9;12988:2;12968:18;;;12961:30;13027:34;13007:18;;;13000:62;-1:-1:-1;;;13078:18:9;;;13071:36;13124:19;;17092:83:4;12747:402:9;17092:83:4;17242:26;17317:3;17271:43;1217:1;17277:31;;:10;;:31;;;;:::i;:::-;17310:3;17271:5;:43::i;:::-;:49;;;;:::i;:::-;17458:10;:30;17242:78;;-1:-1:-1;1131:4:4;;17379:13;;17440:48;;:15;:48;:::i;:::-;17418:70;;17498:24;17561:1;17553:5;17525:25;17531:11;17544:5;17525;:25::i;:::-;:33;;;;:::i;:::-;:37;;;;:::i;:::-;17498:64;-1:-1:-1;17573:25:4;17601:37;17620:18;17498:64;17601:37;:::i;:::-;17668:17;;17573:65;;-1:-1:-1;17668:37:4;;17573:65;;17668:37;:::i;:::-;17648:17;:57;17839:8;;17790:19;;17812:24;:22;:24::i;:::-;:35;;;;:::i;:::-;17949:5;;:30;;-1:-1:-1;;;17949:30:4;;17973:4;17949:30;;;5511:51:9;17790:57:4;;-1:-1:-1;17923:23:4;;-1:-1:-1;;;;;17949:5:4;;;;:15;;5484:18:9;;17949:30:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17923:56;;18105:11;18087:15;:29;18083:136;;;18132:5;;-1:-1:-1;;;;;18132:5:4;:18;18151:10;18171:4;18178:29;18192:15;18178:11;:29;:::i;:::-;18132:76;;-1:-1:-1;;;;;;18132:76:4;;;;;;;-1:-1:-1;;;;;14391:15:9;;;18132:76:4;;;14373:34:9;14443:15;;;;14423:18;;;14416:43;14475:18;;;14468:34;14308:18;;18132:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18083:136;18264:6;:22;;-1:-1:-1;;;;18264:22:4;;;18302:29;;;;18273:13;;18302:29;17082:1256;;;;;;;17047:1291::o;22856:149::-;22922:7;22995:3;22948:44;22982:3;22965:14;:12;:14::i;:::-;22955:24;;:7;:24;:::i;:::-;:30;;;;:::i;22948:44::-;:50;;;;:::i;:::-;22941:57;22856:149;-1:-1:-1;;22856:149:4:o;551:254:3:-;324:6:5;;-1:-1:-1;;;;;324:6:5;334:10;324:20;;:46;;-1:-1:-1;366:3:5;348:6;-1:-1:-1;;;;;348:6:5;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;656:29:3;::::1;648:38;;;::::0;::::1;;720:16;::::0;701:53:::1;::::0;-1:-1:-1;;;;;701:53:3;;::::1;::::0;720:16:::1;::::0;701:53:::1;::::0;720:16:::1;::::0;701:53:::1;764:16;:34:::0;;-1:-1:-1;;;;;;764:34:3::1;-1:-1:-1::0;;;;;764:34:3;;;::::1;::::0;;;::::1;::::0;;551:254::o;7224:413:4:-;7335:8;;-1:-1:-1;;;;;7335:8:4;7313:10;:31;7305:83;;;;-1:-1:-1;;;7305:83:4;;15358:2:9;7305:83:4;;;15340:21:9;15397:2;15377:18;;;15370:30;15436:34;15416:18;;;15409:62;-1:-1:-1;;;15487:18:9;;;15480:37;15534:19;;7305:83:4;15156:403:9;7305:83:4;7421:13;4634:6;;-1:-1:-1;;;4634:6:4;;;;7406:28;;;;;;;;:::i;:::-;;7398:75;;;;-1:-1:-1;;;7398:75:4;;;;;;;:::i;:::-;7509:8;;7491:14;:26;;7483:75;;;;-1:-1:-1;;;7483:75:4;;16169:2:9;7483:75:4;;;16151:21:9;16208:2;16188:18;;;16181:30;16247:34;16227:18;;;16220:62;-1:-1:-1;;;16298:18:9;;;16291:34;16342:19;;7483:75:4;15967:400:9;7483:75:4;7568:62;7583:23;7596:9;7583:12;:23::i;:::-;7608:14;7624:5;7568:14;:62::i;:::-;7224:413;;:::o;19072:560::-;324:6:5;;-1:-1:-1;;;;;324:6:5;334:10;324:20;;:46;;-1:-1:-1;366:3:5;348:6;-1:-1:-1;;;;;348:6:5;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:5;;;;;;;:::i;:::-;19160:13:4::1;4634:6:::0;;-1:-1:-1;;;4634:6:4;;;;19145:28:::1;;;;;;;;:::i;:::-;;;19137:69;;;::::0;-1:-1:-1;;;19137:69:4;;16574:2:9;19137:69:4::1;::::0;::::1;16556:21:9::0;16613:2;16593:18;;;16586:30;16652;16632:18;;;16625:58;16700:18;;19137:69:4::1;16372:352:9::0;19137:69:4::1;19235:4;19224:7;:15;;;;19216:64;;;;-1:-1:-1::0;;;19216:64:4::1;;;;;;;:::i;:::-;19317:7;:17:::0;;;::::1;-1:-1:-1::0;;;;;19317:17:4::1;19298:15;:36;;19290:82;;;::::0;-1:-1:-1;;;19290:82:4;;17336:2:9;19290:82:4::1;::::0;::::1;17318:21:9::0;17375:2;17355:18;;;17348:30;17414:34;17394:18;;;17387:62;-1:-1:-1;;;17465:18:9;;;17458:31;17506:19;;19290:82:4::1;17134:397:9::0;19290:82:4::1;19449:17;19476:13;:11;:13::i;:::-;19515:7;19501:21:::0;;:11:::1;:21:::0;;-1:-1:-1;;;;;19501:21:4;;;::::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;19501:21:4;;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;19542:30:::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;;;;::::1;;::::0;;::::1;::::0;;;19532:40;;::::1;::::0;;;;;;;;;::::1;::::0;;;19588:37;;8525:38:9;;;8579:18;;;8572:59;19542:30:4;;-1:-1:-1;19588:37:4::1;::::0;8498:18:9;19588:37:4::1;;;;;;;;19127:505;19072:560:::0;:::o;14423:204::-;14523:13;4634:6;;-1:-1:-1;;;4634:6:4;;;;14508:28;;;;;;;;:::i;:::-;;;14500:68;;;;-1:-1:-1;;;14500:68:4;;17738:2:9;14500:68:4;;;17720:21:9;17777:2;17757:18;;;17750:30;17816:29;17796:18;;;17789:57;17863:18;;14500:68:4;17536:351:9;14500:68:4;14578:42;14593:10;14605:7;14614:5;14578:14;:42::i;9899:762::-;10066:8;;;:34;;-1:-1:-1;;;10066:34:4;;-1:-1:-1;;;;;5529:32:9;;;10066:34:4;;;5511:51:9;;;;10043:20:4;;10066:8;;;;:23;;5484:18:9;;10066:34:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10043:57;-1:-1:-1;;;;;;10118:26:4;;10110:105;;;;-1:-1:-1;;;10110:105:4;;;;;;;:::i;:::-;10307:18;10328:23;10341:9;10328:12;:23::i;:::-;10307:44;;10362:25;10389:13;10406:87;10421:10;10433:7;10442:14;10458:9;10469:10;10481:4;10487:5;10406:14;:87::i;:::-;10503:5;;:47;;-1:-1:-1;;;10503:47:4;;10361:132;;-1:-1:-1;10361:132:4;;-1:-1:-1;;;;;;10503:5:4;;:14;;:47;;10518:12;;10361:132;;10503:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;10566:88:4;;;12625:25:9;;;12681:2;12666:18;;12659:34;;;12709:18;;;12702:34;;;-1:-1:-1;;;;;10566:88:4;;;;10592:10;;10566:88;;;-1:-1:-1;;;;;;;;;;;10566:88:4;12613:2:9;12598:18;10566:88:4;;;;;;;10033:628;;;;9899:762;;;;;:::o;10667:904::-;10868:18;10889:37;10902:9;10889:37;;;;;;;;;;;;;-1:-1:-1;;;10889:37:4;;;:12;:37::i;:::-;10868:58;-1:-1:-1;11027:15:4;11045:118;11141:21;204:9:6;11055:76:4;;;;;;18412:19:9;;;;18447:12;;18440:28;;;18484:12;;;;18477:28;;;18521:12;;;18514:28;;;18577:15;;;-1:-1:-1;;18573:53:9;18558:13;;;18551:76;18643:13;;11055:76:4;;;;;;;;;;;;;11045:87;;;;;;:95;;:118;;;;:::i;:::-;11027:136;;11192:9;-1:-1:-1;;;;;11181:20:4;:7;-1:-1:-1;;;;;11181:20:4;;11173:87;;;;-1:-1:-1;;;11173:87:4;;18869:2:9;11173:87:4;;;18851:21:9;18908:2;18888:18;;;18881:30;18947:34;18927:18;;;18920:62;-1:-1:-1;;;18998:18:9;;;18991:52;19060:19;;11173:87:4;18667:418:9;11173:87:4;11272:25;11299:13;11316:87;11331:10;11343:7;11352:14;11368:9;11379:10;11391:5;11398:4;11316:14;:87::i;:::-;11413:5;;:47;;-1:-1:-1;;;11413:47:4;;11271:132;;-1:-1:-1;11271:132:4;;-1:-1:-1;;;;;;11413:5:4;;:14;;:47;;11428:12;;11271:132;;11413:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;11476:88:4;;;12625:25:9;;;12681:2;12666:18;;12659:34;;;12709:18;;;12702:34;;;-1:-1:-1;;;;;11476:88:4;;;;11502:10;;11476:88;;;-1:-1:-1;;;;;;;;;;;11476:88:4;12613:2:9;12598:18;11476:88:4;12423:319:9;11577:791:4;11835:8;;;:74;;-1:-1:-1;;;11835:74:4;;-1:-1:-1;;;;;11835:8:4;;;;:23;;:74;;11859:9;;11870:15;;11887:21;;11835:74;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12001:18;12022:23;12035:9;12022:12;:23::i;:::-;12001:44;;12056:25;12083:13;12100:94;12115:10;12127:7;12136:14;12152:9;12163:17;12182:4;12188:5;12100:14;:94::i;:::-;12204:5;;:50;;-1:-1:-1;;;12204:50:4;;12055:139;;-1:-1:-1;12055:139:4;;-1:-1:-1;;;;;;12204:5:4;;:14;;:50;;12219:15;;12055:139;;12204:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;12270:91:4;;;12625:25:9;;;12681:2;12666:18;;12659:34;;;12709:18;;;12702:34;;;-1:-1:-1;;;;;12270:91:4;;;;12296:10;;12270:91;;;-1:-1:-1;;;;;;;;;;;12270:91:4;12613:2:9;12598:18;12270:91:4;;;;;;;11787:581;;;11577:791;;;;;;;:::o;22171:374::-;324:6:5;;-1:-1:-1;;;;;324:6:5;334:10;324:20;;:46;;-1:-1:-1;366:3:5;348:6;-1:-1:-1;;;;;348:6:5;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:5;;;;;;;:::i;:::-;22265:13:4::1;4634:6:::0;;-1:-1:-1;;;4634:6:4;;;;22250:28:::1;;;;;;;;:::i;:::-;;22242:66;;;::::0;-1:-1:-1;;;22242:66:4;;20141:2:9;22242:66:4::1;::::0;::::1;20123:21:9::0;20180:2;20160:18;;;20153:30;20219:27;20199:18;;;20192:55;20264:18;;22242:66:4::1;19939:349:9::0;22242:66:4::1;22344:15;;22326;:33;22318:94;;;::::0;-1:-1:-1;;;22318:94:4;;20495:2:9;22318:94:4::1;::::0;::::1;20477:21:9::0;20534:2;20514:18;;;20507:30;20573:34;20553:18;;;20546:62;-1:-1:-1;;;20624:18:9;;;20617:46;20680:19;;22318:94:4::1;20293:412:9::0;22318:94:4::1;22474:17:::0;;22441:5:::1;::::0;:30:::1;::::0;-1:-1:-1;;;22441:30:4;;22465:4:::1;22441:30;::::0;::::1;5511:51:9::0;22423:15:4::1;::::0;22474:17;-1:-1:-1;;;;;22441:5:4::1;::::0;:15:::1;::::0;5484:18:9;;22441:30:4::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;22501:5;::::0;:37:::1;::::0;-1:-1:-1;;;22501:37:4;;22423:68;;-1:-1:-1;;;;;;22501:5:4::1;::::0;:14:::1;::::0;:37:::1;::::0;22516:12;;22423:68;;22501:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22232:313;22171:374:::0;:::o;1100:157:3:-;1680:1:0;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:0;;20912:2:9;2251:63:0;;;20894:21:9;20951:2;20931:18;;;20924:30;20990:33;20970:18;;;20963:61;21041:18;;2251:63:0;20710:355:9;2251:63:0;1680:1;2389:7;:18;;;1161:16:3;-1:-1:-1;;;;;1161:16:3::1;1153:39;;;::::0;::::1;;1202:16;::::0;:48:::1;::::0;-1:-1:-1;;;;;1202:16:3;;::::1;::::0;1228:21:::1;1202:48:::0;::::1;;;::::0;:16:::1;:48:::0;:16;:48;1228:21;1202:16;:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;1637:1:0;2562:22;;1100:157:3:o;5790:1113:4:-;6978:8;;-1:-1:-1;;;;;6978:8:4;:22;5950:63;;;;-1:-1:-1;;;5950:63:4;;21272:2:9;5950:63:4;;;21254:21:9;21311:2;21291:18;;;21284:30;21350:34;21330:18;;;21323:62;-1:-1:-1;;;21401:18:9;;;21394:32;21443:19;;5950:63:4;21070:398:9;5950:63:4;-1:-1:-1;;;;;6031:20:4;;6023:81;;;;-1:-1:-1;;;6023:81:4;;21675:2:9;6023:81:4;;;21657:21:9;21714:2;21694:18;;;21687:30;21753:34;21733:18;;;21726:62;-1:-1:-1;;;21804:18:9;;;21797:46;21860:19;;6023:81:4;21473:412:9;6023:81:4;-1:-1:-1;;;;;6122:23:4;;6114:67;;;;-1:-1:-1;;;6114:67:4;;22092:2:9;6114:67:4;;;22074:21:9;22131:2;22111:18;;;22104:30;22170:33;22150:18;;;22143:61;22221:18;;6114:67:4;21890:355:9;6114:67:4;6207:4;6199;:12;;;;6191:61;;;;-1:-1:-1;;;6191:61:4;;;;;;;:::i;:::-;6282:9;6270;:21;6262:82;;;;-1:-1:-1;;;6262:82:4;;22452:2:9;6262:82:4;;;22434:21:9;22491:2;22471:18;;;22464:30;22530:34;22510:18;;;22503:62;-1:-1:-1;;;22581:18:9;;;22574:46;22637:19;;6262:82:4;22250:412:9;6262:82:4;6355:8;:39;;6383:10;-1:-1:-1;;;;;;6355:39:4;;;;;;6404:5;:27;;;;-1:-1:-1;;;;;6404:27:4;;;;;;;;;6441:8;:20;;;;;;;;;;;;;;;6481:40;;;;;;;;;;;;;;6504:15;-1:-1:-1;;;;;6481:40:4;;;;;;;;6471:7;:50;;-1:-1:-1;;6471:50:4;;;;;;;;;;;;;;6531:8;:20;;;6561:8;:20;;;6605:30;-1:-1:-1;;;6605:30:4;;6629:4;6605:30;;;5511:51:9;;;;6404:27:4;6605:15;;5484:18:9;;6605:30:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6591:11;:44;6767:5;;:45;;-1:-1:-1;;;6767:45:4;;-1:-1:-1;;;;;6767:5:4;;;;:13;;:45;;6781:11;;-1:-1:-1;;6794:17:4;6767:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;6822:3:4;:35;;-1:-1:-1;;;;;;6822:35:4;-1:-1:-1;;;;;6822:35:4;;;;;6868:28;6886:9;6868:17;:28::i;:::-;5790:1113;;;;;;:::o;21064:164::-;21130:4;21153:20;;;:8;:20;;;;;:28;:33;;;:68;;-1:-1:-1;;21190:20:4;;;;:8;:20;;;;;:26;;;:31;;;21064:164::o;18761:305::-;324:6:5;;-1:-1:-1;;;;;324:6:5;334:10;324:20;;:46;;-1:-1:-1;366:3:5;348:6;-1:-1:-1;;;;;348:6:5;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:5;;;;;;;:::i;:::-;18839:16:4::1;:14;:16::i;:::-;18831:53;;;::::0;-1:-1:-1;;;18831:53:4;;23156:2:9;18831:53:4::1;::::0;::::1;23138:21:9::0;23195:2;23175:18;;;23168:30;-1:-1:-1;;;23214:18:9;;;23207:54;23278:18;;18831:53:4::1;22954:348:9::0;18831:53:4::1;18917:8;;18902:12;:23;18894:83;;;::::0;-1:-1:-1;;;18894:83:4;;23509:2:9;18894:83:4::1;::::0;::::1;23491:21:9::0;23548:2;23528:18;;;23521:30;23587:34;23567:18;;;23560:62;-1:-1:-1;;;23638:18:9;;;23631:45;23693:19;;18894:83:4::1;23307:411:9::0;18894:83:4::1;18987:8;:23:::0;;;19025:34:::1;::::0;2448:25:9;;;19025:34:4::1;::::0;2436:2:9;2421:18;19025:34:4::1;;;;;;;;18761:305:::0;:::o;23374:405::-;23525:4;23541:17;23588:9;23571:27;;;;;;23852:19:9;;23896:2;23887:12;;23723:182;23571:27:4;;;;;;;;;;;;;23561:38;;;;;;23541:58;;23609:15;23627:109;23725:10;23654:12;204:9:6;;81:172;23654:12:4;23637:78;;;;;;24151:19:9;;;;24186:12;;24179:28;;;24223:12;;;24216:28;;;24260:12;;;24253:28;;;24297:13;;;24290:29;;;24335:13;;23637:78:4;23910:444:9;23627:109:4;23764:8;;-1:-1:-1;;;;;23764:8:4;;;23753:19;;;;23374:405;-1:-1:-1;;;;;;;;23374:405:4:o;14739:520::-;14885:18;14906:23;14919:9;14906:12;:23::i;:::-;14885:44;;14940:28;14970:17;14991:86;15006:10;15018:7;15027:14;15043:9;15054:10;15066:4;15072;14991:14;:86::i;:::-;15092:96;;;12625:25:9;;;12681:2;12666:18;;12659:34;;;12709:18;;;12702:34;;;14939:138:4;;-1:-1:-1;14939:138:4;-1:-1:-1;15138:4:4;;15118:10;;-1:-1:-1;;;;;15092:96:4;;;-1:-1:-1;;;;;;;;;;;15092:96:4;12613:2:9;12598:18;15092:96:4;;;;;;;15198:54;15213:10;15225:20;15247:4;15198:14;:54::i;:::-;14875:384;;;14739:520;;;;;:::o;15337:1516::-;15462:18;15483:23;15496:9;15483:12;:23::i;:::-;15462:44;;15524:27;15540:10;15524:15;:27::i;:::-;15516:72;;;;-1:-1:-1;;;15516:72:4;;24561:2:9;15516:72:4;;;24543:21:9;;;24580:18;;;24573:30;24639:34;24619:18;;;24612:62;24691:18;;15516:72:4;24359:356:9;15516:72:4;15617:14;15606:7;:25;;15598:89;;;;-1:-1:-1;;;15598:89:4;;24922:2:9;15598:89:4;;;24904:21:9;24961:2;24941:18;;;24934:30;25000:34;24980:18;;;24973:62;-1:-1:-1;;;25051:18:9;;;25044:49;25110:19;;15598:89:4;24720:415:9;15598:89:4;15698:24;15725:20;;;:8;:20;;;;;15774:14;;;;15763:25;;;15755:88;;;;-1:-1:-1;;;15755:88:4;;25342:2:9;15755:88:4;;;25324:21:9;25381:2;25361:18;;;25354:30;25420:34;25400:18;;;25393:62;-1:-1:-1;;;25471:18:9;;;25464:48;25529:19;;15755:88:4;25140:414:9;15755:88:4;15907:22;;;;:26;;15932:1;15907:26;:::i;:::-;15882:22;;;:51;15988:19;;;;;;;;;;;;-1:-1:-1;;;15988:19:4;;;;15943:15;;15961:143;;16093:10;;204:9:6;16060:22:4;;;;15971:112;;;;;;16023:10;;16035:7;;16044:14;;15971:112;;;:::i;15961:143::-;15943:161;;16147:10;16122:21;16135:7;16122:12;:21::i;:::-;:35;16114:90;;;;-1:-1:-1;;;16114:90:4;;26408:2:9;16114:90:4;;;26390:21:9;26447:2;26427:18;;;26420:30;26486:34;26466:18;;;26459:62;-1:-1:-1;;;26537:18:9;;;26530:40;26587:19;;16114:90:4;26206:406:9;16114:90:4;16215:23;16258:7;16241:8;:14;;;:24;;;;:::i;:::-;16215:50;-1:-1:-1;16283:20:4;;;:51;;;16326:8;;16307:15;:27;;16283:51;16275:115;;;;-1:-1:-1;;;16275:115:4;;;;;;;:::i;:::-;16433:14;;;:32;;;16488:10;;:20;;16501:7;;16488:20;:::i;:::-;16475:10;:33;16575:18;;16571:91;;16609:5;;:42;;-1:-1:-1;;;16609:42:4;;-1:-1:-1;;;;;16609:5:4;;;;:14;;:42;;16624:10;;16636:14;;16609:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16571:91;16695:8;;;:34;;-1:-1:-1;;;16695:34:4;;-1:-1:-1;;;;;5529:32:9;;;16695:34:4;;;5511:51:9;;;;16672:20:4;;16695:8;;;;:23;;5484:18:9;;16695:34:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16739:5;;16672:57;;-1:-1:-1;;;;;;16739:5:4;:14;16672:57;16768:24;16778:14;16768:7;:24;:::i;:::-;16739:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16818:10;16809:37;16830:15;16809:37;;;;2448:25:9;;2436:2;2421:18;;2302:177;16809:37:4;;;;;;;;15452:1401;;;;;15337:1516;;;;:::o;18449:306::-;324:6:5;;-1:-1:-1;;;;;324:6:5;334:10;324:20;;:46;;-1:-1:-1;366:3:5;348:6;-1:-1:-1;;;;;348:6:5;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:5;;;;;;;:::i;:::-;18527:16:4::1;:14;:16::i;:::-;18519:53;;;::::0;-1:-1:-1;;;18519:53:4;;23156:2:9;18519:53:4::1;::::0;::::1;23138:21:9::0;23195:2;23175:18;;;23168:30;-1:-1:-1;;;23214:18:9;;;23207:54;23278:18;;18519:53:4::1;22954:348:9::0;18519:53:4::1;18605:8;;18590:12;:23;18582:84;;;::::0;-1:-1:-1;;;18582:84:4;;27239:2:9;18582:84:4::1;::::0;::::1;27221:21:9::0;27278:2;27258:18;;;27251:30;27317:34;27297:18;;;27290:62;-1:-1:-1;;;27368:18:9;;;27361:46;27424:19;;18582:84:4::1;27037:412:9::0;18582:84:4::1;18676:8;:23:::0;;;18714:34:::1;::::0;2448:25:9;;;18714:34:4::1;::::0;2436:2:9;2421:18;18714:34:4::1;2302:177:9::0;3877:205:4;3991:7;:17;3922:7;;;;3991:17;;;-1:-1:-1;;;;;3991:17:4;3972:15;:36;;3971:62;;4022:11;3971:62;;;4012:7;3971:62;3941:92;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3941:92:4;;;;;;;;;;;-1:-1:-1;;3877:205:4:o;23081:136::-;23136:7;23200:10;;23162:35;23166:11;;23179:10;:17;;;23162:3;:35::i;:::-;:48;;;;:::i;:::-;23155:55;;23081:136;:::o;21487:212::-;5455:8;;-1:-1:-1;;;;;5455:8:4;5441:10;:22;5433:86;;;;-1:-1:-1;;;5433:86:4;;;;;;;:::i;:::-;21571:13:::1;4634:6:::0;;-1:-1:-1;;;4634:6:4;;;;21556:28:::1;;;;;;;;:::i;:::-;;21548:75;;;;-1:-1:-1::0;;;21548:75:4::1;;;;;;;:::i;:::-;21633:6;:22:::0;;-1:-1:-1;;;;21633:22:4::1;-1:-1:-1::0;;;21633:22:4::1;::::0;;21670::::1;::::0;::::1;::::0;-1:-1:-1;;21670:22:4::1;21487:212::o:0;20676:340::-;20725:7;20744:26;20773:24;:22;:24::i;:::-;20833:5;;:30;;-1:-1:-1;;;20833:30:4;;20857:4;20833:30;;;5511:51:9;20744:53:4;;-1:-1:-1;20807:23:4;;-1:-1:-1;;;;;20833:5:4;;;;:15;;5484:18:9;;20833:30:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20807:56;;20898:15;20877:18;:36;20873:84;;;20944:1;20929:17;;;;20676:340;:::o;20873:84::-;20973:36;20991:18;20973:15;:36;:::i;:::-;20966:43;;;;20676:340;:::o;19638:379::-;324:6:5;;-1:-1:-1;;;;;324:6:5;334:10;324:20;;:46;;-1:-1:-1;366:3:5;348:6;-1:-1:-1;;;;;348:6:5;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:5;;;;;;;:::i;:::-;19745:16:4::1;19724:18;:16;:18::i;:::-;:37;19720:187;;;19777:13;19812:18;:16;:18::i;:::-;19793:37;::::0;:16;:37:::1;:::i;:::-;19844:5;::::0;:52:::1;::::0;-1:-1:-1;;;19844:52:4;;19863:10:::1;19844:52;::::0;::::1;14373:34:9::0;19883:4:4::1;14423:18:9::0;;;14416:43;14475:18;;;14468:34;;;19777:53:4;;-1:-1:-1;;;;;;19844:5:4::1;::::0;:18:::1;::::0;14308::9;;19844:52:4::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19763:144;19720:187;19945:16;19931:11;;:30;;;;:::i;:::-;19917:11;:44:::0;;;19977:33:::1;::::0;2448:25:9;;;19977:33:4::1;::::0;2436:2:9;2421:18;19977:33:4::1;2302:177:9::0;21310:171:4;21357:4;21373:14;21390:11;4634:6;;;-1:-1:-1;;;4634:6:4;;;;;4567:80;21390:11;21373:28;-1:-1:-1;21429:17:4;21418:7;:28;;;;;;;;:::i;:::-;;;:56;;;;-1:-1:-1;21461:13:4;21450:7;:24;;;;;;;;:::i;:::-;;;21418:56;21411:63;;;21310:171;:::o;1331:334:3:-;1680:1:0;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:0;;20912:2:9;2251:63:0;;;20894:21:9;20951:2;20931:18;;;20924:30;20990:33;20970:18;;;20963:61;21041:18;;2251:63:0;20710:355:9;2251:63:0;1680:1;2389:7;:18;;;1406:16:3;-1:-1:-1;;;;;1406:16:3::1;1398:39;;;::::0;::::1;;1473:5;::::0;-1:-1:-1;;;;;1455:24:3;;::::1;1473:5:::0;::::1;1455:24;;1447:74;;;::::0;-1:-1:-1;;;1447:74:3;;28076:2:9;1447:74:3::1;::::0;::::1;28058:21:9::0;28115:2;28095:18;;;28088:30;28154:34;28134:18;;;28127:62;-1:-1:-1;;;28205:18:9;;;28198:35;28250:19;;1447:74:3::1;27874:401:9::0;1447:74:3::1;1549:44;::::0;-1:-1:-1;;;1549:44:3;;1587:4:::1;1549:44;::::0;::::1;5511:51:9::0;1531:15:3::1;::::0;-1:-1:-1;;;;;1549:29:3;::::1;::::0;::::1;::::0;5484:18:9;;1549:44:3::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1632:16;::::0;1603:55:::1;::::0;-1:-1:-1;;;1603:55:3;;1531:62;;-1:-1:-1;;;;;;1603:28:3;;::::1;::::0;::::1;::::0;:55:::1;::::0;1632:16:::1;::::0;1531:62;;1603:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;1637:1:0;2562:22;;-1:-1:-1;1331:334:3:o;3595:176:4:-;3678:7;3731:9;3750:4;3757:5;3714:49;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3704:60;;;;;;3697:67;;3595:176;;;;:::o;21929:236::-;324:6:5;;-1:-1:-1;;;;;324:6:5;334:10;324:20;;:46;;-1:-1:-1;366:3:5;348:6;-1:-1:-1;;;;;348:6:5;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:5;;;;;;;:::i;:::-;21987:16:4::1;:14;:16::i;:::-;21979:53;;;::::0;-1:-1:-1;;;21979:53:4;;28988:2:9;21979:53:4::1;::::0;::::1;28970:21:9::0;29027:2;29007:18;;;29000:30;29066:26;29046:18;;;29039:54;29110:18;;21979:53:4::1;28786:348:9::0;21979:53:4::1;22042:6;:22:::0;;-1:-1:-1;;;;22042:22:4::1;-1:-1:-1::0;;;22042:22:4::1;::::0;;22092::::1;:20;:22::i;:::-;22074:15;:40:::0;22129:29:::1;::::0;22142:15:::1;2448:25:9::0;;22129:29:4::1;::::0;2436:2:9;2421:18;22129:29:4::1;;;;;;;21929:236::o:0;3441:148::-;3539:42;;-1:-1:-1;;29366:2:9;29362:15;;;29358:24;;3539:42:4;;;29346:37:9;3575:4:4;29417:15:9;;29413:24;29399:12;;;29392:46;3503:7:4;;29454:12:9;;3539:42:4;;;;;;;;;;;;3529:53;;;;;;3522:60;;3441:148;;;:::o;431:240:5:-;324:6;;-1:-1:-1;;;;;324:6:5;334:10;324:20;;:46;;-1:-1:-1;366:3:5;348:6;-1:-1:-1;;;;;348:6:5;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;519:22:5;::::1;511:73;;;::::0;-1:-1:-1;;;511:73:5;;29679:2:9;511:73:5::1;::::0;::::1;29661:21:9::0;29718:2;29698:18;;;29691:30;29757:34;29737:18;;;29730:62;-1:-1:-1;;;29808:18:9;;;29801:36;29854:19;;511:73:5::1;29477:402:9::0;511:73:5::1;620:6;::::0;;599:38:::1;::::0;-1:-1:-1;;;;;599:38:5;;::::1;::::0;620:6;::::1;::::0;599:38:::1;::::0;::::1;647:6;:17:::0;;-1:-1:-1;;;;;;647:17:5::1;-1:-1:-1::0;;;;;647:17:5;;;::::1;::::0;;;::::1;::::0;;431:240::o;20221:352:4:-;324:6:5;;-1:-1:-1;;;;;324:6:5;334:10;324:20;;:46;;-1:-1:-1;366:3:5;348:6;-1:-1:-1;;;;;348:6:5;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:5;;;;;;;:::i;:::-;20313:16:4::1;:14;:16::i;:::-;20305:54;;;::::0;-1:-1:-1;;;20305:54:4;;30086:2:9;20305:54:4::1;::::0;::::1;30068:21:9::0;30125:2;30105:18;;;30098:30;30164:27;30144:18;;;30137:55;30209:18;;20305:54:4::1;29884:349:9::0;20305:54:4::1;20399:7;20377:18;:16;:18::i;:::-;:29;;20369:94;;;::::0;-1:-1:-1;;;20369:94:4;;30440:2:9;20369:94:4::1;::::0;::::1;30422:21:9::0;30479:2;30459:18;;;30452:30;30518:34;30498:18;;;30491:62;-1:-1:-1;;;30569:18:9;;;30562:50;30629:19;;20369:94:4::1;30238:416:9::0;20369:94:4::1;20474:5;::::0;:37:::1;::::0;-1:-1:-1;;;20474:37:4;;-1:-1:-1;;;;;20474:5:4;;::::1;::::0;:14:::1;::::0;:37:::1;::::0;20489:12;;20503:7;;20474:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;20527:39:4::1;::::0;;30833:25:9;;;-1:-1:-1;;;;;30894:32:9;;30889:2;30874:18;;30867:60;20527:39:4::1;::::0;30806:18:9;20527:39:4::1;30659:274:9::0;21705:218:4;5455:8;;-1:-1:-1;;;;;5455:8:4;5441:10;:22;5433:86;;;;-1:-1:-1;;;5433:86:4;;;;;;;:::i;:::-;21792:13:::1;4634:6:::0;;-1:-1:-1;;;4634:6:4;;;;21777:28:::1;;;;;;;;:::i;:::-;;21769:75;;;::::0;-1:-1:-1;;;21769:75:4;;31140:2:9;21769:75:4::1;::::0;::::1;31122:21:9::0;31179:2;31159:18;;;31152:30;31218:34;31198:18;;;31191:62;-1:-1:-1;;;31269:18:9;;;31262:32;31311:19;;21769:75:4::1;30938:398:9::0;21769:75:4::1;21854:6;:22:::0;;-1:-1:-1;;;;21854:22:4::1;::::0;;21891:25:::1;::::0;::::1;::::0;21863:13:::1;::::0;21891:25:::1;21705:218::o:0;7734:2159::-;7976:7;7985;8025:16;:14;:16::i;:::-;8004:104;;;;-1:-1:-1;;;8004:104:4;;31543:2:9;8004:104:4;;;31525:21:9;31582:2;31562:18;;;31555:30;31621:34;31601:18;;;31594:62;-1:-1:-1;;;31672:18:9;;;31665:39;31721:19;;8004:104:4;31341:405:9;8004:104:4;8203:75;8219:10;8231:7;8240:14;8256:9;8267:10;8203:15;:75::i;:::-;8182:172;;;;-1:-1:-1;;;8182:172:4;;31953:2:9;8182:172:4;;;31935:21:9;31992:2;31972:18;;;31965:30;32031:34;32011:18;;;32004:62;-1:-1:-1;;;32082:18:9;;;32075:48;32140:19;;8182:172:4;31751:414:9;8182:172:4;8365:24;8392:20;;;:8;:20;;;;;8430:16;;:20;;;:50;;;8472:8;;8454;:14;;;:26;;8430:50;:66;;;;8484:12;8430:66;8422:103;;;;-1:-1:-1;;;8422:103:4;;32372:2:9;8422:103:4;;;32354:21:9;32411:2;32391:18;;;32384:30;32450:26;32430:18;;;32423:54;32494:18;;8422:103:4;32170:348:9;8422:103:4;8626:25;8654:18;:16;:18::i;:::-;8626:46;;8706:8;:14;;;8686:17;:34;8682:214;;;8736:6;:26;;-1:-1:-1;;;;8736:26:4;-1:-1:-1;;;8736:26:4;;;8809:15;8776:10;:48;;;8843:42;;;2448:25:9;;;8843:42:4;;;;;;2436:2:9;8843:42:4;;;8682:214;8993:16;;8959:21;;8983:26;;:7;:26;:::i;:::-;8959:50;;9043:14;9027:13;:30;9019:95;;;;-1:-1:-1;;;9019:95:4;;32725:2:9;9019:95:4;;;32707:21:9;32764:2;32744:18;;;32737:30;32803:34;32783:18;;;32776:62;-1:-1:-1;;;32854:18:9;;;32847:50;32914:19;;9019:95:4;32523:416:9;9019:95:4;9228:28;9259:29;9263:8;;9273;:14;;;9259:3;:29::i;:::-;9228:60;;9318:17;9302:13;:33;:73;;;;9355:20;9339:13;:36;9302:73;9298:167;;;9410:44;9414:17;9433:20;9410:3;:44::i;:::-;9394:60;;9298:167;9494:16;;:32;;9513:13;;9494:32;:::i;:::-;9475:51;;:16;9603:8;:48;;9650:1;9603:48;;;9614:33;9633:13;9614:18;:33::i;:::-;9585:67;;:14;:67;:::i;:::-;9569:83;-1:-1:-1;9697:18:4;;9693:91;;9731:5;;;;;;;;;-1:-1:-1;;;;;9731:5:4;-1:-1:-1;;;;;9731:14:4;;9746:10;9758:14;9731:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9693:91;9794:25;9822:20;9837:5;9822:13;:20;:::i;:::-;9794:48;9880:5;;-1:-1:-1;7734:2159:4;;-1:-1:-1;;;;;;;;;;;;;7734:2159:4:o;461:106:6:-;515:4;559:1;;549;541:5;559:1;541;:5;:::i;:::-;:9;;;;:::i;:::-;540:15;;;;:::i;:::-;539:21;;;;:::i;:::-;532:28;461:106;-1:-1:-1;;;461:106:6:o;13489:854:4:-;13598:24;13625:20;;;:8;:20;;;;;13681:14;;;;13625:20;;13598:24;13681:28;;13697:12;;13681:28;:::i;:::-;13655:54;;13746:8;;13727:15;:27;;13719:108;;;;-1:-1:-1;;;13719:108:4;;33146:2:9;13719:108:4;;;33128:21:9;33185:2;33165:18;;;33158:30;;;33224:34;33204:18;;;33197:62;33295:34;33275:18;;;33268:62;-1:-1:-1;;;33346:19:9;;;33339:35;33391:19;;13719:108:4;32944:472:9;13719:108:4;13864:8;;13845:15;:27;;13837:91;;;;-1:-1:-1;;;13837:91:4;;;;;;;:::i;:::-;14040:17;14035:158;;14081:5;;:59;;-1:-1:-1;;;14081:59:4;;14100:10;14081:59;;;14373:34:9;14120:4:4;14423:18:9;;;14416:43;14475:18;;;14468:34;;;-1:-1:-1;;;;;14081:5:4;;;;:18;;14308::9;;14081:59:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14073:109;;;;-1:-1:-1;;;14073:109:4;;33623:2:9;14073:109:4;;;33605:21:9;33662:2;33642:18;;;33635:30;33701:34;33681:18;;;33674:62;-1:-1:-1;;;33752:18:9;;;33745:35;33797:19;;14073:109:4;33421:401:9;14073:109:4;14203:14;;;:32;;;14258:10;;:25;;14271:12;;14258:25;:::i;:::-;14245:10;:38;14299:37;;2448:25:9;;;14308:10:4;;14299:37;;2436:2:9;2421:18;14299:37:4;;;;;;;13588:755;;13489:854;;;:::o;22732:118::-;22786:7;22812:31;1075:6;22812:15;:31;:::i;4203:227:2:-;4281:7;4301:17;4320:18;4342:27;4353:4;4359:9;4342:10;:27::i;:::-;4300:69;;;;4379:18;4391:5;4379:11;:18::i;:::-;-1:-1:-1;4414:9:2;4203:227;-1:-1:-1;;;4203:227:2:o;259:95:6:-;311:4;338:1;334;:5;:13;;346:1;334:13;;;-1:-1:-1;342:1:6;;259:95;-1:-1:-1;259:95:6:o;23223:145:4:-;23286:7;23330:19;1075:6;23346:3;23330:19;:::i;:::-;23312:37;;:15;:37;:::i;360:95:6:-;412:4;439:1;435;:5;:13;;447:1;435:13;;2138:1279:2;2219:7;2228:12;2449:9;:16;2469:2;2449:22;2445:966;;;2738:4;2723:20;;2717:27;2787:4;2772:20;;2766:27;2844:4;2829:20;;2823:27;2487:9;2815:36;2885:25;2896:4;2815:36;2717:27;2766;2885:10;:25::i;:::-;2878:32;;;;;;;;;2445:966;2931:9;:16;2951:2;2931:22;2927:484;;;3200:4;3185:20;;3179:27;3250:4;3235:20;;3229:27;3290:23;3301:4;3179:27;3229;3290:10;:23::i;:::-;3283:30;;;;;;;;2927:484;-1:-1:-1;3360:1:2;;-1:-1:-1;3364:35:2;2927:484;2138:1279;;;;;:::o;443:631::-;520:20;511:5;:29;;;;;;;;:::i;:::-;;507:561;;;443:631;:::o;507:561::-;616:29;607:5;:38;;;;;;;;:::i;:::-;;603:465;;;661:34;;-1:-1:-1;;;661:34:2;;34029:2:9;661:34:2;;;34011:21:9;34068:2;34048:18;;;34041:30;34107:26;34087:18;;;34080:54;34151:18;;661:34:2;33827:348:9;603:465:2;725:35;716:5;:44;;;;;;;;:::i;:::-;;712:356;;;776:41;;-1:-1:-1;;;776:41:2;;34382:2:9;776:41:2;;;34364:21:9;34421:2;34401:18;;;34394:30;34460:33;34440:18;;;34433:61;34511:18;;776:41:2;34180:355:9;712:356:2;847:30;838:5;:39;;;;;;;;:::i;:::-;;834:234;;;893:44;;-1:-1:-1;;;893:44:2;;34742:2:9;893:44:2;;;34724:21:9;34781:2;34761:18;;;34754:30;34820:34;34800:18;;;34793:62;-1:-1:-1;;;34871:18:9;;;34864:32;34913:19;;893:44:2;34540:398:9;834:234:2;967:30;958:5;:39;;;;;;;;:::i;:::-;;954:114;;;1013:44;;-1:-1:-1;;;1013:44:2;;35145:2:9;1013:44:2;;;35127:21:9;35184:2;35164:18;;;35157:30;35223:34;35203:18;;;35196:62;-1:-1:-1;;;35274:18:9;;;35267:32;35316:19;;1013:44:2;34943:398:9;954:114:2;443:631;:::o;5654:1603::-;5780:7;;6704:66;6691:79;;6687:161;;;-1:-1:-1;6802:1:2;;-1:-1:-1;6806:30:2;6786:51;;6687:161;6861:1;:7;;6866:2;6861:7;;:18;;;;;6872:1;:7;;6877:2;6872:7;;6861:18;6857:100;;;-1:-1:-1;6911:1:2;;-1:-1:-1;6915:30:2;6895:51;;6857:100;7068:24;;;7051:14;7068:24;;;;;;;;;35573:25:9;;;35646:4;35634:17;;35614:18;;;35607:45;;;;35668:18;;;35661:34;;;35711:18;;;35704:34;;;7068:24:2;;35545:19:9;;7068:24:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7068:24:2;;-1:-1:-1;;7068:24:2;;;-1:-1:-1;;;;;;;7106:20:2;;7102:101;;7158:1;7162:29;7142:50;;;;;;;7102:101;7221:6;-1:-1:-1;7229:20:2;;-1:-1:-1;5654:1603:2;;;;;;;;:::o;4684:379::-;4794:7;;-1:-1:-1;;;;;4891:75:2;;4992:3;4988:12;;;5002:2;4984:21;5031:25;5042:4;4984:21;5051:1;4891:75;5031:10;:25::i;:::-;5024:32;;;;;;4684:379;;;;;;:::o;14:131:9:-;-1:-1:-1;;;;;89:31:9;;79:42;;69:70;;135:1;132;125:12;150:127;211:10;206:3;202:20;199:1;192:31;242:4;239:1;232:15;266:4;263:1;256:15;282:275;353:2;347:9;418:2;399:13;;-1:-1:-1;;395:27:9;383:40;;-1:-1:-1;;;;;438:34:9;;474:22;;;435:62;432:88;;;500:18;;:::i;:::-;536:2;529:22;282:275;;-1:-1:-1;282:275:9:o;562:406::-;626:5;-1:-1:-1;;;;;652:6:9;649:30;646:56;;;682:18;;:::i;:::-;720:57;765:2;744:15;;-1:-1:-1;;740:29:9;771:4;736:40;720:57;:::i;:::-;711:66;;800:6;793:5;786:21;840:3;831:6;826:3;822:16;819:25;816:45;;;857:1;854;847:12;816:45;906:6;901:3;894:4;887:5;883:16;870:43;960:1;953:4;944:6;937:5;933:18;929:29;922:40;562:406;;;;;:::o;973:220::-;1015:5;1068:3;1061:4;1053:6;1049:17;1045:27;1035:55;;1086:1;1083;1076:12;1035:55;1108:79;1183:3;1174:6;1161:20;1154:4;1146:6;1142:17;1108:79;:::i;1198:661::-;1302:6;1310;1318;1326;1334;1387:3;1375:9;1366:7;1362:23;1358:33;1355:53;;;1404:1;1401;1394:12;1355:53;1443:9;1430:23;1462:31;1487:5;1462:31;:::i;:::-;1512:5;-1:-1:-1;1564:2:9;1549:18;;1536:32;;-1:-1:-1;1615:2:9;1600:18;;1587:32;;-1:-1:-1;1666:2:9;1651:18;;1638:32;;-1:-1:-1;1721:3:9;1706:19;;1693:33;-1:-1:-1;;;;;1738:30:9;;1735:50;;;1781:1;1778;1771:12;1735:50;1804:49;1845:7;1836:6;1825:9;1821:22;1804:49;:::i;:::-;1794:59;;;1198:661;;;;;;;;:::o;2117:180::-;2176:6;2229:2;2217:9;2208:7;2204:23;2200:32;2197:52;;;2245:1;2242;2235:12;2197:52;-1:-1:-1;2268:23:9;;2117:180;-1:-1:-1;2117:180:9:o;2484:255::-;2551:6;2604:2;2592:9;2583:7;2579:23;2575:32;2572:52;;;2620:1;2617;2610:12;2572:52;2659:9;2646:23;2678:31;2703:5;2678:31;:::i;2744:315::-;2812:6;2820;2873:2;2861:9;2852:7;2848:23;2844:32;2841:52;;;2889:1;2886;2879:12;2841:52;2928:9;2915:23;2947:31;2972:5;2947:31;:::i;:::-;2997:5;3049:2;3034:18;;;;3021:32;;-1:-1:-1;;;2744:315:9:o;3064:159::-;3131:20;;3191:6;3180:18;;3170:29;;3160:57;;3213:1;3210;3203:12;3160:57;3064:159;;;:::o;3228:184::-;3286:6;3339:2;3327:9;3318:7;3314:23;3310:32;3307:52;;;3355:1;3352;3345:12;3307:52;3378:28;3396:9;3378:28;:::i;3609:248::-;3677:6;3685;3738:2;3726:9;3717:7;3713:23;3709:32;3706:52;;;3754:1;3751;3744:12;3706:52;-1:-1:-1;;3777:23:9;;;3847:2;3832:18;;;3819:32;;-1:-1:-1;3609:248:9:o;3862:127::-;3923:10;3918:3;3914:20;3911:1;3904:31;3954:4;3951:1;3944:15;3978:4;3975:1;3968:15;3994:338;4136:2;4121:18;;4169:1;4158:13;;4148:144;;4214:10;4209:3;4205:20;4202:1;4195:31;4249:4;4246:1;4239:15;4277:4;4274:1;4267:15;4148:144;4301:25;;;3994:338;:::o;4337:1023::-;4468:6;4476;4484;4492;4500;4508;4516;4569:3;4557:9;4548:7;4544:23;4540:33;4537:53;;;4586:1;4583;4576:12;4537:53;4625:9;4612:23;4644:31;4669:5;4644:31;:::i;:::-;4694:5;-1:-1:-1;4746:2:9;4731:18;;4718:32;;-1:-1:-1;4797:2:9;4782:18;;4769:32;;-1:-1:-1;4848:2:9;4833:18;;4820:32;;-1:-1:-1;4903:3:9;4888:19;;4875:33;-1:-1:-1;;;;;4957:14:9;;;4954:34;;;4984:1;4981;4974:12;4954:34;5007:49;5048:7;5039:6;5028:9;5024:22;5007:49;:::i;:::-;4997:59;;5108:3;5097:9;5093:19;5080:33;5065:48;;5122:33;5147:7;5122:33;:::i;:::-;5174:7;;-1:-1:-1;5234:3:9;5219:19;;5206:33;;5251:16;;;5248:36;;;5280:1;5277;5270:12;5248:36;;5303:51;5346:7;5335:8;5324:9;5320:24;5303:51;:::i;:::-;5293:61;;;4337:1023;;;;;;;;;;:::o;5825:748::-;5936:6;5944;5952;5960;5968;5976;6029:3;6017:9;6008:7;6004:23;6000:33;5997:53;;;6046:1;6043;6036:12;5997:53;6085:9;6072:23;6104:31;6129:5;6104:31;:::i;:::-;6154:5;-1:-1:-1;6211:2:9;6196:18;;6183:32;6224:33;6183:32;6224:33;:::i;:::-;6276:7;-1:-1:-1;6302:37:9;6335:2;6320:18;;6302:37;:::i;:::-;6292:47;;6386:2;6375:9;6371:18;6358:32;6348:42;;6437:3;6426:9;6422:19;6409:33;6399:43;;6494:3;6483:9;6479:19;6466:33;6508;6533:7;6508:33;:::i;:::-;6560:7;6550:17;;;5825:748;;;;;;;;:::o;6763:594::-;6867:6;6875;6883;6891;6899;6952:3;6940:9;6931:7;6927:23;6923:33;6920:53;;;6969:1;6966;6959:12;6920:53;7005:9;6992:23;6982:33;;7062:2;7051:9;7047:18;7034:32;7024:42;;7113:2;7102:9;7098:18;7085:32;7075:42;;7164:2;7153:9;7149:18;7136:32;7126:42;;7219:3;7208:9;7204:19;7191:33;-1:-1:-1;;;;;7239:6:9;7236:30;7233:50;;;7279:1;7276;7269:12;7362:592;7457:6;7465;7473;7481;7534:3;7522:9;7513:7;7509:23;7505:33;7502:53;;;7551:1;7548;7541:12;7502:53;7590:9;7577:23;7609:31;7634:5;7609:31;:::i;:::-;7659:5;-1:-1:-1;7711:2:9;7696:18;;7683:32;;-1:-1:-1;7762:2:9;7747:18;;7734:32;;-1:-1:-1;7817:2:9;7802:18;;7789:32;-1:-1:-1;;;;;7833:30:9;;7830:50;;;7876:1;7873;7866:12;7830:50;7899:49;7940:7;7931:6;7920:9;7916:22;7899:49;:::i;:::-;7889:59;;;7362:592;;;;;;;:::o;8642:585::-;8720:6;8728;8781:2;8769:9;8760:7;8756:23;8752:32;8749:52;;;8797:1;8794;8787:12;8749:52;8836:9;8823:23;8855:31;8880:5;8855:31;:::i;:::-;8905:5;-1:-1:-1;8961:2:9;8946:18;;8933:32;-1:-1:-1;;;;;8977:30:9;;8974:50;;;9020:1;9017;9010:12;8974:50;9043:22;;9096:4;9088:13;;9084:27;-1:-1:-1;9074:55:9;;9125:1;9122;9115:12;9074:55;9148:73;9213:7;9208:2;9195:16;9190:2;9186;9182:11;9148:73;:::i;:::-;9138:83;;;8642:585;;;;;:::o;9642:251::-;9712:6;9765:2;9753:9;9744:7;9740:23;9736:32;9733:52;;;9781:1;9778;9771:12;9733:52;9813:9;9807:16;9832:31;9857:5;9832:31;:::i;9898:470::-;10100:2;10082:21;;;10139:2;10119:18;;;10112:30;10178:34;10173:2;10158:18;;10151:62;10249:34;10244:2;10229:18;;10222:62;-1:-1:-1;;;10315:3:9;10300:19;;10293:33;10358:3;10343:19;;9898:470::o;10373:127::-;10434:10;10429:3;10425:20;10422:1;10415:31;10465:4;10462:1;10455:15;10489:4;10486:1;10479:15;10505:972;10759:4;10807:3;10796:9;10792:19;10838:6;10827:9;10820:25;10864:2;10902:6;10897:2;10886:9;10882:18;10875:34;10945:3;10940:2;10929:9;10925:18;10918:31;10969:6;11004;10998:13;11035:6;11027;11020:22;11073:3;11062:9;11058:19;11051:26;;11112:2;11104:6;11100:15;11086:29;;11133:1;11143:195;11157:6;11154:1;11151:13;11143:195;;;11222:13;;-1:-1:-1;;;;;11218:39:9;11206:52;;11313:15;;;;11278:12;;;;11254:1;11172:9;11143:195;;;-1:-1:-1;;;;;;;11394:32:9;;;;11389:2;11374:18;;11367:60;-1:-1:-1;;;11458:3:9;11443:19;11436:35;11355:3;10505:972;-1:-1:-1;;;10505:972:9:o;11482:936::-;11577:6;11608:2;11651;11639:9;11630:7;11626:23;11622:32;11619:52;;;11667:1;11664;11657:12;11619:52;11700:9;11694:16;-1:-1:-1;;;;;11770:2:9;11762:6;11759:14;11756:34;;;11786:1;11783;11776:12;11756:34;11824:6;11813:9;11809:22;11799:32;;11869:7;11862:4;11858:2;11854:13;11850:27;11840:55;;11891:1;11888;11881:12;11840:55;11920:2;11914:9;11942:2;11938;11935:10;11932:36;;;11948:18;;:::i;:::-;11994:2;11991:1;11987:10;11977:20;;12017:28;12041:2;12037;12033:11;12017:28;:::i;:::-;12079:15;;;12149:11;;;12145:20;;;12110:12;;;;12177:19;;;12174:39;;;12209:1;12206;12199:12;12174:39;12233:11;;;;12253:135;12269:6;12264:3;12261:15;12253:135;;;12335:10;;12323:23;;12286:12;;;;12366;;;;12253:135;;;12407:5;11482:936;-1:-1:-1;;;;;;;;11482:936:9:o;13154:127::-;13215:10;13210:3;13206:20;13203:1;13196:31;13246:4;13243:1;13236:15;13270:4;13267:1;13260:15;13286:168;13326:7;13392:1;13388;13384:6;13380:14;13377:1;13374:21;13369:1;13362:9;13355:17;13351:45;13348:71;;;13399:18;;:::i;:::-;-1:-1:-1;13439:9:9;;13286:168::o;13459:217::-;13499:1;13525;13515:132;;13569:10;13564:3;13560:20;13557:1;13550:31;13604:4;13601:1;13594:15;13632:4;13629:1;13622:15;13515:132;-1:-1:-1;13661:9:9;;13459:217::o;13681:125::-;13721:4;13749:1;13746;13743:8;13740:34;;;13754:18;;:::i;:::-;-1:-1:-1;13791:9:9;;13681:125::o;13811:128::-;13851:3;13882:1;13878:6;13875:1;13872:13;13869:39;;;13888:18;;:::i;:::-;-1:-1:-1;13924:9:9;;13811:128::o;13944:184::-;14014:6;14067:2;14055:9;14046:7;14042:23;14038:32;14035:52;;;14083:1;14080;14073:12;14035:52;-1:-1:-1;14106:16:9;;13944:184;-1:-1:-1;13944:184:9:o;14513:277::-;14580:6;14633:2;14621:9;14612:7;14608:23;14604:32;14601:52;;;14649:1;14646;14639:12;14601:52;14681:9;14675:16;14734:5;14727:13;14720:21;14713:5;14710:32;14700:60;;14756:1;14753;14746:12;14795:356;14997:2;14979:21;;;15016:18;;;15009:30;15075:34;15070:2;15055:18;;15048:62;15142:2;15127:18;;14795:356::o;15564:398::-;15766:2;15748:21;;;15805:2;15785:18;;;15778:30;15844:34;15839:2;15824:18;;15817:62;-1:-1:-1;;;15910:2:9;15895:18;;15888:32;15952:3;15937:19;;15564:398::o;16729:400::-;16931:2;16913:21;;;16970:2;16950:18;;;16943:30;17009:34;17004:2;16989:18;;16982:62;-1:-1:-1;;;17075:2:9;17060:18;;17053:34;17119:3;17104:19;;16729:400::o;17892:274::-;-1:-1:-1;;;;;18084:32:9;;;;18066:51;;18148:2;18133:18;;18126:34;18054:2;18039:18;;17892:274::o;19090:258::-;19162:1;19172:113;19186:6;19183:1;19180:13;19172:113;;;19262:11;;;19256:18;19243:11;;;19236:39;19208:2;19201:10;19172:113;;;19303:6;19300:1;19297:13;19294:48;;;19338:1;19329:6;19324:3;19320:16;19313:27;19294:48;;19090:258;;;:::o;19353:581::-;19519:4;19565:1;19561;19556:3;19552:11;19548:19;19606:2;19598:6;19594:15;19583:9;19576:34;19658:2;19650:6;19646:15;19641:2;19630:9;19626:18;19619:43;;19698:2;19693;19682:9;19678:18;19671:30;19730:6;19724:13;19773:6;19768:2;19757:9;19753:18;19746:34;19789:67;19849:6;19843:3;19832:9;19828:19;19823:2;19815:6;19811:15;19789:67;:::i;:::-;19917:2;19896:15;-1:-1:-1;;19892:29:9;19877:45;;;;19924:3;19873:55;;19353:581;-1:-1:-1;;;;19353:581:9:o;25559:642::-;25830:3;25868:6;25862:13;25884:53;25930:6;25925:3;25918:4;25910:6;25906:17;25884:53;:::i;:::-;25959:16;;;;25984:21;;;-1:-1:-1;26032:4:9;26021:16;;26014:32;;;;26073:2;26062:14;;26055:30;;;;26112:2;26101:14;;26094:30;26151:3;26140:15;;26133:31;26191:3;26180:15;;25559:642;-1:-1:-1;25559:642:9:o;26617:415::-;26819:2;26801:21;;;26858:2;26838:18;;;26831:30;26897:34;26892:2;26877:18;;26870:62;-1:-1:-1;;;26963:2:9;26948:18;;26941:49;27022:3;27007:19;;26617:415::o;27454:::-;27656:2;27638:21;;;27695:2;27675:18;;;27668:30;27734:34;27729:2;27714:18;;27707:62;-1:-1:-1;;;27800:2:9;27785:18;;27778:49;27859:3;27844:19;;27454:415::o;28280:501::-;28467:3;28499:26;28495:31;28568:2;28559:6;28555:2;28551:15;28547:24;28542:3;28535:37;28623:2;28614:6;28610:2;28606:15;28602:24;28597:2;28592:3;28588:12;28581:46;;28656:6;28650:13;28672:62;28727:6;28722:2;28717:3;28713:12;28706:4;28698:6;28694:17;28672:62;:::i;:::-;28754:16;;;;28772:2;28750:25;;28280:501;-1:-1:-1;;;;28280:501:9:o
Swarm Source
ipfs://90aba2fc18c82091cd1bb5c63d63843b27d8aedf7fda2c3b28c60b34f9dd31c9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.