Source Code
Overview
POL Balance
0 POL
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 57,455 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Register Identit... | 11926573 | 9 mins ago | IN | 0 POL | 0.00973214 | ||||
Register Identit... | 11926567 | 10 mins ago | IN | 0 POL | 0.00919035 | ||||
Register Identit... | 11926566 | 10 mins ago | IN | 0 POL | 0.00973214 | ||||
Register Identit... | 11926563 | 10 mins ago | IN | 0 POL | 0.00918973 | ||||
Register Identit... | 11926268 | 20 mins ago | IN | 0 POL | 0.00973214 | ||||
Register Identit... | 11926268 | 20 mins ago | IN | 0 POL | 0.00973214 | ||||
Register Identit... | 11925965 | 31 mins ago | IN | 0 POL | 0.00973276 | ||||
Register Identit... | 11925965 | 31 mins ago | IN | 0 POL | 0.00918936 | ||||
Register Identit... | 11925965 | 31 mins ago | IN | 0 POL | 0.00973214 | ||||
Register Identit... | 11925960 | 31 mins ago | IN | 0 POL | 0.00918936 | ||||
Register Identit... | 11925665 | 42 mins ago | IN | 0 POL | 0.00973276 | ||||
Register Identit... | 11925660 | 42 mins ago | IN | 0 POL | 0.00919035 | ||||
Register Identit... | 11925660 | 42 mins ago | IN | 0 POL | 0.00973276 | ||||
Register Identit... | 11925655 | 42 mins ago | IN | 0 POL | 0.00919035 | ||||
Register Identit... | 11925361 | 52 mins ago | IN | 0 POL | 0.00919035 | ||||
Register Identit... | 11925361 | 52 mins ago | IN | 0 POL | 0.00973276 | ||||
Register Identit... | 11925360 | 52 mins ago | IN | 0 POL | 0.00973214 | ||||
Register Identit... | 11925352 | 53 mins ago | IN | 0 POL | 0.00918973 | ||||
Register Identit... | 11925057 | 1 hr ago | IN | 0 POL | 0.00973276 | ||||
Register Identit... | 11925057 | 1 hr ago | IN | 0 POL | 0.00918998 | ||||
Register Identit... | 11925057 | 1 hr ago | IN | 0 POL | 0.00973276 | ||||
Register Identit... | 11925052 | 1 hr ago | IN | 0 POL | 0.00918973 | ||||
Register Identit... | 11924758 | 1 hr ago | IN | 0 POL | 0.01304437 | ||||
Register Identit... | 11924758 | 1 hr ago | IN | 0 POL | 0.01381371 | ||||
Register Identit... | 11924756 | 1 hr ago | IN | 0 POL | 0.00973276 |
Latest 25 internal transactions (View All)
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Registry
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 { IERC20Token } from "./interfaces/IERC20Token.sol"; import { IHermesContract } from "./interfaces/IHermesContract.sol"; import { FundsRecovery } from "./FundsRecovery.sol"; import { Utils } from "./Utils.sol"; interface Channel { function initialize(address _token, address _dex, address _identityHash, address _hermesId, uint256 _fee) external; } contract Registry is FundsRecovery, Utils { using ECDSA for bytes32; uint256 public lastNonce; address payable public dex; // Any uniswap v2 compatible DEX router address uint256 public minimalHermesStake; Registry public parentRegistry; // If there is parent registry, we will check for struct Implementation { address channelImplAddress; address hermesImplAddress; } Implementation[] internal implementations; struct Hermes { address operator; // hermes operator who will sign promises uint256 implVer; // version of hermes implementation smart contract function() external view returns(uint256) stake; bytes url; // hermes service URL } mapping(address => Hermes) private hermeses; mapping(address => address) private identities; // key: identity, value: beneficiary wallet address event RegisteredIdentity(address indexed identity, address beneficiary); event RegisteredHermes(address indexed hermesId, address hermesOperator, bytes ur); event HermesURLUpdated(address indexed hermesId, bytes newURL); event ConsumerChannelCreated(address indexed identity, address indexed hermesId, address channelAddress); event BeneficiaryChanged(address indexed identity, address newBeneficiary); event MinimalHermesStakeChanged(uint256 newMinimalStake); // Reject any ethers sent to this smart-contract receive() external payable { revert("Registry: Rejecting tx with ethers sent"); } // We're using `initialize` instead of `constructor` to ensure easy way to deploy Registry into // deterministic address on any EVM compatible chain. Registry should be first be deployed using // `deployRegistry` scripts and then initialized with wanted token and implementations. function initialize(address _tokenAddress, address payable _dexAddress, uint256 _minimalHermesStake, address _channelImplementation, address _hermesImplementation, address payable _parentRegistry) public onlyOwner { require(!isInitialized(), "Registry: is already initialized"); minimalHermesStake = _minimalHermesStake; require(_tokenAddress != address(0)); token = IERC20Token(_tokenAddress); require(_dexAddress != address(0)); dex = _dexAddress; // Set initial channel implementations setImplementations(_channelImplementation, _hermesImplementation); // We set initial owner to be sure transferOwnership(msg.sender); // Set parent registry, if `0x0` then this is root registry parentRegistry = Registry(_parentRegistry); } function isInitialized() public view returns (bool) { return address(token) != address(0); } // Register provider and open his channel with given hermes // _stakeAmount - it's amount of tokens staked into hermes to guarantee incomming channel's balance. // _beneficiary - payout address during settlements in hermes channel, if provided 0x0 then will be set to consumer channel address. function registerIdentity(address _hermesId, uint256 _stakeAmount, uint256 _transactorFee, address _beneficiary, bytes memory _signature) public { require(isActiveHermes(_hermesId), "Registry: provided hermes have to be active"); // Check if given signature is valid address _identity = keccak256(abi.encodePacked(getChainID(), address(this), _hermesId, _stakeAmount, _transactorFee, _beneficiary)).recover(_signature); require(_identity != address(0), "Registry: wrong identity signature"); // Tokens amount to get from channel to cover tx fee and provider's stake uint256 _totalFee = _stakeAmount + _transactorFee; require(_totalFee <= token.balanceOf(getChannelAddress(_identity, _hermesId)), "Registry: not enought funds in channel to cover fees"); // Open consumer channel _openChannel(_identity, _hermesId, _beneficiary, _totalFee); // If stake is provided we additionally are opening channel with hermes (a.k.a provider channel) if (_stakeAmount > 0) { IHermesContract(_hermesId).openChannel(_identity, _stakeAmount); } // Pay fee for transaction maker if (_transactorFee > 0) { token.transfer(msg.sender, _transactorFee); } } // Deploys consumer channel and sets beneficiary as newly created channel address function openConsumerChannel(address _hermesId, uint256 _transactorFee, bytes memory _signature) public { require(isActiveHermes(_hermesId), "Registry: provided hermes have to be active"); // Check if given signature is valid address _identity = keccak256(abi.encodePacked(getChainID(), address(this), _hermesId, _transactorFee)).recover(_signature); require(_identity != address(0), "Registry: wrong channel openinig signature"); require(_transactorFee <= token.balanceOf(getChannelAddress(_identity, _hermesId)), "Registry: not enought funds in channel to cover fees"); _openChannel(_identity, _hermesId, address(0), _transactorFee); } // Allows to securely deploy channel's smart contract without consumer signature function openConsumerChannel(address _identity, address _hermesId) public { require(isActiveHermes(_hermesId), "Registry: provided hermes have to be active"); require(!isChannelOpened(_identity, _hermesId), "Registry: such consumer channel is already opened"); _openChannel(_identity, _hermesId, address(0), 0); } // Deploy payment channel for given consumer identity // We're using minimal proxy (EIP1167) to save on gas cost and blockchain space. function _openChannel(address _identity, address _hermesId, address _beneficiary, uint256 _fee) internal returns (address) { bytes32 _salt = keccak256(abi.encodePacked(_identity, _hermesId)); bytes memory _code = getProxyCode(getChannelImplementation(hermeses[_hermesId].implVer)); Channel _channel = Channel(deployMiniProxy(uint256(_salt), _code)); _channel.initialize(address(token), dex, _identity, _hermesId, _fee); emit ConsumerChannelCreated(_identity, _hermesId, address(_channel)); // If beneficiary was not provided, then we're going to use consumer channel for that if (_beneficiary == address(0)) { _beneficiary = address(_channel); } // Mark identity as registered (only during first channel opening) if (!isRegistered(_identity)) { identities[_identity] = _beneficiary; emit RegisteredIdentity(_identity, _beneficiary); } return address(_channel); } function registerHermes(address _hermesOperator, uint256 _hermesStake, uint16 _hermesFee, uint256 _minChannelStake, uint256 _maxChannelStake, bytes memory _url) public { require(isInitialized(), "Registry: only initialized registry can register hermeses"); require(_hermesOperator != address(0), "Registry: hermes operator can't be zero address"); require(_hermesStake >= minimalHermesStake, "Registry: hermes have to stake at least minimal stake amount"); address _hermesId = getHermesAddress(_hermesOperator); require(!isHermes(_hermesId), "Registry: hermes already registered"); // Deploy hermes contract (mini proxy which is pointing to implementation) IHermesContract _hermes = IHermesContract(deployMiniProxy(uint256(uint160(_hermesOperator)), getProxyCode(getHermesImplementation()))); // Transfer stake into hermes smart contract token.transferFrom(msg.sender, address(_hermes), _hermesStake); // Initialise hermes _hermes.initialize(address(token), _hermesOperator, _hermesFee, _minChannelStake, _maxChannelStake, dex); // Save info about newly created hermes hermeses[_hermesId] = Hermes(_hermesOperator, getLastImplVer(), _hermes.getStake, _url); // Approve hermes contract to `transferFrom` registry (used during hermes channel openings) token.approve(_hermesId, type(uint256).max); emit RegisteredHermes(_hermesId, _hermesOperator, _url); } function getChannelAddress(address _identity, address _hermesId) public view returns (address) { bytes32 _code = keccak256(getProxyCode(getChannelImplementation(hermeses[_hermesId].implVer))); bytes32 _salt = keccak256(abi.encodePacked(_identity, _hermesId)); return getCreate2Address(_salt, _code); } function getHermes(address _hermesId) public view returns (Hermes memory) { return isHermes(_hermesId) || !hasParentRegistry() ? hermeses[_hermesId] : parentRegistry.getHermes(_hermesId); } function getHermesAddress(address _hermesOperator) public view returns (address) { bytes32 _code = keccak256(getProxyCode(getHermesImplementation())); return getCreate2Address(bytes32(uint256(uint160(_hermesOperator))), _code); } function getHermesAddress(address _hermesOperator, uint256 _implVer) public view returns (address) { bytes32 _code = keccak256(getProxyCode(getHermesImplementation(_implVer))); return getCreate2Address(bytes32(uint256(uint160(_hermesOperator))), _code); } function getHermesURL(address _hermesId) public view returns (bytes memory) { return hermeses[_hermesId].url; } function updateHermesURL(address _hermesId, bytes memory _url, bytes memory _signature) public { require(isActiveHermes(_hermesId), "Registry: provided hermes has to be active"); // Check if given signature is valid address _operator = keccak256(abi.encodePacked(address(this), _hermesId, _url, lastNonce++)).recover(_signature); require(_operator == hermeses[_hermesId].operator, "wrong signature"); // Update URL hermeses[_hermesId].url = _url; emit HermesURLUpdated(_hermesId, _url); } // ------------ UTILS ------------ function getCreate2Address(bytes32 _salt, bytes32 _code) internal view returns (address) { return address(uint160(uint256(keccak256(abi.encodePacked( bytes1(0xff), address(this), bytes32(_salt), bytes32(_code) ))))); } function getProxyCode(address _implementation) public pure returns (bytes memory) { // `_code` is EIP 1167 - Minimal Proxy Contract // more information: https://eips.ethereum.org/EIPS/eip-1167 bytes memory _code = hex"3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91602b57fd5bf3"; bytes20 _targetBytes = bytes20(_implementation); for (uint8 i = 0; i < 20; i++) { _code[20 + i] = _targetBytes[i]; } return _code; } function deployMiniProxy(uint256 _salt, bytes memory _code) internal returns (address payable) { address payable _addr; assembly { _addr := create2(0, add(_code, 0x20), mload(_code), _salt) if iszero(extcodesize(_addr)) { revert(0, 0) } } return _addr; } function getBeneficiary(address _identity) public view returns (address) { if (hasParentRegistry()) return parentRegistry.getBeneficiary(_identity); return identities[_identity]; } function setBeneficiary(address _identity, address _newBeneficiary, bytes memory _signature) public { require(_newBeneficiary != address(0), "Registry: beneficiary can't be zero address"); // Always set beneficiary into root registry if (hasParentRegistry()) { parentRegistry.setBeneficiary(_identity, _newBeneficiary, _signature); } else { lastNonce = lastNonce + 1; // In signatures we should always use root registry (for backward compatibility) address _rootRegistry = hasParentRegistry() ? address(parentRegistry) : address(this); address _signer = keccak256(abi.encodePacked(getChainID(), _rootRegistry, _identity, _newBeneficiary, lastNonce)).recover(_signature); require(_signer == _identity, "Registry: have to be signed by identity owner"); identities[_identity] = _newBeneficiary; emit BeneficiaryChanged(_identity, _newBeneficiary); } } function setMinimalHermesStake(uint256 _newMinimalStake) public onlyOwner { require(isInitialized(), "Registry: only initialized registry can set new minimal hermes stake"); minimalHermesStake = _newMinimalStake; emit MinimalHermesStakeChanged(_newMinimalStake); } // -------- UTILS TO WORK WITH CHANNEL AND HERMES IMPLEMENTATIONS --------- function getChannelImplementation() public view returns (address) { return implementations[getLastImplVer()].channelImplAddress; } function getChannelImplementation(uint256 _implVer) public view returns (address) { return implementations[_implVer].channelImplAddress; } function getHermesImplementation() public view returns (address) { return implementations[getLastImplVer()].hermesImplAddress; } function getHermesImplementation(uint256 _implVer) public view returns (address) { return implementations[_implVer].hermesImplAddress; } function setImplementations(address _newChannelImplAddress, address _newHermesImplAddress) public onlyOwner { require(isInitialized(), "Registry: only initialized registry can set new implementations"); require(isSmartContract(_newChannelImplAddress) && isSmartContract(_newHermesImplAddress), "Registry: implementations have to be smart contracts"); implementations.push(Implementation(_newChannelImplAddress, _newHermesImplAddress)); } // Version of latest hermes and channel implementations function getLastImplVer() public view returns (uint256) { return implementations.length-1; } // ------------------------------------------------------------------------ function isSmartContract(address _addr) internal view returns (bool) { uint _codeLength; assembly { _codeLength := extcodesize(_addr) } return _codeLength != 0; } // If `parentRegistry` is not set, this is root registry and should return false function hasParentRegistry() public view returns (bool) { return address(parentRegistry) != address(0); } function isRegistered(address _identity) public view returns (bool) { if (hasParentRegistry()) return parentRegistry.isRegistered(_identity); // If we know its beneficiary address it is registered identity return identities[_identity] != address(0); } function isHermes(address _hermesId) public view returns (bool) { // To check if it actually properly created hermes address, we need to check if he has operator // and if with that operator we'll get proper hermes address which has code deployed there. address _hermesOperator = hermeses[_hermesId].operator; uint256 _implVer = hermeses[_hermesId].implVer; address _addr = getHermesAddress(_hermesOperator, _implVer); if (_addr != _hermesId) return false; // hermesId should be same as generated address return isSmartContract(_addr) || parentRegistry.isHermes(_hermesId); } function isActiveHermes(address _hermesId) internal view returns (bool) { // First we have to ensure that given address is registered hermes and only then check its status require(isHermes(_hermesId), "Registry: hermes have to be registered"); IHermesContract.Status status = IHermesContract(_hermesId).getStatus(); return status == IHermesContract.Status.Active; } function isChannelOpened(address _identity, address _hermesId) public view returns (bool) { return isSmartContract(getChannelAddress(_identity, _hermesId)) || isSmartContract(parentRegistry.getChannelAddress(_identity, _hermesId)); } function transferCollectedFeeTo(address _beneficiary) public onlyOwner{ uint256 _collectedFee = token.balanceOf(address(this)); require(_collectedFee > 0, "collected fee cannot be less than zero"); token.transfer(_beneficiary, _collectedFee); } }
// 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.7.6; interface IHermesContract { enum Status { Active, Paused, Punishment, Closed } function initialize(address _token, address _operator, uint16 _hermesFee, uint256 _minStake, uint256 _maxStake, address payable _routerAddress) external; function openChannel(address _party, uint256 _amountToLend) external; function getOperator() external view returns (address); function getStake() external view returns (uint256); function getStatus() external view returns (Status); }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "london", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"identity","type":"address"},{"indexed":false,"internalType":"address","name":"newBeneficiary","type":"address"}],"name":"BeneficiaryChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"identity","type":"address"},{"indexed":true,"internalType":"address","name":"hermesId","type":"address"},{"indexed":false,"internalType":"address","name":"channelAddress","type":"address"}],"name":"ConsumerChannelCreated","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":true,"internalType":"address","name":"hermesId","type":"address"},{"indexed":false,"internalType":"bytes","name":"newURL","type":"bytes"}],"name":"HermesURLUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinimalStake","type":"uint256"}],"name":"MinimalHermesStakeChanged","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":"hermesId","type":"address"},{"indexed":false,"internalType":"address","name":"hermesOperator","type":"address"},{"indexed":false,"internalType":"bytes","name":"ur","type":"bytes"}],"name":"RegisteredHermes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"identity","type":"address"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"}],"name":"RegisteredIdentity","type":"event"},{"inputs":[],"name":"claimEthers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dex","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"}],"name":"getBeneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_hermesId","type":"address"}],"name":"getChannelAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_implVer","type":"uint256"}],"name":"getChannelImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChannelImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundsDestination","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"}],"name":"getHermes","outputs":[{"components":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"implVer","type":"uint256"},{"internalType":"function () view external returns (uint256)","name":"stake","type":"function"},{"internalType":"bytes","name":"url","type":"bytes"}],"internalType":"struct Registry.Hermes","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesOperator","type":"address"},{"internalType":"uint256","name":"_implVer","type":"uint256"}],"name":"getHermesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesOperator","type":"address"}],"name":"getHermesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_implVer","type":"uint256"}],"name":"getHermesImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHermesImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"}],"name":"getHermesURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastImplVer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"getProxyCode","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"hasParentRegistry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address payable","name":"_dexAddress","type":"address"},{"internalType":"uint256","name":"_minimalHermesStake","type":"uint256"},{"internalType":"address","name":"_channelImplementation","type":"address"},{"internalType":"address","name":"_hermesImplementation","type":"address"},{"internalType":"address payable","name":"_parentRegistry","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_hermesId","type":"address"}],"name":"isChannelOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"}],"name":"isHermes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimalHermesStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"openConsumerChannel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_hermesId","type":"address"}],"name":"openConsumerChannel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parentRegistry","outputs":[{"internalType":"contract Registry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesOperator","type":"address"},{"internalType":"uint256","name":"_hermesStake","type":"uint256"},{"internalType":"uint16","name":"_hermesFee","type":"uint16"},{"internalType":"uint256","name":"_minChannelStake","type":"uint256"},{"internalType":"uint256","name":"_maxChannelStake","type":"uint256"},{"internalType":"bytes","name":"_url","type":"bytes"}],"name":"registerHermes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"},{"internalType":"uint256","name":"_stakeAmount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"registerIdentity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_newBeneficiary","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newDestination","type":"address"}],"name":"setFundsDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newChannelImplAddress","type":"address"},{"internalType":"address","name":"_newHermesImplAddress","type":"address"}],"name":"setImplementations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMinimalStake","type":"uint256"}],"name":"setMinimalHermesStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"transferCollectedFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"},{"internalType":"bytes","name":"_url","type":"bytes"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"updateHermesURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b5060018055613725806100246000396000f3fe6080604052600436106102295760003560e01c8063acc831d011610123578063d16f38c8116100ab578063e617aaac1161006f578063e617aaac146106c5578063f2fde38b146106e5578063f58c5b6e14610705578063fc0c546a14610723578063ff9935cb1461074357600080fd5b8063d16f38c814610618578063d5929fe314610638578063df8de3e714610658578063e0b6c32314610678578063e3252537146106a557600080fd5b8063c957543b116100f2578063c957543b14610578578063c9b84d4d14610598578063cdd596e0146105b8578063cf10c969146105d8578063d0171d79146105f857600080fd5b8063acc831d0146104f8578063add10dda14610518578063bf1eb88a14610538578063c3c5a5471461055857600080fd5b80636332b080116101b157806385bff3411161017557806385bff341146104585780638cfef547146104785780638da5cb5b146104985780639936a87b146104b6578063ab867213146104cb57600080fd5b80636332b080146103e357806366cf5875146103f8578063692058c21461040e5780636931b5501461042e5780637c671a211461044357600080fd5b806341ca71ab116101f857806341ca71ab146103275780634787d09c1461035f5780634b6bd6be1461037f578063505a1b311461039f57806352631ab4146103bf57600080fd5b806304614e0b146102905780631de9db40146102b2578063238e130a146102e7578063392e53cd1461030757600080fd5b3661028b5760405162461bcd60e51b815260206004820152602760248201527f52656769737472793a2052656a656374696e67207478207769746820657468656044820152661c9cc81cd95b9d60ca1b60648201526084015b60405180910390fd5b600080fd5b34801561029c57600080fd5b506102b06102ab366004612f01565b610763565b005b3480156102be57600080fd5b506102d26102cd366004612f5a565b61091c565b60405190151581526020015b60405180910390f35b3480156102f357600080fd5b506102b0610302366004612f93565b6109c5565b34801561031357600080fd5b506003546001600160a01b031615156102d2565b34801561033357600080fd5b50610347610342366004612fb0565b610a72565b6040516001600160a01b0390911681526020016102de565b34801561036b57600080fd5b506102b061037a366004612f5a565b610aa7565b34801561038b57600080fd5b5061034761039a366004612fc9565b610b4f565b3480156103ab57600080fd5b506103476103ba366004612f93565b610b83565b3480156103cb57600080fd5b506103d560045481565b6040519081526020016102de565b3480156103ef57600080fd5b506103d5610c40565b34801561040457600080fd5b506103d560065481565b34801561041a57600080fd5b50600554610347906001600160a01b031681565b34801561043a57600080fd5b506102b0610c57565b34801561044f57600080fd5b50610347610d04565b34801561046457600080fd5b506102b0610473366004612f5a565b610d3f565b34801561048457600080fd5b50610347610493366004612fb0565b610f16565b3480156104a457600080fd5b506000546001600160a01b0316610347565b3480156104c257600080fd5b50610347610f4e565b3480156104d757600080fd5b506104eb6104e6366004612f93565b610f8c565b6040516102de9190613051565b34801561050457600080fd5b50610347610513366004612f93565b611029565b34801561052457600080fd5b506102b0610533366004613064565b611054565b34801561054457600080fd5b506104eb610553366004612f93565b6111c7565b34801561056457600080fd5b506102d2610573366004612f93565b611276565b34801561058457600080fd5b506102b0610593366004612fb0565b61132f565b3480156105a457600080fd5b50600754610347906001600160a01b031681565b3480156105c457600080fd5b506102d26105d3366004612f93565b611434565b3480156105e457600080fd5b506102b06105f33660046130d0565b61151a565b34801561060457600080fd5b506102b0610613366004613146565b6117c2565b34801561062457600080fd5b506007546001600160a01b031615156102d2565b34801561064457600080fd5b506102b0610653366004613192565b611a10565b34801561066457600080fd5b506102b0610673366004612f93565b611ebc565b34801561068457600080fd5b50610698610693366004612f93565b6120a0565b6040516102de9190613217565b3480156106b157600080fd5b506102b06106c0366004612f93565b612264565b3480156106d157600080fd5b506103476106e0366004612f5a565b612405565b3480156106f157600080fd5b506102b0610700366004612f93565b61248e565b34801561071157600080fd5b506002546001600160a01b0316610347565b34801561072f57600080fd5b50600354610347906001600160a01b031681565b34801561074f57600080fd5b506102b061075e366004613263565b61258c565b61076c836126bb565b6107885760405162461bcd60e51b8152600401610282906132dc565b60006107ec82466040805160208101929092526001600160601b031930606090811b8216928401929092529088901b166054820152606881018690526088015b604051602081830303815290604052805190602001206127b290919063ffffffff16565b90506001600160a01b0381166108575760405162461bcd60e51b815260206004820152602a60248201527f52656769737472793a2077726f6e67206368616e6e656c206f70656e696e6967604482015269207369676e617475726560b01b6064820152608401610282565b6003546001600160a01b03166370a082316108728387612405565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156108b157600080fd5b505afa1580156108c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e99190613327565b8311156109085760405162461bcd60e51b815260040161028290613340565b61091581856000866127d6565b5050505050565b600061093161092b8484612405565b3b151590565b806109be5750600754604051633985eaab60e21b81526001600160a01b03858116600483015284811660248301526109be92169063e617aaac9060440160206040518083038186803b15801561098657600080fd5b505afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092b9190613394565b9392505050565b6000546001600160a01b03163314806109e757506000546001600160a01b0316155b610a035760405162461bcd60e51b8152600401610282906133b1565b6001600160a01b038116610a1657600080fd5b6002546040516001600160a01b038084169216907fe1a66d77649cf0a57b9937073549f30f1c82bb865aaf066d2f299e37a62c6aad90600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b600060088281548110610a8757610a876133e6565b60009182526020909120600290910201546001600160a01b031692915050565b610ab0816126bb565b610acc5760405162461bcd60e51b8152600401610282906132dc565b610ad6828261091c565b15610b3d5760405162461bcd60e51b815260206004820152603160248201527f52656769737472793a207375636820636f6e73756d6572206368616e6e656c206044820152701a5cc8185b1c9958591e481bdc195b9959607a1b6064820152608401610282565b610b4a82826000806127d6565b505050565b600080610b5e6104e684610f16565b80516020909101209050610b7b6001600160a01b038516826129b0565b949350505050565b6000610b996007546001600160a01b0316151590565b15610c215760075460405163505a1b3160e01b81526001600160a01b0384811660048301529091169063505a1b319060240160206040518083038186803b158015610be357600080fd5b505afa158015610bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613394565b92915050565b506001600160a01b039081166000908152600a60205260409020541690565b600854600090610c5290600190613412565b905090565b60026001541415610caa5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610282565b60026001819055546001600160a01b0316610cc457600080fd5b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610cfd573d6000803e3d6000fd5b5060018055565b60006008610d10610c40565b81548110610d2057610d206133e6565b60009182526020909120600290910201546001600160a01b0316919050565b6000546001600160a01b0316331480610d6157506000546001600160a01b0316155b610d7d5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b0316610dfb5760405162461bcd60e51b815260206004820152603f60248201527f52656769737472793a206f6e6c7920696e697469616c697a656420726567697360448201527f7472792063616e20736574206e657720696d706c656d656e746174696f6e73006064820152608401610282565b813b15158015610e0b5750803b15155b610e745760405162461bcd60e51b815260206004820152603460248201527f52656769737472793a20696d706c656d656e746174696f6e73206861766520746044820152736f20626520736d61727420636f6e74726163747360601b6064820152608401610282565b604080518082019091526001600160a01b0392831681529082166020820190815260088054600181018255600091909152915160029092027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3810180549385166001600160a01b031994851617905590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee49091018054919093169116179055565b600060088281548110610f2b57610f2b6133e6565b60009182526020909120600160029092020101546001600160a01b031692915050565b60006008610f5a610c40565b81548110610f6a57610f6a6133e6565b60009182526020909120600160029092020101546001600160a01b0316919050565b606060006040518060600160405280603781526020016136b9603791399050606083901b60005b60148160ff16101561102057818160ff1660148110610fd457610fd46133e6565b1a60f81b83610fe4836014613429565b60ff1681518110610ff757610ff76133e6565b60200101906001600160f81b031916908160001a905350806110188161344e565b915050610fb3565b50909392505050565b6000806110376104e6610f4e565b805160209091012090506109be6001600160a01b038416826129b0565b61105d836126bb565b6110bc5760405162461bcd60e51b815260206004820152602a60248201527f52656769737472793a2070726f7669646564206865726d65732068617320746f6044820152692062652061637469766560b01b6064820152608401610282565b60006110ef82308686600460008154809291906110d89061346e565b919050556040516020016107c89493929190613489565b6001600160a01b038086166000908152600960205260409020549192508083169116146111505760405162461bcd60e51b815260206004820152600f60248201526e77726f6e67207369676e617475726560881b6044820152606401610282565b6001600160a01b0384166000908152600960209081526040909120845161117f92600390920191860190612d65565b50836001600160a01b03167fd8c638c85547b8717e0d5ca292cff6dbe8fc02fa6e6863a047971c39511643c7846040516111b99190613051565b60405180910390a250505050565b6001600160a01b03811660009081526009602052604090206003018054606091906111f1906134d6565b80601f016020809104026020016040519081016040528092919081815260200182805461121d906134d6565b801561126a5780601f1061123f5761010080835404028352916020019161126a565b820191906000526020600020905b81548152906001019060200180831161124d57829003601f168201915b50505050509050919050565b600061128c6007546001600160a01b0316151590565b1561130e5760075460405163c3c5a54760e01b81526001600160a01b0384811660048301529091169063c3c5a5479060240160206040518083038186803b1580156112d657600080fd5b505afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613511565b506001600160a01b039081166000908152600a602052604090205416151590565b6000546001600160a01b031633148061135157506000546001600160a01b0316155b61136d5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b03166113f95760405162461bcd60e51b8152602060048201526044602482018190527f52656769737472793a206f6e6c7920696e697469616c697a6564207265676973908201527f7472792063616e20736574206e6577206d696e696d616c206865726d6573207360648201526374616b6560e01b608482015260a401610282565b60068190556040518181527f645a9c74d34a0b1095b113252ad5e9afa0373f15b4b21760fb3a24b4b9d1ec309060200160405180910390a150565b6001600160a01b038082166000908152600960205260408120805460019091015491921690826114648383610b4f565b9050846001600160a01b0316816001600160a01b03161461148a57506000949350505050565b803b151580611511575060075460405163066eacb760e51b81526001600160a01b0387811660048301529091169063cdd596e09060240160206040518083038186803b1580156114d957600080fd5b505afa1580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115119190613511565b95945050505050565b611523856126bb565b61153f5760405162461bcd60e51b8152600401610282906132dc565b600061159482466040805160208101929092526001600160601b031930606090811b8216928401929092528a821b81166054840152606883018a9052608883018990529087901b1660a882015260bc016107c8565b90506001600160a01b0381166115f75760405162461bcd60e51b815260206004820152602260248201527f52656769737472793a2077726f6e67206964656e74697479207369676e617475604482015261726560f01b6064820152608401610282565b60006116038587613533565b6003549091506001600160a01b03166370a08231611621848a612405565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561166057600080fd5b505afa158015611674573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116989190613327565b8111156116b75760405162461bcd60e51b815260040161028290613340565b6116c3828886846127d6565b50851561172d576040516324f453d160e01b81526001600160a01b038381166004830152602482018890528816906324f453d190604401600060405180830381600087803b15801561171457600080fd5b505af1158015611728573d6000803e3d6000fd5b505050505b84156117b95760035460405163a9059cbb60e01b8152336004820152602481018790526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561177f57600080fd5b505af1158015611793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b79190613511565b505b50505050505050565b6001600160a01b03821661182c5760405162461bcd60e51b815260206004820152602b60248201527f52656769737472793a2062656e65666963696172792063616e2774206265207a60448201526a65726f206164647265737360a81b6064820152608401610282565b6007546001600160a01b03161561189f5760075460405163d0171d7960e01b81526001600160a01b039091169063d0171d79906118719086908690869060040161354b565b600060405180830381600087803b15801561188b57600080fd5b505af11580156117b9573d6000803e3d6000fd5b6004546118ad906001613533565b60045560006118c66007546001600160a01b0316151590565b6118d057306118dd565b6007546001600160a01b03165b9050600061192d83466004546040805160208101939093526001600160601b0319606088811b8216928501929092528a821b811660548501529089901b166068830152607c820152609c016107c8565b9050846001600160a01b0316816001600160a01b0316146119a65760405162461bcd60e51b815260206004820152602d60248201527f52656769737472793a206861766520746f206265207369676e6564206279206960448201526c3232b73a34ba3c9037bbb732b960991b6064820152608401610282565b6001600160a01b038581166000818152600a602090815260409182902080546001600160a01b0319169489169485179055905192835290917f768099735d1c322a05a5b9d7b76d99682a1833d3f7055e5ede25e0f2eeaa8c6d910160405180910390a25050505050565b6003546001600160a01b0316611a8e5760405162461bcd60e51b815260206004820152603960248201527f52656769737472793a206f6e6c7920696e697469616c697a656420726567697360448201527f7472792063616e207265676973746572206865726d65736573000000000000006064820152608401610282565b6001600160a01b038616611afc5760405162461bcd60e51b815260206004820152602f60248201527f52656769737472793a206865726d6573206f70657261746f722063616e27742060448201526e6265207a65726f206164647265737360881b6064820152608401610282565b600654851015611b745760405162461bcd60e51b815260206004820152603c60248201527f52656769737472793a206865726d6573206861766520746f207374616b65206160448201527f74206c65617374206d696e696d616c207374616b6520616d6f756e74000000006064820152608401610282565b6000611b7f87611029565b9050611b8a81611434565b15611be35760405162461bcd60e51b815260206004820152602360248201527f52656769737472793a206865726d657320616c726561647920726567697374656044820152621c995960ea1b6064820152608401610282565b6000611c02886001600160a01b0316611bfd6104e6610f4e565b612a01565b6003546040516323b872dd60e01b81523360048201526001600160a01b038084166024830152604482018b90529293509116906323b872dd90606401602060405180830381600087803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c909190613511565b5060035460055460405163699a088560e01b81526001600160a01b0392831660048201528a8316602482015261ffff89166044820152606481018890526084810187905290821660a48201529082169063699a08859060c401600060405180830381600087803b158015611d0357600080fd5b505af1158015611d17573d6000803e3d6000fd5b505050506040518060800160405280896001600160a01b03168152602001611d3d610c40565b815263fc0e3d90602084811b640100000000600160c01b0390811692909217604090811b828501529283018790526001600160a01b03868116600090815260098352849020855181546001600160a01b0319169216919091178155848201516001820155848401516002820180546001600160c01b03191663ffffffff9290961c91821691909416179390931790915560608301518051611de49260038501920190612d65565b505060035460405163095ea7b360e01b81526001600160a01b0385811660048301526000196024830152909116915063095ea7b390604401602060405180830381600087803b158015611e3657600080fd5b505af1158015611e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6e9190613511565b50816001600160a01b03167ff06d60cc2f463635fd237ad87f1d007af54840b82e7e4561707b1be63d91c2608985604051611eaa929190613577565b60405180910390a25050505050505050565b60026001541415611f0f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610282565b60026001819055546001600160a01b0316611f2957600080fd5b6003546001600160a01b0382811691161415611f955760405162461bcd60e51b815260206004820152602560248201527f6e617469766520746f6b656e2066756e64732063616e2774206265207265636f6044820152641d995c995960da1b6064820152608401610282565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015611fd757600080fd5b505afa158015611feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200f9190613327565b60025460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561205f57600080fd5b505af1158015612073573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120979190613511565b50506001805550565b60408051608081018252600080825260208201819052918101919091526060808201526120cc82611434565b806120e057506007546001600160a01b0316155b61216a5760075460405163e0b6c32360e01b81526001600160a01b0384811660048301529091169063e0b6c3239060240160006040518083038186803b15801561212957600080fd5b505afa15801561213d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612165919081019061359b565b610c1b565b6001600160a01b038083166000908152600960209081526040918290208251608081018452815490941684526001810154918401919091526002810154640100000000600160c01b03811663ffffffff90911617821b918301919091526003810180546060840191906121dc906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612208906134d6565b80156122555780601f1061222a57610100808354040283529160200191612255565b820191906000526020600020905b81548152906001019060200180831161223857829003601f168201915b50505050508152505092915050565b6000546001600160a01b031633148061228657506000546001600160a01b0316155b6122a25760405162461bcd60e51b8152600401610282906133b1565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156122e657600080fd5b505afa1580156122fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231e9190613327565b90506000811161237f5760405162461bcd60e51b815260206004820152602660248201527f636f6c6c6563746564206665652063616e6e6f74206265206c657373207468616044820152656e207a65726f60d01b6064820152608401610282565b60035460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b1580156123cd57600080fd5b505af11580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a9190613511565b6001600160a01b0381166000908152600960205260408120600101548190612430906104e690610a72565b8051906020012090506000848460405160200161246c929190606092831b6001600160601b031990811682529190921b16601482015260280190565b60405160208183030381529060405280519060200120905061151181836129b0565b6000546001600160a01b03163314806124b057506000546001600160a01b0316155b6124cc5760405162461bcd60e51b8152600401610282906133b1565b6001600160a01b0381166125315760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610282565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806125ae57506000546001600160a01b0316155b6125ca5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b0316156126235760405162461bcd60e51b815260206004820181905260248201527f52656769737472793a20697320616c726561647920696e697469616c697a65646044820152606401610282565b60068490556001600160a01b03861661263b57600080fd5b600380546001600160a01b0319166001600160a01b0388811691909117909155851661266657600080fd5b600580546001600160a01b0319166001600160a01b03871617905561268b8383610d3f565b6126943361248e565b600780546001600160a01b0319166001600160a01b03929092169190911790555050505050565b60006126c682611434565b6127215760405162461bcd60e51b815260206004820152602660248201527f52656769737472793a206865726d6573206861766520746f20626520726567696044820152651cdd195c995960d21b6064820152608401610282565b6000826001600160a01b0316634e69d5606040518163ffffffff1660e01b815260040160206040518083038186803b15801561275c57600080fd5b505afa158015612770573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127949190613681565b905060008160038111156127aa576127aa6136a2565b149392505050565b60008060006127c18585612a1b565b915091506127ce81612a8b565b509392505050565b6040516001600160601b0319606086811b8216602084015285901b1660348201526000908190604801604051602081830303815290604052805190602001209050600061284d6104e660096000896001600160a01b03166001600160a01b0316815260200190815260200160002060010154610a72565b9050600061285b8383612a01565b600354600554604051637b809f7b60e11b81526001600160a01b03928316600482015290821660248201528a8216604482015289821660648201526084810188905291925082169063f7013ef69060a401600060405180830381600087803b1580156128c657600080fd5b505af11580156128da573d6000803e3d6000fd5b50506040516001600160a01b038481168252808b1693508b1691507f2ed7bcf2ff03098102c7003d7ce2a633e4b49b8198b07de5383cdf4c0ab9228b9060200160405180910390a36001600160a01b038616612934578095505b61293d88611276565b6129a5576001600160a01b038881166000818152600a602090815260409182902080546001600160a01b031916948b169485179055905192835290917fefaf768237c22e140a862d5d375ad5c153479fac3f8bcf8b580a1651fd62c3ef910160405180910390a25b979650505050505050565b604080516001600160f81b03196020808301919091523060601b6001600160601b03191660218301526035820194909452605580820193909352815180820390930183526075019052805191012090565b600080838351602085016000f59050803b6109be57600080fd5b600080825160411415612a525760208301516040840151606085015160001a612a4687828585612c49565b94509450505050612a84565b825160401415612a7c5760208301516040840151612a71868383612d36565b935093505050612a84565b506000905060025b9250929050565b6000816004811115612a9f57612a9f6136a2565b1415612aa85750565b6001816004811115612abc57612abc6136a2565b1415612b0a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610282565b6002816004811115612b1e57612b1e6136a2565b1415612b6c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610282565b6003816004811115612b8057612b806136a2565b1415612bd95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610282565b6004816004811115612bed57612bed6136a2565b1415612c465760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610282565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c805750600090506003612d2d565b8460ff16601b14158015612c9857508460ff16601c14155b15612ca95750600090506004612d2d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612cfd573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d2657600060019250925050612d2d565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612d5787828885612c49565b935093505050935093915050565b828054612d71906134d6565b90600052602060002090601f016020900481019282612d935760008555612dd9565b82601f10612dac57805160ff1916838001178555612dd9565b82800160010185558215612dd9579182015b82811115612dd9578251825591602001919060010190612dbe565b50612de5929150612de9565b5090565b5b80821115612de55760008155600101612dea565b6001600160a01b0381168114612c4657600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715612e4c57612e4c612e13565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e7b57612e7b612e13565b604052919050565b600067ffffffffffffffff821115612e9d57612e9d612e13565b50601f01601f191660200190565b600082601f830112612ebc57600080fd5b8135612ecf612eca82612e83565b612e52565b818152846020838601011115612ee457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215612f1657600080fd5b8335612f2181612dfe565b925060208401359150604084013567ffffffffffffffff811115612f4457600080fd5b612f5086828701612eab565b9150509250925092565b60008060408385031215612f6d57600080fd5b8235612f7881612dfe565b91506020830135612f8881612dfe565b809150509250929050565b600060208284031215612fa557600080fd5b81356109be81612dfe565b600060208284031215612fc257600080fd5b5035919050565b60008060408385031215612fdc57600080fd5b8235612fe781612dfe565b946020939093013593505050565b60005b83811015613010578181015183820152602001612ff8565b8381111561301f576000848401525b50505050565b6000815180845261303d816020860160208601612ff5565b601f01601f19169290920160200192915050565b6020815260006109be6020830184613025565b60008060006060848603121561307957600080fd5b833561308481612dfe565b9250602084013567ffffffffffffffff808211156130a157600080fd5b6130ad87838801612eab565b935060408601359150808211156130c357600080fd5b50612f5086828701612eab565b600080600080600060a086880312156130e857600080fd5b85356130f381612dfe565b94506020860135935060408601359250606086013561311181612dfe565b9150608086013567ffffffffffffffff81111561312d57600080fd5b61313988828901612eab565b9150509295509295909350565b60008060006060848603121561315b57600080fd5b833561316681612dfe565b9250602084013561317681612dfe565b9150604084013567ffffffffffffffff811115612f4457600080fd5b60008060008060008060c087890312156131ab57600080fd5b86356131b681612dfe565b955060208701359450604087013561ffff811681146131d457600080fd5b9350606087013592506080870135915060a087013567ffffffffffffffff8111156131fe57600080fd5b61320a89828a01612eab565b9150509295509295509295565b6020815260018060a01b0382511660208201526020820151604082015267ffffffffffffffff19604083015116606082015260006060830151608080840152610b7b60a0840182613025565b60008060008060008060c0878903121561327c57600080fd5b863561328781612dfe565b9550602087013561329781612dfe565b94506040870135935060608701356132ae81612dfe565b925060808701356132be81612dfe565b915060a08701356132ce81612dfe565b809150509295509295509295565b6020808252602b908201527f52656769737472793a2070726f7669646564206865726d65732068617665207460408201526a6f2062652061637469766560a81b606082015260800190565b60006020828403121561333957600080fd5b5051919050565b60208082526034908201527f52656769737472793a206e6f7420656e6f756768742066756e647320696e206360408201527368616e6e656c20746f20636f766572206665657360601b606082015260800190565b6000602082840312156133a657600080fd5b81516109be81612dfe565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015613424576134246133fc565b500390565b600060ff821660ff84168060ff03821115613446576134466133fc565b019392505050565b600060ff821660ff811415613465576134656133fc565b60010192915050565b6000600019821415613482576134826133fc565b5060010190565b60006bffffffffffffffffffffffff19808760601b168352808660601b1660148401525083516134c0816028850160208801612ff5565b6028920191820192909252604801949350505050565b600181811c908216806134ea57607f821691505b6020821081141561350b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561352357600080fd5b815180151581146109be57600080fd5b60008219821115613546576135466133fc565b500190565b6001600160a01b0384811682528316602082015260606040820181905260009061151190830184613025565b6001600160a01b0383168152604060208201819052600090610b7b90830184613025565b600060208083850312156135ae57600080fd5b825167ffffffffffffffff808211156135c657600080fd5b90840190608082870312156135da57600080fd5b6135e2612e29565b82516135ed81612dfe565b81528284015184820152604083015167ffffffffffffffff198116811461361357600080fd5b604082015260608301518281111561362a57600080fd5b80840193505086601f84011261363f57600080fd5b8251915061364f612eca83612e83565b828152878584860101111561366357600080fd5b61367283868301878701612ff5565b60608201529695505050505050565b60006020828403121561369357600080fd5b8151600481106109be57600080fd5b634e487b7160e01b600052602160045260246000fdfe3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91602b57fd5bf3a264697066735822122036219ab918a429fdce341f2929073e190befbb7c069166e8b963bcc654c35c7664736f6c63430008090033
Deployed Bytecode
0x6080604052600436106102295760003560e01c8063acc831d011610123578063d16f38c8116100ab578063e617aaac1161006f578063e617aaac146106c5578063f2fde38b146106e5578063f58c5b6e14610705578063fc0c546a14610723578063ff9935cb1461074357600080fd5b8063d16f38c814610618578063d5929fe314610638578063df8de3e714610658578063e0b6c32314610678578063e3252537146106a557600080fd5b8063c957543b116100f2578063c957543b14610578578063c9b84d4d14610598578063cdd596e0146105b8578063cf10c969146105d8578063d0171d79146105f857600080fd5b8063acc831d0146104f8578063add10dda14610518578063bf1eb88a14610538578063c3c5a5471461055857600080fd5b80636332b080116101b157806385bff3411161017557806385bff341146104585780638cfef547146104785780638da5cb5b146104985780639936a87b146104b6578063ab867213146104cb57600080fd5b80636332b080146103e357806366cf5875146103f8578063692058c21461040e5780636931b5501461042e5780637c671a211461044357600080fd5b806341ca71ab116101f857806341ca71ab146103275780634787d09c1461035f5780634b6bd6be1461037f578063505a1b311461039f57806352631ab4146103bf57600080fd5b806304614e0b146102905780631de9db40146102b2578063238e130a146102e7578063392e53cd1461030757600080fd5b3661028b5760405162461bcd60e51b815260206004820152602760248201527f52656769737472793a2052656a656374696e67207478207769746820657468656044820152661c9cc81cd95b9d60ca1b60648201526084015b60405180910390fd5b600080fd5b34801561029c57600080fd5b506102b06102ab366004612f01565b610763565b005b3480156102be57600080fd5b506102d26102cd366004612f5a565b61091c565b60405190151581526020015b60405180910390f35b3480156102f357600080fd5b506102b0610302366004612f93565b6109c5565b34801561031357600080fd5b506003546001600160a01b031615156102d2565b34801561033357600080fd5b50610347610342366004612fb0565b610a72565b6040516001600160a01b0390911681526020016102de565b34801561036b57600080fd5b506102b061037a366004612f5a565b610aa7565b34801561038b57600080fd5b5061034761039a366004612fc9565b610b4f565b3480156103ab57600080fd5b506103476103ba366004612f93565b610b83565b3480156103cb57600080fd5b506103d560045481565b6040519081526020016102de565b3480156103ef57600080fd5b506103d5610c40565b34801561040457600080fd5b506103d560065481565b34801561041a57600080fd5b50600554610347906001600160a01b031681565b34801561043a57600080fd5b506102b0610c57565b34801561044f57600080fd5b50610347610d04565b34801561046457600080fd5b506102b0610473366004612f5a565b610d3f565b34801561048457600080fd5b50610347610493366004612fb0565b610f16565b3480156104a457600080fd5b506000546001600160a01b0316610347565b3480156104c257600080fd5b50610347610f4e565b3480156104d757600080fd5b506104eb6104e6366004612f93565b610f8c565b6040516102de9190613051565b34801561050457600080fd5b50610347610513366004612f93565b611029565b34801561052457600080fd5b506102b0610533366004613064565b611054565b34801561054457600080fd5b506104eb610553366004612f93565b6111c7565b34801561056457600080fd5b506102d2610573366004612f93565b611276565b34801561058457600080fd5b506102b0610593366004612fb0565b61132f565b3480156105a457600080fd5b50600754610347906001600160a01b031681565b3480156105c457600080fd5b506102d26105d3366004612f93565b611434565b3480156105e457600080fd5b506102b06105f33660046130d0565b61151a565b34801561060457600080fd5b506102b0610613366004613146565b6117c2565b34801561062457600080fd5b506007546001600160a01b031615156102d2565b34801561064457600080fd5b506102b0610653366004613192565b611a10565b34801561066457600080fd5b506102b0610673366004612f93565b611ebc565b34801561068457600080fd5b50610698610693366004612f93565b6120a0565b6040516102de9190613217565b3480156106b157600080fd5b506102b06106c0366004612f93565b612264565b3480156106d157600080fd5b506103476106e0366004612f5a565b612405565b3480156106f157600080fd5b506102b0610700366004612f93565b61248e565b34801561071157600080fd5b506002546001600160a01b0316610347565b34801561072f57600080fd5b50600354610347906001600160a01b031681565b34801561074f57600080fd5b506102b061075e366004613263565b61258c565b61076c836126bb565b6107885760405162461bcd60e51b8152600401610282906132dc565b60006107ec82466040805160208101929092526001600160601b031930606090811b8216928401929092529088901b166054820152606881018690526088015b604051602081830303815290604052805190602001206127b290919063ffffffff16565b90506001600160a01b0381166108575760405162461bcd60e51b815260206004820152602a60248201527f52656769737472793a2077726f6e67206368616e6e656c206f70656e696e6967604482015269207369676e617475726560b01b6064820152608401610282565b6003546001600160a01b03166370a082316108728387612405565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156108b157600080fd5b505afa1580156108c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e99190613327565b8311156109085760405162461bcd60e51b815260040161028290613340565b61091581856000866127d6565b5050505050565b600061093161092b8484612405565b3b151590565b806109be5750600754604051633985eaab60e21b81526001600160a01b03858116600483015284811660248301526109be92169063e617aaac9060440160206040518083038186803b15801561098657600080fd5b505afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092b9190613394565b9392505050565b6000546001600160a01b03163314806109e757506000546001600160a01b0316155b610a035760405162461bcd60e51b8152600401610282906133b1565b6001600160a01b038116610a1657600080fd5b6002546040516001600160a01b038084169216907fe1a66d77649cf0a57b9937073549f30f1c82bb865aaf066d2f299e37a62c6aad90600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b600060088281548110610a8757610a876133e6565b60009182526020909120600290910201546001600160a01b031692915050565b610ab0816126bb565b610acc5760405162461bcd60e51b8152600401610282906132dc565b610ad6828261091c565b15610b3d5760405162461bcd60e51b815260206004820152603160248201527f52656769737472793a207375636820636f6e73756d6572206368616e6e656c206044820152701a5cc8185b1c9958591e481bdc195b9959607a1b6064820152608401610282565b610b4a82826000806127d6565b505050565b600080610b5e6104e684610f16565b80516020909101209050610b7b6001600160a01b038516826129b0565b949350505050565b6000610b996007546001600160a01b0316151590565b15610c215760075460405163505a1b3160e01b81526001600160a01b0384811660048301529091169063505a1b319060240160206040518083038186803b158015610be357600080fd5b505afa158015610bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613394565b92915050565b506001600160a01b039081166000908152600a60205260409020541690565b600854600090610c5290600190613412565b905090565b60026001541415610caa5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610282565b60026001819055546001600160a01b0316610cc457600080fd5b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610cfd573d6000803e3d6000fd5b5060018055565b60006008610d10610c40565b81548110610d2057610d206133e6565b60009182526020909120600290910201546001600160a01b0316919050565b6000546001600160a01b0316331480610d6157506000546001600160a01b0316155b610d7d5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b0316610dfb5760405162461bcd60e51b815260206004820152603f60248201527f52656769737472793a206f6e6c7920696e697469616c697a656420726567697360448201527f7472792063616e20736574206e657720696d706c656d656e746174696f6e73006064820152608401610282565b813b15158015610e0b5750803b15155b610e745760405162461bcd60e51b815260206004820152603460248201527f52656769737472793a20696d706c656d656e746174696f6e73206861766520746044820152736f20626520736d61727420636f6e74726163747360601b6064820152608401610282565b604080518082019091526001600160a01b0392831681529082166020820190815260088054600181018255600091909152915160029092027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3810180549385166001600160a01b031994851617905590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee49091018054919093169116179055565b600060088281548110610f2b57610f2b6133e6565b60009182526020909120600160029092020101546001600160a01b031692915050565b60006008610f5a610c40565b81548110610f6a57610f6a6133e6565b60009182526020909120600160029092020101546001600160a01b0316919050565b606060006040518060600160405280603781526020016136b9603791399050606083901b60005b60148160ff16101561102057818160ff1660148110610fd457610fd46133e6565b1a60f81b83610fe4836014613429565b60ff1681518110610ff757610ff76133e6565b60200101906001600160f81b031916908160001a905350806110188161344e565b915050610fb3565b50909392505050565b6000806110376104e6610f4e565b805160209091012090506109be6001600160a01b038416826129b0565b61105d836126bb565b6110bc5760405162461bcd60e51b815260206004820152602a60248201527f52656769737472793a2070726f7669646564206865726d65732068617320746f6044820152692062652061637469766560b01b6064820152608401610282565b60006110ef82308686600460008154809291906110d89061346e565b919050556040516020016107c89493929190613489565b6001600160a01b038086166000908152600960205260409020549192508083169116146111505760405162461bcd60e51b815260206004820152600f60248201526e77726f6e67207369676e617475726560881b6044820152606401610282565b6001600160a01b0384166000908152600960209081526040909120845161117f92600390920191860190612d65565b50836001600160a01b03167fd8c638c85547b8717e0d5ca292cff6dbe8fc02fa6e6863a047971c39511643c7846040516111b99190613051565b60405180910390a250505050565b6001600160a01b03811660009081526009602052604090206003018054606091906111f1906134d6565b80601f016020809104026020016040519081016040528092919081815260200182805461121d906134d6565b801561126a5780601f1061123f5761010080835404028352916020019161126a565b820191906000526020600020905b81548152906001019060200180831161124d57829003601f168201915b50505050509050919050565b600061128c6007546001600160a01b0316151590565b1561130e5760075460405163c3c5a54760e01b81526001600160a01b0384811660048301529091169063c3c5a5479060240160206040518083038186803b1580156112d657600080fd5b505afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613511565b506001600160a01b039081166000908152600a602052604090205416151590565b6000546001600160a01b031633148061135157506000546001600160a01b0316155b61136d5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b03166113f95760405162461bcd60e51b8152602060048201526044602482018190527f52656769737472793a206f6e6c7920696e697469616c697a6564207265676973908201527f7472792063616e20736574206e6577206d696e696d616c206865726d6573207360648201526374616b6560e01b608482015260a401610282565b60068190556040518181527f645a9c74d34a0b1095b113252ad5e9afa0373f15b4b21760fb3a24b4b9d1ec309060200160405180910390a150565b6001600160a01b038082166000908152600960205260408120805460019091015491921690826114648383610b4f565b9050846001600160a01b0316816001600160a01b03161461148a57506000949350505050565b803b151580611511575060075460405163066eacb760e51b81526001600160a01b0387811660048301529091169063cdd596e09060240160206040518083038186803b1580156114d957600080fd5b505afa1580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115119190613511565b95945050505050565b611523856126bb565b61153f5760405162461bcd60e51b8152600401610282906132dc565b600061159482466040805160208101929092526001600160601b031930606090811b8216928401929092528a821b81166054840152606883018a9052608883018990529087901b1660a882015260bc016107c8565b90506001600160a01b0381166115f75760405162461bcd60e51b815260206004820152602260248201527f52656769737472793a2077726f6e67206964656e74697479207369676e617475604482015261726560f01b6064820152608401610282565b60006116038587613533565b6003549091506001600160a01b03166370a08231611621848a612405565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561166057600080fd5b505afa158015611674573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116989190613327565b8111156116b75760405162461bcd60e51b815260040161028290613340565b6116c3828886846127d6565b50851561172d576040516324f453d160e01b81526001600160a01b038381166004830152602482018890528816906324f453d190604401600060405180830381600087803b15801561171457600080fd5b505af1158015611728573d6000803e3d6000fd5b505050505b84156117b95760035460405163a9059cbb60e01b8152336004820152602481018790526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561177f57600080fd5b505af1158015611793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b79190613511565b505b50505050505050565b6001600160a01b03821661182c5760405162461bcd60e51b815260206004820152602b60248201527f52656769737472793a2062656e65666963696172792063616e2774206265207a60448201526a65726f206164647265737360a81b6064820152608401610282565b6007546001600160a01b03161561189f5760075460405163d0171d7960e01b81526001600160a01b039091169063d0171d79906118719086908690869060040161354b565b600060405180830381600087803b15801561188b57600080fd5b505af11580156117b9573d6000803e3d6000fd5b6004546118ad906001613533565b60045560006118c66007546001600160a01b0316151590565b6118d057306118dd565b6007546001600160a01b03165b9050600061192d83466004546040805160208101939093526001600160601b0319606088811b8216928501929092528a821b811660548501529089901b166068830152607c820152609c016107c8565b9050846001600160a01b0316816001600160a01b0316146119a65760405162461bcd60e51b815260206004820152602d60248201527f52656769737472793a206861766520746f206265207369676e6564206279206960448201526c3232b73a34ba3c9037bbb732b960991b6064820152608401610282565b6001600160a01b038581166000818152600a602090815260409182902080546001600160a01b0319169489169485179055905192835290917f768099735d1c322a05a5b9d7b76d99682a1833d3f7055e5ede25e0f2eeaa8c6d910160405180910390a25050505050565b6003546001600160a01b0316611a8e5760405162461bcd60e51b815260206004820152603960248201527f52656769737472793a206f6e6c7920696e697469616c697a656420726567697360448201527f7472792063616e207265676973746572206865726d65736573000000000000006064820152608401610282565b6001600160a01b038616611afc5760405162461bcd60e51b815260206004820152602f60248201527f52656769737472793a206865726d6573206f70657261746f722063616e27742060448201526e6265207a65726f206164647265737360881b6064820152608401610282565b600654851015611b745760405162461bcd60e51b815260206004820152603c60248201527f52656769737472793a206865726d6573206861766520746f207374616b65206160448201527f74206c65617374206d696e696d616c207374616b6520616d6f756e74000000006064820152608401610282565b6000611b7f87611029565b9050611b8a81611434565b15611be35760405162461bcd60e51b815260206004820152602360248201527f52656769737472793a206865726d657320616c726561647920726567697374656044820152621c995960ea1b6064820152608401610282565b6000611c02886001600160a01b0316611bfd6104e6610f4e565b612a01565b6003546040516323b872dd60e01b81523360048201526001600160a01b038084166024830152604482018b90529293509116906323b872dd90606401602060405180830381600087803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c909190613511565b5060035460055460405163699a088560e01b81526001600160a01b0392831660048201528a8316602482015261ffff89166044820152606481018890526084810187905290821660a48201529082169063699a08859060c401600060405180830381600087803b158015611d0357600080fd5b505af1158015611d17573d6000803e3d6000fd5b505050506040518060800160405280896001600160a01b03168152602001611d3d610c40565b815263fc0e3d90602084811b640100000000600160c01b0390811692909217604090811b828501529283018790526001600160a01b03868116600090815260098352849020855181546001600160a01b0319169216919091178155848201516001820155848401516002820180546001600160c01b03191663ffffffff9290961c91821691909416179390931790915560608301518051611de49260038501920190612d65565b505060035460405163095ea7b360e01b81526001600160a01b0385811660048301526000196024830152909116915063095ea7b390604401602060405180830381600087803b158015611e3657600080fd5b505af1158015611e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6e9190613511565b50816001600160a01b03167ff06d60cc2f463635fd237ad87f1d007af54840b82e7e4561707b1be63d91c2608985604051611eaa929190613577565b60405180910390a25050505050505050565b60026001541415611f0f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610282565b60026001819055546001600160a01b0316611f2957600080fd5b6003546001600160a01b0382811691161415611f955760405162461bcd60e51b815260206004820152602560248201527f6e617469766520746f6b656e2066756e64732063616e2774206265207265636f6044820152641d995c995960da1b6064820152608401610282565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015611fd757600080fd5b505afa158015611feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200f9190613327565b60025460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561205f57600080fd5b505af1158015612073573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120979190613511565b50506001805550565b60408051608081018252600080825260208201819052918101919091526060808201526120cc82611434565b806120e057506007546001600160a01b0316155b61216a5760075460405163e0b6c32360e01b81526001600160a01b0384811660048301529091169063e0b6c3239060240160006040518083038186803b15801561212957600080fd5b505afa15801561213d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612165919081019061359b565b610c1b565b6001600160a01b038083166000908152600960209081526040918290208251608081018452815490941684526001810154918401919091526002810154640100000000600160c01b03811663ffffffff90911617821b918301919091526003810180546060840191906121dc906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612208906134d6565b80156122555780601f1061222a57610100808354040283529160200191612255565b820191906000526020600020905b81548152906001019060200180831161223857829003601f168201915b50505050508152505092915050565b6000546001600160a01b031633148061228657506000546001600160a01b0316155b6122a25760405162461bcd60e51b8152600401610282906133b1565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156122e657600080fd5b505afa1580156122fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231e9190613327565b90506000811161237f5760405162461bcd60e51b815260206004820152602660248201527f636f6c6c6563746564206665652063616e6e6f74206265206c657373207468616044820152656e207a65726f60d01b6064820152608401610282565b60035460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b1580156123cd57600080fd5b505af11580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a9190613511565b6001600160a01b0381166000908152600960205260408120600101548190612430906104e690610a72565b8051906020012090506000848460405160200161246c929190606092831b6001600160601b031990811682529190921b16601482015260280190565b60405160208183030381529060405280519060200120905061151181836129b0565b6000546001600160a01b03163314806124b057506000546001600160a01b0316155b6124cc5760405162461bcd60e51b8152600401610282906133b1565b6001600160a01b0381166125315760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610282565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806125ae57506000546001600160a01b0316155b6125ca5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b0316156126235760405162461bcd60e51b815260206004820181905260248201527f52656769737472793a20697320616c726561647920696e697469616c697a65646044820152606401610282565b60068490556001600160a01b03861661263b57600080fd5b600380546001600160a01b0319166001600160a01b0388811691909117909155851661266657600080fd5b600580546001600160a01b0319166001600160a01b03871617905561268b8383610d3f565b6126943361248e565b600780546001600160a01b0319166001600160a01b03929092169190911790555050505050565b60006126c682611434565b6127215760405162461bcd60e51b815260206004820152602660248201527f52656769737472793a206865726d6573206861766520746f20626520726567696044820152651cdd195c995960d21b6064820152608401610282565b6000826001600160a01b0316634e69d5606040518163ffffffff1660e01b815260040160206040518083038186803b15801561275c57600080fd5b505afa158015612770573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127949190613681565b905060008160038111156127aa576127aa6136a2565b149392505050565b60008060006127c18585612a1b565b915091506127ce81612a8b565b509392505050565b6040516001600160601b0319606086811b8216602084015285901b1660348201526000908190604801604051602081830303815290604052805190602001209050600061284d6104e660096000896001600160a01b03166001600160a01b0316815260200190815260200160002060010154610a72565b9050600061285b8383612a01565b600354600554604051637b809f7b60e11b81526001600160a01b03928316600482015290821660248201528a8216604482015289821660648201526084810188905291925082169063f7013ef69060a401600060405180830381600087803b1580156128c657600080fd5b505af11580156128da573d6000803e3d6000fd5b50506040516001600160a01b038481168252808b1693508b1691507f2ed7bcf2ff03098102c7003d7ce2a633e4b49b8198b07de5383cdf4c0ab9228b9060200160405180910390a36001600160a01b038616612934578095505b61293d88611276565b6129a5576001600160a01b038881166000818152600a602090815260409182902080546001600160a01b031916948b169485179055905192835290917fefaf768237c22e140a862d5d375ad5c153479fac3f8bcf8b580a1651fd62c3ef910160405180910390a25b979650505050505050565b604080516001600160f81b03196020808301919091523060601b6001600160601b03191660218301526035820194909452605580820193909352815180820390930183526075019052805191012090565b600080838351602085016000f59050803b6109be57600080fd5b600080825160411415612a525760208301516040840151606085015160001a612a4687828585612c49565b94509450505050612a84565b825160401415612a7c5760208301516040840151612a71868383612d36565b935093505050612a84565b506000905060025b9250929050565b6000816004811115612a9f57612a9f6136a2565b1415612aa85750565b6001816004811115612abc57612abc6136a2565b1415612b0a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610282565b6002816004811115612b1e57612b1e6136a2565b1415612b6c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610282565b6003816004811115612b8057612b806136a2565b1415612bd95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610282565b6004816004811115612bed57612bed6136a2565b1415612c465760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610282565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c805750600090506003612d2d565b8460ff16601b14158015612c9857508460ff16601c14155b15612ca95750600090506004612d2d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612cfd573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d2657600060019250925050612d2d565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612d5787828885612c49565b935093505050935093915050565b828054612d71906134d6565b90600052602060002090601f016020900481019282612d935760008555612dd9565b82601f10612dac57805160ff1916838001178555612dd9565b82800160010185558215612dd9579182015b82811115612dd9578251825591602001919060010190612dbe565b50612de5929150612de9565b5090565b5b80821115612de55760008155600101612dea565b6001600160a01b0381168114612c4657600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715612e4c57612e4c612e13565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e7b57612e7b612e13565b604052919050565b600067ffffffffffffffff821115612e9d57612e9d612e13565b50601f01601f191660200190565b600082601f830112612ebc57600080fd5b8135612ecf612eca82612e83565b612e52565b818152846020838601011115612ee457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215612f1657600080fd5b8335612f2181612dfe565b925060208401359150604084013567ffffffffffffffff811115612f4457600080fd5b612f5086828701612eab565b9150509250925092565b60008060408385031215612f6d57600080fd5b8235612f7881612dfe565b91506020830135612f8881612dfe565b809150509250929050565b600060208284031215612fa557600080fd5b81356109be81612dfe565b600060208284031215612fc257600080fd5b5035919050565b60008060408385031215612fdc57600080fd5b8235612fe781612dfe565b946020939093013593505050565b60005b83811015613010578181015183820152602001612ff8565b8381111561301f576000848401525b50505050565b6000815180845261303d816020860160208601612ff5565b601f01601f19169290920160200192915050565b6020815260006109be6020830184613025565b60008060006060848603121561307957600080fd5b833561308481612dfe565b9250602084013567ffffffffffffffff808211156130a157600080fd5b6130ad87838801612eab565b935060408601359150808211156130c357600080fd5b50612f5086828701612eab565b600080600080600060a086880312156130e857600080fd5b85356130f381612dfe565b94506020860135935060408601359250606086013561311181612dfe565b9150608086013567ffffffffffffffff81111561312d57600080fd5b61313988828901612eab565b9150509295509295909350565b60008060006060848603121561315b57600080fd5b833561316681612dfe565b9250602084013561317681612dfe565b9150604084013567ffffffffffffffff811115612f4457600080fd5b60008060008060008060c087890312156131ab57600080fd5b86356131b681612dfe565b955060208701359450604087013561ffff811681146131d457600080fd5b9350606087013592506080870135915060a087013567ffffffffffffffff8111156131fe57600080fd5b61320a89828a01612eab565b9150509295509295509295565b6020815260018060a01b0382511660208201526020820151604082015267ffffffffffffffff19604083015116606082015260006060830151608080840152610b7b60a0840182613025565b60008060008060008060c0878903121561327c57600080fd5b863561328781612dfe565b9550602087013561329781612dfe565b94506040870135935060608701356132ae81612dfe565b925060808701356132be81612dfe565b915060a08701356132ce81612dfe565b809150509295509295509295565b6020808252602b908201527f52656769737472793a2070726f7669646564206865726d65732068617665207460408201526a6f2062652061637469766560a81b606082015260800190565b60006020828403121561333957600080fd5b5051919050565b60208082526034908201527f52656769737472793a206e6f7420656e6f756768742066756e647320696e206360408201527368616e6e656c20746f20636f766572206665657360601b606082015260800190565b6000602082840312156133a657600080fd5b81516109be81612dfe565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015613424576134246133fc565b500390565b600060ff821660ff84168060ff03821115613446576134466133fc565b019392505050565b600060ff821660ff811415613465576134656133fc565b60010192915050565b6000600019821415613482576134826133fc565b5060010190565b60006bffffffffffffffffffffffff19808760601b168352808660601b1660148401525083516134c0816028850160208801612ff5565b6028920191820192909252604801949350505050565b600181811c908216806134ea57607f821691505b6020821081141561350b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561352357600080fd5b815180151581146109be57600080fd5b60008219821115613546576135466133fc565b500190565b6001600160a01b0384811682528316602082015260606040820181905260009061151190830184613025565b6001600160a01b0383168152604060208201819052600090610b7b90830184613025565b600060208083850312156135ae57600080fd5b825167ffffffffffffffff808211156135c657600080fd5b90840190608082870312156135da57600080fd5b6135e2612e29565b82516135ed81612dfe565b81528284015184820152604083015167ffffffffffffffff198116811461361357600080fd5b604082015260608301518281111561362a57600080fd5b80840193505086601f84011261363f57600080fd5b8251915061364f612eca83612e83565b828152878584860101111561366357600080fd5b61367283868301878701612ff5565b60608201529695505050505050565b60006020828403121561369357600080fd5b8151600481106109be57600080fd5b634e487b7160e01b600052602160045260246000fdfe3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91602b57fd5bf3a264697066735822122036219ab918a429fdce341f2929073e190befbb7c069166e8b963bcc654c35c7664736f6c63430008090033
Deployed Bytecode Sourcemap
500:16475:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1986:49;;-1:-1:-1;;;1986:49:5;;216:2:9;1986:49:5;;;198:21:9;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:9;;;338:37;392:19;;1986:49:5;;;;;;;;500:16475;;;;4974:692;;;;;;;;;;-1:-1:-1;4974:692:5;;;;;:::i;:::-;;:::i;:::-;;16450:245;;;;;;;;;;-1:-1:-1;16450:245:5;;;;;:::i;:::-;;:::i;:::-;;;2972:14:9;;2965:22;2947:41;;2935:2;2920:18;16450:245:5;;;;;;;;551:254:3;;;;;;;;;;-1:-1:-1;551:254:3;;;;;:::i;:::-;;:::i;3180:104:5:-;;;;;;;;;;-1:-1:-1;3257:5:5;;-1:-1:-1;;;;;3257:5:5;3249:28;;3180:104;;13486:150;;;;;;;;;;-1:-1:-1;13486:150:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3608:32:9;;;3590:51;;3578:2;3563:18;13486:150:5;3444:203:9;5757:342:5;;;;;;;;;;-1:-1:-1;5757:342:5;;;;;:::i;:::-;;:::i;9551:275::-;;;;;;;;;;-1:-1:-1;9551:275:5;;;;;:::i;:::-;;:::i;11742:213::-;;;;;;;;;;-1:-1:-1;11742:213:5;;;;;:::i;:::-;;:::i;578:24::-;;;;;;;;;;;;;;;;;;;4370:25:9;;;4358:2;4343:18;578:24:5;4224:177:9;14473:104:5;;;;;;;;;;;;;:::i;692:33::-;;;;;;;;;;;;;;;;608:26;;;;;;;;;;-1:-1:-1;608:26:5;;;;-1:-1:-1;;;;;608:26:5;;;1100:157:3;;;;;;;;;;;;;:::i;13338:142:5:-;;;;;;;;;;;;;:::i;13942:465::-;;;;;;;;;;-1:-1:-1;13942:465:5;;;;;:::i;:::-;;:::i;13788:148::-;;;;;;;;;;-1:-1:-1;13788:148:5;;;;;:::i;:::-;;:::i;202:77:4:-;;;;;;;;;;-1:-1:-1;240:7:4;266:6;-1:-1:-1;;;;;266:6:4;202:77;;13642:140:5;;;;;;;;;;;;;:::i;10849:537::-;;;;;;;;;;-1:-1:-1;10849:537:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9296:249::-;;;;;;;;;;-1:-1:-1;9296:249:5;;;;;:::i;:::-;;:::i;9961:551::-;;;;;;;;;;-1:-1:-1;9961:551:5;;;;;:::i;:::-;;:::i;9832:123::-;;;;;;;;;;-1:-1:-1;9832:123:5;;;;;:::i;:::-;;:::i;15090:292::-;;;;;;;;;;-1:-1:-1;15090:292:5;;;;;:::i;:::-;;:::i;12959:::-;;;;;;;;;;-1:-1:-1;12959:292:5;;;;;:::i;:::-;;:::i;731:30::-;;;;;;;;;;-1:-1:-1;731:30:5;;;;-1:-1:-1;;;;;731:30:5;;;15388:648;;;;;;;;;;-1:-1:-1;15388:648:5;;;;;:::i;:::-;;:::i;3596:1286::-;;;;;;;;;;-1:-1:-1;3596:1286:5;;;;;:::i;:::-;;:::i;11961:992::-;;;;;;;;;;-1:-1:-1;11961:992:5;;;;;:::i;:::-;;:::i;14967:117::-;;;;;;;;;;-1:-1:-1;15048:14:5;;-1:-1:-1;;;;;15048:14:5;15040:37;;14967:117;;7256:1492;;;;;;;;;;-1:-1:-1;7256:1492:5;;;;;:::i;:::-;;:::i;1331:334:3:-;;;;;;;;;;-1:-1:-1;1331:334:3;;;;;:::i;:::-;;:::i;9089:201:5:-;;;;;;;;;;-1:-1:-1;9089:201:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16701:272::-;;;;;;;;;;-1:-1:-1;16701:272:5;;;;;:::i;:::-;;:::i;8754:329::-;;;;;;;;;;-1:-1:-1;8754:329:5;;;;;:::i;:::-;;:::i;431:240:4:-;;;;;;;;;;-1:-1:-1;431:240:4;;;;;:::i;:::-;;:::i;869:101:3:-;;;;;;;;;;-1:-1:-1;947:16:3;;-1:-1:-1;;;;;947:16:3;869:101;;354:24;;;;;;;;;;-1:-1:-1;354:24:3;;;;-1:-1:-1;;;;;354:24:3;;;2341:833:5;;;;;;;;;;-1:-1:-1;2341:833:5;;;;;:::i;:::-;;:::i;4974:692::-;5096:25;5111:9;5096:14;:25::i;:::-;5088:81;;;;-1:-1:-1;;;5088:81:5;;;;;;;:::i;:::-;5225:17;5245:103;5337:10;204:9:6;5255:72:5;;;;;;10795:19:9;;;;-1:-1:-1;;;;;;5294:4:5;10902:2:9;10898:15;;;10894:24;;10880:12;;;10873:46;;;;10953:15;;;;10949:24;10935:12;;;10928:46;10990:12;;;10983:28;;;11027:13;;5255:72:5;;;;;;;;;;;;;5245:83;;;;;;:91;;:103;;;;:::i;:::-;5225:123;-1:-1:-1;;;;;;5366:23:5;;5358:78;;;;-1:-1:-1;;;5358:78:5;;11253:2:9;5358:78:5;;;11235:21:9;11292:2;11272:18;;;11265:30;11331:34;11311:18;;;11304:62;-1:-1:-1;;;11382:18:9;;;11375:40;11432:19;;5358:78:5;11051:406:9;5358:78:5;5473:5;;-1:-1:-1;;;;;5473:5:5;:15;5489:39;5507:9;5518;5489:17;:39::i;:::-;5473:56;;-1:-1:-1;;;;;;5473:56:5;;;;;;;-1:-1:-1;;;;;3608:32:9;;;5473:56:5;;;3590:51:9;3563:18;;5473:56:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5455:14;:74;;5447:139;;;;-1:-1:-1;;;5447:139:5;;;;;;;:::i;:::-;5597:62;5610:9;5621;5640:1;5644:14;5597:12;:62::i;:::-;;5078:588;4974:692;;;:::o;16450:245::-;16534:4;16557:56;16573:39;16591:9;16602;16573:17;:39::i;:::-;14808:18;14853:16;;;14664:212;16557:56;:131;;;-1:-1:-1;16633:14:5;;:54;;-1:-1:-1;;;16633:54:5;;-1:-1:-1;;;;;12302:15:9;;;16633:54:5;;;12284:34:9;12354:15;;;12334:18;;;12327:43;16617:71:5;;16633:14;;:32;;12219:18:9;;16633:54:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16617:71::-;16550:138;16450:245;-1:-1:-1;;;16450:245:5:o;551:254:3:-;324:6:4;;-1:-1:-1;;;;;324:6:4;334:10;324:20;;:46;;-1:-1:-1;366:3:4;348:6;-1:-1:-1;;;;;348:6:4;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:4;;;;;;;:::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;13486:150:5:-;13559:7;13585:15;13601:8;13585:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:44;-1:-1:-1;;;;;13585:44:5;;13486:150;-1:-1:-1;;13486:150:5:o;5757:342::-;5849:25;5864:9;5849:14;:25::i;:::-;5841:81;;;;-1:-1:-1;;;5841:81:5;;;;;;;:::i;:::-;5941:37;5957:9;5968;5941:15;:37::i;:::-;5940:38;5932:100;;;;-1:-1:-1;;;5932:100:5;;13332:2:9;5932:100:5;;;13314:21:9;13371:2;13351:18;;;13344:30;13410:34;13390:18;;;13383:62;-1:-1:-1;;;13461:18:9;;;13454:47;13518:19;;5932:100:5;13130:413:9;5932:100:5;6043:49;6056:9;6067;6086:1;6090;6043:12;:49::i;:::-;;5757:342;;:::o;9551:275::-;9641:7;9660:13;9686:47;9699:33;9723:8;9699:23;:33::i;9686:47::-;9676:58;;;;;;;;-1:-1:-1;9751:68:5;-1:-1:-1;;;;;9777:33:5;;9676:58;9751:17;:68::i;:::-;9744:75;9551:275;-1:-1:-1;;;;9551:275:5:o;11742:213::-;11806:7;11829:19;15048:14;;-1:-1:-1;;;;;15048:14:5;15040:37;;;14967:117;11829:19;11825:84;;;11869:14;;:40;;-1:-1:-1;;;11869:40:5;;-1:-1:-1;;;;;3608:32:9;;;11869:40:5;;;3590:51:9;11869:14:5;;;;:29;;3563:18:9;;11869:40:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11862:47;11742:213;-1:-1:-1;;11742:213:5:o;11825:84::-;-1:-1:-1;;;;;;11927:21:5;;;;;;;:10;:21;;;;;;;;11742:213::o;14473:104::-;14546:15;:22;14520:7;;14546:24;;14569:1;;14546:24;:::i;:::-;14539:31;;14473:104;:::o;1100:157:3:-;1680:1:0;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:0;;14012:2:9;2251:63:0;;;13994:21:9;14051:2;14031:18;;;14024:30;14090:33;14070:18;;;14063:61;14141:18;;2251:63:0;13810: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;13338:142:5:-;13395:7;13421:15;13437:16;:14;:16::i;:::-;13421:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:52;-1:-1:-1;;;;;13421:52:5;;13338:142;-1:-1:-1;13338:142:5:o;13942:465::-;324:6:4;;-1:-1:-1;;;;;324:6:4;334:10;324:20;;:46;;-1:-1:-1;366:3:4;348:6;-1:-1:-1;;;;;348:6:4;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:4;;;;;;;:::i;:::-;3257:5:5;;-1:-1:-1;;;;;3257:5:5;14060:91:::1;;;::::0;-1:-1:-1;;;14060:91:5;;14372:2:9;14060:91:5::1;::::0;::::1;14354:21:9::0;14411:2;14391:18;;;14384:30;14450:34;14430:18;;;14423:62;14521:33;14501:18;;;14494:61;14572:19;;14060:91:5::1;14170:427:9::0;14060:91:5::1;14808:18:::0;;14853:16;;14169:81:::1;;;;-1:-1:-1::0;14808:18:5;;14853:16;;14212:38:::1;14161:146;;;::::0;-1:-1:-1;;;14161:146:5;;14804:2:9;14161:146:5::1;::::0;::::1;14786:21:9::0;14843:2;14823:18;;;14816:30;14882:34;14862:18;;;14855:62;-1:-1:-1;;;14933:18:9;;;14926:50;14993:19;;14161:146:5::1;14602:416:9::0;14161:146:5::1;14338:61;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;14338:61:5;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;;14317:15:::1;:83:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;14317:83:5;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;14317:83:5;;::::1;;::::0;;;;;;;;;;;;;::::1;::::0;::::1;;::::0;;13942:465::o;13788:148::-;13860:7;13886:15;13902:8;13886:25;;;;;;;;:::i;:::-;;;;;;;;;:43;:25;;;;;:43;;-1:-1:-1;;;;;13886:43:5;;13788:148;-1:-1:-1;;13788:148:5:o;13642:140::-;13698:7;13724:15;13740:16;:14;:16::i;:::-;13724:33;;;;;;;;:::i;:::-;;;;;;;;;:51;:33;;;;;:51;;-1:-1:-1;;;;;13724:51:5;;13642:140;-1:-1:-1;13642:140:5:o;10849:537::-;10917:12;11066:18;:136;;;;;;;;;;;;;;;;;;-1:-1:-1;11236:24:5;;;;11213:20;11270:87;11292:2;11288:1;:6;;;11270:87;;;11331:12;11344:1;11331:15;;;;;;;;;:::i;:::-;;;;11315:5;11321:6;11326:1;11321:2;:6;:::i;:::-;11315:13;;;;;;;;;;:::i;:::-;;;;:31;-1:-1:-1;;;;;11315:31:5;;;;;;;;-1:-1:-1;11296:3:5;;;;:::i;:::-;;;;11270:87;;;-1:-1:-1;11374:5:5;;10849:537;-1:-1:-1;;;10849:537:5:o;9296:249::-;9368:7;9387:13;9413:39;9426:25;:23;:25::i;9413:39::-;9403:50;;;;;;;;-1:-1:-1;9470:68:5;-1:-1:-1;;;;;9496:33:5;;9403:50;9470:17;:68::i;9961:551::-;10074:25;10089:9;10074:14;:25::i;:::-;10066:80;;;;-1:-1:-1;;;10066:80:5;;15614:2:9;10066:80:5;;;15596:21:9;15653:2;15633:18;;;15626:30;15692:34;15672:18;;;15665:62;-1:-1:-1;;;15743:18:9;;;15736:40;15793:19;;10066:80:5;15412:406:9;10066:80:5;10202:17;10222:92;10303:10;10257:4;10264:9;10275:4;10281:9;;:11;;;;;;;;;:::i;:::-;;;;;10232:61;;;;;;;;;;;:::i;10222:92::-;-1:-1:-1;;;;;10345:19:5;;;;;;;:8;:19;;;;;:28;10202:112;;-1:-1:-1;10332:41:5;;;10345:28;;10332:41;10324:69;;;;-1:-1:-1;;;10324:69:5;;16754:2:9;10324:69:5;;;16736:21:9;16793:2;16773:18;;;16766:30;-1:-1:-1;;;16812:18:9;;;16805:45;16867:18;;10324:69:5;16552:339:9;10324:69:5;-1:-1:-1;;;;;10426:19:5;;;;;;:8;:19;;;;;;;;:30;;;;:23;;;;;:30;;;;:::i;:::-;;10489:9;-1:-1:-1;;;;;10472:33:5;;10500:4;10472:33;;;;;;:::i;:::-;;;;;;;;10056:456;9961:551;;;:::o;9832:123::-;-1:-1:-1;;;;;9925:19:5;;;;;;:8;:19;;;;;:23;;9918:30;;9894:12;;9925:23;9918:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9832:123;;;:::o;15090:292::-;15152:4;15172:19;15048:14;;-1:-1:-1;;;;;15048:14:5;15040:37;;;14967:117;15172:19;15168:82;;;15212:14;;:38;;-1:-1:-1;;;15212:38:5;;-1:-1:-1;;;;;3608:32:9;;;15212:38:5;;;3590:51:9;15212:14:5;;;;:27;;3563:18:9;;15212:38:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15168:82::-;-1:-1:-1;;;;;;15340:21:5;;;15373:1;15340:21;;;:10;:21;;;;;;;:35;;;15090:292::o;12959:::-;324:6:4;;-1:-1:-1;;;;;324:6:4;334:10;324:20;;:46;;-1:-1:-1;366:3:4;348:6;-1:-1:-1;;;;;348:6:4;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:4;;;;;;;:::i;:::-;3257:5:5;;-1:-1:-1;;;;;3257:5:5;13043:96:::1;;;::::0;-1:-1:-1;;;13043:96:5;;17765:2:9;13043:96:5::1;::::0;::::1;17747:21:9::0;17804:2;17784:18;;;17777:30;;;17843:34;17823:18;;;17816:62;17914:34;17894:18;;;17887:62;-1:-1:-1;;;17965:19:9;;;17958:35;18010:19;;13043:96:5::1;17563:472:9::0;13043:96:5::1;13149:18;:37:::0;;;13201:43:::1;::::0;4370:25:9;;;13201:43:5::1;::::0;4358:2:9;4343:18;13201:43:5::1;;;;;;;12959:292:::0;:::o;15388:648::-;-1:-1:-1;;;;;15692:19:5;;;15446:4;15692:19;;;:8;:19;;;;;:28;;;15749:27;;;;15446:4;;15692:28;;15446:4;15802:43;15692:28;15749:27;15802:16;:43::i;:::-;15786:59;;15868:9;-1:-1:-1;;;;;15859:18:5;:5;-1:-1:-1;;;;;15859:18:5;;15855:48;;-1:-1:-1;15898:5:5;;15388:648;-1:-1:-1;;;;15388:648:5:o;15855:48::-;14808:18;;14853:16;;15969:60;;;-1:-1:-1;15995:14:5;;:34;;-1:-1:-1;;;15995:34:5;;-1:-1:-1;;;;;3608:32:9;;;15995:34:5;;;3590:51:9;15995:14:5;;;;:23;;3563:18:9;;15995:34:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15962:67;15388:648;-1:-1:-1;;;;;15388:648:5:o;3596:1286::-;3759:25;3774:9;3759:14;:25::i;:::-;3751:81;;;;-1:-1:-1;;;3751:81:5;;;;;;;:::i;:::-;3888:17;3908:131;4028:10;204:9:6;3918:100:5;;;;;;18309:19:9;;;;-1:-1:-1;;;;;;3957:4:5;18416:2:9;18412:15;;;18408:24;;18394:12;;;18387:46;;;;18467:15;;;18463:24;;18449:12;;;18442:46;18504:12;;;18497:28;;;18541:13;;;18534:29;;;18598:15;;;;18594:24;18579:13;;;18572:47;18635:13;;3918:100:5;18040:614:9;3908:131:5;3888:151;-1:-1:-1;;;;;;4057:23:5;;4049:70;;;;-1:-1:-1;;;4049:70:5;;18861:2:9;4049:70:5;;;18843:21:9;18900:2;18880:18;;;18873:30;18939:34;18919:18;;;18912:62;-1:-1:-1;;;18990:18:9;;;18983:32;19032:19;;4049:70:5;18659:398:9;4049:70:5;4212:17;4232:29;4247:14;4232:12;:29;:::i;:::-;4292:5;;4212:49;;-1:-1:-1;;;;;;4292:5:5;:15;4308:39;4326:9;4337;4308:17;:39::i;:::-;4292:56;;-1:-1:-1;;;;;;4292:56:5;;;;;;;-1:-1:-1;;;;;3608:32:9;;;4292:56:5;;;3590:51:9;3563:18;;4292:56:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4279:9;:69;;4271:134;;;;-1:-1:-1;;;4271:134:5;;;;;;;:::i;:::-;4449:59;4462:9;4473;4484:12;4498:9;4449:12;:59::i;:::-;-1:-1:-1;4628:16:5;;4624:110;;4660:63;;-1:-1:-1;;;4660:63:5;;-1:-1:-1;;;;;19387:32:9;;;4660:63:5;;;19369:51:9;19436:18;;;19429:34;;;4660:38:5;;;;;19342:18:9;;4660:63:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4624:110;4789:18;;4785:91;;4823:5;;:42;;-1:-1:-1;;;4823:42:5;;4838:10;4823:42;;;19369:51:9;19436:18;;;19429:34;;;-1:-1:-1;;;;;4823:5:5;;;;:14;;19342:18:9;;4823:42:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4785:91;3741:1141;;3596:1286;;;;;:::o;11961:992::-;-1:-1:-1;;;;;12079:29:5;;12071:85;;;;-1:-1:-1;;;12071:85:5;;19676:2:9;12071:85:5;;;19658:21:9;19715:2;19695:18;;;19688:30;19754:34;19734:18;;;19727:62;-1:-1:-1;;;19805:18:9;;;19798:41;19856:19;;12071:85:5;19474:407:9;12071:85:5;15048:14;;-1:-1:-1;;;;;15048:14:5;15040:37;12220:727;;12259:14;;:69;;-1:-1:-1;;;12259:69:5;;-1:-1:-1;;;;;12259:14:5;;;;:29;;:69;;12289:9;;12300:15;;12317:10;;12259:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12220:727;12371:9;;:13;;12383:1;12371:13;:::i;:::-;12359:9;:25;12492:21;12516:19;15048:14;;-1:-1:-1;;;;;15048:14:5;15040:37;;;14967:117;12516:19;:61;;12572:4;12516:61;;;12546:14;;-1:-1:-1;;;;;12546:14:5;12516:61;12492:85;-1:-1:-1;12591:15:5;12609:115;12713:10;204:9:6;12693::5;;12619:84;;;;;;20547:19:9;;;;-1:-1:-1;;;;;;20654:2:9;20650:15;;;20646:24;;20632:12;;;20625:46;;;;20705:15;;;20701:24;;20687:12;;;20680:46;20760:15;;;;20756:24;20742:12;;;20735:46;20797:12;;;20790:28;20834:13;;12619:84:5;20306:547:9;12609:115:5;12591:133;;12757:9;-1:-1:-1;;;;;12746:20:5;:7;-1:-1:-1;;;;;12746:20:5;;12738:78;;;;-1:-1:-1;;;12738:78:5;;21060:2:9;12738:78:5;;;21042:21:9;21099:2;21079:18;;;21072:30;21138:34;21118:18;;;21111:62;-1:-1:-1;;;21189:18:9;;;21182:43;21242:19;;12738:78:5;20858:409:9;12738:78:5;-1:-1:-1;;;;;12831:21:5;;;;;;;:10;:21;;;;;;;;;:39;;-1:-1:-1;;;;;;12831:39:5;;;;;;;;;12890:46;;3590:51:9;;;12831:21:5;;12890:46;;3563:18:9;12890:46:5;;;;;;;12345:602;;11961:992;;;:::o;7256:1492::-;3257:5;;-1:-1:-1;;;;;3257:5:5;7434:85;;;;-1:-1:-1;;;7434:85:5;;21474:2:9;7434:85:5;;;21456:21:9;21513:2;21493:18;;;21486:30;21552:34;21532:18;;;21525:62;21623:27;21603:18;;;21596:55;21668:19;;7434:85:5;21272:421:9;7434:85:5;-1:-1:-1;;;;;7537:29:5;;7529:89;;;;-1:-1:-1;;;7529:89:5;;21900:2:9;7529:89:5;;;21882:21:9;21939:2;21919:18;;;21912:30;21978:34;21958:18;;;21951:62;-1:-1:-1;;;22029:18:9;;;22022:45;22084:19;;7529:89:5;21698:411:9;7529:89:5;7652:18;;7636:12;:34;;7628:107;;;;-1:-1:-1;;;7628:107:5;;22316:2:9;7628:107:5;;;22298:21:9;22355:2;22335:18;;;22328:30;22394:34;22374:18;;;22367:62;22465:30;22445:18;;;22438:58;22513:19;;7628:107:5;22114:424:9;7628:107:5;7746:17;7766:33;7783:15;7766:16;:33::i;:::-;7746:53;;7818:19;7827:9;7818:8;:19::i;:::-;7817:20;7809:68;;;;-1:-1:-1;;;7809:68:5;;22745:2:9;7809:68:5;;;22727:21:9;22784:2;22764:18;;;22757:30;22823:34;22803:18;;;22796:62;-1:-1:-1;;;22874:18:9;;;22867:33;22917:19;;7809:68:5;22543:399:9;7809:68:5;7971:23;8013:91;8045:15;-1:-1:-1;;;;;8029:33:5;8064:39;8077:25;:23;:25::i;8064:39::-;8013:15;:91::i;:::-;8169:5;;:62;;-1:-1:-1;;;8169:62:5;;8188:10;8169:62;;;23187:34:9;-1:-1:-1;;;;;23257:15:9;;;23237:18;;;23230:43;23289:18;;;23282:34;;;7971:134:5;;-1:-1:-1;8169:5:5;;;:18;;23122::9;;8169:62:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;8298:5:5;;8371:3;;8271:104;;-1:-1:-1;;;8271:104:5;;-1:-1:-1;;;;;8298:5:5;;;8271:104;;;23666:34:9;23736:15;;;23716:18;;;23709:43;23800:6;23788:19;;23768:18;;;23761:47;23824:18;;;23817:34;;;23867:19;;;23860:35;;;8371:3:5;;;23911:19:9;;;23904:44;8271:18:5;;;;;;23600:19:9;;8271:104:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8456:65;;;;;;;;8463:15;-1:-1:-1;;;;;8456:65:5;;;;;8480:16;:14;:16::i;:::-;8456:65;;8498:16;8456:65;;;;-1:-1:-1;;;;;8456:65:5;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8434:19:5;;;-1:-1:-1;8434:19:5;;;:8;:19;;;;;:87;;;;-1:-1:-1;;;;;;8434:87:5;;;;;;;;;;;;;-1:-1:-1;8434:87:5;;;;;;;;;;;;-1:-1:-1;;;;;;8434:87:5;8456:65;8434:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;8632:5:5;;:43;;-1:-1:-1;;;8632:43:5;;-1:-1:-1;;;;;19387:32:9;;;8632:43:5;;;19369:51:9;-1:-1:-1;;19436:18:9;;;19429:34;8632:5:5;;;;-1:-1:-1;8632:13:5;;19342:18:9;;8632:43:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8708:9;-1:-1:-1;;;;;8691:50:5;;8719:15;8736:4;8691:50;;;;;;;:::i;:::-;;;;;;;;7424:1324;;7256:1492;;;;;;:::o;1331:334:3:-;1680:1:0;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:0;;14012:2:9;2251:63:0;;;13994:21:9;14051:2;14031:18;;;14024:30;14090:33;14070:18;;;14063:61;14141:18;;2251:63:0;13810: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;;24480:2:9;1447:74:3::1;::::0;::::1;24462:21:9::0;24519:2;24499:18;;;24492:30;24558:34;24538:18;;;24531:62;-1:-1:-1;;;24609:18:9;;;24602:35;24654:19;;1447:74:3::1;24278:401:9::0;1447:74:3::1;1549:44;::::0;-1:-1:-1;;;1549:44:3;;1587:4:::1;1549:44;::::0;::::1;3590:51:9::0;1531:15:3::1;::::0;-1:-1:-1;;;;;1549:29:3;::::1;::::0;::::1;::::0;3563:18:9;;1549:44:3::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1632:16;::::0;1603:55:::1;::::0;-1:-1:-1;;;1603:55:3;;-1:-1:-1;;;;;1632:16:3;;::::1;1603:55;::::0;::::1;19369:51:9::0;19436:18;;;19429:34;;;1531:62:3;;-1:-1:-1;1603:28:3;::::1;::::0;::::1;::::0;19342:18:9;;1603:55:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;1637:1:0;2562:22;;-1:-1:-1;1331:334:3:o;9089:201:5:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9180:19:5;9189:9;9180:8;:19::i;:::-;:43;;;-1:-1:-1;15048:14:5;;-1:-1:-1;;;;;15048:14:5;15040:37;9180:43;:103;;9248:14;;:35;;-1:-1:-1;;;9248:35:5;;-1:-1:-1;;;;;3608:32:9;;;9248:35:5;;;3590:51:9;9248:14:5;;;;:24;;3563:18:9;;9248:35:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9248:35:5;;;;;;;;;;;;:::i;:::-;9180:103;;;-1:-1:-1;;;;;9226:19:5;;;;;;;:8;:19;;;;;;;;;9180:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9180:103:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9173:110;9089:201;-1:-1:-1;;9089:201:5:o;16701:272::-;324:6:4;;-1:-1:-1;;;;;324:6:4;334:10;324:20;;:46;;-1:-1:-1;366:3:4;348:6;-1:-1:-1;;;;;348:6:4;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:4;;;;;;;:::i;:::-;16805:5:5::1;::::0;:30:::1;::::0;-1:-1:-1;;;16805:30:5;;16829:4:::1;16805:30;::::0;::::1;3590:51:9::0;16781:21:5::1;::::0;-1:-1:-1;;;;;16805:5:5::1;::::0;:15:::1;::::0;3563:18:9;;16805:30:5::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16781:54;;16869:1;16853:13;:17;16845:68;;;::::0;-1:-1:-1;;;16845:68:5;;26440:2:9;16845:68:5::1;::::0;::::1;26422:21:9::0;26479:2;26459:18;;;26452:30;26518:34;26498:18;;;26491:62;-1:-1:-1;;;26569:18:9;;;26562:36;26615:19;;16845:68:5::1;26238:402:9::0;16845:68:5::1;16923:5;::::0;:43:::1;::::0;-1:-1:-1;;;16923:43:5;;-1:-1:-1;;;;;19387:32:9;;;16923:43:5::1;::::0;::::1;19369:51:9::0;19436:18;;;19429:34;;;16923:5:5;;::::1;::::0;:14:::1;::::0;19342:18:9;;16923:43:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8754:329::-:0;-1:-1:-1;;;;;8923:19:5;;8840:7;8923:19;;;:8;:19;;;;;:27;;;8840:7;;8885:67;;8898:53;;:24;:53::i;8885:67::-;8875:78;;;;;;8859:94;;8963:13;9006:9;9017;8989:38;;;;;;;;26872:2:9;26868:15;;;-1:-1:-1;;;;;;26864:24:9;;;26852:37;;26923:15;;;;26919:24;26914:2;26905:12;;26898:46;26969:2;26960:12;;26645:333;8989:38:5;;;;;;;;;;;;;8979:49;;;;;;8963:65;;9045:31;9063:5;9070;9045:17;:31::i;431:240:4:-;324:6;;-1:-1:-1;;;;;324:6:4;334:10;324:20;;:46;;-1:-1:-1;366:3:4;348:6;-1:-1:-1;;;;;348:6:4;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;519:22:4;::::1;511:73;;;::::0;-1:-1:-1;;;511:73:4;;27185:2:9;511:73:4::1;::::0;::::1;27167:21:9::0;27224:2;27204:18;;;27197:30;27263:34;27243:18;;;27236:62;-1:-1:-1;;;27314:18:9;;;27307:36;27360:19;;511:73:4::1;26983:402:9::0;511:73:4::1;620:6;::::0;;599:38:::1;::::0;-1:-1:-1;;;;;599:38:4;;::::1;::::0;620:6;::::1;::::0;599:38:::1;::::0;::::1;647:6;:17:::0;;-1:-1:-1;;;;;;647:17:4::1;-1:-1:-1::0;;;;;647:17:4;;;::::1;::::0;;;::::1;::::0;;431:240::o;2341:833:5:-;324:6:4;;-1:-1:-1;;;;;324:6:4;334:10;324:20;;:46;;-1:-1:-1;366:3:4;348:6;-1:-1:-1;;;;;348:6:4;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:4;;;;;;;:::i;:::-;3257:5:5;;-1:-1:-1;;;;;3257:5:5;3249:28;2565:61:::1;;;::::0;-1:-1:-1;;;2565:61:5;;27592:2:9;2565:61:5::1;::::0;::::1;27574:21:9::0;;;27611:18;;;27604:30;27670:34;27650:18;;;27643:62;27722:18;;2565:61:5::1;27390:356:9::0;2565:61:5::1;2637:18;:40:::0;;;-1:-1:-1;;;;;2696:27:5;::::1;2688:36;;;::::0;::::1;;2734:5;:34:::0;;-1:-1:-1;;;;;;2734:34:5::1;-1:-1:-1::0;;;;;2734:34:5;;::::1;::::0;;;::::1;::::0;;;2787:25;::::1;2779:34;;;::::0;::::1;;2823:3;:17:::0;;-1:-1:-1;;;;;;2823:17:5::1;-1:-1:-1::0;;;;;2823:17:5;::::1;;::::0;;2898:65:::1;2917:22:::0;2941:21;2898:18:::1;:65::i;:::-;3017:29;3035:10;3017:17;:29::i;:::-;3125:14;:42:::0;;-1:-1:-1;;;;;;3125:42:5::1;-1:-1:-1::0;;;;;3125:42:5;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;2341:833:5:o;16042:402::-;16108:4;16238:19;16247:9;16238:8;:19::i;:::-;16230:70;;;;-1:-1:-1;;;16230:70:5;;27953:2:9;16230:70:5;;;27935:21:9;27992:2;27972:18;;;27965:30;28031:34;28011:18;;;28004:62;-1:-1:-1;;;28082:18:9;;;28075:36;28128:19;;16230:70:5;27751:402:9;16230:70:5;16311:29;16359:9;-1:-1:-1;;;;;16343:36:5;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16311:70;-1:-1:-1;16408:29:5;16398:6;:39;;;;;;;;:::i;:::-;;;16042:402;-1:-1:-1;;;16042:402:5:o;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;6248:1002:5:-;6407:38;;-1:-1:-1;;;;;;26872:2:9;26868:15;;;26864:24;;6407:38:5;;;26852:37:9;26923:15;;;26919:24;26905:12;;;26898:46;6362:7:5;;;;26960:12:9;;6407:38:5;;;;;;;;;;;;6397:49;;;;;;6381:65;;6456:18;6477:67;6490:53;6515:8;:19;6524:9;-1:-1:-1;;;;;6515:19:5;-1:-1:-1;;;;;6515:19:5;;;;;;;;;;;;:27;;;6490:24;:53::i;6477:67::-;6456:88;-1:-1:-1;6554:16:5;6581:38;6605:5;6456:88;6581:15;:38::i;:::-;6658:5;;6666:3;;6630:68;;-1:-1:-1;;;6630:68:5;;-1:-1:-1;;;;;6658:5:5;;;6630:68;;;28871:34:9;6666:3:5;;;28921:18:9;;;28914:43;28993:15;;;28973:18;;;28966:43;29045:15;;;29025:18;;;29018:43;29077:19;;;29070:35;;;6554:66:5;;-1:-1:-1;6630:19:5;;;;;28805::9;;6630:68:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6714:63:5;;-1:-1:-1;;;;;3608:32:9;;;3590:51;;6714:63:5;;;;-1:-1:-1;6714:63:5;;;-1:-1:-1;6714:63:5;;3578:2:9;3563:18;6714:63:5;;;;;;;-1:-1:-1;;;;;6886:26:5;;6882:89;;6951:8;6928:32;;6882:89;7061:23;7074:9;7061:12;:23::i;:::-;7056:153;;-1:-1:-1;;;;;7100:21:5;;;;;;;:10;:21;;;;;;;;;:36;;-1:-1:-1;;;;;;7100:36:5;;;;;;;;;7155:43;;3590:51:9;;;7100:21:5;;7155:43;;3563:18:9;7155:43:5;;;;;;;7056:153;7234:8;6248:1002;-1:-1:-1;;;;;;;6248:1002:5:o;10557:286::-;10697:135;;;-1:-1:-1;;;;;;10697:135:5;;;;29327:39:9;;;;10761:4:5;29403:2:9;29399:15;-1:-1:-1;;;;;;29395:53:9;29382:11;;;29375:74;29465:12;;;29458:28;;;;29502:12;;;;29495:28;;;;10697:135:5;;;;;;;;;;29539:12:9;;10697:135:5;;10687:146;;;;;;10557:286::o;11392:344::-;11470:15;11497:21;11604:5;11596;11590:12;11583:4;11576:5;11572:16;11569:1;11561:49;11552:58;;11645:5;11633:18;11623:74;;11681:1;11678;11671:12;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;;29764:2:9;661:34:2;;;29746:21:9;29803:2;29783:18;;;29776:30;29842:26;29822:18;;;29815:54;29886:18;;661:34:2;29562:348:9;603:465:2;725:35;716:5;:44;;;;;;;;:::i;:::-;;712:356;;;776:41;;-1:-1:-1;;;776:41:2;;30117:2:9;776:41:2;;;30099:21:9;30156:2;30136:18;;;30129:30;30195:33;30175:18;;;30168:61;30246:18;;776:41:2;29915:355:9;712:356:2;847:30;838:5;:39;;;;;;;;:::i;:::-;;834:234;;;893:44;;-1:-1:-1;;;893:44:2;;30477:2:9;893:44:2;;;30459:21:9;30516:2;30496:18;;;30489:30;30555:34;30535:18;;;30528:62;-1:-1:-1;;;30606:18:9;;;30599:32;30648:19;;893:44:2;30275:398:9;834:234:2;967:30;958:5;:39;;;;;;;;:::i;:::-;;954:114;;;1013:44;;-1:-1:-1;;;1013:44:2;;30880:2:9;1013:44:2;;;30862:21:9;30919:2;30899:18;;;30892:30;30958:34;30938:18;;;30931:62;-1:-1:-1;;;31009:18:9;;;31002:32;31051:19;;1013:44:2;30678: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;;;;;;;;;31308:25:9;;;31381:4;31369:17;;31349:18;;;31342:45;;;;31403:18;;;31396:34;;;31446:18;;;31439:34;;;7068:24:2;;31280: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;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;422:131:9;-1:-1:-1;;;;;497:31:9;;487:42;;477:70;;543:1;540;533:12;558:127;619:10;614:3;610:20;607:1;600:31;650:4;647:1;640:15;674:4;671:1;664:15;690:253;762:2;756:9;804:4;792:17;;839:18;824:34;;860:22;;;821:62;818:88;;;886:18;;:::i;:::-;922:2;915:22;690:253;:::o;948:275::-;1019:2;1013:9;1084:2;1065:13;;-1:-1:-1;;1061:27:9;1049:40;;1119:18;1104:34;;1140:22;;;1101:62;1098:88;;;1166:18;;:::i;:::-;1202:2;1195:22;948:275;;-1:-1:-1;948:275:9:o;1228:186::-;1276:4;1309:18;1301:6;1298:30;1295:56;;;1331:18;;:::i;:::-;-1:-1:-1;1397:2:9;1376:15;-1:-1:-1;;1372:29:9;1403:4;1368:40;;1228:186::o;1419:462::-;1461:5;1514:3;1507:4;1499:6;1495:17;1491:27;1481:55;;1532:1;1529;1522:12;1481:55;1568:6;1555:20;1599:48;1615:31;1643:2;1615:31;:::i;:::-;1599:48;:::i;:::-;1672:2;1663:7;1656:19;1718:3;1711:4;1706:2;1698:6;1694:15;1690:26;1687:35;1684:55;;;1735:1;1732;1725:12;1684:55;1800:2;1793:4;1785:6;1781:17;1774:4;1765:7;1761:18;1748:55;1848:1;1823:16;;;1841:4;1819:27;1812:38;;;;1827:7;1419:462;-1:-1:-1;;;1419:462:9:o;1886:523::-;1972:6;1980;1988;2041:2;2029:9;2020:7;2016:23;2012:32;2009:52;;;2057:1;2054;2047:12;2009:52;2096:9;2083:23;2115:31;2140:5;2115:31;:::i;:::-;2165:5;-1:-1:-1;2217:2:9;2202:18;;2189:32;;-1:-1:-1;2272:2:9;2257:18;;2244:32;2299:18;2288:30;;2285:50;;;2331:1;2328;2321:12;2285:50;2354:49;2395:7;2386:6;2375:9;2371:22;2354:49;:::i;:::-;2344:59;;;1886:523;;;;;:::o;2414:388::-;2482:6;2490;2543:2;2531:9;2522:7;2518:23;2514:32;2511:52;;;2559:1;2556;2549:12;2511:52;2598:9;2585:23;2617:31;2642:5;2617:31;:::i;:::-;2667:5;-1:-1:-1;2724:2:9;2709:18;;2696:32;2737:33;2696:32;2737:33;:::i;:::-;2789:7;2779:17;;;2414:388;;;;;:::o;2999:255::-;3066:6;3119:2;3107:9;3098:7;3094:23;3090:32;3087:52;;;3135:1;3132;3125:12;3087:52;3174:9;3161:23;3193:31;3218:5;3193:31;:::i;3259:180::-;3318:6;3371:2;3359:9;3350:7;3346:23;3342:32;3339:52;;;3387:1;3384;3377:12;3339:52;-1:-1:-1;3410:23:9;;3259:180;-1:-1:-1;3259:180:9:o;3652:315::-;3720:6;3728;3781:2;3769:9;3760:7;3756:23;3752:32;3749:52;;;3797:1;3794;3787:12;3749:52;3836:9;3823:23;3855:31;3880:5;3855:31;:::i;:::-;3905:5;3957:2;3942:18;;;;3929:32;;-1:-1:-1;;;3652:315:9:o;4630:258::-;4702:1;4712:113;4726:6;4723:1;4720:13;4712:113;;;4802:11;;;4796:18;4783:11;;;4776:39;4748:2;4741:10;4712:113;;;4843:6;4840:1;4837:13;4834:48;;;4878:1;4869:6;4864:3;4860:16;4853:27;4834:48;;4630:258;;;:::o;4893:257::-;4934:3;4972:5;4966:12;4999:6;4994:3;4987:19;5015:63;5071:6;5064:4;5059:3;5055:14;5048:4;5041:5;5037:16;5015:63;:::i;:::-;5132:2;5111:15;-1:-1:-1;;5107:29:9;5098:39;;;;5139:4;5094:50;;4893:257;-1:-1:-1;;4893:257:9:o;5155:217::-;5302:2;5291:9;5284:21;5265:4;5322:44;5362:2;5351:9;5347:18;5339:6;5322:44;:::i;5377:674::-;5472:6;5480;5488;5541:2;5529:9;5520:7;5516:23;5512:32;5509:52;;;5557:1;5554;5547:12;5509:52;5596:9;5583:23;5615:31;5640:5;5615:31;:::i;:::-;5665:5;-1:-1:-1;5721:2:9;5706:18;;5693:32;5744:18;5774:14;;;5771:34;;;5801:1;5798;5791:12;5771:34;5824:49;5865:7;5856:6;5845:9;5841:22;5824:49;:::i;:::-;5814:59;;5926:2;5915:9;5911:18;5898:32;5882:48;;5955:2;5945:8;5942:16;5939:36;;;5971:1;5968;5961:12;5939:36;;5994:51;6037:7;6026:8;6015:9;6011:24;5994:51;:::i;6289:734::-;6393:6;6401;6409;6417;6425;6478:3;6466:9;6457:7;6453:23;6449:33;6446:53;;;6495:1;6492;6485:12;6446:53;6534:9;6521:23;6553:31;6578:5;6553:31;:::i;:::-;6603:5;-1:-1:-1;6655:2:9;6640:18;;6627:32;;-1:-1:-1;6706:2:9;6691:18;;6678:32;;-1:-1:-1;6762:2:9;6747:18;;6734:32;6775:33;6734:32;6775:33;:::i;:::-;6827:7;-1:-1:-1;6885:3:9;6870:19;;6857:33;6913:18;6902:30;;6899:50;;;6945:1;6942;6935:12;6899:50;6968:49;7009:7;7000:6;6989:9;6985:22;6968:49;:::i;:::-;6958:59;;;6289:734;;;;;;;;:::o;7028:596::-;7114:6;7122;7130;7183:2;7171:9;7162:7;7158:23;7154:32;7151:52;;;7199:1;7196;7189:12;7151:52;7238:9;7225:23;7257:31;7282:5;7257:31;:::i;:::-;7307:5;-1:-1:-1;7364:2:9;7349:18;;7336:32;7377:33;7336:32;7377:33;:::i;:::-;7429:7;-1:-1:-1;7487:2:9;7472:18;;7459:32;7514:18;7503:30;;7500:50;;;7546:1;7543;7536:12;7629:830;7741:6;7749;7757;7765;7773;7781;7834:3;7822:9;7813:7;7809:23;7805:33;7802:53;;;7851:1;7848;7841:12;7802:53;7890:9;7877:23;7909:31;7934:5;7909:31;:::i;:::-;7959:5;-1:-1:-1;8011:2:9;7996:18;;7983:32;;-1:-1:-1;8067:2:9;8052:18;;8039:32;8115:6;8102:20;;8090:33;;8080:61;;8137:1;8134;8127:12;8080:61;8160:7;-1:-1:-1;8214:2:9;8199:18;;8186:32;;-1:-1:-1;8265:3:9;8250:19;;8237:33;;-1:-1:-1;8321:3:9;8306:19;;8293:33;8349:18;8338:30;;8335:50;;;8381:1;8378;8371:12;8335:50;8404:49;8445:7;8436:6;8425:9;8421:22;8404:49;:::i;:::-;8394:59;;;7629:830;;;;;;;;:::o;8464:570::-;8639:2;8628:9;8621:21;8714:1;8710;8705:3;8701:11;8697:19;8688:6;8682:13;8678:39;8673:2;8662:9;8658:18;8651:67;8772:2;8764:6;8760:15;8754:22;8749:2;8738:9;8734:18;8727:50;8845:18;8841:23;8835:2;8827:6;8823:15;8817:22;8813:52;8808:2;8797:9;8793:18;8786:80;8602:4;8913:2;8905:6;8901:15;8895:22;8955:4;8948;8937:9;8933:20;8926:34;8977:51;9023:3;9012:9;9008:19;8994:12;8977:51;:::i;9267:898::-;9387:6;9395;9403;9411;9419;9427;9480:3;9468:9;9459:7;9455:23;9451:33;9448:53;;;9497:1;9494;9487:12;9448:53;9536:9;9523:23;9555:31;9580:5;9555:31;:::i;:::-;9605:5;-1:-1:-1;9662:2:9;9647:18;;9634:32;9675:33;9634:32;9675:33;:::i;:::-;9727:7;-1:-1:-1;9781:2:9;9766:18;;9753:32;;-1:-1:-1;9837:2:9;9822:18;;9809:32;9850:33;9809:32;9850:33;:::i;:::-;9902:7;-1:-1:-1;9961:3:9;9946:19;;9933:33;9975;9933;9975;:::i;:::-;10027:7;-1:-1:-1;10086:3:9;10071:19;;10058:33;10100;10058;10100;:::i;:::-;10152:7;10142:17;;;9267:898;;;;;;;;:::o;10170:407::-;10372:2;10354:21;;;10411:2;10391:18;;;10384:30;10450:34;10445:2;10430:18;;10423:62;-1:-1:-1;;;10516:2:9;10501:18;;10494:41;10567:3;10552:19;;10170:407::o;11462:184::-;11532:6;11585:2;11573:9;11564:7;11560:23;11556:32;11553:52;;;11601:1;11598;11591:12;11553:52;-1:-1:-1;11624:16:9;;11462:184;-1:-1:-1;11462:184:9:o;11651:416::-;11853:2;11835:21;;;11892:2;11872:18;;;11865:30;11931:34;11926:2;11911:18;;11904:62;-1:-1:-1;;;11997:2:9;11982:18;;11975:50;12057:3;12042:19;;11651:416::o;12381:251::-;12451:6;12504:2;12492:9;12483:7;12479:23;12475:32;12472:52;;;12520:1;12517;12510:12;12472:52;12552:9;12546:16;12571:31;12596:5;12571:31;:::i;12637:356::-;12839:2;12821:21;;;12858:18;;;12851:30;12917:34;12912:2;12897:18;;12890:62;12984:2;12969:18;;12637:356::o;12998:127::-;13059:10;13054:3;13050:20;13047:1;13040:31;13090:4;13087:1;13080:15;13114:4;13111:1;13104:15;13548:127;13609:10;13604:3;13600:20;13597:1;13590:31;13640:4;13637:1;13630:15;13664:4;13661:1;13654:15;13680:125;13720:4;13748:1;13745;13742:8;13739:34;;;13753:18;;:::i;:::-;-1:-1:-1;13790:9:9;;13680:125::o;15023:204::-;15061:3;15097:4;15094:1;15090:12;15129:4;15126:1;15122:12;15164:3;15158:4;15154:14;15149:3;15146:23;15143:49;;;15172:18;;:::i;:::-;15208:13;;15023:204;-1:-1:-1;;;15023:204:9:o;15232:175::-;15269:3;15313:4;15306:5;15302:16;15342:4;15333:7;15330:17;15327:43;;;15350:18;;:::i;:::-;15399:1;15386:15;;15232:175;-1:-1:-1;;15232:175:9:o;15823:135::-;15862:3;-1:-1:-1;;15883:17:9;;15880:43;;;15903:18;;:::i;:::-;-1:-1:-1;15950:1:9;15939:13;;15823:135::o;15963:584::-;16176:3;16208:26;16204:31;16277:2;16268:6;16264:2;16260:15;16256:24;16251:3;16244:37;16332:2;16323:6;16319:2;16315:15;16311:24;16306:2;16301:3;16297:12;16290:46;;16365:6;16359:13;16381:62;16436:6;16431:2;16426:3;16422:12;16415:4;16407:6;16403:17;16381:62;:::i;:::-;16502:2;16462:16;;16494:11;;;16487:27;;;;16538:2;16530:11;;15963:584;-1:-1:-1;;;;15963:584:9:o;16896:380::-;16975:1;16971:12;;;;17018;;;17039:61;;17093:4;17085:6;17081:17;17071:27;;17039:61;17146:2;17138:6;17135:14;17115:18;17112:38;17109:161;;;17192:10;17187:3;17183:20;17180:1;17173:31;17227:4;17224:1;17217:15;17255:4;17252:1;17245:15;17109:161;;16896:380;;;:::o;17281:277::-;17348:6;17401:2;17389:9;17380:7;17376:23;17372:32;17369:52;;;17417:1;17414;17407:12;17369:52;17449:9;17443:16;17502:5;17495:13;17488:21;17481:5;17478:32;17468:60;;17524:1;17521;17514:12;19062:128;19102:3;19133:1;19129:6;19126:1;19123:13;19120:39;;;19139:18;;:::i;:::-;-1:-1:-1;19175:9:9;;19062:128::o;19886:415::-;-1:-1:-1;;;;;20127:15:9;;;20109:34;;20179:15;;20174:2;20159:18;;20152:43;20231:2;20226;20211:18;;20204:30;;;20052:4;;20251:44;;20276:18;;20268:6;20251:44;:::i;23959:314::-;-1:-1:-1;;;;;24134:32:9;;24116:51;;24203:2;24198;24183:18;;24176:30;;;-1:-1:-1;;24223:44:9;;24248:18;;24240:6;24223:44;:::i;24971:1262::-;25064:6;25095:2;25138;25126:9;25117:7;25113:23;25109:32;25106:52;;;25154:1;25151;25144:12;25106:52;25187:9;25181:16;25216:18;25257:2;25249:6;25246:14;25243:34;;;25273:1;25270;25263:12;25243:34;25296:22;;;;25352:4;25334:16;;;25330:27;25327:47;;;25370:1;25367;25360:12;25327:47;25396:22;;:::i;:::-;25448:2;25442:9;25460:33;25485:7;25460:33;:::i;:::-;25502:22;;25562:11;;;25556:18;25540:14;;;25533:42;25609:2;25601:11;;25595:18;-1:-1:-1;;25640:33:9;;25632:42;;25622:70;;25688:1;25685;25678:12;25622:70;25719:2;25708:14;;25701:27;25767:2;25759:11;;25753:18;25783:16;;;25780:36;;;25812:1;25809;25802:12;25780:36;25843:8;25839:2;25835:17;25825:27;;;25890:7;25883:4;25879:2;25875:13;25871:27;25861:55;;25912:1;25909;25902:12;25861:55;25941:2;25935:9;25925:19;;25966:48;25982:31;26010:2;25982:31;:::i;25966:48::-;26037:2;26030:5;26023:17;26077:7;26072:2;26067;26063;26059:11;26055:20;26052:33;26049:53;;;26098:1;26095;26088:12;26049:53;26111:54;26162:2;26157;26150:5;26146:14;26141:2;26137;26133:11;26111:54;:::i;:::-;26192:2;26181:14;;26174:29;26185:5;24971:1262;-1:-1:-1;;;;;;24971:1262:9:o;28158:271::-;28239:6;28292:2;28280:9;28271:7;28267:23;28263:32;28260:52;;;28308:1;28305;28298:12;28260:52;28340:9;28334:16;28379:1;28372:5;28369:12;28359:40;;28395:1;28392;28385:12;28434:127;28495:10;28490:3;28486:20;28483:1;28476:31;28526:4;28523:1;28516:15;28550:4;28547:1;28540:15
Swarm Source
ipfs://36219ab918a429fdce341f2929073e190befbb7c069166e8b963bcc654c35c76
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.