Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
GovernorBeta
Compiler Version
v0.5.13+commit.5b0b510c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-20 */ // File: contracts/utils/EvmUtil.sol /* * Copyright 2020 DMM Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ pragma solidity ^0.5.13; library EvmUtil { function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } } // File: contracts/governance/dmg/IDMGToken.sol /* * Copyright 2020 DMM Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ pragma solidity ^0.5.13; interface IDMGToken { /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint64 fromBlock; uint128 votes; } /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); // ************************* // ***** Functions // ************************* function getPriorVotes(address account, uint blockNumber) external view returns (uint128); function getCurrentVotes(address account) external view returns (uint128); function delegates(address delegator) external view returns (address); function burn(uint amount) external returns (bool); function approveBySig( address spender, uint rawAmount, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external; } // File: contracts/governance/governors/ITimelockInterface.sol /* * Copyright 2020 DMM Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * * Copyright 2020 Compound Labs, Inc. * * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the * following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following * disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ pragma solidity ^0.5.13; pragma experimental ABIEncoderV2; interface ITimelockInterface { function delay() external view returns (uint); function GRACE_PERIOD() external view returns (uint); function acceptAdmin() external; function queuedTransactions(bytes32 hash) external view returns (bool); function queueTransaction( address target, uint value, string calldata signature, bytes calldata data, uint eta ) external returns (bytes32); function cancelTransaction( address target, uint value, string calldata signature, bytes calldata data, uint eta ) external; function executeTransaction( address target, uint value, string calldata signature, bytes calldata data, uint eta ) external payable returns (bytes memory); } // File: contracts/governance/governors/GovernorAlphaData.sol /* * Copyright 2020 DMM Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * * Copyright 2020 Compound Labs, Inc. * * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the * following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following * disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ pragma solidity ^0.5.13; contract GovernorAlphaData { /// @notice An event emitted when a new proposal is created event ProposalCreated(uint id, address proposer, address[] targets, uint[] values, string[] signatures, bytes[] calldatas, uint startBlock, uint endBlock, string title, string description); /// @notice An event emitted when a vote has been cast on a proposal event VoteCast(address voter, uint proposalId, bool support, uint votes); /// @notice An event emitted when a proposal has been canceled event ProposalCanceled(uint id); /// @notice An event emitted when a proposal has been queued in the Timelock event ProposalQueued(uint id, uint eta); /// @notice An event emitted when a proposal has been executed in the Timelock event ProposalExecuted(uint id); struct Proposal { /// @notice Unique id for looking up a proposal uint id; /// @notice Creator of the proposal address proposer; /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds uint eta; /// @notice the ordered list of target addresses for calls to be made address[] targets; /// @notice The ordered list of values (i.e. msg.value) to be passed to the calls to be made uint[] values; /// @notice The ordered list of function signatures to be called string[] signatures; /// @notice The ordered list of calldata to be passed to each call bytes[] calldatas; /// @notice The block at which voting begins: holders must delegate their votes prior to this block uint startBlock; /// @notice The block at which voting ends: votes must be cast prior to this block uint endBlock; /// @notice Current number of votes in favor of this proposal uint forVotes; /// @notice Current number of votes in opposition to this proposal uint againstVotes; /// @notice Flag marking whether the proposal has been canceled bool canceled; /// @notice Flag marking whether the proposal has been executed bool executed; /// @notice Receipts of ballots for the entire set of voters mapping(address => Receipt) receipts; } /// @notice Ballot receipt record for a voter struct Receipt { /// @notice Whether or not a vote has been cast bool hasVoted; /// @notice Whether or not the voter supports the proposal bool support; /// @notice The number of votes the voter had, which were cast uint128 votes; } /// @notice Possible states that a proposal may be in enum ProposalState { Pending, Active, Canceled, Defeated, Succeeded, Queued, Expired, Executed } } // File: contracts/governance/governors/GovernorAlpha.sol /* * Copyright 2020 DMM Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * * Copyright 2020 Compound Labs, Inc. * * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the * following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following * disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ pragma solidity ^0.5.13; /** * This contract is mainly based on Compound's Governor Alpha contract. Attribution to Compound Labs as the original * creator of the contract can be seen above. * * Changes made to the original contract include slight name changes, adding a `title` field to the Proposal struct, * and minor data type adjustments to account for DMG using more bits for storage (128 instead of 96). */ contract GovernorAlpha is GovernorAlphaData { /// @notice The name of this contract string public constant name = "DMM Governor Alpha"; /// @notice The address of the DMM Protocol Timelock ITimelockInterface public timelock; /// @notice The address of the DMG governance token IDMGToken public dmg; /// @notice The address of the Governor Guardian address public guardian; /// @notice The total number of proposals uint public proposalCount; /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed uint public quorumVotes; /// @notice The minimum number of votes needed to create a proposal uint public proposalThreshold; /// @notice The duration of voting on a proposal, in blocks uint public votingPeriod; /// @notice The official record of all proposals ever proposed mapping(uint => Proposal) public proposals; /// @notice The latest proposal for each proposer mapping(address => uint) public latestProposalIds; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the ballot struct used by the contract bytes32 public constant BALLOT_TYPEHASH = keccak256("Ballot(uint256 proposalId,bool support)"); constructor( address dmg_, address guardian_ ) public { dmg = IDMGToken(dmg_); guardian = guardian_; quorumVotes = 500_000e18; proposalThreshold = 100_000e18; // ~3 days in blocks (assuming 15s blocks) votingPeriod = 17280; } function initializeTimelock( address timelock_ ) public { require( msg.sender == guardian, "GovernorAlpha::setTimelock: Caller must be guardian" ); require( address(timelock) == address(0x0), "GovernorAlpha::setTimelock: timelock must not be initialized yet" ); timelock = ITimelockInterface(timelock_); } function setQuorumVotes( uint quorumVotes_ ) public { require( msg.sender == address(timelock), "GovernorAlpha::setQuorumVotes: invalid sender" ); quorumVotes = quorumVotes_; } function setProposalThreshold( uint proposalThreshold_ ) public { require( msg.sender == address(timelock), "GovernorAlpha::setProposalThreshold: invalid sender" ); proposalThreshold = proposalThreshold_; } /** * @return The maximum number of actions that can be included in a proposal */ function proposalMaxOperations() public pure returns (uint) { // 10 actions return 10; } /** * @return The delay (represented as number of blocks) before voting on a proposal may take place, once proposed */ function votingDelay() public pure returns (uint) { // 1 block return 1; } function setVotingPeriod( uint votingPeriod_ ) public { require( msg.sender == address(timelock), "GovernorAlpha::setVotingPeriod: invalid sender" ); require( votingPeriod_ >= 5760, "GovernorAlpha::setVotingPeriod: new voting period must exceed minimum" ); // The minimum number of blocks for a vote is ~1 day (assuming 15s blocks) votingPeriod = votingPeriod_; } function propose( address[] memory targets, uint[] memory values, string[] memory signatures, bytes[] memory calldatas, string memory title, string memory description ) public returns (uint) { require( msg.sender == guardian || _getVotes(msg.sender, sub256(block.number, 1)) > proposalThreshold, "GovernorAlpha::propose: proposer votes below proposal threshold" ); require( targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length, "GovernorAlpha::propose: proposal function information arity mismatch" ); require( targets.length != 0, "GovernorAlpha::propose: must provide actions" ); require( targets.length <= proposalMaxOperations(), "GovernorAlpha::propose: too many actions" ); uint latestProposalId = latestProposalIds[msg.sender]; if (latestProposalId != 0) { ProposalState proposersLatestProposalState = state(latestProposalId); require( proposersLatestProposalState != ProposalState.Active, "GovernorAlpha::propose: one live proposal per proposer, found an already active proposal" ); require( proposersLatestProposalState != ProposalState.Pending, "GovernorAlpha::propose: one live proposal per proposer, found an already pending proposal" ); } uint startBlock = add256(block.number, votingDelay()); uint endBlock = add256(startBlock, votingPeriod); proposalCount++; Proposal memory newProposal = Proposal({ id : proposalCount, proposer : msg.sender, eta : 0, targets : targets, values : values, signatures : signatures, calldatas : calldatas, startBlock : startBlock, endBlock : endBlock, forVotes : 0, againstVotes : 0, canceled : false, executed : false }); proposals[newProposal.id] = newProposal; latestProposalIds[newProposal.proposer] = newProposal.id; emit ProposalCreated(newProposal.id, msg.sender, targets, values, signatures, calldatas, startBlock, endBlock, title, description); return newProposal.id; } function queue( uint proposalId ) public { require( state(proposalId) == ProposalState.Succeeded, "GovernorAlpha::queue: proposal can only be queued if it is succeeded" ); Proposal storage proposal = proposals[proposalId]; uint eta = add256(block.timestamp, timelock.delay()); for (uint i = 0; i < proposal.targets.length; i++) { _queueOrRevert(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], eta); } proposal.eta = eta; emit ProposalQueued(proposalId, eta); } function _queueOrRevert( address target, uint value, string memory signature, bytes memory data, uint eta ) internal { require( !timelock.queuedTransactions(keccak256(abi.encode(target, value, signature, data, eta))), "GovernorAlpha::_queueOrRevert: proposal action already queued at eta" ); timelock.queueTransaction(target, value, signature, data, eta); } function execute( uint proposalId ) public payable { require( state(proposalId) == ProposalState.Queued, "GovernorAlpha::execute: proposal can only be executed if it is queued" ); Proposal storage proposal = proposals[proposalId]; proposal.executed = true; for (uint i = 0; i < proposal.targets.length; i++) { timelock.executeTransaction.value(proposal.values[i])( proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta ); } emit ProposalExecuted(proposalId); } function cancel( uint proposalId ) public { ProposalState state = state(proposalId); require( state != ProposalState.Executed, "GovernorAlpha::cancel: cannot cancel executed proposal" ); Proposal storage proposal = proposals[proposalId]; require( msg.sender == proposal.proposer || _getVotes(proposal.proposer, sub256(block.number, 1)) < proposalThreshold, "GovernorAlpha::cancel: proposer above threshold" ); proposal.canceled = true; for (uint i = 0; i < proposal.targets.length; i++) { timelock.cancelTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta); } emit ProposalCanceled(proposalId); } function getActions( uint proposalId ) public view returns (address[] memory targets, uint[] memory values, string[] memory signatures, bytes[] memory calldatas) { Proposal storage p = proposals[proposalId]; return (p.targets, p.values, p.signatures, p.calldatas); } function getReceipt(uint proposalId, address voter) public view returns (Receipt memory) { return proposals[proposalId].receipts[voter]; } function state( uint proposalId ) public view returns (ProposalState) { require( proposalCount >= proposalId && proposalId > 0, "GovernorAlpha::state: invalid proposal id" ); Proposal storage proposal = proposals[proposalId]; if (proposal.canceled) { return ProposalState.Canceled; } else if (block.number <= proposal.startBlock) { return ProposalState.Pending; } else if (block.number <= proposal.endBlock) { return ProposalState.Active; } else if (proposal.forVotes <= proposal.againstVotes || proposal.forVotes < quorumVotes) { return ProposalState.Defeated; } else if (proposal.eta == 0) { return ProposalState.Succeeded; } else if (proposal.executed) { return ProposalState.Executed; } else if (block.timestamp >= add256(proposal.eta, timelock.GRACE_PERIOD())) { return ProposalState.Expired; } else { return ProposalState.Queued; } } function castVote( uint proposalId, bool support ) public returns (uint128) { return _castVote(msg.sender, proposalId, support); } function castVoteBySig( uint proposalId, bool support, uint8 v, bytes32 r, bytes32 s ) public returns (uint128) { bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this))); bytes32 structHash = keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support)); bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); address signatory = ecrecover(digest, v, r, s); require( signatory != address(0), "GovernorAlpha::castVoteBySig: invalid signature" ); return _castVote(signatory, proposalId, support); } function _castVote( address voter, uint proposalId, bool support ) internal returns (uint128) { require( state(proposalId) == ProposalState.Active, "GovernorAlpha::_castVote: voting is closed" ); Proposal storage proposal = proposals[proposalId]; Receipt storage receipt = proposal.receipts[voter]; require( receipt.hasVoted == false, "GovernorAlpha::_castVote: voter already voted" ); uint128 votes = _getVotes(voter, proposal.startBlock); if (support) { proposal.forVotes = add256(proposal.forVotes, votes); } else { proposal.againstVotes = add256(proposal.againstVotes, votes); } receipt.hasVoted = true; receipt.support = support; receipt.votes = votes; emit VoteCast(voter, proposalId, support, votes); return votes; } function __acceptAdmin() public { require( msg.sender == guardian || msg.sender == address(timelock), "GovernorAlpha::__acceptAdmin: sender must be gov guardian or timelock" ); timelock.acceptAdmin(); } function __abdicate() public { require( msg.sender == guardian, "GovernorAlpha::__abdicate: sender must be gov guardian" ); guardian = address(0); } function __queueSetTimelockPendingAdmin( address newPendingAdmin, uint eta ) public { require( msg.sender == guardian, "GovernorAlpha::__queueSetTimelockPendingAdmin: sender must be gov guardian" ); timelock.queueTransaction(address(timelock), 0, "setPendingAdmin(address)", abi.encode(newPendingAdmin), eta); } function __executeSetTimelockPendingAdmin( address newPendingAdmin, uint eta ) public { require( msg.sender == guardian, "GovernorAlpha::__executeSetTimelockPendingAdmin: sender must be gov guardian" ); timelock.executeTransaction(address(timelock), 0, "setPendingAdmin(address)", abi.encode(newPendingAdmin), eta); } function _getVotes( address user, uint blockNumber ) internal view returns (uint128) { return dmg.getPriorVotes(user, blockNumber); } function add256(uint256 a, uint256 b) internal pure returns (uint) { uint c = a + b; require(c >= a, "GovernorAlpha::add256: ADDITION_OVERFLOW"); return c; } function sub256(uint256 a, uint256 b) internal pure returns (uint) { require(b <= a, "GovernorAlpha::add256: SUBTRACTION_UNDERFLOW"); return a - b; } function getChainId() internal pure returns (uint) { uint chainId; assembly {chainId := chainid()} return chainId; } } // File: contracts/governance/dmg/SafeBitMath.sol /* * Copyright 2020 DMM Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ pragma solidity ^0.5.0; library SafeBitMath { function safe64(uint n, string memory errorMessage) internal pure returns (uint64) { require(n < 2 ** 64, errorMessage); return uint64(n); } function safe128(uint n, string memory errorMessage) internal pure returns (uint128) { require(n < 2 ** 128, errorMessage); return uint128(n); } function add128(uint128 a, uint128 b, string memory errorMessage) internal pure returns (uint128) { uint128 c = a + b; require(c >= a, errorMessage); return c; } function add128(uint128 a, uint128 b) internal pure returns (uint128) { return add128(a, b, ""); } function sub128(uint128 a, uint128 b, string memory errorMessage) internal pure returns (uint128) { require(b <= a, errorMessage); return a - b; } function sub128(uint128 a, uint128 b) internal pure returns (uint128) { return sub128(a, b, ""); } } // File: @openzeppelin/upgrades/contracts/Initializable.sol pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File: contracts/protocol/interfaces/IOwnableOrGuardian.sol /* * Copyright 2020 DMM Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ pragma solidity ^0.5.0; /** * NOTE: THE STATE VARIABLES IN THIS CONTRACT CANNOT CHANGE NAME OR POSITION BECAUSE THIS CONTRACT IS USED IN * UPGRADEABLE CONTRACTS. */ contract IOwnableOrGuardian is Initializable { // ************************* // ***** Events // ************************* event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event GuardianTransferred(address indexed previousGuardian, address indexed newGuardian); // ************************* // ***** Modifiers // ************************* modifier onlyOwnerOrGuardian { require( msg.sender == _owner || msg.sender == _guardian, "OwnableOrGuardian: UNAUTHORIZED_OWNER_OR_GUARDIAN" ); _; } modifier onlyOwner { require( msg.sender == _owner, "OwnableOrGuardian: UNAUTHORIZED" ); _; } // ********************************************* // ***** State Variables DO NOT CHANGE OR MOVE // ********************************************* // ****************************** // ***** DO NOT CHANGE OR MOVE // ****************************** address internal _owner; address internal _guardian; // ****************************** // ***** DO NOT CHANGE OR MOVE // ****************************** // ****************************** // ***** Misc Functions // ****************************** function owner() external view returns (address) { return _owner; } function guardian() external view returns (address) { return _guardian; } // ****************************** // ***** Admin Functions // ****************************** function initialize( address __owner, address __guardian ) public initializer { _transferOwnership(__owner); _transferGuardian(__guardian); } function transferOwnership( address __owner ) public onlyOwner { require( __owner != address(0), "OwnableOrGuardian::transferOwnership: INVALID_OWNER" ); _transferOwnership(__owner); } function renounceOwnership() public onlyOwner { _transferOwnership(address(0)); } function transferGuardian( address __guardian ) public onlyOwner { require( __guardian != address(0), "OwnableOrGuardian::transferGuardian: INVALID_OWNER" ); _transferGuardian(__guardian); } function renounceGuardian() public onlyOwnerOrGuardian { _transferGuardian(address(0)); } // ****************************** // ***** Internal Functions // ****************************** function _transferOwnership( address __owner ) internal { address previousOwner = _owner; _owner = __owner; emit OwnershipTransferred(previousOwner, __owner); } function _transferGuardian( address __guardian ) internal { address previousGuardian = _guardian; _guardian = __guardian; emit GuardianTransferred(previousGuardian, __guardian); } } // File: contracts/external/asset_introducers/AssetIntroducerData.sol /* * Copyright 2020 DMM Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ pragma solidity ^0.5.0; contract AssetIntroducerData is Initializable, IOwnableOrGuardian { // ************************* // ***** Constants // ************************* // ************************* // ***** V1 State Variables // ************************* /// For preventing reentrancy attacks uint64 internal _guardCounter; AssetIntroducerStateV1 internal _assetIntroducerStateV1; ERC721StateV1 internal _erc721StateV1; VoteStateV1 internal _voteStateV1; // ************************* // ***** Data Structures // ************************* enum AssetIntroducerType { PRINCIPAL, AFFILIATE } struct AssetIntroducerStateV1 { /// The timestamp at which this contract was initialized uint64 initTimestamp; /// True if the DMM Foundation purchased its token for the bootstrapped pool, false otherwise. bool isDmmFoundationSetup; /// Total amount of DMG locked in this contract uint128 totalDmgLocked; /// For calculating the results of off-chain signature requests bytes32 domainSeparator; /// Address of the DMG token address dmg; /// Address of the DMM Controller address dmmController; /// Address of the DMM token valuator, which gets the USD value of a token address underlyingTokenValuator; /// Address of the implementation for the discount address assetIntroducerDiscount; /// Address of the implementation for the staking purchaser contract. Used to buy NFTs at a steep discount by /// staking mTokens. address stakingPurchaser; /// Mapping from NFT ID to the asset introducer struct. mapping(uint => AssetIntroducer) idToAssetIntroducer; /// Mapping from country code to asset introducer type to token IDs mapping(bytes3 => mapping(uint8 => uint[])) countryCodeToAssetIntroducerTypeToTokenIdsMap; /// A mapping from the country code to asset introducer type to the cost needed to buy one. The cost is represented /// in USD (with 18 decimals) and is purchased using DMG, so a conversion is needed using Chainlink. mapping(bytes3 => mapping(uint8 => uint96)) countryCodeToAssetIntroducerTypeToPriceUsd; /// The dollar amount that has actually been deployed by the asset introducer mapping(uint => mapping(address => uint)) tokenIdToUnderlyingTokenToWithdrawnAmount; /// Mapping for the count of each user's off-chain signed messages. 0-indexed. mapping(address => uint) ownerToNonceMap; } struct ERC721StateV1 { /// Total number of NFTs created uint64 totalSupply; /// The proxy address created by OpenSea, which is used to enable a smoother trading experience address openSeaProxyRegistry; /// The last token ID in the linked list. uint lastTokenId; /// The base URI for getting NFT information by token ID. string baseURI; /// Mapping of all token IDs. Works as a linked list such that previous key --> next value. The 0th key in the /// list is LINKED_LIST_GUARD. mapping(uint => uint) allTokens; /// Mapping from NFT ID to owner address. mapping(uint256 => address) idToOwnerMap; /// Mapping from NFT ID to approved address. mapping(uint256 => address) idToSpenderMap; /// Mapping from owner to an operator that can spend all of owner's NFTs. mapping(address => mapping(address => bool)) ownerToOperatorToIsApprovedMap; /// Mapping from owner address to all owned token IDs. Works as a linked list such that previous key --> next value. /// The 0th key in the list is LINKED_LIST_GUARD. mapping(address => mapping(uint => uint)) ownerToTokenIds; /// Mapping from owner address to a count of all owned NFTs. mapping(address => uint32) ownerToTokenCount; /// Mapping from an interface to whether or not it's supported. mapping(bytes4 => bool) interfaceIdToIsSupportedMap; } /// Used for storing information about voting struct VoteStateV1 { /// Taken from the DMG token implementation mapping(address => mapping(uint64 => Checkpoint)) ownerToCheckpointIndexToCheckpointMap; /// Taken from the DMG token implementation mapping(address => uint64) ownerToCheckpointCountMap; } /// Tightly-packed, this data structure is 2 slots; 64 bytes struct AssetIntroducer { bytes3 countryCode; AssetIntroducerType introducerType; /// True if the asset introducer has been purchased yet, false if it hasn't and is thus bool isOnSecondaryMarket; /// True if the asset introducer can withdraw tokens from mToken deposits, false if it cannot yet. This value /// must only be changed to `true` via governance vote bool isAllowedToWithdrawFunds; /// 1-based index at which the asset introducer was created. Used for optics uint16 serialNumber; uint96 dmgLocked; /// How much this asset introducer can manage uint96 dollarAmountToManage; uint tokenId; } /// Used for tracking delegation and number of votes each user has at a given block height. struct Checkpoint { uint64 fromBlock; uint128 votes; } /// Used to prevent the "stack too deep" error and make code more readable struct DmgApprovalStruct { address spender; uint rawAmount; uint nonce; uint expiry; uint8 v; bytes32 r; bytes32 s; } struct DiscountStruct { uint64 initTimestamp; } // ************************* // ***** Modifiers // ************************* modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require( localCounter == _guardCounter, "AssetIntroducerData: REENTRANCY" ); } /// Enforces that an NFT has NOT been sold to a user yet modifier requireIsPrimaryMarketNft(uint __tokenId) { require( !_assetIntroducerStateV1.idToAssetIntroducer[__tokenId].isOnSecondaryMarket, "AssetIntroducerData: IS_SECONDARY_MARKET" ); _; } /// Enforces that an NFT has been sold to a user modifier requireIsSecondaryMarketNft(uint __tokenId) { require( _assetIntroducerStateV1.idToAssetIntroducer[__tokenId].isOnSecondaryMarket, "AssetIntroducerData: IS_PRIMARY_MARKET" ); _; } modifier requireIsValidNft(uint __tokenId) { require( _erc721StateV1.idToOwnerMap[__tokenId] != address(0), "AssetIntroducerData: INVALID_NFT" ); _; } modifier requireIsNftOwner(uint __tokenId) { require( _erc721StateV1.idToOwnerMap[__tokenId] == msg.sender, "AssetIntroducerData: INVALID_NFT_OWNER" ); _; } modifier requireCanWithdrawFunds(uint __tokenId) { require( _assetIntroducerStateV1.idToAssetIntroducer[__tokenId].isAllowedToWithdrawFunds, "AssetIntroducerData: NFT_NOT_ACTIVATED" ); _; } modifier requireIsStakingPurchaser() { require( _assetIntroducerStateV1.stakingPurchaser != address(0), "AssetIntroducerData: STAKING_PURCHASER_NOT_SETUP" ); require( _assetIntroducerStateV1.stakingPurchaser == msg.sender, "AssetIntroducerData: INVALID_SENDER_FOR_STAKING" ); _; } } // File: contracts/external/asset_introducers/v1/IAssetIntroducerV1.sol /* * Copyright 2020 DMM Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ pragma solidity ^0.5.0; interface IAssetIntroducerV1 { // ************************* // ***** Events // ************************* event AssetIntroducerBought(uint indexed tokenId, address indexed buyer, address indexed recipient, uint dmgAmount); event AssetIntroducerActivationChanged(uint indexed tokenId, bool isActivated); event AssetIntroducerCreated(uint indexed tokenId, string countryCode, AssetIntroducerData.AssetIntroducerType introducerType, uint serialNumber); event AssetIntroducerDiscountChanged(address indexed oldAssetIntroducerDiscount, address indexed newAssetIntroducerDiscount); event AssetIntroducerDollarAmountToManageChange(uint indexed tokenId, uint oldDollarAmountToManage, uint newDollarAmountToManage); event AssetIntroducerPriceChanged(string indexed countryCode, AssetIntroducerData.AssetIntroducerType indexed introducerType, uint oldPriceUsd, uint newPriceUsd); event BaseURIChanged(string newBaseURI); event CapitalDeposited(uint indexed tokenId, address indexed token, uint amount); event CapitalWithdrawn(uint indexed tokenId, address indexed token, uint amount); event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); event InterestPaid(uint indexed tokenId, address indexed token, uint amount); event SignatureValidated(address indexed signer, uint nonce); event StakingPurchaserChanged(address indexed oldStakingPurchaser, address indexed newStakingPurchaser); // ************************* // ***** Admin Functions // ************************* function createAssetIntroducersForPrimaryMarket( string[] calldata countryCode, AssetIntroducerData.AssetIntroducerType[] calldata introducerType ) external returns (uint[] memory); function setDollarAmountToManageByTokenId( uint tokenId, uint dollarAmountToManage ) external; function setDollarAmountToManageByCountryCodeAndIntroducerType( string calldata countryCode, AssetIntroducerData.AssetIntroducerType introducerType, uint dollarAmountToManage ) external; function setAssetIntroducerDiscount( address assetIntroducerDiscount ) external; function setAssetIntroducerPrice( string calldata countryCode, AssetIntroducerData.AssetIntroducerType introducerType, uint priceUsd ) external; function activateAssetIntroducerByTokenId( uint tokenId ) external; function setStakingPurchaser( address stakingPurchaser ) external; // ************************* // ***** Misc Functions // ************************* /** * @return The timestamp at which this contract was created */ function initTimestamp() external view returns (uint64); function stakingPurchaser() external view returns (address); function openSeaProxyRegistry() external view returns (address); /** * @return The domain separator used in off-chain signatures. See EIP 712 for more: * https://eips.ethereum.org/EIPS/eip-712 */ function domainSeparator() external view returns (bytes32); /** * @return The address of the DMG token */ function dmg() external view returns (address); function dmmController() external view returns (address); function underlyingTokenValuator() external view returns (address); function assetIntroducerDiscount() external view returns (address); /** * @return The discount applied to the price of the asset introducer for being an early purchaser. Represented as * a number with 18 decimals, such that 0.1 * 1e18 == 10% */ function getAssetIntroducerDiscount() external view returns (uint); /** * @return The price of the asset introducer, represented in USD */ function getAssetIntroducerPriceUsdByTokenId( uint tokenId ) external view returns (uint); /** * @return The price of the asset introducer, represented in DMG. DMG is the needed currency to purchase an asset * introducer NFT. */ function getAssetIntroducerPriceDmgByTokenId( uint tokenId ) external view returns (uint); function getAssetIntroducerPriceUsdByCountryCodeAndIntroducerType( string calldata countryCode, AssetIntroducerData.AssetIntroducerType introducerType ) external view returns (uint); function getAssetIntroducerPriceDmgByCountryCodeAndIntroducerType( string calldata countryCode, AssetIntroducerData.AssetIntroducerType introducerType ) external view returns (uint); /** * @return The total amount of DMG locked in the asset introducer reserves */ function getTotalDmgLocked() external view returns (uint); /** * @return The amount that this asset introducer can manager, represented in wei format (a number with 18 * decimals). Meaning, 10,000.25 * 1e18 == $10,000.25 */ function getDollarAmountToManageByTokenId( uint tokenId ) external view returns (uint); /** * @return The amount of DMG that this asset introducer has locked in order to maintain a valid status as an asset * introducer. */ function getDmgLockedByTokenId( uint tokenId ) external view returns (uint); function getAssetIntroducerByTokenId( uint tokenId ) external view returns (AssetIntroducerData.AssetIntroducer memory); function getAssetIntroducersByCountryCode( string calldata countryCode ) external view returns (AssetIntroducerData.AssetIntroducer[] memory); function getAllAssetIntroducers() external view returns (AssetIntroducerData.AssetIntroducer[] memory); function getPrimaryMarketAssetIntroducers() external view returns (AssetIntroducerData.AssetIntroducer[] memory); function getSecondaryMarketAssetIntroducers() external view returns (AssetIntroducerData.AssetIntroducer[] memory); // ************************* // ***** User Functions // ************************* function getNonceByUser( address user ) external view returns (uint); function getNextAssetIntroducerTokenId( string calldata __countryCode, AssetIntroducerData.AssetIntroducerType __introducerType ) external view returns (uint); /** * Buys the slot for the appropriate amount of DMG, by attempting to transfer the DMG from `msg.sender` to this * contract */ function buyAssetIntroducerSlot( uint tokenId ) external returns (bool); /** * Buys the slot for the appropriate amount of DMG, by attempting to transfer the DMG from `msg.sender` to this * contract. The additional discount is added to the existing one */ function buyAssetIntroducerSlotViaStaking( uint tokenId, uint additionalDiscount ) external returns (bool); function nonceOf( address user ) external view returns (uint); function buyAssetIntroducerSlotBySig( uint tokenId, address recipient, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external returns (bool); function buyAssetIntroducerSlotBySigWithDmgPermit( uint __tokenId, address __recipient, uint __nonce, uint __expiry, uint8 __v, bytes32 __r, bytes32 __s, AssetIntroducerData.DmgApprovalStruct calldata dmgApprovalStruct ) external returns (bool); function getPriorVotes( address user, uint blockNumber ) external view returns (uint128); function getCurrentVotes( address user ) external view returns (uint); function getDmgLockedByUser( address user ) external view returns (uint); /** * @return The amount of capital that has been withdrawn by this asset introducer, denominated in USD with 18 * decimals */ function getDeployedCapitalUsdByTokenId( uint tokenId ) external view returns (uint); function getWithdrawnAmountByTokenIdAndUnderlyingToken( uint tokenId, address underlyingToken ) external view returns (uint); /** * @dev Deactivates the specified asset introducer from being able to withdraw funds. Doing so enables it to * be transferred. NOTE: NFTs can only be deactivated once all deployed capital is returned. */ function deactivateAssetIntroducerByTokenId( uint tokenId ) external; function withdrawCapitalByTokenIdAndToken( uint tokenId, address token, uint amount ) external; function depositCapitalByTokenIdAndToken( uint tokenId, address token, uint amount ) external; function payInterestByTokenIdAndToken( uint tokenId, address token, uint amount ) external; // ************************* // ***** Other Functions // ************************* /** * @dev Used by the DMMF to buy its token and initialize it based upon its usage of the protocol prior to the NFT * system having been created. We are passing through the USDC token specifically, because it was drawn down * by 300,000 early in the system's maturity to run a full cycle of the system and do a small allocation to * the bootstrapped asset pool. */ function buyDmmFoundationToken( uint tokenId, address usdcToken ) external returns (bool); function isDmmFoundationSetup() external view returns (bool); } // File: contracts/governance/governors/GovernorBeta.sol /* * Copyright 2020 DMM Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ pragma solidity ^0.5.13; contract GovernorBeta is GovernorAlpha { using SafeBitMath for uint128; event LocalOperatorSet(address indexed voter, address indexed operator, bool isTrusted); event GlobalOperatorSet(address indexed operator, bool isTrusted); modifier onlyTrustedOperator(address voter) { require( msg.sender == voter || _globalOperatorToIsSupportedMap[msg.sender] || _voterToLocalOperatorToIsSupportedMap[voter][msg.sender], "GovernorBeta: UNAUTHORIZED_OPERATOR" ); _; } IAssetIntroducerV1 public assetIntroducerProxy; mapping(address => mapping(address => bool)) internal _voterToLocalOperatorToIsSupportedMap; mapping(address => bool) internal _globalOperatorToIsSupportedMap; constructor( address __assetIntroducerProxy, address __dmg, address __guardian ) public GovernorAlpha(__dmg, __guardian) { assetIntroducerProxy = IAssetIntroducerV1(__assetIntroducerProxy); } // ************************* // ***** Admin Functions // ************************* function setGlobalOperator( address __operator, bool __isTrusted ) public { require( address(timelock) == msg.sender, "GovernorBeta::setGlobalOperator: UNAUTHORIZED" ); _globalOperatorToIsSupportedMap[__operator] = __isTrusted; emit GlobalOperatorSet(__operator, __isTrusted); } function __acceptAdmin() public { require( msg.sender == address(timelock), "GovernorBeta::__acceptAdmin: sender must be timelock" ); timelock.acceptAdmin(); } function __queueSetTimelockPendingAdmin( address, uint ) public { // The equivalent of this function should be called via governance proposal execution revert("GovernorBeta::__queueSetTimelockPendingAdmin: NOT_USED"); } function __executeSetTimelockPendingAdmin( address, uint ) public { // The equivalent of this function should be called via governance proposal execution revert("GovernorBeta::__executeSetTimelockPendingAdmin: NOT_USED"); } // ************************* // ***** User Functions // ************************* function setLocalOperator( address __operator, bool __isTrusted ) public { _voterToLocalOperatorToIsSupportedMap[msg.sender][__operator] = __isTrusted; emit LocalOperatorSet(msg.sender, __operator, __isTrusted); } /** * Can be called by a global operator or local operator on behalf of `voter` to cast votes on `voter`'s behalf. * * This function is mainly used to wrap around voting functionality with a proxy contract to perform additional * logic before or after voting. * * @return The amount of votes the user casted in favor of or against the proposal. */ function castVote( address __voter, uint __proposalId, bool __support ) onlyTrustedOperator(__voter) public returns (uint128) { return _castVote(__voter, __proposalId, __support); } // ************************* // ***** Misc Functions // ************************* function getIsLocalOperator( address __voter, address __operator ) public view returns (bool) { return _voterToLocalOperatorToIsSupportedMap[__voter][__operator]; } function getIsGlobalOperator( address __operator ) public view returns (bool) { return _globalOperatorToIsSupportedMap[__operator]; } // ************************* // ***** Internal Functions // ************************* function _getVotes( address __user, uint __blockNumber ) internal view returns (uint128) { return SafeBitMath.add128( super._getVotes(__user, __blockNumber), assetIntroducerProxy.getPriorVotes(__user, __blockNumber) ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"__assetIntroducerProxy","type":"address"},{"internalType":"address","name":"__dmg","type":"address"},{"internalType":"address","name":"__guardian","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"isTrusted","type":"bool"}],"name":"GlobalOperatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"isTrusted","type":"bool"}],"name":"LocalOperatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ProposalCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"proposer","type":"address"},{"indexed":false,"internalType":"address[]","name":"targets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"string[]","name":"signatures","type":"string[]"},{"indexed":false,"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"string","name":"title","type":"string"},{"indexed":false,"internalType":"string","name":"description","type":"string"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"ProposalQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"},{"indexed":false,"internalType":"uint256","name":"votes","type":"uint256"}],"name":"VoteCast","type":"event"},{"constant":true,"inputs":[],"name":"BALLOT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"__abdicate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"__acceptAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"__executeSetTimelockPendingAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"__queueSetTimelockPendingAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"assetIntroducerProxy","outputs":[{"internalType":"contract IAssetIntroducerV1","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"__voter","type":"address"},{"internalType":"uint256","name":"__proposalId","type":"uint256"},{"internalType":"bool","name":"__support","type":"bool"}],"name":"castVote","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"castVote","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"castVoteBySig","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dmg","outputs":[{"internalType":"contract IDMGToken","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getActions","outputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"__operator","type":"address"}],"name":"getIsGlobalOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"__voter","type":"address"},{"internalType":"address","name":"__operator","type":"address"}],"name":"getIsLocalOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getReceipt","outputs":[{"components":[{"internalType":"bool","name":"hasVoted","type":"bool"},{"internalType":"bool","name":"support","type":"bool"},{"internalType":"uint128","name":"votes","type":"uint128"}],"internalType":"struct GovernorAlphaData.Receipt","name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"timelock_","type":"address"}],"name":"initializeTimelock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestProposalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proposalMaxOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"proposalThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint256","name":"eta","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"description","type":"string"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"queue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"quorumVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"__operator","type":"address"},{"internalType":"bool","name":"__isTrusted","type":"bool"}],"name":"setGlobalOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"__operator","type":"address"},{"internalType":"bool","name":"__isTrusted","type":"bool"}],"name":"setLocalOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalThreshold_","type":"uint256"}],"name":"setProposalThreshold","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"quorumVotes_","type":"uint256"}],"name":"setQuorumVotes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"votingPeriod_","type":"uint256"}],"name":"setVotingPeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"state","outputs":[{"internalType":"enum GovernorAlphaData.ProposalState","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"timelock","outputs":[{"internalType":"contract ITimelockInterface","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"votingDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"votingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003ff238038062003ff28339810160408190526200003491620000af565b600180546001600160a01b039384166001600160a01b03199182161790915560028054928416928216929092179091556969e10de76676d080000060045569152d02c7e14af6800000600555614380600655600980549390921692169190911790556200012f565b8051620000a98162000115565b92915050565b600080600060608486031215620000c557600080fd5b6000620000d386866200009c565b9350506020620000e6868287016200009c565b9250506040620000f9868287016200009c565b9150509250925092565b60006001600160a01b038216620000a9565b620001208162000103565b81146200012c57600080fd5b50565b613eb3806200013f6000396000f3fe60806040526004361061021a5760003560e01c806340e58ee511610123578063b58131b0116100ab578063deaaa7cc1161006f578063deaaa7cc14610610578063e23a9a5214610625578063ea0217cf14610652578063ece40cc114610672578063fe0d94c1146106925761021a565b8063b58131b01461059c578063b9a61961146105b1578063d33219b4146105c6578063da35c664146105db578063ddf0b009146105f05761021a565b8063490145c8116100f2578063490145c814610512578063760fbc13146105325780637bdbe4d014610547578063915006711461055c578063b4959e721461057c5761021a565b806340e58ee514610490578063452a9320146104b05780634634c61f146104d257806346d256c5146104f25761021a565b806317977c61116101a65780632aab8c89116101755780632aab8c89146103e9578063328dd982146103fe5780633932abb11461042e5780633a031bf0146104435780633e4f49e6146104635761021a565b806317977c611461037f57806320606b701461039f57806321f43e42146103b457806324bc1a64146103d45761021a565b8063052f72d7116101ed578063052f72d7146102c357806306fdde03146102f057806311c670281461031257806312d320c51461033257806315373e3d1461035f5761021a565b8063013cf08b1461021f57806302a251a31461025d57806302ec8f9e1461027f57806304c02c0e146102a1575b600080fd5b34801561022b57600080fd5b5061023f61023a366004612895565b6106a5565b60405161025499989796959493929190613c77565b60405180910390f35b34801561026957600080fd5b50610272610701565b6040516102549190613900565b34801561028b57600080fd5b5061029f61029a366004612895565b610707565b005b3480156102ad57600080fd5b506102b661073f565b60405161025491906139a0565b3480156102cf57600080fd5b506102e36102de3660046125e3565b61074e565b60405161025491906138f2565b3480156102fc57600080fd5b50610305610770565b60405161025491906139bc565b34801561031e57600080fd5b5061029f61032d3660046125e3565b61079e565b34801561033e57600080fd5b5061035261034d3660046126a3565b610813565b6040516102549190613bab565b34801561036b57600080fd5b5061035261037a3660046128d2565b61089a565b34801561038b57600080fd5b5061027261039a3660046125e3565b6108b0565b3480156103ab57600080fd5b506102726108c2565b3480156103c057600080fd5b5061029f6103cf366004612673565b6108d9565b3480156103e057600080fd5b506102726108f1565b3480156103f557600080fd5b506102b66108f7565b34801561040a57600080fd5b5061041e610419366004612895565b610906565b60405161025494939291906138a5565b34801561043a57600080fd5b50610272610b95565b34801561044f57600080fd5b506102e361045e366004612609565b610b9b565b34801561046f57600080fd5b5061048361047e366004612895565b610bc9565b60405161025491906139ae565b34801561049c57600080fd5b5061029f6104ab366004612895565b610d45565b3480156104bc57600080fd5b506104c5610f3b565b60405161025491906137b6565b3480156104de57600080fd5b506103526104ed3660046128f1565b610f4a565b3480156104fe57600080fd5b5061029f61050d366004612643565b6110e0565b34801561051e57600080fd5b5061027261052d3660046126f0565b61116a565b34801561053e57600080fd5b5061029f611521565b34801561055357600080fd5b5061027261155d565b34801561056857600080fd5b5061029f610577366004612673565b611562565b34801561058857600080fd5b5061029f610597366004612643565b61157a565b3480156105a857600080fd5b506102726115e9565b3480156105bd57600080fd5b5061029f6115ef565b3480156105d257600080fd5b506102b6611674565b3480156105e757600080fd5b50610272611683565b3480156105fc57600080fd5b5061029f61060b366004612895565b611689565b34801561061c57600080fd5b506102726118f7565b34801561063157600080fd5b506106456106403660046128b3565b611903565b6040516102549190613b9d565b34801561065e57600080fd5b5061029f61066d366004612895565b61196f565b34801561067e57600080fd5b5061029f61068d366004612895565b6119c0565b61029f6106a0366004612895565b6119ef565b60076020819052600091825260409091208054600182015460028301549383015460088401546009850154600a860154600b9096015494966001600160a01b039094169593949293919290919060ff8082169161010090041689565b60065481565b6000546001600160a01b0316331461073a5760405162461bcd60e51b815260040161073190613b7d565b60405180910390fd5b600455565b6009546001600160a01b031681565b6001600160a01b0381166000908152600b602052604090205460ff165b919050565b60405180604001604052806012815260200171444d4d20476f7665726e6f7220416c70686160701b81525081565b6002546001600160a01b031633146107c85760405162461bcd60e51b8152600401610731906139ed565b6000546001600160a01b0316156107f15760405162461bcd60e51b815260040161073190613a1d565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600083336001600160a01b038216148061083c5750336000908152600b602052604090205460ff165b8061086a57506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b6108865760405162461bcd60e51b815260040161073190613a3d565b610891858585611bb4565b95945050505050565b60006108a7338484611bb4565b90505b92915050565b60086020526000908152604090205481565b6040516108ce906137a0565b604051809103902081565b60405162461bcd60e51b815260040161073190613a6d565b60045481565b6001546001600160a01b031681565b6060806060806000600760008781526020019081526020016000209050806003018160040182600501836006018380548060200260200160405190810160405280929190818152602001828054801561098857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161096a575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156109da57602002820191906000526020600020905b8154815260200190600101908083116109c6575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610aad5760008481526020908190208301805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b505050505081526020019060010190610a02565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610b7f5760008481526020908190208301805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610b6b5780601f10610b4057610100808354040283529160200191610b6b565b820191906000526020600020905b815481529060010190602001808311610b4e57829003601f168201915b505050505081526020019060010190610ad4565b5050505090509450945094509450509193509193565b60015b90565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b60008160035410158015610bdd5750600082115b610bf95760405162461bcd60e51b815260040161073190613a0d565b6000828152600760205260409020600b81015460ff1615610c1e57600291505061076b565b80600701544311610c3357600091505061076b565b80600801544311610c4857600191505061076b565b80600a01548160090154111580610c6457506004548160090154105b15610c7357600391505061076b565b6002810154610c8657600491505061076b565b600b810154610100900460ff1615610ca257600791505061076b565b6002810154600054604080516360d143f160e11b81529051610d2b93926001600160a01b03169163c1a287e2916004808301926020929190829003018186803b158015610cee57600080fd5b505afa158015610d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d269190810190612824565b611d11565b4210610d3b57600691505061076b565b600591505061076b565b6000610d5082610bc9565b90506007816007811115610d6057fe5b1415610d7e5760405162461bcd60e51b815260040161073190613b4d565b600082815260076020526040902060018101546001600160a01b0316331480610dd65750600554600180830154610dcb916001600160a01b0390911690610dc6904390611d36565b611d5e565b6001600160801b0316105b610df25760405162461bcd60e51b815260040161073190613abd565b600b8101805460ff1916600117905560005b6003820154811015610efe576000546003830180546001600160a01b039092169163591fcdfe919084908110610e3657fe5b6000918252602090912001546004850180546001600160a01b039092169185908110610e5e57fe5b9060005260206000200154856005018581548110610e7857fe5b90600052602060002001866006018681548110610e9157fe5b9060005260206000200187600201546040518663ffffffff1660e01b8152600401610ec0959493929190613864565b600060405180830381600087803b158015610eda57600080fd5b505af1158015610eee573d6000803e3d6000fd5b505060019092019150610e049050565b507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c83604051610f2e9190613900565b60405180910390a1505050565b6002546001600160a01b031681565b600080604051610f59906137a0565b604080519182900382208282019091526012825271444d4d20476f7665726e6f7220416c70686160701b6020909201919091527f782228f4a48d65779a8fbcebcc728b9876a1f0bf928fad4390fd1367e2906573610fb5611df4565b30604051602001610fc9949392919061390e565b6040516020818303038152906040528051906020012090506000604051610fef906137ab565b604051908190038120611008918a908a90602001613943565b6040516020818303038152906040528051906020012090506000828260405160200161103592919061376f565b604051602081830303815290604052805190602001209050600060018289898960405160008152602001604052604051611072949392919061396b565b6020604051602081039080840390855afa158015611094573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110c75760405162461bcd60e51b815260040161073190613b1d565b6110d2818b8b611bb4565b9a9950505050505050505050565b6000546001600160a01b0316331461110a5760405162461bcd60e51b815260040161073190613aad565b6001600160a01b0382166000818152600b602052604090819020805460ff1916841515179055517fa6efca93f94be6d527ba1bea9555e6d7976b93ea663120fdecc8510a4c8781759061115e9084906138f2565b60405180910390a25050565b6002546000906001600160a01b031633148061119e575060055461119333610dc6436001611d36565b6001600160801b0316115b6111ba5760405162461bcd60e51b815260040161073190613b0d565b855187511480156111cc575084518751145b80156111d9575083518751145b6111f55760405162461bcd60e51b815260040161073190613a9d565b86516112135760405162461bcd60e51b815260040161073190613afd565b61121b61155d565b8751111561123b5760405162461bcd60e51b815260040161073190613a8d565b3360009081526008602052604090205480156112b857600061125c82610bc9565b9050600181600781111561126c57fe5b141561128a5760405162461bcd60e51b815260040161073190613b3d565b600081600781111561129857fe5b14156112b65760405162461bcd60e51b815260040161073190613a4d565b505b60006112c643610d26610b95565b905060006112d682600654611d11565b60038054600101905590506112e961202d565b604051806101a001604052806003548152602001336001600160a01b03168152602001600081526020018c81526020018b81526020018a815260200189815260200184815260200183815260200160008152602001600081526020016000151581526020016000151581525090508060076000836000015181526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015560608201518160030190805190602001906113cc9291906120a2565b50608082015180516113e8916004840191602090910190612107565b5060a0820151805161140491600584019160209091019061214e565b5060c082015180516114209160068401916020909101906121a7565b5060e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b0160006101000a81548160ff02191690831515021790555061018082015181600b0160016101000a81548160ff02191690831515021790555090505080600001516008600083602001516001600160a01b03166001600160a01b03168152602001908152602001600020819055507fb88787ccad609a4d41058c8a0928927dd2516296c139d218d1e9131c2c219bd38160000151338d8d8d8d89898f8f6040516115089a99989796959493929190613bb9565b60405180910390a15193505050505b9695505050505050565b6002546001600160a01b0316331461154b5760405162461bcd60e51b815260040161073190613b8d565b600280546001600160a01b0319169055565b600a90565b60405162461bcd60e51b815260040161073190613a5d565b336000818152600a602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907fb77b2072ad835753fcf96849f2997d0762c972493aca380defd7f5b450b59040906115dd9085906138f2565b60405180910390a35050565b60055481565b6000546001600160a01b031633146116195760405162461bcd60e51b815260040161073190613b5d565b6000805460408051630e18b68160e01b815290516001600160a01b0390921692630e18b6819260048084019382900301818387803b15801561165a57600080fd5b505af115801561166e573d6000803e3d6000fd5b50505050565b6000546001600160a01b031681565b60035481565b600461169482610bc9565b600781111561169f57fe5b146116bc5760405162461bcd60e51b8152600401610731906139cd565b600081815260076020908152604080832083548251630d48571f60e31b815292519194936117159342936001600160a01b0390931692636a42b8f892600480840193919291829003018186803b158015610cee57600080fd5b905060005b60038301548110156118bd576118b583600301828154811061173857fe5b6000918252602090912001546004850180546001600160a01b03909216918490811061176057fe5b906000526020600020015485600501848154811061177a57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156118085780601f106117dd57610100808354040283529160200191611808565b820191906000526020600020905b8154815290600101906020018083116117eb57829003601f168201915b505050505086600601858154811061181c57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156118aa5780601f1061187f576101008083540402835291602001916118aa565b820191906000526020600020905b81548152906001019060200180831161188d57829003601f168201915b505050505086611df8565b60010161171a565b50600282018190556040517f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda289290610f2e9085908490613cef565b6040516108ce906137ab565b61190b612200565b5060009182526007602090815260408084206001600160a01b03939093168452600c9092018152918190208151606081018352905460ff80821615158352610100820416151593820193909352620100009092046001600160801b03169082015290565b6000546001600160a01b031633146119995760405162461bcd60e51b815260040161073190613a7d565b6116808110156119bb5760405162461bcd60e51b815260040161073190613acd565b600655565b6000546001600160a01b031633146119ea5760405162461bcd60e51b8152600401610731906139fd565b600555565b60056119fa82610bc9565b6007811115611a0557fe5b14611a225760405162461bcd60e51b8152600401610731906139dd565b6000818152600760205260408120600b8101805461ff001916610100179055905b6003820154811015611b78576000546004830180546001600160a01b0390921691630825f38f919084908110611a7557fe5b9060005260206000200154846003018481548110611a8f57fe5b6000918252602090912001546004860180546001600160a01b039092169186908110611ab757fe5b9060005260206000200154866005018681548110611ad157fe5b90600052602060002001876006018781548110611aea57fe5b9060005260206000200188600201546040518763ffffffff1660e01b8152600401611b19959493929190613864565b6000604051808303818588803b158015611b3257600080fd5b505af1158015611b46573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052611b6f9190810190612842565b50600101611a43565b507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611ba89190613900565b60405180910390a15050565b60006001611bc184610bc9565b6007811115611bcc57fe5b14611be95760405162461bcd60e51b815260040161073190613b6d565b60008381526007602090815260408083206001600160a01b0388168452600c8101909252909120805460ff1615611c325760405162461bcd60e51b815260040161073190613a2d565b6000611c42878460070154611d5e565b90508415611c6b57611c618360090154826001600160801b0316611d11565b6009840155611c88565b611c8283600a0154826001600160801b0316611d11565b600a8401555b8154600160ff199091161761ff001916610100861515021771ffffffffffffffffffffffffffffffff00001916620100006001600160801b038316021782556040517f877856338e13f63d0c36822ff0ef736b80934cd90574a3a5bc9262c39d217c4690611cfd9089908990899086906137df565b60405180910390a1925050505b9392505050565b6000828201838110156108a75760405162461bcd60e51b815260040161073190613aed565b600082821115611d585760405162461bcd60e51b815260040161073190613b2d565b50900390565b60006108a7611d6d8484611f57565b60095460405163782d6fe160e01b81526001600160a01b039091169063782d6fe190611d9f90889088906004016137c4565b60206040518083038186803b158015611db757600080fd5b505afa158015611dcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611def9190810190612877565b611fda565b4690565b6000546040516001600160a01b039091169063f2b0653790611e269088908890889088908890602001613814565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b8152600401611e589190613900565b60206040518083038186803b158015611e7057600080fd5b505afa158015611e84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ea89190810190612806565b15611ec55760405162461bcd60e51b815260040161073190613add565b600054604051633a66f90160e01b81526001600160a01b0390911690633a66f90190611efd9088908890889088908890600401613814565b602060405180830381600087803b158015611f1757600080fd5b505af1158015611f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f4f9190810190612824565b505050505050565b60015460405163782d6fe160e01b81526000916001600160a01b03169063782d6fe190611f8a90869086906004016137c4565b60206040518083038186803b158015611fa257600080fd5b505afa158015611fb6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108a79190810190612877565b60006108a78383604051806020016040528060008152506000838301826001600160801b0380871690831610156120245760405162461bcd60e51b815260040161073191906139bc565b50949350505050565b604051806101a001604052806000815260200160006001600160a01b031681526020016000815260200160608152602001606081526020016060815260200160608152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090565b8280548282559060005260206000209081019282156120f7579160200282015b828111156120f757825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906120c2565b50612103929150612220565b5090565b828054828255906000526020600020908101928215612142579160200282015b82811115612142578251825591602001919060010190612127565b50612103929150612244565b82805482825590600052602060002090810192821561219b579160200282015b8281111561219b578251805161218b91849160209091019061225e565b509160200191906001019061216e565b506121039291506122cb565b8280548282559060005260206000209081019282156121f4579160200282015b828111156121f457825180516121e491849160209091019061225e565b50916020019190600101906121c7565b506121039291506122ee565b604080516060810182526000808252602082018190529181019190915290565b610b9891905b808211156121035780546001600160a01b0319168155600101612226565b610b9891905b80821115612103576000815560010161224a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061229f57805160ff1916838001178555612142565b828001600101855582156121425791820182811115612142578251825591602001919060010190612127565b610b9891905b808211156121035760006122e58282612311565b506001016122d1565b610b9891905b808211156121035760006123088282612311565b506001016122f4565b50805460018160011615610100020316600290046000825580601f106123375750612355565b601f0160209004906000526020600020908101906123559190612244565b50565b80356108aa81613e38565b600082601f83011261237457600080fd5b813561238761238282613d24565b613cfd565b915081818352602084019350602081019050838560208402820111156123ac57600080fd5b60005b838110156123d857816123c28882612358565b84525060209283019291909101906001016123af565b5050505092915050565b600082601f8301126123f357600080fd5b813561240161238282613d24565b81815260209384019390925082018360005b838110156123d857813586016124298882612538565b8452506020928301929190910190600101612413565b600082601f83011261245057600080fd5b813561245e61238282613d24565b81815260209384019390925082018360005b838110156123d857813586016124868882612538565b8452506020928301929190910190600101612470565b600082601f8301126124ad57600080fd5b81356124bb61238282613d24565b915081818352602084019350602081019050838560208402820111156124e057600080fd5b60005b838110156123d857816124f68882612522565b84525060209283019291909101906001016124e3565b80356108aa81613e4c565b80516108aa81613e4c565b80356108aa81613e55565b80516108aa81613e55565b600082601f83011261254957600080fd5b813561255761238282613d45565b9150808252602083016020830185838301111561257357600080fd5b61257e838284613dec565b50505092915050565b600082601f83011261259857600080fd5b81516125a661238282613d45565b915080825260208301602083018583830111156125c257600080fd5b61257e838284613df8565b80516108aa81613e5e565b80356108aa81613e67565b6000602082840312156125f557600080fd5b60006126018484612358565b949350505050565b6000806040838503121561261c57600080fd5b60006126288585612358565b925050602061263985828601612358565b9150509250929050565b6000806040838503121561265657600080fd5b60006126628585612358565b92505060206126398582860161250c565b6000806040838503121561268657600080fd5b60006126928585612358565b925050602061263985828601612522565b6000806000606084860312156126b857600080fd5b60006126c48686612358565b93505060206126d586828701612522565b92505060406126e68682870161250c565b9150509250925092565b60008060008060008060c0878903121561270957600080fd5b863567ffffffffffffffff81111561272057600080fd5b61272c89828a01612363565b965050602087013567ffffffffffffffff81111561274957600080fd5b61275589828a0161249c565b955050604087013567ffffffffffffffff81111561277257600080fd5b61277e89828a0161243f565b945050606087013567ffffffffffffffff81111561279b57600080fd5b6127a789828a016123e2565b935050608087013567ffffffffffffffff8111156127c457600080fd5b6127d089828a01612538565b92505060a087013567ffffffffffffffff8111156127ed57600080fd5b6127f989828a01612538565b9150509295509295509295565b60006020828403121561281857600080fd5b60006126018484612517565b60006020828403121561283657600080fd5b6000612601848461252d565b60006020828403121561285457600080fd5b815167ffffffffffffffff81111561286b57600080fd5b61260184828501612587565b60006020828403121561288957600080fd5b600061260184846125cd565b6000602082840312156128a757600080fd5b60006126018484612522565b600080604083850312156128c657600080fd5b60006126288585612522565b600080604083850312156128e557600080fd5b60006126628585612522565b600080600080600060a0868803121561290957600080fd5b60006129158888612522565b95505060206129268882890161250c565b9450506040612937888289016125d8565b935050606061294888828901612522565b925050608061295988828901612522565b9150509295509295909350565b600061297283836129a1565b505060200190565b60006108a78383612b43565b60006129728383612b29565b61299b81613dc4565b82525050565b61299b81613d8c565b60006129b582613d7f565b6129bf8185613d83565b93506129ca83613d6d565b8060005b838110156129f85781516129e28882612966565b97506129ed83613d6d565b9250506001016129ce565b509495945050505050565b6000612a0e82613d7f565b612a188185613d83565b935083602082028501612a2a85613d6d565b8060005b85811015612a645784840389528151612a47858261297a565b9450612a5283613d6d565b60209a909a0199925050600101612a2e565b5091979650505050505050565b6000612a7c82613d7f565b612a868185613d83565b935083602082028501612a9885613d6d565b8060005b85811015612a645784840389528151612ab5858261297a565b9450612ac083613d6d565b60209a909a0199925050600101612a9c565b6000612add82613d7f565b612ae78185613d83565b9350612af283613d6d565b8060005b838110156129f8578151612b0a8882612986565b9750612b1583613d6d565b925050600101612af6565b61299b81613d97565b61299b81610b98565b61299b612b3e82610b98565b610b98565b6000612b4e82613d7f565b612b588185613d83565b9350612b68818560208601613df8565b612b7181613e24565b9093019392505050565b600081546001811660008114612b985760018114612bbe57612bfd565b607f6002830416612ba98187613d83565b60ff1984168152955050602085019250612bfd565b60028204612bcc8187613d83565b9550612bd785613d73565b60005b82811015612bf657815488820152600190910190602001612bda565b8701945050505b505092915050565b61299b81613dcb565b61299b81613dd6565b6000612c24604483613d83565b7f476f7665726e6f72416c7068613a3a71756575653a2070726f706f73616c206381527f616e206f6e6c79206265207175657565642069662069742069732073756363656020820152631959195960e21b604082015260600192915050565b6000612c90604583613d83565b7f476f7665726e6f72416c7068613a3a657865637574653a2070726f706f73616c81527f2063616e206f6e6c7920626520657865637574656420696620697420697320716020820152641d595d595960da1b604082015260600192915050565b6000612cfd603383613d83565b7f476f7665726e6f72416c7068613a3a73657454696d656c6f636b3a2043616c6c81527232b91036bab9ba1031329033bab0b93234b0b760691b602082015260400192915050565b6000612d52603383613d83565b7f476f7665726e6f72416c7068613a3a73657450726f706f73616c54687265736881527237b6321d1034b73b30b634b21039b2b73232b960691b602082015260400192915050565b6000612da760028361076b565b61190160f01b815260020192915050565b6000612dc5602983613d83565b7f476f7665726e6f72416c7068613a3a73746174653a20696e76616c69642070728152681bdc1bdcd85b081a5960ba1b602082015260400192915050565b6000612e10604083613d83565b7f476f7665726e6f72416c7068613a3a73657454696d656c6f636b3a2074696d6581527f6c6f636b206d757374206e6f7420626520696e697469616c697a656420796574602082015260400192915050565b6000612e6f602d83613d83565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f7465722081526c185b1c9958591e481d9bdd1959609a1b602082015260400192915050565b6000612ebe602383613d83565b7f476f7665726e6f72426574613a20554e415554484f52495a45445f4f504552418152622a27a960e91b602082015260400192915050565b6000612f03605983613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766581527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000604082015260600192915050565b6000612f88603683613d83565b7f476f7665726e6f72426574613a3a5f5f717565756553657454696d656c6f636b81527514195b991a5b99d0591b5a5b8e881393d517d554d15160521b602082015260400192915050565b6000612fe0603883613d83565b7f476f7665726e6f72426574613a3a5f5f6578656375746553657454696d656c6f81527f636b50656e64696e6741646d696e3a204e4f545f555345440000000000000000602082015260400192915050565b600061303f602e83613d83565b7f476f7665726e6f72416c7068613a3a736574566f74696e67506572696f643a2081526d34b73b30b634b21039b2b73232b960911b602082015260400192915050565b600061308f602883613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a20746f6f206d616e7981526720616374696f6e7360c01b602082015260400192915050565b60006130d960438361076b565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430192915050565b600061314460278361076b565b7f42616c6c6f742875696e743235362070726f706f73616c49642c626f6f6c20738152667570706f72742960c81b602082015260270192915050565b600061318d604483613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73616c81527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d6020820152630c2e8c6d60e31b604082015260600192915050565b60006131f9602d83613d83565b7f476f7665726e6f72426574613a3a736574476c6f62616c4f70657261746f723a81526c0815539055551213d492569151609a1b602082015260400192915050565b6000613248602f83613d83565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2070726f706f7365722081526e18589bdd99481d1a1c995cda1bdb19608a1b602082015260400192915050565b6000613299604583613d83565b7f476f7665726e6f72416c7068613a3a736574566f74696e67506572696f643a2081527f6e657720766f74696e6720706572696f64206d75737420657863656564206d696020820152646e696d756d60d81b604082015260600192915050565b6000613306604483613d83565b7f476f7665726e6f72416c7068613a3a5f71756575654f725265766572743a207081527f726f706f73616c20616374696f6e20616c7265616479207175657565642061746020820152632065746160e01b604082015260600192915050565b6000613372602883613d83565b7f476f7665726e6f72416c7068613a3a6164643235363a204144444954494f4e5f8152674f564552464c4f5760c01b602082015260400192915050565b60006133bc602c83613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206d7573742070726f81526b7669646520616374696f6e7360a01b602082015260400192915050565b600061340a603f83613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73657281527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c6400602082015260400192915050565b6000613469602f83613d83565b7f476f7665726e6f72416c7068613a3a63617374566f746542795369673a20696e81526e76616c6964207369676e617475726560881b602082015260400192915050565b60006134ba602c83613d83565b7f476f7665726e6f72416c7068613a3a6164643235363a2053554254524143544981526b4f4e5f554e444552464c4f5760a01b602082015260400192915050565b6000613508605883613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766581527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c7265616479206163746976652070726f706f73616c0000000000000000604082015260600192915050565b600061358d603683613d83565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2063616e6e6f742063618152751b98d95b08195e1958dd5d1959081c1c9bdc1bdcd85b60521b602082015260400192915050565b60006135e5603483613d83565b7f476f7665726e6f72426574613a3a5f5f61636365707441646d696e3a2073656e815273646572206d7573742062652074696d656c6f636b60601b602082015260400192915050565b600061363b602a83613d83565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f74696e67815269081a5cc818db1bdcd95960b21b602082015260400192915050565b6000613687602d83613d83565b7f476f7665726e6f72416c7068613a3a73657451756f72756d566f7465733a206981526c373b30b634b21039b2b73232b960991b602082015260400192915050565b60006136d6603683613d83565b7f476f7665726e6f72416c7068613a3a5f5f61626469636174653a2073656e6465815275391036bab9ba1031329033b7bb1033bab0b93234b0b760511b602082015260400192915050565b805160608301906137328482612b20565b5060208201516137456020850182612b20565b50604082015161166e60408501825b61299b81613da6565b61299b81613de1565b61299b81613dbe565b600061377a82612d9a565b91506137868285612b32565b6020820191506137968284612b32565b5060200192915050565b60006108aa826130cc565b60006108aa82613137565b602081016108aa82846129a1565b604081016137d282856129a1565b611d0a6020830184612b29565b608081016137ed82876129a1565b6137fa6020830186612b29565b6138076040830185612b20565b610891606083018461375d565b60a0810161382282886129a1565b61382f6020830187612b29565b81810360408301526138418186612b43565b905081810360608301526138558185612b43565b90506115176080830184612b29565b60a0810161387282886129a1565b61387f6020830187612b29565b81810360408301526138918186612b7b565b905081810360608301526138558185612b7b565b608080825281016138b681876129aa565b905081810360208301526138ca8186612ad2565b905081810360408301526138de8185612a71565b905081810360608301526115178184612a03565b602081016108aa8284612b20565b602081016108aa8284612b29565b6080810161391c8287612b29565b6139296020830186612b29565b6139366040830185612b29565b61089160608301846129a1565b606081016139518286612b29565b61395e6020830185612b29565b6126016040830184612b20565b608081016139798287612b29565b6139866020830186613766565b6139936040830185612b29565b6108916060830184612b29565b602081016108aa8284612c05565b602081016108aa8284612c0e565b602080825281016108a78184612b43565b602080825281016108aa81612c17565b602080825281016108aa81612c83565b602080825281016108aa81612cf0565b602080825281016108aa81612d45565b602080825281016108aa81612db8565b602080825281016108aa81612e03565b602080825281016108aa81612e62565b602080825281016108aa81612eb1565b602080825281016108aa81612ef6565b602080825281016108aa81612f7b565b602080825281016108aa81612fd3565b602080825281016108aa81613032565b602080825281016108aa81613082565b602080825281016108aa81613180565b602080825281016108aa816131ec565b602080825281016108aa8161323b565b602080825281016108aa8161328c565b602080825281016108aa816132f9565b602080825281016108aa81613365565b602080825281016108aa816133af565b602080825281016108aa816133fd565b602080825281016108aa8161345c565b602080825281016108aa816134ad565b602080825281016108aa816134fb565b602080825281016108aa81613580565b602080825281016108aa816135d8565b602080825281016108aa8161362e565b602080825281016108aa8161367a565b602080825281016108aa816136c9565b606081016108aa8284613721565b602081016108aa8284613754565b6101408101613bc8828d612b29565b613bd5602083018c612992565b8181036040830152613be7818b6129aa565b90508181036060830152613bfb818a612ad2565b90508181036080830152613c0f8189612a71565b905081810360a0830152613c238188612a03565b9050613c3260c0830187612b29565b613c3f60e0830186612b29565b818103610100830152613c528185612b43565b9050818103610120830152613c678184612b43565b9c9b505050505050505050505050565b6101208101613c86828c612b29565b613c93602083018b6129a1565b613ca0604083018a612b29565b613cad6060830189612b29565b613cba6080830188612b29565b613cc760a0830187612b29565b613cd460c0830186612b29565b613ce160e0830185612b20565b6110d2610100830184612b20565b604081016137d28285612b29565b60405181810167ffffffffffffffff81118282101715613d1c57600080fd5b604052919050565b600067ffffffffffffffff821115613d3b57600080fd5b5060209081020190565b600067ffffffffffffffff821115613d5c57600080fd5b506020601f91909101601f19160190565b60200190565b60009081526020902090565b5190565b90815260200190565b60006108aa82613db2565b151590565b8061076b81613e2e565b6001600160801b031690565b6001600160a01b031690565b60ff1690565b60006108aa825b60006108aa82613d8c565b60006108aa82613d9c565b60006108aa82613da6565b82818337506000910152565b60005b83811015613e13578181015183820152602001613dfb565b8381111561166e5750506000910152565b601f01601f191690565b6008811061235557fe5b613e4181613d8c565b811461235557600080fd5b613e4181613d97565b613e4181610b98565b613e4181613da6565b613e4181613dbe56fea365627a7a723158202aae8125ad54540d868b2608d70e8fc7f932f34cc622472725fe2203ec7d0d9a6c6578706572696d656e74616cf564736f6c634300050d004000000000000000000000000022da19b404f432d64e280c3c5712e52612b689fd000000000000000000000000ed91879919b71bb6905f23af0a68d231ecf87b14000000000000000000000000dd7680b6b2eec193ce3ece7129708ee12531bccf
Deployed Bytecode
0x60806040526004361061021a5760003560e01c806340e58ee511610123578063b58131b0116100ab578063deaaa7cc1161006f578063deaaa7cc14610610578063e23a9a5214610625578063ea0217cf14610652578063ece40cc114610672578063fe0d94c1146106925761021a565b8063b58131b01461059c578063b9a61961146105b1578063d33219b4146105c6578063da35c664146105db578063ddf0b009146105f05761021a565b8063490145c8116100f2578063490145c814610512578063760fbc13146105325780637bdbe4d014610547578063915006711461055c578063b4959e721461057c5761021a565b806340e58ee514610490578063452a9320146104b05780634634c61f146104d257806346d256c5146104f25761021a565b806317977c61116101a65780632aab8c89116101755780632aab8c89146103e9578063328dd982146103fe5780633932abb11461042e5780633a031bf0146104435780633e4f49e6146104635761021a565b806317977c611461037f57806320606b701461039f57806321f43e42146103b457806324bc1a64146103d45761021a565b8063052f72d7116101ed578063052f72d7146102c357806306fdde03146102f057806311c670281461031257806312d320c51461033257806315373e3d1461035f5761021a565b8063013cf08b1461021f57806302a251a31461025d57806302ec8f9e1461027f57806304c02c0e146102a1575b600080fd5b34801561022b57600080fd5b5061023f61023a366004612895565b6106a5565b60405161025499989796959493929190613c77565b60405180910390f35b34801561026957600080fd5b50610272610701565b6040516102549190613900565b34801561028b57600080fd5b5061029f61029a366004612895565b610707565b005b3480156102ad57600080fd5b506102b661073f565b60405161025491906139a0565b3480156102cf57600080fd5b506102e36102de3660046125e3565b61074e565b60405161025491906138f2565b3480156102fc57600080fd5b50610305610770565b60405161025491906139bc565b34801561031e57600080fd5b5061029f61032d3660046125e3565b61079e565b34801561033e57600080fd5b5061035261034d3660046126a3565b610813565b6040516102549190613bab565b34801561036b57600080fd5b5061035261037a3660046128d2565b61089a565b34801561038b57600080fd5b5061027261039a3660046125e3565b6108b0565b3480156103ab57600080fd5b506102726108c2565b3480156103c057600080fd5b5061029f6103cf366004612673565b6108d9565b3480156103e057600080fd5b506102726108f1565b3480156103f557600080fd5b506102b66108f7565b34801561040a57600080fd5b5061041e610419366004612895565b610906565b60405161025494939291906138a5565b34801561043a57600080fd5b50610272610b95565b34801561044f57600080fd5b506102e361045e366004612609565b610b9b565b34801561046f57600080fd5b5061048361047e366004612895565b610bc9565b60405161025491906139ae565b34801561049c57600080fd5b5061029f6104ab366004612895565b610d45565b3480156104bc57600080fd5b506104c5610f3b565b60405161025491906137b6565b3480156104de57600080fd5b506103526104ed3660046128f1565b610f4a565b3480156104fe57600080fd5b5061029f61050d366004612643565b6110e0565b34801561051e57600080fd5b5061027261052d3660046126f0565b61116a565b34801561053e57600080fd5b5061029f611521565b34801561055357600080fd5b5061027261155d565b34801561056857600080fd5b5061029f610577366004612673565b611562565b34801561058857600080fd5b5061029f610597366004612643565b61157a565b3480156105a857600080fd5b506102726115e9565b3480156105bd57600080fd5b5061029f6115ef565b3480156105d257600080fd5b506102b6611674565b3480156105e757600080fd5b50610272611683565b3480156105fc57600080fd5b5061029f61060b366004612895565b611689565b34801561061c57600080fd5b506102726118f7565b34801561063157600080fd5b506106456106403660046128b3565b611903565b6040516102549190613b9d565b34801561065e57600080fd5b5061029f61066d366004612895565b61196f565b34801561067e57600080fd5b5061029f61068d366004612895565b6119c0565b61029f6106a0366004612895565b6119ef565b60076020819052600091825260409091208054600182015460028301549383015460088401546009850154600a860154600b9096015494966001600160a01b039094169593949293919290919060ff8082169161010090041689565b60065481565b6000546001600160a01b0316331461073a5760405162461bcd60e51b815260040161073190613b7d565b60405180910390fd5b600455565b6009546001600160a01b031681565b6001600160a01b0381166000908152600b602052604090205460ff165b919050565b60405180604001604052806012815260200171444d4d20476f7665726e6f7220416c70686160701b81525081565b6002546001600160a01b031633146107c85760405162461bcd60e51b8152600401610731906139ed565b6000546001600160a01b0316156107f15760405162461bcd60e51b815260040161073190613a1d565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600083336001600160a01b038216148061083c5750336000908152600b602052604090205460ff165b8061086a57506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b6108865760405162461bcd60e51b815260040161073190613a3d565b610891858585611bb4565b95945050505050565b60006108a7338484611bb4565b90505b92915050565b60086020526000908152604090205481565b6040516108ce906137a0565b604051809103902081565b60405162461bcd60e51b815260040161073190613a6d565b60045481565b6001546001600160a01b031681565b6060806060806000600760008781526020019081526020016000209050806003018160040182600501836006018380548060200260200160405190810160405280929190818152602001828054801561098857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161096a575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156109da57602002820191906000526020600020905b8154815260200190600101908083116109c6575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610aad5760008481526020908190208301805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b505050505081526020019060010190610a02565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610b7f5760008481526020908190208301805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610b6b5780601f10610b4057610100808354040283529160200191610b6b565b820191906000526020600020905b815481529060010190602001808311610b4e57829003601f168201915b505050505081526020019060010190610ad4565b5050505090509450945094509450509193509193565b60015b90565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b60008160035410158015610bdd5750600082115b610bf95760405162461bcd60e51b815260040161073190613a0d565b6000828152600760205260409020600b81015460ff1615610c1e57600291505061076b565b80600701544311610c3357600091505061076b565b80600801544311610c4857600191505061076b565b80600a01548160090154111580610c6457506004548160090154105b15610c7357600391505061076b565b6002810154610c8657600491505061076b565b600b810154610100900460ff1615610ca257600791505061076b565b6002810154600054604080516360d143f160e11b81529051610d2b93926001600160a01b03169163c1a287e2916004808301926020929190829003018186803b158015610cee57600080fd5b505afa158015610d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d269190810190612824565b611d11565b4210610d3b57600691505061076b565b600591505061076b565b6000610d5082610bc9565b90506007816007811115610d6057fe5b1415610d7e5760405162461bcd60e51b815260040161073190613b4d565b600082815260076020526040902060018101546001600160a01b0316331480610dd65750600554600180830154610dcb916001600160a01b0390911690610dc6904390611d36565b611d5e565b6001600160801b0316105b610df25760405162461bcd60e51b815260040161073190613abd565b600b8101805460ff1916600117905560005b6003820154811015610efe576000546003830180546001600160a01b039092169163591fcdfe919084908110610e3657fe5b6000918252602090912001546004850180546001600160a01b039092169185908110610e5e57fe5b9060005260206000200154856005018581548110610e7857fe5b90600052602060002001866006018681548110610e9157fe5b9060005260206000200187600201546040518663ffffffff1660e01b8152600401610ec0959493929190613864565b600060405180830381600087803b158015610eda57600080fd5b505af1158015610eee573d6000803e3d6000fd5b505060019092019150610e049050565b507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c83604051610f2e9190613900565b60405180910390a1505050565b6002546001600160a01b031681565b600080604051610f59906137a0565b604080519182900382208282019091526012825271444d4d20476f7665726e6f7220416c70686160701b6020909201919091527f782228f4a48d65779a8fbcebcc728b9876a1f0bf928fad4390fd1367e2906573610fb5611df4565b30604051602001610fc9949392919061390e565b6040516020818303038152906040528051906020012090506000604051610fef906137ab565b604051908190038120611008918a908a90602001613943565b6040516020818303038152906040528051906020012090506000828260405160200161103592919061376f565b604051602081830303815290604052805190602001209050600060018289898960405160008152602001604052604051611072949392919061396b565b6020604051602081039080840390855afa158015611094573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110c75760405162461bcd60e51b815260040161073190613b1d565b6110d2818b8b611bb4565b9a9950505050505050505050565b6000546001600160a01b0316331461110a5760405162461bcd60e51b815260040161073190613aad565b6001600160a01b0382166000818152600b602052604090819020805460ff1916841515179055517fa6efca93f94be6d527ba1bea9555e6d7976b93ea663120fdecc8510a4c8781759061115e9084906138f2565b60405180910390a25050565b6002546000906001600160a01b031633148061119e575060055461119333610dc6436001611d36565b6001600160801b0316115b6111ba5760405162461bcd60e51b815260040161073190613b0d565b855187511480156111cc575084518751145b80156111d9575083518751145b6111f55760405162461bcd60e51b815260040161073190613a9d565b86516112135760405162461bcd60e51b815260040161073190613afd565b61121b61155d565b8751111561123b5760405162461bcd60e51b815260040161073190613a8d565b3360009081526008602052604090205480156112b857600061125c82610bc9565b9050600181600781111561126c57fe5b141561128a5760405162461bcd60e51b815260040161073190613b3d565b600081600781111561129857fe5b14156112b65760405162461bcd60e51b815260040161073190613a4d565b505b60006112c643610d26610b95565b905060006112d682600654611d11565b60038054600101905590506112e961202d565b604051806101a001604052806003548152602001336001600160a01b03168152602001600081526020018c81526020018b81526020018a815260200189815260200184815260200183815260200160008152602001600081526020016000151581526020016000151581525090508060076000836000015181526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015560608201518160030190805190602001906113cc9291906120a2565b50608082015180516113e8916004840191602090910190612107565b5060a0820151805161140491600584019160209091019061214e565b5060c082015180516114209160068401916020909101906121a7565b5060e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b0160006101000a81548160ff02191690831515021790555061018082015181600b0160016101000a81548160ff02191690831515021790555090505080600001516008600083602001516001600160a01b03166001600160a01b03168152602001908152602001600020819055507fb88787ccad609a4d41058c8a0928927dd2516296c139d218d1e9131c2c219bd38160000151338d8d8d8d89898f8f6040516115089a99989796959493929190613bb9565b60405180910390a15193505050505b9695505050505050565b6002546001600160a01b0316331461154b5760405162461bcd60e51b815260040161073190613b8d565b600280546001600160a01b0319169055565b600a90565b60405162461bcd60e51b815260040161073190613a5d565b336000818152600a602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907fb77b2072ad835753fcf96849f2997d0762c972493aca380defd7f5b450b59040906115dd9085906138f2565b60405180910390a35050565b60055481565b6000546001600160a01b031633146116195760405162461bcd60e51b815260040161073190613b5d565b6000805460408051630e18b68160e01b815290516001600160a01b0390921692630e18b6819260048084019382900301818387803b15801561165a57600080fd5b505af115801561166e573d6000803e3d6000fd5b50505050565b6000546001600160a01b031681565b60035481565b600461169482610bc9565b600781111561169f57fe5b146116bc5760405162461bcd60e51b8152600401610731906139cd565b600081815260076020908152604080832083548251630d48571f60e31b815292519194936117159342936001600160a01b0390931692636a42b8f892600480840193919291829003018186803b158015610cee57600080fd5b905060005b60038301548110156118bd576118b583600301828154811061173857fe5b6000918252602090912001546004850180546001600160a01b03909216918490811061176057fe5b906000526020600020015485600501848154811061177a57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156118085780601f106117dd57610100808354040283529160200191611808565b820191906000526020600020905b8154815290600101906020018083116117eb57829003601f168201915b505050505086600601858154811061181c57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156118aa5780601f1061187f576101008083540402835291602001916118aa565b820191906000526020600020905b81548152906001019060200180831161188d57829003601f168201915b505050505086611df8565b60010161171a565b50600282018190556040517f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda289290610f2e9085908490613cef565b6040516108ce906137ab565b61190b612200565b5060009182526007602090815260408084206001600160a01b03939093168452600c9092018152918190208151606081018352905460ff80821615158352610100820416151593820193909352620100009092046001600160801b03169082015290565b6000546001600160a01b031633146119995760405162461bcd60e51b815260040161073190613a7d565b6116808110156119bb5760405162461bcd60e51b815260040161073190613acd565b600655565b6000546001600160a01b031633146119ea5760405162461bcd60e51b8152600401610731906139fd565b600555565b60056119fa82610bc9565b6007811115611a0557fe5b14611a225760405162461bcd60e51b8152600401610731906139dd565b6000818152600760205260408120600b8101805461ff001916610100179055905b6003820154811015611b78576000546004830180546001600160a01b0390921691630825f38f919084908110611a7557fe5b9060005260206000200154846003018481548110611a8f57fe5b6000918252602090912001546004860180546001600160a01b039092169186908110611ab757fe5b9060005260206000200154866005018681548110611ad157fe5b90600052602060002001876006018781548110611aea57fe5b9060005260206000200188600201546040518763ffffffff1660e01b8152600401611b19959493929190613864565b6000604051808303818588803b158015611b3257600080fd5b505af1158015611b46573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052611b6f9190810190612842565b50600101611a43565b507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611ba89190613900565b60405180910390a15050565b60006001611bc184610bc9565b6007811115611bcc57fe5b14611be95760405162461bcd60e51b815260040161073190613b6d565b60008381526007602090815260408083206001600160a01b0388168452600c8101909252909120805460ff1615611c325760405162461bcd60e51b815260040161073190613a2d565b6000611c42878460070154611d5e565b90508415611c6b57611c618360090154826001600160801b0316611d11565b6009840155611c88565b611c8283600a0154826001600160801b0316611d11565b600a8401555b8154600160ff199091161761ff001916610100861515021771ffffffffffffffffffffffffffffffff00001916620100006001600160801b038316021782556040517f877856338e13f63d0c36822ff0ef736b80934cd90574a3a5bc9262c39d217c4690611cfd9089908990899086906137df565b60405180910390a1925050505b9392505050565b6000828201838110156108a75760405162461bcd60e51b815260040161073190613aed565b600082821115611d585760405162461bcd60e51b815260040161073190613b2d565b50900390565b60006108a7611d6d8484611f57565b60095460405163782d6fe160e01b81526001600160a01b039091169063782d6fe190611d9f90889088906004016137c4565b60206040518083038186803b158015611db757600080fd5b505afa158015611dcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611def9190810190612877565b611fda565b4690565b6000546040516001600160a01b039091169063f2b0653790611e269088908890889088908890602001613814565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b8152600401611e589190613900565b60206040518083038186803b158015611e7057600080fd5b505afa158015611e84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ea89190810190612806565b15611ec55760405162461bcd60e51b815260040161073190613add565b600054604051633a66f90160e01b81526001600160a01b0390911690633a66f90190611efd9088908890889088908890600401613814565b602060405180830381600087803b158015611f1757600080fd5b505af1158015611f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f4f9190810190612824565b505050505050565b60015460405163782d6fe160e01b81526000916001600160a01b03169063782d6fe190611f8a90869086906004016137c4565b60206040518083038186803b158015611fa257600080fd5b505afa158015611fb6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108a79190810190612877565b60006108a78383604051806020016040528060008152506000838301826001600160801b0380871690831610156120245760405162461bcd60e51b815260040161073191906139bc565b50949350505050565b604051806101a001604052806000815260200160006001600160a01b031681526020016000815260200160608152602001606081526020016060815260200160608152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090565b8280548282559060005260206000209081019282156120f7579160200282015b828111156120f757825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906120c2565b50612103929150612220565b5090565b828054828255906000526020600020908101928215612142579160200282015b82811115612142578251825591602001919060010190612127565b50612103929150612244565b82805482825590600052602060002090810192821561219b579160200282015b8281111561219b578251805161218b91849160209091019061225e565b509160200191906001019061216e565b506121039291506122cb565b8280548282559060005260206000209081019282156121f4579160200282015b828111156121f457825180516121e491849160209091019061225e565b50916020019190600101906121c7565b506121039291506122ee565b604080516060810182526000808252602082018190529181019190915290565b610b9891905b808211156121035780546001600160a01b0319168155600101612226565b610b9891905b80821115612103576000815560010161224a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061229f57805160ff1916838001178555612142565b828001600101855582156121425791820182811115612142578251825591602001919060010190612127565b610b9891905b808211156121035760006122e58282612311565b506001016122d1565b610b9891905b808211156121035760006123088282612311565b506001016122f4565b50805460018160011615610100020316600290046000825580601f106123375750612355565b601f0160209004906000526020600020908101906123559190612244565b50565b80356108aa81613e38565b600082601f83011261237457600080fd5b813561238761238282613d24565b613cfd565b915081818352602084019350602081019050838560208402820111156123ac57600080fd5b60005b838110156123d857816123c28882612358565b84525060209283019291909101906001016123af565b5050505092915050565b600082601f8301126123f357600080fd5b813561240161238282613d24565b81815260209384019390925082018360005b838110156123d857813586016124298882612538565b8452506020928301929190910190600101612413565b600082601f83011261245057600080fd5b813561245e61238282613d24565b81815260209384019390925082018360005b838110156123d857813586016124868882612538565b8452506020928301929190910190600101612470565b600082601f8301126124ad57600080fd5b81356124bb61238282613d24565b915081818352602084019350602081019050838560208402820111156124e057600080fd5b60005b838110156123d857816124f68882612522565b84525060209283019291909101906001016124e3565b80356108aa81613e4c565b80516108aa81613e4c565b80356108aa81613e55565b80516108aa81613e55565b600082601f83011261254957600080fd5b813561255761238282613d45565b9150808252602083016020830185838301111561257357600080fd5b61257e838284613dec565b50505092915050565b600082601f83011261259857600080fd5b81516125a661238282613d45565b915080825260208301602083018583830111156125c257600080fd5b61257e838284613df8565b80516108aa81613e5e565b80356108aa81613e67565b6000602082840312156125f557600080fd5b60006126018484612358565b949350505050565b6000806040838503121561261c57600080fd5b60006126288585612358565b925050602061263985828601612358565b9150509250929050565b6000806040838503121561265657600080fd5b60006126628585612358565b92505060206126398582860161250c565b6000806040838503121561268657600080fd5b60006126928585612358565b925050602061263985828601612522565b6000806000606084860312156126b857600080fd5b60006126c48686612358565b93505060206126d586828701612522565b92505060406126e68682870161250c565b9150509250925092565b60008060008060008060c0878903121561270957600080fd5b863567ffffffffffffffff81111561272057600080fd5b61272c89828a01612363565b965050602087013567ffffffffffffffff81111561274957600080fd5b61275589828a0161249c565b955050604087013567ffffffffffffffff81111561277257600080fd5b61277e89828a0161243f565b945050606087013567ffffffffffffffff81111561279b57600080fd5b6127a789828a016123e2565b935050608087013567ffffffffffffffff8111156127c457600080fd5b6127d089828a01612538565b92505060a087013567ffffffffffffffff8111156127ed57600080fd5b6127f989828a01612538565b9150509295509295509295565b60006020828403121561281857600080fd5b60006126018484612517565b60006020828403121561283657600080fd5b6000612601848461252d565b60006020828403121561285457600080fd5b815167ffffffffffffffff81111561286b57600080fd5b61260184828501612587565b60006020828403121561288957600080fd5b600061260184846125cd565b6000602082840312156128a757600080fd5b60006126018484612522565b600080604083850312156128c657600080fd5b60006126288585612522565b600080604083850312156128e557600080fd5b60006126628585612522565b600080600080600060a0868803121561290957600080fd5b60006129158888612522565b95505060206129268882890161250c565b9450506040612937888289016125d8565b935050606061294888828901612522565b925050608061295988828901612522565b9150509295509295909350565b600061297283836129a1565b505060200190565b60006108a78383612b43565b60006129728383612b29565b61299b81613dc4565b82525050565b61299b81613d8c565b60006129b582613d7f565b6129bf8185613d83565b93506129ca83613d6d565b8060005b838110156129f85781516129e28882612966565b97506129ed83613d6d565b9250506001016129ce565b509495945050505050565b6000612a0e82613d7f565b612a188185613d83565b935083602082028501612a2a85613d6d565b8060005b85811015612a645784840389528151612a47858261297a565b9450612a5283613d6d565b60209a909a0199925050600101612a2e565b5091979650505050505050565b6000612a7c82613d7f565b612a868185613d83565b935083602082028501612a9885613d6d565b8060005b85811015612a645784840389528151612ab5858261297a565b9450612ac083613d6d565b60209a909a0199925050600101612a9c565b6000612add82613d7f565b612ae78185613d83565b9350612af283613d6d565b8060005b838110156129f8578151612b0a8882612986565b9750612b1583613d6d565b925050600101612af6565b61299b81613d97565b61299b81610b98565b61299b612b3e82610b98565b610b98565b6000612b4e82613d7f565b612b588185613d83565b9350612b68818560208601613df8565b612b7181613e24565b9093019392505050565b600081546001811660008114612b985760018114612bbe57612bfd565b607f6002830416612ba98187613d83565b60ff1984168152955050602085019250612bfd565b60028204612bcc8187613d83565b9550612bd785613d73565b60005b82811015612bf657815488820152600190910190602001612bda565b8701945050505b505092915050565b61299b81613dcb565b61299b81613dd6565b6000612c24604483613d83565b7f476f7665726e6f72416c7068613a3a71756575653a2070726f706f73616c206381527f616e206f6e6c79206265207175657565642069662069742069732073756363656020820152631959195960e21b604082015260600192915050565b6000612c90604583613d83565b7f476f7665726e6f72416c7068613a3a657865637574653a2070726f706f73616c81527f2063616e206f6e6c7920626520657865637574656420696620697420697320716020820152641d595d595960da1b604082015260600192915050565b6000612cfd603383613d83565b7f476f7665726e6f72416c7068613a3a73657454696d656c6f636b3a2043616c6c81527232b91036bab9ba1031329033bab0b93234b0b760691b602082015260400192915050565b6000612d52603383613d83565b7f476f7665726e6f72416c7068613a3a73657450726f706f73616c54687265736881527237b6321d1034b73b30b634b21039b2b73232b960691b602082015260400192915050565b6000612da760028361076b565b61190160f01b815260020192915050565b6000612dc5602983613d83565b7f476f7665726e6f72416c7068613a3a73746174653a20696e76616c69642070728152681bdc1bdcd85b081a5960ba1b602082015260400192915050565b6000612e10604083613d83565b7f476f7665726e6f72416c7068613a3a73657454696d656c6f636b3a2074696d6581527f6c6f636b206d757374206e6f7420626520696e697469616c697a656420796574602082015260400192915050565b6000612e6f602d83613d83565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f7465722081526c185b1c9958591e481d9bdd1959609a1b602082015260400192915050565b6000612ebe602383613d83565b7f476f7665726e6f72426574613a20554e415554484f52495a45445f4f504552418152622a27a960e91b602082015260400192915050565b6000612f03605983613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766581527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000604082015260600192915050565b6000612f88603683613d83565b7f476f7665726e6f72426574613a3a5f5f717565756553657454696d656c6f636b81527514195b991a5b99d0591b5a5b8e881393d517d554d15160521b602082015260400192915050565b6000612fe0603883613d83565b7f476f7665726e6f72426574613a3a5f5f6578656375746553657454696d656c6f81527f636b50656e64696e6741646d696e3a204e4f545f555345440000000000000000602082015260400192915050565b600061303f602e83613d83565b7f476f7665726e6f72416c7068613a3a736574566f74696e67506572696f643a2081526d34b73b30b634b21039b2b73232b960911b602082015260400192915050565b600061308f602883613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a20746f6f206d616e7981526720616374696f6e7360c01b602082015260400192915050565b60006130d960438361076b565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430192915050565b600061314460278361076b565b7f42616c6c6f742875696e743235362070726f706f73616c49642c626f6f6c20738152667570706f72742960c81b602082015260270192915050565b600061318d604483613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73616c81527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d6020820152630c2e8c6d60e31b604082015260600192915050565b60006131f9602d83613d83565b7f476f7665726e6f72426574613a3a736574476c6f62616c4f70657261746f723a81526c0815539055551213d492569151609a1b602082015260400192915050565b6000613248602f83613d83565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2070726f706f7365722081526e18589bdd99481d1a1c995cda1bdb19608a1b602082015260400192915050565b6000613299604583613d83565b7f476f7665726e6f72416c7068613a3a736574566f74696e67506572696f643a2081527f6e657720766f74696e6720706572696f64206d75737420657863656564206d696020820152646e696d756d60d81b604082015260600192915050565b6000613306604483613d83565b7f476f7665726e6f72416c7068613a3a5f71756575654f725265766572743a207081527f726f706f73616c20616374696f6e20616c7265616479207175657565642061746020820152632065746160e01b604082015260600192915050565b6000613372602883613d83565b7f476f7665726e6f72416c7068613a3a6164643235363a204144444954494f4e5f8152674f564552464c4f5760c01b602082015260400192915050565b60006133bc602c83613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206d7573742070726f81526b7669646520616374696f6e7360a01b602082015260400192915050565b600061340a603f83613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73657281527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c6400602082015260400192915050565b6000613469602f83613d83565b7f476f7665726e6f72416c7068613a3a63617374566f746542795369673a20696e81526e76616c6964207369676e617475726560881b602082015260400192915050565b60006134ba602c83613d83565b7f476f7665726e6f72416c7068613a3a6164643235363a2053554254524143544981526b4f4e5f554e444552464c4f5760a01b602082015260400192915050565b6000613508605883613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766581527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c7265616479206163746976652070726f706f73616c0000000000000000604082015260600192915050565b600061358d603683613d83565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2063616e6e6f742063618152751b98d95b08195e1958dd5d1959081c1c9bdc1bdcd85b60521b602082015260400192915050565b60006135e5603483613d83565b7f476f7665726e6f72426574613a3a5f5f61636365707441646d696e3a2073656e815273646572206d7573742062652074696d656c6f636b60601b602082015260400192915050565b600061363b602a83613d83565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f74696e67815269081a5cc818db1bdcd95960b21b602082015260400192915050565b6000613687602d83613d83565b7f476f7665726e6f72416c7068613a3a73657451756f72756d566f7465733a206981526c373b30b634b21039b2b73232b960991b602082015260400192915050565b60006136d6603683613d83565b7f476f7665726e6f72416c7068613a3a5f5f61626469636174653a2073656e6465815275391036bab9ba1031329033b7bb1033bab0b93234b0b760511b602082015260400192915050565b805160608301906137328482612b20565b5060208201516137456020850182612b20565b50604082015161166e60408501825b61299b81613da6565b61299b81613de1565b61299b81613dbe565b600061377a82612d9a565b91506137868285612b32565b6020820191506137968284612b32565b5060200192915050565b60006108aa826130cc565b60006108aa82613137565b602081016108aa82846129a1565b604081016137d282856129a1565b611d0a6020830184612b29565b608081016137ed82876129a1565b6137fa6020830186612b29565b6138076040830185612b20565b610891606083018461375d565b60a0810161382282886129a1565b61382f6020830187612b29565b81810360408301526138418186612b43565b905081810360608301526138558185612b43565b90506115176080830184612b29565b60a0810161387282886129a1565b61387f6020830187612b29565b81810360408301526138918186612b7b565b905081810360608301526138558185612b7b565b608080825281016138b681876129aa565b905081810360208301526138ca8186612ad2565b905081810360408301526138de8185612a71565b905081810360608301526115178184612a03565b602081016108aa8284612b20565b602081016108aa8284612b29565b6080810161391c8287612b29565b6139296020830186612b29565b6139366040830185612b29565b61089160608301846129a1565b606081016139518286612b29565b61395e6020830185612b29565b6126016040830184612b20565b608081016139798287612b29565b6139866020830186613766565b6139936040830185612b29565b6108916060830184612b29565b602081016108aa8284612c05565b602081016108aa8284612c0e565b602080825281016108a78184612b43565b602080825281016108aa81612c17565b602080825281016108aa81612c83565b602080825281016108aa81612cf0565b602080825281016108aa81612d45565b602080825281016108aa81612db8565b602080825281016108aa81612e03565b602080825281016108aa81612e62565b602080825281016108aa81612eb1565b602080825281016108aa81612ef6565b602080825281016108aa81612f7b565b602080825281016108aa81612fd3565b602080825281016108aa81613032565b602080825281016108aa81613082565b602080825281016108aa81613180565b602080825281016108aa816131ec565b602080825281016108aa8161323b565b602080825281016108aa8161328c565b602080825281016108aa816132f9565b602080825281016108aa81613365565b602080825281016108aa816133af565b602080825281016108aa816133fd565b602080825281016108aa8161345c565b602080825281016108aa816134ad565b602080825281016108aa816134fb565b602080825281016108aa81613580565b602080825281016108aa816135d8565b602080825281016108aa8161362e565b602080825281016108aa8161367a565b602080825281016108aa816136c9565b606081016108aa8284613721565b602081016108aa8284613754565b6101408101613bc8828d612b29565b613bd5602083018c612992565b8181036040830152613be7818b6129aa565b90508181036060830152613bfb818a612ad2565b90508181036080830152613c0f8189612a71565b905081810360a0830152613c238188612a03565b9050613c3260c0830187612b29565b613c3f60e0830186612b29565b818103610100830152613c528185612b43565b9050818103610120830152613c678184612b43565b9c9b505050505050505050505050565b6101208101613c86828c612b29565b613c93602083018b6129a1565b613ca0604083018a612b29565b613cad6060830189612b29565b613cba6080830188612b29565b613cc760a0830187612b29565b613cd460c0830186612b29565b613ce160e0830185612b20565b6110d2610100830184612b20565b604081016137d28285612b29565b60405181810167ffffffffffffffff81118282101715613d1c57600080fd5b604052919050565b600067ffffffffffffffff821115613d3b57600080fd5b5060209081020190565b600067ffffffffffffffff821115613d5c57600080fd5b506020601f91909101601f19160190565b60200190565b60009081526020902090565b5190565b90815260200190565b60006108aa82613db2565b151590565b8061076b81613e2e565b6001600160801b031690565b6001600160a01b031690565b60ff1690565b60006108aa825b60006108aa82613d8c565b60006108aa82613d9c565b60006108aa82613da6565b82818337506000910152565b60005b83811015613e13578181015183820152602001613dfb565b8381111561166e5750506000910152565b601f01601f191690565b6008811061235557fe5b613e4181613d8c565b811461235557600080fd5b613e4181613d97565b613e4181610b98565b613e4181613da6565b613e4181613dbe56fea365627a7a723158202aae8125ad54540d868b2608d70e8fc7f932f34cc622472725fe2203ec7d0d9a6c6578706572696d656e74616cf564736f6c634300050d0040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000022da19b404f432d64e280c3c5712e52612b689fd000000000000000000000000ed91879919b71bb6905f23af0a68d231ecf87b14000000000000000000000000dd7680b6b2eec193ce3ece7129708ee12531bccf
-----Decoded View---------------
Arg [0] : __assetIntroducerProxy (address): 0x22DA19b404F432D64e280c3c5712E52612b689Fd
Arg [1] : __dmg (address): 0xEd91879919B71bB6905f23af0A68d231EcF87b14
Arg [2] : __guardian (address): 0xdd7680B6B2EeC193ce3ECe7129708EE12531BCcF
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000022da19b404f432d64e280c3c5712e52612b689fd
Arg [1] : 000000000000000000000000ed91879919b71bb6905f23af0a68d231ecf87b14
Arg [2] : 000000000000000000000000dd7680b6b2eec193ce3ece7129708ee12531bccf
Deployed Bytecode Sourcemap
56199:4184:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14758:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14758:42:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;14657:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14657:24:0;;;:::i;:::-;;;;;;;;16049:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16049:248:0;;;;;;;;:::i;:::-;;56775:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56775:46:0;;;:::i;:::-;;;;;;;;59814:161;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;59814:161:0;;;;;;;;:::i;:::-;;;;;;;;13903:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13903:50:0;;;:::i;:::-;;;;;;;;15618:423;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15618:423:0;;;;;;;;:::i;59261:237::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;59261:237:0;;;;;;;;:::i;:::-;;;;;;;;24318:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24318:172:0;;;;;;;;:::i;14864:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14864:49:0;;;;;;;;:::i;14986:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14986:122:0;;;:::i;58223:269::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;58223:269:0;;;;;;;;:::i;14449:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14449:23:0;;;:::i;14120:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14120:20:0;;;:::i;22741:303::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22741:303:0;;;;;;;;:::i;:::-;;;;;;;;;;;16947:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16947:97:0;;;:::i;59605:201::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;59605:201:0;;;;;;;;:::i;23212:1098::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23212:1098:0;;;;;;;;:::i;:::-;;;;;;;;21896:837;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21896:837:0;;;;;;;;:::i;14203:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14203:23:0;;;:::i;:::-;;;;;;;;24498:737;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24498:737:0;;;;;;;;:::i;57345:370::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;57345:370:0;;;;;;;;:::i;17550:2487::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17550:2487:0;;;;;;;;:::i;26506:208::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26506:208:0;;;:::i;16691:111::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16691:111:0;;;:::i;57950:265::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;57950:265:0;;;;;;;;:::i;58599:259::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;58599:259:0;;;;;;;;:::i;14554:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14554:29:0;;;:::i;57723:219::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57723:219:0;;;:::i;14020:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14020:34:0;;;:::i;14282:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14282:25:0;;;:::i;20045:632::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20045:632:0;;;;;;;;:::i;15198:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15198:94:0;;;:::i;23052:152::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23052:152:0;;;;;;;;:::i;:::-;;;;;;;;17052:490;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17052:490:0;;;;;;;;:::i;16305:278::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16305:278:0;;;;;;;;:::i;21160:728::-;;;;;;;;;:::i;14758:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14758:42:0;;;;;;;;;;;;;;;;;;;;;;;:::o;14657:24::-;;;;:::o;16049:248::-;16170:8;;-1:-1:-1;;;;;16170:8:0;16148:10;:31;16126:126;;;;-1:-1:-1;;;16126:126:0;;;;;;;;;;;;;;;;;16263:11;:26;16049:248::o;56775:46::-;;;-1:-1:-1;;;;;56775:46:0;;:::o;59814:161::-;-1:-1:-1;;;;;59924:43:0;;59900:4;59924:43;;;:31;:43;;;;;;;;59814:161;;;;:::o;13903:50::-;;;;;;;;;;;;;;-1:-1:-1;;;13903:50:0;;;;:::o;15618:423::-;15735:8;;-1:-1:-1;;;;;15735:8:0;15721:10;:22;15699:123;;;;-1:-1:-1;;;15699:123:0;;;;;;;;;15884:3;15863:8;-1:-1:-1;;;;;15863:8:0;15855:33;15833:147;;;;-1:-1:-1;;;15833:147:0;;;;;;;;;15993:8;:40;;-1:-1:-1;;;;;;15993:40:0;-1:-1:-1;;;;;15993:40:0;;;;;;;;;;15618:423::o;59261:237::-;59420:7;59390;56530:10;-1:-1:-1;;;;;56530:19:0;;;;:79;;-1:-1:-1;56598:10:0;56566:43;;;;:31;:43;;;;;;;;56530:79;:152;;;-1:-1:-1;;;;;;56626:44:0;;;;;;:37;:44;;;;;;;;56671:10;56626:56;;;;;;;;;;56530:152;56508:237;;;;-1:-1:-1;;;56508:237:0;;;;;;;;;59447:43;59457:7;59466:12;59480:9;59447;:43::i;:::-;59440:50;59261:237;-1:-1:-1;;;;;59261:237:0:o;24318:172::-;24413:7;24440:42;24450:10;24462;24474:7;24440:9;:42::i;:::-;24433:49;;24318:172;;;;;:::o;14864:49::-;;;;;;;;;;;;;:::o;14986:122::-;15028:80;;;;;;;;;;;;;;14986:122;:::o;58223:269::-;58418:66;;-1:-1:-1;;;58418:66:0;;;;;;;;14449:23;;;;:::o;14120:20::-;;;-1:-1:-1;;;;;14120:20:0;;:::o;22741:303::-;22815:24;22841:20;22863:26;22891:24;22928:18;22949:9;:21;22959:10;22949:21;;;;;;;;;;;22928:42;;22989:1;:9;;23000:1;:8;;23010:1;:12;;23024:1;:11;;22981:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22981:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22981:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22981:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22741:303;;;;;:::o;16947:97::-;17035:1;16947:97;;:::o;59605:201::-;-1:-1:-1;;;;;59740:46:0;;;59716:4;59740:46;;;:37;:46;;;;;;;;:58;;;;;;;;;;;;;;;59605:201::o;23212:1098::-;23281:13;23346:10;23329:13;;:27;;:45;;;;;23373:1;23360:10;:14;23329:45;23307:136;;;;-1:-1:-1;;;23307:136:0;;;;;;;;;23456:25;23484:21;;;:9;:21;;;;;23520:17;;;;;;23516:787;;;23561:22;23554:29;;;;;23516:787;23621:8;:19;;;23605:12;:35;23601:702;;23664:21;23657:28;;;;;23601:702;23723:8;:17;;;23707:12;:33;23703:600;;23764:20;23757:27;;;;;23703:600;23827:8;:21;;;23806:8;:17;;;:42;;:77;;;;23872:11;;23852:8;:17;;;:31;23806:77;23802:501;;;23907:22;23900:29;;;;;23802:501;23951:12;;;;23947:356;;23992:23;23985:30;;;;;23947:356;24037:17;;;;;;;;;24033:270;;;24078:22;24071:29;;;;;24033:270;24148:12;;;;24162:8;;:23;;;-1:-1:-1;;;24162:23:0;;;;24141:45;;24148:12;-1:-1:-1;;;;;24162:8:0;;:21;;:23;;;;;;;;;;;;;;:8;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;24162:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24162:23:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;24162:23:0;;;;;;;;;24141:6;:45::i;:::-;24122:15;:64;24118:185;;24210:21;24203:28;;;;;24118:185;24271:20;24264:27;;;;;21896:837;21963:19;21985:17;21991:10;21985:5;:17::i;:::-;21963:39;-1:-1:-1;22044:22:0;22035:5;:31;;;;;;;;;;22013:135;;;;-1:-1:-1;;;22013:135:0;;;;;;;;;22161:25;22189:21;;;:9;:21;;;;;22257:17;;;;-1:-1:-1;;;;;22257:17:0;22243:10;:31;;:108;;-1:-1:-1;22334:17:0;;22288;;;;;22278:53;;-1:-1:-1;;;;;22288:17:0;;;;22307:23;;22314:12;;22307:6;:23::i;:::-;22278:9;:53::i;:::-;-1:-1:-1;;;;;22278:73:0;;22243:108;22221:205;;;;-1:-1:-1;;;22221:205:0;;;;;;;;;22439:17;;;:24;;-1:-1:-1;;22439:24:0;22459:4;22439:24;;;:17;22474:206;22495:16;;;:23;22491:27;;22474:206;;;22540:8;;22567:16;;;:19;;-1:-1:-1;;;;;22540:8:0;;;;:26;;22567:16;22584:1;;22567:19;;;;;;;;;;;;;;;;22588:15;;;:18;;-1:-1:-1;;;;;22567:19:0;;;;22604:1;;22588:18;;;;;;;;;;;;;;22608:8;:19;;22628:1;22608:22;;;;;;;;;;;;;;;22632:8;:18;;22651:1;22632:21;;;;;;;;;;;;;;;22655:8;:12;;;22540:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22540:128:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;22520:3:0;;;;;-1:-1:-1;22474:206:0;;-1:-1:-1;22474:206:0;;;22697:28;22714:10;22697:28;;;;;;;;;;;;;;;21896:837;;;:::o;14203:23::-;;;-1:-1:-1;;;;;14203:23:0;;:::o;24498:737::-;24656:7;24676:23;15028:80;;;;;;;;;;;;;;;;24756:4;;;;;;;;;-1:-1:-1;;;24756:4:0;;;;;;;;24740:22;24764:12;:10;:12::i;:::-;24786:4;24712:80;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;24712:80:0;;;24702:91;;;;;;24676:117;;24804:18;15240:52;;;;;;;;;;;;;;;24835:48;;24863:10;;24875:7;;24835:48;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;24835:48:0;;;24825:59;;;;;;24804:80;;24895:14;24951:15;24968:10;24922:57;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;24922:57:0;;;24912:68;;;;;;24895:85;;24991:17;25011:26;25021:6;25029:1;25032;25035;25011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;25011:26:0;;-1:-1:-1;;25011:26:0;;;-1:-1:-1;;;;;;;25070:23:0;;25048:120;;;;-1:-1:-1;;;25048:120:0;;;;;;;;;25186:41;25196:9;25207:10;25219:7;25186:9;:41::i;:::-;25179:48;24498:737;-1:-1:-1;;;;;;;;;;24498:737:0:o;57345:370::-;57483:8;;-1:-1:-1;;;;;57483:8:0;57496:10;57475:31;57453:126;;;;-1:-1:-1;;;57453:126:0;;;;;;;;;-1:-1:-1;;;;;57592:43:0;;;;;;:31;:43;;;;;;;:57;;-1:-1:-1;;57592:57:0;;;;;;;57665:42;;;;;57592:57;;57665:42;;;;;;;;;;57345:370;;:::o;17550:2487::-;17847:8;;17794:4;;-1:-1:-1;;;;;17847:8:0;17833:10;:22;;:92;;;17908:17;;17859:46;17869:10;17881:23;17888:12;17902:1;17881:6;:23::i;17859:46::-;-1:-1:-1;;;;;17859:66:0;;17833:92;17811:205;;;;-1:-1:-1;;;17811:205:0;;;;;;;;;18067:6;:13;18049:7;:14;:31;:70;;;;;18102:10;:17;18084:7;:14;:35;18049:70;:108;;;;;18141:9;:16;18123:7;:14;:34;18049:108;18027:226;;;;-1:-1:-1;;;18027:226:0;;;;;;;;;18286:14;;18264:113;;;;-1:-1:-1;;;18264:113:0;;;;;;;;;18428:23;:21;:23::i;:::-;18410:7;:14;:41;;18388:131;;;;-1:-1:-1;;;18388:131:0;;;;;;;;;18574:10;18532:21;18556:29;;;:17;:29;;;;;;18600:21;;18596:558;;18638:42;18683:23;18689:16;18683:5;:23::i;:::-;18638:68;-1:-1:-1;18779:20:0;18747:28;:52;;;;;;;;;;18721:202;;;;-1:-1:-1;;;18721:202:0;;;;;;;;;18996:21;18964:28;:53;;;;;;;;;;18938:204;;;;-1:-1:-1;;;18938:204:0;;;;;;;;;18596:558;;19166:15;19184:35;19191:12;19205:13;:11;:13::i;19184:35::-;19166:53;;19230:13;19246:32;19253:10;19265:12;;19246:6;:32::i;:::-;19291:13;:15;;;;;;19230:48;-1:-1:-1;19317:27:0;;:::i;:::-;19347:388;;;;;;;;19372:13;;19347:388;;;;19407:10;-1:-1:-1;;;;;19347:388:0;;;;;19434:1;19347:388;;;;19456:7;19347:388;;;;19483:6;19347:388;;;;19513:10;19347:388;;;;19546:9;19347:388;;;;19579:10;19347:388;;;;19611:8;19347:388;;;;19641:1;19347:388;;;;19668:1;19347:388;;;;19691:5;19347:388;;;;;;19718:5;19347:388;;;;;19317:418;;19776:11;19748:9;:25;19758:11;:14;;;19748:25;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19748:39:0;;;;;-1:-1:-1;;;;;19748:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;19748:39:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;19748:39:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;19748:39:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19840:11;:14;;;19798:17;:39;19816:11;:20;;;-1:-1:-1;;;;;19798:39:0;-1:-1:-1;;;;;19798:39:0;;;;;;;;;;;;:56;;;;19872:125;19888:11;:14;;;19904:10;19916:7;19925:6;19933:10;19945:9;19956:10;19968:8;19978:5;19985:11;19872:125;;;;;;;;;;;;;;;;;;;;;;;;20015:14;;-1:-1:-1;;;;17550:2487:0;;;;;;;;;:::o;26506:208::-;26582:8;;-1:-1:-1;;;;;26582:8:0;26568:10;:22;26546:126;;;;-1:-1:-1;;;26546:126:0;;;;;;;;;26685:8;:21;;-1:-1:-1;;;;;;26685:21:0;;;26506:208::o;16691:111::-;16792:2;16691:111;:::o;57950:265::-;58143:64;;-1:-1:-1;;;58143:64:0;;;;;;;;58599:259;58744:10;58706:49;;;;:37;:49;;;;;;;;-1:-1:-1;;;;;58706:61:0;;;;;;;;;;;:75;;-1:-1:-1;;58706:75:0;;;;;;;58797:53;;58706:61;;58744:10;58797:53;;;;58706:75;;58797:53;;;;;;;;;;58599:259;;:::o;14554:29::-;;;;:::o;57723:219::-;57810:8;;-1:-1:-1;;;;;57810:8:0;57788:10;:31;57766:133;;;;-1:-1:-1;;;57766:133:0;;;;;;;;;57912:8;;;:22;;;-1:-1:-1;;;57912:22:0;;;;-1:-1:-1;;;;;57912:8:0;;;;:20;;:22;;;;;;;;;;:8;;:22;;;5:2:-1;;;;30:1;27;20:12;5:2;57912:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57912:22:0;;;;57723:219::o;14020:34::-;;;-1:-1:-1;;;;;14020:34:0;;:::o;14282:25::-;;;;:::o;20045:632::-;20154:23;20133:17;20139:10;20133:5;:17::i;:::-;:44;;;;;;;;;20111:162;;;;-1:-1:-1;;;20111:162:0;;;;;;;;;20286:25;20314:21;;;:9;:21;;;;;;;;20381:8;;:16;;-1:-1:-1;;;20381:16:0;;;;20314:21;;20286:25;20357:41;;20364:15;;-1:-1:-1;;;;;20381:8:0;;;;:14;;:16;;;;;20314:21;;20381:16;;;;;;:8;:16;;;5:2:-1;;;;30:1;27;20:12;20357:41:0;20346:52;-1:-1:-1;20414:6:0;20409:185;20430:16;;;:23;20426:27;;20409:185;;;20475:107;20490:8;:16;;20507:1;20490:19;;;;;;;;;;;;;;;;;;20511:15;;;:18;;-1:-1:-1;;;;;20490:19:0;;;;20527:1;;20511:18;;;;;;;;;;;;;;20531:8;:19;;20551:1;20531:22;;;;;;;;;;;;;;;;;;20475:107;;;;;;;-1:-1:-1;;20475:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20531:22;20475:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20555:8;:18;;20574:1;20555:21;;;;;;;;;;;;;;;;;;20475:107;;;;;;;-1:-1:-1;;20475:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20555:21;20475:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20578:3;20475:14;:107::i;:::-;20455:3;;20409:185;;;-1:-1:-1;20604:12:0;;;:18;;;20638:31;;;;;;20653:10;;20619:3;;20638:31;;15198:94;15240:52;;;;;;23052:152;23125:14;;:::i;:::-;-1:-1:-1;23159:21:0;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;23159:37:0;;;;;;:30;;;;:37;;;;;;23152:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23152:44:0;;;;;;23052:152::o;17052:490::-;17175:8;;-1:-1:-1;;;;;17175:8:0;17153:10;:31;17131:127;;;;-1:-1:-1;;;17131:127:0;;;;;;;;;17308:4;17291:13;:21;;17269:140;;;;-1:-1:-1;;;17269:140:0;;;;;;;;;17506:12;:28;17052:490::o;16305:278::-;16438:8;;-1:-1:-1;;;;;16438:8:0;16416:10;:31;16394:132;;;;-1:-1:-1;;;16394:132:0;;;;;;;;;16537:17;:38;16305:278::o;21160:728::-;21279:20;21258:17;21264:10;21258:5;:17::i;:::-;:41;;;;;;;;;21236:160;;;;-1:-1:-1;;;21236:160:0;;;;;;;;;21409:25;21437:21;;;:9;:21;;;;;21469:17;;;:24;;-1:-1:-1;;21469:24:0;;;;;21437:21;21504:333;21525:16;;;:23;21521:27;;21504:333;;;21570:8;;21604:15;;;:18;;-1:-1:-1;;;;;21570:8:0;;;;:27;;21604:15;21620:1;;21604:18;;;;;;;;;;;;;;21642:8;:16;;21659:1;21642:19;;;;;;;;;;;;;;;;;;21680:15;;;:18;;-1:-1:-1;;;;;21642:19:0;;;;21696:1;;21680:18;;;;;;;;;;;;;;21717:8;:19;;21737:1;21717:22;;;;;;;;;;;;;;;21758:8;:18;;21777:1;21758:21;;;;;;;;;;;;;;;21798:8;:12;;;21570:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21570:255:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21570:255:0;;;;;;;39:16:-1;36:1;17:17;2:54;101:4;21570:255:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;21570:255:0;;;;;;;;;-1:-1:-1;21550:3:0;;21504:333;;;;21852:28;21869:10;21852:28;;;;;;;;;;;;;;;21160:728;;:::o;25243:985::-;25360:7;25423:20;25402:17;25408:10;25402:5;:17::i;:::-;:41;;;;;;;;;25380:133;;;;-1:-1:-1;;;25380:133:0;;;;;;;;;25526:25;25554:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;25612:24:0;;;;:17;;;:24;;;;;;25669:16;;;;:25;25647:120;;;;-1:-1:-1;;;25647:120:0;;;;;;;;;25780:13;25796:37;25806:5;25813:8;:19;;;25796:9;:37::i;:::-;25780:53;;25850:7;25846:185;;;25894:32;25901:8;:17;;;25920:5;-1:-1:-1;;;;;25894:32:0;:6;:32::i;:::-;25874:17;;;:52;25846:185;;;25983:36;25990:8;:21;;;26013:5;-1:-1:-1;;;;;25983:36:0;:6;:36::i;:::-;25959:21;;;:60;25846:185;26043:23;;26062:4;-1:-1:-1;;26043:23:0;;;;-1:-1:-1;;26077:25:0;26043:23;26077:25;;;;;-1:-1:-1;;26113:21:0;;-1:-1:-1;;;;;26113:21:0;;;;;;26152:43;;;;;;26161:5;;26168:10;;26077:25;;26113:21;;26152:43;;;;;;;;;;26215:5;-1:-1:-1;;;25243:985:0;;;;;;:::o;27710:189::-;27771:4;27797:5;;;27821:6;;;;27813:59;;;;-1:-1:-1;;;27813:59:0;;;;;;;;27907:172;27968:4;27998:1;27993;:6;;27985:63;;;;-1:-1:-1;;;27985:63:0;;;;;;;;;-1:-1:-1;28066:5:0;;;27907:172::o;60086:292::-;60189:7;60216:154;60249:38;60265:6;60273:13;60249:15;:38::i;:::-;60302:20;;:57;;-1:-1:-1;;;60302:57:0;;-1:-1:-1;;;;;60302:20:0;;;;:34;;:57;;60337:6;;60345:13;;60302:57;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60302:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60302:57:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;60302:57:0;;;;;;;;;60216:18;:154::i;28087:148::-;28193:9;28087:148;:::o;20685:467::-;20886:8;;20924:47;;-1:-1:-1;;;;;20886:8:0;;;;:27;;20924:47;;20935:6;;20943:5;;20950:9;;20961:4;;20967:3;;20924:47;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;20924:47:0;;;20914:58;;;;;;20886:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20886:87:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20886:87:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20886:87:0;;;;;;;;;20885:88;20863:206;;;;-1:-1:-1;;;20863:206:0;;;;;;;;;21082:8;;:62;;-1:-1:-1;;;21082:62:0;;-1:-1:-1;;;;;21082:8:0;;;;:25;;:62;;21108:6;;21116:5;;21123:9;;21134:4;;21140:3;;21082:62;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21082:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21082:62:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21082:62:0;;;;;;;;;;20685:467;;;;;:::o;27532:170::-;27658:3;;:36;;-1:-1:-1;;;27658:36:0;;27631:7;;-1:-1:-1;;;;;27658:3:0;;:17;;:36;;27676:4;;27682:11;;27658:36;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27658:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27658:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;27658:36:0;;;;;;;;29511:112;29572:7;29599:16;29606:1;29609;29599:16;;;;;;;;;;;;29399:7;29431:5;;;29463:12;-1:-1:-1;;;;;29455:6:0;;;;;;;;29447:29;;;;-1:-1:-1;;;29447:29:0;;;;;;;;;;-1:-1:-1;29494:1:0;29310:193;-1:-1:-1;;;;29310:193:0:o;56199:4184::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;56199:4184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;56199:4184:0;-1:-1:-1;;;;;56199:4184:0;;;;;;;;;;;-1:-1:-1;56199:4184:0;;;;;;;-1:-1:-1;56199:4184:0;;;-1:-1:-1;56199:4184:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56199:4184:0;;;-1:-1:-1;56199:4184:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;56199:4184:0;;;-1:-1:-1;56199:4184:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;56199:4184:0;;;-1:-1:-1;56199:4184:0;:::i;:::-;;;;;;;;;-1:-1:-1;56199:4184:0;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;56199:4184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;160:707;;277:3;270:4;262:6;258:17;254:27;244:2;;295:1;292;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;;;354:80;;;345:89;;451:5;476:6;469:5;462:21;506:4;498:6;494:17;484:27;;528:4;523:3;519:14;512:21;;581:6;628:3;620:4;612:6;608:17;603:3;599:27;596:36;593:2;;;645:1;642;635:12;593:2;670:1;655:206;680:6;677:1;674:13;655:206;;;738:3;760:37;793:3;781:10;760:37;;;748:50;;-1:-1;821:4;812:14;;;;840;;;;;702:1;695:9;655:206;;;659:14;237:630;;;;;;;;891:693;;1013:3;1006:4;998:6;994:17;990:27;980:2;;1031:1;1028;1021:12;980:2;1068:6;1055:20;1090:85;1105:69;1167:6;1105:69;;1090:85;1203:21;;;1247:4;1235:17;;;;1081:94;;-1:-1;1260:14;;1235:17;1355:1;1340:238;1365:6;1362:1;1359:13;1340:238;;;1448:3;1435:17;1427:6;1423:30;1472:42;1510:3;1498:10;1472:42;;;1460:55;;-1:-1;1538:4;1529:14;;;;1557;;;;;1387:1;1380:9;1340:238;;1609:696;;1732:3;1725:4;1717:6;1713:17;1709:27;1699:2;;1750:1;1747;1740:12;1699:2;1787:6;1774:20;1809:86;1824:70;1887:6;1824:70;;1809:86;1923:21;;;1967:4;1955:17;;;;1800:95;;-1:-1;1980:14;;1955:17;2075:1;2060:239;2085:6;2082:1;2079:13;2060:239;;;2168:3;2155:17;2147:6;2143:30;2192:43;2231:3;2219:10;2192:43;;;2180:56;;-1:-1;2259:4;2250:14;;;;2278;;;;;2107:1;2100:9;2060:239;;2331:707;;2448:3;2441:4;2433:6;2429:17;2425:27;2415:2;;2466:1;2463;2456:12;2415:2;2503:6;2490:20;2525:80;2540:64;2597:6;2540:64;;2525:80;2516:89;;2622:5;2647:6;2640:5;2633:21;2677:4;2669:6;2665:17;2655:27;;2699:4;2694:3;2690:14;2683:21;;2752:6;2799:3;2791:4;2783:6;2779:17;2774:3;2770:27;2767:36;2764:2;;;2816:1;2813;2806:12;2764:2;2841:1;2826:206;2851:6;2848:1;2845:13;2826:206;;;2909:3;2931:37;2964:3;2952:10;2931:37;;;2919:50;;-1:-1;2992:4;2983:14;;;;3011;;;;;2873:1;2866:9;2826:206;;3046:124;3110:20;;3135:30;3110:20;3135:30;;3177:128;3252:13;;3270:30;3252:13;3270:30;;3312:130;3379:20;;3404:33;3379:20;3404:33;;3449:134;3527:13;;3545:33;3527:13;3545:33;;3591:432;;3688:3;3681:4;3673:6;3669:17;3665:27;3655:2;;3706:1;3703;3696:12;3655:2;3743:6;3730:20;3765:60;3780:44;3817:6;3780:44;;3765:60;3756:69;;3845:6;3838:5;3831:21;3881:4;3873:6;3869:17;3914:4;3907:5;3903:16;3949:3;3940:6;3935:3;3931:16;3928:25;3925:2;;;3966:1;3963;3956:12;3925:2;3976:41;4010:6;4005:3;4000;3976:41;;;3648:375;;;;;;;;4032:442;;4144:3;4137:4;4129:6;4125:17;4121:27;4111:2;;4162:1;4159;4152:12;4111:2;4192:6;4186:13;4214:64;4229:48;4270:6;4229:48;;4214:64;4205:73;;4298:6;4291:5;4284:21;4334:4;4326:6;4322:17;4367:4;4360:5;4356:16;4402:3;4393:6;4388:3;4384:16;4381:25;4378:2;;;4419:1;4416;4409:12;4378:2;4429:39;4461:6;4456:3;4451;4429:39;;5376:134;5454:13;;5472:33;5454:13;5472:33;;5795:126;5860:20;;5885:31;5860:20;5885:31;;5928:241;;6032:2;6020:9;6011:7;6007:23;6003:32;6000:2;;;6048:1;6045;6038:12;6000:2;6083:1;6100:53;6145:7;6125:9;6100:53;;;6090:63;5994:175;-1:-1;;;;5994:175;6176:366;;;6297:2;6285:9;6276:7;6272:23;6268:32;6265:2;;;6313:1;6310;6303:12;6265:2;6348:1;6365:53;6410:7;6390:9;6365:53;;;6355:63;;6327:97;6455:2;6473:53;6518:7;6509:6;6498:9;6494:22;6473:53;;;6463:63;;6434:98;6259:283;;;;;;6549:360;;;6667:2;6655:9;6646:7;6642:23;6638:32;6635:2;;;6683:1;6680;6673:12;6635:2;6718:1;6735:53;6780:7;6760:9;6735:53;;;6725:63;;6697:97;6825:2;6843:50;6885:7;6876:6;6865:9;6861:22;6843:50;;6916:366;;;7037:2;7025:9;7016:7;7012:23;7008:32;7005:2;;;7053:1;7050;7043:12;7005:2;7088:1;7105:53;7150:7;7130:9;7105:53;;;7095:63;;7067:97;7195:2;7213:53;7258:7;7249:6;7238:9;7234:22;7213:53;;7289:485;;;;7424:2;7412:9;7403:7;7399:23;7395:32;7392:2;;;7440:1;7437;7430:12;7392:2;7475:1;7492:53;7537:7;7517:9;7492:53;;;7482:63;;7454:97;7582:2;7600:53;7645:7;7636:6;7625:9;7621:22;7600:53;;;7590:63;;7561:98;7690:2;7708:50;7750:7;7741:6;7730:9;7726:22;7708:50;;;7698:60;;7669:95;7386:388;;;;;;7781:1647;;;;;;;8101:3;8089:9;8080:7;8076:23;8072:33;8069:2;;;8118:1;8115;8108:12;8069:2;8153:31;;8204:18;8193:30;;8190:2;;;8236:1;8233;8226:12;8190:2;8256:78;8326:7;8317:6;8306:9;8302:22;8256:78;;;8246:88;;8132:208;8399:2;8388:9;8384:18;8371:32;8423:18;8415:6;8412:30;8409:2;;;8455:1;8452;8445:12;8409:2;8475:78;8545:7;8536:6;8525:9;8521:22;8475:78;;;8465:88;;8350:209;8618:2;8607:9;8603:18;8590:32;8642:18;8634:6;8631:30;8628:2;;;8674:1;8671;8664:12;8628:2;8694:84;8770:7;8761:6;8750:9;8746:22;8694:84;;;8684:94;;8569:215;8843:2;8832:9;8828:18;8815:32;8867:18;8859:6;8856:30;8853:2;;;8899:1;8896;8889:12;8853:2;8919:83;8994:7;8985:6;8974:9;8970:22;8919:83;;;8909:93;;8794:214;9067:3;9056:9;9052:19;9039:33;9092:18;9084:6;9081:30;9078:2;;;9124:1;9121;9114:12;9078:2;9144:63;9199:7;9190:6;9179:9;9175:22;9144:63;;;9134:73;;9018:195;9272:3;9261:9;9257:19;9244:33;9297:18;9289:6;9286:30;9283:2;;;9329:1;9326;9319:12;9283:2;9349:63;9404:7;9395:6;9384:9;9380:22;9349:63;;;9339:73;;9223:195;8063:1365;;;;;;;;;9435:257;;9547:2;9535:9;9526:7;9522:23;9518:32;9515:2;;;9563:1;9560;9553:12;9515:2;9598:1;9615:61;9668:7;9648:9;9615:61;;9699:263;;9814:2;9802:9;9793:7;9789:23;9785:32;9782:2;;;9830:1;9827;9820:12;9782:2;9865:1;9882:64;9938:7;9918:9;9882:64;;9969:360;;10093:2;10081:9;10072:7;10068:23;10064:32;10061:2;;;10109:1;10106;10099:12;10061:2;10144:24;;10188:18;10177:30;;10174:2;;;10220:1;10217;10210:12;10174:2;10240:73;10305:7;10296:6;10285:9;10281:22;10240:73;;10336:263;;10451:2;10439:9;10430:7;10426:23;10422:32;10419:2;;;10467:1;10464;10457:12;10419:2;10502:1;10519:64;10575:7;10555:9;10519:64;;10606:241;;10710:2;10698:9;10689:7;10685:23;10681:32;10678:2;;;10726:1;10723;10716:12;10678:2;10761:1;10778:53;10823:7;10803:9;10778:53;;11124:366;;;11245:2;11233:9;11224:7;11220:23;11216:32;11213:2;;;11261:1;11258;11251:12;11213:2;11296:1;11313:53;11358:7;11338:9;11313:53;;11497:360;;;11615:2;11603:9;11594:7;11590:23;11586:32;11583:2;;;11631:1;11628;11621:12;11583:2;11666:1;11683:53;11728:7;11708:9;11683:53;;11864:733;;;;;;12031:3;12019:9;12010:7;12006:23;12002:33;11999:2;;;12048:1;12045;12038:12;11999:2;12083:1;12100:53;12145:7;12125:9;12100:53;;;12090:63;;12062:97;12190:2;12208:50;12250:7;12241:6;12230:9;12226:22;12208:50;;;12198:60;;12169:95;12295:2;12313:51;12356:7;12347:6;12336:9;12332:22;12313:51;;;12303:61;;12274:96;12401:2;12419:53;12464:7;12455:6;12444:9;12440:22;12419:53;;;12409:63;;12380:98;12509:3;12528:53;12573:7;12564:6;12553:9;12549:22;12528:53;;;12518:63;;12488:99;11993:604;;;;;;;;;12605:173;;12692:46;12734:3;12726:6;12692:46;;;-1:-1;;12767:4;12758:14;;12685:93;12787:177;;12898:60;12954:3;12946:6;12898:60;;13163:173;;13250:46;13292:3;13284:6;13250:46;;13344:142;13435:45;13474:5;13435:45;;;13430:3;13423:58;13417:69;;;13493:103;13566:24;13584:5;13566:24;;13754:690;;13899:54;13947:5;13899:54;;;13966:86;14045:6;14040:3;13966:86;;;13959:93;;14073:56;14123:5;14073:56;;;14149:7;14177:1;14162:260;14187:6;14184:1;14181:13;14162:260;;;14254:6;14248:13;14275:63;14334:3;14319:13;14275:63;;;14268:70;;14355:60;14408:6;14355:60;;;14345:70;-1:-1;;14209:1;14202:9;14162:260;;;-1:-1;14435:3;;13878:566;-1:-1;;;;;13878:566;14479:888;;14634:59;14687:5;14634:59;;;14706:91;14790:6;14785:3;14706:91;;;14699:98;;14820:3;14862:4;14854:6;14850:17;14845:3;14841:27;14889:61;14944:5;14889:61;;;14970:7;14998:1;14983:345;15008:6;15005:1;15002:13;14983:345;;;15070:9;15064:4;15060:20;15055:3;15048:33;15115:6;15109:13;15137:74;15206:4;15191:13;15137:74;;;15129:82;;15228:65;15286:6;15228:65;;;15316:4;15307:14;;;;;15218:75;-1:-1;;15030:1;15023:9;14983:345;;;-1:-1;15341:4;;14613:754;-1:-1;;;;;;;14613:754;15404:896;;15561:60;15615:5;15561:60;;;15634:92;15719:6;15714:3;15634:92;;;15627:99;;15749:3;15791:4;15783:6;15779:17;15774:3;15770:27;15818:62;15874:5;15818:62;;;15900:7;15928:1;15913:348;15938:6;15935:1;15932:13;15913:348;;;16000:9;15994:4;15990:20;15985:3;15978:33;16045:6;16039:13;16067:76;16138:4;16123:13;16067:76;;;16059:84;;16160:66;16219:6;16160:66;;;16249:4;16240:14;;;;;16150:76;-1:-1;;15960:1;15953:9;15913:348;;16339:690;;16484:54;16532:5;16484:54;;;16551:86;16630:6;16625:3;16551:86;;;16544:93;;16658:56;16708:5;16658:56;;;16734:7;16762:1;16747:260;16772:6;16769:1;16766:13;16747:260;;;16839:6;16833:13;16860:63;16919:3;16904:13;16860:63;;;16853:70;;16940:60;16993:6;16940:60;;;16930:70;-1:-1;;16794:1;16787:9;16747:260;;17037:94;17104:21;17119:5;17104:21;;17249:113;17332:24;17350:5;17332:24;;17369:152;17470:45;17490:24;17508:5;17490:24;;;17470:45;;17528:343;;17638:38;17670:5;17638:38;;;17688:70;17751:6;17746:3;17688:70;;;17681:77;;17763:52;17808:6;17803:3;17796:4;17789:5;17785:16;17763:52;;;17836:29;17858:6;17836:29;;;17827:39;;;;17618:253;-1:-1;;;17618:253;18223:818;;18340:5;18334:12;18374:1;18363:9;18359:17;18387:1;18382:247;;;;18640:1;18635:400;;;;18352:683;;18382:247;18460:4;18456:1;18445:9;18441:17;18437:28;18479:70;18542:6;18537:3;18479:70;;;-1:-1;;18568:25;;18556:38;;18472:77;-1:-1;;18617:4;18608:14;;;-1:-1;18382:247;;18635:400;18704:1;18693:9;18689:17;18720:70;18783:6;18778:3;18720:70;;;18713:77;;18812:37;18843:5;18812:37;;;18865:1;18873:130;18887:6;18884:1;18881:13;18873:130;;;18946:14;;18933:11;;;18926:35;18993:1;18980:15;;;;18909:4;18902:12;18873:130;;;19017:11;;;-1:-1;;;18352:683;;18310:731;;;;;;19049:180;19159:64;19217:5;19159:64;;19586:156;19684:52;19730:5;19684:52;;21632:566;;21792:67;21856:2;21851:3;21792:67;;;21892:66;21872:87;;21993:66;21988:2;21979:12;;21972:88;-1:-1;;;22089:2;22080:12;;22073:88;22189:2;22180:12;;21778:420;-1:-1;;21778:420;22207:566;;22367:67;22431:2;22426:3;22367:67;;;22467:66;22447:87;;22568:66;22563:2;22554:12;;22547:88;-1:-1;;;22664:2;22655:12;;22648:88;22764:2;22755:12;;22353:420;-1:-1;;22353:420;22782:465;;22942:67;23006:2;23001:3;22942:67;;;23042:66;23022:87;;-1:-1;;;23138:2;23129:12;;23122:88;23238:2;23229:12;;22928:319;-1:-1;;22928:319;23256:465;;23416:67;23480:2;23475:3;23416:67;;;23516:66;23496:87;;-1:-1;;;23612:2;23603:12;;23596:88;23712:2;23703:12;;23402:319;-1:-1;;23402:319;23730:398;;23908:84;23990:1;23985:3;23908:84;;;-1:-1;;;24005:87;;24120:1;24111:11;;23894:234;-1:-1;;23894:234;24137:465;;24297:67;24361:2;24356:3;24297:67;;;24397:66;24377:87;;-1:-1;;;24493:2;24484:12;;24477:88;24593:2;24584:12;;24283:319;-1:-1;;24283:319;24611:465;;24771:67;24835:2;24830:3;24771:67;;;24871:66;24851:87;;24972:66;24967:2;24958:12;;24951:88;25067:2;25058:12;;24757:319;-1:-1;;24757:319;25085:465;;25245:67;25309:2;25304:3;25245:67;;;25345:66;25325:87;;-1:-1;;;25441:2;25432:12;;25425:88;25541:2;25532:12;;25231:319;-1:-1;;25231:319;25559:465;;25719:67;25783:2;25778:3;25719:67;;;25819:66;25799:87;;-1:-1;;;25915:2;25906:12;;25899:88;26015:2;26006:12;;25705:319;-1:-1;;25705:319;26033:566;;26193:67;26257:2;26252:3;26193:67;;;26293:66;26273:87;;26394:66;26389:2;26380:12;;26373:88;26495:66;26490:2;26481:12;;26474:88;26590:2;26581:12;;26179:420;-1:-1;;26179:420;26608:465;;26768:67;26832:2;26827:3;26768:67;;;26868:66;26848:87;;-1:-1;;;26964:2;26955:12;;26948:88;27064:2;27055:12;;26754:319;-1:-1;;26754:319;27082:465;;27242:67;27306:2;27301:3;27242:67;;;27342:66;27322:87;;27443:66;27438:2;27429:12;;27422:88;27538:2;27529:12;;27228:319;-1:-1;;27228:319;27556:465;;27716:67;27780:2;27775:3;27716:67;;;27816:66;27796:87;;-1:-1;;;27912:2;27903:12;;27896:88;28012:2;28003:12;;27702:319;-1:-1;;27702:319;28030:465;;28190:67;28254:2;28249:3;28190:67;;;28290:66;28270:87;;-1:-1;;;28386:2;28377:12;;28370:88;28486:2;28477:12;;28176:319;-1:-1;;28176:319;28504:602;;28682:85;28764:2;28759:3;28682:85;;;28800:66;28780:87;;28901:66;28896:2;28887:12;;28880:88;-1:-1;;;28997:2;28988:12;;28981:88;29097:2;29088:12;;28668:438;-1:-1;;28668:438;29115:501;;29293:85;29375:2;29370:3;29293:85;;;29411:66;29391:87;;-1:-1;;;29507:2;29498:12;;29491:88;29607:2;29598:12;;29279:337;-1:-1;;29279:337;29625:566;;29785:67;29849:2;29844:3;29785:67;;;29885:66;29865:87;;29986:66;29981:2;29972:12;;29965:88;-1:-1;;;30082:2;30073:12;;30066:88;30182:2;30173:12;;29771:420;-1:-1;;29771:420;30200:465;;30360:67;30424:2;30419:3;30360:67;;;30460:66;30440:87;;-1:-1;;;30556:2;30547:12;;30540:88;30656:2;30647:12;;30346:319;-1:-1;;30346:319;30674:465;;30834:67;30898:2;30893:3;30834:67;;;30934:66;30914:87;;-1:-1;;;31030:2;31021:12;;31014:88;31130:2;31121:12;;30820:319;-1:-1;;30820:319;31148:566;;31308:67;31372:2;31367:3;31308:67;;;31408:66;31388:87;;31509:66;31504:2;31495:12;;31488:88;-1:-1;;;31605:2;31596:12;;31589:88;31705:2;31696:12;;31294:420;-1:-1;;31294:420;31723:566;;31883:67;31947:2;31942:3;31883:67;;;31983:66;31963:87;;32084:66;32079:2;32070:12;;32063:88;-1:-1;;;32180:2;32171:12;;32164:88;32280:2;32271:12;;31869:420;-1:-1;;31869:420;32298:465;;32458:67;32522:2;32517:3;32458:67;;;32558:66;32538:87;;-1:-1;;;32654:2;32645:12;;32638:88;32754:2;32745:12;;32444:319;-1:-1;;32444:319;32772:465;;32932:67;32996:2;32991:3;32932:67;;;33032:66;33012:87;;-1:-1;;;33128:2;33119:12;;33112:88;33228:2;33219:12;;32918:319;-1:-1;;32918:319;33246:465;;33406:67;33470:2;33465:3;33406:67;;;33506:66;33486:87;;33607:66;33602:2;33593:12;;33586:88;33702:2;33693:12;;33392:319;-1:-1;;33392:319;33720:465;;33880:67;33944:2;33939:3;33880:67;;;33980:66;33960:87;;-1:-1;;;34076:2;34067:12;;34060:88;34176:2;34167:12;;33866:319;-1:-1;;33866:319;34194:465;;34354:67;34418:2;34413:3;34354:67;;;34454:66;34434:87;;-1:-1;;;34550:2;34541:12;;34534:88;34650:2;34641:12;;34340:319;-1:-1;;34340:319;34668:566;;34828:67;34892:2;34887:3;34828:67;;;34928:66;34908:87;;35029:66;35024:2;35015:12;;35008:88;35130:66;35125:2;35116:12;;35109:88;35225:2;35216:12;;34814:420;-1:-1;;34814:420;35243:465;;35403:67;35467:2;35462:3;35403:67;;;35503:66;35483:87;;-1:-1;;;35599:2;35590:12;;35583:88;35699:2;35690:12;;35389:319;-1:-1;;35389:319;35717:465;;35877:67;35941:2;35936:3;35877:67;;;35977:66;35957:87;;-1:-1;;;36073:2;36064:12;;36057:88;36173:2;36164:12;;35863:319;-1:-1;;35863:319;36191:465;;36351:67;36415:2;36410:3;36351:67;;;36451:66;36431:87;;-1:-1;;;36547:2;36538:12;;36531:88;36647:2;36638:12;;36337:319;-1:-1;;36337:319;36665:465;;36825:67;36889:2;36884:3;36825:67;;;36925:66;36905:87;;-1:-1;;;37021:2;37012:12;;37005:88;37121:2;37112:12;;36811:319;-1:-1;;36811:319;37139:465;;37299:67;37363:2;37358:3;37299:67;;;37399:66;37379:87;;-1:-1;;;37495:2;37486:12;;37479:88;37595:2;37586:12;;37285:319;-1:-1;;37285:319;37687:622;37898:22;;37828:4;37819:14;;;37926:56;37823:3;37898:22;37926:56;;;37848:140;38064:4;38057:5;38053:16;38047:23;38076:57;38127:4;38122:3;38118:14;38104:12;38076:57;;;37998:141;38213:4;38206:5;38202:16;38196:23;38225:63;38282:4;38277:3;38273:14;38259:12;38316:103;38389:24;38407:5;38389:24;;38546:126;38629:37;38660:5;38629:37;;38909:107;38988:22;39004:5;38988:22;;39023:650;;39278:148;39422:3;39278:148;;;39271:155;;39437:75;39508:3;39499:6;39437:75;;;39534:2;39529:3;39525:12;39518:19;;39548:75;39619:3;39610:6;39548:75;;;-1:-1;39645:2;39636:12;;39259:414;-1:-1;;39259:414;39680:372;;39879:148;40023:3;39879:148;;40059:372;;40258:148;40402:3;40258:148;;40438:213;40556:2;40541:18;;40570:71;40545:9;40614:6;40570:71;;40658:324;40804:2;40789:18;;40818:71;40793:9;40862:6;40818:71;;;40900:72;40968:2;40957:9;40953:18;40944:6;40900:72;;40989:535;41185:3;41170:19;;41200:71;41174:9;41244:6;41200:71;;;41282:72;41350:2;41339:9;41335:18;41326:6;41282:72;;;41365:66;41427:2;41416:9;41412:18;41403:6;41365:66;;;41442:72;41510:2;41499:9;41495:18;41486:6;41442:72;;41531:831;41799:3;41784:19;;41814:71;41788:9;41858:6;41814:71;;;41896:72;41964:2;41953:9;41949:18;41940:6;41896:72;;;42016:9;42010:4;42006:20;42001:2;41990:9;41986:18;41979:48;42041:78;42114:4;42105:6;42041:78;;;42033:86;;42167:9;42161:4;42157:20;42152:2;42141:9;42137:18;42130:48;42192:76;42263:4;42254:6;42192:76;;;42184:84;;42279:73;42347:3;42336:9;42332:19;42323:6;42279:73;;42369:819;42631:3;42616:19;;42646:71;42620:9;42690:6;42646:71;;;42728:72;42796:2;42785:9;42781:18;42772:6;42728:72;;;42848:9;42842:4;42838:20;42833:2;42822:9;42818:18;42811:48;42873:75;42943:4;42934:6;42873:75;;;42865:83;;42996:9;42990:4;42986:20;42981:2;42970:9;42966:18;42959:48;43021:73;43089:4;43080:6;43021:73;;43195:1183;43619:3;43634:47;;;43604:19;;43695:108;43604:19;43789:6;43695:108;;;43687:116;;43851:9;43845:4;43841:20;43836:2;43825:9;43821:18;43814:48;43876:108;43979:4;43970:6;43876:108;;;43868:116;;44032:9;44026:4;44022:20;44017:2;44006:9;44002:18;43995:48;44057:120;44172:4;44163:6;44057:120;;;44049:128;;44225:9;44219:4;44215:20;44210:2;44199:9;44195:18;44188:48;44250:118;44363:4;44354:6;44250:118;;44385:201;44497:2;44482:18;;44511:65;44486:9;44549:6;44511:65;;44593:213;44711:2;44696:18;;44725:71;44700:9;44769:6;44725:71;;44813:547;45015:3;45000:19;;45030:71;45004:9;45074:6;45030:71;;;45112:72;45180:2;45169:9;45165:18;45156:6;45112:72;;;45195;45263:2;45252:9;45248:18;45239:6;45195:72;;;45278;45346:2;45335:9;45331:18;45322:6;45278:72;;45367:423;45535:2;45520:18;;45549:71;45524:9;45593:6;45549:71;;;45631:72;45699:2;45688:9;45684:18;45675:6;45631:72;;;45714:66;45776:2;45765:9;45761:18;45752:6;45714:66;;45797:539;45995:3;45980:19;;46010:71;45984:9;46054:6;46010:71;;;46092:68;46156:2;46145:9;46141:18;46132:6;46092:68;;;46171:72;46239:2;46228:9;46224:18;46215:6;46171:72;;;46254;46322:2;46311:9;46307:18;46298:6;46254:72;;46343:267;46488:2;46473:18;;46502:98;46477:9;46573:6;46502:98;;47141:243;47274:2;47259:18;;47288:86;47263:9;47347:6;47288:86;;47391:293;47525:2;47539:47;;;47510:18;;47600:74;47510:18;47660:6;47600:74;;47999:407;48190:2;48204:47;;;48175:18;;48265:131;48175:18;48265:131;;48413:407;48604:2;48618:47;;;48589:18;;48679:131;48589:18;48679:131;;48827:407;49018:2;49032:47;;;49003:18;;49093:131;49003:18;49093:131;;49241:407;49432:2;49446:47;;;49417:18;;49507:131;49417:18;49507:131;;49655:407;49846:2;49860:47;;;49831:18;;49921:131;49831:18;49921:131;;50069:407;50260:2;50274:47;;;50245:18;;50335:131;50245:18;50335:131;;50483:407;50674:2;50688:47;;;50659:18;;50749:131;50659:18;50749:131;;50897:407;51088:2;51102:47;;;51073:18;;51163:131;51073:18;51163:131;;51311:407;51502:2;51516:47;;;51487:18;;51577:131;51487:18;51577:131;;51725:407;51916:2;51930:47;;;51901:18;;51991:131;51901:18;51991:131;;52139:407;52330:2;52344:47;;;52315:18;;52405:131;52315:18;52405:131;;52553:407;52744:2;52758:47;;;52729:18;;52819:131;52729:18;52819:131;;52967:407;53158:2;53172:47;;;53143:18;;53233:131;53143:18;53233:131;;53381:407;53572:2;53586:47;;;53557:18;;53647:131;53557:18;53647:131;;53795:407;53986:2;54000:47;;;53971:18;;54061:131;53971:18;54061:131;;54209:407;54400:2;54414:47;;;54385:18;;54475:131;54385:18;54475:131;;54623:407;54814:2;54828:47;;;54799:18;;54889:131;54799:18;54889:131;;55037:407;55228:2;55242:47;;;55213:18;;55303:131;55213:18;55303:131;;55451:407;55642:2;55656:47;;;55627:18;;55717:131;55627:18;55717:131;;55865:407;56056:2;56070:47;;;56041:18;;56131:131;56041:18;56131:131;;56279:407;56470:2;56484:47;;;56455:18;;56545:131;56455:18;56545:131;;56693:407;56884:2;56898:47;;;56869:18;;56959:131;56869:18;56959:131;;57107:407;57298:2;57312:47;;;57283:18;;57373:131;57283:18;57373:131;;57521:407;57712:2;57726:47;;;57697:18;;57787:131;57697:18;57787:131;;57935:407;58126:2;58140:47;;;58111:18;;58201:131;58111:18;58201:131;;58349:407;58540:2;58554:47;;;58525:18;;58615:131;58525:18;58615:131;;58763:407;58954:2;58968:47;;;58939:18;;59029:131;58939:18;59029:131;;59177:407;59368:2;59382:47;;;59353:18;;59443:131;59353:18;59443:131;;59591:407;59782:2;59796:47;;;59767:18;;59857:131;59767:18;59857:131;;60005:309;60171:2;60156:18;;60185:119;60160:9;60277:6;60185:119;;60321:213;60439:2;60424:18;;60453:71;60428:9;60497:6;60453:71;;60761:2047;61401:3;61386:19;;61416:71;61390:9;61460:6;61416:71;;;61498:80;61574:2;61563:9;61559:18;61550:6;61498:80;;;61626:9;61620:4;61616:20;61611:2;61600:9;61596:18;61589:48;61651:108;61754:4;61745:6;61651:108;;;61643:116;;61807:9;61801:4;61797:20;61792:2;61781:9;61777:18;61770:48;61832:108;61935:4;61926:6;61832:108;;;61824:116;;61989:9;61983:4;61979:20;61973:3;61962:9;61958:19;61951:49;62014:120;62129:4;62120:6;62014:120;;;62006:128;;62183:9;62177:4;62173:20;62167:3;62156:9;62152:19;62145:49;62208:118;62321:4;62312:6;62208:118;;;62200:126;;62337:73;62405:3;62394:9;62390:19;62381:6;62337:73;;;62421;62489:3;62478:9;62474:19;62465:6;62421:73;;;62543:9;62537:4;62533:20;62527:3;62516:9;62512:19;62505:49;62568:78;62641:4;62632:6;62568:78;;;62560:86;;62695:9;62689:4;62685:20;62679:3;62668:9;62664:19;62657:49;62720:78;62793:4;62784:6;62720:78;;;62712:86;61372:1436;-1:-1;;;;;;;;;;;;61372:1436;62815:1083;63145:3;63130:19;;63160:71;63134:9;63204:6;63160:71;;;63242:72;63310:2;63299:9;63295:18;63286:6;63242:72;;;63325;63393:2;63382:9;63378:18;63369:6;63325:72;;;63408;63476:2;63465:9;63461:18;63452:6;63408:72;;;63491:73;63559:3;63548:9;63544:19;63535:6;63491:73;;;63575;63643:3;63632:9;63628:19;63619:6;63575:73;;;63659;63727:3;63716:9;63712:19;63703:6;63659:73;;;63743:67;63805:3;63794:9;63790:19;63781:6;63743:67;;;63821;63883:3;63872:9;63868:19;63859:6;63821:67;;63905:324;64051:2;64036:18;;64065:71;64040:9;64109:6;64065:71;;64236:256;64298:2;64292:9;64324:17;;;64399:18;64384:34;;64420:22;;;64381:62;64378:2;;;64456:1;64453;64446:12;64378:2;64472;64465:22;64276:216;;-1:-1;64276:216;64499:304;;64658:18;64650:6;64647:30;64644:2;;;64690:1;64687;64680:12;64644:2;-1:-1;64725:4;64713:17;;;64778:15;;64581:222;65754:317;;65893:18;65885:6;65882:30;65879:2;;;65925:1;65922;65915:12;65879:2;-1:-1;66056:4;65992;65969:17;;;;-1:-1;;65965:33;66046:15;;65816:255;67060:151;67184:4;67175:14;;67132:79;67703:157;;67797:14;;;67839:4;67826:18;;;67756:104;68032:137;68135:12;;68106:63;69597:178;69715:19;;;69764:4;69755:14;;69708:67;71175:91;;71237:24;71255:5;71237:24;;71273:85;71339:13;71332:21;;71315:43;71444:140;71523:5;71529:50;71523:5;71529:50;;71591:113;-1:-1;;;;;71653:46;;71636:68;71711:121;-1:-1;;;;;71773:54;;71756:76;71918:81;71989:4;71978:16;;71961:38;72006:129;;72093:37;72124:5;72142:175;;72248:64;72306:5;72248:64;;73078:140;;73172:41;73207:5;73172:41;;73225:108;;73304:24;73322:5;73304:24;;73584:145;73665:6;73660:3;73655;73642:30;-1:-1;73721:1;73703:16;;73696:27;73635:94;73738:268;73803:1;73810:101;73824:6;73821:1;73818:13;73810:101;;;73891:11;;;73885:18;73872:11;;;73865:39;73846:2;73839:10;73810:101;;;73926:6;73923:1;73920:13;73917:2;;;-1:-1;;73991:1;73973:16;;73966:27;73787:219;74095:97;74183:2;74163:14;-1:-1;;74159:28;;74143:49;74200:108;74286:1;74279:5;74276:12;74266:2;;74292:9;74315:117;74384:24;74402:5;74384:24;;;74377:5;74374:35;74364:2;;74423:1;74420;74413:12;74439:111;74505:21;74520:5;74505:21;;74557:117;74626:24;74644:5;74626:24;;74681:117;74750:24;74768:5;74750:24;;74929:113;74996:22;75012:5;74996:22;
Swarm Source
bzzr://2aae8125ad54540d868b2608d70e8fc7f932f34cc622472725fe2203ec7d0d9a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.