Token migration announcement. AurusPLATINUM token contract has migrated to a new address.
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 27 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 19813885 | 123 days ago | IN | 0 ETH | 0.00027345 | ||||
Transfer | 15503377 | 729 days ago | IN | 0 ETH | 0.00238239 | ||||
Mint | 15502327 | 729 days ago | IN | 0 ETH | 0.00156053 | ||||
Transfer | 15171851 | 781 days ago | IN | 0 ETH | 0.0015093 | ||||
Transfer | 15125928 | 788 days ago | IN | 0 ETH | 0.00196902 | ||||
Mint | 15100102 | 792 days ago | IN | 0 ETH | 0.00069951 | ||||
Add Minter | 15100089 | 792 days ago | IN | 0 ETH | 0.00087887 | ||||
Transfer | 14367616 | 910 days ago | IN | 0 ETH | 0.00546505 | ||||
Transfer | 14322527 | 917 days ago | IN | 0 ETH | 0.0049479 | ||||
Transfer | 13802698 | 998 days ago | IN | 0 ETH | 0.0043665 | ||||
Transfer | 13802694 | 998 days ago | IN | 0 ETH | 0.00404584 | ||||
Transfer | 13229555 | 1088 days ago | IN | 0 ETH | 0.0041907 | ||||
Transfer | 13170834 | 1097 days ago | IN | 0 ETH | 0.01039613 | ||||
Transfer | 12824653 | 1151 days ago | IN | 0 ETH | 0.00356051 | ||||
Transfer | 12695827 | 1171 days ago | IN | 0 ETH | 0.00134124 | ||||
Transfer | 12651155 | 1178 days ago | IN | 0 ETH | 0.00101475 | ||||
Transfer | 12651151 | 1178 days ago | IN | 0 ETH | 0.00188497 | ||||
Transfer | 12600052 | 1186 days ago | IN | 0 ETH | 0.00104721 | ||||
Transfer | 12567964 | 1191 days ago | IN | 0 ETH | 0.00234091 | ||||
Transfer | 12567951 | 1191 days ago | IN | 0 ETH | 0.00234091 | ||||
Transfer | 12567946 | 1191 days ago | IN | 0 ETH | 0.00269199 | ||||
Transfer | 12548153 | 1194 days ago | IN | 0 ETH | 0.00112947 | ||||
Transfer | 12497832 | 1202 days ago | IN | 0 ETH | 0.00692097 | ||||
Transfer | 12497832 | 1202 days ago | IN | 0 ETH | 0.00712102 | ||||
Transfer | 12451902 | 1209 days ago | IN | 0 ETH | 0.00743181 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AWP
Compiler Version
v0.5.4+commit.9549d8ff
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-14 */ // File: openzeppelin-solidity/contracts/access/Roles.sol pragma solidity 0.5.4; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File: contracts/roles/BurnerRole.sol /** * @title Burner Role * @dev Follows the openzeppelin's guidelines of working with roles. * @dev Derived contracts must implement the `addBurner` and the `removeBurner` functions. */ contract BurnerRole { using Roles for Roles.Role; Roles.Role private _burners; /** * @notice Fired when a new role is added. */ event BurnerAdded(address indexed account); /** * @notice Fired when a new role is added. */ event BurnerRemoved(address indexed account); /** * @dev The role is granted to the deployer. */ constructor () internal { _addBurner(msg.sender); } /** * @dev Callers must have the role. */ modifier onlyBurner() { require(isBurner(msg.sender), "BurnerRole: caller does not have the Burner role"); _; } /** * @dev The role is removed for the caller. */ function renounceBurner() public { _removeBurner(msg.sender); } /** * @dev Checks if @param account has the role. */ function isBurner(address account) public view returns (bool) { return _burners.has(account); } /** * @dev Assigns the role to @param account. */ function _addBurner(address account) internal { _burners.add(account); emit BurnerAdded(account); } /** * @dev Removes the role from @param account. */ function _removeBurner(address account) internal { _burners.remove(account); emit BurnerRemoved(account); } } // File: contracts/roles/MinterRole.sol /** * @title Minter Role * @dev Follows the openzeppelin's guidelines of working with roles. * @dev Derived contracts must implement the `addMinter` and the `removeMinter` functions. */ contract MinterRole { using Roles for Roles.Role; Roles.Role private _minters; /** * @notice Fired when a new role is added. */ event MinterAdded(address indexed account); /** * @notice Fired when a new role is added. */ event MinterRemoved(address indexed account); /** * @dev The role is granted to the deployer. */ constructor () internal { _addMinter(msg.sender); } /** * @dev Callers must have the role. */ modifier onlyMinter() { require(isMinter(msg.sender), "MinterRole: caller does not have the Minter role"); _; } /** * @dev The role is removed for the caller. */ function renounceMinter() public { _removeMinter(msg.sender); } /** * @dev Checks if @param account has the role. */ function isMinter(address account) public view returns (bool) { return _minters.has(account); } /** * @dev Assigns the role to @param account. */ function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } /** * @dev Removes the role from @param account. */ function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } } // File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see `ERC20Detailed`. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through `transferFrom`. This is * zero by default. * * This value changes when `approve` or `transferFrom` are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * > Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an `Approval` event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to `approve`. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Emitted when the `owner` initiates a force transfer * * Note that `value` may be zero. * Note that `details` may be zero. */ event ForceTransfer(address indexed from, address indexed to, uint256 value, bytes32 details); } // File: openzeppelin-solidity/contracts/math/SafeMath.sol /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } // File: openzeppelin-solidity/contracts/token/ERC20/ERC20Fee.sol /** * @dev Implementation of the `IERC20` interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using `_mint`. * For a generic mechanism see `ERC20Mintable`. * * *For a detailed writeup see our guide [How to implement supply * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).* * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an `Approval` event is emitted on calls to `transferFrom`. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard `decreaseAllowance` and `increaseAllowance` * functions have been added to mitigate the well-known issues around setting * allowances. See `IERC20.approve`. */ contract ERC20Fee is IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; /** * @dev List of whitelisted accounts. * 0 = default (initial value for all accounts) * 1 = verified account * 2 = partner account * 3 = blacklisted account (cannot send or receive tokens) */ mapping (address => uint8) public whitelist; /** * @dev The timestamp when the fee starts. */ uint256 public feeStartTimestamp; /** * @dev List of daily storage fees in order of account level (0 to 2). Value is in mpip (milipip or 1/1000 of a PIP) per day (24 hours) per amount. */ uint[] public dailyStorageFee = [uint32(0), uint32(0), uint32(0)]; /** * @dev List of fixed transfer fees in order of account level (0 to 2). Value is in wei. */ uint[] public fixedTransferFee = [uint32(0), uint32(0), uint32(0)]; /** * @dev List of dynamic transfer fees in order of account level (0 to 2). Value is in mpip (milipip or 1/1000 of a PIP) per amount transferred. */ uint[] public dynamicTransferFee = [uint32(0), uint32(0), uint32(0)]; /** * @dev Minting fee in mpip (milipip or 1/1000 of a PIP) per amount. */ uint256 public mintingFee = 0; /** * @dev Constant mpip divider */ uint256 private constant mpipDivider = 10000000; /** * @dev Account mapping for last day of paid storage fees. */ mapping (address => uint256) public storageFees; /** * @dev The account that receives the fees (minting, storage and transfer). */ address public feeManager; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev Returns the current storage day. */ function getStorageDay() public view returns (uint256) { return (block.timestamp - feeStartTimestamp).div(86400); } /** * @dev Forced transfer from one account to another. Will contain details about AML procedure. */ function _forceTransfer(address sender, address recipient, uint256 amount, bytes32 details) internal { _balances[sender] = _balances[sender].sub(amount); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); emit ForceTransfer(sender, recipient, amount, details); } /** * @dev Calculate the storage fees for an account. */ function calculateStorageFees(address account) public view returns (uint256) { return (((getStorageDay().sub(storageFees[account])).mul(_balances[account])).mul(dailyStorageFee[whitelist[account]])).div(mpipDivider); } /** * @dev Retrieve the storage fees for an account. */ function _retrieveStorageFee(address account) internal { uint256 storageFee = calculateStorageFees(account); storageFees[account] = getStorageDay(); if (storageFee > 0) { _transfer(account,feeManager,storageFee); } } /** * @dev Retrieve the storage fees for an account. */ function _resetStorageFee(address account) internal { storageFees[account] = getStorageDay(); } /** * @dev See `IERC20.totalSupply`. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See `IERC20.balanceOf`. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See `IERC20.transfer`. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(msg.sender, recipient, amount); return true; } /** * @dev See `IERC20.allowance`. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See `IERC20.approve`. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public returns (bool) { _approve(msg.sender, spender, value); return true; } /** * @dev See `IERC20.transferFrom`. * * Emits an `Approval` event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of `ERC20`; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `value`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount)); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to `approve` that can be used as a mitigation for * problems described in `IERC20.approve`. * * Emits an `Approval` event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to `approve` that can be used as a mitigation for * problems described in `IERC20.approve`. * * Emits an `Approval` event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue)); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to `transfer`, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a `Transfer` event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); uint8 level = whitelist[sender]; require(level != 3, "Sender is blacklisted"); uint256 senderFee = calculateStorageFees(sender) + fixedTransferFee[level] + ((dynamicTransferFee[level].mul(amount)).div(mpipDivider)); uint256 receiverStorageFee = calculateStorageFees(recipient); uint256 totalFee = senderFee.add(receiverStorageFee); _balances[sender] = (_balances[sender].sub(amount)).sub(senderFee); _balances[recipient] = (_balances[recipient].add(amount)).sub(receiverStorageFee); storageFees[sender] = getStorageDay(); storageFees[recipient] = getStorageDay(); emit Transfer(sender, recipient, amount); if (totalFee > 0) { _balances[feeManager] = _balances[feeManager].add(totalFee); emit Transfer(sender, feeManager, senderFee); emit Transfer(recipient, feeManager, receiverStorageFee); (bool success, ) = feeManager.call(abi.encodeWithSignature("processFee(uint256)",totalFee)); require(success, "Fee Manager is not responding."); } } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a `Transfer` event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); uint256 mintingFeeAmount = amount.mul(mintingFee).div(mpipDivider); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount).sub(mintingFeeAmount); emit Transfer(address(0), account, (amount.sub(mintingFeeAmount))); if (mintingFeeAmount > 0) { _balances[feeManager] = _balances[feeManager].add(mintingFeeAmount); emit Transfer(address(0), feeManager, mintingFeeAmount); (bool success, ) = feeManager.call(abi.encodeWithSignature("processFee(uint256)",mintingFeeAmount)); require(success, "Fee Manager is not responding."); } } /** * @dev Destoys `amount` tokens from `account`, reducing the * total supply. * * Emits a `Transfer` event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 value) internal { require(account != address(0), "ERC20: burn from the zero address"); _totalSupply = _totalSupply.sub(value); _balances[account] = _balances[account].sub(value); emit Transfer(account, address(0), value); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an `Approval` event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 value) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = value; emit Approval(owner, spender, value); } /** * @dev Destoys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See `_burn` and `_approve`. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount)); } } // File: openzeppelin-solidity/contracts/access/roles/PauserRole.sol contract PauserRole { using Roles for Roles.Role; event PauserAdded(address indexed account); event PauserRemoved(address indexed account); Roles.Role private _pausers; constructor () internal { _addPauser(msg.sender); } modifier onlyPauser() { require(isPauser(msg.sender), "PauserRole: caller does not have the Pauser role"); _; } function isPauser(address account) public view returns (bool) { return _pausers.has(account); } function addPauser(address account) public onlyPauser { _addPauser(account); } function renouncePauser() public { _removePauser(msg.sender); } function _addPauser(address account) internal { _pausers.add(account); emit PauserAdded(account); } function _removePauser(address account) internal { _pausers.remove(account); emit PauserRemoved(account); } } // File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract Pausable is PauserRole { /** * @dev Emitted when the pause is triggered by a pauser (`account`). */ event Paused(address account); /** * @dev Emitted when the pause is lifted by a pauser (`account`). */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. Assigns the Pauser role * to the deployer. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Called by a pauser to pause, triggers stopped state. */ function pause() public onlyPauser whenNotPaused { _paused = true; emit Paused(msg.sender); } /** * @dev Called by a pauser to unpause, returns to normal state. */ function unpause() public onlyPauser whenPaused { _paused = false; emit Unpaused(msg.sender); } } // File: openzeppelin-solidity/contracts/token/ERC20/ERC20StorageFee.sol /** * @title Pausable token * @dev ERC20 modified with pausable transfers. */ contract ERC20StorageFee is ERC20Fee, Pausable { function transfer(address to, uint256 value) public whenNotPaused returns (bool) { return super.transfer(to, value); } function transferFrom(address from, address to, uint256 value) public whenNotPaused returns (bool) { return super.transferFrom(from, to, value); } function approve(address spender, uint256 value) public whenNotPaused returns (bool) { return super.approve(spender, value); } function increaseAllowance(address spender, uint addedValue) public whenNotPaused returns (bool) { return super.increaseAllowance(spender, addedValue); } function decreaseAllowance(address spender, uint subtractedValue) public whenNotPaused returns (bool) { return super.decreaseAllowance(spender, subtractedValue); } } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be aplied to your functions to restrict their use to * the owner. */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * > Note: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/interfaces/IToken.sol /** * @title Token Interface * @dev Exposes token functionality */ interface IToken { function burn(uint256 amount) external ; function mint(address account, uint256 amount) external ; } // File: contracts/token/ECRecovery.sol /** * @title Eliptic curve signature operations * @dev Based on https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d * TODO Remove this library once solidity supports passing a signature to ecrecover. * See https://github.com/ethereum/solidity/issues/864 */ library ECRecovery { /** * @dev Recover signer address from a message by using their signature * @param hash bytes32 message, the hash is the signed message. What is recovered is the signer address. * @param sig bytes signature, the signature is generated using web3.eth.sign() */ function recover(bytes32 hash, bytes memory sig) internal pure returns (address) { bytes32 r; bytes32 s; uint8 v; // Check the signature length if (sig.length != 65) { return (address(0)); } // Divide the signature in r, s and v variables // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solium-disable-next-line security/no-inline-assembly assembly { r := mload(add(sig, 32)) s := mload(add(sig, 64)) v := byte(0, mload(add(sig, 96))) } // Version of signature should be 27 or 28, but 0 and 1 are also possible versions if (v < 27) { v += 27; } // If the version is correct return the signer address if (v != 27 && v != 28) { return (address(0)); } else { // solium-disable-next-line arg-overflow return ecrecover(hash, v, r, s); } } /** * toEthSignedMessageHash * @dev prefix a bytes32 value with "\x19Ethereum Signed Message:" * and hash the result */ 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) ); } } // File: contracts/token/Feeless.sol /** * @title Feeless * @dev Usage: Used as an extension in contracts that want to execute feeless functions. * @dev Usage: Apply the feeless modifier. * @dev Based on https://github.com/bitclave/Feeless */ contract Feeless { /** * @dev The replacement for msg.sender on functions that use the feeless modifier. */ address internal msgSender; /** * @dev Mimics the blockchain nonce relative to this contract (or contract that extents). */ mapping(address => uint256) public nonces; /** * @dev Holds reference to the initial signer of the transaction in the msgSender variable. * @dev After execution the variable is reset. */ modifier feeless() { if (msgSender == address(0)) { msgSender = msg.sender; _; msgSender = address(0); } else { _; } } struct CallResult { bool success; bytes payload; } /// @notice Only the certSign owner can call this function. /// @dev Signed transactions are passed to this function. function performFeelessTransaction( address sender, address target, bytes memory data, uint256 nonce, bytes memory sig) public payable { require(address(this) == target, "Feeless: Target should be the extended contract"); bytes memory prefix = "\x19Ethereum Signed Message:\n32"; bytes32 hash = keccak256(abi.encodePacked(prefix, keccak256(abi.encodePacked(target, data, nonce)))); msgSender = ECRecovery.recover(hash, sig); require(msgSender == sender, "Feeless: Unexpected sender"); require(nonces[msgSender]++ == nonce, "Feeless: nonce does not comply"); (bool _success, bytes memory _payload) = target.call.value(msg.value)(data); CallResult memory callResult = CallResult(_success, _payload); require(callResult.success, "Feeless: Call failed"); msgSender = address(0); } } // File: contracts/token/AWP.sol /** * @title AWP Token * @notice ERC20 token implementation. * @dev Implements mintable, burnable and pausable token interfaces. */ contract AWP is ERC20StorageFee, MinterRole, BurnerRole, Ownable, Feeless, IToken { /** * @dev Fired when a feeless transfer has been executed. */ event TransferFeeless(address indexed account, uint256 indexed value); /** * @dev Fired when a feeless approve has been executed. */ event ApproveFeeless(address indexed spender, uint256 indexed value); /** * @notice ERC20 convention. */ uint8 public constant decimals = 18; /** * @notice ERC20 convention. */ string public constant name = "AurusPLATINUM"; /** * @notice ERC20 convention. */ string public constant symbol = "AWP"; constructor() public { feeStartTimestamp = block.timestamp; } /** * @dev Force a transfer between 2 accounts. AML logs on https://aurus.io/aml */ function forceTransfer(address sender, address recipient, uint256 amount, bytes32 details) external onlyOwner { _forceTransfer(sender,recipient,amount,details); } /** * @dev Set the whitelisting level for an account. */ function whitelistAddress(address account, uint8 level) external onlyOwner { require(level<=3, "Level: Please use level 0 to 3."); whitelist[account] = level; } /** * @dev Set the fees in the system. All the fees are in mpip, except fixedTransferFee that is in wei. Level is between 0 and 2 */ function setFees(uint256 _dailyStorageFee, uint256 _fixedTransferFee, uint256 _dynamicTransferFee, uint256 _mintingFee, uint8 level) external onlyOwner { require(level<=2, "Level: Please use level 0 to 2."); dailyStorageFee[level] = _dailyStorageFee; fixedTransferFee[level] = _fixedTransferFee; dynamicTransferFee[level] = _dynamicTransferFee; mintingFee = _mintingFee; } /** * @dev Set the address where the fees are forwarded. */ function setFeeManager(address account) external onlyOwner { (bool success, ) = feeManager.call(abi.encodeWithSignature("processFee(uint256)",0)); require(success); feeManager = account; } /** * @dev Function called by the owner to force an account to pay storage fee to date. */ function retrieveStorageFee(address account) external onlyOwner { _retrieveStorageFee(account); } /** * @dev Function called by the owner to reset storage fees for selected accounts. */ function resetStorageFees(address[] calldata _accounts) external onlyOwner { for (uint i=0; i<_accounts.length; i++) { _resetStorageFee(_accounts[i]); } } /** * @dev See `MinterRole._addMinter`. */ function addMinter(address account) external onlyOwner { _addMinter(account); } /** * @dev See `MinterRole._removeMinter`. */ function removeMinter(address account) external onlyOwner { _removeMinter(account); } /** * @dev See `BurnerRole._addBurner`. */ function addBurner(address account) external onlyOwner { _addBurner(account); } /** * @dev See `BurnerRole._removeBurner`. */ function removeBurner(address account) external onlyOwner { _removeBurner(account); } /** * @notice The caller must have the `BurnerRole`. * @dev See `ERC20._burn`. */ function burn(uint256 amount) external onlyBurner { _burn(msg.sender, amount); } /** * @notice The caller must have the `MinterRole`. * @dev See `ERC20._mint`. */ function mint(address account, uint256 amount) external onlyMinter { _mint(account, amount); } /** * @notice Feeless ERC20 transfer. */ function transferFeeless(address account, uint256 value) feeless whenNotPaused external { _transfer(msgSender, account, value); emit TransferFeeless(account, value); } /** * @notice Feeless ERC20 transfer. */ function approveFeeless(address spender, uint256 value) feeless whenNotPaused external { _approve(msgSender, spender, value); emit ApproveFeeless(spender, value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeBurner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dynamicTransferFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"calculateStorageFees","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_accounts","type":"address[]"}],"name":"resetStorageFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFeeless","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"storageFees","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getStorageDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"amount","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isBurner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"setFeeManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"target","type":"address"},{"name":"data","type":"bytes"},{"name":"nonce","type":"uint256"},{"name":"sig","type":"bytes"}],"name":"performFeelessTransaction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approveFeeless","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"mintingFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dailyStorageFee","type":"uint256"},{"name":"_fixedTransferFee","type":"uint256"},{"name":"_dynamicTransferFee","type":"uint256"},{"name":"_mintingFee","type":"uint256"},{"name":"level","type":"uint8"}],"name":"setFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"level","type":"uint8"}],"name":"whitelistAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"nonces","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dailyStorageFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fixedTransferFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"retrieveStorageFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeStartTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"},{"name":"details","type":"bytes32"}],"name":"forceTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceBurner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addBurner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"},{"indexed":true,"name":"value","type":"uint256"}],"name":"TransferFeeless","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"spender","type":"address"},{"indexed":true,"name":"value","type":"uint256"}],"name":"ApproveFeeless","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"BurnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"BurnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"details","type":"bytes32"}],"name":"ForceTransfer","type":"event"}]
Contract Creation Code
6080604052606060405190810160405280600063ffffffff1663ffffffff168152602001600063ffffffff1663ffffffff168152602001600063ffffffff1663ffffffff168152506003906003620000599291906200055c565b50606060405190810160405280600063ffffffff1663ffffffff168152602001600063ffffffff1663ffffffff168152602001600063ffffffff1663ffffffff168152506004906003620000af9291906200055c565b50606060405190810160405280600063ffffffff1663ffffffff168152602001600063ffffffff1663ffffffff168152602001600063ffffffff1663ffffffff168152506005906003620001059291906200055c565b5060006006553480156200011857600080fd5b5062000133336200024d640100000000026401000000009004565b6000600c60006101000a81548160ff0219169083151502179055506200016833620002b7640100000000026401000000009004565b620001823362000321640100000000026401000000009004565b33600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a342600281905550620005de565b6200027181600b6200038b640100000000026200553e179091906401000000009004565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b620002db81600d6200038b640100000000026200553e179091906401000000009004565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6200034581600e6200038b640100000000026200553e179091906401000000009004565b8073ffffffffffffffffffffffffffffffffffffffff167f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b9456060405160405180910390a250565b620003a682826200047a640100000000026401000000009004565b1515156200041c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151562000505576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018062005e496022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054828255906000526020600020908101928215620005a3579160200282015b82811115620005a2578251829063ffffffff169055916020019190600101906200057d565b5b509050620005b29190620005b6565b5090565b620005db91905b80821115620005d7576000816000905550600101620005bd565b5090565b90565b61585b80620005ee6000396000f3fe608060405260043610610301576000357c0100000000000000000000000000000000000000000000000000000000900480636b9a5c6c116101ad57806398650275116100f9578063bfdd2184116100b2578063de94e0f61161008c578063de94e0f6146113a5578063e9ec9e8b1461142a578063f2fde38b14611441578063f44637ba1461149257610301565b8063bfdd21841461129e578063d0fb0203146112c9578063dd62ed3e1461132057610301565b8063986502751461107c5780639b19251a146110935780639e6ff610146110fe578063a457c2d71461114f578063a9059cbb146111c2578063aa271e1a1461123557610301565b806383ed3790116101665780638da5cb5b116101405780638da5cb5b14610f155780638f32d59b14610f6c57806395d89b4114610f9b578063983b2d561461102b57610301565b806383ed379014610e605780638456cb5914610eaf5780638929b55e14610ec657610301565b80636b9a5c6c14610cb95780636ef8d66d14610d1757806370a0823114610d2e578063715018a614610d935780637ecebe0014610daa57806382dc1ec414610e0f57610301565b8063313ce5671161026c57806346fbf68e116102255780635522498c116101ff5780635522498c14610b9e5780635a64ad9514610bf95780635c975abb14610c2457806367fcfc3f14610c5357610301565b806346fbf68e14610948578063472d35b9146109b157806351b7949514610a0257610301565b8063313ce5671461078e57806339509351146107bf5780633f4ba83a1461083257806340c10f191461084957806342966c68146108a45780634334614a146108df57610301565b806319feb0fa116102be57806319feb0fa146105395780631f48d35f146105bf57806323b872dd1461061a5780632f53e22f146106ad5780633092afd51461071257806330a6e8a41461076357610301565b8063028468581461030657806305fff8f71461035757806306fdde03146103a657806308286e1214610436578063095ea7b31461049b57806318160ddd1461050e575b600080fd5b34801561031257600080fd5b506103556004803603602081101561032957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114e3565b005b34801561036357600080fd5b506103906004803603602081101561037a57600080fd5b810190808035906020019092919050505061156b565b6040518082815260200191505060405180910390f35b3480156103b257600080fd5b506103bb61158e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103fb5780820151818401526020810190506103e0565b50505050905090810190601f1680156104285780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044257600080fd5b506104856004803603602081101561045957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115c7565b6040518082815260200191505060405180910390f35b3480156104a757600080fd5b506104f4600480360360408110156104be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611708565b604051808215151515815260200191505060405180910390f35b34801561051a57600080fd5b506105236117a1565b6040518082815260200191505060405180910390f35b34801561054557600080fd5b506105bd6004803603602081101561055c57600080fd5b810190808035906020019064010000000081111561057957600080fd5b82018360208201111561058b57600080fd5b803590602001918460208302840111640100000000831117156105ad57600080fd5b90919293919293905050506117ab565b005b3480156105cb57600080fd5b50610618600480360360408110156105e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061187d565b005b34801561062657600080fd5b506106936004803603606081101561063d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b4d565b604051808215151515815260200191505060405180910390f35b3480156106b957600080fd5b506106fc600480360360208110156106d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611be8565b6040518082815260200191505060405180910390f35b34801561071e57600080fd5b506107616004803603602081101561073557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c00565b005b34801561076f57600080fd5b50610778611c88565b6040518082815260200191505060405180910390f35b34801561079a57600080fd5b506107a3611ca9565b604051808260ff1660ff16815260200191505060405180910390f35b3480156107cb57600080fd5b50610818600480360360408110156107e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cae565b604051808215151515815260200191505060405180910390f35b34801561083e57600080fd5b50610847611d47565b005b34801561085557600080fd5b506108a26004803603604081101561086c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611eab565b005b3480156108b057600080fd5b506108dd600480360360208110156108c757600080fd5b8101908080359060200190929190505050611f19565b005b3480156108eb57600080fd5b5061092e6004803603602081101561090257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f86565b604051808215151515815260200191505060405180910390f35b34801561095457600080fd5b506109976004803603602081101561096b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fa3565b604051808215151515815260200191505060405180910390f35b3480156109bd57600080fd5b50610a00600480360360208110156109d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fc0565b005b610b9c600480360360a0811015610a1857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610a7557600080fd5b820183602082011115610a8757600080fd5b80359060200191846001830284011164010000000083111715610aa957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190640100000000811115610b1657600080fd5b820183602082011115610b2857600080fd5b80359060200191846001830284011164010000000083111715610b4a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506121fa565b005b348015610baa57600080fd5b50610bf760048036036040811015610bc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612793565b005b348015610c0557600080fd5b50610c0e612a63565b6040518082815260200191505060405180910390f35b348015610c3057600080fd5b50610c39612a69565b604051808215151515815260200191505060405180910390f35b348015610c5f57600080fd5b50610cb7600480360360a0811015610c7657600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803560ff169060200190929190505050612a80565b005b348015610cc557600080fd5b50610d1560048036036040811015610cdc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612be9565b005b348015610d2357600080fd5b50610d2c612d3d565b005b348015610d3a57600080fd5b50610d7d60048036036020811015610d5157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d48565b6040518082815260200191505060405180910390f35b348015610d9f57600080fd5b50610da8612d90565b005b348015610db657600080fd5b50610df960048036036020811015610dcd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ecd565b6040518082815260200191505060405180910390f35b348015610e1b57600080fd5b50610e5e60048036036020811015610e3257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ee5565b005b348015610e6c57600080fd5b50610e9960048036036020811015610e8357600080fd5b8101908080359060200190929190505050612f51565b6040518082815260200191505060405180910390f35b348015610ebb57600080fd5b50610ec4612f74565b005b348015610ed257600080fd5b50610eff60048036036020811015610ee957600080fd5b81019080803590602001909291905050506130d9565b6040518082815260200191505060405180910390f35b348015610f2157600080fd5b50610f2a6130fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f7857600080fd5b50610f81613126565b604051808215151515815260200191505060405180910390f35b348015610fa757600080fd5b50610fb061317e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ff0578082015181840152602081019050610fd5565b50505050905090810190601f16801561101d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561103757600080fd5b5061107a6004803603602081101561104e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131b7565b005b34801561108857600080fd5b5061109161323f565b005b34801561109f57600080fd5b506110e2600480360360208110156110b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061324a565b604051808260ff1660ff16815260200191505060405180910390f35b34801561110a57600080fd5b5061114d6004803603602081101561112157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061326a565b005b34801561115b57600080fd5b506111a86004803603604081101561117257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132f2565b604051808215151515815260200191505060405180910390f35b3480156111ce57600080fd5b5061121b600480360360408110156111e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061338b565b604051808215151515815260200191505060405180910390f35b34801561124157600080fd5b506112846004803603602081101561125857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613424565b604051808215151515815260200191505060405180910390f35b3480156112aa57600080fd5b506112b3613441565b6040518082815260200191505060405180910390f35b3480156112d557600080fd5b506112de613447565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561132c57600080fd5b5061138f6004803603604081101561134357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061346d565b6040518082815260200191505060405180910390f35b3480156113b157600080fd5b50611428600480360360808110156113c857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506134f4565b005b34801561143657600080fd5b5061143f613582565b005b34801561144d57600080fd5b506114906004803603602081101561146457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061358d565b005b34801561149e57600080fd5b506114e1600480360360208110156114b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613615565b005b6114eb613126565b151561155f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6115688161369d565b50565b60058181548110151561157a57fe5b906000526020600020016000915090505481565b6040805190810160405280600d81526020017f4175727573504c4154494e554d0000000000000000000000000000000000000081525081565b6000611701629896806116f36003600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1681548110151561163157fe5b90600052602060002001546116e56000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116d7600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116c9611c88565b6136f790919063ffffffff16565b61378290919063ffffffff16565b61378290919063ffffffff16565b61380c90919063ffffffff16565b9050919050565b6000600c60009054906101000a900460ff1615151561178f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611799838361389f565b905092915050565b6000600a54905090565b6117b3613126565b1515611827576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008090505b828290508110156118785761186b838383818110151561184957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166138b6565b808060010191505061182d565b505050565b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a525733601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900460ff1615151561199a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6119c7601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383613904565b808273ffffffffffffffffffffffffffffffffffffffff167f5667ad70f18b8164281540d6ea385a4b9e80eef045e39dc7e58a54b33c65978a60405160405180910390a36000601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b49565b600c60009054906101000a900460ff16151515611ad7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611b04601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383613904565b808273ffffffffffffffffffffffffffffffffffffffff167f5667ad70f18b8164281540d6ea385a4b9e80eef045e39dc7e58a54b33c65978a60405160405180910390a35b5050565b6000600c60009054906101000a900460ff16151515611bd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611bdf848484614191565b90509392505050565b60076020528060005260406000206000915090505481565b611c08613126565b1515611c7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611c8581614242565b50565b6000611ca462015180600254420361380c90919063ffffffff16565b905090565b601281565b6000600c60009054906101000a900460ff16151515611d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611d3f838361429c565b905092915050565b611d5033611fa3565b1515611da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061565b6030913960400191505060405180910390fd5b600c60009054906101000a900460ff161515611e2b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b611eb433613424565b1515611f0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806157036030913960400191505060405180910390fd5b611f158282614341565b5050565b611f2233611f86565b1515611f79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806156d36030913960400191505060405180910390fd5b611f833382614899565b50565b6000611f9c82600e614a3990919063ffffffff16565b9050919050565b6000611fb982600b614a3990919063ffffffff16565b9050919050565b611fc8613126565b151561203c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166000604051602401808260ff1681526020019150506040516020818303038152906040527fbe4474b4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310151561213e5780518252602082019150602081019050602083039250612119565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146121a0576040519150601f19603f3d011682016040523d82523d6000602084013e6121a5565b606091505b505090508015156121b557600080fd5b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b8373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515612280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615801602f913960400191505060405180910390fd5b60606040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081868686604051602001808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183805190602001908083835b6020831015156123395780518252602082019150602081019050602083039250612314565b6001836020036101000a0380198251168184511680821785525050505050509050018281526020019350505050604051602081830303815290604052805190602001206040516020018083805190602001908083835b6020831015156123b4578051825260208201915060208101905060208303925061238f565b6001836020036101000a038019825116818451168082178552505050505050905001828152602001925050506040516020818303038152906040528051906020012090506124028184614b19565b601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508673ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4665656c6573733a20556e65787065637465642073656e64657200000000000081525060200191505060405180910390fd5b8360116000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050551415156125ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4665656c6573733a206e6f6e636520646f6573206e6f7420636f6d706c79000081525060200191505060405180910390fd5b600060608773ffffffffffffffffffffffffffffffffffffffff1634886040518082805190602001908083835b60208310151561263f578051825260208201915060208101905060208303925061261a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146126a1576040519150601f19603f3d011682016040523d82523d6000602084013e6126a6565b606091505b50915091506126b361561b565b6040805190810160405280841515815260200183815250905080600001511515612745576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4665656c6573733a2043616c6c206661696c656400000000000000000000000081525060200191505060405180910390fd5b6000601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129685733601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900460ff161515156128b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6128dd601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383614bfd565b808273ffffffffffffffffffffffffffffffffffffffff167f47fd10448ce4fa2ed210fbbc62caf5a4102d280c8ee3888de704e90e8bf1ae7b60405160405180910390a36000601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612a5f565b600c60009054906101000a900460ff161515156129ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612a1a601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383614bfd565b808273ffffffffffffffffffffffffffffffffffffffff167f47fd10448ce4fa2ed210fbbc62caf5a4102d280c8ee3888de704e90e8bf1ae7b60405160405180910390a35b5050565b60065481565b6000600c60009054906101000a900460ff16905090565b612a88613126565b1515612afc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60028160ff1611151515612b78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4c6576656c3a20506c6561736520757365206c6576656c203020746f20322e0081525060200191505060405180910390fd5b8460038260ff16815481101515612b8b57fe5b90600052602060002001819055508360048260ff16815481101515612bac57fe5b90600052602060002001819055508260058260ff16815481101515612bcd57fe5b9060005260206000200181905550816006819055505050505050565b612bf1613126565b1515612c65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60038160ff1611151515612ce1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4c6576656c3a20506c6561736520757365206c6576656c203020746f20332e0081525060200191505060405180910390fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b612d4633614df8565b565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612d98613126565b1515612e0c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60116020528060005260406000206000915090505481565b612eee33611fa3565b1515612f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061565b6030913960400191505060405180910390fd5b612f4e81614e52565b50565b600381815481101515612f6057fe5b906000526020600020016000915090505481565b612f7d33611fa3565b1515612fd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061565b6030913960400191505060405180910390fd5b600c60009054906101000a900460ff16151515613059576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6004818154811015156130e857fe5b906000526020600020016000915090505481565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040805190810160405280600381526020017f415750000000000000000000000000000000000000000000000000000000000081525081565b6131bf613126565b1515613233576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61323c81614eac565b50565b61324833614242565b565b60016020528060005260406000206000915054906101000a900460ff1681565b613272613126565b15156132e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6132ef81614f06565b50565b6000600c60009054906101000a900460ff16151515613379576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6133838383614f99565b905092915050565b6000600c60009054906101000a900460ff16151515613412576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61341c838361503e565b905092915050565b600061343a82600d614a3990919063ffffffff16565b9050919050565b60025481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6134fc613126565b1515613570576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61357c84848484615055565b50505050565b61358b3361369d565b565b613595613126565b1515613609576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61361281615253565b50565b61361d613126565b1515613691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61369a8161539b565b50565b6136b181600e6153f590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e60405160405180910390a250565b6000828211151515613771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b6000808314156137955760009050613806565b600082840290508284828115156137a857fe5b04141515613801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157546021913960400191505060405180910390fd5b809150505b92915050565b60008082111515613885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b6000828481151561389257fe5b0490508091505092915050565b60006138ac338484614bfd565b6001905092915050565b6138be611c88565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561398c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806157b86025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613a14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806156386023913960400191505060405180910390fd5b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060038160ff1614151515613ae1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f53656e64657220697320626c61636b6c6973746564000000000000000000000081525060200191505060405180910390fd5b6000613b2762989680613b198560058660ff16815481101515613b0057fe5b906000526020600020015461378290919063ffffffff16565b61380c90919063ffffffff16565b60048360ff16815481101515613b3957fe5b9060005260206000200154613b4d876115c7565b010190506000613b5c856115c7565b90506000613b7382846154b490919063ffffffff16565b9050613bd883613bca876000808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136f790919063ffffffff16565b6136f790919063ffffffff16565b6000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c7d82613c6f876000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546154b490919063ffffffff16565b6136f790919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613cc7611c88565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613d12611c88565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a3600081111561418857613e3681600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546154b490919063ffffffff16565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051602401808281526020019150506040516020818303038152906040527fbe4474b4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b6020831015156140a65780518252602082019150602081019050602083039250614081565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614108576040519150601f19603f3d011682016040523d82523d6000602084013e61410d565b606091505b50509050801515614186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f466565204d616e61676572206973206e6f7420726573706f6e64696e672e000081525060200191505060405180910390fd5b505b50505050505050565b600061419e848484613904565b614237843361423285600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136f790919063ffffffff16565b614bfd565b600190509392505050565b61425681600d6153f590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b6000614337338461433285600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546154b490919063ffffffff16565b614bfd565b6001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156143e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6000614412629896806144046006548561378290919063ffffffff16565b61380c90919063ffffffff16565b905061442982600a546154b490919063ffffffff16565b600a8190555061449281614484846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546154b490919063ffffffff16565b6136f790919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61453784866136f790919063ffffffff16565b6040518082815260200191505060405180910390a36000811115614894576145c881600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546154b490919063ffffffff16565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a36000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051602401808281526020019150506040516020818303038152906040527fbe4474b4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b6020831015156147b2578051825260208201915060208101905060208303925061478d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614814576040519150601f19603f3d011682016040523d82523d6000602084013e614819565b606091505b50509050801515614892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f466565204d616e61676572206973206e6f7420726573706f6e64696e672e000081525060200191505060405180910390fd5b505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614921576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157976021913960400191505060405180910390fd5b61493681600a546136f790919063ffffffff16565b600a8190555061498d816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136f790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614ac2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806157756022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008060008060418551141515614b365760009350505050614bf7565b6020850151925060408501519150606085015160001a9050601b8160ff161015614b6157601b810190505b601b8160ff1614158015614b795750601c8160ff1614155b15614b8a5760009350505050614bf7565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614be7573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614c85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806157dd6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614d0d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806156b16022913960400191505060405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b614e0c81600b6153f590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b614e6681600b61553e90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b614ec081600d61553e90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6000614f11826115c7565b9050614f1b611c88565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000811115614f9557614f9482600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613904565b5b5050565b6000615034338461502f85600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136f790919063ffffffff16565b614bfd565b6001905092915050565b600061504b338484613904565b6001905092915050565b6150a6826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136f790919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550615139826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546154b490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a38273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f91f8b835be584629107fbfe5be695e33c56ebe55697d7c8a30d309a2b8dce9378484604051808381526020018281526020019250505060405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156152db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061568b6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6153af81600e61553e90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b9456060405160405180910390a250565b6153ff8282614a39565b1515615456576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157336021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000808284019050838110151515615534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6155488282614a39565b1515156155bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b604080519081016040528060001515815260200160608152509056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734275726e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204275726e657220726f6c654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526f6c65733a206163636f756e7420697320746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734665656c6573733a205461726765742073686f756c642062652074686520657874656e64656420636f6e7472616374a165627a7a72305820a18bd6d9899fb5610e00d93724530154d0cdce5ad0d92cf869f7706da599ae9f0029526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373
Deployed Bytecode
0x608060405260043610610301576000357c0100000000000000000000000000000000000000000000000000000000900480636b9a5c6c116101ad57806398650275116100f9578063bfdd2184116100b2578063de94e0f61161008c578063de94e0f6146113a5578063e9ec9e8b1461142a578063f2fde38b14611441578063f44637ba1461149257610301565b8063bfdd21841461129e578063d0fb0203146112c9578063dd62ed3e1461132057610301565b8063986502751461107c5780639b19251a146110935780639e6ff610146110fe578063a457c2d71461114f578063a9059cbb146111c2578063aa271e1a1461123557610301565b806383ed3790116101665780638da5cb5b116101405780638da5cb5b14610f155780638f32d59b14610f6c57806395d89b4114610f9b578063983b2d561461102b57610301565b806383ed379014610e605780638456cb5914610eaf5780638929b55e14610ec657610301565b80636b9a5c6c14610cb95780636ef8d66d14610d1757806370a0823114610d2e578063715018a614610d935780637ecebe0014610daa57806382dc1ec414610e0f57610301565b8063313ce5671161026c57806346fbf68e116102255780635522498c116101ff5780635522498c14610b9e5780635a64ad9514610bf95780635c975abb14610c2457806367fcfc3f14610c5357610301565b806346fbf68e14610948578063472d35b9146109b157806351b7949514610a0257610301565b8063313ce5671461078e57806339509351146107bf5780633f4ba83a1461083257806340c10f191461084957806342966c68146108a45780634334614a146108df57610301565b806319feb0fa116102be57806319feb0fa146105395780631f48d35f146105bf57806323b872dd1461061a5780632f53e22f146106ad5780633092afd51461071257806330a6e8a41461076357610301565b8063028468581461030657806305fff8f71461035757806306fdde03146103a657806308286e1214610436578063095ea7b31461049b57806318160ddd1461050e575b600080fd5b34801561031257600080fd5b506103556004803603602081101561032957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114e3565b005b34801561036357600080fd5b506103906004803603602081101561037a57600080fd5b810190808035906020019092919050505061156b565b6040518082815260200191505060405180910390f35b3480156103b257600080fd5b506103bb61158e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103fb5780820151818401526020810190506103e0565b50505050905090810190601f1680156104285780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044257600080fd5b506104856004803603602081101561045957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115c7565b6040518082815260200191505060405180910390f35b3480156104a757600080fd5b506104f4600480360360408110156104be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611708565b604051808215151515815260200191505060405180910390f35b34801561051a57600080fd5b506105236117a1565b6040518082815260200191505060405180910390f35b34801561054557600080fd5b506105bd6004803603602081101561055c57600080fd5b810190808035906020019064010000000081111561057957600080fd5b82018360208201111561058b57600080fd5b803590602001918460208302840111640100000000831117156105ad57600080fd5b90919293919293905050506117ab565b005b3480156105cb57600080fd5b50610618600480360360408110156105e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061187d565b005b34801561062657600080fd5b506106936004803603606081101561063d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b4d565b604051808215151515815260200191505060405180910390f35b3480156106b957600080fd5b506106fc600480360360208110156106d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611be8565b6040518082815260200191505060405180910390f35b34801561071e57600080fd5b506107616004803603602081101561073557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c00565b005b34801561076f57600080fd5b50610778611c88565b6040518082815260200191505060405180910390f35b34801561079a57600080fd5b506107a3611ca9565b604051808260ff1660ff16815260200191505060405180910390f35b3480156107cb57600080fd5b50610818600480360360408110156107e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cae565b604051808215151515815260200191505060405180910390f35b34801561083e57600080fd5b50610847611d47565b005b34801561085557600080fd5b506108a26004803603604081101561086c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611eab565b005b3480156108b057600080fd5b506108dd600480360360208110156108c757600080fd5b8101908080359060200190929190505050611f19565b005b3480156108eb57600080fd5b5061092e6004803603602081101561090257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f86565b604051808215151515815260200191505060405180910390f35b34801561095457600080fd5b506109976004803603602081101561096b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fa3565b604051808215151515815260200191505060405180910390f35b3480156109bd57600080fd5b50610a00600480360360208110156109d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fc0565b005b610b9c600480360360a0811015610a1857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610a7557600080fd5b820183602082011115610a8757600080fd5b80359060200191846001830284011164010000000083111715610aa957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190640100000000811115610b1657600080fd5b820183602082011115610b2857600080fd5b80359060200191846001830284011164010000000083111715610b4a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506121fa565b005b348015610baa57600080fd5b50610bf760048036036040811015610bc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612793565b005b348015610c0557600080fd5b50610c0e612a63565b6040518082815260200191505060405180910390f35b348015610c3057600080fd5b50610c39612a69565b604051808215151515815260200191505060405180910390f35b348015610c5f57600080fd5b50610cb7600480360360a0811015610c7657600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803560ff169060200190929190505050612a80565b005b348015610cc557600080fd5b50610d1560048036036040811015610cdc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612be9565b005b348015610d2357600080fd5b50610d2c612d3d565b005b348015610d3a57600080fd5b50610d7d60048036036020811015610d5157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d48565b6040518082815260200191505060405180910390f35b348015610d9f57600080fd5b50610da8612d90565b005b348015610db657600080fd5b50610df960048036036020811015610dcd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ecd565b6040518082815260200191505060405180910390f35b348015610e1b57600080fd5b50610e5e60048036036020811015610e3257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ee5565b005b348015610e6c57600080fd5b50610e9960048036036020811015610e8357600080fd5b8101908080359060200190929190505050612f51565b6040518082815260200191505060405180910390f35b348015610ebb57600080fd5b50610ec4612f74565b005b348015610ed257600080fd5b50610eff60048036036020811015610ee957600080fd5b81019080803590602001909291905050506130d9565b6040518082815260200191505060405180910390f35b348015610f2157600080fd5b50610f2a6130fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f7857600080fd5b50610f81613126565b604051808215151515815260200191505060405180910390f35b348015610fa757600080fd5b50610fb061317e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ff0578082015181840152602081019050610fd5565b50505050905090810190601f16801561101d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561103757600080fd5b5061107a6004803603602081101561104e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131b7565b005b34801561108857600080fd5b5061109161323f565b005b34801561109f57600080fd5b506110e2600480360360208110156110b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061324a565b604051808260ff1660ff16815260200191505060405180910390f35b34801561110a57600080fd5b5061114d6004803603602081101561112157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061326a565b005b34801561115b57600080fd5b506111a86004803603604081101561117257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132f2565b604051808215151515815260200191505060405180910390f35b3480156111ce57600080fd5b5061121b600480360360408110156111e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061338b565b604051808215151515815260200191505060405180910390f35b34801561124157600080fd5b506112846004803603602081101561125857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613424565b604051808215151515815260200191505060405180910390f35b3480156112aa57600080fd5b506112b3613441565b6040518082815260200191505060405180910390f35b3480156112d557600080fd5b506112de613447565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561132c57600080fd5b5061138f6004803603604081101561134357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061346d565b6040518082815260200191505060405180910390f35b3480156113b157600080fd5b50611428600480360360808110156113c857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506134f4565b005b34801561143657600080fd5b5061143f613582565b005b34801561144d57600080fd5b506114906004803603602081101561146457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061358d565b005b34801561149e57600080fd5b506114e1600480360360208110156114b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613615565b005b6114eb613126565b151561155f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6115688161369d565b50565b60058181548110151561157a57fe5b906000526020600020016000915090505481565b6040805190810160405280600d81526020017f4175727573504c4154494e554d0000000000000000000000000000000000000081525081565b6000611701629896806116f36003600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1681548110151561163157fe5b90600052602060002001546116e56000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116d7600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116c9611c88565b6136f790919063ffffffff16565b61378290919063ffffffff16565b61378290919063ffffffff16565b61380c90919063ffffffff16565b9050919050565b6000600c60009054906101000a900460ff1615151561178f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611799838361389f565b905092915050565b6000600a54905090565b6117b3613126565b1515611827576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008090505b828290508110156118785761186b838383818110151561184957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166138b6565b808060010191505061182d565b505050565b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a525733601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900460ff1615151561199a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6119c7601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383613904565b808273ffffffffffffffffffffffffffffffffffffffff167f5667ad70f18b8164281540d6ea385a4b9e80eef045e39dc7e58a54b33c65978a60405160405180910390a36000601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b49565b600c60009054906101000a900460ff16151515611ad7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611b04601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383613904565b808273ffffffffffffffffffffffffffffffffffffffff167f5667ad70f18b8164281540d6ea385a4b9e80eef045e39dc7e58a54b33c65978a60405160405180910390a35b5050565b6000600c60009054906101000a900460ff16151515611bd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611bdf848484614191565b90509392505050565b60076020528060005260406000206000915090505481565b611c08613126565b1515611c7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611c8581614242565b50565b6000611ca462015180600254420361380c90919063ffffffff16565b905090565b601281565b6000600c60009054906101000a900460ff16151515611d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611d3f838361429c565b905092915050565b611d5033611fa3565b1515611da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061565b6030913960400191505060405180910390fd5b600c60009054906101000a900460ff161515611e2b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b611eb433613424565b1515611f0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806157036030913960400191505060405180910390fd5b611f158282614341565b5050565b611f2233611f86565b1515611f79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806156d36030913960400191505060405180910390fd5b611f833382614899565b50565b6000611f9c82600e614a3990919063ffffffff16565b9050919050565b6000611fb982600b614a3990919063ffffffff16565b9050919050565b611fc8613126565b151561203c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166000604051602401808260ff1681526020019150506040516020818303038152906040527fbe4474b4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310151561213e5780518252602082019150602081019050602083039250612119565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146121a0576040519150601f19603f3d011682016040523d82523d6000602084013e6121a5565b606091505b505090508015156121b557600080fd5b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b8373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515612280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615801602f913960400191505060405180910390fd5b60606040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081868686604051602001808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183805190602001908083835b6020831015156123395780518252602082019150602081019050602083039250612314565b6001836020036101000a0380198251168184511680821785525050505050509050018281526020019350505050604051602081830303815290604052805190602001206040516020018083805190602001908083835b6020831015156123b4578051825260208201915060208101905060208303925061238f565b6001836020036101000a038019825116818451168082178552505050505050905001828152602001925050506040516020818303038152906040528051906020012090506124028184614b19565b601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508673ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4665656c6573733a20556e65787065637465642073656e64657200000000000081525060200191505060405180910390fd5b8360116000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050551415156125ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4665656c6573733a206e6f6e636520646f6573206e6f7420636f6d706c79000081525060200191505060405180910390fd5b600060608773ffffffffffffffffffffffffffffffffffffffff1634886040518082805190602001908083835b60208310151561263f578051825260208201915060208101905060208303925061261a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146126a1576040519150601f19603f3d011682016040523d82523d6000602084013e6126a6565b606091505b50915091506126b361561b565b6040805190810160405280841515815260200183815250905080600001511515612745576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4665656c6573733a2043616c6c206661696c656400000000000000000000000081525060200191505060405180910390fd5b6000601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129685733601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900460ff161515156128b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6128dd601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383614bfd565b808273ffffffffffffffffffffffffffffffffffffffff167f47fd10448ce4fa2ed210fbbc62caf5a4102d280c8ee3888de704e90e8bf1ae7b60405160405180910390a36000601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612a5f565b600c60009054906101000a900460ff161515156129ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612a1a601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383614bfd565b808273ffffffffffffffffffffffffffffffffffffffff167f47fd10448ce4fa2ed210fbbc62caf5a4102d280c8ee3888de704e90e8bf1ae7b60405160405180910390a35b5050565b60065481565b6000600c60009054906101000a900460ff16905090565b612a88613126565b1515612afc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60028160ff1611151515612b78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4c6576656c3a20506c6561736520757365206c6576656c203020746f20322e0081525060200191505060405180910390fd5b8460038260ff16815481101515612b8b57fe5b90600052602060002001819055508360048260ff16815481101515612bac57fe5b90600052602060002001819055508260058260ff16815481101515612bcd57fe5b9060005260206000200181905550816006819055505050505050565b612bf1613126565b1515612c65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60038160ff1611151515612ce1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4c6576656c3a20506c6561736520757365206c6576656c203020746f20332e0081525060200191505060405180910390fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b612d4633614df8565b565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612d98613126565b1515612e0c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60116020528060005260406000206000915090505481565b612eee33611fa3565b1515612f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061565b6030913960400191505060405180910390fd5b612f4e81614e52565b50565b600381815481101515612f6057fe5b906000526020600020016000915090505481565b612f7d33611fa3565b1515612fd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061565b6030913960400191505060405180910390fd5b600c60009054906101000a900460ff16151515613059576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6004818154811015156130e857fe5b906000526020600020016000915090505481565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040805190810160405280600381526020017f415750000000000000000000000000000000000000000000000000000000000081525081565b6131bf613126565b1515613233576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61323c81614eac565b50565b61324833614242565b565b60016020528060005260406000206000915054906101000a900460ff1681565b613272613126565b15156132e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6132ef81614f06565b50565b6000600c60009054906101000a900460ff16151515613379576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6133838383614f99565b905092915050565b6000600c60009054906101000a900460ff16151515613412576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61341c838361503e565b905092915050565b600061343a82600d614a3990919063ffffffff16565b9050919050565b60025481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6134fc613126565b1515613570576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61357c84848484615055565b50505050565b61358b3361369d565b565b613595613126565b1515613609576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61361281615253565b50565b61361d613126565b1515613691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61369a8161539b565b50565b6136b181600e6153f590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e60405160405180910390a250565b6000828211151515613771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b6000808314156137955760009050613806565b600082840290508284828115156137a857fe5b04141515613801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157546021913960400191505060405180910390fd5b809150505b92915050565b60008082111515613885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b6000828481151561389257fe5b0490508091505092915050565b60006138ac338484614bfd565b6001905092915050565b6138be611c88565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561398c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806157b86025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613a14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806156386023913960400191505060405180910390fd5b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060038160ff1614151515613ae1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f53656e64657220697320626c61636b6c6973746564000000000000000000000081525060200191505060405180910390fd5b6000613b2762989680613b198560058660ff16815481101515613b0057fe5b906000526020600020015461378290919063ffffffff16565b61380c90919063ffffffff16565b60048360ff16815481101515613b3957fe5b9060005260206000200154613b4d876115c7565b010190506000613b5c856115c7565b90506000613b7382846154b490919063ffffffff16565b9050613bd883613bca876000808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136f790919063ffffffff16565b6136f790919063ffffffff16565b6000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c7d82613c6f876000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546154b490919063ffffffff16565b6136f790919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613cc7611c88565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613d12611c88565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a3600081111561418857613e3681600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546154b490919063ffffffff16565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051602401808281526020019150506040516020818303038152906040527fbe4474b4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b6020831015156140a65780518252602082019150602081019050602083039250614081565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614108576040519150601f19603f3d011682016040523d82523d6000602084013e61410d565b606091505b50509050801515614186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f466565204d616e61676572206973206e6f7420726573706f6e64696e672e000081525060200191505060405180910390fd5b505b50505050505050565b600061419e848484613904565b614237843361423285600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136f790919063ffffffff16565b614bfd565b600190509392505050565b61425681600d6153f590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b6000614337338461433285600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546154b490919063ffffffff16565b614bfd565b6001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156143e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6000614412629896806144046006548561378290919063ffffffff16565b61380c90919063ffffffff16565b905061442982600a546154b490919063ffffffff16565b600a8190555061449281614484846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546154b490919063ffffffff16565b6136f790919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61453784866136f790919063ffffffff16565b6040518082815260200191505060405180910390a36000811115614894576145c881600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546154b490919063ffffffff16565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a36000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051602401808281526020019150506040516020818303038152906040527fbe4474b4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b6020831015156147b2578051825260208201915060208101905060208303925061478d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614814576040519150601f19603f3d011682016040523d82523d6000602084013e614819565b606091505b50509050801515614892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f466565204d616e61676572206973206e6f7420726573706f6e64696e672e000081525060200191505060405180910390fd5b505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614921576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157976021913960400191505060405180910390fd5b61493681600a546136f790919063ffffffff16565b600a8190555061498d816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136f790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614ac2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806157756022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008060008060418551141515614b365760009350505050614bf7565b6020850151925060408501519150606085015160001a9050601b8160ff161015614b6157601b810190505b601b8160ff1614158015614b795750601c8160ff1614155b15614b8a5760009350505050614bf7565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614be7573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614c85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806157dd6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614d0d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806156b16022913960400191505060405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b614e0c81600b6153f590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b614e6681600b61553e90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b614ec081600d61553e90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6000614f11826115c7565b9050614f1b611c88565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000811115614f9557614f9482600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613904565b5b5050565b6000615034338461502f85600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136f790919063ffffffff16565b614bfd565b6001905092915050565b600061504b338484613904565b6001905092915050565b6150a6826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136f790919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550615139826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546154b490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a38273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f91f8b835be584629107fbfe5be695e33c56ebe55697d7c8a30d309a2b8dce9378484604051808381526020018281526020019250505060405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156152db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061568b6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6153af81600e61553e90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b9456060405160405180910390a250565b6153ff8282614a39565b1515615456576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157336021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000808284019050838110151515615534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6155488282614a39565b1515156155bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b604080519081016040528060001515815260200160608152509056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734275726e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204275726e657220726f6c654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526f6c65733a206163636f756e7420697320746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734665656c6573733a205461726765742073686f756c642062652074686520657874656e64656420636f6e7472616374a165627a7a72305820a18bd6d9899fb5610e00d93724530154d0cdce5ad0d92cf869f7706da599ae9f0029
Deployed Bytecode Sourcemap
35131:4351:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38443:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38443:99:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38443:99:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;13560:68;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13560:68:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13560:68:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35684:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35684:45:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;35684:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15014:232;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15014:232:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15014:232:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27405:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27405:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27405:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15852:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15852:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37690:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37690:190:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37690:190:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;37690:190:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37690:190:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37690:190:0;;;;;;;;;;;;:::i;:::-;;39036;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39036:190:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39036:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27237:160;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27237:160:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27237:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13958:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13958:47:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13958:47:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38112:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38112:99:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38112:99:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;14326:129;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14326:129:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35588:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35588:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27553:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27553:167:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27553:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;26759:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26759:118:0;;;:::i;:::-;;38862:108;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38862:108:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38862:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38655:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38655:94:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38655:94:0;;;;;;;;;;;;;;;;;:::i;:::-;;2218:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2218:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2218:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24276;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24276:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24276:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37130:220;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37130:220:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37130:220:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;34017:926;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;34017:926:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;34017:926:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;34017:926:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;34017:926:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;34017:926:0;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;34017:926:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;34017:926:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;34017:926:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;34017:926:0;;;;;;;;;;;;;;;:::i;:::-;;39292:187;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39292:187:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39292:187:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13729:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13729:29:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25968:78;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25968:78:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36623:422;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36623:422:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;36623:422:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36282:183;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36282:183:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36282:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24493:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24493:77:0;;;:::i;:::-;;16006:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16006:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16006:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29601:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29601:140:0;;;:::i;:::-;;33381:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33381:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33381:41:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24393:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24393:92:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24393:92:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;13132:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13132:65:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13132:65:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26548:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26548:116:0;;;:::i;:::-;;13318:66;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13318:66:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13318:66:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28790:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28790:79:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;29156:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29156:92:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35794:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35794:37:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;35794:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37948:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37948:93:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37948:93:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;3729:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3729:77:0;;;:::i;:::-;;12802:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12802:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12802:43:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37466:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37466:111:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37466:111:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;27728:177;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27728:177:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27728:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27097:132;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27097:132:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27097:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3884:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3884:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3884:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12920:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12920:32:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14113:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14113:25:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16548:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16548:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16548:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36024:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36024:176:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;36024:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2063:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2063:77:0;;;:::i;:::-;;29896:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29896:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29896:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;38279:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38279:93:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38279:93:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;38443:99;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38512:22;38526:7;38512:13;:22::i;:::-;38443:99;:::o;13560:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35684:45::-;;;;;;;;;;;;;;;;;;;;:::o;15014:232::-;15082:7;15109:129;13859:8;15110:110;15184:15;15200:9;:18;15210:7;15200:18;;;;;;;;;;;;;;;;;;;;;;;;;15184:35;;;;;;;;;;;;;;;;;;;;15111:67;15159:9;:18;15169:7;15159:18;;;;;;;;;;;;;;;;15112:41;15132:11;:20;15144:7;15132:20;;;;;;;;;;;;;;;;15112:15;:13;:15::i;:::-;:19;;:41;;;;:::i;:::-;15111:47;;:67;;;;:::i;:::-;15110:73;;:110;;;;:::i;:::-;15109:116;;:129;;;;:::i;:::-;15102:136;;15014:232;;;:::o;27405:140::-;27484:4;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27508:29;27522:7;27531:5;27508:13;:29::i;:::-;27501:36;;27405:140;;;;:::o;15852:91::-;15896:7;15923:12;;15916:19;;15852:91;:::o;37690:190::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37781:6;37788:1;37781:8;;37776:97;37793:9;;:16;;37791:1;:18;37776:97;;;37831:30;37848:9;;37858:1;37848:12;;;;;;;;;;;;;;;;;37831:16;:30::i;:::-;37811:3;;;;;;;37776:97;;;;37690:190;;:::o;39036:::-;33653:1;33632:23;;:9;;;;;;;;;;;:23;;;33628:165;;;33684:10;33672:9;;:22;;;;;;;;;;;;;;;;;;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39135:36;39145:9;;;;;;;;;;;39156:7;39165:5;39135:9;:36::i;:::-;39212:5;39203:7;39187:31;;;;;;;;;;;;33745:1;33725:9;;:22;;;;;;;;;;;;;;;;;;33628:165;;;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39135:36;39145:9;;;;;;;;;;;39156:7;39165:5;39135:9;:36::i;:::-;39212:5;39203:7;39187:31;;;;;;;;;;;;33628:165;39036:190;;:::o;27237:160::-;27330:4;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27354:35;27373:4;27379:2;27383:5;27354:18;:35::i;:::-;27347:42;;27237:160;;;;;:::o;13958:47::-;;;;;;;;;;;;;;;;;:::o;38112:99::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38181:22;38195:7;38181:13;:22::i;:::-;38112:99;:::o;14326:129::-;14372:7;14399:48;14441:5;14418:17;;14400:15;:35;14399:41;;:48;;;;:::i;:::-;14392:55;;14326:129;:::o;35588:35::-;35621:2;35588:35;:::o;27553:167::-;27644:4;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27668:44;27692:7;27701:10;27668:23;:44::i;:::-;27661:51;;27553:167;;;;:::o;26759:118::-;24175:20;24184:10;24175:8;:20::i;:::-;24167:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26404:7;;;;;;;;;;;26396:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26828:5;26818:7;;:15;;;;;;;;;;;;;;;;;;26849:20;26858:10;26849:20;;;;;;;;;;;;;;;;;;;;;;26759:118::o;38862:108::-;3557:20;3566:10;3557:8;:20::i;:::-;3549:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38940:22;38946:7;38955:6;38940:5;:22::i;:::-;38862:108;;:::o;38655:94::-;1891:20;1900:10;1891:8;:20::i;:::-;1883:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38716:25;38722:10;38734:6;38716:5;:25::i;:::-;38655:94;:::o;2218:109::-;2274:4;2298:21;2311:7;2298:8;:12;;:21;;;;:::i;:::-;2291:28;;2218:109;;;:::o;24276:::-;24332:4;24356:21;24369:7;24356:8;:12;;:21;;;;:::i;:::-;24349:28;;24276:109;;;:::o;37130:220::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37201:12;37219:10;;;;;;;;;;;:15;;37281:1;37235:48;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;37235:48:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;37235:48:0;37219:65;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;37219:65:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;37200:84:0;;;37303:7;37295:16;;;;;;;;37335:7;37322:10;;:20;;;;;;;;;;;;;;;;;;29059:1;37130:220;:::o;34017:926::-;34237:6;34220:23;;34228:4;34220:23;;;34212:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34312:19;:56;;;;;;;;;;;;;;;;;;;;34379:12;34421:6;34456;34464:4;34470:5;34439:37;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;34439:37:0;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;34439:37:0;;;34429:48;;;;;;34404:74;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;34404:74:0;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;34404:74:0;;;34394:85;;;;;;34379:100;;34502:29;34521:4;34527:3;34502:18;:29::i;:::-;34490:9;;:41;;;;;;;;;;;;;;;;;;34563:6;34550:19;;:9;;;;;;;;;;;:19;;;34542:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34642:5;34619:6;:17;34626:9;;;;;;;;;;;34619:17;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;:28;34611:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34694:13;34709:21;34734:6;:11;;34752:9;34763:4;34734:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;34734:34:0;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;34693:75:0;;;;34779:28;;:::i;:::-;34810:30;;;;;;;;;34821:8;34810:30;;;;;;34831:8;34810:30;;;34779:61;;34859:10;:18;;;34851:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34933:1;34913:9;;:22;;;;;;;;;;;;;;;;;;34017:926;;;;;;;;;;:::o;39292:187::-;33653:1;33632:23;;:9;;;;;;;;;;;:23;;;33628:165;;;33684:10;33672:9;;:22;;;;;;;;;;;;;;;;;;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39390:35;39399:9;;;;;;;;;;;39410:7;39419:5;39390:8;:35::i;:::-;39465:5;39456:7;39441:30;;;;;;;;;;;;33745:1;33725:9;;:22;;;;;;;;;;;;;;;;;;33628:165;;;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39390:35;39399:9;;;;;;;;;;;39410:7;39419:5;39390:8;:35::i;:::-;39465:5;39456:7;39441:30;;;;;;;;;;;;33628:165;39292:187;;:::o;13729:29::-;;;;:::o;25968:78::-;26007:4;26031:7;;;;;;;;;;;26024:14;;25968:78;:::o;36623:422::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36801:1;36794:5;:8;;;;36786:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36874:16;36849:15;36865:5;36849:22;;;;;;;;;;;;;;;;;;;:41;;;;36927:17;36901:16;36918:5;36901:23;;;;;;;;;;;;;;;;;;;:43;;;;36983:19;36955:18;36974:5;36955:25;;;;;;;;;;;;;;;;;;;:47;;;;37026:11;37013:10;:24;;;;36623:422;;;;;:::o;36282:183::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36383:1;36376:5;:8;;;;36368:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36452:5;36431:9;:18;36441:7;36431:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;36282:183;;:::o;24493:77::-;24537:25;24551:10;24537:13;:25::i;:::-;24493:77::o;16006:110::-;16063:7;16090:9;:18;16100:7;16090:18;;;;;;;;;;;;;;;;16083:25;;16006:110;;;:::o;29601:140::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29700:1;29663:40;;29684:6;;;;;;;;;;;29663:40;;;;;;;;;;;;29731:1;29714:6;;:19;;;;;;;;;;;;;;;;;;29601:140::o;33381:41::-;;;;;;;;;;;;;;;;;:::o;24393:92::-;24175:20;24184:10;24175:8;:20::i;:::-;24167:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24458:19;24469:7;24458:10;:19::i;:::-;24393:92;:::o;13132:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26548:116::-;24175:20;24184:10;24175:8;:20::i;:::-;24167:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26618:4;26608:7;;:14;;;;;;;;;;;;;;;;;;26638:18;26645:10;26638:18;;;;;;;;;;;;;;;;;;;;;;26548:116::o;13318:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28790:79::-;28828:7;28855:6;;;;;;;;;;;28848:13;;28790:79;:::o;29156:92::-;29196:4;29234:6;;;;;;;;;;;29220:20;;:10;:20;;;29213:27;;29156:92;:::o;35794:37::-;;;;;;;;;;;;;;;;;;;;:::o;37948:93::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38014:19;38025:7;38014:10;:19::i;:::-;37948:93;:::o;3729:77::-;3773:25;3787:10;3773:13;:25::i;:::-;3729:77::o;12802:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;37466:111::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37541:28;37561:7;37541:19;:28::i;:::-;37466:111;:::o;27728:177::-;27824:4;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27848:49;27872:7;27881:15;27848:23;:49::i;:::-;27841:56;;27728:177;;;;:::o;27097:132::-;27172:4;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27196:25;27211:2;27215:5;27196:14;:25::i;:::-;27189:32;;27097:132;;;;:::o;3884:109::-;3940:4;3964:21;3977:7;3964:8;:12;;:21;;;;:::i;:::-;3957:28;;3884:109;;;:::o;12920:32::-;;;;:::o;14113:25::-;;;;;;;;;;;;;:::o;16548:134::-;16620:7;16647:11;:18;16659:5;16647:18;;;;;;;;;;;;;;;:27;16666:7;16647:27;;;;;;;;;;;;;;;;16640:34;;16548:134;;;;:::o;36024:176::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36145:47;36160:6;36167:9;36177:6;36184:7;36145:14;:47::i;:::-;36024:176;;;;:::o;2063:77::-;2107:25;2121:10;2107:13;:25::i;:::-;2063:77::o;29896:109::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29969:28;29988:8;29969:18;:28::i;:::-;29896:109;:::o;38279:93::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38345:19;38356:7;38345:10;:19::i;:::-;38279:93;:::o;2601:130::-;2661:24;2677:7;2661:8;:15;;:24;;;;:::i;:::-;2715:7;2701:22;;;;;;;;;;;;2601:130;:::o;8879:184::-;8937:7;8970:1;8965;:6;;8957:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9017:9;9033:1;9029;:5;9017:17;;9054:1;9047:8;;;8879:184;;;;:::o;9314:470::-;9372:7;9621:1;9616;:6;9612:47;;;9646:1;9639:8;;;;9612:47;9671:9;9687:1;9683;:5;9671:17;;9716:1;9711;9707;:5;;;;;;;;:10;9699:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9775:1;9768:8;;;9314:470;;;;;:::o;10252:333::-;10310:7;10409:1;10405;:5;10397:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10452:9;10468:1;10464;:5;;;;;;;;10452:17;;10576:1;10569:8;;;10252:333;;;;:::o;16829:148::-;16894:4;16911:36;16920:10;16932:7;16941:5;16911:8;:36::i;:::-;16965:4;16958:11;;16829:148;;;;:::o;15678:109::-;15764:15;:13;:15::i;:::-;15741:11;:20;15753:7;15741:20;;;;;;;;;;;;;;;:38;;;;15678:109;:::o;19528:1373::-;19644:1;19626:20;;:6;:20;;;;19618:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19728:1;19707:23;;:9;:23;;;;19699:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19785:11;19799:9;:17;19809:6;19799:17;;;;;;;;;;;;;;;;;;;;;;;;;19785:31;;19844:1;19835:5;:10;;;;19827:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19884:17;19962:56;13859:8;19963:37;19993:6;19963:18;19982:5;19963:25;;;;;;;;;;;;;;;;;;;;:29;;:37;;;;:::i;:::-;19962:43;;:56;;;;:::i;:::-;19935:16;19952:5;19935:23;;;;;;;;;;;;;;;;;;;;19904:28;19925:6;19904:20;:28::i;:::-;:54;:115;19884:135;;20030:26;20059:31;20080:9;20059:20;:31::i;:::-;20030:60;;20101:16;20120:33;20134:18;20120:9;:13;;:33;;;;:::i;:::-;20101:52;;20186:46;20222:9;20187:29;20209:6;20187:9;:17;20197:6;20187:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;20186:35;;:46;;;;:::i;:::-;20166:9;:17;20176:6;20166:17;;;;;;;;;;;;;;;:66;;;;20266:58;20305:18;20267:32;20292:6;20267:9;:20;20277:9;20267:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;20266:38;;:58;;;;:::i;:::-;20243:9;:20;20253:9;20243:20;;;;;;;;;;;;;;;:81;;;;20359:15;:13;:15::i;:::-;20337:11;:19;20349:6;20337:19;;;;;;;;;;;;;;;:37;;;;20410:15;:13;:15::i;:::-;20385:11;:22;20397:9;20385:22;;;;;;;;;;;;;;;:40;;;;20458:9;20441:35;;20450:6;20441:35;;;20469:6;20441:35;;;;;;;;;;;;;;;;;;20504:1;20493:8;:12;20489:405;;;20546:35;20572:8;20546:9;:21;20556:10;;;;;;;;;;;20546:21;;;;;;;;;;;;;;;;:25;;:35;;;;:::i;:::-;20522:9;:21;20532:10;;;;;;;;;;;20522:21;;;;;;;;;;;;;;;:59;;;;20618:10;;;;;;;;;;;20601:39;;20610:6;20601:39;;;20630:9;20601:39;;;;;;;;;;;;;;;;;;20680:10;;;;;;;;;;;20660:51;;20669:9;20660:51;;;20692:18;20660:51;;;;;;;;;;;;;;;;;;20727:12;20745:10;;;;;;;;;;;:15;;20807:8;20761:55;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;20761:55:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;20761:55:0;20745:72;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20745:72:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;20726:91:0;;;20840:7;20832:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20489:405;;19528:1373;;;;;;;:::o;17448:256::-;17537:4;17554:36;17564:6;17572:9;17583:6;17554:9;:36::i;:::-;17601:73;17610:6;17618:10;17630:43;17666:6;17630:11;:19;17642:6;17630:19;;;;;;;;;;;;;;;:31;17650:10;17630:31;;;;;;;;;;;;;;;;:35;;:43;;;;:::i;:::-;17601:8;:73::i;:::-;17692:4;17685:11;;17448:256;;;;;:::o;4267:130::-;4327:24;4343:7;4327:8;:15;;:24;;;;:::i;:::-;4381:7;4367:22;;;;;;;;;;;;4267:130;:::o;18113:206::-;18193:4;18210:79;18219:10;18231:7;18240:48;18277:10;18240:11;:23;18252:10;18240:23;;;;;;;;;;;;;;;:32;18264:7;18240:32;;;;;;;;;;;;;;;;:36;;:48;;;;:::i;:::-;18210:8;:79::i;:::-;18307:4;18300:11;;18113:206;;;;:::o;21182:814::-;21277:1;21258:21;;:7;:21;;;;21250:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21328:24;21355:39;13859:8;21355:22;21366:10;;21355:6;:10;;:22;;;;:::i;:::-;:26;;:39;;;;:::i;:::-;21328:66;;21422:24;21439:6;21422:12;;:16;;:24;;;;:::i;:::-;21407:12;:39;;;;21478:52;21513:16;21478:30;21501:6;21478:9;:18;21488:7;21478:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;:34;;:52;;;;:::i;:::-;21457:9;:18;21467:7;21457:18;;;;;;;;;;;;;;;:73;;;;21567:7;21546:61;;21563:1;21546:61;;;21577:28;21588:16;21577:6;:10;;:28;;;;:::i;:::-;21546:61;;;;;;;;;;;;;;;;;;21643:1;21624:16;:20;21620:369;;;21685:43;21711:16;21685:9;:21;21695:10;;;;;;;;;;;21685:21;;;;;;;;;;;;;;;;:25;;:43;;;;:::i;:::-;21661:9;:21;21671:10;;;;;;;;;;;21661:21;;;;;;;;;;;;;;;:67;;;;21769:10;;;;;;;;;;;21748:50;;21765:1;21748:50;;;21781:16;21748:50;;;;;;;;;;;;;;;;;;21814:12;21832:10;;;;;;;;;;;:15;;21894:16;21848:63;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;21848:63:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;21848:63:0;21832:80;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;21832:80:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;21813:99:0;;;21935:7;21927:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21620:369;;21182:814;;;:::o;22328:306::-;22422:1;22403:21;;:7;:21;;;;22395:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22490:23;22507:5;22490:12;;:16;;:23;;;;:::i;:::-;22475:12;:38;;;;22545:29;22568:5;22545:9;:18;22555:7;22545:18;;;;;;;;;;;;;;;;:22;;:29;;;;:::i;:::-;22524:9;:18;22534:7;22524:18;;;;;;;;;;;;;;;:50;;;;22616:1;22590:36;;22599:7;22590:36;;;22620:5;22590:36;;;;;;;;;;;;;;;;;;22328:306;;:::o;868:203::-;940:4;984:1;965:21;;:7;:21;;;;957:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1043:4;:11;;:20;1055:7;1043:20;;;;;;;;;;;;;;;;;;;;;;;;;1036:27;;868:203;;;;:::o;31239:1115::-;31338:7;31363:9;31383;31403:7;31480:2;31466:3;:10;:16;;31462:68;;;31515:1;31499:19;;;;;;;31462:68;31833:2;31828:3;31824:12;31818:19;31813:24;;31871:2;31866:3;31862:12;31856:19;31851:24;;31917:2;31912:3;31908:12;31902:19;31899:1;31894:28;31889:33;;32045:2;32041:1;:6;;;32037:46;;;32069:2;32064:7;;;;32037:46;32168:2;32163:1;:7;;;;:18;;;;;32179:2;32174:1;:7;;;;32163:18;32159:188;;;32214:1;32198:19;;;;;;;32159:188;32311:24;32321:4;32327:1;32330;32333;32311:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32311:24:0;;;;;;;;32304:31;;;;;31239:1115;;;;;:::o;23074:335::-;23184:1;23167:19;;:5;:19;;;;23159:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23265:1;23246:21;;:7;:21;;;;23238:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23349:5;23319:11;:18;23331:5;23319:18;;;;;;;;;;;;;;;:27;23338:7;23319:27;;;;;;;;;;;;;;;:35;;;;23386:7;23370:31;;23379:5;23370:31;;;23395:5;23370:31;;;;;;;;;;;;;;;;;;23074:335;;;:::o;24708:130::-;24768:24;24784:7;24768:8;:15;;:24;;;;:::i;:::-;24822:7;24808:22;;;;;;;;;;;;24708:130;:::o;24578:122::-;24635:21;24648:7;24635:8;:12;;:21;;;;:::i;:::-;24684:7;24672:20;;;;;;;;;;;;24578:122;:::o;4068:::-;4125:21;4138:7;4125:8;:12;;:21;;;;:::i;:::-;4174:7;4162:20;;;;;;;;;;;;4068:122;:::o;15327:270::-;15393:18;15414:29;15435:7;15414:20;:29::i;:::-;15393:50;;15477:15;:13;:15::i;:::-;15454:11;:20;15466:7;15454:20;;;;;;;;;;;;;;;:38;;;;15520:1;15507:10;:14;15503:87;;;15538:40;15548:7;15556:10;;;;;;;;;;;15567;15538:9;:40::i;:::-;15503:87;15327:270;;:::o;18822:216::-;18907:4;18924:84;18933:10;18945:7;18954:53;18991:15;18954:11;:23;18966:10;18954:23;;;;;;;;;;;;;;;:32;18978:7;18954:32;;;;;;;;;;;;;;;;:36;;:53;;;;:::i;:::-;18924:8;:84::i;:::-;19026:4;19019:11;;18822:216;;;;:::o;16329:156::-;16398:4;16415:40;16425:10;16437:9;16448:6;16415:9;:40::i;:::-;16473:4;16466:11;;16329:156;;;;:::o;14581:351::-;14713:29;14735:6;14713:9;:17;14723:6;14713:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;14693:9;:17;14703:6;14693:17;;;;;;;;;;;;;;;:49;;;;14776:32;14801:6;14776:9;:20;14786:9;14776:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;14753:9;:20;14763:9;14753:20;;;;;;;;;;;;;;;:55;;;;14841:9;14824:35;;14833:6;14824:35;;;14852:6;14824:35;;;;;;;;;;;;;;;;;;14897:9;14875:49;;14889:6;14875:49;;;14908:6;14916:7;14875:49;;;;;;;;;;;;;;;;;;;;;;;;14581:351;;;;:::o;30111:229::-;30205:1;30185:22;;:8;:22;;;;30177:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30295:8;30266:38;;30287:6;;;;;;;;;;;30266:38;;;;;;;;;;;;30324:8;30315:6;;:17;;;;;;;;;;;;;;;;;;30111:229;:::o;2402:122::-;2459:21;2472:7;2459:8;:12;;:21;;;;:::i;:::-;2508:7;2496:20;;;;;;;;;;;;2402:122;:::o;590:183::-;670:18;674:4;680:7;670:3;:18::i;:::-;662:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;760:5;737:4;:11;;:20;749:7;737:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;590:183;;:::o;8423:181::-;8481:7;8501:9;8517:1;8513;:5;8501:17;;8542:1;8537;:6;;8529:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8595:1;8588:8;;;8423:181;;;;:::o;332:178::-;410:18;414:4;420:7;410:3;:18::i;:::-;409:19;401:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;498:4;475;:11;;:20;487:7;475:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;332:178;;:::o;35131:4351::-;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://a18bd6d9899fb5610e00d93724530154d0cdce5ad0d92cf869f7706da599ae9f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.