ERC-721
NFT
Overview
Max Total Supply
0 AZP
Holders
2,687
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 AZPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Ecliptic
Compiler Version
v0.4.24+commit.e67f0147
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-26 */ // the azimuth logic contract // https://azimuth.network pragma solidity 0.4.24; //////////////////////////////////////////////////////////////////////////////// // Imports //////////////////////////////////////////////////////////////////////////////// // OpenZeppelin's Ownable.sol /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { _transferOwnership(_newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function _transferOwnership(address _newOwner) internal { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } // Azimuth's SafeMath8.sol /** * @title SafeMath8 * @dev Math operations for uint8 with safety checks that throw on error */ library SafeMath8 { function mul(uint8 a, uint8 b) internal pure returns (uint8) { uint8 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint8 a, uint8 b) internal pure returns (uint8) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint8 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint8 a, uint8 b) internal pure returns (uint8) { assert(b <= a); return a - b; } function add(uint8 a, uint8 b) internal pure returns (uint8) { uint8 c = a + b; assert(c >= a); return c; } } // Azimuth's SafeMath16.sol /** * @title SafeMath16 * @dev Math operations for uint16 with safety checks that throw on error */ library SafeMath16 { function mul(uint16 a, uint16 b) internal pure returns (uint16) { uint16 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint16 a, uint16 b) internal pure returns (uint16) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint16 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint16 a, uint16 b) internal pure returns (uint16) { assert(b <= a); return a - b; } function add(uint16 a, uint16 b) internal pure returns (uint16) { uint16 c = a + b; assert(c >= a); return c; } } // OpenZeppelin's SafeMath.sol /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting '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; } c = _a * _b; assert(c / _a == _b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 _a, uint256 _b) internal pure returns (uint256) { // assert(_b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = _a / _b; // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold return _a / _b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { assert(_b <= _a); return _a - _b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) { c = _a + _b; assert(c >= _a); return c; } } // OpenZeppelin's ERC165.sol /** * @title ERC165 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md */ interface ERC165 { /** * @notice Query if a contract implements an interface * @param _interfaceId The interface identifier, as specified in ERC-165 * @dev Interface identification is specified in ERC-165. This function * uses less than 30,000 gas. */ function supportsInterface(bytes4 _interfaceId) external view returns (bool); } // OpenZeppelin's SupportsInterfaceWithLookup.sol /** * @title SupportsInterfaceWithLookup * @author Matt Condon (@shrugs) * @dev Implements ERC165 using a lookup table. */ contract SupportsInterfaceWithLookup is ERC165 { bytes4 public constant InterfaceId_ERC165 = 0x01ffc9a7; /** * 0x01ffc9a7 === * bytes4(keccak256('supportsInterface(bytes4)')) */ /** * @dev a mapping of interface id to whether or not it's supported */ mapping(bytes4 => bool) internal supportedInterfaces; /** * @dev A contract implementing SupportsInterfaceWithLookup * implement ERC165 itself */ constructor() public { _registerInterface(InterfaceId_ERC165); } /** * @dev implement supportsInterface(bytes4) using a lookup table */ function supportsInterface(bytes4 _interfaceId) external view returns (bool) { return supportedInterfaces[_interfaceId]; } /** * @dev private method for registering an interface */ function _registerInterface(bytes4 _interfaceId) internal { require(_interfaceId != 0xffffffff); supportedInterfaces[_interfaceId] = true; } } // OpenZeppelin's ERC721Basic.sol /** * @title ERC721 Non-Fungible Token Standard basic interface * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Basic is ERC165 { bytes4 internal constant InterfaceId_ERC721 = 0x80ac58cd; /* * 0x80ac58cd === * bytes4(keccak256('balanceOf(address)')) ^ * bytes4(keccak256('ownerOf(uint256)')) ^ * bytes4(keccak256('approve(address,uint256)')) ^ * bytes4(keccak256('getApproved(uint256)')) ^ * bytes4(keccak256('setApprovalForAll(address,bool)')) ^ * bytes4(keccak256('isApprovedForAll(address,address)')) ^ * bytes4(keccak256('transferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) */ bytes4 internal constant InterfaceId_ERC721Exists = 0x4f558e79; /* * 0x4f558e79 === * bytes4(keccak256('exists(uint256)')) */ bytes4 internal constant InterfaceId_ERC721Enumerable = 0x780e9d63; /** * 0x780e9d63 === * bytes4(keccak256('totalSupply()')) ^ * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^ * bytes4(keccak256('tokenByIndex(uint256)')) */ bytes4 internal constant InterfaceId_ERC721Metadata = 0x5b5e139f; /** * 0x5b5e139f === * bytes4(keccak256('name()')) ^ * bytes4(keccak256('symbol()')) ^ * bytes4(keccak256('tokenURI(uint256)')) */ event Transfer( address indexed _from, address indexed _to, uint256 indexed _tokenId ); event Approval( address indexed _owner, address indexed _approved, uint256 indexed _tokenId ); event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); function balanceOf(address _owner) public view returns (uint256 _balance); function ownerOf(uint256 _tokenId) public view returns (address _owner); function exists(uint256 _tokenId) public view returns (bool _exists); function approve(address _to, uint256 _tokenId) public; function getApproved(uint256 _tokenId) public view returns (address _operator); function setApprovalForAll(address _operator, bool _approved) public; function isApprovedForAll(address _owner, address _operator) public view returns (bool); function transferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes _data ) public; } // OpenZeppelin's ERC721.sol /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Enumerable is ERC721Basic { function totalSupply() public view returns (uint256); function tokenOfOwnerByIndex( address _owner, uint256 _index ) public view returns (uint256 _tokenId); function tokenByIndex(uint256 _index) public view returns (uint256); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Metadata is ERC721Basic { function name() external view returns (string _name); function symbol() external view returns (string _symbol); function tokenURI(uint256 _tokenId) public view returns (string); } /** * @title ERC-721 Non-Fungible Token Standard, full implementation interface * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata { } // OpenZeppelin's ERC721Receiver.sol /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract ERC721Receiver { /** * @dev Magic value to be returned upon successful reception of an NFT * Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`, * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector` */ bytes4 internal constant ERC721_RECEIVED = 0x150b7a02; /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safetransfer`. This function MAY throw to revert and reject the * transfer. Return of other than the magic value MUST result in the * transaction being reverted. * Note: the contract address is always the message sender. * @param _operator The address which called `safeTransferFrom` function * @param _from The address which previously owned the token * @param _tokenId The NFT identifier which is being transferred * @param _data Additional data with no specified format * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes _data ) public returns(bytes4); } // OpenZeppelin's AddressUtils.sol /** * Utility library of inline functions on addresses */ library AddressUtils { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param _addr address to check * @return whether the target address is a contract */ function isContract(address _addr) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. // solium-disable-next-line security/no-inline-assembly assembly { size := extcodesize(_addr) } return size > 0; } } // Azimuth's Azimuth.sol // Azimuth: point state data contract // // This contract is used for storing all data related to Azimuth points // and their ownership. Consider this contract the Azimuth ledger. // // It also contains permissions data, which ties in to ERC721 // functionality. Operators of an address are allowed to transfer // ownership of all points owned by their associated address // (ERC721's approveAll()). A transfer proxy is allowed to transfer // ownership of a single point (ERC721's approve()). // Separate from ERC721 are managers, assigned per point. They are // allowed to perform "low-impact" operations on the owner's points, // like configuring public keys and making escape requests. // // Since data stores are difficult to upgrade, this contract contains // as little actual business logic as possible. Instead, the data stored // herein can only be modified by this contract's owner, which can be // changed and is thus upgradable/replaceable. // // This contract will be owned by the Ecliptic contract. // contract Azimuth is Ownable { // // Events // // OwnerChanged: :point is now owned by :owner // event OwnerChanged(uint32 indexed point, address indexed owner); // Activated: :point is now active // event Activated(uint32 indexed point); // Spawned: :prefix has spawned :child // event Spawned(uint32 indexed prefix, uint32 indexed child); // EscapeRequested: :point has requested a new :sponsor // event EscapeRequested(uint32 indexed point, uint32 indexed sponsor); // EscapeCanceled: :point's :sponsor request was canceled or rejected // event EscapeCanceled(uint32 indexed point, uint32 indexed sponsor); // EscapeAccepted: :point confirmed with a new :sponsor // event EscapeAccepted(uint32 indexed point, uint32 indexed sponsor); // LostSponsor: :point's :sponsor is now refusing it service // event LostSponsor(uint32 indexed point, uint32 indexed sponsor); // ChangedKeys: :point has new network public keys // event ChangedKeys( uint32 indexed point, bytes32 encryptionKey, bytes32 authenticationKey, uint32 cryptoSuiteVersion, uint32 keyRevisionNumber ); // BrokeContinuity: :point has a new continuity number, :number // event BrokeContinuity(uint32 indexed point, uint32 number); // ChangedSpawnProxy: :spawnProxy can now spawn using :point // event ChangedSpawnProxy(uint32 indexed point, address indexed spawnProxy); // ChangedTransferProxy: :transferProxy can now transfer ownership of :point // event ChangedTransferProxy( uint32 indexed point, address indexed transferProxy ); // ChangedManagementProxy: :managementProxy can now manage :point // event ChangedManagementProxy( uint32 indexed point, address indexed managementProxy ); // ChangedVotingProxy: :votingProxy can now vote using :point // event ChangedVotingProxy(uint32 indexed point, address indexed votingProxy); // ChangedDns: dnsDomains have been updated // event ChangedDns(string primary, string secondary, string tertiary); // // Structures // // Size: kinds of points registered on-chain // // NOTE: the order matters, because of Solidity enum numbering // enum Size { Galaxy, // = 0 Star, // = 1 Planet // = 2 } // Point: state of a point // // While the ordering of the struct members is semantically chaotic, // they are ordered to tightly pack them into Ethereum's 32-byte storage // slots, which reduces gas costs for some function calls. // The comment ticks indicate assumed slot boundaries. // struct Point { // encryptionKey: (curve25519) encryption public key, or 0 for none // bytes32 encryptionKey; // // authenticationKey: (ed25519) authentication public key, or 0 for none // bytes32 authenticationKey; // // spawned: for stars and galaxies, all :active children // uint32[] spawned; // // hasSponsor: true if the sponsor still supports the point // bool hasSponsor; // active: whether point can be linked // // false: point belongs to prefix, cannot be configured or linked // true: point no longer belongs to prefix, can be configured and linked // bool active; // escapeRequested: true if the point has requested to change sponsors // bool escapeRequested; // sponsor: the point that supports this one on the network, or, // if :hasSponsor is false, the last point that supported it. // (by default, the point's half-width prefix) // uint32 sponsor; // escapeRequestedTo: if :escapeRequested is true, new sponsor requested // uint32 escapeRequestedTo; // cryptoSuiteVersion: version of the crypto suite used for the pubkeys // uint32 cryptoSuiteVersion; // keyRevisionNumber: incremented every time the public keys change // uint32 keyRevisionNumber; // continuityNumber: incremented to indicate network-side state loss // uint32 continuityNumber; } // Deed: permissions for a point // struct Deed { // owner: address that owns this point // address owner; // managementProxy: 0, or another address with the right to perform // low-impact, managerial operations on this point // address managementProxy; // spawnProxy: 0, or another address with the right to spawn children // of this point // address spawnProxy; // votingProxy: 0, or another address with the right to vote as this point // address votingProxy; // transferProxy: 0, or another address with the right to transfer // ownership of this point // address transferProxy; } // // General state // // points: per point, general network-relevant point state // mapping(uint32 => Point) public points; // rights: per point, on-chain ownership and permissions // mapping(uint32 => Deed) public rights; // operators: per owner, per address, has the right to transfer ownership // of all the owner's points (ERC721) // mapping(address => mapping(address => bool)) public operators; // dnsDomains: base domains for contacting galaxies // // dnsDomains[0] is primary, the others are used as fallbacks // string[3] public dnsDomains; // // Lookups // // sponsoring: per point, the points they are sponsoring // mapping(uint32 => uint32[]) public sponsoring; // sponsoringIndexes: per point, per point, (index + 1) in // the sponsoring array // mapping(uint32 => mapping(uint32 => uint256)) public sponsoringIndexes; // escapeRequests: per point, the points they have open escape requests from // mapping(uint32 => uint32[]) public escapeRequests; // escapeRequestsIndexes: per point, per point, (index + 1) in // the escapeRequests array // mapping(uint32 => mapping(uint32 => uint256)) public escapeRequestsIndexes; // pointsOwnedBy: per address, the points they own // mapping(address => uint32[]) public pointsOwnedBy; // pointOwnerIndexes: per owner, per point, (index + 1) in // the pointsOwnedBy array // // We delete owners by moving the last entry in the array to the // newly emptied slot, which is (n - 1) where n is the value of // pointOwnerIndexes[owner][point]. // mapping(address => mapping(uint32 => uint256)) public pointOwnerIndexes; // managerFor: per address, the points they are the management proxy for // mapping(address => uint32[]) public managerFor; // managerForIndexes: per address, per point, (index + 1) in // the managerFor array // mapping(address => mapping(uint32 => uint256)) public managerForIndexes; // spawningFor: per address, the points they can spawn with // mapping(address => uint32[]) public spawningFor; // spawningForIndexes: per address, per point, (index + 1) in // the spawningFor array // mapping(address => mapping(uint32 => uint256)) public spawningForIndexes; // votingFor: per address, the points they can vote with // mapping(address => uint32[]) public votingFor; // votingForIndexes: per address, per point, (index + 1) in // the votingFor array // mapping(address => mapping(uint32 => uint256)) public votingForIndexes; // transferringFor: per address, the points they can transfer // mapping(address => uint32[]) public transferringFor; // transferringForIndexes: per address, per point, (index + 1) in // the transferringFor array // mapping(address => mapping(uint32 => uint256)) public transferringForIndexes; // // Logic // // constructor(): configure default dns domains // constructor() public { setDnsDomains("example.com", "example.com", "example.com"); } // setDnsDomains(): set the base domains used for contacting galaxies // // Note: since a string is really just a byte[], and Solidity can't // work with two-dimensional arrays yet, we pass in the three // domains as individual strings. // function setDnsDomains(string _primary, string _secondary, string _tertiary) onlyOwner public { dnsDomains[0] = _primary; dnsDomains[1] = _secondary; dnsDomains[2] = _tertiary; emit ChangedDns(_primary, _secondary, _tertiary); } // // Point reading // // isActive(): return true if _point is active // function isActive(uint32 _point) view external returns (bool equals) { return points[_point].active; } // getKeys(): returns the public keys and their details, as currently // registered for _point // function getKeys(uint32 _point) view external returns (bytes32 crypt, bytes32 auth, uint32 suite, uint32 revision) { Point storage point = points[_point]; return (point.encryptionKey, point.authenticationKey, point.cryptoSuiteVersion, point.keyRevisionNumber); } // getKeyRevisionNumber(): gets the revision number of _point's current // public keys // function getKeyRevisionNumber(uint32 _point) view external returns (uint32 revision) { return points[_point].keyRevisionNumber; } // hasBeenLinked(): returns true if the point has ever been assigned keys // function hasBeenLinked(uint32 _point) view external returns (bool result) { return ( points[_point].keyRevisionNumber > 0 ); } // isLive(): returns true if _point currently has keys properly configured // function isLive(uint32 _point) view external returns (bool result) { Point storage point = points[_point]; return ( point.encryptionKey != 0 && point.authenticationKey != 0 && point.cryptoSuiteVersion != 0 ); } // getContinuityNumber(): returns _point's current continuity number // function getContinuityNumber(uint32 _point) view external returns (uint32 continuityNumber) { return points[_point].continuityNumber; } // getSpawnCount(): return the number of children spawned by _point // function getSpawnCount(uint32 _point) view external returns (uint32 spawnCount) { uint256 len = points[_point].spawned.length; assert(len < 2**32); return uint32(len); } // getSpawned(): return array of points created under _point // // Note: only useful for clients, as Solidity does not currently // support returning dynamic arrays. // function getSpawned(uint32 _point) view external returns (uint32[] spawned) { return points[_point].spawned; } // hasSponsor(): returns true if _point's sponsor is providing it service // function hasSponsor(uint32 _point) view external returns (bool has) { return points[_point].hasSponsor; } // getSponsor(): returns _point's current (or most recent) sponsor // function getSponsor(uint32 _point) view external returns (uint32 sponsor) { return points[_point].sponsor; } // isSponsor(): returns true if _sponsor is currently providing service // to _point // function isSponsor(uint32 _point, uint32 _sponsor) view external returns (bool result) { Point storage point = points[_point]; return ( point.hasSponsor && (point.sponsor == _sponsor) ); } // getSponsoringCount(): returns the number of points _sponsor is // providing service to // function getSponsoringCount(uint32 _sponsor) view external returns (uint256 count) { return sponsoring[_sponsor].length; } // getSponsoring(): returns a list of points _sponsor is providing // service to // // Note: only useful for clients, as Solidity does not currently // support returning dynamic arrays. // function getSponsoring(uint32 _sponsor) view external returns (uint32[] sponsees) { return sponsoring[_sponsor]; } // escaping // isEscaping(): returns true if _point has an outstanding escape request // function isEscaping(uint32 _point) view external returns (bool escaping) { return points[_point].escapeRequested; } // getEscapeRequest(): returns _point's current escape request // // the returned escape request is only valid as long as isEscaping() // returns true // function getEscapeRequest(uint32 _point) view external returns (uint32 escape) { return points[_point].escapeRequestedTo; } // isRequestingEscapeTo(): returns true if _point has an outstanding // escape request targetting _sponsor // function isRequestingEscapeTo(uint32 _point, uint32 _sponsor) view public returns (bool equals) { Point storage point = points[_point]; return (point.escapeRequested && (point.escapeRequestedTo == _sponsor)); } // getEscapeRequestsCount(): returns the number of points _sponsor // is providing service to // function getEscapeRequestsCount(uint32 _sponsor) view external returns (uint256 count) { return escapeRequests[_sponsor].length; } // getEscapeRequests(): get the points _sponsor has received escape // requests from // // Note: only useful for clients, as Solidity does not currently // support returning dynamic arrays. // function getEscapeRequests(uint32 _sponsor) view external returns (uint32[] requests) { return escapeRequests[_sponsor]; } // // Point writing // // activatePoint(): activate a point, register it as spawned by its prefix // function activatePoint(uint32 _point) onlyOwner external { // make a point active, setting its sponsor to its prefix // Point storage point = points[_point]; require(!point.active); point.active = true; registerSponsor(_point, true, getPrefix(_point)); emit Activated(_point); } // setKeys(): set network public keys of _point to _encryptionKey and // _authenticationKey, with the specified _cryptoSuiteVersion // function setKeys(uint32 _point, bytes32 _encryptionKey, bytes32 _authenticationKey, uint32 _cryptoSuiteVersion) onlyOwner external { Point storage point = points[_point]; if ( point.encryptionKey == _encryptionKey && point.authenticationKey == _authenticationKey && point.cryptoSuiteVersion == _cryptoSuiteVersion ) { return; } point.encryptionKey = _encryptionKey; point.authenticationKey = _authenticationKey; point.cryptoSuiteVersion = _cryptoSuiteVersion; point.keyRevisionNumber++; emit ChangedKeys(_point, _encryptionKey, _authenticationKey, _cryptoSuiteVersion, point.keyRevisionNumber); } // incrementContinuityNumber(): break continuity for _point // function incrementContinuityNumber(uint32 _point) onlyOwner external { Point storage point = points[_point]; point.continuityNumber++; emit BrokeContinuity(_point, point.continuityNumber); } // registerSpawn(): add a point to its prefix's list of spawned points // function registerSpawned(uint32 _point) onlyOwner external { // if a point is its own prefix (a galaxy) then don't register it // uint32 prefix = getPrefix(_point); if (prefix == _point) { return; } // register a new spawned point for the prefix // points[prefix].spawned.push(_point); emit Spawned(prefix, _point); } // loseSponsor(): indicates that _point's sponsor is no longer providing // it service // function loseSponsor(uint32 _point) onlyOwner external { Point storage point = points[_point]; if (!point.hasSponsor) { return; } registerSponsor(_point, false, point.sponsor); emit LostSponsor(_point, point.sponsor); } // setEscapeRequest(): for _point, start an escape request to _sponsor // function setEscapeRequest(uint32 _point, uint32 _sponsor) onlyOwner external { if (isRequestingEscapeTo(_point, _sponsor)) { return; } registerEscapeRequest(_point, true, _sponsor); emit EscapeRequested(_point, _sponsor); } // cancelEscape(): for _point, stop the current escape request, if any // function cancelEscape(uint32 _point) onlyOwner external { Point storage point = points[_point]; if (!point.escapeRequested) { return; } uint32 request = point.escapeRequestedTo; registerEscapeRequest(_point, false, 0); emit EscapeCanceled(_point, request); } // doEscape(): perform the requested escape // function doEscape(uint32 _point) onlyOwner external { Point storage point = points[_point]; require(point.escapeRequested); registerSponsor(_point, true, point.escapeRequestedTo); registerEscapeRequest(_point, false, 0); emit EscapeAccepted(_point, point.sponsor); } // // Point utils // // getPrefix(): compute prefix ("parent") of _point // function getPrefix(uint32 _point) pure public returns (uint16 prefix) { if (_point < 0x10000) { return uint16(_point % 0x100); } return uint16(_point % 0x10000); } // getPointSize(): return the size of _point // function getPointSize(uint32 _point) external pure returns (Size _size) { if (_point < 0x100) return Size.Galaxy; if (_point < 0x10000) return Size.Star; return Size.Planet; } // internal use // registerSponsor(): set the sponsorship state of _point and update the // reverse lookup for sponsors // function registerSponsor(uint32 _point, bool _hasSponsor, uint32 _sponsor) internal { Point storage point = points[_point]; bool had = point.hasSponsor; uint32 prev = point.sponsor; // if we didn't have a sponsor, and won't get one, // or if we get the sponsor we already have, // nothing will change, so jump out early. // if ( (!had && !_hasSponsor) || (had && _hasSponsor && prev == _sponsor) ) { return; } // if the point used to have a different sponsor, do some gymnastics // to keep the reverse lookup gapless. delete the point from the old // sponsor's list, then fill that gap with the list tail. // if (had) { // i: current index in previous sponsor's list of sponsored points // uint256 i = sponsoringIndexes[prev][_point]; // we store index + 1, because 0 is the solidity default value // assert(i > 0); i--; // copy the last item in the list into the now-unused slot, // making sure to update its :sponsoringIndexes reference // uint32[] storage prevSponsoring = sponsoring[prev]; uint256 last = prevSponsoring.length - 1; uint32 moved = prevSponsoring[last]; prevSponsoring[i] = moved; sponsoringIndexes[prev][moved] = i + 1; // delete the last item // delete(prevSponsoring[last]); prevSponsoring.length = last; sponsoringIndexes[prev][_point] = 0; } if (_hasSponsor) { uint32[] storage newSponsoring = sponsoring[_sponsor]; newSponsoring.push(_point); sponsoringIndexes[_sponsor][_point] = newSponsoring.length; } point.sponsor = _sponsor; point.hasSponsor = _hasSponsor; } // registerEscapeRequest(): set the escape state of _point and update the // reverse lookup for sponsors // function registerEscapeRequest( uint32 _point, bool _isEscaping, uint32 _sponsor ) internal { Point storage point = points[_point]; bool was = point.escapeRequested; uint32 prev = point.escapeRequestedTo; // if we weren't escaping, and won't be, // or if we were escaping, and the new target is the same, // nothing will change, so jump out early. // if ( (!was && !_isEscaping) || (was && _isEscaping && prev == _sponsor) ) { return; } // if the point used to have a different request, do some gymnastics // to keep the reverse lookup gapless. delete the point from the old // sponsor's list, then fill that gap with the list tail. // if (was) { // i: current index in previous sponsor's list of sponsored points // uint256 i = escapeRequestsIndexes[prev][_point]; // we store index + 1, because 0 is the solidity default value // assert(i > 0); i--; // copy the last item in the list into the now-unused slot, // making sure to update its :escapeRequestsIndexes reference // uint32[] storage prevRequests = escapeRequests[prev]; uint256 last = prevRequests.length - 1; uint32 moved = prevRequests[last]; prevRequests[i] = moved; escapeRequestsIndexes[prev][moved] = i + 1; // delete the last item // delete(prevRequests[last]); prevRequests.length = last; escapeRequestsIndexes[prev][_point] = 0; } if (_isEscaping) { uint32[] storage newRequests = escapeRequests[_sponsor]; newRequests.push(_point); escapeRequestsIndexes[_sponsor][_point] = newRequests.length; } point.escapeRequestedTo = _sponsor; point.escapeRequested = _isEscaping; } // // Deed reading // // owner // getOwner(): return owner of _point // function getOwner(uint32 _point) view external returns (address owner) { return rights[_point].owner; } // isOwner(): true if _point is owned by _address // function isOwner(uint32 _point, address _address) view external returns (bool result) { return (rights[_point].owner == _address); } // getOwnedPointCount(): return length of array of points that _whose owns // function getOwnedPointCount(address _whose) view external returns (uint256 count) { return pointsOwnedBy[_whose].length; } // getOwnedPoints(): return array of points that _whose owns // // Note: only useful for clients, as Solidity does not currently // support returning dynamic arrays. // function getOwnedPoints(address _whose) view external returns (uint32[] ownedPoints) { return pointsOwnedBy[_whose]; } // getOwnedPointAtIndex(): get point at _index from array of points that // _whose owns // function getOwnedPointAtIndex(address _whose, uint256 _index) view external returns (uint32 point) { uint32[] storage owned = pointsOwnedBy[_whose]; require(_index < owned.length); return owned[_index]; } // management proxy // getManagementProxy(): returns _point's current management proxy // function getManagementProxy(uint32 _point) view external returns (address manager) { return rights[_point].managementProxy; } // isManagementProxy(): returns true if _proxy is _point's management proxy // function isManagementProxy(uint32 _point, address _proxy) view external returns (bool result) { return (rights[_point].managementProxy == _proxy); } // canManage(): true if _who is the owner or manager of _point // function canManage(uint32 _point, address _who) view external returns (bool result) { Deed storage deed = rights[_point]; return ( (0x0 != _who) && ( (_who == deed.owner) || (_who == deed.managementProxy) ) ); } // getManagerForCount(): returns the amount of points _proxy can manage // function getManagerForCount(address _proxy) view external returns (uint256 count) { return managerFor[_proxy].length; } // getManagerFor(): returns the points _proxy can manage // // Note: only useful for clients, as Solidity does not currently // support returning dynamic arrays. // function getManagerFor(address _proxy) view external returns (uint32[] mfor) { return managerFor[_proxy]; } // spawn proxy // getSpawnProxy(): returns _point's current spawn proxy // function getSpawnProxy(uint32 _point) view external returns (address spawnProxy) { return rights[_point].spawnProxy; } // isSpawnProxy(): returns true if _proxy is _point's spawn proxy // function isSpawnProxy(uint32 _point, address _proxy) view external returns (bool result) { return (rights[_point].spawnProxy == _proxy); } // canSpawnAs(): true if _who is the owner or spawn proxy of _point // function canSpawnAs(uint32 _point, address _who) view external returns (bool result) { Deed storage deed = rights[_point]; return ( (0x0 != _who) && ( (_who == deed.owner) || (_who == deed.spawnProxy) ) ); } // getSpawningForCount(): returns the amount of points _proxy // can spawn with // function getSpawningForCount(address _proxy) view external returns (uint256 count) { return spawningFor[_proxy].length; } // getSpawningFor(): get the points _proxy can spawn with // // Note: only useful for clients, as Solidity does not currently // support returning dynamic arrays. // function getSpawningFor(address _proxy) view external returns (uint32[] sfor) { return spawningFor[_proxy]; } // voting proxy // getVotingProxy(): returns _point's current voting proxy // function getVotingProxy(uint32 _point) view external returns (address voter) { return rights[_point].votingProxy; } // isVotingProxy(): returns true if _proxy is _point's voting proxy // function isVotingProxy(uint32 _point, address _proxy) view external returns (bool result) { return (rights[_point].votingProxy == _proxy); } // canVoteAs(): true if _who is the owner of _point, // or the voting proxy of _point's owner // function canVoteAs(uint32 _point, address _who) view external returns (bool result) { Deed storage deed = rights[_point]; return ( (0x0 != _who) && ( (_who == deed.owner) || (_who == deed.votingProxy) ) ); } // getVotingForCount(): returns the amount of points _proxy can vote as // function getVotingForCount(address _proxy) view external returns (uint256 count) { return votingFor[_proxy].length; } // getVotingFor(): returns the points _proxy can vote as // // Note: only useful for clients, as Solidity does not currently // support returning dynamic arrays. // function getVotingFor(address _proxy) view external returns (uint32[] vfor) { return votingFor[_proxy]; } // transfer proxy // getTransferProxy(): returns _point's current transfer proxy // function getTransferProxy(uint32 _point) view external returns (address transferProxy) { return rights[_point].transferProxy; } // isTransferProxy(): returns true if _proxy is _point's transfer proxy // function isTransferProxy(uint32 _point, address _proxy) view external returns (bool result) { return (rights[_point].transferProxy == _proxy); } // canTransfer(): true if _who is the owner or transfer proxy of _point, // or is an operator for _point's current owner // function canTransfer(uint32 _point, address _who) view external returns (bool result) { Deed storage deed = rights[_point]; return ( (0x0 != _who) && ( (_who == deed.owner) || (_who == deed.transferProxy) || operators[deed.owner][_who] ) ); } // getTransferringForCount(): returns the amount of points _proxy // can transfer // function getTransferringForCount(address _proxy) view external returns (uint256 count) { return transferringFor[_proxy].length; } // getTransferringFor(): get the points _proxy can transfer // // Note: only useful for clients, as Solidity does not currently // support returning dynamic arrays. // function getTransferringFor(address _proxy) view external returns (uint32[] tfor) { return transferringFor[_proxy]; } // isOperator(): returns true if _operator is allowed to transfer // ownership of _owner's points // function isOperator(address _owner, address _operator) view external returns (bool result) { return operators[_owner][_operator]; } // // Deed writing // // setOwner(): set owner of _point to _owner // // Note: setOwner() only implements the minimal data storage // logic for a transfer; the full transfer is implemented in // Ecliptic. // // Note: _owner must not be the zero address. // function setOwner(uint32 _point, address _owner) onlyOwner external { // prevent burning of points by making zero the owner // require(0x0 != _owner); // prev: previous owner, if any // address prev = rights[_point].owner; if (prev == _owner) { return; } // if the point used to have a different owner, do some gymnastics to // keep the list of owned points gapless. delete this point from the // list, then fill that gap with the list tail. // if (0x0 != prev) { // i: current index in previous owner's list of owned points // uint256 i = pointOwnerIndexes[prev][_point]; // we store index + 1, because 0 is the solidity default value // assert(i > 0); i--; // copy the last item in the list into the now-unused slot, // making sure to update its :pointOwnerIndexes reference // uint32[] storage owner = pointsOwnedBy[prev]; uint256 last = owner.length - 1; uint32 moved = owner[last]; owner[i] = moved; pointOwnerIndexes[prev][moved] = i + 1; // delete the last item // delete(owner[last]); owner.length = last; pointOwnerIndexes[prev][_point] = 0; } // update the owner list and the owner's index list // rights[_point].owner = _owner; pointsOwnedBy[_owner].push(_point); pointOwnerIndexes[_owner][_point] = pointsOwnedBy[_owner].length; emit OwnerChanged(_point, _owner); } // setManagementProxy(): makes _proxy _point's management proxy // function setManagementProxy(uint32 _point, address _proxy) onlyOwner external { Deed storage deed = rights[_point]; address prev = deed.managementProxy; if (prev == _proxy) { return; } // if the point used to have a different manager, do some gymnastics // to keep the reverse lookup gapless. delete the point from the // old manager's list, then fill that gap with the list tail. // if (0x0 != prev) { // i: current index in previous manager's list of managed points // uint256 i = managerForIndexes[prev][_point]; // we store index + 1, because 0 is the solidity default value // assert(i > 0); i--; // copy the last item in the list into the now-unused slot, // making sure to update its :managerForIndexes reference // uint32[] storage prevMfor = managerFor[prev]; uint256 last = prevMfor.length - 1; uint32 moved = prevMfor[last]; prevMfor[i] = moved; managerForIndexes[prev][moved] = i + 1; // delete the last item // delete(prevMfor[last]); prevMfor.length = last; managerForIndexes[prev][_point] = 0; } if (0x0 != _proxy) { uint32[] storage mfor = managerFor[_proxy]; mfor.push(_point); managerForIndexes[_proxy][_point] = mfor.length; } deed.managementProxy = _proxy; emit ChangedManagementProxy(_point, _proxy); } // setSpawnProxy(): makes _proxy _point's spawn proxy // function setSpawnProxy(uint32 _point, address _proxy) onlyOwner external { Deed storage deed = rights[_point]; address prev = deed.spawnProxy; if (prev == _proxy) { return; } // if the point used to have a different spawn proxy, do some // gymnastics to keep the reverse lookup gapless. delete the point // from the old proxy's list, then fill that gap with the list tail. // if (0x0 != prev) { // i: current index in previous proxy's list of spawning points // uint256 i = spawningForIndexes[prev][_point]; // we store index + 1, because 0 is the solidity default value // assert(i > 0); i--; // copy the last item in the list into the now-unused slot, // making sure to update its :spawningForIndexes reference // uint32[] storage prevSfor = spawningFor[prev]; uint256 last = prevSfor.length - 1; uint32 moved = prevSfor[last]; prevSfor[i] = moved; spawningForIndexes[prev][moved] = i + 1; // delete the last item // delete(prevSfor[last]); prevSfor.length = last; spawningForIndexes[prev][_point] = 0; } if (0x0 != _proxy) { uint32[] storage sfor = spawningFor[_proxy]; sfor.push(_point); spawningForIndexes[_proxy][_point] = sfor.length; } deed.spawnProxy = _proxy; emit ChangedSpawnProxy(_point, _proxy); } // setVotingProxy(): makes _proxy _point's voting proxy // function setVotingProxy(uint32 _point, address _proxy) onlyOwner external { Deed storage deed = rights[_point]; address prev = deed.votingProxy; if (prev == _proxy) { return; } // if the point used to have a different voter, do some gymnastics // to keep the reverse lookup gapless. delete the point from the // old voter's list, then fill that gap with the list tail. // if (0x0 != prev) { // i: current index in previous voter's list of points it was // voting for // uint256 i = votingForIndexes[prev][_point]; // we store index + 1, because 0 is the solidity default value // assert(i > 0); i--; // copy the last item in the list into the now-unused slot, // making sure to update its :votingForIndexes reference // uint32[] storage prevVfor = votingFor[prev]; uint256 last = prevVfor.length - 1; uint32 moved = prevVfor[last]; prevVfor[i] = moved; votingForIndexes[prev][moved] = i + 1; // delete the last item // delete(prevVfor[last]); prevVfor.length = last; votingForIndexes[prev][_point] = 0; } if (0x0 != _proxy) { uint32[] storage vfor = votingFor[_proxy]; vfor.push(_point); votingForIndexes[_proxy][_point] = vfor.length; } deed.votingProxy = _proxy; emit ChangedVotingProxy(_point, _proxy); } // setManagementProxy(): makes _proxy _point's transfer proxy // function setTransferProxy(uint32 _point, address _proxy) onlyOwner external { Deed storage deed = rights[_point]; address prev = deed.transferProxy; if (prev == _proxy) { return; } // if the point used to have a different transfer proxy, do some // gymnastics to keep the reverse lookup gapless. delete the point // from the old proxy's list, then fill that gap with the list tail. // if (0x0 != prev) { // i: current index in previous proxy's list of transferable points // uint256 i = transferringForIndexes[prev][_point]; // we store index + 1, because 0 is the solidity default value // assert(i > 0); i--; // copy the last item in the list into the now-unused slot, // making sure to update its :transferringForIndexes reference // uint32[] storage prevTfor = transferringFor[prev]; uint256 last = prevTfor.length - 1; uint32 moved = prevTfor[last]; prevTfor[i] = moved; transferringForIndexes[prev][moved] = i + 1; // delete the last item // delete(prevTfor[last]); prevTfor.length = last; transferringForIndexes[prev][_point] = 0; } if (0x0 != _proxy) { uint32[] storage tfor = transferringFor[_proxy]; tfor.push(_point); transferringForIndexes[_proxy][_point] = tfor.length; } deed.transferProxy = _proxy; emit ChangedTransferProxy(_point, _proxy); } // setOperator(): dis/allow _operator to transfer ownership of all points // owned by _owner // // operators are part of the ERC721 standard // function setOperator(address _owner, address _operator, bool _approved) onlyOwner external { operators[_owner][_operator] = _approved; } } // Azimuth's ReadsAzimuth.sol // ReadsAzimuth: referring to and testing against the Azimuth // data contract // // To avoid needless repetition, this contract provides common // checks and operations using the Azimuth contract. // contract ReadsAzimuth { // azimuth: points data storage contract. // Azimuth public azimuth; // constructor(): set the Azimuth data contract's address // constructor(Azimuth _azimuth) public { azimuth = _azimuth; } // activePointOwner(): require that :msg.sender is the owner of _point, // and that _point is active // modifier activePointOwner(uint32 _point) { require( azimuth.isOwner(_point, msg.sender) && azimuth.isActive(_point) ); _; } // activePointManager(): require that :msg.sender can manage _point, // and that _point is active // modifier activePointManager(uint32 _point) { require( azimuth.canManage(_point, msg.sender) && azimuth.isActive(_point) ); _; } // activePointSpawner(): require that :msg.sender can spawn as _point, // and that _point is active // modifier activePointSpawner(uint32 _point) { require( azimuth.canSpawnAs(_point, msg.sender) && azimuth.isActive(_point) ); _; } // activePointVoter(): require that :msg.sender can vote as _point, // and that _point is active // modifier activePointVoter(uint32 _point) { require( azimuth.canVoteAs(_point, msg.sender) && azimuth.isActive(_point) ); _; } } // Azimuth's Polls.sol // Polls: proposals & votes data contract // // This contract is used for storing all data related to the proposals // of the senate (galaxy owners) and their votes on those proposals. // It keeps track of votes and uses them to calculate whether a majority // is in favor of a proposal. // // Every galaxy can only vote on a proposal exactly once. Votes cannot // be changed. If a proposal fails to achieve majority within its // duration, it can be restarted after its cooldown period has passed. // // The requirements for a proposal to achieve majority are as follows: // - At least 1/4 of the currently active voters (rounded down) must have // voted in favor of the proposal, // - More than half of the votes cast must be in favor of the proposal, // and this can no longer change, either because // - the poll duration has passed, or // - not enough voters remain to take away the in-favor majority. // As soon as these conditions are met, no further interaction with // the proposal is possible. Achieving majority is permanent. // // Since data stores are difficult to upgrade, all of the logic unrelated // to the voting itself (that is, determining who is eligible to vote) // is expected to be implemented by this contract's owner. // // This contract will be owned by the Ecliptic contract. // contract Polls is Ownable { using SafeMath for uint256; using SafeMath16 for uint16; using SafeMath8 for uint8; // UpgradePollStarted: a poll on :proposal has opened // event UpgradePollStarted(address proposal); // DocumentPollStarted: a poll on :proposal has opened // event DocumentPollStarted(bytes32 proposal); // UpgradeMajority: :proposal has achieved majority // event UpgradeMajority(address proposal); // DocumentMajority: :proposal has achieved majority // event DocumentMajority(bytes32 proposal); // Poll: full poll state // struct Poll { // start: the timestamp at which the poll was started // uint256 start; // voted: per galaxy, whether they have voted on this poll // bool[256] voted; // yesVotes: amount of votes in favor of the proposal // uint16 yesVotes; // noVotes: amount of votes against the proposal // uint16 noVotes; // duration: amount of time during which the poll can be voted on // uint256 duration; // cooldown: amount of time before the (non-majority) poll can be reopened // uint256 cooldown; } // pollDuration: duration set for new polls. see also Poll.duration above // uint256 public pollDuration; // pollCooldown: cooldown set for new polls. see also Poll.cooldown above // uint256 public pollCooldown; // totalVoters: amount of active galaxies // uint16 public totalVoters; // upgradeProposals: list of all upgrades ever proposed // // this allows clients to discover the existence of polls. // from there, they can do liveness checks on the polls themselves. // address[] public upgradeProposals; // upgradePolls: per address, poll held to determine if that address // will become the new ecliptic // mapping(address => Poll) public upgradePolls; // upgradeHasAchievedMajority: per address, whether that address // has ever achieved majority // // If we did not store this, we would have to look at old poll data // to see whether or not a proposal has ever achieved majority. // Since the outcome of a poll is calculated based on :totalVoters, // which may not be consistent across time, we need to store outcomes // explicitly instead of re-calculating them. This allows us to always // tell with certainty whether or not a majority was achieved, // regardless of the current :totalVoters. // mapping(address => bool) public upgradeHasAchievedMajority; // documentProposals: list of all documents ever proposed // // this allows clients to discover the existence of polls. // from there, they can do liveness checks on the polls themselves. // bytes32[] public documentProposals; // documentPolls: per hash, poll held to determine if the corresponding // document is accepted by the galactic senate // mapping(bytes32 => Poll) public documentPolls; // documentHasAchievedMajority: per hash, whether that hash has ever // achieved majority // // the note for upgradeHasAchievedMajority above applies here as well // mapping(bytes32 => bool) public documentHasAchievedMajority; // documentMajorities: all hashes that have achieved majority // bytes32[] public documentMajorities; // constructor(): initial contract configuration // constructor(uint256 _pollDuration, uint256 _pollCooldown) public { reconfigure(_pollDuration, _pollCooldown); } // reconfigure(): change poll duration and cooldown // function reconfigure(uint256 _pollDuration, uint256 _pollCooldown) public onlyOwner { require( (5 days <= _pollDuration) && (_pollDuration <= 90 days) && (5 days <= _pollCooldown) && (_pollCooldown <= 90 days) ); pollDuration = _pollDuration; pollCooldown = _pollCooldown; } // incrementTotalVoters(): increase the amount of registered voters // function incrementTotalVoters() external onlyOwner { require(totalVoters < 256); totalVoters = totalVoters.add(1); } // getAllUpgradeProposals(): return array of all upgrade proposals ever made // // Note: only useful for clients, as Solidity does not currently // support returning dynamic arrays. // function getUpgradeProposals() external view returns (address[] proposals) { return upgradeProposals; } // getUpgradeProposalCount(): get the number of unique proposed upgrades // function getUpgradeProposalCount() external view returns (uint256 count) { return upgradeProposals.length; } // getAllDocumentProposals(): return array of all upgrade proposals ever made // // Note: only useful for clients, as Solidity does not currently // support returning dynamic arrays. // function getDocumentProposals() external view returns (bytes32[] proposals) { return documentProposals; } // getDocumentProposalCount(): get the number of unique proposed upgrades // function getDocumentProposalCount() external view returns (uint256 count) { return documentProposals.length; } // getDocumentMajorities(): return array of all document majorities // // Note: only useful for clients, as Solidity does not currently // support returning dynamic arrays. // function getDocumentMajorities() external view returns (bytes32[] majorities) { return documentMajorities; } // hasVotedOnUpgradePoll(): returns true if _galaxy has voted // on the _proposal // function hasVotedOnUpgradePoll(uint8 _galaxy, address _proposal) external view returns (bool result) { return upgradePolls[_proposal].voted[_galaxy]; } // hasVotedOnDocumentPoll(): returns true if _galaxy has voted // on the _proposal // function hasVotedOnDocumentPoll(uint8 _galaxy, bytes32 _proposal) external view returns (bool result) { return documentPolls[_proposal].voted[_galaxy]; } // startUpgradePoll(): open a poll on making _proposal the new ecliptic // function startUpgradePoll(address _proposal) external onlyOwner { // _proposal must not have achieved majority before // require(!upgradeHasAchievedMajority[_proposal]); Poll storage poll = upgradePolls[_proposal]; // if the proposal is being made for the first time, register it. // if (0 == poll.start) { upgradeProposals.push(_proposal); } startPoll(poll); emit UpgradePollStarted(_proposal); } // startDocumentPoll(): open a poll on accepting the document // whose hash is _proposal // function startDocumentPoll(bytes32 _proposal) external onlyOwner { // _proposal must not have achieved majority before // require(!documentHasAchievedMajority[_proposal]); Poll storage poll = documentPolls[_proposal]; // if the proposal is being made for the first time, register it. // if (0 == poll.start) { documentProposals.push(_proposal); } startPoll(poll); emit DocumentPollStarted(_proposal); } // startPoll(): open a new poll, or re-open an old one // function startPoll(Poll storage _poll) internal { // check that the poll has cooled down enough to be started again // // for completely new polls, the values used will be zero // require( block.timestamp > ( _poll.start.add( _poll.duration.add( _poll.cooldown )) ) ); // set started poll state // _poll.start = block.timestamp; delete _poll.voted; _poll.yesVotes = 0; _poll.noVotes = 0; _poll.duration = pollDuration; _poll.cooldown = pollCooldown; } // castUpgradeVote(): as galaxy _as, cast a vote on the _proposal // // _vote is true when in favor of the proposal, false otherwise // function castUpgradeVote(uint8 _as, address _proposal, bool _vote) external onlyOwner returns (bool majority) { Poll storage poll = upgradePolls[_proposal]; processVote(poll, _as, _vote); return updateUpgradePoll(_proposal); } // castDocumentVote(): as galaxy _as, cast a vote on the _proposal // // _vote is true when in favor of the proposal, false otherwise // function castDocumentVote(uint8 _as, bytes32 _proposal, bool _vote) external onlyOwner returns (bool majority) { Poll storage poll = documentPolls[_proposal]; processVote(poll, _as, _vote); return updateDocumentPoll(_proposal); } // processVote(): record a vote from _as on the _poll // function processVote(Poll storage _poll, uint8 _as, bool _vote) internal { // assist symbolic execution tools // assert(block.timestamp >= _poll.start); require( // may only vote once // !_poll.voted[_as] && // // may only vote when the poll is open // (block.timestamp < _poll.start.add(_poll.duration)) ); // update poll state to account for the new vote // _poll.voted[_as] = true; if (_vote) { _poll.yesVotes = _poll.yesVotes.add(1); } else { _poll.noVotes = _poll.noVotes.add(1); } } // updateUpgradePoll(): check whether the _proposal has achieved // majority, updating state, sending an event, // and returning true if it has // function updateUpgradePoll(address _proposal) public onlyOwner returns (bool majority) { // _proposal must not have achieved majority before // require(!upgradeHasAchievedMajority[_proposal]); // check for majority in the poll // Poll storage poll = upgradePolls[_proposal]; majority = checkPollMajority(poll); // if majority was achieved, update the state and send an event // if (majority) { upgradeHasAchievedMajority[_proposal] = true; emit UpgradeMajority(_proposal); } return majority; } // updateDocumentPoll(): check whether the _proposal has achieved majority, // updating the state and sending an event if it has // // this can be called by anyone, because the ecliptic does not // need to be aware of the result // function updateDocumentPoll(bytes32 _proposal) public returns (bool majority) { // _proposal must not have achieved majority before // require(!documentHasAchievedMajority[_proposal]); // check for majority in the poll // Poll storage poll = documentPolls[_proposal]; majority = checkPollMajority(poll); // if majority was achieved, update state and send an event // if (majority) { documentHasAchievedMajority[_proposal] = true; documentMajorities.push(_proposal); emit DocumentMajority(_proposal); } return majority; } // checkPollMajority(): returns true if the majority is in favor of // the subject of the poll // function checkPollMajority(Poll _poll) internal view returns (bool majority) { return ( // poll must have at least the minimum required yes-votes // (_poll.yesVotes >= (totalVoters / 4)) && // // and have a majority... // (_poll.yesVotes > _poll.noVotes) && // // ...that is indisputable // ( // either because the poll has ended // (block.timestamp > _poll.start.add(_poll.duration)) || // // or there are more yes votes than there can be no votes // ( _poll.yesVotes > totalVoters.sub(_poll.yesVotes) ) ) ); } } // Azimuth's Claims.sol // Claims: simple identity management // // This contract allows points to document claims about their owner. // Most commonly, these are about identity, with a claim's protocol // defining the context or platform of the claim, and its dossier // containing proof of its validity. // Points are limited to a maximum of 16 claims. // // For existing claims, the dossier can be updated, or the claim can // be removed entirely. It is recommended to remove any claims associated // with a point when it is about to be transferred to a new owner. // For convenience, the owner of the Azimuth contract (the Ecliptic) // is allowed to clear claims for any point, allowing it to do this for // you on-transfer. // contract Claims is ReadsAzimuth { // ClaimAdded: a claim was added by :by // event ClaimAdded( uint32 indexed by, string _protocol, string _claim, bytes _dossier ); // ClaimRemoved: a claim was removed by :by // event ClaimRemoved(uint32 indexed by, string _protocol, string _claim); // maxClaims: the amount of claims that can be registered per point // uint8 constant maxClaims = 16; // Claim: claim details // struct Claim { // protocol: context of the claim // string protocol; // claim: the claim itself // string claim; // dossier: data relating to the claim, as proof // bytes dossier; } // per point, list of claims // mapping(uint32 => Claim[maxClaims]) public claims; // constructor(): register the azimuth contract. // constructor(Azimuth _azimuth) ReadsAzimuth(_azimuth) public { // } // addClaim(): register a claim as _point // function addClaim(uint32 _point, string _protocol, string _claim, bytes _dossier) external activePointManager(_point) { // require non-empty protocol and claim fields // require( ( 0 < bytes(_protocol).length ) && ( 0 < bytes(_claim).length ) ); // cur: index + 1 of the claim if it already exists, 0 otherwise // uint8 cur = findClaim(_point, _protocol, _claim); // if the claim doesn't yet exist, store it in state // if (cur == 0) { // if there are no empty slots left, this throws // uint8 empty = findEmptySlot(_point); claims[_point][empty] = Claim(_protocol, _claim, _dossier); } // // if the claim has been made before, update the version in state // else { claims[_point][cur-1] = Claim(_protocol, _claim, _dossier); } emit ClaimAdded(_point, _protocol, _claim, _dossier); } // removeClaim(): unregister a claim as _point // function removeClaim(uint32 _point, string _protocol, string _claim) external activePointManager(_point) { // i: current index + 1 in _point's list of claims // uint256 i = findClaim(_point, _protocol, _claim); // we store index + 1, because 0 is the eth default value // can only delete an existing claim // require(i > 0); i--; // clear out the claim // delete claims[_point][i]; emit ClaimRemoved(_point, _protocol, _claim); } // clearClaims(): unregister all of _point's claims // // can also be called by the ecliptic during point transfer // function clearClaims(uint32 _point) external { // both point owner and ecliptic may do this // // We do not necessarily need to check for _point's active flag here, // since inactive points cannot have claims set. Doing the check // anyway would make this function slightly harder to think about due // to its relation to Ecliptic's transferPoint(). // require( azimuth.canManage(_point, msg.sender) || ( msg.sender == azimuth.owner() ) ); Claim[maxClaims] storage currClaims = claims[_point]; // clear out all claims // for (uint8 i = 0; i < maxClaims; i++) { // only emit the removed event if there was a claim here // if ( 0 < bytes(currClaims[i].claim).length ) { emit ClaimRemoved(_point, currClaims[i].protocol, currClaims[i].claim); } delete currClaims[i]; } } // findClaim(): find the index of the specified claim // // returns 0 if not found, index + 1 otherwise // function findClaim(uint32 _whose, string _protocol, string _claim) public view returns (uint8 index) { // we use hashes of the string because solidity can't do string // comparison yet // bytes32 protocolHash = keccak256(bytes(_protocol)); bytes32 claimHash = keccak256(bytes(_claim)); Claim[maxClaims] storage theirClaims = claims[_whose]; for (uint8 i = 0; i < maxClaims; i++) { Claim storage thisClaim = theirClaims[i]; if ( ( protocolHash == keccak256(bytes(thisClaim.protocol)) ) && ( claimHash == keccak256(bytes(thisClaim.claim)) ) ) { return i+1; } } return 0; } // findEmptySlot(): find the index of the first empty claim slot // // returns the index of the slot, throws if there are no empty slots // function findEmptySlot(uint32 _whose) internal view returns (uint8 index) { Claim[maxClaims] storage theirClaims = claims[_whose]; for (uint8 i = 0; i < maxClaims; i++) { Claim storage thisClaim = theirClaims[i]; if ( (0 == bytes(thisClaim.claim).length) ) { return i; } } revert(); } } // Treasury's ITreasuryProxy interface ITreasuryProxy { function upgradeTo(address _impl) external returns (bool); function freeze() external returns (bool); } // Azimuth's EclipticBase.sol // EclipticBase: upgradable ecliptic // // This contract implements the upgrade logic for the Ecliptic. // Newer versions of the Ecliptic are expected to provide at least // the onUpgrade() function. If they don't, upgrading to them will // fail. // // Note that even though this contract doesn't specify any required // interface members aside from upgrade() and onUpgrade(), contracts // and clients may still rely on the presence of certain functions // provided by the Ecliptic proper. Keep this in mind when writing // new versions of it. // contract EclipticBase is Ownable, ReadsAzimuth { // Upgraded: _to is the new canonical Ecliptic // event Upgraded(address to); // polls: senate voting contract // Polls public polls; // previousEcliptic: address of the previous ecliptic this // instance expects to upgrade from, stored and // checked for to prevent unexpected upgrade paths // address public previousEcliptic; constructor( address _previous, Azimuth _azimuth, Polls _polls ) ReadsAzimuth(_azimuth) internal { previousEcliptic = _previous; polls = _polls; } // onUpgrade(): called by previous ecliptic when upgrading // // in future ecliptics, this might perform more logic than // just simple checks and verifications. // when overriding this, make sure to call this original as well. // function onUpgrade() external { // make sure this is the expected upgrade path, // and that we have gotten the ownership we require // require( msg.sender == previousEcliptic && this == azimuth.owner() && this == polls.owner() ); } // upgrade(): transfer ownership of the ecliptic data to the new // ecliptic contract, notify it, then self-destruct. // // Note: any eth that have somehow ended up in this contract // are also sent to the new ecliptic. // function upgrade(EclipticBase _new) internal { // transfer ownership of the data contracts // azimuth.transferOwnership(_new); polls.transferOwnership(_new); // trigger upgrade logic on the target contract // _new.onUpgrade(); // emit event and destroy this contract // emit Upgraded(_new); selfdestruct(_new); } } //////////////////////////////////////////////////////////////////////////////// // Ecliptic //////////////////////////////////////////////////////////////////////////////// // Ecliptic: logic for interacting with the Azimuth ledger // // This contract is the point of entry for all operations on the Azimuth // ledger as stored in the Azimuth data contract. The functions herein // are responsible for performing all necessary business logic. // Examples of such logic include verifying permissions of the caller // and ensuring a requested change is actually valid. // Point owners can always operate on their own points. Ethereum addresses // can also perform specific operations if they've been given the // appropriate permissions. (For example, managers for general management, // spawn proxies for spawning child points, etc.) // // This contract uses external contracts (Azimuth, Polls) for data storage // so that it itself can easily be replaced in case its logic needs to // be changed. In other words, it can be upgraded. It does this by passing // ownership of the data contracts to a new Ecliptic contract. // // Because of this, it is advised for clients to not store this contract's // address directly, but rather ask the Azimuth contract for its owner // attribute to ensure transactions get sent to the latest Ecliptic. // Alternatively, the ENS name ecliptic.eth will resolve to the latest // Ecliptic as well. // // Upgrading happens based on polls held by the senate (galaxy owners). // Through this contract, the senate can submit proposals, opening polls // for the senate to cast votes on. These proposals can be either hashes // of documents or addresses of new Ecliptics. // If an ecliptic proposal gains majority, this contract will transfer // ownership of the data storage contracts to that address, so that it may // operate on the data they contain. This contract will selfdestruct at // the end of the upgrade process. // // This contract implements the ERC721 interface for non-fungible tokens, // allowing points to be managed using generic clients that support the // standard. It also implements ERC165 to allow this to be discovered. // contract Ecliptic is EclipticBase, SupportsInterfaceWithLookup, ERC721Metadata { using SafeMath for uint256; using AddressUtils for address; // Transfer: This emits when ownership of any NFT changes by any mechanism. // This event emits when NFTs are created (`from` == 0) and // destroyed (`to` == 0). At the time of any transfer, the // approved address for that NFT (if any) is reset to none. // event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); // Approval: This emits when the approved address for an NFT is changed or // reaffirmed. The zero address indicates there is no approved // address. When a Transfer event emits, this also indicates that // the approved address for that NFT (if any) is reset to none. // event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); // ApprovalForAll: This emits when an operator is enabled or disabled for an // owner. The operator can manage all NFTs of the owner. // event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); // erc721Received: equal to: // bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")) // which can be also obtained as: // ERC721Receiver(0).onERC721Received.selector` bytes4 constant erc721Received = 0x150b7a02; // depositAddress: Special address respresenting L2. Ships sent to // this address are controlled on L2 instead of here. // address constant public depositAddress = 0x1111111111111111111111111111111111111111; ITreasuryProxy public treasuryProxy; // treasuryUpgradeHash // hash of the treasury implementation to upgrade to // Note: stand-in, just hash of no bytes // could be made immutable and passed in as constructor argument bytes32 constant public treasuryUpgradeHash = hex"26f3eae628fa1a4d23e34b91a4d412526a47620ced37c80928906f9fa07c0774"; bool public treasuryUpgraded = false; // claims: contract reference, for clearing claims on-transfer // Claims public claims; // constructor(): set data contract addresses and signal interface support // // Note: during first deploy, ownership of these data contracts must // be manually transferred to this contract. // constructor(address _previous, Azimuth _azimuth, Polls _polls, Claims _claims, ITreasuryProxy _treasuryProxy) EclipticBase(_previous, _azimuth, _polls) public { claims = _claims; treasuryProxy = _treasuryProxy; // register supported interfaces for ERC165 // _registerInterface(0x80ac58cd); // ERC721 _registerInterface(0x5b5e139f); // ERC721Metadata _registerInterface(0x7f5828d0); // ERC173 (ownership) } // // ERC721 interface // // balanceOf(): get the amount of points owned by _owner // function balanceOf(address _owner) public view returns (uint256 balance) { require(0x0 != _owner); return azimuth.getOwnedPointCount(_owner); } // ownerOf(): get the current owner of point _tokenId // function ownerOf(uint256 _tokenId) public view validPointId(_tokenId) returns (address owner) { uint32 id = uint32(_tokenId); // this will throw if the owner is the zero address, // active points always have a valid owner. // require(azimuth.isActive(id)); return azimuth.getOwner(id); } // exists(): returns true if point _tokenId is active // function exists(uint256 _tokenId) public view returns (bool doesExist) { return ( (_tokenId < 0x100000000) && azimuth.isActive(uint32(_tokenId)) ); } // safeTransferFrom(): transfer point _tokenId from _from to _to // function safeTransferFrom(address _from, address _to, uint256 _tokenId) public { // transfer with empty data // safeTransferFrom(_from, _to, _tokenId, ""); } // safeTransferFrom(): transfer point _tokenId from _from to _to, // and call recipient if it's a contract // function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public { // perform raw transfer // transferFrom(_from, _to, _tokenId); // do the callback last to avoid re-entrancy // if (_to.isContract()) { bytes4 retval = ERC721Receiver(_to) .onERC721Received(msg.sender, _from, _tokenId, _data); // // standard return idiom to confirm contract semantics // require(retval == erc721Received); } } // transferFrom(): transfer point _tokenId from _from to _to, // WITHOUT notifying recipient contract // function transferFrom(address _from, address _to, uint256 _tokenId) public validPointId(_tokenId) { uint32 id = uint32(_tokenId); require(azimuth.isOwner(id, _from)); // the ERC721 operator/approved address (if any) is // accounted for in transferPoint() // transferPoint(id, _to, true); } // approve(): allow _approved to transfer ownership of point // _tokenId // function approve(address _approved, uint256 _tokenId) public validPointId(_tokenId) { setTransferProxy(uint32(_tokenId), _approved); } // setApprovalForAll(): allow or disallow _operator to // transfer ownership of ALL points // owned by :msg.sender // function setApprovalForAll(address _operator, bool _approved) public { require(0x0 != _operator); azimuth.setOperator(msg.sender, _operator, _approved); emit ApprovalForAll(msg.sender, _operator, _approved); } // getApproved(): get the approved address for point _tokenId // function getApproved(uint256 _tokenId) public view validPointId(_tokenId) returns (address approved) { //NOTE redundant, transfer proxy cannot be set for // inactive points // require(azimuth.isActive(uint32(_tokenId))); return azimuth.getTransferProxy(uint32(_tokenId)); } // isApprovedForAll(): returns true if _operator is an // operator for _owner // function isApprovedForAll(address _owner, address _operator) public view returns (bool result) { return azimuth.isOperator(_owner, _operator); } // // ERC721Metadata interface // // name(): returns the name of a collection of points // function name() external view returns (string) { return "Azimuth Points"; } // symbol(): returns an abbreviates name for points // function symbol() external view returns (string) { return "AZP"; } // tokenURI(): returns a URL to an ERC-721 standard JSON file // function tokenURI(uint256 _tokenId) public view validPointId(_tokenId) returns (string _tokenURI) { _tokenURI = "https://azimuth.network/erc721/0000000000.json"; bytes memory _tokenURIBytes = bytes(_tokenURI); _tokenURIBytes[31] = byte(48+(_tokenId / 1000000000) % 10); _tokenURIBytes[32] = byte(48+(_tokenId / 100000000) % 10); _tokenURIBytes[33] = byte(48+(_tokenId / 10000000) % 10); _tokenURIBytes[34] = byte(48+(_tokenId / 1000000) % 10); _tokenURIBytes[35] = byte(48+(_tokenId / 100000) % 10); _tokenURIBytes[36] = byte(48+(_tokenId / 10000) % 10); _tokenURIBytes[37] = byte(48+(_tokenId / 1000) % 10); _tokenURIBytes[38] = byte(48+(_tokenId / 100) % 10); _tokenURIBytes[39] = byte(48+(_tokenId / 10) % 10); _tokenURIBytes[40] = byte(48+(_tokenId / 1) % 10); } // // Points interface // // configureKeys(): configure _point with network public keys // _encryptionKey, _authenticationKey, // and corresponding _cryptoSuiteVersion, // incrementing the point's continuity number if needed // function configureKeys(uint32 _point, bytes32 _encryptionKey, bytes32 _authenticationKey, uint32 _cryptoSuiteVersion, bool _discontinuous) external activePointManager(_point) onL1(_point) { if (_discontinuous) { azimuth.incrementContinuityNumber(_point); } azimuth.setKeys(_point, _encryptionKey, _authenticationKey, _cryptoSuiteVersion); } // spawn(): spawn _point, then either give, or allow _target to take, // ownership of _point // // if _target is the :msg.sender, _targets owns the _point right away. // otherwise, _target becomes the transfer proxy of _point. // // Requirements: // - _point must not be active // - _point must not be a planet with a galaxy prefix // - _point's prefix must be linked and under its spawn limit // - :msg.sender must be either the owner of _point's prefix, // or an authorized spawn proxy for it // function spawn(uint32 _point, address _target) external { // only currently unowned (and thus also inactive) points can be spawned // require(azimuth.isOwner(_point, 0x0)); // prefix: half-width prefix of _point // uint16 prefix = azimuth.getPrefix(_point); // can't spawn if we deposited ownership or spawn rights to L2 // require( depositAddress != azimuth.getOwner(prefix) ); require( depositAddress != azimuth.getSpawnProxy(prefix) ); // only allow spawning of points of the size directly below the prefix // // this is possible because of how the address space works, // but supporting it introduces complexity through broken assumptions. // // example: // 0x0000.0000 - galaxy zero // 0x0000.0100 - the first star of galaxy zero // 0x0001.0100 - the first planet of the first star // 0x0001.0000 - the first planet of galaxy zero // require( (uint8(azimuth.getPointSize(prefix)) + 1) == uint8(azimuth.getPointSize(_point)) ); // prefix point must be linked and able to spawn // require( (azimuth.hasBeenLinked(prefix)) && ( azimuth.getSpawnCount(prefix) < getSpawnLimit(prefix, block.timestamp) ) ); // the owner of a prefix can always spawn its children; // other addresses need explicit permission (the role // of "spawnProxy" in the Azimuth contract) // require( azimuth.canSpawnAs(prefix, msg.sender) ); // if the caller is spawning the point to themselves, // assume it knows what it's doing and resolve right away // if (msg.sender == _target) { doSpawn(_point, _target, true, 0x0); } // // when sending to a "foreign" address, enforce a withdraw pattern // making the _point prefix's owner the _point owner in the mean time // else { doSpawn(_point, _target, false, azimuth.getOwner(prefix)); } } // doSpawn(): actual spawning logic, used in spawn(). creates _point, // making the _target its owner if _direct, or making the // _holder the owner and the _target the transfer proxy // if not _direct. // function doSpawn( uint32 _point, address _target, bool _direct, address _holder ) internal { // register the spawn for _point's prefix, incrementing spawn count // azimuth.registerSpawned(_point); // if the spawn is _direct, assume _target knows what they're doing // and resolve right away // if (_direct) { // make the point active and set its new owner // azimuth.activatePoint(_point); azimuth.setOwner(_point, _target); emit Transfer(0x0, _target, uint256(_point)); } // // when spawning indirectly, enforce a withdraw pattern by approving // the _target for transfer of the _point instead. // we make the _holder the owner of this _point in the mean time, // so that it may cancel the transfer (un-approve) if _target flakes. // we don't make _point active yet, because it still doesn't really // belong to anyone. // else { // have _holder hold on to the _point while _target gets to transfer // ownership of it // azimuth.setOwner(_point, _holder); azimuth.setTransferProxy(_point, _target); emit Transfer(0x0, _holder, uint256(_point)); emit Approval(_holder, _target, uint256(_point)); } } // transferPoint(): transfer _point to _target, clearing all permissions // data and keys if _reset is true // // Note: the _reset flag is useful when transferring the point to // a recipient who doesn't trust the previous owner. // // We know _point is not on L2, since otherwise its owner would be // depositAddress (which has no operator) and its transfer proxy // would be zero. // // Requirements: // - :msg.sender must be either _point's current owner, authorized // to transfer _point, or authorized to transfer the current // owner's points (as in ERC721's operator) // - _target must not be the zero address // function transferPoint(uint32 _point, address _target, bool _reset) public { // transfer is legitimate if the caller is the current owner, or // an operator for the current owner, or the _point's transfer proxy // require(azimuth.canTransfer(_point, msg.sender)); // can't deposit galaxy to L2 // can't deposit contract-owned point to L2 // require( depositAddress != _target || ( azimuth.getPointSize(_point) != Azimuth.Size.Galaxy && !azimuth.getOwner(_point).isContract() ) ); // if the point wasn't active yet, that means transferring it // is part of the "spawn" flow, so we need to activate it // if ( !azimuth.isActive(_point) ) { azimuth.activatePoint(_point); } // if the owner would actually change, change it // // the only time this deliberately wouldn't be the case is when a // prefix owner wants to activate a spawned but untransferred child. // if ( !azimuth.isOwner(_point, _target) ) { // remember the previous owner, to be included in the Transfer event // address old = azimuth.getOwner(_point); azimuth.setOwner(_point, _target); // according to ERC721, the approved address (here, transfer proxy) // gets cleared during every Transfer event // // we also rely on this so that transfer-related functions don't need // to verify the point is on L1 // azimuth.setTransferProxy(_point, 0); emit Transfer(old, _target, uint256(_point)); } // if we're depositing to L2, clear L1 data so that no proxies // can be used // if ( depositAddress == _target ) { azimuth.setKeys(_point, 0, 0, 0); azimuth.setManagementProxy(_point, 0); azimuth.setVotingProxy(_point, 0); azimuth.setTransferProxy(_point, 0); azimuth.setSpawnProxy(_point, 0); claims.clearClaims(_point); azimuth.cancelEscape(_point); } // reset sensitive data // used when transferring the point to a new owner // else if ( _reset ) { // clear the network public keys and break continuity, // but only if the point has already been linked // if ( azimuth.hasBeenLinked(_point) ) { azimuth.incrementContinuityNumber(_point); azimuth.setKeys(_point, 0, 0, 0); } // clear management proxy // azimuth.setManagementProxy(_point, 0); // clear voting proxy // azimuth.setVotingProxy(_point, 0); // clear transfer proxy // // in most cases this is done above, during the ownership transfer, // but we might not hit that and still be expected to reset the // transfer proxy. // doing it a second time is a no-op in Azimuth. // azimuth.setTransferProxy(_point, 0); // clear spawning proxy // // don't clear if the spawn rights have been deposited to L2, // if ( depositAddress != azimuth.getSpawnProxy(_point) ) { azimuth.setSpawnProxy(_point, 0); } // clear claims // claims.clearClaims(_point); } } // escape(): request escape as _point to _sponsor // // if an escape request is already active, this overwrites // the existing request // // Requirements: // - :msg.sender must be the owner or manager of _point, // - _point must be able to escape to _sponsor as per to canEscapeTo() // function escape(uint32 _point, uint32 _sponsor) external activePointManager(_point) onL1(_point) { // if the sponsor is on L2, we need to escape using L2 // require( depositAddress != azimuth.getOwner(_sponsor) ); require(canEscapeTo(_point, _sponsor)); azimuth.setEscapeRequest(_point, _sponsor); } // cancelEscape(): cancel the currently set escape for _point // function cancelEscape(uint32 _point) external activePointManager(_point) { azimuth.cancelEscape(_point); } // adopt(): as the relevant sponsor, accept the _point // // Requirements: // - :msg.sender must be the owner or management proxy // of _point's requested sponsor // function adopt(uint32 _point) external onL1(_point) { uint32 request = azimuth.getEscapeRequest(_point); require( azimuth.isEscaping(_point) && azimuth.canManage( request, msg.sender ) ); require( depositAddress != azimuth.getOwner(request) ); // _sponsor becomes _point's sponsor // its escape request is reset to "not escaping" // azimuth.doEscape(_point); } // reject(): as the relevant sponsor, deny the _point's request // // Requirements: // - :msg.sender must be the owner or management proxy // of _point's requested sponsor // function reject(uint32 _point) external { uint32 request = azimuth.getEscapeRequest(_point); require( azimuth.isEscaping(_point) && azimuth.canManage( request, msg.sender ) ); require( depositAddress != azimuth.getOwner(request) ); // reset the _point's escape request to "not escaping" // azimuth.cancelEscape(_point); } // detach(): as the _sponsor, stop sponsoring the _point // // Requirements: // - :msg.sender must be the owner or management proxy // of _point's current sponsor // // We allow detachment even of points that are on L2. This is // so that a star controlled by a contract can detach from a // planet which was on L1 originally but now is on L2. L2 will // ignore this if this is not the actual sponsor anymore (i.e. if // they later changed their sponsor on L2). // function detach(uint32 _point) external { uint32 sponsor = azimuth.getSponsor(_point); require( azimuth.hasSponsor(_point) && azimuth.canManage(sponsor, msg.sender) ); require( depositAddress != azimuth.getOwner(sponsor) ); // signal that its sponsor no longer supports _point // azimuth.loseSponsor(_point); } // // Point rules // // getSpawnLimit(): returns the total number of children the _point // is allowed to spawn at _time. // function getSpawnLimit(uint32 _point, uint256 _time) public view returns (uint32 limit) { Azimuth.Size size = azimuth.getPointSize(_point); if ( size == Azimuth.Size.Galaxy ) { return 255; } else if ( size == Azimuth.Size.Star ) { // in 2019, stars may spawn at most 1024 planets. this limit doubles // for every subsequent year. // // Note: 1546300800 corresponds to 2019-01-01 // uint256 yearsSince2019 = (_time - 1546300800) / 365 days; if (yearsSince2019 < 6) { limit = uint32( 1024 * (2 ** yearsSince2019) ); } else { limit = 65535; } return limit; } else // size == Azimuth.Size.Planet { // planets can create moons, but moons aren't on the chain // return 0; } } // canEscapeTo(): true if _point could try to escape to _sponsor // function canEscapeTo(uint32 _point, uint32 _sponsor) public view returns (bool canEscape) { // can't escape to a sponsor that hasn't been linked // if ( !azimuth.hasBeenLinked(_sponsor) ) return false; // Can only escape to a point one size higher than ourselves, // except in the special case where the escaping point hasn't // been linked yet -- in that case we may escape to points of // the same size, to support lightweight invitation chains. // // The use case for lightweight invitations is that a planet // owner should be able to invite their friends onto an // Azimuth network in a two-party transaction, without a new // star relationship. // The lightweight invitation process works by escaping your // own active (but never linked) point to one of your own // points, then transferring the point to your friend. // // These planets can, in turn, sponsor other unlinked planets, // so the "planet sponsorship chain" can grow to arbitrary // length. Most users, especially deep down the chain, will // want to improve their performance by switching to direct // star sponsors eventually. // Azimuth.Size pointSize = azimuth.getPointSize(_point); Azimuth.Size sponsorSize = azimuth.getPointSize(_sponsor); return ( // normal hierarchical escape structure // ( (uint8(sponsorSize) + 1) == uint8(pointSize) ) || // // special peer escape // ( (sponsorSize == pointSize) && // // peer escape is only for points that haven't been linked // yet, because it's only for lightweight invitation chains // !azimuth.hasBeenLinked(_point) ) ); } // // Permission management // // setManagementProxy(): configure the management proxy for _point // // The management proxy may perform "reversible" operations on // behalf of the owner. This includes public key configuration and // operations relating to sponsorship. // function setManagementProxy(uint32 _point, address _manager) external activePointManager(_point) onL1(_point) { azimuth.setManagementProxy(_point, _manager); } // setSpawnProxy(): give _spawnProxy the right to spawn points // with the prefix _prefix // // takes a uint16 so that we can't set spawn proxy for a planet // // fails if spawn rights have been deposited to L2 // function setSpawnProxy(uint16 _prefix, address _spawnProxy) external activePointSpawner(_prefix) onL1(_prefix) { require( depositAddress != azimuth.getSpawnProxy(_prefix) ); azimuth.setSpawnProxy(_prefix, _spawnProxy); } // setVotingProxy(): configure the voting proxy for _galaxy // // the voting proxy is allowed to start polls and cast votes // on the point's behalf. // function setVotingProxy(uint8 _galaxy, address _voter) external activePointVoter(_galaxy) { azimuth.setVotingProxy(_galaxy, _voter); } // setTransferProxy(): give _transferProxy the right to transfer _point // // Requirements: // - :msg.sender must be either _point's current owner, // or be an operator for the current owner // function setTransferProxy(uint32 _point, address _transferProxy) public onL1(_point) { // owner: owner of _point // address owner = azimuth.getOwner(_point); // caller must be :owner, or an operator designated by the owner. // require((owner == msg.sender) || azimuth.isOperator(owner, msg.sender)); // set transfer proxy field in Azimuth contract // azimuth.setTransferProxy(_point, _transferProxy); // emit Approval event // emit Approval(owner, _transferProxy, uint256(_point)); } // // Poll actions // // startUpgradePoll(): as _galaxy, start a poll for the ecliptic // upgrade _proposal // // Requirements: // - :msg.sender must be the owner or voting proxy of _galaxy, // - the _proposal must expect to be upgraded from this specific // contract, as indicated by its previousEcliptic attribute // function startUpgradePoll(uint8 _galaxy, EclipticBase _proposal) external activePointVoter(_galaxy) { // ensure that the upgrade target expects this contract as the source // require(_proposal.previousEcliptic() == address(this)); polls.startUpgradePoll(_proposal); } // startDocumentPoll(): as _galaxy, start a poll for the _proposal // // the _proposal argument is the keccak-256 hash of any arbitrary // document or string of text // function startDocumentPoll(uint8 _galaxy, bytes32 _proposal) external activePointVoter(_galaxy) { polls.startDocumentPoll(_proposal); } // castUpgradeVote(): as _galaxy, cast a _vote on the ecliptic // upgrade _proposal // // _vote is true when in favor of the proposal, false otherwise // // If this vote results in a majority for the _proposal, it will // be upgraded to immediately. // function castUpgradeVote(uint8 _galaxy, EclipticBase _proposal, bool _vote) external activePointVoter(_galaxy) { // majority: true if the vote resulted in a majority, false otherwise // bool majority = polls.castUpgradeVote(_galaxy, _proposal, _vote); // if a majority is in favor of the upgrade, it happens as defined // in the ecliptic base contract // if (majority) { upgrade(_proposal); } } // castDocumentVote(): as _galaxy, cast a _vote on the _proposal // // _vote is true when in favor of the proposal, false otherwise // function castDocumentVote(uint8 _galaxy, bytes32 _proposal, bool _vote) external activePointVoter(_galaxy) { polls.castDocumentVote(_galaxy, _proposal, _vote); } // updateUpgradePoll(): check whether the _proposal has achieved // majority, upgrading to it if it has // function updateUpgradePoll(EclipticBase _proposal) external { // majority: true if the poll ended in a majority, false otherwise // bool majority = polls.updateUpgradePoll(_proposal); // if a majority is in favor of the upgrade, it happens as defined // in the ecliptic base contract // if (majority) { upgrade(_proposal); } } // updateDocumentPoll(): check whether the _proposal has achieved majority // // Note: the polls contract publicly exposes the function this calls, // but we offer it in the ecliptic interface as a convenience // function updateDocumentPoll(bytes32 _proposal) external { polls.updateDocumentPoll(_proposal); } // upgradeTreasury: upgrade implementation for treasury // // Note: we specify when deploying Ecliptic the keccak hash // of the implementation we're upgrading to // function upgradeTreasury(address _treasuryImpl) external { require(!treasuryUpgraded); require(keccak256(_treasuryImpl) == treasuryUpgradeHash); treasuryProxy.upgradeTo(_treasuryImpl); treasuryUpgraded = true; } // // Contract owner operations // // createGalaxy(): grant _target ownership of the _galaxy and register // it for voting // function createGalaxy(uint8 _galaxy, address _target) external onlyOwner { // only currently unowned (and thus also inactive) galaxies can be // created, and only to non-zero addresses // require( azimuth.isOwner(_galaxy, 0x0) && 0x0 != _target ); // new galaxy means a new registered voter // polls.incrementTotalVoters(); // if the caller is sending the galaxy to themselves, // assume it knows what it's doing and resolve right away // if (msg.sender == _target) { doSpawn(_galaxy, _target, true, 0x0); } // // when sending to a "foreign" address, enforce a withdraw pattern, // making the caller the owner in the mean time // else { doSpawn(_galaxy, _target, false, msg.sender); } } function setDnsDomains(string _primary, string _secondary, string _tertiary) external onlyOwner { azimuth.setDnsDomains(_primary, _secondary, _tertiary); } // // Function modifiers for this contract // // validPointId(): require that _id is a valid point // modifier validPointId(uint256 _id) { require(_id < 0x100000000); _; } // onL1(): require that ship is not deposited modifier onL1(uint32 _point) { require( depositAddress != azimuth.getOwner(_point) ); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_galaxy","type":"uint8"},{"name":"_proposal","type":"bytes32"}],"name":"startDocumentPoll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"detach","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"approved","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_approved","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_proposal","type":"bytes32"}],"name":"updateDocumentPoll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"onUpgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"InterfaceId_ERC165","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_target","type":"address"},{"name":"_reset","type":"bool"}],"name":"transferPoint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_galaxy","type":"uint8"},{"name":"_target","type":"address"}],"name":"createGalaxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"depositAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_transferProxy","type":"address"}],"name":"setTransferProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"treasuryUpgradeHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_encryptionKey","type":"bytes32"},{"name":"_authenticationKey","type":"bytes32"},{"name":"_cryptoSuiteVersion","type":"uint32"},{"name":"_discontinuous","type":"bool"}],"name":"configureKeys","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_sponsor","type":"uint32"}],"name":"canEscapeTo","outputs":[{"name":"canEscape","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_treasuryImpl","type":"address"}],"name":"upgradeTreasury","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"doesExist","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_galaxy","type":"uint8"},{"name":"_proposal","type":"address"},{"name":"_vote","type":"bool"}],"name":"castUpgradeVote","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_proposal","type":"address"}],"name":"updateUpgradePoll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"treasuryProxy","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_galaxy","type":"uint8"},{"name":"_proposal","type":"bytes32"},{"name":"_vote","type":"bool"}],"name":"castDocumentVote","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_manager","type":"address"}],"name":"setManagementProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"treasuryUpgraded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_galaxy","type":"uint8"},{"name":"_proposal","type":"address"}],"name":"startUpgradePoll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_target","type":"address"}],"name":"spawn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_galaxy","type":"uint8"},{"name":"_voter","type":"address"}],"name":"setVotingProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_prefix","type":"uint16"},{"name":"_spawnProxy","type":"address"}],"name":"setSpawnProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_primary","type":"string"},{"name":"_secondary","type":"string"},{"name":"_tertiary","type":"string"}],"name":"setDnsDomains","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"reject","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_sponsor","type":"uint32"}],"name":"escape","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"adopt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"cancelEscape","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"_tokenURI","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"azimuth","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"claims","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"polls","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"previousEcliptic","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_time","type":"uint256"}],"name":"getSpawnLimit","outputs":[{"name":"limit","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_previous","type":"address"},{"name":"_azimuth","type":"address"},{"name":"_polls","type":"address"},{"name":"_claims","type":"address"},{"name":"_treasuryProxy","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"to","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
60806040526005805460a060020a60ff02191690553480156200002157600080fd5b5060405160a08062005c7f833981016040908152815160208301519183015160608401516080909401516000805433600160a060020a031991821617909155600180548216600160a060020a03808816919091179091556003805483168287161790556002805490921690841617905591939091620000c97f01ffc9a700000000000000000000000000000000000000000000000000000000640100000000620001a0810204565b60068054600160a060020a03808516600160a060020a03199283161790925560058054928416929091169190911790556200012d7f80ac58cd00000000000000000000000000000000000000000000000000000000640100000000620001a0810204565b620001617f5b5e139f00000000000000000000000000000000000000000000000000000000640100000000620001a0810204565b620001957f7f5828d000000000000000000000000000000000000000000000000000000000640100000000620001a0810204565b50505050506200020d565b7fffffffff000000000000000000000000000000000000000000000000000000008082161415620001d057600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152600460205260409020805460ff19166001179055565b615a62806200021d6000396000f3006080604052600436106102425763ffffffff60e060020a60003504166301ffc9a7811461024757806305bbf5db1461027d57806306fdde031461029d578063073a780414610327578063081812fc14610345578063095ea7b314610379578063172a735c1461039d5780631824a46b146103b557806319fa8f50146103ca5780631e79a85b146103fc57806323b872dd1461042b57806326295b521461045557806328f833b71461047c5780632c7ba5641461049157806339d42b15146104bb57806342842e0e146104e25780634447e48c1461050c5780634a0132961461053d5780634e7e9299146105615780634f558e791461058257806351de55411461059a5780635623715b146105c65780635d978826146105e75780636352211e146105fc5780636eb582241461061457806370a0823114610637578063715018a6146106585780638866bb2c1461066d5780638da5cb5b1461069757806395d89b41146106ac5780639e6e4028146106c15780639e988d13146106d6578063a0d3253f146106fd578063a22cb46514610727578063a60e8bd61461074d578063ae32622114610774578063b88d4fde1461079c578063bac55edd1461080b578063bbe21ca514610843578063bf5772b914610861578063c1b9d98b14610885578063c6d761d4146108a3578063c87b56dd146108c1578063d40ffacb146108d9578063dcc59b6f146108ee578063e64853c414610903578063e985e9c514610918578063ed969f681461093f578063ef20bff814610954578063f2fde38b1461098e575b600080fd5b34801561025357600080fd5b50610269600160e060020a0319600435166109af565b604080519115158252519081900360200190f35b34801561028957600080fd5b5061029b60ff600435166024356109ce565b005b3480156102a957600080fd5b506102b2610b6d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ec5781810151838201526020016102d4565b50505050905090810190601f1680156103195780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561033357600080fd5b5061029b63ffffffff60043516610ba4565b34801561035157600080fd5b5061035d600435610e9d565b60408051600160a060020a039092168252519081900360200190f35b34801561038557600080fd5b5061029b600160a060020a0360043516602435610fdd565b3480156103a957600080fd5b5061029b600435610ffe565b3480156103c157600080fd5b5061029b61108f565b3480156103d657600080fd5b506103df6111ce565b60408051600160e060020a03199092168252519081900360200190f35b34801561040857600080fd5b5061029b63ffffffff60043516600160a060020a036024351660443515156111f2565b34801561043757600080fd5b5061029b600160a060020a0360043581169060243516604435612009565b34801561046157600080fd5b5061029b60ff60043516600160a060020a03602435166120c8565b34801561048857600080fd5b5061035d61222d565b34801561049d57600080fd5b5061029b63ffffffff60043516600160a060020a036024351661223f565b3480156104c757600080fd5b506104d06124e6565b60408051918252519081900360200190f35b3480156104ee57600080fd5b5061029b600160a060020a036004358116906024351660443561250a565b34801561051857600080fd5b5061029b63ffffffff6004358116906024359060443590606435166084351515612526565b34801561054957600080fd5b5061026963ffffffff60043581169060243516612812565b34801561056d57600080fd5b5061029b600160a060020a0360043516612a89565b34801561058e57600080fd5b50610269600435612bd2565b3480156105a657600080fd5b5061029b60ff60043516600160a060020a03602435166044351515612c6c565b3480156105d257600080fd5b5061029b600160a060020a0360043516612e3d565b3480156105f357600080fd5b5061035d612ee5565b34801561060857600080fd5b5061035d600435612ef4565b34801561062057600080fd5b5061029b60ff600435166024356044351515613023565b34801561064357600080fd5b506104d0600160a060020a03600435166131e1565b34801561066457600080fd5b5061029b613260565b34801561067957600080fd5b5061029b63ffffffff60043516600160a060020a03602435166132cc565b3480156106a357600080fd5b5061035d6134ff565b3480156106b857600080fd5b506102b261350e565b3480156106cd57600080fd5b50610269613545565b3480156106e257600080fd5b5061029b60ff60043516600160a060020a0360243516613566565b34801561070957600080fd5b5061029b63ffffffff60043516600160a060020a0360243516613770565b34801561073357600080fd5b5061029b600160a060020a03600435166024351515613dcc565b34801561075957600080fd5b5061029b60ff60043516600160a060020a0360243516613eb4565b34801561078057600080fd5b5061029b61ffff60043516600160a060020a0360243516614040565b3480156107a857600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261029b94600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506143429650505050505050565b34801561081757600080fd5b5061029b60246004803582810192908201359181358083019290820135916044359182019101356144ac565b34801561084f57600080fd5b5061029b63ffffffff600435166145a5565b34801561086d57600080fd5b5061029b63ffffffff60043581169060243516614882565b34801561089157600080fd5b5061029b63ffffffff60043516614b6f565b3480156108af57600080fd5b5061029b63ffffffff60043516614ef6565b3480156108cd57600080fd5b506102b2600435615012565b3480156108e557600080fd5b5061035d6152c5565b3480156108fa57600080fd5b5061035d6152d4565b34801561090f57600080fd5b5061035d6152e3565b34801561092457600080fd5b50610269600160a060020a03600435811690602435166152f2565b34801561094b57600080fd5b5061035d615365565b34801561096057600080fd5b5061097563ffffffff60043516602435615374565b6040805163ffffffff9092168252519081900360200190f35b34801561099a57600080fd5b5061029b600160a060020a036004351661546a565b600160e060020a03191660009081526004602052604090205460ff1690565b6001546040805160e060020a63b65afedd02815260ff85166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b158015610a2957600080fd5b505af1158015610a3d573d6000803e3d6000fd5b505050506040513d6020811015610a5357600080fd5b50518015610adf57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015610ab257600080fd5b505af1158015610ac6573d6000803e3d6000fd5b505050506040513d6020811015610adc57600080fd5b50515b1515610aea57600080fd5b600254604080517f9a33aff9000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a0390921691639a33aff99160248082019260009290919082900301818387803b158015610b5057600080fd5b505af1158015610b64573d6000803e3d6000fd5b50505050505050565b60408051808201909152600e81527f417a696d75746820506f696e7473000000000000000000000000000000000000602082015290565b600154604080517f439f7d3c00000000000000000000000000000000000000000000000000000000815263ffffffff841660048201529051600092600160a060020a03169163439f7d3c91602480830192602092919082900301818787803b158015610c0f57600080fd5b505af1158015610c23573d6000803e3d6000fd5b505050506040513d6020811015610c3957600080fd5b5051600154604080517f77eb4c5000000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051929350600160a060020a03909116916377eb4c50916024808201926020929091908290030181600087803b158015610caa57600080fd5b505af1158015610cbe573d6000803e3d6000fd5b505050506040513d6020811015610cd457600080fd5b50518015610d6657506001546040805160e160020a63489bff0502815263ffffffff841660048201523360248201529051600160a060020a0390921691639137fe0a916044808201926020929091908290030181600087803b158015610d3957600080fd5b505af1158015610d4d573d6000803e3d6000fd5b505050506040513d6020811015610d6357600080fd5b50515b1515610d7157600080fd5b6001546040805160e160020a63310d91f102815263ffffffff841660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b158015610dc757600080fd5b505af1158015610ddb573d6000803e3d6000fd5b505050506040513d6020811015610df157600080fd5b5051600160a060020a0316600080516020615a178339815191521415610e1657600080fd5b600154604080517fbc562b9e00000000000000000000000000000000000000000000000000000000815263ffffffff851660048201529051600160a060020a039092169163bc562b9e9160248082019260009290919082900301818387803b158015610e8157600080fd5b505af1158015610e95573d6000803e3d6000fd5b505050505050565b6000816401000000008110610eb157600080fd5b6001546040805160e060020a635e19b30502815263ffffffff861660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015610f0757600080fd5b505af1158015610f1b573d6000803e3d6000fd5b505050506040513d6020811015610f3157600080fd5b50511515610f3e57600080fd5b600154604080517f24541f7800000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a03909216916324541f78916024808201926020929091908290030181600087803b158015610faa57600080fd5b505af1158015610fbe573d6000803e3d6000fd5b505050506040513d6020811015610fd457600080fd5b50519392505050565b806401000000008110610fef57600080fd5b610ff9828461223f565b505050565b600254604080517f172a735c000000000000000000000000000000000000000000000000000000008152600481018490529051600160a060020a039092169163172a735c916024808201926020929091908290030181600087803b15801561106557600080fd5b505af1158015611079573d6000803e3d6000fd5b505050506040513d6020811015610ff957600080fd5b600354600160a060020a03163314801561112f5750600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110f757600080fd5b505af115801561110b573d6000803e3d6000fd5b505050506040513d602081101561112157600080fd5b5051600160a060020a031630145b80156111c15750600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b505050506040513d60208110156111b357600080fd5b5051600160a060020a031630145b15156111cc57600080fd5b565b7f01ffc9a70000000000000000000000000000000000000000000000000000000081565b600154604080517f728aa85700000000000000000000000000000000000000000000000000000000815263ffffffff861660048201523360248201529051600092600160a060020a03169163728aa85791604480830192602092919082900301818787803b15801561126357600080fd5b505af1158015611277573d6000803e3d6000fd5b505050506040513d602081101561128d57600080fd5b5051151561129a57600080fd5b600080516020615a17833981519152600160a060020a0384161415806113e357506001546040805160e060020a639397640502815263ffffffff871660048201529051600092600160a060020a031691639397640591602480830192602092919082900301818787803b15801561131057600080fd5b505af1158015611324573d6000803e3d6000fd5b505050506040513d602081101561133a57600080fd5b5051600281111561134757fe5b141580156113e357506001546040805160e160020a63310d91f102815263ffffffff8716600482015290516113e192600160a060020a03169163621b23e29160248083019260209291908290030181600087803b1580156113a757600080fd5b505af11580156113bb573d6000803e3d6000fd5b505050506040513d60208110156113d157600080fd5b5051600160a060020a031661548d565b155b15156113ee57600080fd5b6001546040805160e060020a635e19b30502815263ffffffff871660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561144457600080fd5b505af1158015611458573d6000803e3d6000fd5b505050506040513d602081101561146e57600080fd5b505115156114fa57600154604080517f7bc702a100000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a0390921691637bc702a19160248082019260009290919082900301818387803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b505050505b6001546040805160e060020a63caf590f902815263ffffffff87166004820152600160a060020a0386811660248301529151919092169163caf590f99160448083019260209291908290030181600087803b15801561155857600080fd5b505af115801561156c573d6000803e3d6000fd5b505050506040513d602081101561158257600080fd5b50511515611752576001546040805160e160020a63310d91f102815263ffffffff871660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b1580156115e057600080fd5b505af11580156115f4573d6000803e3d6000fd5b505050506040513d602081101561160a57600080fd5b5051600154604080517fddc3595000000000000000000000000000000000000000000000000000000000815263ffffffff88166004820152600160a060020a038781166024830152915193945091169163ddc359509160448082019260009290919082900301818387803b15801561168157600080fd5b505af1158015611695573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632c7ba56493506044808201939182900301818387803b1580156116f257600080fd5b505af1158015611706573d6000803e3d6000fd5b505050508363ffffffff1683600160a060020a031682600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b600080516020615a17833981519152600160a060020a0384161415611b1957600154604080517ff9b87d4000000000000000000000000000000000000000000000000000000000815263ffffffff8716600482015260006024820181905260448201819052606482018190529151600160a060020a039093169263f9b87d409260848084019391929182900301818387803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050600154604080517f8866bb2c00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a039093169450638866bb2c93506044808201939182900301818387803b15801561187757600080fd5b505af115801561188b573d6000803e3d6000fd5b5050600154604080517fa297c1d800000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a03909316945063a297c1d893506044808201939182900301818387803b1580156118fe57600080fd5b505af1158015611912573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632c7ba56493506044808201939182900301818387803b15801561196f57600080fd5b505af1158015611983573d6000803e3d6000fd5b5050600154604080517f2a19642c00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632a19642c93506044808201939182900301818387803b1580156119f657600080fd5b505af1158015611a0a573d6000803e3d6000fd5b5050600654604080517feaae46e500000000000000000000000000000000000000000000000000000000815263ffffffff891660048201529051600160a060020a03909216935063eaae46e5925060248082019260009290919082900301818387803b158015611a7957600080fd5b505af1158015611a8d573d6000803e3d6000fd5b5050600154604080517fc6d761d400000000000000000000000000000000000000000000000000000000815263ffffffff891660048201529051600160a060020a03909216935063c6d761d4925060248082019260009290919082900301818387803b158015611afc57600080fd5b505af1158015611b10573d6000803e3d6000fd5b50505050612003565b8115612003576001546040805160e060020a636d09887b02815263ffffffff871660048201529051600160a060020a0390921691636d09887b916024808201926020929091908290030181600087803b158015611b7557600080fd5b505af1158015611b89573d6000803e3d6000fd5b505050506040513d6020811015611b9f57600080fd5b505115611cbf57600154604080517ff491491900000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a039092169163f49149199160248082019260009290919082900301818387803b158015611c1157600080fd5b505af1158015611c25573d6000803e3d6000fd5b5050600154604080517ff9b87d4000000000000000000000000000000000000000000000000000000000815263ffffffff8916600482015260006024820181905260448201819052606482018190529151600160a060020a03909316945063f9b87d4093506084808201939182900301818387803b158015611ca657600080fd5b505af1158015611cba573d6000803e3d6000fd5b505050505b600154604080517f8866bb2c00000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526000602482018190529151600160a060020a0390931692638866bb2c9260448084019391929182900301818387803b158015611d3057600080fd5b505af1158015611d44573d6000803e3d6000fd5b5050600154604080517fa297c1d800000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a03909316945063a297c1d893506044808201939182900301818387803b158015611db757600080fd5b505af1158015611dcb573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632c7ba56493506044808201939182900301818387803b158015611e2857600080fd5b505af1158015611e3c573d6000803e3d6000fd5b5050600154604080517ff4e3be2d00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201529051600160a060020a03909216935063f4e3be2d92506024808201926020929091908290030181600087803b158015611eac57600080fd5b505af1158015611ec0573d6000803e3d6000fd5b505050506040513d6020811015611ed657600080fd5b5051600160a060020a0316600080516020615a1783398151915214611f7f57600154604080517f2a19642c00000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526000602482018190529151600160a060020a0390931692632a19642c9260448084019391929182900301818387803b158015611f6657600080fd5b505af1158015611f7a573d6000803e3d6000fd5b505050505b600654604080517feaae46e500000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a039092169163eaae46e59160248082019260009290919082900301818387803b158015611fea57600080fd5b505af1158015611ffe573d6000803e3d6000fd5b505050505b50505050565b600081640100000000811061201d57600080fd5b6001546040805160e060020a63caf590f902815263ffffffff86166004820152600160a060020a0388811660248301529151869550919092169163caf590f99160448083019260209291908290030181600087803b15801561207e57600080fd5b505af1158015612092573d6000803e3d6000fd5b505050506040513d60208110156120a857600080fd5b505115156120b557600080fd5b6120c1828560016111f2565b5050505050565b600054600160a060020a031633146120df57600080fd5b6001546040805160e060020a63caf590f902815260ff851660048201526000602482018190529151600160a060020a039093169263caf590f992604480840193602093929083900390910190829087803b15801561213c57600080fd5b505af1158015612150573d6000803e3d6000fd5b505050506040513d602081101561216657600080fd5b5051801561217c5750600160a060020a03811615155b151561218757600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a031663246d41a96040518163ffffffff1660e060020a028152600401600060405180830381600087803b1580156121da57600080fd5b505af11580156121ee573d6000803e3d6000fd5b50505050600160a060020a038116331415612219576122148260ff168260016000615495565b612229565b6122298260ff1682600033615495565b5050565b600080516020615a1783398151915281565b6001546040805160e160020a63310d91f102815263ffffffff8516600482015290516000928592600160a060020a039091169163621b23e29160248082019260209290919082900301818887803b15801561229957600080fd5b505af11580156122ad573d6000803e3d6000fd5b505050506040513d60208110156122c357600080fd5b5051600160a060020a0316600080516020615a1783398151915214156122e857600080fd5b6001546040805160e160020a63310d91f102815263ffffffff871660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b15801561233e57600080fd5b505af1158015612352573d6000803e3d6000fd5b505050506040513d602081101561236857600080fd5b50519150600160a060020a0382163314806124195750600154604080517fb6363cf2000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301523360248301529151919092169163b6363cf29160448083019260209291908290030181600087803b1580156123ec57600080fd5b505af1158015612400573d6000803e3d6000fd5b505050506040513d602081101561241657600080fd5b50515b151561242457600080fd5b6001546040805160e260020a630b1ee95902815263ffffffff87166004820152600160a060020a03868116602483015291519190921691632c7ba56491604480830192600092919082900301818387803b15801561248157600080fd5b505af1158015612495573d6000803e3d6000fd5b505050508363ffffffff1683600160a060020a031683600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b7f26f3eae628fa1a4d23e34b91a4d412526a47620ced37c80928906f9fa07c077481565b610ff98383836020604051908101604052806000815250614342565b6001546040805160e160020a63489bff0502815263ffffffff8816600482015233602482015290518792600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b15801561258157600080fd5b505af1158015612595573d6000803e3d6000fd5b505050506040513d60208110156125ab57600080fd5b5051801561263757506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561260a57600080fd5b505af115801561261e573d6000803e3d6000fd5b505050506040513d602081101561263457600080fd5b50515b151561264257600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8916600482015290518892600160a060020a03169163621b23e29160248083019260209291908290030181600087803b15801561269757600080fd5b505af11580156126ab573d6000803e3d6000fd5b505050506040513d60208110156126c157600080fd5b5051600160a060020a0316600080516020615a1783398151915214156126e657600080fd5b821561277057600154604080517ff491491900000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201529051600160a060020a039092169163f49149199160248082019260009290919082900301818387803b15801561275757600080fd5b505af115801561276b573d6000803e3d6000fd5b505050505b600154604080517ff9b87d4000000000000000000000000000000000000000000000000000000000815263ffffffff808b166004830152602482018a905260448201899052871660648201529051600160a060020a039092169163f9b87d409160848082019260009290919082900301818387803b1580156127f157600080fd5b505af1158015612805573d6000803e3d6000fd5b5050505050505050505050565b6001546040805160e060020a636d09887b02815263ffffffff84166004820152905160009283928392600160a060020a0390921691636d09887b9160248082019260209290919082900301818787803b15801561286e57600080fd5b505af1158015612882573d6000803e3d6000fd5b505050506040513d602081101561289857600080fd5b505115156128a95760009250612a81565b6001546040805160e060020a639397640502815263ffffffff881660048201529051600160a060020a03909216916393976405916024808201926020929091908290030181600087803b1580156128ff57600080fd5b505af1158015612913573d6000803e3d6000fd5b505050506040513d602081101561292957600080fd5b50516001546040805160e060020a639397640502815263ffffffff881660048201529051929450600160a060020a03909116916393976405916024808201926020929091908290030181600087803b15801561298457600080fd5b505af1158015612998573d6000803e3d6000fd5b505050506040513d60208110156129ae57600080fd5b505190508160028111156129be57fe5b60ff168160028111156129cd57fe5b60010160ff161480612a7e57508160028111156129e657fe5b8160028111156129f257fe5b148015612a7e57506001546040805160e060020a636d09887b02815263ffffffff881660048201529051600160a060020a0390921691636d09887b916024808201926020929091908290030181600087803b158015612a5057600080fd5b505af1158015612a64573d6000803e3d6000fd5b505050506040513d6020811015612a7a57600080fd5b5051155b92505b505092915050565b60055474010000000000000000000000000000000000000000900460ff1615612ab157600080fd5b604080516c01000000000000000000000000600160a060020a03841602815290519081900360140190207f26f3eae628fa1a4d23e34b91a4d412526a47620ced37c80928906f9fa07c077414612b0657600080fd5b600554604080517f3659cfe6000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291519190921691633659cfe69160248083019260209291908290030181600087803b158015612b6e57600080fd5b505af1158015612b82573d6000803e3d6000fd5b505050506040513d6020811015612b9857600080fd5b50506005805474ff000000000000000000000000000000000000000019167401000000000000000000000000000000000000000017905550565b600064010000000082108015612c6657506001546040805160e060020a635e19b30502815263ffffffff851660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015612c3957600080fd5b505af1158015612c4d573d6000803e3d6000fd5b505050506040513d6020811015612c6357600080fd5b50515b92915050565b6001546040805160e060020a63b65afedd02815260ff8616600482018190523360248301529151600093600160a060020a03169163b65afedd91604480830192602092919082900301818887803b158015612cc657600080fd5b505af1158015612cda573d6000803e3d6000fd5b505050506040513d6020811015612cf057600080fd5b50518015612d7c57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015612d4f57600080fd5b505af1158015612d63573d6000803e3d6000fd5b505050506040513d6020811015612d7957600080fd5b50515b1515612d8757600080fd5b600254604080517f51de554100000000000000000000000000000000000000000000000000000000815260ff88166004820152600160a060020a0387811660248301528615156044830152915191909216916351de55419160648083019260209291908290030181600087803b158015612e0057600080fd5b505af1158015612e14573d6000803e3d6000fd5b505050506040513d6020811015612e2a57600080fd5b5051915081156120c1576120c1846157fc565b600254604080517f5623715b000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000939290921691635623715b9160248082019260209290919082900301818787803b158015612ea857600080fd5b505af1158015612ebc573d6000803e3d6000fd5b505050506040513d6020811015612ed257600080fd5b50519050801561222957612229826157fc565b600554600160a060020a031681565b600080826401000000008110612f0957600080fd5b6001546040805160e060020a635e19b30502815263ffffffff871660048201529051869450600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015612f6257600080fd5b505af1158015612f76573d6000803e3d6000fd5b505050506040513d6020811015612f8c57600080fd5b50511515612f9957600080fd5b6001546040805160e160020a63310d91f102815263ffffffff851660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b158015612fef57600080fd5b505af1158015613003573d6000803e3d6000fd5b505050506040513d602081101561301957600080fd5b5051949350505050565b6001546040805160e060020a63b65afedd02815260ff86166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b15801561307e57600080fd5b505af1158015613092573d6000803e3d6000fd5b505050506040513d60208110156130a857600080fd5b5051801561313457506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561310757600080fd5b505af115801561311b573d6000803e3d6000fd5b505050506040513d602081101561313157600080fd5b50515b151561313f57600080fd5b600254604080517f6eb5822400000000000000000000000000000000000000000000000000000000815260ff871660048201526024810186905284151560448201529051600160a060020a0390921691636eb58224916064808201926020929091908290030181600087803b1580156131b757600080fd5b505af11580156131cb573d6000803e3d6000fd5b505050506040513d6020811015610e9557600080fd5b6000600160a060020a03821615156131f857600080fd5b600154604080517f12afbc78000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152915191909216916312afbc789160248083019260209291908290030181600087803b158015612c3957600080fd5b600054600160a060020a0316331461327757600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b6001546040805160e160020a63489bff0502815263ffffffff8516600482015233602482015290518492600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b15801561332757600080fd5b505af115801561333b573d6000803e3d6000fd5b505050506040513d602081101561335157600080fd5b505180156133dd57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b1580156133b057600080fd5b505af11580156133c4573d6000803e3d6000fd5b505050506040513d60208110156133da57600080fd5b50515b15156133e857600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8616600482015290518592600160a060020a03169163621b23e29160248083019260209291908290030181600087803b15801561343d57600080fd5b505af1158015613451573d6000803e3d6000fd5b505050506040513d602081101561346757600080fd5b5051600160a060020a0316600080516020615a17833981519152141561348c57600080fd5b600154604080517f8866bb2c00000000000000000000000000000000000000000000000000000000815263ffffffff87166004820152600160a060020a03868116602483015291519190921691638866bb2c91604480830192600092919082900301818387803b158015611fea57600080fd5b600054600160a060020a031681565b60408051808201909152600381527f415a500000000000000000000000000000000000000000000000000000000000602082015290565b60055474010000000000000000000000000000000000000000900460ff1681565b6001546040805160e060020a63b65afedd02815260ff85166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b1580156135c157600080fd5b505af11580156135d5573d6000803e3d6000fd5b505050506040513d60208110156135eb57600080fd5b5051801561367757506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561364a57600080fd5b505af115801561365e573d6000803e3d6000fd5b505050506040513d602081101561367457600080fd5b50515b151561368257600080fd5b30600160a060020a031682600160a060020a031663ed969f686040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156136ca57600080fd5b505af11580156136de573d6000803e3d6000fd5b505050506040513d60208110156136f457600080fd5b5051600160a060020a03161461370957600080fd5b600254604080517fe31f3e0c000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301529151919092169163e31f3e0c91602480830192600092919082900301818387803b158015610b5057600080fd5b6001546040805160e060020a63caf590f902815263ffffffff8516600482015260006024820181905291519192600160a060020a03169163caf590f99160448082019260209290919082900301818787803b1580156137ce57600080fd5b505af11580156137e2573d6000803e3d6000fd5b505050506040513d60208110156137f857600080fd5b5051151561380557600080fd5b600154604080517fe4a358d700000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a039092169163e4a358d7916024808201926020929091908290030181600087803b15801561387157600080fd5b505af1158015613885573d6000803e3d6000fd5b505050506040513d602081101561389b57600080fd5b50516001546040805160e160020a63310d91f102815261ffff841660048201529051929350600160a060020a039091169163621b23e2916024808201926020929091908290030181600087803b1580156138f457600080fd5b505af1158015613908573d6000803e3d6000fd5b505050506040513d602081101561391e57600080fd5b5051600160a060020a0316600080516020615a17833981519152141561394357600080fd5b600154604080517ff4e3be2d00000000000000000000000000000000000000000000000000000000815261ffff841660048201529051600160a060020a039092169163f4e3be2d916024808201926020929091908290030181600087803b1580156139ad57600080fd5b505af11580156139c1573d6000803e3d6000fd5b505050506040513d60208110156139d757600080fd5b5051600160a060020a0316600080516020615a1783398151915214156139fc57600080fd5b6001546040805160e060020a639397640502815263ffffffff861660048201529051600160a060020a03909216916393976405916024808201926020929091908290030181600087803b158015613a5257600080fd5b505af1158015613a66573d6000803e3d6000fd5b505050506040513d6020811015613a7c57600080fd5b50516002811115613a8957fe5b6001546040805160e060020a639397640502815261ffff85166004820152905160ff9390931692600160a060020a03909216916393976405916024808201926020929091908290030181600087803b158015613ae457600080fd5b505af1158015613af8573d6000803e3d6000fd5b505050506040513d6020811015613b0e57600080fd5b50516002811115613b1b57fe5b60010160ff16141515613b2d57600080fd5b6001546040805160e060020a636d09887b02815261ffff841660048201529051600160a060020a0390921691636d09887b916024808201926020929091908290030181600087803b158015613b8157600080fd5b505af1158015613b95573d6000803e3d6000fd5b505050506040513d6020811015613bab57600080fd5b50518015613c6a5750613bc28161ffff1642615374565b600154604080517f293a916900000000000000000000000000000000000000000000000000000000815261ffff85166004820152905163ffffffff9390931692600160a060020a039092169163293a9169916024808201926020929091908290030181600087803b158015613c3657600080fd5b505af1158015613c4a573d6000803e3d6000fd5b505050506040513d6020811015613c6057600080fd5b505163ffffffff16105b1515613c7557600080fd5b600154604080517f8a27bf5900000000000000000000000000000000000000000000000000000000815261ffff841660048201523360248201529051600160a060020a0390921691638a27bf59916044808201926020929091908290030181600087803b158015613ce557600080fd5b505af1158015613cf9573d6000803e3d6000fd5b505050506040513d6020811015613d0f57600080fd5b50511515613d1c57600080fd5b33600160a060020a0383161415613d4057613d3b838360016000615495565b610ff9565b6001546040805160e160020a63310d91f102815261ffff841660048201529051610ff99286928692600092600160a060020a03169163621b23e291602480830192602092919082900301818787803b158015613d9b57600080fd5b505af1158015613daf573d6000803e3d6000fd5b505050506040513d6020811015613dc557600080fd5b5051615495565b600160a060020a0382161515613de157600080fd5b600154604080517fbc735d90000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a03858116602483015284151560448301529151919092169163bc735d9091606480830192600092919082900301818387803b158015613e5657600080fd5b505af1158015613e6a573d6000803e3d6000fd5b50506040805184151581529051600160a060020a03861693503392507f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6001546040805160e060020a63b65afedd02815260ff85166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b158015613f0f57600080fd5b505af1158015613f23573d6000803e3d6000fd5b505050506040513d6020811015613f3957600080fd5b50518015613fc557506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015613f9857600080fd5b505af1158015613fac573d6000803e3d6000fd5b505050506040513d6020811015613fc257600080fd5b50515b1515613fd057600080fd5b600154604080517fa297c1d800000000000000000000000000000000000000000000000000000000815260ff86166004820152600160a060020a0385811660248301529151919092169163a297c1d891604480830192600092919082900301818387803b158015610b5057600080fd5b600154604080517f8a27bf5900000000000000000000000000000000000000000000000000000000815261ffff85166004820181905233602483015291519192600160a060020a031691638a27bf59916044808201926020929091908290030181600087803b1580156140b257600080fd5b505af11580156140c6573d6000803e3d6000fd5b505050506040513d60208110156140dc57600080fd5b5051801561416857506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561413b57600080fd5b505af115801561414f573d6000803e3d6000fd5b505050506040513d602081101561416557600080fd5b50515b151561417357600080fd5b6001546040805160e160020a63310d91f102815261ffff86166004820181905291519192600160a060020a03169163621b23e2916024808201926020929091908290030181600087803b1580156141c957600080fd5b505af11580156141dd573d6000803e3d6000fd5b505050506040513d60208110156141f357600080fd5b5051600160a060020a0316600080516020615a17833981519152141561421857600080fd5b600154604080517ff4e3be2d00000000000000000000000000000000000000000000000000000000815261ffff871660048201529051600160a060020a039092169163f4e3be2d916024808201926020929091908290030181600087803b15801561428257600080fd5b505af1158015614296573d6000803e3d6000fd5b505050506040513d60208110156142ac57600080fd5b5051600160a060020a0316600080516020615a1783398151915214156142d157600080fd5b600154604080517f2a19642c00000000000000000000000000000000000000000000000000000000815261ffff87166004820152600160a060020a03868116602483015291519190921691632a19642c91604480830192600092919082900301818387803b158015611fea57600080fd5b600061434f858585612009565b61436184600160a060020a031661548d565b156120c1576040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a038881166024850152604484018790526080606485019081528651608486015286519189169463150b7a0294938b938a938a93909160a490910190602085019080838360005b838110156143f95781810151838201526020016143e1565b50505050905090810190601f1680156144265780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561444857600080fd5b505af115801561445c573d6000803e3d6000fd5b505050506040513d602081101561447257600080fd5b50519050600160e060020a031981167f150b7a0200000000000000000000000000000000000000000000000000000000146120c157600080fd5b600054600160a060020a031633146144c357600080fd5b6001546040517fbac55edd00000000000000000000000000000000000000000000000000000000815260606004820190815260648201889052600160a060020a039092169163bac55edd918991899189918991899189918190602481019060448101906084018a8a80828437909101858103845288815260200190508888808284379091018581038352868152602001905086868082843782019150509950505050505050505050600060405180830381600087803b15801561458557600080fd5b505af1158015614599573d6000803e3d6000fd5b50505050505050505050565b600154604080517ff5af662100000000000000000000000000000000000000000000000000000000815263ffffffff841660048201529051600092600160a060020a03169163f5af662191602480830192602092919082900301818787803b15801561461057600080fd5b505af1158015614624573d6000803e3d6000fd5b505050506040513d602081101561463a57600080fd5b5051600154604080517f9b350e1200000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051929350600160a060020a0390911691639b350e12916024808201926020929091908290030181600087803b1580156146ab57600080fd5b505af11580156146bf573d6000803e3d6000fd5b505050506040513d60208110156146d557600080fd5b5051801561476757506001546040805160e160020a63489bff0502815263ffffffff841660048201523360248201529051600160a060020a0390921691639137fe0a916044808201926020929091908290030181600087803b15801561473a57600080fd5b505af115801561474e573d6000803e3d6000fd5b505050506040513d602081101561476457600080fd5b50515b151561477257600080fd5b6001546040805160e160020a63310d91f102815263ffffffff841660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b1580156147c857600080fd5b505af11580156147dc573d6000803e3d6000fd5b505050506040513d60208110156147f257600080fd5b5051600160a060020a0316600080516020615a17833981519152141561481757600080fd5b600154604080517fc6d761d400000000000000000000000000000000000000000000000000000000815263ffffffff851660048201529051600160a060020a039092169163c6d761d49160248082019260009290919082900301818387803b158015610e8157600080fd5b6001546040805160e160020a63489bff0502815263ffffffff8516600482015233602482015290518492600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b1580156148dd57600080fd5b505af11580156148f1573d6000803e3d6000fd5b505050506040513d602081101561490757600080fd5b5051801561499357506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561496657600080fd5b505af115801561497a573d6000803e3d6000fd5b505050506040513d602081101561499057600080fd5b50515b151561499e57600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8616600482015290518592600160a060020a03169163621b23e29160248083019260209291908290030181600087803b1580156149f357600080fd5b505af1158015614a07573d6000803e3d6000fd5b505050506040513d6020811015614a1d57600080fd5b5051600160a060020a0316600080516020615a178339815191521415614a4257600080fd5b6001546040805160e160020a63310d91f102815263ffffffff861660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b158015614a9857600080fd5b505af1158015614aac573d6000803e3d6000fd5b505050506040513d6020811015614ac257600080fd5b5051600160a060020a0316600080516020615a178339815191521415614ae757600080fd5b614af18484612812565b1515614afc57600080fd5b600154604080517fa634585900000000000000000000000000000000000000000000000000000000815263ffffffff8088166004830152861660248201529051600160a060020a039092169163a63458599160448082019260009290919082900301818387803b158015611fea57600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8416600482015290516000928492600160a060020a039091169163621b23e29160248082019260209290919082900301818887803b158015614bc957600080fd5b505af1158015614bdd573d6000803e3d6000fd5b505050506040513d6020811015614bf357600080fd5b5051600160a060020a0316600080516020615a178339815191521415614c1857600080fd5b600154604080517ff5af662100000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a039092169163f5af6621916024808201926020929091908290030181600087803b158015614c8457600080fd5b505af1158015614c98573d6000803e3d6000fd5b505050506040513d6020811015614cae57600080fd5b5051600154604080517f9b350e1200000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051929450600160a060020a0390911691639b350e12916024808201926020929091908290030181600087803b158015614d1f57600080fd5b505af1158015614d33573d6000803e3d6000fd5b505050506040513d6020811015614d4957600080fd5b50518015614ddb57506001546040805160e160020a63489bff0502815263ffffffff851660048201523360248201529051600160a060020a0390921691639137fe0a916044808201926020929091908290030181600087803b158015614dae57600080fd5b505af1158015614dc2573d6000803e3d6000fd5b505050506040513d6020811015614dd857600080fd5b50515b1515614de657600080fd5b6001546040805160e160020a63310d91f102815263ffffffff851660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b158015614e3c57600080fd5b505af1158015614e50573d6000803e3d6000fd5b505050506040513d6020811015614e6657600080fd5b5051600160a060020a0316600080516020615a178339815191521415614e8b57600080fd5b600154604080517f1306318000000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a039092169163130631809160248082019260009290919082900301818387803b158015610b5057600080fd5b6001546040805160e160020a63489bff0502815263ffffffff8416600482015233602482015290518392600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b158015614f5157600080fd5b505af1158015614f65573d6000803e3d6000fd5b505050506040513d6020811015614f7b57600080fd5b5051801561500757506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015614fda57600080fd5b505af1158015614fee573d6000803e3d6000fd5b505050506040513d602081101561500457600080fd5b50515b151561481757600080fd5b60608082640100000000811061502757600080fd5b60408051606081018252602e81527f68747470733a2f2f617a696d7574682e6e6574776f726b2f6572633732312f3060208201527f3030303030303030302e6a736f6e0000000000000000000000000000000000009181019190915292508291507fff00000000000000000000000000000000000000000000000000000000000000600a633b9aca0086040660300160f860020a0216600081901a603f84015350600a6305f5e10085040660300160f860020a028260208151811015156150ea57fe5b906020010190600160f860020a031916908160001a905350600a6298968085040660300160f860020a0282602181518110151561512357fe5b906020010190600160f860020a031916908160001a905350600a620f424085040660300160f860020a0282602281518110151561515c57fe5b906020010190600160f860020a031916908160001a905350600a620186a085040660300160f860020a0282602381518110151561519557fe5b906020010190600160f860020a031916908160001a905350600a61271085040660300160f860020a028260248151811015156151cd57fe5b906020010190600160f860020a031916908160001a905350600a6103e885040660300160f860020a0282602581518110151561520557fe5b906020010190600160f860020a031916908160001a905350600a606485040660300160f860020a0282602681518110151561523c57fe5b906020010190600160f860020a031916908160001a905350600a8085040660300160f860020a0282602781518110151561527257fe5b906020010190600160f860020a031916908160001a905350600a840660300160f860020a028260288151811015156152a657fe5b906020010190600160f860020a031916908160001a9053505050919050565b600154600160a060020a031681565b600654600160a060020a031681565b600254600160a060020a031681565b600154604080517fb6363cf2000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015284811660248301529151600093929092169163b6363cf29160448082019260209290919082900301818787803b158015610faa57600080fd5b600354600160a060020a031681565b6001546040805160e060020a639397640502815263ffffffff85166004820152905160009283928392600160a060020a039092169163939764059160248082019260209290919082900301818787803b1580156153d057600080fd5b505af11580156153e4573d6000803e3d6000fd5b505050506040513d60208110156153fa57600080fd5b50519150600082600281111561540c57fe5b141561541b5760ff9250612a81565b600182600281111561542957fe5b141561546157506301e13380635c2aad7f198401046006811015615456578060020a61040002925061545c565b61ffff92505b612a81565b60009250612a81565b600054600160a060020a0316331461548157600080fd5b61548a81615999565b50565b6000903b1190565b600154604080517fc17ad9d800000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a039092169163c17ad9d89160248082019260009290919082900301818387803b15801561550057600080fd5b505af1158015615514573d6000803e3d6000fd5b50505050811561567057600154604080517f7bc702a100000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a0390921691637bc702a19160248082019260009290919082900301818387803b15801561558957600080fd5b505af115801561559d573d6000803e3d6000fd5b5050600154604080517fddc3595000000000000000000000000000000000000000000000000000000000815263ffffffff89166004820152600160a060020a038881166024830152915191909216935063ddc359509250604480830192600092919082900301818387803b15801561561457600080fd5b505af1158015615628573d6000803e3d6000fd5b505050508363ffffffff1683600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612003565b600154604080517fddc3595000000000000000000000000000000000000000000000000000000000815263ffffffff87166004820152600160a060020a0384811660248301529151919092169163ddc3595091604480830192600092919082900301818387803b1580156156e357600080fd5b505af11580156156f7573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff89166004820152600160a060020a0388811660248301529151919092169350632c7ba5649250604480830192600092919082900301818387803b15801561575857600080fd5b505af115801561576c573d6000803e3d6000fd5b505050508363ffffffff1681600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48363ffffffff1683600160a060020a031682600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b600154604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b15801561586357600080fd5b505af1158015615877573d6000803e3d6000fd5b5050600254604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b1580156158e257600080fd5b505af11580156158f6573d6000803e3d6000fd5b5050505080600160a060020a0316631824a46b6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561593857600080fd5b505af115801561594c573d6000803e3d6000fd5b505060408051600160a060020a038516815290517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9350908190036020019150a180600160a060020a0316ff5b600160a060020a03811615156159ae57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905556000000000000000000000000001111111111111111111111111111111111111111a165627a7a72305820b87afd7c657151e426eea5cfcc143c5b743516abd4d41bb11369080f92a81e5e0029000000000000000000000000a5b6109ad2d35191b3bc32c00e4526be56fe321f000000000000000000000000223c067f8cf28ae173ee5cafea60ca44c335fecb0000000000000000000000007fecab617c868bb5996d99d95200d2fa708218e40000000000000000000000001df4ea30e0b1359c9692a161c5f30cd1a6b64ebf0000000000000000000000003e1efda147ec9309e1e47782ecafede1d04b45e5
Deployed Bytecode
0x6080604052600436106102425763ffffffff60e060020a60003504166301ffc9a7811461024757806305bbf5db1461027d57806306fdde031461029d578063073a780414610327578063081812fc14610345578063095ea7b314610379578063172a735c1461039d5780631824a46b146103b557806319fa8f50146103ca5780631e79a85b146103fc57806323b872dd1461042b57806326295b521461045557806328f833b71461047c5780632c7ba5641461049157806339d42b15146104bb57806342842e0e146104e25780634447e48c1461050c5780634a0132961461053d5780634e7e9299146105615780634f558e791461058257806351de55411461059a5780635623715b146105c65780635d978826146105e75780636352211e146105fc5780636eb582241461061457806370a0823114610637578063715018a6146106585780638866bb2c1461066d5780638da5cb5b1461069757806395d89b41146106ac5780639e6e4028146106c15780639e988d13146106d6578063a0d3253f146106fd578063a22cb46514610727578063a60e8bd61461074d578063ae32622114610774578063b88d4fde1461079c578063bac55edd1461080b578063bbe21ca514610843578063bf5772b914610861578063c1b9d98b14610885578063c6d761d4146108a3578063c87b56dd146108c1578063d40ffacb146108d9578063dcc59b6f146108ee578063e64853c414610903578063e985e9c514610918578063ed969f681461093f578063ef20bff814610954578063f2fde38b1461098e575b600080fd5b34801561025357600080fd5b50610269600160e060020a0319600435166109af565b604080519115158252519081900360200190f35b34801561028957600080fd5b5061029b60ff600435166024356109ce565b005b3480156102a957600080fd5b506102b2610b6d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ec5781810151838201526020016102d4565b50505050905090810190601f1680156103195780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561033357600080fd5b5061029b63ffffffff60043516610ba4565b34801561035157600080fd5b5061035d600435610e9d565b60408051600160a060020a039092168252519081900360200190f35b34801561038557600080fd5b5061029b600160a060020a0360043516602435610fdd565b3480156103a957600080fd5b5061029b600435610ffe565b3480156103c157600080fd5b5061029b61108f565b3480156103d657600080fd5b506103df6111ce565b60408051600160e060020a03199092168252519081900360200190f35b34801561040857600080fd5b5061029b63ffffffff60043516600160a060020a036024351660443515156111f2565b34801561043757600080fd5b5061029b600160a060020a0360043581169060243516604435612009565b34801561046157600080fd5b5061029b60ff60043516600160a060020a03602435166120c8565b34801561048857600080fd5b5061035d61222d565b34801561049d57600080fd5b5061029b63ffffffff60043516600160a060020a036024351661223f565b3480156104c757600080fd5b506104d06124e6565b60408051918252519081900360200190f35b3480156104ee57600080fd5b5061029b600160a060020a036004358116906024351660443561250a565b34801561051857600080fd5b5061029b63ffffffff6004358116906024359060443590606435166084351515612526565b34801561054957600080fd5b5061026963ffffffff60043581169060243516612812565b34801561056d57600080fd5b5061029b600160a060020a0360043516612a89565b34801561058e57600080fd5b50610269600435612bd2565b3480156105a657600080fd5b5061029b60ff60043516600160a060020a03602435166044351515612c6c565b3480156105d257600080fd5b5061029b600160a060020a0360043516612e3d565b3480156105f357600080fd5b5061035d612ee5565b34801561060857600080fd5b5061035d600435612ef4565b34801561062057600080fd5b5061029b60ff600435166024356044351515613023565b34801561064357600080fd5b506104d0600160a060020a03600435166131e1565b34801561066457600080fd5b5061029b613260565b34801561067957600080fd5b5061029b63ffffffff60043516600160a060020a03602435166132cc565b3480156106a357600080fd5b5061035d6134ff565b3480156106b857600080fd5b506102b261350e565b3480156106cd57600080fd5b50610269613545565b3480156106e257600080fd5b5061029b60ff60043516600160a060020a0360243516613566565b34801561070957600080fd5b5061029b63ffffffff60043516600160a060020a0360243516613770565b34801561073357600080fd5b5061029b600160a060020a03600435166024351515613dcc565b34801561075957600080fd5b5061029b60ff60043516600160a060020a0360243516613eb4565b34801561078057600080fd5b5061029b61ffff60043516600160a060020a0360243516614040565b3480156107a857600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261029b94600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506143429650505050505050565b34801561081757600080fd5b5061029b60246004803582810192908201359181358083019290820135916044359182019101356144ac565b34801561084f57600080fd5b5061029b63ffffffff600435166145a5565b34801561086d57600080fd5b5061029b63ffffffff60043581169060243516614882565b34801561089157600080fd5b5061029b63ffffffff60043516614b6f565b3480156108af57600080fd5b5061029b63ffffffff60043516614ef6565b3480156108cd57600080fd5b506102b2600435615012565b3480156108e557600080fd5b5061035d6152c5565b3480156108fa57600080fd5b5061035d6152d4565b34801561090f57600080fd5b5061035d6152e3565b34801561092457600080fd5b50610269600160a060020a03600435811690602435166152f2565b34801561094b57600080fd5b5061035d615365565b34801561096057600080fd5b5061097563ffffffff60043516602435615374565b6040805163ffffffff9092168252519081900360200190f35b34801561099a57600080fd5b5061029b600160a060020a036004351661546a565b600160e060020a03191660009081526004602052604090205460ff1690565b6001546040805160e060020a63b65afedd02815260ff85166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b158015610a2957600080fd5b505af1158015610a3d573d6000803e3d6000fd5b505050506040513d6020811015610a5357600080fd5b50518015610adf57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015610ab257600080fd5b505af1158015610ac6573d6000803e3d6000fd5b505050506040513d6020811015610adc57600080fd5b50515b1515610aea57600080fd5b600254604080517f9a33aff9000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a0390921691639a33aff99160248082019260009290919082900301818387803b158015610b5057600080fd5b505af1158015610b64573d6000803e3d6000fd5b50505050505050565b60408051808201909152600e81527f417a696d75746820506f696e7473000000000000000000000000000000000000602082015290565b600154604080517f439f7d3c00000000000000000000000000000000000000000000000000000000815263ffffffff841660048201529051600092600160a060020a03169163439f7d3c91602480830192602092919082900301818787803b158015610c0f57600080fd5b505af1158015610c23573d6000803e3d6000fd5b505050506040513d6020811015610c3957600080fd5b5051600154604080517f77eb4c5000000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051929350600160a060020a03909116916377eb4c50916024808201926020929091908290030181600087803b158015610caa57600080fd5b505af1158015610cbe573d6000803e3d6000fd5b505050506040513d6020811015610cd457600080fd5b50518015610d6657506001546040805160e160020a63489bff0502815263ffffffff841660048201523360248201529051600160a060020a0390921691639137fe0a916044808201926020929091908290030181600087803b158015610d3957600080fd5b505af1158015610d4d573d6000803e3d6000fd5b505050506040513d6020811015610d6357600080fd5b50515b1515610d7157600080fd5b6001546040805160e160020a63310d91f102815263ffffffff841660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b158015610dc757600080fd5b505af1158015610ddb573d6000803e3d6000fd5b505050506040513d6020811015610df157600080fd5b5051600160a060020a0316600080516020615a178339815191521415610e1657600080fd5b600154604080517fbc562b9e00000000000000000000000000000000000000000000000000000000815263ffffffff851660048201529051600160a060020a039092169163bc562b9e9160248082019260009290919082900301818387803b158015610e8157600080fd5b505af1158015610e95573d6000803e3d6000fd5b505050505050565b6000816401000000008110610eb157600080fd5b6001546040805160e060020a635e19b30502815263ffffffff861660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015610f0757600080fd5b505af1158015610f1b573d6000803e3d6000fd5b505050506040513d6020811015610f3157600080fd5b50511515610f3e57600080fd5b600154604080517f24541f7800000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a03909216916324541f78916024808201926020929091908290030181600087803b158015610faa57600080fd5b505af1158015610fbe573d6000803e3d6000fd5b505050506040513d6020811015610fd457600080fd5b50519392505050565b806401000000008110610fef57600080fd5b610ff9828461223f565b505050565b600254604080517f172a735c000000000000000000000000000000000000000000000000000000008152600481018490529051600160a060020a039092169163172a735c916024808201926020929091908290030181600087803b15801561106557600080fd5b505af1158015611079573d6000803e3d6000fd5b505050506040513d6020811015610ff957600080fd5b600354600160a060020a03163314801561112f5750600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110f757600080fd5b505af115801561110b573d6000803e3d6000fd5b505050506040513d602081101561112157600080fd5b5051600160a060020a031630145b80156111c15750600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b505050506040513d60208110156111b357600080fd5b5051600160a060020a031630145b15156111cc57600080fd5b565b7f01ffc9a70000000000000000000000000000000000000000000000000000000081565b600154604080517f728aa85700000000000000000000000000000000000000000000000000000000815263ffffffff861660048201523360248201529051600092600160a060020a03169163728aa85791604480830192602092919082900301818787803b15801561126357600080fd5b505af1158015611277573d6000803e3d6000fd5b505050506040513d602081101561128d57600080fd5b5051151561129a57600080fd5b600080516020615a17833981519152600160a060020a0384161415806113e357506001546040805160e060020a639397640502815263ffffffff871660048201529051600092600160a060020a031691639397640591602480830192602092919082900301818787803b15801561131057600080fd5b505af1158015611324573d6000803e3d6000fd5b505050506040513d602081101561133a57600080fd5b5051600281111561134757fe5b141580156113e357506001546040805160e160020a63310d91f102815263ffffffff8716600482015290516113e192600160a060020a03169163621b23e29160248083019260209291908290030181600087803b1580156113a757600080fd5b505af11580156113bb573d6000803e3d6000fd5b505050506040513d60208110156113d157600080fd5b5051600160a060020a031661548d565b155b15156113ee57600080fd5b6001546040805160e060020a635e19b30502815263ffffffff871660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561144457600080fd5b505af1158015611458573d6000803e3d6000fd5b505050506040513d602081101561146e57600080fd5b505115156114fa57600154604080517f7bc702a100000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a0390921691637bc702a19160248082019260009290919082900301818387803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b505050505b6001546040805160e060020a63caf590f902815263ffffffff87166004820152600160a060020a0386811660248301529151919092169163caf590f99160448083019260209291908290030181600087803b15801561155857600080fd5b505af115801561156c573d6000803e3d6000fd5b505050506040513d602081101561158257600080fd5b50511515611752576001546040805160e160020a63310d91f102815263ffffffff871660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b1580156115e057600080fd5b505af11580156115f4573d6000803e3d6000fd5b505050506040513d602081101561160a57600080fd5b5051600154604080517fddc3595000000000000000000000000000000000000000000000000000000000815263ffffffff88166004820152600160a060020a038781166024830152915193945091169163ddc359509160448082019260009290919082900301818387803b15801561168157600080fd5b505af1158015611695573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632c7ba56493506044808201939182900301818387803b1580156116f257600080fd5b505af1158015611706573d6000803e3d6000fd5b505050508363ffffffff1683600160a060020a031682600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b600080516020615a17833981519152600160a060020a0384161415611b1957600154604080517ff9b87d4000000000000000000000000000000000000000000000000000000000815263ffffffff8716600482015260006024820181905260448201819052606482018190529151600160a060020a039093169263f9b87d409260848084019391929182900301818387803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050600154604080517f8866bb2c00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a039093169450638866bb2c93506044808201939182900301818387803b15801561187757600080fd5b505af115801561188b573d6000803e3d6000fd5b5050600154604080517fa297c1d800000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a03909316945063a297c1d893506044808201939182900301818387803b1580156118fe57600080fd5b505af1158015611912573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632c7ba56493506044808201939182900301818387803b15801561196f57600080fd5b505af1158015611983573d6000803e3d6000fd5b5050600154604080517f2a19642c00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632a19642c93506044808201939182900301818387803b1580156119f657600080fd5b505af1158015611a0a573d6000803e3d6000fd5b5050600654604080517feaae46e500000000000000000000000000000000000000000000000000000000815263ffffffff891660048201529051600160a060020a03909216935063eaae46e5925060248082019260009290919082900301818387803b158015611a7957600080fd5b505af1158015611a8d573d6000803e3d6000fd5b5050600154604080517fc6d761d400000000000000000000000000000000000000000000000000000000815263ffffffff891660048201529051600160a060020a03909216935063c6d761d4925060248082019260009290919082900301818387803b158015611afc57600080fd5b505af1158015611b10573d6000803e3d6000fd5b50505050612003565b8115612003576001546040805160e060020a636d09887b02815263ffffffff871660048201529051600160a060020a0390921691636d09887b916024808201926020929091908290030181600087803b158015611b7557600080fd5b505af1158015611b89573d6000803e3d6000fd5b505050506040513d6020811015611b9f57600080fd5b505115611cbf57600154604080517ff491491900000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a039092169163f49149199160248082019260009290919082900301818387803b158015611c1157600080fd5b505af1158015611c25573d6000803e3d6000fd5b5050600154604080517ff9b87d4000000000000000000000000000000000000000000000000000000000815263ffffffff8916600482015260006024820181905260448201819052606482018190529151600160a060020a03909316945063f9b87d4093506084808201939182900301818387803b158015611ca657600080fd5b505af1158015611cba573d6000803e3d6000fd5b505050505b600154604080517f8866bb2c00000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526000602482018190529151600160a060020a0390931692638866bb2c9260448084019391929182900301818387803b158015611d3057600080fd5b505af1158015611d44573d6000803e3d6000fd5b5050600154604080517fa297c1d800000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a03909316945063a297c1d893506044808201939182900301818387803b158015611db757600080fd5b505af1158015611dcb573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632c7ba56493506044808201939182900301818387803b158015611e2857600080fd5b505af1158015611e3c573d6000803e3d6000fd5b5050600154604080517ff4e3be2d00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201529051600160a060020a03909216935063f4e3be2d92506024808201926020929091908290030181600087803b158015611eac57600080fd5b505af1158015611ec0573d6000803e3d6000fd5b505050506040513d6020811015611ed657600080fd5b5051600160a060020a0316600080516020615a1783398151915214611f7f57600154604080517f2a19642c00000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526000602482018190529151600160a060020a0390931692632a19642c9260448084019391929182900301818387803b158015611f6657600080fd5b505af1158015611f7a573d6000803e3d6000fd5b505050505b600654604080517feaae46e500000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a039092169163eaae46e59160248082019260009290919082900301818387803b158015611fea57600080fd5b505af1158015611ffe573d6000803e3d6000fd5b505050505b50505050565b600081640100000000811061201d57600080fd5b6001546040805160e060020a63caf590f902815263ffffffff86166004820152600160a060020a0388811660248301529151869550919092169163caf590f99160448083019260209291908290030181600087803b15801561207e57600080fd5b505af1158015612092573d6000803e3d6000fd5b505050506040513d60208110156120a857600080fd5b505115156120b557600080fd5b6120c1828560016111f2565b5050505050565b600054600160a060020a031633146120df57600080fd5b6001546040805160e060020a63caf590f902815260ff851660048201526000602482018190529151600160a060020a039093169263caf590f992604480840193602093929083900390910190829087803b15801561213c57600080fd5b505af1158015612150573d6000803e3d6000fd5b505050506040513d602081101561216657600080fd5b5051801561217c5750600160a060020a03811615155b151561218757600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a031663246d41a96040518163ffffffff1660e060020a028152600401600060405180830381600087803b1580156121da57600080fd5b505af11580156121ee573d6000803e3d6000fd5b50505050600160a060020a038116331415612219576122148260ff168260016000615495565b612229565b6122298260ff1682600033615495565b5050565b600080516020615a1783398151915281565b6001546040805160e160020a63310d91f102815263ffffffff8516600482015290516000928592600160a060020a039091169163621b23e29160248082019260209290919082900301818887803b15801561229957600080fd5b505af11580156122ad573d6000803e3d6000fd5b505050506040513d60208110156122c357600080fd5b5051600160a060020a0316600080516020615a1783398151915214156122e857600080fd5b6001546040805160e160020a63310d91f102815263ffffffff871660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b15801561233e57600080fd5b505af1158015612352573d6000803e3d6000fd5b505050506040513d602081101561236857600080fd5b50519150600160a060020a0382163314806124195750600154604080517fb6363cf2000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301523360248301529151919092169163b6363cf29160448083019260209291908290030181600087803b1580156123ec57600080fd5b505af1158015612400573d6000803e3d6000fd5b505050506040513d602081101561241657600080fd5b50515b151561242457600080fd5b6001546040805160e260020a630b1ee95902815263ffffffff87166004820152600160a060020a03868116602483015291519190921691632c7ba56491604480830192600092919082900301818387803b15801561248157600080fd5b505af1158015612495573d6000803e3d6000fd5b505050508363ffffffff1683600160a060020a031683600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b7f26f3eae628fa1a4d23e34b91a4d412526a47620ced37c80928906f9fa07c077481565b610ff98383836020604051908101604052806000815250614342565b6001546040805160e160020a63489bff0502815263ffffffff8816600482015233602482015290518792600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b15801561258157600080fd5b505af1158015612595573d6000803e3d6000fd5b505050506040513d60208110156125ab57600080fd5b5051801561263757506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561260a57600080fd5b505af115801561261e573d6000803e3d6000fd5b505050506040513d602081101561263457600080fd5b50515b151561264257600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8916600482015290518892600160a060020a03169163621b23e29160248083019260209291908290030181600087803b15801561269757600080fd5b505af11580156126ab573d6000803e3d6000fd5b505050506040513d60208110156126c157600080fd5b5051600160a060020a0316600080516020615a1783398151915214156126e657600080fd5b821561277057600154604080517ff491491900000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201529051600160a060020a039092169163f49149199160248082019260009290919082900301818387803b15801561275757600080fd5b505af115801561276b573d6000803e3d6000fd5b505050505b600154604080517ff9b87d4000000000000000000000000000000000000000000000000000000000815263ffffffff808b166004830152602482018a905260448201899052871660648201529051600160a060020a039092169163f9b87d409160848082019260009290919082900301818387803b1580156127f157600080fd5b505af1158015612805573d6000803e3d6000fd5b5050505050505050505050565b6001546040805160e060020a636d09887b02815263ffffffff84166004820152905160009283928392600160a060020a0390921691636d09887b9160248082019260209290919082900301818787803b15801561286e57600080fd5b505af1158015612882573d6000803e3d6000fd5b505050506040513d602081101561289857600080fd5b505115156128a95760009250612a81565b6001546040805160e060020a639397640502815263ffffffff881660048201529051600160a060020a03909216916393976405916024808201926020929091908290030181600087803b1580156128ff57600080fd5b505af1158015612913573d6000803e3d6000fd5b505050506040513d602081101561292957600080fd5b50516001546040805160e060020a639397640502815263ffffffff881660048201529051929450600160a060020a03909116916393976405916024808201926020929091908290030181600087803b15801561298457600080fd5b505af1158015612998573d6000803e3d6000fd5b505050506040513d60208110156129ae57600080fd5b505190508160028111156129be57fe5b60ff168160028111156129cd57fe5b60010160ff161480612a7e57508160028111156129e657fe5b8160028111156129f257fe5b148015612a7e57506001546040805160e060020a636d09887b02815263ffffffff881660048201529051600160a060020a0390921691636d09887b916024808201926020929091908290030181600087803b158015612a5057600080fd5b505af1158015612a64573d6000803e3d6000fd5b505050506040513d6020811015612a7a57600080fd5b5051155b92505b505092915050565b60055474010000000000000000000000000000000000000000900460ff1615612ab157600080fd5b604080516c01000000000000000000000000600160a060020a03841602815290519081900360140190207f26f3eae628fa1a4d23e34b91a4d412526a47620ced37c80928906f9fa07c077414612b0657600080fd5b600554604080517f3659cfe6000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291519190921691633659cfe69160248083019260209291908290030181600087803b158015612b6e57600080fd5b505af1158015612b82573d6000803e3d6000fd5b505050506040513d6020811015612b9857600080fd5b50506005805474ff000000000000000000000000000000000000000019167401000000000000000000000000000000000000000017905550565b600064010000000082108015612c6657506001546040805160e060020a635e19b30502815263ffffffff851660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015612c3957600080fd5b505af1158015612c4d573d6000803e3d6000fd5b505050506040513d6020811015612c6357600080fd5b50515b92915050565b6001546040805160e060020a63b65afedd02815260ff8616600482018190523360248301529151600093600160a060020a03169163b65afedd91604480830192602092919082900301818887803b158015612cc657600080fd5b505af1158015612cda573d6000803e3d6000fd5b505050506040513d6020811015612cf057600080fd5b50518015612d7c57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015612d4f57600080fd5b505af1158015612d63573d6000803e3d6000fd5b505050506040513d6020811015612d7957600080fd5b50515b1515612d8757600080fd5b600254604080517f51de554100000000000000000000000000000000000000000000000000000000815260ff88166004820152600160a060020a0387811660248301528615156044830152915191909216916351de55419160648083019260209291908290030181600087803b158015612e0057600080fd5b505af1158015612e14573d6000803e3d6000fd5b505050506040513d6020811015612e2a57600080fd5b5051915081156120c1576120c1846157fc565b600254604080517f5623715b000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000939290921691635623715b9160248082019260209290919082900301818787803b158015612ea857600080fd5b505af1158015612ebc573d6000803e3d6000fd5b505050506040513d6020811015612ed257600080fd5b50519050801561222957612229826157fc565b600554600160a060020a031681565b600080826401000000008110612f0957600080fd5b6001546040805160e060020a635e19b30502815263ffffffff871660048201529051869450600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015612f6257600080fd5b505af1158015612f76573d6000803e3d6000fd5b505050506040513d6020811015612f8c57600080fd5b50511515612f9957600080fd5b6001546040805160e160020a63310d91f102815263ffffffff851660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b158015612fef57600080fd5b505af1158015613003573d6000803e3d6000fd5b505050506040513d602081101561301957600080fd5b5051949350505050565b6001546040805160e060020a63b65afedd02815260ff86166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b15801561307e57600080fd5b505af1158015613092573d6000803e3d6000fd5b505050506040513d60208110156130a857600080fd5b5051801561313457506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561310757600080fd5b505af115801561311b573d6000803e3d6000fd5b505050506040513d602081101561313157600080fd5b50515b151561313f57600080fd5b600254604080517f6eb5822400000000000000000000000000000000000000000000000000000000815260ff871660048201526024810186905284151560448201529051600160a060020a0390921691636eb58224916064808201926020929091908290030181600087803b1580156131b757600080fd5b505af11580156131cb573d6000803e3d6000fd5b505050506040513d6020811015610e9557600080fd5b6000600160a060020a03821615156131f857600080fd5b600154604080517f12afbc78000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152915191909216916312afbc789160248083019260209291908290030181600087803b158015612c3957600080fd5b600054600160a060020a0316331461327757600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b6001546040805160e160020a63489bff0502815263ffffffff8516600482015233602482015290518492600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b15801561332757600080fd5b505af115801561333b573d6000803e3d6000fd5b505050506040513d602081101561335157600080fd5b505180156133dd57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b1580156133b057600080fd5b505af11580156133c4573d6000803e3d6000fd5b505050506040513d60208110156133da57600080fd5b50515b15156133e857600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8616600482015290518592600160a060020a03169163621b23e29160248083019260209291908290030181600087803b15801561343d57600080fd5b505af1158015613451573d6000803e3d6000fd5b505050506040513d602081101561346757600080fd5b5051600160a060020a0316600080516020615a17833981519152141561348c57600080fd5b600154604080517f8866bb2c00000000000000000000000000000000000000000000000000000000815263ffffffff87166004820152600160a060020a03868116602483015291519190921691638866bb2c91604480830192600092919082900301818387803b158015611fea57600080fd5b600054600160a060020a031681565b60408051808201909152600381527f415a500000000000000000000000000000000000000000000000000000000000602082015290565b60055474010000000000000000000000000000000000000000900460ff1681565b6001546040805160e060020a63b65afedd02815260ff85166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b1580156135c157600080fd5b505af11580156135d5573d6000803e3d6000fd5b505050506040513d60208110156135eb57600080fd5b5051801561367757506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561364a57600080fd5b505af115801561365e573d6000803e3d6000fd5b505050506040513d602081101561367457600080fd5b50515b151561368257600080fd5b30600160a060020a031682600160a060020a031663ed969f686040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156136ca57600080fd5b505af11580156136de573d6000803e3d6000fd5b505050506040513d60208110156136f457600080fd5b5051600160a060020a03161461370957600080fd5b600254604080517fe31f3e0c000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301529151919092169163e31f3e0c91602480830192600092919082900301818387803b158015610b5057600080fd5b6001546040805160e060020a63caf590f902815263ffffffff8516600482015260006024820181905291519192600160a060020a03169163caf590f99160448082019260209290919082900301818787803b1580156137ce57600080fd5b505af11580156137e2573d6000803e3d6000fd5b505050506040513d60208110156137f857600080fd5b5051151561380557600080fd5b600154604080517fe4a358d700000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a039092169163e4a358d7916024808201926020929091908290030181600087803b15801561387157600080fd5b505af1158015613885573d6000803e3d6000fd5b505050506040513d602081101561389b57600080fd5b50516001546040805160e160020a63310d91f102815261ffff841660048201529051929350600160a060020a039091169163621b23e2916024808201926020929091908290030181600087803b1580156138f457600080fd5b505af1158015613908573d6000803e3d6000fd5b505050506040513d602081101561391e57600080fd5b5051600160a060020a0316600080516020615a17833981519152141561394357600080fd5b600154604080517ff4e3be2d00000000000000000000000000000000000000000000000000000000815261ffff841660048201529051600160a060020a039092169163f4e3be2d916024808201926020929091908290030181600087803b1580156139ad57600080fd5b505af11580156139c1573d6000803e3d6000fd5b505050506040513d60208110156139d757600080fd5b5051600160a060020a0316600080516020615a1783398151915214156139fc57600080fd5b6001546040805160e060020a639397640502815263ffffffff861660048201529051600160a060020a03909216916393976405916024808201926020929091908290030181600087803b158015613a5257600080fd5b505af1158015613a66573d6000803e3d6000fd5b505050506040513d6020811015613a7c57600080fd5b50516002811115613a8957fe5b6001546040805160e060020a639397640502815261ffff85166004820152905160ff9390931692600160a060020a03909216916393976405916024808201926020929091908290030181600087803b158015613ae457600080fd5b505af1158015613af8573d6000803e3d6000fd5b505050506040513d6020811015613b0e57600080fd5b50516002811115613b1b57fe5b60010160ff16141515613b2d57600080fd5b6001546040805160e060020a636d09887b02815261ffff841660048201529051600160a060020a0390921691636d09887b916024808201926020929091908290030181600087803b158015613b8157600080fd5b505af1158015613b95573d6000803e3d6000fd5b505050506040513d6020811015613bab57600080fd5b50518015613c6a5750613bc28161ffff1642615374565b600154604080517f293a916900000000000000000000000000000000000000000000000000000000815261ffff85166004820152905163ffffffff9390931692600160a060020a039092169163293a9169916024808201926020929091908290030181600087803b158015613c3657600080fd5b505af1158015613c4a573d6000803e3d6000fd5b505050506040513d6020811015613c6057600080fd5b505163ffffffff16105b1515613c7557600080fd5b600154604080517f8a27bf5900000000000000000000000000000000000000000000000000000000815261ffff841660048201523360248201529051600160a060020a0390921691638a27bf59916044808201926020929091908290030181600087803b158015613ce557600080fd5b505af1158015613cf9573d6000803e3d6000fd5b505050506040513d6020811015613d0f57600080fd5b50511515613d1c57600080fd5b33600160a060020a0383161415613d4057613d3b838360016000615495565b610ff9565b6001546040805160e160020a63310d91f102815261ffff841660048201529051610ff99286928692600092600160a060020a03169163621b23e291602480830192602092919082900301818787803b158015613d9b57600080fd5b505af1158015613daf573d6000803e3d6000fd5b505050506040513d6020811015613dc557600080fd5b5051615495565b600160a060020a0382161515613de157600080fd5b600154604080517fbc735d90000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a03858116602483015284151560448301529151919092169163bc735d9091606480830192600092919082900301818387803b158015613e5657600080fd5b505af1158015613e6a573d6000803e3d6000fd5b50506040805184151581529051600160a060020a03861693503392507f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6001546040805160e060020a63b65afedd02815260ff85166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b158015613f0f57600080fd5b505af1158015613f23573d6000803e3d6000fd5b505050506040513d6020811015613f3957600080fd5b50518015613fc557506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015613f9857600080fd5b505af1158015613fac573d6000803e3d6000fd5b505050506040513d6020811015613fc257600080fd5b50515b1515613fd057600080fd5b600154604080517fa297c1d800000000000000000000000000000000000000000000000000000000815260ff86166004820152600160a060020a0385811660248301529151919092169163a297c1d891604480830192600092919082900301818387803b158015610b5057600080fd5b600154604080517f8a27bf5900000000000000000000000000000000000000000000000000000000815261ffff85166004820181905233602483015291519192600160a060020a031691638a27bf59916044808201926020929091908290030181600087803b1580156140b257600080fd5b505af11580156140c6573d6000803e3d6000fd5b505050506040513d60208110156140dc57600080fd5b5051801561416857506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561413b57600080fd5b505af115801561414f573d6000803e3d6000fd5b505050506040513d602081101561416557600080fd5b50515b151561417357600080fd5b6001546040805160e160020a63310d91f102815261ffff86166004820181905291519192600160a060020a03169163621b23e2916024808201926020929091908290030181600087803b1580156141c957600080fd5b505af11580156141dd573d6000803e3d6000fd5b505050506040513d60208110156141f357600080fd5b5051600160a060020a0316600080516020615a17833981519152141561421857600080fd5b600154604080517ff4e3be2d00000000000000000000000000000000000000000000000000000000815261ffff871660048201529051600160a060020a039092169163f4e3be2d916024808201926020929091908290030181600087803b15801561428257600080fd5b505af1158015614296573d6000803e3d6000fd5b505050506040513d60208110156142ac57600080fd5b5051600160a060020a0316600080516020615a1783398151915214156142d157600080fd5b600154604080517f2a19642c00000000000000000000000000000000000000000000000000000000815261ffff87166004820152600160a060020a03868116602483015291519190921691632a19642c91604480830192600092919082900301818387803b158015611fea57600080fd5b600061434f858585612009565b61436184600160a060020a031661548d565b156120c1576040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a038881166024850152604484018790526080606485019081528651608486015286519189169463150b7a0294938b938a938a93909160a490910190602085019080838360005b838110156143f95781810151838201526020016143e1565b50505050905090810190601f1680156144265780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561444857600080fd5b505af115801561445c573d6000803e3d6000fd5b505050506040513d602081101561447257600080fd5b50519050600160e060020a031981167f150b7a0200000000000000000000000000000000000000000000000000000000146120c157600080fd5b600054600160a060020a031633146144c357600080fd5b6001546040517fbac55edd00000000000000000000000000000000000000000000000000000000815260606004820190815260648201889052600160a060020a039092169163bac55edd918991899189918991899189918190602481019060448101906084018a8a80828437909101858103845288815260200190508888808284379091018581038352868152602001905086868082843782019150509950505050505050505050600060405180830381600087803b15801561458557600080fd5b505af1158015614599573d6000803e3d6000fd5b50505050505050505050565b600154604080517ff5af662100000000000000000000000000000000000000000000000000000000815263ffffffff841660048201529051600092600160a060020a03169163f5af662191602480830192602092919082900301818787803b15801561461057600080fd5b505af1158015614624573d6000803e3d6000fd5b505050506040513d602081101561463a57600080fd5b5051600154604080517f9b350e1200000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051929350600160a060020a0390911691639b350e12916024808201926020929091908290030181600087803b1580156146ab57600080fd5b505af11580156146bf573d6000803e3d6000fd5b505050506040513d60208110156146d557600080fd5b5051801561476757506001546040805160e160020a63489bff0502815263ffffffff841660048201523360248201529051600160a060020a0390921691639137fe0a916044808201926020929091908290030181600087803b15801561473a57600080fd5b505af115801561474e573d6000803e3d6000fd5b505050506040513d602081101561476457600080fd5b50515b151561477257600080fd5b6001546040805160e160020a63310d91f102815263ffffffff841660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b1580156147c857600080fd5b505af11580156147dc573d6000803e3d6000fd5b505050506040513d60208110156147f257600080fd5b5051600160a060020a0316600080516020615a17833981519152141561481757600080fd5b600154604080517fc6d761d400000000000000000000000000000000000000000000000000000000815263ffffffff851660048201529051600160a060020a039092169163c6d761d49160248082019260009290919082900301818387803b158015610e8157600080fd5b6001546040805160e160020a63489bff0502815263ffffffff8516600482015233602482015290518492600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b1580156148dd57600080fd5b505af11580156148f1573d6000803e3d6000fd5b505050506040513d602081101561490757600080fd5b5051801561499357506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561496657600080fd5b505af115801561497a573d6000803e3d6000fd5b505050506040513d602081101561499057600080fd5b50515b151561499e57600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8616600482015290518592600160a060020a03169163621b23e29160248083019260209291908290030181600087803b1580156149f357600080fd5b505af1158015614a07573d6000803e3d6000fd5b505050506040513d6020811015614a1d57600080fd5b5051600160a060020a0316600080516020615a178339815191521415614a4257600080fd5b6001546040805160e160020a63310d91f102815263ffffffff861660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b158015614a9857600080fd5b505af1158015614aac573d6000803e3d6000fd5b505050506040513d6020811015614ac257600080fd5b5051600160a060020a0316600080516020615a178339815191521415614ae757600080fd5b614af18484612812565b1515614afc57600080fd5b600154604080517fa634585900000000000000000000000000000000000000000000000000000000815263ffffffff8088166004830152861660248201529051600160a060020a039092169163a63458599160448082019260009290919082900301818387803b158015611fea57600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8416600482015290516000928492600160a060020a039091169163621b23e29160248082019260209290919082900301818887803b158015614bc957600080fd5b505af1158015614bdd573d6000803e3d6000fd5b505050506040513d6020811015614bf357600080fd5b5051600160a060020a0316600080516020615a178339815191521415614c1857600080fd5b600154604080517ff5af662100000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a039092169163f5af6621916024808201926020929091908290030181600087803b158015614c8457600080fd5b505af1158015614c98573d6000803e3d6000fd5b505050506040513d6020811015614cae57600080fd5b5051600154604080517f9b350e1200000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051929450600160a060020a0390911691639b350e12916024808201926020929091908290030181600087803b158015614d1f57600080fd5b505af1158015614d33573d6000803e3d6000fd5b505050506040513d6020811015614d4957600080fd5b50518015614ddb57506001546040805160e160020a63489bff0502815263ffffffff851660048201523360248201529051600160a060020a0390921691639137fe0a916044808201926020929091908290030181600087803b158015614dae57600080fd5b505af1158015614dc2573d6000803e3d6000fd5b505050506040513d6020811015614dd857600080fd5b50515b1515614de657600080fd5b6001546040805160e160020a63310d91f102815263ffffffff851660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b158015614e3c57600080fd5b505af1158015614e50573d6000803e3d6000fd5b505050506040513d6020811015614e6657600080fd5b5051600160a060020a0316600080516020615a178339815191521415614e8b57600080fd5b600154604080517f1306318000000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a039092169163130631809160248082019260009290919082900301818387803b158015610b5057600080fd5b6001546040805160e160020a63489bff0502815263ffffffff8416600482015233602482015290518392600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b158015614f5157600080fd5b505af1158015614f65573d6000803e3d6000fd5b505050506040513d6020811015614f7b57600080fd5b5051801561500757506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015614fda57600080fd5b505af1158015614fee573d6000803e3d6000fd5b505050506040513d602081101561500457600080fd5b50515b151561481757600080fd5b60608082640100000000811061502757600080fd5b60408051606081018252602e81527f68747470733a2f2f617a696d7574682e6e6574776f726b2f6572633732312f3060208201527f3030303030303030302e6a736f6e0000000000000000000000000000000000009181019190915292508291507fff00000000000000000000000000000000000000000000000000000000000000600a633b9aca0086040660300160f860020a0216600081901a603f84015350600a6305f5e10085040660300160f860020a028260208151811015156150ea57fe5b906020010190600160f860020a031916908160001a905350600a6298968085040660300160f860020a0282602181518110151561512357fe5b906020010190600160f860020a031916908160001a905350600a620f424085040660300160f860020a0282602281518110151561515c57fe5b906020010190600160f860020a031916908160001a905350600a620186a085040660300160f860020a0282602381518110151561519557fe5b906020010190600160f860020a031916908160001a905350600a61271085040660300160f860020a028260248151811015156151cd57fe5b906020010190600160f860020a031916908160001a905350600a6103e885040660300160f860020a0282602581518110151561520557fe5b906020010190600160f860020a031916908160001a905350600a606485040660300160f860020a0282602681518110151561523c57fe5b906020010190600160f860020a031916908160001a905350600a8085040660300160f860020a0282602781518110151561527257fe5b906020010190600160f860020a031916908160001a905350600a840660300160f860020a028260288151811015156152a657fe5b906020010190600160f860020a031916908160001a9053505050919050565b600154600160a060020a031681565b600654600160a060020a031681565b600254600160a060020a031681565b600154604080517fb6363cf2000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015284811660248301529151600093929092169163b6363cf29160448082019260209290919082900301818787803b158015610faa57600080fd5b600354600160a060020a031681565b6001546040805160e060020a639397640502815263ffffffff85166004820152905160009283928392600160a060020a039092169163939764059160248082019260209290919082900301818787803b1580156153d057600080fd5b505af11580156153e4573d6000803e3d6000fd5b505050506040513d60208110156153fa57600080fd5b50519150600082600281111561540c57fe5b141561541b5760ff9250612a81565b600182600281111561542957fe5b141561546157506301e13380635c2aad7f198401046006811015615456578060020a61040002925061545c565b61ffff92505b612a81565b60009250612a81565b600054600160a060020a0316331461548157600080fd5b61548a81615999565b50565b6000903b1190565b600154604080517fc17ad9d800000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a039092169163c17ad9d89160248082019260009290919082900301818387803b15801561550057600080fd5b505af1158015615514573d6000803e3d6000fd5b50505050811561567057600154604080517f7bc702a100000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a0390921691637bc702a19160248082019260009290919082900301818387803b15801561558957600080fd5b505af115801561559d573d6000803e3d6000fd5b5050600154604080517fddc3595000000000000000000000000000000000000000000000000000000000815263ffffffff89166004820152600160a060020a038881166024830152915191909216935063ddc359509250604480830192600092919082900301818387803b15801561561457600080fd5b505af1158015615628573d6000803e3d6000fd5b505050508363ffffffff1683600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612003565b600154604080517fddc3595000000000000000000000000000000000000000000000000000000000815263ffffffff87166004820152600160a060020a0384811660248301529151919092169163ddc3595091604480830192600092919082900301818387803b1580156156e357600080fd5b505af11580156156f7573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff89166004820152600160a060020a0388811660248301529151919092169350632c7ba5649250604480830192600092919082900301818387803b15801561575857600080fd5b505af115801561576c573d6000803e3d6000fd5b505050508363ffffffff1681600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48363ffffffff1683600160a060020a031682600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b600154604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b15801561586357600080fd5b505af1158015615877573d6000803e3d6000fd5b5050600254604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b1580156158e257600080fd5b505af11580156158f6573d6000803e3d6000fd5b5050505080600160a060020a0316631824a46b6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561593857600080fd5b505af115801561594c573d6000803e3d6000fd5b505060408051600160a060020a038516815290517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9350908190036020019150a180600160a060020a0316ff5b600160a060020a03811615156159ae57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905556000000000000000000000000001111111111111111111111111111111111111111a165627a7a72305820b87afd7c657151e426eea5cfcc143c5b743516abd4d41bb11369080f92a81e5e0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a5b6109ad2d35191b3bc32c00e4526be56fe321f000000000000000000000000223c067f8cf28ae173ee5cafea60ca44c335fecb0000000000000000000000007fecab617c868bb5996d99d95200d2fa708218e40000000000000000000000001df4ea30e0b1359c9692a161c5f30cd1a6b64ebf0000000000000000000000003e1efda147ec9309e1e47782ecafede1d04b45e5
-----Decoded View---------------
Arg [0] : _previous (address): 0xa5b6109AD2D35191b3BC32C00e4526bE56Fe321F
Arg [1] : _azimuth (address): 0x223c067F8CF28ae173EE5CafEa60cA44C335fecB
Arg [2] : _polls (address): 0x7fEcaB617c868Bb5996d99D95200D2Fa708218e4
Arg [3] : _claims (address): 0x1Df4eA30e0b1359C9692a161c5F30CD1a6b64ebf
Arg [4] : _treasuryProxy (address): 0x3E1efDa147EC9309e1e47782EcaFeDe1d04b45E5
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5b6109ad2d35191b3bc32c00e4526be56fe321f
Arg [1] : 000000000000000000000000223c067f8cf28ae173ee5cafea60ca44c335fecb
Arg [2] : 0000000000000000000000007fecab617c868bb5996d99d95200d2fa708218e4
Arg [3] : 0000000000000000000000001df4ea30e0b1359c9692a161c5f30cd1a6b64ebf
Arg [4] : 0000000000000000000000003e1efda147ec9309e1e47782ecafede1d04b45e5
Deployed Bytecode Sourcemap
81805:32198:0:-;;;;;;;;;-1:-1:-1;;;81805:32198:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6419:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6419:148:0;-1:-1:-1;;;;;;6419:148:0;;;;;;;;;;;;;;;;;;;;;;;109525:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;109525:166:0;;;;;;;;;;;89010:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;89010:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;89010:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102732:388;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;102732:388:0;;;;;;;88228:352;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;88228:352:0;;;;;;;;;-1:-1:-1;;;;;88228:352:0;;;;;;;;;;;;;;87541:165;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;87541:165:0;-1:-1:-1;;;;;87541:165:0;;;;;;;111763:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;111763:120:0;;;;;78544:292;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78544:292:0;;;;5850:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5850:54:0;;;;;;;;-1:-1:-1;;;;;;5850:54:0;;;;;;;;;;;;;;96426:3505;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;96426:3505:0;;;;;-1:-1:-1;;;;;96426:3505:0;;;;;;;;;87070:359;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;87070:359:0;-1:-1:-1;;;;;87070:359:0;;;;;;;;;;;;112512:895;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;112512:895:0;;;;;-1:-1:-1;;;;;112512:895:0;;;;;83517:88;;8:9:-1;5:2;;;30:1;27;20:12;5:2;83517:88:0;;;;107980:601;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;107980:601:0;;;;;-1:-1:-1;;;;;107980:601:0;;;;;83854:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;83854:115:0;;;;;;;;;;;;;;;;;;;;85975:196;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;85975:196:0;-1:-1:-1;;;;;85975:196:0;;;;;;;;;;;;90601:589;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;90601:589:0;;;;;;;;;;;;;;;;;;;;;;104341:1958;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;104341:1958:0;;;;;;;;;;;;112089:244;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;112089:244:0;-1:-1:-1;;;;;112089:244:0;;;;;85685:203;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;85685:203:0;;;;;110022:557;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;110022:557:0;;;;;-1:-1:-1;;;;;110022:557:0;;;;;;;;;111090:420;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;111090:420:0;-1:-1:-1;;;;;111090:420:0;;;;;83612:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;83612:35:0;;;;85236:373;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;85236:373:0;;;;;110746:192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;110746:192:0;;;;;;;;;;;;;84972:188;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;84972:188:0;-1:-1:-1;;;;;84972:188:0;;;;;1314:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1314:114:0;;;;106632:197;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;106632:197:0;;;;;-1:-1:-1;;;;;106632:197:0;;;;;519:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;519:20:0;;;;89197:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;89197:104:0;;;;83976:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;83976:36:0;;;;108996:320;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;108996:320:0;;;;;-1:-1:-1;;;;;108996:320:0;;;;;91798:2140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;91798:2140:0;;;;;-1:-1:-1;;;;;91798:2140:0;;;;;87897:247;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;87897:247:0;-1:-1:-1;;;;;87897:247:0;;;;;;;;;107571:165;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;107571:165:0;;;;;-1:-1:-1;;;;;107571:165:0;;;;;107111:267;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;107111:267:0;;;;;-1:-1:-1;;;;;107111:267:0;;;;;86326:598;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;86326:598:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;86326:598:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;86326:598:0;;-1:-1:-1;86326:598:0;;-1:-1:-1;;;;;;;86326:598:0;113415:186;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;113415:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101770:399;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;101770:399:0;;;;;;;100287:368;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;100287:368:0;;;;;;;;;;;;101092:453;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;101092:453:0;;;;;;;100739:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;100739:137:0;;;;;;;89385:888;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;89385:888:0;;;;;55654:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55654:22:0;;;;84092:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;84092:20:0;;;;77800:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77800:18:0;;;;88706:182;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;88706:182:0;-1:-1:-1;;;;;88706:182:0;;;;;;;;;;78037:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78037:31:0;;;;103299:955;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;103299:955:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1596:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1596:105:0;-1:-1:-1;;;;;1596:105:0;;;;;6419:148;-1:-1:-1;;;;;;6528:33:0;6505:4;6528:33;;;:19;:33;;;;;;;;;6419:148::o;109525:166::-;56917:7;;:37;;;-1:-1:-1;;;;;56917:37:0;;56857:155;;;56917:37;;;;;;56943:10;56917:37;;;;;;56857:155;;-1:-1:-1;;;;;56917:7:0;;:17;;:37;;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56917:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56917:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56917:37:0;:79;;;;-1:-1:-1;56972:7:0;;:24;;;-1:-1:-1;;;;;56972:24:0;;;;;;;;;;;-1:-1:-1;;;;;56972:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56972:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56972:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56972:24:0;56917:79;56908:90;;;;;;;;109649:5;;:34;;;;;;;;;;;;;;-1:-1:-1;;;;;109649:5:0;;;;:23;;:34;;;;;:5;;:34;;;;;;;;:5;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;109649:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;109649:34:0;;;;109525:166;;;:::o;89010:113::-;89092:23;;;;;;;;;;;;;;;;;89010:113;:::o;102732:388::-;102810:7;;:26;;;;;;;;;;;;;;;102793:14;;-1:-1:-1;;;;;102810:7:0;;:18;;:26;;;;;;;;;;;;;;102793:14;102810:7;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;102810:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;102810:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;102810:26:0;102854:7;;:26;;;;;;;;;;;;;;;102810;;-1:-1:-1;;;;;;102854:7:0;;;;:18;;:26;;;;;102810;;102854;;;;;;;;:7;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;102854:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;102854:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;102854:26:0;:84;;;;-1:-1:-1;102900:7:0;;:38;;;-1:-1:-1;;;;;102900:38:0;;;;;;;;;102927:10;102900:38;;;;;;-1:-1:-1;;;;;102900:7:0;;;;:17;;:38;;;;;;;;;;;;;;;:7;;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;102900:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;102900:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;102900:38:0;102854:84;102845:95;;;;;;;;102976:7;;:25;;;-1:-1:-1;;;;;102976:25:0;;;;;;;;;;;-1:-1:-1;;;;;102976:7:0;;;;:16;;:25;;;;;;;;;;;;;;;:7;;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;102976:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;102976:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;102976:25:0;-1:-1:-1;;;;;102958:43:0;-1:-1:-1;;;;;;;;;;;102958:43:0;;102949:54;;;;;;103085:7;;:27;;;;;;;;;;;;;;;-1:-1:-1;;;;;103085:7:0;;;;:19;;:27;;;;;:7;;:27;;;;;;;;:7;;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;103085:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;103085:27:0;;;;102732:388;;:::o;88228:352::-;88339:16;88313:8;113797:11;113791:17;;113783:26;;;;;;88479:7;;:34;;;-1:-1:-1;;;;;88479:34:0;;;;;;;;;;;-1:-1:-1;;;;;88479:7:0;;;;:16;;:34;;;;;;;;;;;;;;;:7;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;88479:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;88479:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;88479:34:0;88471:43;;;;;;;;88530:7;;:42;;;;;;;;;;;;;;;-1:-1:-1;;;;;88530:7:0;;;;:24;;:42;;;;;;;;;;;;;;;:7;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;88530:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;88530:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;88530:42:0;;88228:352;-1:-1:-1;;;88228:352:0:o;87541:165::-;87629:8;113797:11;113791:17;;113783:26;;;;;;87653:45;87677:8;87688:9;87653:16;:45::i;:::-;87541:165;;;:::o;111763:120::-;111840:5;;:35;;;;;;;;;;;;;;-1:-1:-1;;;;;111840:5:0;;;;:24;;:35;;;;;;;;;;;;;;;:5;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;111840:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;111840:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;78544:292:0;78732:16;;-1:-1:-1;;;;;78732:16:0;78718:10;:30;:71;;;;;78774:7;;;;;;;;;-1:-1:-1;;;;;78774:7:0;-1:-1:-1;;;;;78774:13:0;;:15;;;;;-1:-1:-1;;;78774:15:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78774:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;78774:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78774:15:0;-1:-1:-1;;;;;78766:23:0;:4;:23;78718:71;:110;;;;;78815:5;;;;;;;;;-1:-1:-1;;;;;78815:5:0;-1:-1:-1;;;;;78815:11:0;;:13;;;;;-1:-1:-1;;;78815:13:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78815:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;78815:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78815:13:0;-1:-1:-1;;;;;78807:21:0;:4;:21;78718:110;78709:121;;;;;;;;78544:292::o;5850:54::-;;;:::o;96426:3505::-;96690:7;;:39;;;;;;;;;;;;;96718:10;96690:39;;;;;;97651:11;;-1:-1:-1;;;;;96690:7:0;;:19;;:39;;;;;;;;;;;;;;97651:11;96690:7;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;96690:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;96690:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;96690:39:0;96682:48;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;96850:25:0;;;;;:160;;-1:-1:-1;96897:7:0;;:28;;;-1:-1:-1;;;;;96897:28:0;;;;;;;;;;;96929:19;;-1:-1:-1;;;;;96897:7:0;;:20;;:28;;;;;;;;;;;;;;96929:19;96897:7;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;96897:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;96897:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;96897:28:0;:51;;;;;;;;;;:111;;;;-1:-1:-1;96971:7:0;;:24;;;-1:-1:-1;;;;;96971:24:0;;;;;;;;;;;:37;;-1:-1:-1;;;;;96971:7:0;;:16;;:24;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;96971:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;96971:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;96971:24:0;-1:-1:-1;;;;;96971:35:0;;:37::i;:::-;96970:38;96897:111;96841:171;;;;;;;;97175:7;;:24;;;-1:-1:-1;;;;;97175:24:0;;;;;;;;;;;-1:-1:-1;;;;;97175:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;97175:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;97175:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;97175:24:0;97174:25;97169:90;;;97220:7;;:29;;;;;;;;;;;;;;;-1:-1:-1;;;;;97220:7:0;;;;:21;;:29;;;;;:7;;:29;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;97220:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;97220:29:0;;;;97169:90;97507:7;;:32;;;-1:-1:-1;;;;;97507:32:0;;;;;;;;;-1:-1:-1;;;;;97507:32:0;;;;;;;;;:7;;;;;:15;;:32;;;;;;;;;;;;;;:7;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;97507:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;97507:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;97507:32:0;97506:33;97501:627;;;97665:7;;:24;;;-1:-1:-1;;;;;97665:24:0;;;;;;;;;;;-1:-1:-1;;;;;97665:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;97665:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;97665:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;97665:24:0;97702:7;;:33;;;;;;;;;;;;;-1:-1:-1;;;;;97702:33:0;;;;;;;;;97665:24;;-1:-1:-1;97702:7:0;;;:16;;:33;;;;;:7;;:33;;;;;;;;:7;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;97702:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;98026:7:0;;:35;;;-1:-1:-1;;;;;98026:35:0;;;;;;;;;:7;:35;;;;;;;;-1:-1:-1;;;;;98026:7:0;;;;-1:-1:-1;98026:24:0;;-1:-1:-1;98026:35:0;;;;;;;;;;;:7;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;98026:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;98026:35:0;;;;98110:6;98102:15;;98093:7;-1:-1:-1;;;;;98079:39:0;98088:3;-1:-1:-1;;;;;98079:39:0;;;;;;;;;;;97501:627;-1:-1:-1;;;;;;;;;;;;;;;;98247:25:0;;;98242:1682;;;98293:7;;:32;;;;;;;;;;;;;:7;:32;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;98293:7:0;;;;:15;;:32;;;;;:7;;:32;;;;;;:7;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;98293:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;98336:7:0;;:37;;;;;;;;;;;;;:7;:37;;;;;;;;-1:-1:-1;;;;;98336:7:0;;;;-1:-1:-1;98336:26:0;;-1:-1:-1;98336:37:0;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;98336:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;98384:7:0;;:33;;;;;;;;;;;;;:7;:33;;;;;;;;-1:-1:-1;;;;;98384:7:0;;;;-1:-1:-1;98384:22:0;;-1:-1:-1;98384:33:0;;;;;;;;;;;:7;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;98384:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;98428:7:0;;:35;;;-1:-1:-1;;;;;98428:35:0;;;;;;;;;:7;:35;;;;;;;;-1:-1:-1;;;;;98428:7:0;;;;-1:-1:-1;98428:24:0;;-1:-1:-1;98428:35:0;;;;;;;;;;;:7;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;98428:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;98474:7:0;;:32;;;;;;;;;;;;;:7;:32;;;;;;;;-1:-1:-1;;;;;98474:7:0;;;;-1:-1:-1;98474:21:0;;-1:-1:-1;98474:32:0;;;;;;;;;;;:7;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;98474:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;98517:6:0;;:26;;;;;;;;;;;;;;;-1:-1:-1;;;;;98517:6:0;;;;-1:-1:-1;98517:18:0;;-1:-1:-1;98517:26:0;;;;;:6;;:26;;;;;;;;:6;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;98517:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;98554:7:0;;:28;;;;;;;;;;;;;;;-1:-1:-1;;;;;98554:7:0;;;;-1:-1:-1;98554:20:0;;-1:-1:-1;98554:28:0;;;;;:7;;:28;;;;;;;;:7;;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;98554:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;98554:28:0;;;;98242:1682;;;98711:6;98706:1218;;;98879:7;;:29;;;-1:-1:-1;;;;;98879:29:0;;;;;;;;;;;-1:-1:-1;;;;;98879:7:0;;;;:21;;:29;;;;;;;;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;98879:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;98879:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;98879:29:0;98874:157;;;98933:7;;:41;;;;;;;;;;;;;;;-1:-1:-1;;;;;98933:7:0;;;;:33;;:41;;;;;:7;;:41;;;;;;;;:7;;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;98933:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;98987:7:0;;:32;;;;;;;;;;;;;:7;:32;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;98987:7:0;;;;-1:-1:-1;98987:15:0;;-1:-1:-1;98987:32:0;;;;;;;;;;;:7;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;98987:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;98987:32:0;;;;98874:157;99091:7;;:37;;;;;;;;;;;;;:7;:37;;;;;;;;-1:-1:-1;;;;;99091:7:0;;;;:26;;:37;;;;;:7;;:37;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;99091:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;99185:7:0;;:33;;;;;;;;;;;;;:7;:33;;;;;;;;-1:-1:-1;;;;;99185:7:0;;;;-1:-1:-1;99185:22:0;;-1:-1:-1;99185:33:0;;;;;;;;;;;:7;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;99185:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;99537:7:0;;:35;;;-1:-1:-1;;;;;99537:35:0;;;;;;;;;:7;:35;;;;;;;;-1:-1:-1;;;;;99537:7:0;;;;-1:-1:-1;99537:24:0;;-1:-1:-1;99537:35:0;;;;;;;;;;;:7;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;99537:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;99740:7:0;;:29;;;;;;;;;;;;;;;-1:-1:-1;;;;;99740:7:0;;;;-1:-1:-1;99740:21:0;;-1:-1:-1;99740:29:0;;;;;;;;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;99740:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;99740:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;99740:29:0;-1:-1:-1;;;;;99722:47:0;-1:-1:-1;;;;;;;;;;;99722:47:0;99717:121;;99794:7;;:32;;;;;;;;;;;;;:7;:32;;;;;;;;-1:-1:-1;;;;;99794:7:0;;;;:21;;:32;;;;;:7;;:32;;;;;;:7;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;99794:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;99794:32:0;;;;99717:121;99888:6;;:26;;;;;;;;;;;;;;;-1:-1:-1;;;;;99888:6:0;;;;:18;;:26;;;;;:6;;:26;;;;;;;;:6;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;99888:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;99888:26:0;;;;98706:1218;96426:3505;;;;:::o;87070:359::-;87196:9;87172:8;113797:11;113791:17;;113783:26;;;;;;87241:7;;:26;;;-1:-1:-1;;;;;87241:26:0;;;;;;;;;-1:-1:-1;;;;;87241:26:0;;;;;;;;;87215:8;;-1:-1:-1;87241:7:0;;;;;:15;;:26;;;;;;;;;;;;;;:7;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;87241:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;87241:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;87241:26:0;87233:35;;;;;;;;87393:28;87407:2;87411:3;87416:4;87393:13;:28::i;:::-;87070:359;;;;;:::o;112512:895::-;1022:5;;-1:-1:-1;;;;;1022:5:0;1008:10;:19;1000:28;;;;;;112758:7;;:29;;;-1:-1:-1;;;;;112758:29:0;;;;;;;;;:7;:29;;;;;;;;-1:-1:-1;;;;;112758:7:0;;;;:15;;:29;;;;;;;;;;;;;;;;;;:7;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;112758:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;112758:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;112758:29:0;:63;;;;-1:-1:-1;;;;;;112807:14:0;;;;112758:63;112749:74;;;;;;;;112895:5;;;;;;;;;-1:-1:-1;;;;;112895:5:0;-1:-1:-1;;;;;112895:26:0;;:28;;;;;-1:-1:-1;;;112895:28:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;112895:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;;;;113076:21:0;;:10;:21;113072:328;;;113117:36;113125:7;113117:36;;113134:7;113143:4;113149:3;113117:7;:36::i;:::-;113072:328;;;113346:44;113354:7;113346:44;;113363:7;113372:5;113379:10;113346:7;:44::i;:::-;112512:895;;:::o;83517:88::-;-1:-1:-1;;;;;;;;;;;83517:88:0;:::o;107980:601::-;113956:7;;:24;;;-1:-1:-1;;;;;113956:24:0;;;;;;;;;;;108137:13;;108071:6;;-1:-1:-1;;;;;113956:7:0;;;;:16;;:24;;;;;;;;;;;;;;;108137:13;113956:7;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;113956:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;113956:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;113956:24:0;-1:-1:-1;;;;;113938:42:0;-1:-1:-1;;;;;;;;;;;113938:42:0;;113929:53;;;;;;108153:7;;:24;;;-1:-1:-1;;;;;108153:24:0;;;;;;;;;;;-1:-1:-1;;;;;108153:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;108153:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;108153:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;108153:24:0;;-1:-1:-1;;;;;;108281:19:0;;108290:10;108281:19;;108280:62;;-1:-1:-1;108305:7:0;;:37;;;;;;-1:-1:-1;;;;;108305:37:0;;;;;;;108331:10;108305:37;;;;;;:7;;;;;:18;;:37;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;108305:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;108305:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;108305:37:0;108280:62;108272:71;;;;;;;;108420:7;;:48;;;-1:-1:-1;;;;;108420:48:0;;;;;;;;;-1:-1:-1;;;;;108420:48:0;;;;;;;;;:7;;;;;:24;;:48;;;;;:7;;:48;;;;;;;:7;;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;108420:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;108420:48:0;;;;108565:6;108557:15;;108541:14;-1:-1:-1;;;;;108525:48:0;108534:5;-1:-1:-1;;;;;108525:48:0;;;;;;;;;;;107980:601;;;;:::o;83854:115::-;;;:::o;85975:196::-;86121:42;86138:5;86145:3;86150:8;86121:42;;;;;;;;;;;;;:16;:42::i;90601:589::-;56323:7;;:37;;;-1:-1:-1;;;;;56323:37:0;;;;;;;;;56349:10;56323:37;;;;;;90894:6;;-1:-1:-1;;;;;56323:7:0;;:17;;:37;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56323:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56323:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56323:37:0;:79;;;;-1:-1:-1;56378:7:0;;:24;;;-1:-1:-1;;;;;56378:24:0;;;;;;;;;;;-1:-1:-1;;;;;56378:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56378:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56378:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56378:24:0;56323:79;56314:90;;;;;;;;113956:7;;:24;;;-1:-1:-1;;;;;113956:24:0;;;;;;;;;;;90914:6;;-1:-1:-1;;;;;113956:7:0;;:16;;:24;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;113956:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;113956:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;113956:24:0;-1:-1:-1;;;;;113938:42:0;-1:-1:-1;;;;;;;;;;;113938:42:0;;113929:53;;;;;;90940:14;90936:89;;;90974:7;;:41;;;;;;;;;;;;;;;-1:-1:-1;;;;;90974:7:0;;;;:33;;:41;;;;;:7;;:41;;;;;;;;:7;;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;90974:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;90974:41:0;;;;90936:89;91033:7;;:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;91033:7:0;;;;:15;;:149;;;;;:7;;:149;;;;;;;;:7;;:149;;;5:2:-1;;;;30:1;27;20:12;5:2;91033:149:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;91033:149:0;;;;56411:1;90601:589;;;;;;:::o;104341:1958::-;104543:7;;:31;;;-1:-1:-1;;;;;104543:31:0;;;;;;;;;;;104436:14;;;;;;-1:-1:-1;;;;;104543:7:0;;;;:21;;:31;;;;;;;;;;;;;;;104436:14;104543:7;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;104543:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;104543:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;104543:31:0;104542:32;104537:52;;;104584:5;104577:12;;;;104537:52;105674:7;;:28;;;-1:-1:-1;;;;;105674:28:0;;;;;;;;;;;-1:-1:-1;;;;;105674:7:0;;;;:20;;:28;;;;;;;;;;;;;;;:7;;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;105674:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;105674:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;105674:28:0;105738:7;;:30;;;-1:-1:-1;;;;;105738:30:0;;;;;;;;;;;105674:28;;-1:-1:-1;;;;;;105738:7:0;;;;:20;;:30;;;;;105674:28;;105738:30;;;;;;;;:7;;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;105738:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;105738:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;105738:30:0;;-1:-1:-1;105898:9:0;105892:16;;;;;;;;105864:44;;105871:11;105865:18;;;;;;;;105886:1;105865:22;105864:44;;;105862:427;;;;106026:9;106011:24;;;;;;;;:11;:24;;;;;;;;;106010:277;;;;-1:-1:-1;106258:7:0;;:29;;;-1:-1:-1;;;;;106258:29:0;;;;;;;;;;;-1:-1:-1;;;;;106258:7:0;;;;:21;;:29;;;;;;;;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;106258:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;106258:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;106258:29:0;106257:30;106010:277;105777:514;;104341:1958;;;;;;;:::o;112089:244::-;112164:16;;;;;;;112163:17;112155:26;;;;;;112198:24;;;;-1:-1:-1;;;;;112198:24:0;;;;;;;;;;;;;;;112226:19;112198:47;112190:56;;;;;;112255:13;;:38;;;;;;-1:-1:-1;;;;;112255:38:0;;;;;;;;;:13;;;;;:23;;:38;;;;;;;;;;;;;;:13;;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;112255:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;112255:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;112302:16:0;:23;;-1:-1:-1;;112302:23:0;;;;;-1:-1:-1;112089:244:0:o;85685:203::-;85761:14;85812:11;85801:8;:22;85800:78;;;;-1:-1:-1;85844:7:0;;:34;;;-1:-1:-1;;;;;85844:34:0;;;;;;;;;;;-1:-1:-1;;;;;85844:7:0;;;;:16;;:34;;;;;;;;;;;;;;;:7;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;85844:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;85844:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;85844:34:0;85800:78;85791:89;85685:203;-1:-1:-1;;85685:203:0:o;110022:557::-;56917:7;;:37;;;-1:-1:-1;;;;;56917:37:0;;56857:155;;;56917:37;;;;;;56943:10;56917:37;;;;;;110311:13;;-1:-1:-1;;;;;56917:7:0;;:17;;:37;;;;;;;;;;;;;;110311:13;56917:7;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56917:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56917:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56917:37:0;:79;;;;-1:-1:-1;56972:7:0;;:24;;;-1:-1:-1;;;;;56972:24:0;;;;;;;;;;;-1:-1:-1;;;;;56972:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56972:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56972:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56972:24:0;56917:79;56908:90;;;;;;;;110327:5;;:48;;;;;;;;;;;;;-1:-1:-1;;;;;110327:48:0;;;;;;;;;;;;;;;;:5;;;;;:21;;:48;;;;;;;;;;;;;;:5;;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;110327:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;110327:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;110327:48:0;;-1:-1:-1;110512:60:0;;;;110544:18;110552:9;110544:7;:18::i;111090:420::-;111272:5;;:34;;;;;;-1:-1:-1;;;;;111272:34:0;;;;;;;;;111256:13;;111272:5;;;;;:23;;:34;;;;;;;;;;;;;;;111256:13;111272:5;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;111272:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;111272:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;111272:34:0;;-1:-1:-1;111443:60:0;;;;111475:18;111483:9;111475:7;:18::i;83612:35::-;;;-1:-1:-1;;;;;83612:35:0;;:::o;85236:373::-;85343:13;;85317:8;113797:11;113791:17;;113783:26;;;;;;85542:7;;:20;;;-1:-1:-1;;;;;85542:20:0;;;;;;;;;;;85391:8;;-1:-1:-1;;;;;;85542:7:0;;;;:16;;:20;;;;;;;;;;;;;;;:7;;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;85542:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;85542:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;85542:20:0;85534:29;;;;;;;;85581:7;;:20;;;-1:-1:-1;;;;;85581:20:0;;;;;;;;;;;-1:-1:-1;;;;;85581:7:0;;;;:16;;:20;;;;;;;;;;;;;;;:7;;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;85581:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;85581:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;85581:20:0;;85236:373;-1:-1:-1;;;;85236:373:0:o;110746:192::-;56917:7;;:37;;;-1:-1:-1;;;;;56917:37:0;;56857:155;;;56917:37;;;;;;56943:10;56917:37;;;;;;56857:155;;-1:-1:-1;;;;;56917:7:0;;:17;;:37;;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56917:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56917:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56917:37:0;:79;;;;-1:-1:-1;56972:7:0;;:24;;;-1:-1:-1;;;;;56972:24:0;;;;;;;;;;;-1:-1:-1;;;;;56972:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56972:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56972:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56972:24:0;56917:79;56908:90;;;;;;;;110881:5;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;110881:5:0;;;;:22;;:49;;;;;;;;;;;;;;;:5;;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;110881:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;110881:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;84972:188:0;85049:15;-1:-1:-1;;;;;85088:13:0;;;;85080:22;;;;;;85118:7;;:34;;;;;;-1:-1:-1;;;;;85118:34:0;;;;;;;;;:7;;;;;:26;;:34;;;;;;;;;;;;;;:7;;:34;;;5:2:-1;;;;30:1;27;20:12;1314:114:0;1022:5;;-1:-1:-1;;;;;1022:5:0;1008:10;:19;1000:28;;;;;;1391:5;;;1372:25;;-1:-1:-1;;;;;1391:5:0;;;;1372:25;;;1420:1;1404:18;;-1:-1:-1;;1404:18:0;;;1314:114::o;106632:197::-;56323:7;;:37;;;-1:-1:-1;;;;;56323:37:0;;;;;;;;;56349:10;56323:37;;;;;;106735:6;;-1:-1:-1;;;;;56323:7:0;;:17;;:37;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56323:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56323:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56323:37:0;:79;;;;-1:-1:-1;56378:7:0;;:24;;;-1:-1:-1;;;;;56378:24:0;;;;;;;;;;;-1:-1:-1;;;;;56378:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56378:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56378:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56378:24:0;56323:79;56314:90;;;;;;;;113956:7;;:24;;;-1:-1:-1;;;;;113956:24:0;;;;;;;;;;;106755:6;;-1:-1:-1;;;;;113956:7:0;;:16;;:24;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;113956:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;113956:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;113956:24:0;-1:-1:-1;;;;;113938:42:0;-1:-1:-1;;;;;;;;;;;113938:42:0;;113929:53;;;;;;106777:7;;:44;;;;;;;;;;;;;-1:-1:-1;;;;;106777:44:0;;;;;;;;;:7;;;;;:26;;:44;;;;;:7;;:44;;;;;;;:7;;:44;;;5:2:-1;;;;30:1;27;20:12;519:20:0;;;-1:-1:-1;;;;;519:20:0;;:::o;89197:104::-;89281:12;;;;;;;;;;;;;;;;;89197:104;:::o;83976:36::-;;;;;;;;;:::o;108996:320::-;56917:7;;:37;;;-1:-1:-1;;;;;56917:37:0;;56857:155;;;56917:37;;;;;;56943:10;56917:37;;;;;;56857:155;;-1:-1:-1;;;;;56917:7:0;;:17;;:37;;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56917:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56917:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56917:37:0;:79;;;;-1:-1:-1;56972:7:0;;:24;;;-1:-1:-1;;;;;56972:24:0;;;;;;;;;;;-1:-1:-1;;;;;56972:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56972:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56972:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56972:24:0;56917:79;56908:90;;;;;;;;109260:4;-1:-1:-1;;;;;109220:45:0;:9;-1:-1:-1;;;;;109220:26:0;;:28;;;;;-1:-1:-1;;;109220:28:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;109220:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;109220:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;109220:28:0;-1:-1:-1;;;;;109220:45:0;;109212:54;;;;;;109275:5;;:33;;;;;;-1:-1:-1;;;;;109275:33:0;;;;;;;;;:5;;;;;:22;;:33;;;;;:5;;:33;;;;;;;:5;;:33;;;5:2:-1;;;;30:1;27;20:12;91798:2140:0;91974:7;;:28;;;-1:-1:-1;;;;;91974:28:0;;;;;;;;;92071:13;91974:28;;;;;;;;92071:13;;-1:-1:-1;;;;;91974:7:0;;:15;;:28;;;;;;;;;;;;;;;92071:13;91974:7;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;91974:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;91974:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;91974:28:0;91966:37;;;;;;;;92087:7;;:25;;;;;;;;;;;;;;;-1:-1:-1;;;;;92087:7:0;;;;:17;;:25;;;;;;;;;;;;;;;:7;;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;92087:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;92087:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;92087:25:0;92231:7;;:24;;;-1:-1:-1;;;;;92231:24:0;;;;;;;;;;;92087:25;;-1:-1:-1;;;;;;92231:7:0;;;;:16;;:24;;;;;92087:25;;92231:24;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;92231:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;92231:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;92231:24:0;-1:-1:-1;;;;;92213:42:0;-1:-1:-1;;;;;;;;;;;92213:42:0;;92204:53;;;;;;92293:7;;:29;;;;;;;;;;;;;;;-1:-1:-1;;;;;92293:7:0;;;;:21;;:29;;;;;;;;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;92293:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;92293:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;92293:29:0;-1:-1:-1;;;;;92275:47:0;-1:-1:-1;;;;;;;;;;;92275:47:0;;92266:58;;;;;;92910:7;;:28;;;-1:-1:-1;;;;;92910:28:0;;;;;;;;;;;-1:-1:-1;;;;;92910:7:0;;;;:20;;:28;;;;;;;;;;;;;;;:7;;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;92910:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;92910:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;92910:28:0;92904:35;;;;;;;;92850:7;;:28;;;-1:-1:-1;;;;;92850:28:0;;;;;;;;;;;92843:96;;;;;;-1:-1:-1;;;;;92850:7:0;;;;:20;;:28;;;;;;;;;;;;;;;:7;;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;92850:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;92850:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;92850:28:0;92844:35;;;;;;;;92882:1;92844:39;92843:96;;;92834:107;;;;;;;;93029:7;;:29;;;-1:-1:-1;;;;;93029:29:0;;;;;;;;;;;-1:-1:-1;;;;;93029:7:0;;;;:21;;:29;;;;;;;;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;93029:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;93029:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;93029:29:0;93028:143;;;;;93131:38;93145:6;93131:38;;93153:15;93131:13;:38::i;:::-;93081:7;;:29;;;;;;;;;;;;;;;:88;;;;;;-1:-1:-1;;;;;93081:7:0;;;;:21;;:29;;;;;;;;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;93081:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;93081:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;93081:29:0;:88;;;93028:143;93019:154;;;;;;;;93381:7;;:38;;;;;;;;;;;;;93408:10;93381:38;;;;;;-1:-1:-1;;;;;93381:7:0;;;;:18;;:38;;;;;;;;;;;;;;;:7;;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;93381:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;93381:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;93381:38:0;93372:49;;;;;;;;93574:10;-1:-1:-1;;;;;93574:21:0;;;93570:361;;;93615:35;93623:6;93631:7;93640:4;93646:3;93615:7;:35::i;:::-;93570:361;;;93896:7;;:24;;;-1:-1:-1;;;;;93896:24:0;;;;;;;;;;;93864:57;;93872:6;;93880:7;;93889:5;;-1:-1:-1;;;;;93896:7:0;;:16;;:24;;;;;;;;;;;;;;93889:5;93896:7;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;93896:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;93896:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;93896:24:0;93864:7;:57::i;87897:247::-;-1:-1:-1;;;;;87995:16:0;;;;87987:25;;;;;;88021:7;;:53;;;;;;88041:10;88021:53;;;;-1:-1:-1;;;;;88021:53:0;;;;;;;;;;;;;;;;:7;;;;;:19;;:53;;;;;:7;;:53;;;;;;;:7;;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;88021:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;88088:48:0;;;;;;;;;;-1:-1:-1;;;;;88088:48:0;;;-1:-1:-1;88103:10:0;;-1:-1:-1;88088:48:0;;;;;;;;;87897:247;;:::o;107571:165::-;56917:7;;:37;;;-1:-1:-1;;;;;56917:37:0;;56857:155;;;56917:37;;;;;;56943:10;56917:37;;;;;;56857:155;;-1:-1:-1;;;;;56917:7:0;;:17;;:37;;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56917:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56917:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56917:37:0;:79;;;;-1:-1:-1;56972:7:0;;:24;;;-1:-1:-1;;;;;56972:24:0;;;;;;;;;;;-1:-1:-1;;;;;56972:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56972:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56972:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56972:24:0;56917:79;56908:90;;;;;;;;107689:7;;:39;;;;;;;;;;;;;-1:-1:-1;;;;;107689:39:0;;;;;;;;;:7;;;;;:22;;:39;;;;;:7;;:39;;;;;;;:7;;:39;;;5:2:-1;;;;30:1;27;20:12;107111:267:0;56622:7;;:38;;;;;;56560:158;;;56622:38;;;;;;56649:10;56622:38;;;;;;56560:158;;-1:-1:-1;;;;;56622:7:0;;:18;;:38;;;;;;;;;;;;;;;:7;;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;56622:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56622:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56622:38:0;:80;;;;-1:-1:-1;56678:7:0;;:24;;;-1:-1:-1;;;;;56678:24:0;;;;;;;;;;;-1:-1:-1;;;;;56678:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56678:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56678:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56678:24:0;56622:80;56613:91;;;;;;;;113956:7;;:24;;;-1:-1:-1;;;;;113956:24:0;;113886:114;;;113956:24;;;;;;;;113886:114;;-1:-1:-1;;;;;113956:7:0;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;113956:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;113956:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;113956:24:0;-1:-1:-1;;;;;113938:42:0;-1:-1:-1;;;;;;;;;;;113938:42:0;;113929:53;;;;;;107284:7;;:30;;;;;;;;;;;;;;;-1:-1:-1;;;;;107284:7:0;;;;:21;;:30;;;;;;;;;;;;;;;:7;;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;107284:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;107284:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;107284:30:0;-1:-1:-1;;;;;107266:48:0;-1:-1:-1;;;;;;;;;;;107266:48:0;;107257:59;;;;;;107327:7;;:43;;;;;;;;;;;;;-1:-1:-1;;;;;107327:43:0;;;;;;;;;:7;;;;;:21;;:43;;;;;:7;;:43;;;;;;;:7;;:43;;;5:2:-1;;;;30:1;27;20:12;86326:598:0;86660:13;86512:34;86525:5;86532:3;86537:8;86512:12;:34::i;:::-;86624:16;:3;-1:-1:-1;;;;;86624:14:0;;:16::i;:::-;86620:297;;;86676:98;;;;;86739:10;86676:98;;;;;;-1:-1:-1;;;;;86676:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:62;;;;;;86739:10;86751:5;;86758:8;;86768:5;;86676:98;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;86676:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;86676:98:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;86676:98:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;86676:98:0;;-1:-1:-1;;;;;;;86882:24:0;;86892:14;86882:24;86874:33;;;;;113415:186;1022:5;;-1:-1:-1;;;;;1022:5:0;1008:10;:19;1000:28;;;;;;113539:7;;:54;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;113539:7:0;;;;:21;;113561:8;;;;113571:10;;;;113583:9;;;;113539:54;;;;;;;;;;;;113561:8;;;;113539:54;;;;;;;;;;;;;;;;-1:-1:-1;113539:54:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;113539:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;113539:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;113539:54:0;;;;113415:186;;;;;;:::o;101770:399::-;101848:7;;:32;;;;;;;;;;;;;;;101831:14;;-1:-1:-1;;;;;101848:7:0;;:24;;:32;;;;;;;;;;;;;;101831:14;101848:7;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;101848:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;101848:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;101848:32:0;101898:7;;:26;;;;;;;;;;;;;;;101848:32;;-1:-1:-1;;;;;;101898:7:0;;;;:18;;:26;;;;;101848:32;;101898:26;;;;;;;;:7;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;101898:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;101898:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;101898:26:0;:86;;;;-1:-1:-1;101944:7:0;;:40;;;-1:-1:-1;;;;;101944:40:0;;;;;;;;;101972:10;101944:40;;;;;;-1:-1:-1;;;;;101944:7:0;;;;:17;;:40;;;;;;;;;;;;;;;:7;;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;101944:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;101944:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;101944:40:0;101898:86;101889:97;;;;;;;;102022:7;;:25;;;-1:-1:-1;;;;;102022:25:0;;;;;;;;;;;-1:-1:-1;;;;;102022:7:0;;;;:16;;:25;;;;;;;;;;;;;;;:7;;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;102022:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;102022:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;102022:25:0;-1:-1:-1;;;;;102004:43:0;-1:-1:-1;;;;;;;;;;;102004:43:0;;101995:54;;;;;;102133:7;;:28;;;;;;;;;;;;;;;-1:-1:-1;;;;;102133:7:0;;;;:20;;:28;;;;;:7;;:28;;;;;;;;:7;;:28;;;5:2:-1;;;;30:1;27;20:12;100287:368:0;56323:7;;:37;;;-1:-1:-1;;;;;56323:37:0;;;;;;;;;56349:10;56323:37;;;;;;100377:6;;-1:-1:-1;;;;;56323:7:0;;:17;;:37;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56323:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56323:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56323:37:0;:79;;;;-1:-1:-1;56378:7:0;;:24;;;-1:-1:-1;;;;;56378:24:0;;;;;;;;;;;-1:-1:-1;;;;;56378:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56378:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56378:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56378:24:0;56323:79;56314:90;;;;;;;;113956:7;;:24;;;-1:-1:-1;;;;;113956:24:0;;;;;;;;;;;100397:6;;-1:-1:-1;;;;;113956:7:0;;:16;;:24;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;113956:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;113956:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;113956:24:0;-1:-1:-1;;;;;113938:42:0;-1:-1:-1;;;;;;;;;;;113938:42:0;;113929:53;;;;;;100519:7;;:26;;;-1:-1:-1;;;;;100519:26:0;;;;;;;;;;;-1:-1:-1;;;;;100519:7:0;;;;:16;;:26;;;;;;;;;;;;;;;:7;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;100519:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;100519:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;100519:26:0;-1:-1:-1;;;;;100501:44:0;-1:-1:-1;;;;;;;;;;;100501:44:0;;100492:55;;;;;;100566:29;100578:6;100586:8;100566:11;:29::i;:::-;100558:38;;;;;;;;100605:7;;:42;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;100605:7:0;;;;:24;;:42;;;;;:7;;:42;;;;;;;;:7;;:42;;;5:2:-1;;;;30:1;27;20:12;101092:453:0;113956:7;;:24;;;-1:-1:-1;;;;;113956:24:0;;;;;;;;;;;101172:14;;101150:6;;-1:-1:-1;;;;;113956:7:0;;;;:16;;:24;;;;;;;;;;;;;;;101172:14;113956:7;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;113956:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;113956:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;113956:24:0;-1:-1:-1;;;;;113938:42:0;-1:-1:-1;;;;;;;;;;;113938:42:0;;113929:53;;;;;;101189:7;;:32;;;;;;;;;;;;;;;-1:-1:-1;;;;;101189:7:0;;;;:24;;:32;;;;;;;;;;;;;;;:7;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;101189:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;101189:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;101189:32:0;101239:7;;:26;;;;;;;;;;;;;;;101189:32;;-1:-1:-1;;;;;;101239:7:0;;;;:18;;:26;;;;;101189:32;;101239:26;;;;;;;;:7;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;101239:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;101239:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;101239:26:0;:86;;;;-1:-1:-1;101285:7:0;;:40;;;-1:-1:-1;;;;;101285:40:0;;;;;;;;;101313:10;101285:40;;;;;;-1:-1:-1;;;;;101285:7:0;;;;:17;;:40;;;;;;;;;;;;;;;:7;;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;101285:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;101285:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;101285:40:0;101239:86;101230:97;;;;;;;;101363:7;;:25;;;-1:-1:-1;;;;;101363:25:0;;;;;;;;;;;-1:-1:-1;;;;;101363:7:0;;;;:16;;:25;;;;;;;;;;;;;;;:7;;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;101363:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;101363:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;101363:25:0;-1:-1:-1;;;;;101345:43:0;-1:-1:-1;;;;;;;;;;;101345:43:0;;101336:54;;;;;;101513:7;;:24;;;;;;;;;;;;;;;-1:-1:-1;;;;;101513:7:0;;;;:16;;:24;;;;;:7;;:24;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;100739:137:0;56323:7;;:37;;;-1:-1:-1;;;;;56323:37:0;;;;;;;;;56349:10;56323:37;;;;;;100818:6;;-1:-1:-1;;;;;56323:7:0;;:17;;:37;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56323:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56323:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56323:37:0;:79;;;;-1:-1:-1;56378:7:0;;:24;;;-1:-1:-1;;;;;56378:24:0;;;;;;;;;;;-1:-1:-1;;;;;56378:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56378:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56378:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56378:24:0;56323:79;56314:90;;;;;;;89385:888;89493:16;;89467:8;113797:11;113791:17;;113783:26;;;;;;89525:60;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;89525:60:0;;-1:-1:-1;89649:58:0;89704:2;89690:10;89679:21;;89678:28;89675:2;:31;-1:-1:-1;;;89670:37:0;89649:58;-1:-1:-1;89649:58:0;;;:18;;;:58;-1:-1:-1;89770:2:0;89757:9;89746:20;;89745:27;89742:2;:30;-1:-1:-1;;;89737:36:0;89716:14;89731:2;89716:18;;;;;;;;;;;;;;:57;-1:-1:-1;;;;;89716:57:0;;;;;;;;-1:-1:-1;89835:2:0;89823:8;89812:19;;89811:26;89808:2;:29;-1:-1:-1;;;89803:35:0;89782:14;89797:2;89782:18;;;;;;;;;;;;;;:56;-1:-1:-1;;;;;89782:56:0;;;;;;;;-1:-1:-1;89899:2:0;89888:7;89877:18;;89876:25;89873:2;:28;-1:-1:-1;;;89868:34:0;89847:14;89862:2;89847:18;;;;;;;;;;;;;;:55;-1:-1:-1;;;;;89847:55:0;;;;;;;;-1:-1:-1;89962:2:0;89952:6;89941:17;;89940:24;89937:2;:27;-1:-1:-1;;;89932:33:0;89911:14;89926:2;89911:18;;;;;;;;;;;;;;:54;-1:-1:-1;;;;;89911:54:0;;;;;;;;-1:-1:-1;90024:2:0;90015:5;90004:16;;90003:23;90000:2;:26;-1:-1:-1;;;89995:32:0;89974:14;89989:2;89974:18;;;;;;;;;;;;;;:53;-1:-1:-1;;;;;89974:53:0;;;;;;;;-1:-1:-1;90085:2:0;90077:4;90066:15;;90065:22;90062:2;:25;-1:-1:-1;;;90057:31:0;90036:14;90051:2;90036:18;;;;;;;;;;;;;;:52;-1:-1:-1;;;;;90036:52:0;;;;;;;;-1:-1:-1;90145:2:0;90138:3;90127:14;;90126:21;90123:2;:24;-1:-1:-1;;;90118:30:0;90097:14;90112:2;90097:18;;;;;;;;;;;;;;:51;-1:-1:-1;;;;;90097:51:0;;;;;;;;-1:-1:-1;90204:2:0;90187:13;;;90186:20;90183:2;:23;-1:-1:-1;;;90178:29:0;90157:14;90172:2;90157:18;;;;;;;;;;;;;;:50;-1:-1:-1;;;;;90157:50:0;;;;;;;;-1:-1:-1;90262:2:0;90246:8;90245:19;90242:2;:22;-1:-1:-1;;;90237:28:0;90216:14;90231:2;90216:18;;;;;;;;;;;;;;:49;-1:-1:-1;;;;;90216:49:0;;;;;;;;;89385:888;;;;;:::o;55654:22::-;;;-1:-1:-1;;;;;55654:22:0;;:::o;84092:20::-;;;-1:-1:-1;;;;;84092:20:0;;:::o;77800:18::-;;;-1:-1:-1;;;;;77800:18:0;;:::o;88706:182::-;88843:7;;:37;;;;;;-1:-1:-1;;;;;88843:37:0;;;;;;;;;;;;;;;;88809:11;;88843:7;;;;;:18;;:37;;;;;;;;;;;;;;;88809:11;88843:7;:37;;;5:2:-1;;;;30:1;27;20:12;78037:31:0;;;-1:-1:-1;;;;;78037:31:0;;:::o;103299:955::-;103442:7;;:28;;;-1:-1:-1;;;;;103442:28:0;;;;;;;;;;;103394:12;;;;;;-1:-1:-1;;;;;103442:7:0;;;;:20;;:28;;;;;;;;;;;;;;;103394:12;103442:7;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;103442:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;103442:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;103442:28:0;;-1:-1:-1;103494:19:0;103486:4;:27;;;;;;;;;103481:766;;;103541:3;103534:10;;;;103481:766;103580:17;103572:4;:25;;;;;;;;;103567:680;;;-1:-1:-1;103867:8:0;-1:-1:-1;;103845:18:0;;103844:31;103907:1;103890:18;;103886:166;;;103961:14;103956:1;:19;103948:4;:28;103932:46;;103886:166;;;104035:5;104027:13;;103886:166;104062:12;;103567:680;104236:1;104229:8;;;;1596:105;1022:5;;-1:-1:-1;;;;;1022:5:0;1008:10;:19;1000:28;;;;;;1666:29;1685:9;1666:18;:29::i;:::-;1596:105;:::o;12557:589::-;12615:4;13099:18;;13132:8;;12557:589::o;94214:1451::-;94481:7;;:31;;;;;;;;;;;;;;;-1:-1:-1;;;;;94481:7:0;;;;:23;;:31;;;;;:7;;:31;;;;;;;;:7;;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;94481:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;94481:31:0;;;;94647:7;94643:1015;;;94743:7;;:29;;;;;;;;;;;;;;;-1:-1:-1;;;;;94743:7:0;;;;:21;;:29;;;;;:7;;:29;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;94743:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;94783:7:0;;:33;;;;;;;;;;;;;-1:-1:-1;;;;;94783:33:0;;;;;;;;;:7;;;;;-1:-1:-1;94783:16:0;;-1:-1:-1;94783:33:0;;;;;:7;;:33;;;;;;;:7;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;94783:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;94783:33:0;;;;94865:6;94857:15;;94848:7;-1:-1:-1;;;;;94834:39:0;94843:3;94834:39;;;;;;;;;;94643:1015;;;95447:7;;:33;;;;;;;;;;;;;-1:-1:-1;;;;;95447:33:0;;;;;;;;;:7;;;;;:16;;:33;;;;;:7;;:33;;;;;;;:7;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;95447:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;95491:7:0;;:41;;;-1:-1:-1;;;;;95491:41:0;;;;;;;;;-1:-1:-1;;;;;95491:41:0;;;;;;;;;:7;;;;;-1:-1:-1;95491:24:0;;-1:-1:-1;95491:41:0;;;;;:7;;:41;;;;;;;:7;;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;95491:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;95491:41:0;;;;95581:6;95573:15;;95564:7;-1:-1:-1;;;;;95550:39:0;95559:3;95550:39;;;;;;;;;;95640:6;95632:15;;95623:7;-1:-1:-1;;;;;95605:43:0;95614:7;-1:-1:-1;;;;;95605:43:0;;;;;;;;;;;94214:1451;;;;:::o;79108:385::-;79226:7;;:31;;;;;;-1:-1:-1;;;;;79226:31:0;;;;;;;;;:7;;;;;:25;;:31;;;;;:7;;:31;;;;;;;:7;;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;79226:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;79264:5:0;;:29;;;;;;-1:-1:-1;;;;;79264:29:0;;;;;;;;;:5;;;;;-1:-1:-1;79264:23:0;;-1:-1:-1;79264:29:0;;;;;:5;;:29;;;;;;;:5;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;79264:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;79264:29:0;;;;79364:4;-1:-1:-1;;;;;79364:14:0;;:16;;;;;-1:-1:-1;;;79364:16:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;79364:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;79448:14:0;;;-1:-1:-1;;;;;79448:14:0;;;;;;;;-1:-1:-1;79448:14:0;;;;;;;-1:-1:-1;79448:14:0;79482:4;-1:-1:-1;;;;;79469:18:0;;1842:175;-1:-1:-1;;;;;1913:23:0;;;;1905:32;;;;;;1970:5;;;1949:38;;-1:-1:-1;;;;;1949:38:0;;;;1970:5;;;1949:38;;;1994:5;:17;;-1:-1:-1;;1994:17:0;-1:-1:-1;;;;;1994:17:0;;;;;;;;;;1842:175::o
Swarm Source
bzzr://b87afd7c657151e426eea5cfcc143c5b743516abd4d41bb11369080f92a81e5e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.