Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,928 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Post Prices | 15466397 | 856 days ago | IN | 0 ETH | 0.00067428 | ||||
Post Prices | 12708473 | 1290 days ago | IN | 0 ETH | 0.00179288 | ||||
Post Prices | 12691870 | 1292 days ago | IN | 0 ETH | 0.0025514 | ||||
Post Prices | 12687448 | 1293 days ago | IN | 0 ETH | 0.00759884 | ||||
Post Prices | 12687448 | 1293 days ago | IN | 0 ETH | 0.00609576 | ||||
Post Prices | 12684975 | 1294 days ago | IN | 0 ETH | 0.01089809 | ||||
Post Prices | 12684917 | 1294 days ago | IN | 0 ETH | 0.01182215 | ||||
Post Prices | 12684881 | 1294 days ago | IN | 0 ETH | 0.02578739 | ||||
Post Prices | 12684392 | 1294 days ago | IN | 0 ETH | 0.03125277 | ||||
Post Prices | 12684392 | 1294 days ago | IN | 0 ETH | 0.02579278 | ||||
Post Prices | 12680479 | 1294 days ago | IN | 0 ETH | 0.0120452 | ||||
Post Prices | 12680479 | 1294 days ago | IN | 0 ETH | 0.01020311 | ||||
Post Prices | 12676930 | 1295 days ago | IN | 0 ETH | 0.00556466 | ||||
Post Prices | 12676929 | 1295 days ago | IN | 0 ETH | 0.01120795 | ||||
Post Prices | 12673219 | 1295 days ago | IN | 0 ETH | 0.00670807 | ||||
Post Prices | 12673219 | 1295 days ago | IN | 0 ETH | 0.00577548 | ||||
Post Prices | 12671269 | 1296 days ago | IN | 0 ETH | 0.00327254 | ||||
Post Prices | 12671268 | 1296 days ago | IN | 0 ETH | 0.00332497 | ||||
Post Prices | 12653281 | 1298 days ago | IN | 0 ETH | 0.00368858 | ||||
Post Prices | 12653281 | 1298 days ago | IN | 0 ETH | 0.00598532 | ||||
Post Prices | 12633270 | 1302 days ago | IN | 0 ETH | 0.00373598 | ||||
Post Prices | 12628210 | 1302 days ago | IN | 0 ETH | 0.0024222 | ||||
Post Prices | 12628207 | 1302 days ago | IN | 0 ETH | 0.00389952 | ||||
Post Prices | 12626823 | 1303 days ago | IN | 0 ETH | 0.00264252 | ||||
Post Prices | 12620408 | 1304 days ago | IN | 0 ETH | 0.00626676 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
UniswapAnchoredView
Compiler Version
v0.6.10+commit.00c0fcaf
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-09-23 */ /** *Submitted for verification at Etherscan.io on 2020-08-03 */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.6.10; pragma experimental ABIEncoderV2; /** * @title The Open Oracle Data Base Contract * @author Compound Labs, Inc. */ contract OpenOracleData { /** * @notice The event emitted when a source writes to its storage */ //event Write(address indexed source, <Key> indexed key, string kind, uint64 timestamp, <Value> value); /** * @notice Write a bunch of signed datum to the authenticated storage mapping * @param message The payload containing the timestamp, and (key, value) pairs * @param signature The cryptographic signature of the message payload, authorizing the source to write * @return The keys that were written */ //function put(bytes calldata message, bytes calldata signature) external returns (<Key> memory); /** * @notice Read a single key with a pre-defined type signature from an authenticated source * @param source The verifiable author of the data * @param key The selector for the value to return * @return The claimed Unix timestamp for the data and the encoded value (defaults to (0, 0x)) */ //function get(address source, <Key> key) external view returns (uint, <Value>); /** * @notice Recovers the source address which signed a message * @dev Comparing to a claimed address would add nothing, * as the caller could simply perform the recover and claim that address. * @param message The data that was presumably signed * @param signature The fingerprint of the data + private key * @return The source address which signed the message, presumably */ function source(bytes memory message, bytes memory signature) public pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = abi.decode(signature, (bytes32, bytes32, uint8)); bytes32 hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(message))); return ecrecover(hash, v, r, s); } } /** * @title The Open Oracle Price Data Contract * @notice Values stored in this contract should represent a USD price with 6 decimals precision * @author Compound Labs, Inc. */ contract OpenOraclePriceData is OpenOracleData { ///@notice The event emitted when a source writes to its storage event Write(address indexed source, string key, uint64 timestamp, uint64 value); ///@notice The event emitted when the timestamp on a price is invalid and it is not written to storage event NotWritten(uint64 priorTimestamp, uint256 messageTimestamp, uint256 blockTimestamp); ///@notice The fundamental unit of storage for a reporter source struct Datum { uint64 timestamp; uint64 value; } /** * @dev The most recent authenticated data from all sources. * This is private because dynamic mapping keys preclude auto-generated getters. */ mapping(address => mapping(string => Datum)) private data; /** * @notice Write a bunch of signed datum to the authenticated storage mapping * @param message The payload containing the timestamp, and (key, value) pairs * @param signature The cryptographic signature of the message payload, authorizing the source to write * @return The keys that were written */ function put(bytes calldata message, bytes calldata signature) external returns (string memory) { (address source, uint64 timestamp, string memory key, uint64 value) = decodeMessage(message, signature); return putInternal(source, timestamp, key, value); } function putInternal(address source, uint64 timestamp, string memory key, uint64 value) internal returns (string memory) { // Only update if newer than stored, according to source Datum storage prior = data[source][key]; if (timestamp > prior.timestamp && timestamp < block.timestamp + 60 minutes && source != address(0)) { data[source][key] = Datum(timestamp, value); emit Write(source, key, timestamp, value); } else { emit NotWritten(prior.timestamp, timestamp, block.timestamp); } return key; } function decodeMessage(bytes calldata message, bytes calldata signature) internal pure returns (address, uint64, string memory, uint64) { // Recover the source address address source = source(message, signature); // Decode the message and check the kind (string memory kind, uint64 timestamp, string memory key, uint64 value) = abi.decode(message, (string, uint64, string, uint64)); require(keccak256(abi.encodePacked(kind)) == keccak256(abi.encodePacked("prices")), "Kind of data must be 'prices'"); return (source, timestamp, key, value); } /** * @notice Read a single key from an authenticated source * @param source The verifiable author of the data * @param key The selector for the value to return * @return The claimed Unix timestamp for the data and the price value (defaults to (0, 0)) */ function get(address source, string calldata key) external view returns (uint64, uint64) { Datum storage datum = data[source][key]; return (datum.timestamp, datum.value); } /** * @notice Read only the value for a single key from an authenticated source * @param source The verifiable author of the data * @param key The selector for the value to return * @return The price value (defaults to 0) */ function getPrice(address source, string calldata key) external view returns (uint64) { return data[source][key].value; } } interface CErc20 { function underlying() external view returns (address); } contract UniswapConfig { /// @dev Describe how to interpret the fixedPrice in the TokenConfig. enum PriceSource { FIXED_ETH, /// implies the fixedPrice is a constant multiple of the ETH price (which varies) FIXED_USD, /// implies the fixedPrice is a constant multiple of the USD price (which is 1) REPORTER /// implies the price is set by the reporter } /// @dev Describe how the USD price should be determined for an asset. /// There should be 1 TokenConfig object for each supported asset, passed in the constructor. struct TokenConfig { address cToken; address underlying; bytes32 symbolHash; uint256 baseUnit; PriceSource priceSource; uint256 fixedPrice; address uniswapMarket; bool isUniswapReversed; } /// @notice The max number of tokens this contract is hardcoded to support /// @dev Do not change this variable without updating all the fields throughout the contract. uint public constant maxTokens = 30; /// @notice The number of tokens this contract actually supports uint public immutable numTokens; address internal immutable cToken00; address internal immutable cToken01; address internal immutable cToken02; address internal immutable cToken03; address internal immutable cToken04; address internal immutable cToken05; address internal immutable cToken06; address internal immutable cToken07; address internal immutable cToken08; address internal immutable cToken09; address internal immutable cToken10; address internal immutable cToken11; address internal immutable cToken12; address internal immutable cToken13; address internal immutable cToken14; address internal immutable cToken15; address internal immutable cToken16; address internal immutable cToken17; address internal immutable cToken18; address internal immutable cToken19; address internal immutable cToken20; address internal immutable cToken21; address internal immutable cToken22; address internal immutable cToken23; address internal immutable cToken24; address internal immutable cToken25; address internal immutable cToken26; address internal immutable cToken27; address internal immutable cToken28; address internal immutable cToken29; address internal immutable underlying00; address internal immutable underlying01; address internal immutable underlying02; address internal immutable underlying03; address internal immutable underlying04; address internal immutable underlying05; address internal immutable underlying06; address internal immutable underlying07; address internal immutable underlying08; address internal immutable underlying09; address internal immutable underlying10; address internal immutable underlying11; address internal immutable underlying12; address internal immutable underlying13; address internal immutable underlying14; address internal immutable underlying15; address internal immutable underlying16; address internal immutable underlying17; address internal immutable underlying18; address internal immutable underlying19; address internal immutable underlying20; address internal immutable underlying21; address internal immutable underlying22; address internal immutable underlying23; address internal immutable underlying24; address internal immutable underlying25; address internal immutable underlying26; address internal immutable underlying27; address internal immutable underlying28; address internal immutable underlying29; bytes32 internal immutable symbolHash00; bytes32 internal immutable symbolHash01; bytes32 internal immutable symbolHash02; bytes32 internal immutable symbolHash03; bytes32 internal immutable symbolHash04; bytes32 internal immutable symbolHash05; bytes32 internal immutable symbolHash06; bytes32 internal immutable symbolHash07; bytes32 internal immutable symbolHash08; bytes32 internal immutable symbolHash09; bytes32 internal immutable symbolHash10; bytes32 internal immutable symbolHash11; bytes32 internal immutable symbolHash12; bytes32 internal immutable symbolHash13; bytes32 internal immutable symbolHash14; bytes32 internal immutable symbolHash15; bytes32 internal immutable symbolHash16; bytes32 internal immutable symbolHash17; bytes32 internal immutable symbolHash18; bytes32 internal immutable symbolHash19; bytes32 internal immutable symbolHash20; bytes32 internal immutable symbolHash21; bytes32 internal immutable symbolHash22; bytes32 internal immutable symbolHash23; bytes32 internal immutable symbolHash24; bytes32 internal immutable symbolHash25; bytes32 internal immutable symbolHash26; bytes32 internal immutable symbolHash27; bytes32 internal immutable symbolHash28; bytes32 internal immutable symbolHash29; uint256 internal immutable baseUnit00; uint256 internal immutable baseUnit01; uint256 internal immutable baseUnit02; uint256 internal immutable baseUnit03; uint256 internal immutable baseUnit04; uint256 internal immutable baseUnit05; uint256 internal immutable baseUnit06; uint256 internal immutable baseUnit07; uint256 internal immutable baseUnit08; uint256 internal immutable baseUnit09; uint256 internal immutable baseUnit10; uint256 internal immutable baseUnit11; uint256 internal immutable baseUnit12; uint256 internal immutable baseUnit13; uint256 internal immutable baseUnit14; uint256 internal immutable baseUnit15; uint256 internal immutable baseUnit16; uint256 internal immutable baseUnit17; uint256 internal immutable baseUnit18; uint256 internal immutable baseUnit19; uint256 internal immutable baseUnit20; uint256 internal immutable baseUnit21; uint256 internal immutable baseUnit22; uint256 internal immutable baseUnit23; uint256 internal immutable baseUnit24; uint256 internal immutable baseUnit25; uint256 internal immutable baseUnit26; uint256 internal immutable baseUnit27; uint256 internal immutable baseUnit28; uint256 internal immutable baseUnit29; PriceSource internal immutable priceSource00; PriceSource internal immutable priceSource01; PriceSource internal immutable priceSource02; PriceSource internal immutable priceSource03; PriceSource internal immutable priceSource04; PriceSource internal immutable priceSource05; PriceSource internal immutable priceSource06; PriceSource internal immutable priceSource07; PriceSource internal immutable priceSource08; PriceSource internal immutable priceSource09; PriceSource internal immutable priceSource10; PriceSource internal immutable priceSource11; PriceSource internal immutable priceSource12; PriceSource internal immutable priceSource13; PriceSource internal immutable priceSource14; PriceSource internal immutable priceSource15; PriceSource internal immutable priceSource16; PriceSource internal immutable priceSource17; PriceSource internal immutable priceSource18; PriceSource internal immutable priceSource19; PriceSource internal immutable priceSource20; PriceSource internal immutable priceSource21; PriceSource internal immutable priceSource22; PriceSource internal immutable priceSource23; PriceSource internal immutable priceSource24; PriceSource internal immutable priceSource25; PriceSource internal immutable priceSource26; PriceSource internal immutable priceSource27; PriceSource internal immutable priceSource28; PriceSource internal immutable priceSource29; uint256 internal immutable fixedPrice00; uint256 internal immutable fixedPrice01; uint256 internal immutable fixedPrice02; uint256 internal immutable fixedPrice03; uint256 internal immutable fixedPrice04; uint256 internal immutable fixedPrice05; uint256 internal immutable fixedPrice06; uint256 internal immutable fixedPrice07; uint256 internal immutable fixedPrice08; uint256 internal immutable fixedPrice09; uint256 internal immutable fixedPrice10; uint256 internal immutable fixedPrice11; uint256 internal immutable fixedPrice12; uint256 internal immutable fixedPrice13; uint256 internal immutable fixedPrice14; uint256 internal immutable fixedPrice15; uint256 internal immutable fixedPrice16; uint256 internal immutable fixedPrice17; uint256 internal immutable fixedPrice18; uint256 internal immutable fixedPrice19; uint256 internal immutable fixedPrice20; uint256 internal immutable fixedPrice21; uint256 internal immutable fixedPrice22; uint256 internal immutable fixedPrice23; uint256 internal immutable fixedPrice24; uint256 internal immutable fixedPrice25; uint256 internal immutable fixedPrice26; uint256 internal immutable fixedPrice27; uint256 internal immutable fixedPrice28; uint256 internal immutable fixedPrice29; address internal immutable uniswapMarket00; address internal immutable uniswapMarket01; address internal immutable uniswapMarket02; address internal immutable uniswapMarket03; address internal immutable uniswapMarket04; address internal immutable uniswapMarket05; address internal immutable uniswapMarket06; address internal immutable uniswapMarket07; address internal immutable uniswapMarket08; address internal immutable uniswapMarket09; address internal immutable uniswapMarket10; address internal immutable uniswapMarket11; address internal immutable uniswapMarket12; address internal immutable uniswapMarket13; address internal immutable uniswapMarket14; address internal immutable uniswapMarket15; address internal immutable uniswapMarket16; address internal immutable uniswapMarket17; address internal immutable uniswapMarket18; address internal immutable uniswapMarket19; address internal immutable uniswapMarket20; address internal immutable uniswapMarket21; address internal immutable uniswapMarket22; address internal immutable uniswapMarket23; address internal immutable uniswapMarket24; address internal immutable uniswapMarket25; address internal immutable uniswapMarket26; address internal immutable uniswapMarket27; address internal immutable uniswapMarket28; address internal immutable uniswapMarket29; bool internal immutable isUniswapReversed00; bool internal immutable isUniswapReversed01; bool internal immutable isUniswapReversed02; bool internal immutable isUniswapReversed03; bool internal immutable isUniswapReversed04; bool internal immutable isUniswapReversed05; bool internal immutable isUniswapReversed06; bool internal immutable isUniswapReversed07; bool internal immutable isUniswapReversed08; bool internal immutable isUniswapReversed09; bool internal immutable isUniswapReversed10; bool internal immutable isUniswapReversed11; bool internal immutable isUniswapReversed12; bool internal immutable isUniswapReversed13; bool internal immutable isUniswapReversed14; bool internal immutable isUniswapReversed15; bool internal immutable isUniswapReversed16; bool internal immutable isUniswapReversed17; bool internal immutable isUniswapReversed18; bool internal immutable isUniswapReversed19; bool internal immutable isUniswapReversed20; bool internal immutable isUniswapReversed21; bool internal immutable isUniswapReversed22; bool internal immutable isUniswapReversed23; bool internal immutable isUniswapReversed24; bool internal immutable isUniswapReversed25; bool internal immutable isUniswapReversed26; bool internal immutable isUniswapReversed27; bool internal immutable isUniswapReversed28; bool internal immutable isUniswapReversed29; /** * @notice Construct an immutable store of configs into the contract data * @param configs The configs for the supported assets */ constructor(TokenConfig[] memory configs) public { require(configs.length <= maxTokens, "too many configs"); numTokens = configs.length; cToken00 = get(configs, 0).cToken; cToken01 = get(configs, 1).cToken; cToken02 = get(configs, 2).cToken; cToken03 = get(configs, 3).cToken; cToken04 = get(configs, 4).cToken; cToken05 = get(configs, 5).cToken; cToken06 = get(configs, 6).cToken; cToken07 = get(configs, 7).cToken; cToken08 = get(configs, 8).cToken; cToken09 = get(configs, 9).cToken; cToken10 = get(configs, 10).cToken; cToken11 = get(configs, 11).cToken; cToken12 = get(configs, 12).cToken; cToken13 = get(configs, 13).cToken; cToken14 = get(configs, 14).cToken; cToken15 = get(configs, 15).cToken; cToken16 = get(configs, 16).cToken; cToken17 = get(configs, 17).cToken; cToken18 = get(configs, 18).cToken; cToken19 = get(configs, 19).cToken; cToken20 = get(configs, 20).cToken; cToken21 = get(configs, 21).cToken; cToken22 = get(configs, 22).cToken; cToken23 = get(configs, 23).cToken; cToken24 = get(configs, 24).cToken; cToken25 = get(configs, 25).cToken; cToken26 = get(configs, 26).cToken; cToken27 = get(configs, 27).cToken; cToken28 = get(configs, 28).cToken; cToken29 = get(configs, 29).cToken; underlying00 = get(configs, 0).underlying; underlying01 = get(configs, 1).underlying; underlying02 = get(configs, 2).underlying; underlying03 = get(configs, 3).underlying; underlying04 = get(configs, 4).underlying; underlying05 = get(configs, 5).underlying; underlying06 = get(configs, 6).underlying; underlying07 = get(configs, 7).underlying; underlying08 = get(configs, 8).underlying; underlying09 = get(configs, 9).underlying; underlying10 = get(configs, 10).underlying; underlying11 = get(configs, 11).underlying; underlying12 = get(configs, 12).underlying; underlying13 = get(configs, 13).underlying; underlying14 = get(configs, 14).underlying; underlying15 = get(configs, 15).underlying; underlying16 = get(configs, 16).underlying; underlying17 = get(configs, 17).underlying; underlying18 = get(configs, 18).underlying; underlying19 = get(configs, 19).underlying; underlying20 = get(configs, 20).underlying; underlying21 = get(configs, 21).underlying; underlying22 = get(configs, 22).underlying; underlying23 = get(configs, 23).underlying; underlying24 = get(configs, 24).underlying; underlying25 = get(configs, 25).underlying; underlying26 = get(configs, 26).underlying; underlying27 = get(configs, 27).underlying; underlying28 = get(configs, 28).underlying; underlying29 = get(configs, 29).underlying; symbolHash00 = get(configs, 0).symbolHash; symbolHash01 = get(configs, 1).symbolHash; symbolHash02 = get(configs, 2).symbolHash; symbolHash03 = get(configs, 3).symbolHash; symbolHash04 = get(configs, 4).symbolHash; symbolHash05 = get(configs, 5).symbolHash; symbolHash06 = get(configs, 6).symbolHash; symbolHash07 = get(configs, 7).symbolHash; symbolHash08 = get(configs, 8).symbolHash; symbolHash09 = get(configs, 9).symbolHash; symbolHash10 = get(configs, 10).symbolHash; symbolHash11 = get(configs, 11).symbolHash; symbolHash12 = get(configs, 12).symbolHash; symbolHash13 = get(configs, 13).symbolHash; symbolHash14 = get(configs, 14).symbolHash; symbolHash15 = get(configs, 15).symbolHash; symbolHash16 = get(configs, 16).symbolHash; symbolHash17 = get(configs, 17).symbolHash; symbolHash18 = get(configs, 18).symbolHash; symbolHash19 = get(configs, 19).symbolHash; symbolHash20 = get(configs, 20).symbolHash; symbolHash21 = get(configs, 21).symbolHash; symbolHash22 = get(configs, 22).symbolHash; symbolHash23 = get(configs, 23).symbolHash; symbolHash24 = get(configs, 24).symbolHash; symbolHash25 = get(configs, 25).symbolHash; symbolHash26 = get(configs, 26).symbolHash; symbolHash27 = get(configs, 27).symbolHash; symbolHash28 = get(configs, 28).symbolHash; symbolHash29 = get(configs, 29).symbolHash; baseUnit00 = get(configs, 0).baseUnit; baseUnit01 = get(configs, 1).baseUnit; baseUnit02 = get(configs, 2).baseUnit; baseUnit03 = get(configs, 3).baseUnit; baseUnit04 = get(configs, 4).baseUnit; baseUnit05 = get(configs, 5).baseUnit; baseUnit06 = get(configs, 6).baseUnit; baseUnit07 = get(configs, 7).baseUnit; baseUnit08 = get(configs, 8).baseUnit; baseUnit09 = get(configs, 9).baseUnit; baseUnit10 = get(configs, 10).baseUnit; baseUnit11 = get(configs, 11).baseUnit; baseUnit12 = get(configs, 12).baseUnit; baseUnit13 = get(configs, 13).baseUnit; baseUnit14 = get(configs, 14).baseUnit; baseUnit15 = get(configs, 15).baseUnit; baseUnit16 = get(configs, 16).baseUnit; baseUnit17 = get(configs, 17).baseUnit; baseUnit18 = get(configs, 18).baseUnit; baseUnit19 = get(configs, 19).baseUnit; baseUnit20 = get(configs, 20).baseUnit; baseUnit21 = get(configs, 21).baseUnit; baseUnit22 = get(configs, 22).baseUnit; baseUnit23 = get(configs, 23).baseUnit; baseUnit24 = get(configs, 24).baseUnit; baseUnit25 = get(configs, 25).baseUnit; baseUnit26 = get(configs, 26).baseUnit; baseUnit27 = get(configs, 27).baseUnit; baseUnit28 = get(configs, 28).baseUnit; baseUnit29 = get(configs, 29).baseUnit; priceSource00 = get(configs, 0).priceSource; priceSource01 = get(configs, 1).priceSource; priceSource02 = get(configs, 2).priceSource; priceSource03 = get(configs, 3).priceSource; priceSource04 = get(configs, 4).priceSource; priceSource05 = get(configs, 5).priceSource; priceSource06 = get(configs, 6).priceSource; priceSource07 = get(configs, 7).priceSource; priceSource08 = get(configs, 8).priceSource; priceSource09 = get(configs, 9).priceSource; priceSource10 = get(configs, 10).priceSource; priceSource11 = get(configs, 11).priceSource; priceSource12 = get(configs, 12).priceSource; priceSource13 = get(configs, 13).priceSource; priceSource14 = get(configs, 14).priceSource; priceSource15 = get(configs, 15).priceSource; priceSource16 = get(configs, 16).priceSource; priceSource17 = get(configs, 17).priceSource; priceSource18 = get(configs, 18).priceSource; priceSource19 = get(configs, 19).priceSource; priceSource20 = get(configs, 20).priceSource; priceSource21 = get(configs, 21).priceSource; priceSource22 = get(configs, 22).priceSource; priceSource23 = get(configs, 23).priceSource; priceSource24 = get(configs, 24).priceSource; priceSource25 = get(configs, 25).priceSource; priceSource26 = get(configs, 26).priceSource; priceSource27 = get(configs, 27).priceSource; priceSource28 = get(configs, 28).priceSource; priceSource29 = get(configs, 29).priceSource; fixedPrice00 = get(configs, 0).fixedPrice; fixedPrice01 = get(configs, 1).fixedPrice; fixedPrice02 = get(configs, 2).fixedPrice; fixedPrice03 = get(configs, 3).fixedPrice; fixedPrice04 = get(configs, 4).fixedPrice; fixedPrice05 = get(configs, 5).fixedPrice; fixedPrice06 = get(configs, 6).fixedPrice; fixedPrice07 = get(configs, 7).fixedPrice; fixedPrice08 = get(configs, 8).fixedPrice; fixedPrice09 = get(configs, 9).fixedPrice; fixedPrice10 = get(configs, 10).fixedPrice; fixedPrice11 = get(configs, 11).fixedPrice; fixedPrice12 = get(configs, 12).fixedPrice; fixedPrice13 = get(configs, 13).fixedPrice; fixedPrice14 = get(configs, 14).fixedPrice; fixedPrice15 = get(configs, 15).fixedPrice; fixedPrice16 = get(configs, 16).fixedPrice; fixedPrice17 = get(configs, 17).fixedPrice; fixedPrice18 = get(configs, 18).fixedPrice; fixedPrice19 = get(configs, 19).fixedPrice; fixedPrice20 = get(configs, 20).fixedPrice; fixedPrice21 = get(configs, 21).fixedPrice; fixedPrice22 = get(configs, 22).fixedPrice; fixedPrice23 = get(configs, 23).fixedPrice; fixedPrice24 = get(configs, 24).fixedPrice; fixedPrice25 = get(configs, 25).fixedPrice; fixedPrice26 = get(configs, 26).fixedPrice; fixedPrice27 = get(configs, 27).fixedPrice; fixedPrice28 = get(configs, 28).fixedPrice; fixedPrice29 = get(configs, 29).fixedPrice; uniswapMarket00 = get(configs, 0).uniswapMarket; uniswapMarket01 = get(configs, 1).uniswapMarket; uniswapMarket02 = get(configs, 2).uniswapMarket; uniswapMarket03 = get(configs, 3).uniswapMarket; uniswapMarket04 = get(configs, 4).uniswapMarket; uniswapMarket05 = get(configs, 5).uniswapMarket; uniswapMarket06 = get(configs, 6).uniswapMarket; uniswapMarket07 = get(configs, 7).uniswapMarket; uniswapMarket08 = get(configs, 8).uniswapMarket; uniswapMarket09 = get(configs, 9).uniswapMarket; uniswapMarket10 = get(configs, 10).uniswapMarket; uniswapMarket11 = get(configs, 11).uniswapMarket; uniswapMarket12 = get(configs, 12).uniswapMarket; uniswapMarket13 = get(configs, 13).uniswapMarket; uniswapMarket14 = get(configs, 14).uniswapMarket; uniswapMarket15 = get(configs, 15).uniswapMarket; uniswapMarket16 = get(configs, 16).uniswapMarket; uniswapMarket17 = get(configs, 17).uniswapMarket; uniswapMarket18 = get(configs, 18).uniswapMarket; uniswapMarket19 = get(configs, 19).uniswapMarket; uniswapMarket20 = get(configs, 20).uniswapMarket; uniswapMarket21 = get(configs, 21).uniswapMarket; uniswapMarket22 = get(configs, 22).uniswapMarket; uniswapMarket23 = get(configs, 23).uniswapMarket; uniswapMarket24 = get(configs, 24).uniswapMarket; uniswapMarket25 = get(configs, 25).uniswapMarket; uniswapMarket26 = get(configs, 26).uniswapMarket; uniswapMarket27 = get(configs, 27).uniswapMarket; uniswapMarket28 = get(configs, 28).uniswapMarket; uniswapMarket29 = get(configs, 29).uniswapMarket; isUniswapReversed00 = get(configs, 0).isUniswapReversed; isUniswapReversed01 = get(configs, 1).isUniswapReversed; isUniswapReversed02 = get(configs, 2).isUniswapReversed; isUniswapReversed03 = get(configs, 3).isUniswapReversed; isUniswapReversed04 = get(configs, 4).isUniswapReversed; isUniswapReversed05 = get(configs, 5).isUniswapReversed; isUniswapReversed06 = get(configs, 6).isUniswapReversed; isUniswapReversed07 = get(configs, 7).isUniswapReversed; isUniswapReversed08 = get(configs, 8).isUniswapReversed; isUniswapReversed09 = get(configs, 9).isUniswapReversed; isUniswapReversed10 = get(configs, 10).isUniswapReversed; isUniswapReversed11 = get(configs, 11).isUniswapReversed; isUniswapReversed12 = get(configs, 12).isUniswapReversed; isUniswapReversed13 = get(configs, 13).isUniswapReversed; isUniswapReversed14 = get(configs, 14).isUniswapReversed; isUniswapReversed15 = get(configs, 15).isUniswapReversed; isUniswapReversed16 = get(configs, 16).isUniswapReversed; isUniswapReversed17 = get(configs, 17).isUniswapReversed; isUniswapReversed18 = get(configs, 18).isUniswapReversed; isUniswapReversed19 = get(configs, 19).isUniswapReversed; isUniswapReversed20 = get(configs, 20).isUniswapReversed; isUniswapReversed21 = get(configs, 21).isUniswapReversed; isUniswapReversed22 = get(configs, 22).isUniswapReversed; isUniswapReversed23 = get(configs, 23).isUniswapReversed; isUniswapReversed24 = get(configs, 24).isUniswapReversed; isUniswapReversed25 = get(configs, 25).isUniswapReversed; isUniswapReversed26 = get(configs, 26).isUniswapReversed; isUniswapReversed27 = get(configs, 27).isUniswapReversed; isUniswapReversed28 = get(configs, 28).isUniswapReversed; isUniswapReversed29 = get(configs, 29).isUniswapReversed; } function get(TokenConfig[] memory configs, uint i) internal pure returns (TokenConfig memory) { if (i < configs.length) return configs[i]; return TokenConfig({ cToken: address(0), underlying: address(0), symbolHash: bytes32(0), baseUnit: uint256(0), priceSource: PriceSource(0), fixedPrice: uint256(0), uniswapMarket: address(0), isUniswapReversed: false }); } function getCTokenIndex(address cToken) internal view returns (uint) { if (cToken == cToken00) return 0; if (cToken == cToken01) return 1; if (cToken == cToken02) return 2; if (cToken == cToken03) return 3; if (cToken == cToken04) return 4; if (cToken == cToken05) return 5; if (cToken == cToken06) return 6; if (cToken == cToken07) return 7; if (cToken == cToken08) return 8; if (cToken == cToken09) return 9; if (cToken == cToken10) return 10; if (cToken == cToken11) return 11; if (cToken == cToken12) return 12; if (cToken == cToken13) return 13; if (cToken == cToken14) return 14; if (cToken == cToken15) return 15; if (cToken == cToken16) return 16; if (cToken == cToken17) return 17; if (cToken == cToken18) return 18; if (cToken == cToken19) return 19; if (cToken == cToken20) return 20; if (cToken == cToken21) return 21; if (cToken == cToken22) return 22; if (cToken == cToken23) return 23; if (cToken == cToken24) return 24; if (cToken == cToken25) return 25; if (cToken == cToken26) return 26; if (cToken == cToken27) return 27; if (cToken == cToken28) return 28; if (cToken == cToken29) return 29; return uint(-1); } function getUnderlyingIndex(address underlying) internal view returns (uint) { if (underlying == underlying00) return 0; if (underlying == underlying01) return 1; if (underlying == underlying02) return 2; if (underlying == underlying03) return 3; if (underlying == underlying04) return 4; if (underlying == underlying05) return 5; if (underlying == underlying06) return 6; if (underlying == underlying07) return 7; if (underlying == underlying08) return 8; if (underlying == underlying09) return 9; if (underlying == underlying10) return 10; if (underlying == underlying11) return 11; if (underlying == underlying12) return 12; if (underlying == underlying13) return 13; if (underlying == underlying14) return 14; if (underlying == underlying15) return 15; if (underlying == underlying16) return 16; if (underlying == underlying17) return 17; if (underlying == underlying18) return 18; if (underlying == underlying19) return 19; if (underlying == underlying20) return 20; if (underlying == underlying21) return 21; if (underlying == underlying22) return 22; if (underlying == underlying23) return 23; if (underlying == underlying24) return 24; if (underlying == underlying25) return 25; if (underlying == underlying26) return 26; if (underlying == underlying27) return 27; if (underlying == underlying28) return 28; if (underlying == underlying29) return 29; return uint(-1); } function getSymbolHashIndex(bytes32 symbolHash) internal view returns (uint) { if (symbolHash == symbolHash00) return 0; if (symbolHash == symbolHash01) return 1; if (symbolHash == symbolHash02) return 2; if (symbolHash == symbolHash03) return 3; if (symbolHash == symbolHash04) return 4; if (symbolHash == symbolHash05) return 5; if (symbolHash == symbolHash06) return 6; if (symbolHash == symbolHash07) return 7; if (symbolHash == symbolHash08) return 8; if (symbolHash == symbolHash09) return 9; if (symbolHash == symbolHash10) return 10; if (symbolHash == symbolHash11) return 11; if (symbolHash == symbolHash12) return 12; if (symbolHash == symbolHash13) return 13; if (symbolHash == symbolHash14) return 14; if (symbolHash == symbolHash15) return 15; if (symbolHash == symbolHash16) return 16; if (symbolHash == symbolHash17) return 17; if (symbolHash == symbolHash18) return 18; if (symbolHash == symbolHash19) return 19; if (symbolHash == symbolHash20) return 20; if (symbolHash == symbolHash21) return 21; if (symbolHash == symbolHash22) return 22; if (symbolHash == symbolHash23) return 23; if (symbolHash == symbolHash24) return 24; if (symbolHash == symbolHash25) return 25; if (symbolHash == symbolHash26) return 26; if (symbolHash == symbolHash27) return 27; if (symbolHash == symbolHash28) return 28; if (symbolHash == symbolHash29) return 29; return uint(-1); } /** * @notice Get the i-th config, according to the order they were passed in originally * @param i The index of the config to get * @return The config object */ function getTokenConfig(uint i) public view returns (TokenConfig memory) { require(i < numTokens, "token config not found"); if (i == 0) return TokenConfig({cToken: cToken00, underlying: underlying00, symbolHash: symbolHash00, baseUnit: baseUnit00, priceSource: priceSource00, fixedPrice: fixedPrice00, uniswapMarket: uniswapMarket00, isUniswapReversed: isUniswapReversed00}); if (i == 1) return TokenConfig({cToken: cToken01, underlying: underlying01, symbolHash: symbolHash01, baseUnit: baseUnit01, priceSource: priceSource01, fixedPrice: fixedPrice01, uniswapMarket: uniswapMarket01, isUniswapReversed: isUniswapReversed01}); if (i == 2) return TokenConfig({cToken: cToken02, underlying: underlying02, symbolHash: symbolHash02, baseUnit: baseUnit02, priceSource: priceSource02, fixedPrice: fixedPrice02, uniswapMarket: uniswapMarket02, isUniswapReversed: isUniswapReversed02}); if (i == 3) return TokenConfig({cToken: cToken03, underlying: underlying03, symbolHash: symbolHash03, baseUnit: baseUnit03, priceSource: priceSource03, fixedPrice: fixedPrice03, uniswapMarket: uniswapMarket03, isUniswapReversed: isUniswapReversed03}); if (i == 4) return TokenConfig({cToken: cToken04, underlying: underlying04, symbolHash: symbolHash04, baseUnit: baseUnit04, priceSource: priceSource04, fixedPrice: fixedPrice04, uniswapMarket: uniswapMarket04, isUniswapReversed: isUniswapReversed04}); if (i == 5) return TokenConfig({cToken: cToken05, underlying: underlying05, symbolHash: symbolHash05, baseUnit: baseUnit05, priceSource: priceSource05, fixedPrice: fixedPrice05, uniswapMarket: uniswapMarket05, isUniswapReversed: isUniswapReversed05}); if (i == 6) return TokenConfig({cToken: cToken06, underlying: underlying06, symbolHash: symbolHash06, baseUnit: baseUnit06, priceSource: priceSource06, fixedPrice: fixedPrice06, uniswapMarket: uniswapMarket06, isUniswapReversed: isUniswapReversed06}); if (i == 7) return TokenConfig({cToken: cToken07, underlying: underlying07, symbolHash: symbolHash07, baseUnit: baseUnit07, priceSource: priceSource07, fixedPrice: fixedPrice07, uniswapMarket: uniswapMarket07, isUniswapReversed: isUniswapReversed07}); if (i == 8) return TokenConfig({cToken: cToken08, underlying: underlying08, symbolHash: symbolHash08, baseUnit: baseUnit08, priceSource: priceSource08, fixedPrice: fixedPrice08, uniswapMarket: uniswapMarket08, isUniswapReversed: isUniswapReversed08}); if (i == 9) return TokenConfig({cToken: cToken09, underlying: underlying09, symbolHash: symbolHash09, baseUnit: baseUnit09, priceSource: priceSource09, fixedPrice: fixedPrice09, uniswapMarket: uniswapMarket09, isUniswapReversed: isUniswapReversed09}); if (i == 10) return TokenConfig({cToken: cToken10, underlying: underlying10, symbolHash: symbolHash10, baseUnit: baseUnit10, priceSource: priceSource10, fixedPrice: fixedPrice10, uniswapMarket: uniswapMarket10, isUniswapReversed: isUniswapReversed10}); if (i == 11) return TokenConfig({cToken: cToken11, underlying: underlying11, symbolHash: symbolHash11, baseUnit: baseUnit11, priceSource: priceSource11, fixedPrice: fixedPrice11, uniswapMarket: uniswapMarket11, isUniswapReversed: isUniswapReversed11}); if (i == 12) return TokenConfig({cToken: cToken12, underlying: underlying12, symbolHash: symbolHash12, baseUnit: baseUnit12, priceSource: priceSource12, fixedPrice: fixedPrice12, uniswapMarket: uniswapMarket12, isUniswapReversed: isUniswapReversed12}); if (i == 13) return TokenConfig({cToken: cToken13, underlying: underlying13, symbolHash: symbolHash13, baseUnit: baseUnit13, priceSource: priceSource13, fixedPrice: fixedPrice13, uniswapMarket: uniswapMarket13, isUniswapReversed: isUniswapReversed13}); if (i == 14) return TokenConfig({cToken: cToken14, underlying: underlying14, symbolHash: symbolHash14, baseUnit: baseUnit14, priceSource: priceSource14, fixedPrice: fixedPrice14, uniswapMarket: uniswapMarket14, isUniswapReversed: isUniswapReversed14}); if (i == 15) return TokenConfig({cToken: cToken15, underlying: underlying15, symbolHash: symbolHash15, baseUnit: baseUnit15, priceSource: priceSource15, fixedPrice: fixedPrice15, uniswapMarket: uniswapMarket15, isUniswapReversed: isUniswapReversed15}); if (i == 16) return TokenConfig({cToken: cToken16, underlying: underlying16, symbolHash: symbolHash16, baseUnit: baseUnit16, priceSource: priceSource16, fixedPrice: fixedPrice16, uniswapMarket: uniswapMarket16, isUniswapReversed: isUniswapReversed16}); if (i == 17) return TokenConfig({cToken: cToken17, underlying: underlying17, symbolHash: symbolHash17, baseUnit: baseUnit17, priceSource: priceSource17, fixedPrice: fixedPrice17, uniswapMarket: uniswapMarket17, isUniswapReversed: isUniswapReversed17}); if (i == 18) return TokenConfig({cToken: cToken18, underlying: underlying18, symbolHash: symbolHash18, baseUnit: baseUnit18, priceSource: priceSource18, fixedPrice: fixedPrice18, uniswapMarket: uniswapMarket18, isUniswapReversed: isUniswapReversed18}); if (i == 19) return TokenConfig({cToken: cToken19, underlying: underlying19, symbolHash: symbolHash19, baseUnit: baseUnit19, priceSource: priceSource19, fixedPrice: fixedPrice19, uniswapMarket: uniswapMarket19, isUniswapReversed: isUniswapReversed19}); if (i == 20) return TokenConfig({cToken: cToken20, underlying: underlying20, symbolHash: symbolHash20, baseUnit: baseUnit20, priceSource: priceSource20, fixedPrice: fixedPrice20, uniswapMarket: uniswapMarket20, isUniswapReversed: isUniswapReversed20}); if (i == 21) return TokenConfig({cToken: cToken21, underlying: underlying21, symbolHash: symbolHash21, baseUnit: baseUnit21, priceSource: priceSource21, fixedPrice: fixedPrice21, uniswapMarket: uniswapMarket21, isUniswapReversed: isUniswapReversed21}); if (i == 22) return TokenConfig({cToken: cToken22, underlying: underlying22, symbolHash: symbolHash22, baseUnit: baseUnit22, priceSource: priceSource22, fixedPrice: fixedPrice22, uniswapMarket: uniswapMarket22, isUniswapReversed: isUniswapReversed22}); if (i == 23) return TokenConfig({cToken: cToken23, underlying: underlying23, symbolHash: symbolHash23, baseUnit: baseUnit23, priceSource: priceSource23, fixedPrice: fixedPrice23, uniswapMarket: uniswapMarket23, isUniswapReversed: isUniswapReversed23}); if (i == 24) return TokenConfig({cToken: cToken24, underlying: underlying24, symbolHash: symbolHash24, baseUnit: baseUnit24, priceSource: priceSource24, fixedPrice: fixedPrice24, uniswapMarket: uniswapMarket24, isUniswapReversed: isUniswapReversed24}); if (i == 25) return TokenConfig({cToken: cToken25, underlying: underlying25, symbolHash: symbolHash25, baseUnit: baseUnit25, priceSource: priceSource25, fixedPrice: fixedPrice25, uniswapMarket: uniswapMarket25, isUniswapReversed: isUniswapReversed25}); if (i == 26) return TokenConfig({cToken: cToken26, underlying: underlying26, symbolHash: symbolHash26, baseUnit: baseUnit26, priceSource: priceSource26, fixedPrice: fixedPrice26, uniswapMarket: uniswapMarket26, isUniswapReversed: isUniswapReversed26}); if (i == 27) return TokenConfig({cToken: cToken27, underlying: underlying27, symbolHash: symbolHash27, baseUnit: baseUnit27, priceSource: priceSource27, fixedPrice: fixedPrice27, uniswapMarket: uniswapMarket27, isUniswapReversed: isUniswapReversed27}); if (i == 28) return TokenConfig({cToken: cToken28, underlying: underlying28, symbolHash: symbolHash28, baseUnit: baseUnit28, priceSource: priceSource28, fixedPrice: fixedPrice28, uniswapMarket: uniswapMarket28, isUniswapReversed: isUniswapReversed28}); if (i == 29) return TokenConfig({cToken: cToken29, underlying: underlying29, symbolHash: symbolHash29, baseUnit: baseUnit29, priceSource: priceSource29, fixedPrice: fixedPrice29, uniswapMarket: uniswapMarket29, isUniswapReversed: isUniswapReversed29}); } /** * @notice Get the config for symbol * @param symbol The symbol of the config to get * @return The config object */ function getTokenConfigBySymbol(string memory symbol) public view returns (TokenConfig memory) { return getTokenConfigBySymbolHash(keccak256(abi.encodePacked(symbol))); } /** * @notice Get the config for the symbolHash * @param symbolHash The keccack256 of the symbol of the config to get * @return The config object */ function getTokenConfigBySymbolHash(bytes32 symbolHash) public view returns (TokenConfig memory) { uint index = getSymbolHashIndex(symbolHash); if (index != uint(-1)) { return getTokenConfig(index); } revert("token config not found"); } /** * @notice Get the config for the cToken * @dev If a config for the cToken is not found, falls back to searching for the underlying. * @param cToken The address of the cToken of the config to get * @return The config object */ function getTokenConfigByCToken(address cToken) public view returns (TokenConfig memory) { uint index = getCTokenIndex(cToken); if (index != uint(-1)) { return getTokenConfig(index); } return getTokenConfigByUnderlying(CErc20(cToken).underlying()); } /** * @notice Get the config for an underlying asset * @param underlying The address of the underlying asset of the config to get * @return The config object */ function getTokenConfigByUnderlying(address underlying) public view returns (TokenConfig memory) { uint index = getUnderlyingIndex(underlying); if (index != uint(-1)) { return getTokenConfig(index); } revert("token config not found"); } } // Based on code from https://github.com/Uniswap/uniswap-v2-periphery // a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format)) library FixedPoint { // range: [0, 2**112 - 1] // resolution: 1 / 2**112 struct uq112x112 { uint224 _x; } // returns a uq112x112 which represents the ratio of the numerator to the denominator // equivalent to encode(numerator).div(denominator) function fraction(uint112 numerator, uint112 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, "FixedPoint: DIV_BY_ZERO"); return uq112x112((uint224(numerator) << 112) / denominator); } // decode a uq112x112 into a uint with 18 decimals of precision function decode112with18(uq112x112 memory self) internal pure returns (uint) { // we only have 256 - 224 = 32 bits to spare, so scaling up by ~60 bits is dangerous // instead, get close to: // (x * 1e18) >> 112 // without risk of overflowing, e.g.: // (x) / 2 ** (112 - lg(1e18)) return uint(self._x) / 5192296858534827; } } // library with helper methods for oracles that are concerned with computing average prices library UniswapV2OracleLibrary { using FixedPoint for *; // helper function that returns the current block timestamp within the range of uint32, i.e. [0, 2**32 - 1] function currentBlockTimestamp() internal view returns (uint32) { return uint32(block.timestamp % 2 ** 32); } // produces the cumulative price using counterfactuals to save gas and avoid a call to sync. function currentCumulativePrices( address pair ) internal view returns (uint price0Cumulative, uint price1Cumulative, uint32 blockTimestamp) { blockTimestamp = currentBlockTimestamp(); price0Cumulative = IUniswapV2Pair(pair).price0CumulativeLast(); price1Cumulative = IUniswapV2Pair(pair).price1CumulativeLast(); // if time has elapsed since the last update on the pair, mock the accumulated price values (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) = IUniswapV2Pair(pair).getReserves(); if (blockTimestampLast != blockTimestamp) { // subtraction overflow is desired uint32 timeElapsed = blockTimestamp - blockTimestampLast; // addition overflow is desired // counterfactual price0Cumulative += uint(FixedPoint.fraction(reserve1, reserve0)._x) * timeElapsed; // counterfactual price1Cumulative += uint(FixedPoint.fraction(reserve0, reserve1)._x) * timeElapsed; } } } interface IUniswapV2Pair { function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); } struct Observation { uint timestamp; uint acc; } contract UniswapAnchoredView is UniswapConfig { using FixedPoint for *; /// @notice The Open Oracle Price Data contract OpenOraclePriceData public immutable priceData; /// @notice The number of wei in 1 ETH uint public constant ethBaseUnit = 1e18; /// @notice A common scaling factor to maintain precision uint public constant expScale = 1e18; /// @notice The Open Oracle Reporter address public immutable reporter; /// @notice The highest ratio of the new price to the anchor price that will still trigger the price to be updated uint public immutable upperBoundAnchorRatio; /// @notice The lowest ratio of the new price to the anchor price that will still trigger the price to be updated uint public immutable lowerBoundAnchorRatio; /// @notice The minimum amount of time in seconds required for the old uniswap price accumulator to be replaced uint public immutable anchorPeriod; /// @notice Official prices by symbol hash mapping(bytes32 => uint) public prices; /// @notice Circuit breaker for using anchor price oracle directly, ignoring reporter bool public reporterInvalidated; /// @notice The old observation for each symbolHash mapping(bytes32 => Observation) public oldObservations; /// @notice The new observation for each symbolHash mapping(bytes32 => Observation) public newObservations; /// @notice The event emitted when new prices are posted but the stored price is not updated due to the anchor event PriceGuarded(string symbol, uint reporter, uint anchor); /// @notice The event emitted when the stored price is updated event PriceUpdated(string symbol, uint price); /// @notice The event emitted when anchor price is updated event AnchorPriceUpdated(string symbol, uint anchorPrice, uint oldTimestamp, uint newTimestamp); /// @notice The event emitted when the uniswap window changes event UniswapWindowUpdated(bytes32 indexed symbolHash, uint oldTimestamp, uint newTimestamp, uint oldPrice, uint newPrice); /// @notice The event emitted when reporter invalidates itself event ReporterInvalidated(address reporter); bytes32 constant ethHash = keccak256(abi.encodePacked("ETH")); bytes32 constant rotateHash = keccak256(abi.encodePacked("rotate")); /** * @notice Construct a uniswap anchored view for a set of token configurations * @dev Note that to avoid immature TWAPs, the system must run for at least a single anchorPeriod before using. * @param reporter_ The reporter whose prices are to be used * @param anchorToleranceMantissa_ The percentage tolerance that the reporter may deviate from the uniswap anchor * @param anchorPeriod_ The minimum amount of time required for the old uniswap price accumulator to be replaced * @param configs The static token configurations which define what prices are supported and how */ constructor(OpenOraclePriceData priceData_, address reporter_, uint anchorToleranceMantissa_, uint anchorPeriod_, TokenConfig[] memory configs) UniswapConfig(configs) public { priceData = priceData_; reporter = reporter_; anchorPeriod = anchorPeriod_; // Allow the tolerance to be whatever the deployer chooses, but prevent under/overflow (and prices from being 0) upperBoundAnchorRatio = anchorToleranceMantissa_ > uint(-1) - 100e16 ? uint(-1) : 100e16 + anchorToleranceMantissa_; lowerBoundAnchorRatio = anchorToleranceMantissa_ < 100e16 ? 100e16 - anchorToleranceMantissa_ : 1; for (uint i = 0; i < configs.length; i++) { TokenConfig memory config = configs[i]; require(config.baseUnit > 0, "baseUnit must be greater than zero"); address uniswapMarket = config.uniswapMarket; if (config.priceSource == PriceSource.REPORTER) { require(uniswapMarket != address(0), "reported prices must have an anchor"); bytes32 symbolHash = config.symbolHash; uint cumulativePrice = currentCumulativePrice(config); oldObservations[symbolHash].timestamp = block.timestamp; newObservations[symbolHash].timestamp = block.timestamp; oldObservations[symbolHash].acc = cumulativePrice; newObservations[symbolHash].acc = cumulativePrice; emit UniswapWindowUpdated(symbolHash, block.timestamp, block.timestamp, cumulativePrice, cumulativePrice); } else { require(uniswapMarket == address(0), "only reported prices utilize an anchor"); } } } /** * @notice Get the official price for a symbol * @param symbol The symbol to fetch the price of * @return Price denominated in USD, with 6 decimals */ function price(string memory symbol) external view returns (uint) { TokenConfig memory config = getTokenConfigBySymbol(symbol); return priceInternal(config); } function priceInternal(TokenConfig memory config) internal view returns (uint) { if (config.priceSource == PriceSource.REPORTER) return prices[config.symbolHash]; if (config.priceSource == PriceSource.FIXED_USD) return config.fixedPrice; if (config.priceSource == PriceSource.FIXED_ETH) { uint usdPerEth = prices[ethHash]; require(usdPerEth > 0, "ETH price not set, cannot convert to dollars"); return mul(usdPerEth, config.fixedPrice) / ethBaseUnit; } } /** * @notice Get the underlying price of a cToken * @dev Implements the PriceOracle interface for Compound v2. * @param cToken The cToken address for price retrieval * @return Price denominated in USD, with 18 decimals, for the given cToken address */ function getUnderlyingPrice(address cToken) external view returns (uint) { TokenConfig memory config = getTokenConfigByCToken(cToken); // Comptroller needs prices in the format: ${raw price} * 1e(36 - baseUnit) // Since the prices in this view have 6 decimals, we must scale them by 1e(36 - 6 - baseUnit) return mul(1e30, priceInternal(config)) / config.baseUnit; } /** * @notice Post open oracle reporter prices, and recalculate stored price by comparing to anchor * @dev We let anyone pay to post anything, but only prices from configured reporter will be stored in the view. * @param messages The messages to post to the oracle * @param signatures The signatures for the corresponding messages * @param symbols The symbols to compare to anchor for authoritative reading */ function postPrices(bytes[] calldata messages, bytes[] calldata signatures, string[] calldata symbols) external { require(messages.length == signatures.length, "messages and signatures must be 1:1"); // Save the prices for (uint i = 0; i < messages.length; i++) { priceData.put(messages[i], signatures[i]); } uint ethPrice = fetchEthPrice(); // Try to update the view storage for (uint i = 0; i < symbols.length; i++) { postPriceInternal(symbols[i], ethPrice); } } function postPriceInternal(string memory symbol, uint ethPrice) internal { TokenConfig memory config = getTokenConfigBySymbol(symbol); require(config.priceSource == PriceSource.REPORTER, "only reporter prices get posted"); bytes32 symbolHash = keccak256(abi.encodePacked(symbol)); uint reporterPrice = priceData.getPrice(reporter, symbol); uint anchorPrice; if (symbolHash == ethHash) { anchorPrice = ethPrice; } else { anchorPrice = fetchAnchorPrice(symbol, config, ethPrice); } if (reporterInvalidated) { prices[symbolHash] = anchorPrice; emit PriceUpdated(symbol, anchorPrice); } else if (isWithinAnchor(reporterPrice, anchorPrice)) { prices[symbolHash] = reporterPrice; emit PriceUpdated(symbol, reporterPrice); } else { emit PriceGuarded(symbol, reporterPrice, anchorPrice); } } function isWithinAnchor(uint reporterPrice, uint anchorPrice) internal view returns (bool) { if (reporterPrice > 0) { uint anchorRatio = mul(anchorPrice, 100e16) / reporterPrice; return anchorRatio <= upperBoundAnchorRatio && anchorRatio >= lowerBoundAnchorRatio; } return false; } /** * @dev Fetches the current token/eth price accumulator from uniswap. */ function currentCumulativePrice(TokenConfig memory config) internal view returns (uint) { (uint cumulativePrice0, uint cumulativePrice1,) = UniswapV2OracleLibrary.currentCumulativePrices(config.uniswapMarket); if (config.isUniswapReversed) { return cumulativePrice1; } else { return cumulativePrice0; } } /** * @dev Fetches the current eth/usd price from uniswap, with 6 decimals of precision. * Conversion factor is 1e18 for eth/usdc market, since we decode uniswap price statically with 18 decimals. */ function fetchEthPrice() internal returns (uint) { return fetchAnchorPrice("ETH", getTokenConfigBySymbolHash(ethHash), ethBaseUnit); } /** * @dev Fetches the current token/usd price from uniswap, with 6 decimals of precision. * @param conversionFactor 1e18 if seeking the ETH price, and a 6 decimal ETH-USDC price in the case of other assets */ function fetchAnchorPrice(string memory symbol, TokenConfig memory config, uint conversionFactor) internal virtual returns (uint) { (uint nowCumulativePrice, uint oldCumulativePrice, uint oldTimestamp) = pokeWindowValues(config); // This should be impossible, but better safe than sorry require(block.timestamp > oldTimestamp, "now must come after before"); uint timeElapsed = block.timestamp - oldTimestamp; // Calculate uniswap time-weighted average price // Underflow is a property of the accumulators: https://uniswap.org/audit.html#orgc9b3190 FixedPoint.uq112x112 memory priceAverage = FixedPoint.uq112x112(uint224((nowCumulativePrice - oldCumulativePrice) / timeElapsed)); uint rawUniswapPriceMantissa = priceAverage.decode112with18(); uint unscaledPriceMantissa = mul(rawUniswapPriceMantissa, conversionFactor); uint anchorPrice; // Adjust rawUniswapPrice according to the units of the non-ETH asset // In the case of ETH, we would have to scale by 1e6 / USDC_UNITS, but since baseUnit2 is 1e6 (USDC), it cancels if (config.isUniswapReversed) { // unscaledPriceMantissa * ethBaseUnit / config.baseUnit / expScale, but we simplify bc ethBaseUnit == expScale anchorPrice = unscaledPriceMantissa / config.baseUnit; } else { anchorPrice = mul(unscaledPriceMantissa, config.baseUnit) / ethBaseUnit / expScale; } emit AnchorPriceUpdated(symbol, anchorPrice, oldTimestamp, block.timestamp); return anchorPrice; } /** * @dev Get time-weighted average prices for a token at the current timestamp. * Update new and old observations of lagging window if period elapsed. */ function pokeWindowValues(TokenConfig memory config) internal returns (uint, uint, uint) { bytes32 symbolHash = config.symbolHash; uint cumulativePrice = currentCumulativePrice(config); Observation memory newObservation = newObservations[symbolHash]; // Update new and old observations if elapsed time is greater than or equal to anchor period uint timeElapsed = block.timestamp - newObservation.timestamp; if (timeElapsed >= anchorPeriod) { oldObservations[symbolHash].timestamp = newObservation.timestamp; oldObservations[symbolHash].acc = newObservation.acc; newObservations[symbolHash].timestamp = block.timestamp; newObservations[symbolHash].acc = cumulativePrice; emit UniswapWindowUpdated(config.symbolHash, newObservation.timestamp, block.timestamp, newObservation.acc, cumulativePrice); } return (cumulativePrice, oldObservations[symbolHash].acc, oldObservations[symbolHash].timestamp); } /** * @notice Invalidate the reporter, and fall back to using anchor directly in all cases * @dev Only the reporter may sign a message which allows it to invalidate itself. * To be used in cases of emergency, if the reporter thinks their key may be compromised. * @param message The data that was presumably signed * @param signature The fingerprint of the data + private key */ function invalidateReporter(bytes memory message, bytes memory signature) external { (string memory decodedMessage, ) = abi.decode(message, (string, address)); require(keccak256(abi.encodePacked(decodedMessage)) == rotateHash, "invalid message must be 'rotate'"); require(source(message, signature) == reporter, "invalidation message must come from the reporter"); reporterInvalidated = true; emit ReporterInvalidated(reporter); } /** * @notice Recovers the source address which signed a message * @dev Comparing to a claimed address would add nothing, * as the caller could simply perform the recover and claim that address. * @param message The data that was presumably signed * @param signature The fingerprint of the data + private key * @return The source address which signed the message, presumably */ function source(bytes memory message, bytes memory signature) public pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = abi.decode(signature, (bytes32, bytes32, uint8)); bytes32 hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(message))); return ecrecover(hash, v, r, s); } /// @dev Overflow proof multiplication function mul(uint a, uint b) internal pure returns (uint) { if (a == 0) return 0; uint c = a * b; require(c / a == b, "multiplication overflow"); return c; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract OpenOraclePriceData","name":"priceData_","type":"address"},{"internalType":"address","name":"reporter_","type":"address"},{"internalType":"uint256","name":"anchorToleranceMantissa_","type":"uint256"},{"internalType":"uint256","name":"anchorPeriod_","type":"uint256"},{"components":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig[]","name":"configs","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"anchorPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTimestamp","type":"uint256"}],"name":"AnchorPriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"reporter","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"anchor","type":"uint256"}],"name":"PriceGuarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"PriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"reporter","type":"address"}],"name":"ReporterInvalidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"oldTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"UniswapWindowUpdated","type":"event"},{"inputs":[],"name":"anchorPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethBaseUnit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expScale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getTokenConfig","outputs":[{"components":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"cToken","type":"address"}],"name":"getTokenConfigByCToken","outputs":[{"components":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"getTokenConfigBySymbol","outputs":[{"components":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"symbolHash","type":"bytes32"}],"name":"getTokenConfigBySymbolHash","outputs":[{"components":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"getTokenConfigByUnderlying","outputs":[{"components":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"cToken","type":"address"}],"name":"getUnderlyingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"invalidateReporter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lowerBoundAnchorRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"newObservations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"acc","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"oldObservations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"acc","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"messages","type":"bytes[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"},{"internalType":"string[]","name":"symbols","type":"string[]"}],"name":"postPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceData","outputs":[{"internalType":"contract OpenOraclePriceData","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"prices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reporter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reporterInvalidated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"source","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"upperBoundAnchorRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
611f406040523480156200001257600080fd5b50604051620095e7380380620095e783398101604081905262000035916200280f565b80601e81511115620000645760405162461bcd60e51b81526004016200005b90620029fb565b60405180910390fd5b80516080526200007f8160006001600160e01b036200239616565b5160601b6001600160601b03191660a0526200009d81600162002396565b5160601b6001600160601b03191660c052620000bb81600262002396565b5160601b6001600160601b03191660e052620000d981600362002396565b5160601b6001600160601b03191661010052620000f881600462002396565b5160601b6001600160601b031916610120526200011781600562002396565b5160601b6001600160601b031916610140526200013681600662002396565b5160601b6001600160601b031916610160526200015581600762002396565b5160601b6001600160601b031916610180526200017481600862002396565b5160601b6001600160601b0319166101a0526200019381600962002396565b5160601b6001600160601b0319166101c052620001b281600a62002396565b5160601b6001600160601b0319166101e052620001d181600b62002396565b5160601b6001600160601b03191661020052620001f081600c62002396565b5160601b6001600160601b031916610220526200020f81600d62002396565b5160601b6001600160601b031916610240526200022e81600e62002396565b5160601b6001600160601b031916610260526200024d81600f62002396565b5160601b6001600160601b031916610280526200026c81601062002396565b5160601b6001600160601b0319166102a0526200028b81601162002396565b5160601b6001600160601b0319166102c052620002aa81601262002396565b5160601b6001600160601b0319166102e052620002c981601362002396565b5160601b6001600160601b03191661030052620002e881601462002396565b5160601b6001600160601b031916610320526200030781601562002396565b5160601b6001600160601b031916610340526200032681601662002396565b5160601b6001600160601b031916610360526200034581601762002396565b5160601b6001600160601b031916610380526200036481601862002396565b5160601b6001600160601b0319166103a0526200038381601962002396565b5160601b6001600160601b0319166103c052620003a281601a62002396565b5160601b6001600160601b0319166103e052620003c181601b62002396565b5160601b6001600160601b03191661040052620003e081601c62002396565b5160601b6001600160601b03191661042052620003ff81601d62002396565b5160601b6001600160601b031916610440526200041e81600062002396565b6020015160601b6001600160601b031916610460526200044081600162002396565b6020015160601b6001600160601b031916610480526200046281600262002396565b6020015160601b6001600160601b0319166104a0526200048481600362002396565b6020015160601b6001600160601b0319166104c052620004a681600462002396565b6020015160601b6001600160601b0319166104e052620004c881600562002396565b6020015160601b6001600160601b03191661050052620004ea81600662002396565b6020015160601b6001600160601b031916610520526200050c81600762002396565b6020015160601b6001600160601b031916610540526200052e81600862002396565b6020015160601b6001600160601b031916610560526200055081600962002396565b6020015160601b6001600160601b031916610580526200057281600a62002396565b6020015160601b6001600160601b0319166105a0526200059481600b62002396565b6020015160601b6001600160601b0319166105c052620005b681600c62002396565b6020015160601b6001600160601b0319166105e052620005d881600d62002396565b6020015160601b6001600160601b03191661060052620005fa81600e62002396565b6020015160601b6001600160601b031916610620526200061c81600f62002396565b6020015160601b6001600160601b031916610640526200063e81601062002396565b6020015160601b6001600160601b031916610660526200066081601162002396565b6020015160601b6001600160601b031916610680526200068281601262002396565b6020015160601b6001600160601b0319166106a052620006a481601362002396565b6020015160601b6001600160601b0319166106c052620006c681601462002396565b6020015160601b6001600160601b0319166106e052620006e881601562002396565b6020015160601b6001600160601b031916610700526200070a81601662002396565b6020015160601b6001600160601b031916610720526200072c81601762002396565b6020015160601b6001600160601b031916610740526200074e81601862002396565b6020015160601b6001600160601b031916610760526200077081601962002396565b6020015160601b6001600160601b031916610780526200079281601a62002396565b6020015160601b6001600160601b0319166107a052620007b481601b62002396565b6020015160601b6001600160601b0319166107c052620007d681601c62002396565b6020015160601b6001600160601b0319166107e052620007f881601d62002396565b6020015160601b6001600160601b031916610800526200081a81600062002396565b6040015161082052620008388160016001600160e01b036200239616565b6040015161084052620008568160026001600160e01b036200239616565b6040015161086052620008748160036001600160e01b036200239616565b6040015161088052620008928160046001600160e01b036200239616565b604001516108a052620008b08160056001600160e01b036200239616565b604001516108c052620008ce8160066001600160e01b036200239616565b604001516108e052620008ec8160076001600160e01b036200239616565b60400151610900526200090a8160086001600160e01b036200239616565b6040015161092052620009288160096001600160e01b036200239616565b60400151610940526200094681600a6001600160e01b036200239616565b60400151610960526200096481600b6001600160e01b036200239616565b60400151610980526200098281600c6001600160e01b036200239616565b604001516109a052620009a081600d6001600160e01b036200239616565b604001516109c052620009be81600e6001600160e01b036200239616565b604001516109e052620009dc81600f6001600160e01b036200239616565b60400151610a0052620009fa8160106001600160e01b036200239616565b60400151610a205262000a188160116001600160e01b036200239616565b60400151610a405262000a368160126001600160e01b036200239616565b60400151610a605262000a548160136001600160e01b036200239616565b60400151610a805262000a728160146001600160e01b036200239616565b60400151610aa05262000a908160156001600160e01b036200239616565b60400151610ac05262000aae8160166001600160e01b036200239616565b60400151610ae05262000acc8160176001600160e01b036200239616565b60400151610b005262000aea8160186001600160e01b036200239616565b60400151610b205262000b088160196001600160e01b036200239616565b60400151610b405262000b2681601a6001600160e01b036200239616565b60400151610b605262000b4481601b6001600160e01b036200239616565b60400151610b805262000b6281601c6001600160e01b036200239616565b60400151610ba05262000b8081601d6001600160e01b036200239616565b60400151610bc05262000b9e8160006001600160e01b036200239616565b60600151610be05262000bbc8160016001600160e01b036200239616565b60600151610c005262000bda8160026001600160e01b036200239616565b60600151610c205262000bf88160036001600160e01b036200239616565b60600151610c405262000c168160046001600160e01b036200239616565b60600151610c605262000c348160056001600160e01b036200239616565b60600151610c805262000c528160066001600160e01b036200239616565b60600151610ca05262000c708160076001600160e01b036200239616565b60600151610cc05262000c8e8160086001600160e01b036200239616565b60600151610ce05262000cac8160096001600160e01b036200239616565b60600151610d005262000cca81600a6001600160e01b036200239616565b60600151610d205262000ce881600b6001600160e01b036200239616565b60600151610d405262000d0681600c6001600160e01b036200239616565b60600151610d605262000d2481600d6001600160e01b036200239616565b60600151610d805262000d4281600e6001600160e01b036200239616565b60600151610da05262000d6081600f6001600160e01b036200239616565b60600151610dc05262000d7e8160106001600160e01b036200239616565b60600151610de05262000d9c8160116001600160e01b036200239616565b60600151610e005262000dba8160126001600160e01b036200239616565b60600151610e205262000dd88160136001600160e01b036200239616565b60600151610e405262000df68160146001600160e01b036200239616565b60600151610e605262000e148160156001600160e01b036200239616565b60600151610e805262000e328160166001600160e01b036200239616565b60600151610ea05262000e508160176001600160e01b036200239616565b60600151610ec05262000e6e8160186001600160e01b036200239616565b60600151610ee05262000e8c8160196001600160e01b036200239616565b60600151610f005262000eaa81601a6001600160e01b036200239616565b60600151610f205262000ec881601b6001600160e01b036200239616565b60600151610f405262000ee681601c6001600160e01b036200239616565b60600151610f605262000f0481601d6001600160e01b036200239616565b60600151610f805262000f228160006001600160e01b036200239616565b60800151600281111562000f3257fe5b610fa081600281111562000f4257fe5b60f81b90525062000f5e8160016001600160e01b036200239616565b60800151600281111562000f6e57fe5b610fc081600281111562000f7e57fe5b60f81b90525062000f9a8160026001600160e01b036200239616565b60800151600281111562000faa57fe5b610fe081600281111562000fba57fe5b60f81b90525062000fd68160036001600160e01b036200239616565b60800151600281111562000fe657fe5b61100081600281111562000ff657fe5b60f81b905250620010128160046001600160e01b036200239616565b6080015160028111156200102257fe5b6110208160028111156200103257fe5b60f81b9052506200104e8160056001600160e01b036200239616565b6080015160028111156200105e57fe5b6110408160028111156200106e57fe5b60f81b9052506200108a8160066001600160e01b036200239616565b6080015160028111156200109a57fe5b611060816002811115620010aa57fe5b60f81b905250620010c68160076001600160e01b036200239616565b608001516002811115620010d657fe5b611080816002811115620010e657fe5b60f81b905250620011028160086001600160e01b036200239616565b6080015160028111156200111257fe5b6110a08160028111156200112257fe5b60f81b9052506200113e8160096001600160e01b036200239616565b6080015160028111156200114e57fe5b6110c08160028111156200115e57fe5b60f81b9052506200117a81600a6001600160e01b036200239616565b6080015160028111156200118a57fe5b6110e08160028111156200119a57fe5b60f81b905250620011b681600b6001600160e01b036200239616565b608001516002811115620011c657fe5b611100816002811115620011d657fe5b60f81b905250620011f281600c6001600160e01b036200239616565b6080015160028111156200120257fe5b6111208160028111156200121257fe5b60f81b9052506200122e81600d6001600160e01b036200239616565b6080015160028111156200123e57fe5b6111408160028111156200124e57fe5b60f81b9052506200126a81600e6001600160e01b036200239616565b6080015160028111156200127a57fe5b6111608160028111156200128a57fe5b60f81b905250620012a681600f6001600160e01b036200239616565b608001516002811115620012b657fe5b611180816002811115620012c657fe5b60f81b905250620012e28160106001600160e01b036200239616565b608001516002811115620012f257fe5b6111a08160028111156200130257fe5b60f81b9052506200131e8160116001600160e01b036200239616565b6080015160028111156200132e57fe5b6111c08160028111156200133e57fe5b60f81b9052506200135a8160126001600160e01b036200239616565b6080015160028111156200136a57fe5b6111e08160028111156200137a57fe5b60f81b905250620013968160136001600160e01b036200239616565b608001516002811115620013a657fe5b611200816002811115620013b657fe5b60f81b905250620013d28160146001600160e01b036200239616565b608001516002811115620013e257fe5b611220816002811115620013f257fe5b60f81b9052506200140e8160156001600160e01b036200239616565b6080015160028111156200141e57fe5b6112408160028111156200142e57fe5b60f81b9052506200144a8160166001600160e01b036200239616565b6080015160028111156200145a57fe5b6112608160028111156200146a57fe5b60f81b905250620014868160176001600160e01b036200239616565b6080015160028111156200149657fe5b611280816002811115620014a657fe5b60f81b905250620014c28160186001600160e01b036200239616565b608001516002811115620014d257fe5b6112a0816002811115620014e257fe5b60f81b905250620014fe8160196001600160e01b036200239616565b6080015160028111156200150e57fe5b6112c08160028111156200151e57fe5b60f81b9052506200153a81601a6001600160e01b036200239616565b6080015160028111156200154a57fe5b6112e08160028111156200155a57fe5b60f81b9052506200157681601b6001600160e01b036200239616565b6080015160028111156200158657fe5b6113008160028111156200159657fe5b60f81b905250620015b281601c6001600160e01b036200239616565b608001516002811115620015c257fe5b611320816002811115620015d257fe5b60f81b905250620015ee81601d6001600160e01b036200239616565b608001516002811115620015fe57fe5b6113408160028111156200160e57fe5b60f81b9052506200162a8160006001600160e01b036200239616565b60a0015161136052620016488160016001600160e01b036200239616565b60a0015161138052620016668160026001600160e01b036200239616565b60a001516113a052620016848160036001600160e01b036200239616565b60a001516113c052620016a28160046001600160e01b036200239616565b60a001516113e052620016c08160056001600160e01b036200239616565b60a0015161140052620016de8160066001600160e01b036200239616565b60a0015161142052620016fc8160076001600160e01b036200239616565b60a00151611440526200171a8160086001600160e01b036200239616565b60a0015161146052620017388160096001600160e01b036200239616565b60a00151611480526200175681600a6001600160e01b036200239616565b60a001516114a0526200177481600b6001600160e01b036200239616565b60a001516114c0526200179281600c6001600160e01b036200239616565b60a001516114e052620017b081600d6001600160e01b036200239616565b60a0015161150052620017ce81600e6001600160e01b036200239616565b60a0015161152052620017ec81600f6001600160e01b036200239616565b60a00151611540526200180a8160106001600160e01b036200239616565b60a0015161156052620018288160116001600160e01b036200239616565b60a0015161158052620018468160126001600160e01b036200239616565b60a001516115a052620018648160136001600160e01b036200239616565b60a001516115c052620018828160146001600160e01b036200239616565b60a001516115e052620018a08160156001600160e01b036200239616565b60a0015161160052620018be8160166001600160e01b036200239616565b60a0015161162052620018dc8160176001600160e01b036200239616565b60a0015161164052620018fa8160186001600160e01b036200239616565b60a0015161166052620019188160196001600160e01b036200239616565b60a00151611680526200193681601a6001600160e01b036200239616565b60a001516116a0526200195481601b6001600160e01b036200239616565b60a001516116c0526200197281601c6001600160e01b036200239616565b60a001516116e0526200199081601d6001600160e01b036200239616565b60a0015161170052620019ae8160006001600160e01b036200239616565b60c0015160601b6001600160601b03191661172052620019d081600162002396565b60c0015160601b6001600160601b03191661174052620019f281600262002396565b60c0015160601b6001600160601b0319166117605262001a1481600362002396565b60c0015160601b6001600160601b0319166117805262001a3681600462002396565b60c0015160601b6001600160601b0319166117a05262001a5881600562002396565b60c0015160601b6001600160601b0319166117c05262001a7a81600662002396565b60c0015160601b6001600160601b0319166117e05262001a9c81600762002396565b60c0015160601b6001600160601b0319166118005262001abe81600862002396565b60c0015160601b6001600160601b0319166118205262001ae081600962002396565b60c0015160601b6001600160601b0319166118405262001b0281600a62002396565b60c0015160601b6001600160601b0319166118605262001b2481600b62002396565b60c0015160601b6001600160601b0319166118805262001b4681600c62002396565b60c0015160601b6001600160601b0319166118a05262001b6881600d62002396565b60c0015160601b6001600160601b0319166118c05262001b8a81600e62002396565b60c0015160601b6001600160601b0319166118e05262001bac81600f62002396565b60c0015160601b6001600160601b0319166119005262001bce81601062002396565b60c0015160601b6001600160601b0319166119205262001bf081601162002396565b60c0015160601b6001600160601b0319166119405262001c1281601262002396565b60c0015160601b6001600160601b0319166119605262001c3481601362002396565b60c0015160601b6001600160601b0319166119805262001c5681601462002396565b60c0015160601b6001600160601b0319166119a05262001c7881601562002396565b60c0015160601b6001600160601b0319166119c05262001c9a81601662002396565b60c0015160601b6001600160601b0319166119e05262001cbc81601762002396565b60c0015160601b6001600160601b031916611a005262001cde81601862002396565b60c0015160601b6001600160601b031916611a205262001d0081601962002396565b60c0015160601b6001600160601b031916611a405262001d2281601a62002396565b60c0015160601b6001600160601b031916611a605262001d4481601b62002396565b60c0015160601b6001600160601b031916611a805262001d6681601c62002396565b60c0015160601b6001600160601b031916611aa05262001d8881601d62002396565b60c0015160601b6001600160601b031916611ac05262001daa81600062002396565b60e00151151560f81b611ae05262001dcd8160016001600160e01b036200239616565b60e00151151560f81b611b005262001df08160026001600160e01b036200239616565b60e00151151560f81b611b205262001e138160036001600160e01b036200239616565b60e00151151560f81b611b405262001e368160046001600160e01b036200239616565b60e00151151560f81b611b605262001e598160056001600160e01b036200239616565b60e00151151560f81b611b805262001e7c8160066001600160e01b036200239616565b60e00151151560f81b611ba05262001e9f8160076001600160e01b036200239616565b60e00151151560f81b611bc05262001ec28160086001600160e01b036200239616565b60e00151151560f81b611be05262001ee58160096001600160e01b036200239616565b60e00151151560f81b611c005262001f0881600a6001600160e01b036200239616565b60e00151151560f81b611c205262001f2b81600b6001600160e01b036200239616565b60e00151151560f81b611c405262001f4e81600c6001600160e01b036200239616565b60e00151151560f81b611c605262001f7181600d6001600160e01b036200239616565b60e00151151560f81b611c805262001f9481600e6001600160e01b036200239616565b60e00151151560f81b611ca05262001fb781600f6001600160e01b036200239616565b60e00151151560f81b611cc05262001fda8160106001600160e01b036200239616565b60e00151151560f81b611ce05262001ffd8160116001600160e01b036200239616565b60e00151151560f81b611d0052620020208160126001600160e01b036200239616565b60e00151151560f81b611d2052620020438160136001600160e01b036200239616565b60e00151151560f81b611d4052620020668160146001600160e01b036200239616565b60e00151151560f81b611d6052620020898160156001600160e01b036200239616565b60e00151151560f81b611d8052620020ac8160166001600160e01b036200239616565b60e00151151560f81b611da052620020cf8160176001600160e01b036200239616565b60e00151151560f81b611dc052620020f28160186001600160e01b036200239616565b60e00151151560f81b611de052620021158160196001600160e01b036200239616565b60e00151151560f81b611e00526200213881601a6001600160e01b036200239616565b60e00151151560f81b611e20526200215b81601b6001600160e01b036200239616565b60e00151151560f81b611e40526200217e81601c6001600160e01b036200239616565b60e00151151560f81b611e6052620021a181601d6001600160e01b036200239616565b60e00151151560f81b611e8052506001600160601b0319606086811b8216611ea05285901b16611ec052611f20829052670de0b6b3a7640000198311620021f35782670de0b6b3a764000001620021f7565b6000195b611ee052670de0b6b3a76400008310620022135760016200221f565b82670de0b6b3a7640000035b611f005260005b81518110156200238a576200223a620026e2565b8282815181106200224757fe5b602002602001015190506000816060015111620022785760405162461bcd60e51b81526004016200005b9062002976565b60c08101516002826080015160028111156200229057fe5b141562002355576001600160a01b038116620022c05760405162461bcd60e51b81526004016200005b90620029b8565b60408201516000620022db846001600160e01b036200241016565b600083815260026020908152604080832042808255600390935292819020828155600193840185905592909201839055905191925083917fe37d39315e3419c0937360f1ac88f2c52ecf67e3b22b367f82047ddb4591904a91620023459181908690819062002aa2565b60405180910390a250506200237f565b6001600160a01b038116156200237f5760405162461bcd60e51b81526004016200005b9062002a5c565b505060010162002226565b50505050505062002b33565b620023a0620026e2565b8251821015620023c757828281518110620023b757fe5b602002602001015190506200240a565b506040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101919091525b92915050565b60008060006200242f8460c001516200245260201b620034ec1760201c565b50915091508360e0015115620024495791506200244d9050565b5090505b919050565b60008080620024696001600160e01b036200265e16565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015620024a557600080fd5b505afa158015620024ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024e091906200295d565b9250836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b1580156200251c57600080fd5b505afa15801562002531573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200255791906200295d565b91506000806000866001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156200259857600080fd5b505afa158015620025ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025d3919062002903565b9250925092508363ffffffff168163ffffffff16146200265457600081850390508063ffffffff166200261284866200266860201b620036c11760201c565b600001516001600160e01b031602870196508063ffffffff166200264285856200266860201b620036c11760201c565b516001600160e01b0316029590950194505b5050509193909250565b63ffffffff421690565b6200267262002727565b6000826001600160701b0316116200269e5760405162461bcd60e51b81526004016200005b9062002a25565b6040805160208101909152806001600160701b038416600160701b600160e01b03607087901b1681620026cd57fe5b046001600160e01b0316815250905092915050565b60408051610100810182526000808252602082018190529181018290526060810182905290608082019081526000602082018190526040820181905260609091015290565b60408051602081019091526000815290565b80516200240a8162002b04565b805180151581146200240a57600080fd5b8051600381106200240a57600080fd5b60006101008083850312156200277b578182fd5b620027868162002abd565b9150508151620027968162002b04565b81526020820151620027a88162002b04565b806020830152506040820151604082015260608201516060820152620027d2836080840162002757565b608082015260a082015160a0820152620027f08360c0840162002739565b60c0820152620028048360e0840162002746565b60e082015292915050565b600080600080600060a0868803121562002827578081fd5b8551620028348162002b04565b80955050602080870151620028498162002b04565b6040880151606089015160808a015192975090955093506001600160401b0381111562002874578283fd5b80880189601f82011262002886578384fd5b805191506200289f620028998362002ae4565b62002abd565b82815283810190828501610100808602850187018e1015620028bf578788fd5b8794505b85851015620028ef57620028d88e8362002767565b8452600194909401939286019290810190620028c3565b505080955050505050509295509295909350565b60008060006060848603121562002918578283fd5b8351620029258162002b1d565b6020850151909350620029388162002b1d565b604085015190925063ffffffff8116811462002952578182fd5b809150509250925092565b6000602082840312156200296f578081fd5b5051919050565b60208082526022908201527f62617365556e6974206d7573742062652067726561746572207468616e207a65604082015261726f60f01b606082015260800190565b60208082526023908201527f7265706f7274656420707269636573206d757374206861766520616e20616e636040820152623437b960e91b606082015260800190565b60208082526010908201526f746f6f206d616e7920636f6e6669677360801b604082015260600190565b60208082526017908201527f4669786564506f696e743a204449565f42595f5a45524f000000000000000000604082015260600190565b60208082526026908201527f6f6e6c79207265706f7274656420707269636573207574696c697a6520616e2060408201526530b731b437b960d11b606082015260800190565b93845260208401929092526040830152606082015260800190565b6040518181016001600160401b038111828210171562002adc57600080fd5b604052919050565b60006001600160401b0382111562002afa578081fd5b5060209081020190565b6001600160a01b038116811462002b1a57600080fd5b50565b6001600160701b038116811462002b1a57600080fd5b60805160a05160601c60c05160601c60e05160601c6101005160601c6101205160601c6101405160601c6101605160601c6101805160601c6101a05160601c6101c05160601c6101e05160601c6102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c05160601c6102e05160601c6103005160601c6103205160601c6103405160601c6103605160601c6103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c6104405160601c6104605160601c6104805160601c6104a05160601c6104c05160601c6104e05160601c6105005160601c6105205160601c6105405160601c6105605160601c6105805160601c6105a05160601c6105c05160601c6105e05160601c6106005160601c6106205160601c6106405160601c6106605160601c6106805160601c6106a05160601c6106c05160601c6106e05160601c6107005160601c6107205160601c6107405160601c6107605160601c6107805160601c6107a05160601c6107c05160601c6107e05160601c6108005160601c610820516108405161086051610880516108a0516108c0516108e05161090051610920516109405161096051610980516109a0516109c0516109e051610a0051610a2051610a4051610a6051610a8051610aa051610ac051610ae051610b0051610b2051610b4051610b6051610b8051610ba051610bc051610be051610c0051610c2051610c4051610c6051610c8051610ca051610cc051610ce051610d0051610d2051610d4051610d6051610d8051610da051610dc051610de051610e0051610e2051610e4051610e6051610e8051610ea051610ec051610ee051610f0051610f2051610f4051610f6051610f8051610fa05160f81c610fc05160f81c610fe05160f81c6110005160f81c6110205160f81c6110405160f81c6110605160f81c6110805160f81c6110a05160f81c6110c05160f81c6110e05160f81c6111005160f81c6111205160f81c6111405160f81c6111605160f81c6111805160f81c6111a05160f81c6111c05160f81c6111e05160f81c6112005160f81c6112205160f81c6112405160f81c6112605160f81c6112805160f81c6112a05160f81c6112c05160f81c6112e05160f81c6113005160f81c6113205160f81c6113405160f81c61136051611380516113a0516113c0516113e05161140051611420516114405161146051611480516114a0516114c0516114e05161150051611520516115405161156051611580516115a0516115c0516115e05161160051611620516116405161166051611680516116a0516116c0516116e051611700516117205160601c6117405160601c6117605160601c6117805160601c6117a05160601c6117c05160601c6117e05160601c6118005160601c6118205160601c6118405160601c6118605160601c6118805160601c6118a05160601c6118c05160601c6118e05160601c6119005160601c6119205160601c6119405160601c6119605160601c6119805160601c6119a05160601c6119c05160601c6119e05160601c611a005160601c611a205160601c611a405160601c611a605160601c611a805160601c611aa05160601c611ac05160601c611ae05160f81c611b005160f81c611b205160f81c611b405160f81c611b605160f81c611b805160f81c611ba05160f81c611bc05160f81c611be05160f81c611c005160f81c611c205160f81c611c405160f81c611c605160f81c611c805160f81c611ca05160f81c611cc05160f81c611ce05160f81c611d005160f81c611d205160f81c611d405160f81c611d605160f81c611d805160f81c611da05160f81c611dc05160f81c611de05160f81c611e005160f81c611e205160f81c611e405160f81c611e605160f81c611e805160f81c611ea05160601c611ec05160601c611ee051611f0051611f2051615d5362003894600039806132b1528061523c5250806131c252806151b5525080610359528061518a5250806102e052806130db528061316a5280614d4952508061328852806133185280614d1a52508061302c525080612eba525080612d48525080612bd6525080612a645250806128f252508061278052508061260e52508061249c52508061232a5250806121b8525080612046525080611ed4525080611d62525080611bf0525080611a7e52508061190c52508061179a5250806116285250806114b65250806113445250806111d2525080611060525080610eee525080610d7c525080610c0a525080610a985250806109265250806107b4525080610642525080612ffd525080612e8b525080612d19525080612ba7525080612a355250806128c35250806127515250806125df52508061246d5250806122fb525080612189525080612017525080611ea5525080611d33525080611bc1525080611a4f5250806118dd52508061176b5250806115f95250806114875250806113155250806111a3525080611031525080610ebf525080610d4d525080610bdb525080610a695250806108f7525080610785525080610613525080612fd7525080612e65525080612cf3525080612b81525080612a0f52508061289d52508061272b5250806125b95250806124475250806122d5525080612163525080611ff1525080611e7f525080611d0d525080611b9b525080611a295250806118b75250806117455250806115d35250806114615250806112ef52508061117d52508061100b525080610e99525080610d27525080610bb5525080610a435250806108d152508061075f5250806105ed525080612fa6525080612e34525080612cc2525080612b505250806129de52508061286c5250806126fa5250806125885250806124165250806122a4525080612132525080611fc0525080611e4e525080611cdc525080611b6a5250806119f85250806118865250806117145250806115a25250806114305250806112be52508061114c525080610fda525080610e68525080610cf6525080610b84525080610a125250806108a052508061072e5250806105bc525080612f80525080612e0e525080612c9c525080612b2a5250806129b85250806128465250806126d45250806125625250806123f052508061227e52508061210c525080611f9a525080611e28525080611cb6525080611b445250806119d25250806118605250806116ee52508061157c52508061140a525080611298525080611126525080610fb4525080610e42525080610cd0525080610b5e5250806109ec52508061087a525080610708525080610596525080612f5a5280613cb0525080612de85280613c80525080612c765280613c50525080612b045280613c205250806129925280613bf05250806128205280613bc05250806126ae5280613b9052508061253c5280613b605250806123ca5280613b305250806122585280613b005250806120e65280613ad0525080611f745280613aa0525080611e025280613a70525080611c905280613a40525080611b1e5280613a105250806119ac52806139e052508061183a52806139b05250806116c8528061398052508061155652806139505250806113e4528061392052508061127252806138f052508061110052806138c0525080610f8e5280613890525080610e1c5280613860525080610caa5280613830525080610b3852806138005250806109c652806137d052508061085452806137a05250806106e252806137705250806105705280613740525080612f2b5280614465525080612db95280614423525080612c4752806143e1525080612ad5528061439f525080612963528061435d5250806127f1528061431b52508061267f52806142d952508061250d528061429752508061239b528061425552508061222952806142135250806120b752806141d1525080611f45528061418f525080611dd3528061414d525080611c61528061410b525080611aef52806140c952508061197d528061408752508061180b528061404552508061169952806140035250806115275280613fc15250806113b55280613f7f5250806112435280613f3d5250806110d15280613efb525080610f5f5280613eb9525080610ded5280613e77525080610c7b5280613e35525080610b095280613df35250806109975280613db15250806108255280613d6f5250806106b35280613d2d5250806105415280613ceb525080612efc5280614c23525080612d8a5280614be1525080612c185280614b9f525080612aa65280614b5d5250806129345280614b1b5250806127c25280614ad95250806126505280614a975250806124de5280614a5552508061236c5280614a135250806121fa52806149d1525080612088528061498f525080611f16528061494d525080611da4528061490b525080611c3252806148c9525080611ac0528061488752508061194e52806148455250806117dc528061480352508061166a52806147c15250806114f8528061477f525080611386528061473d52508061121452806146fb5250806110a252806146b9525080610f305280614677525080610dbe5280614635525080610c4c52806145f3525080610ada52806145b1525080610968528061456f5250806107f6528061452d52508061068452806144eb52508061051252806144a95250806104c2528061319e5250615d536000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80638aba91b4116100c3578063e83157421161007c578063e831574214610282578063e9206d781461028a578063eaa1c2ca14610292578063ecc1e984146102a5578063fc57d4df146102b8578063fe2c6198146102cb5761014d565b80638aba91b4146102425780638e499bcf1461025757806392b843571461025f5780639f59963114610267578063d1b353b414610227578063e61a5fe41461027a5761014d565b8063482a619311610115578063482a6193146101d95780634da21942146101ec57806360846bc6146101ff578063651ed7881461021257806369aa3ac6146102275780638a0038881461022f5761014d565b8063010ec441146101525780631a125204146101705780632410520914610190578063276c2cba146101a557806337c0e12d146101b8575b600080fd5b61015a6102de565b6040516101679190615842565b60405180910390f35b61018361017e36600461556e565b610302565b6040516101679190615b6b565b610198610357565b6040516101679190615be6565b6101836101b3366004615624565b61037b565b6101cb6101c636600461556e565b6103b8565b604051610167929190615bef565b61015a6101e73660046155c3565b6103d1565b6101836101fa3660046154a0565b61047e565b61019861020d36600461556e565b610491565b61021a6104a3565b604051610167919061587a565b6101986104ac565b61018361023d36600461556e565b6104b8565b6102556102503660046155c3565b613057565b005b61019861319c565b6101986131c0565b6101836102753660046154a0565b6131e4565b61015a613286565b6101986132aa565b6101986132af565b6101cb6102a036600461556e565b6132d3565b6102556102b33660046154d8565b6132ec565b6101986102c63660046154a0565b613486565b6101986102d9366004615624565b6134ce565b7f000000000000000000000000000000000000000000000000000000000000000081565b61030a615346565b60006103158361373c565b9050600019811461033157610329816104b8565b915050610352565b60405162461bcd60e51b815260040161034990615982565b60405180910390fd5b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610383615346565b6103b28260405160200161039791906157d4565b60405160208183030381529060405280519060200120610302565b92915050565b6002602052600090815260409020805460019091015482565b600080600080848060200190518101906103eb9190615586565b9250925092506000868051906020012060405160200161040b91906157f0565b604051602081830303815290604052805190602001209050600181838686604051600081526020016040526040516104469493929190615885565b6020604051602081039080840390855afa158015610468573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b610486615346565b600061031583613ce7565b60006020819052908152604090205481565b60015460ff1681565b670de0b6b3a764000081565b6104c0615346565b7f000000000000000000000000000000000000000000000000000000000000000082106104ff5760405162461bcd60e51b815260040161034990615982565b8161066d576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156105e657fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600114156107df576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561075857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160021415610951576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156108ca57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160031415610ac3576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115610a3c57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160041415610c35576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115610bae57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160051415610da7576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115610d2057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160061415610f19576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115610e9257fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b816007141561108b576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561100457fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600814156111fd576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561117657fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b816009141561136f576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156112e857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600a14156114e1576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561145a57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600b1415611653576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156115cc57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600c14156117c5576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561173e57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600d1415611937576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156118b057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600e1415611aa9576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611a2257fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600f1415611c1b576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611b9457fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160101415611d8d576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611d0657fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160111415611eff576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611e7857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160121415612071576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611fea57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601314156121e3576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561215c57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160141415612355576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156122ce57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601514156124c7576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561244057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160161415612639576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156125b257fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601714156127ab576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561272457fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b816018141561291d576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561289657fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160191415612a8f576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612a0857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601a1415612c01576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612b7a57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601b1415612d73576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612cec57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601c1415612ee5576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612e5e57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601d1415610352576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612fd057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b60608280602001905181019061306d9190615692565b50905060405160200161307f90615821565b60405160208183030381529060405280519060200120816040516020016130a691906157d4565b60405160208183030381529060405280519060200120146130d95760405162461bcd60e51b815260040161034990615a70565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661310d84846103d1565b6001600160a01b0316146131335760405162461bcd60e51b8152600401610349906159b2565b6001805460ff1916811790556040517f98a13f7b181a3a1f99c871e7a3507d4a037d386d157279f978e0d555ae9fe74d9061318f907f000000000000000000000000000000000000000000000000000000000000000090615842565b60405180910390a1505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6131ec615346565b60006131f7836144a5565b9050600019811461320b57610329816104b8565b61327f836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561324757600080fd5b505afa15801561325b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101fa91906154bc565b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601e81565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052600090815260409020805460019091015482565b84831461330b5760405162461bcd60e51b815260040161034990615af1565b60005b858110156133ff577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166338636e9a88888481811061335157fe5b90506020028101906133639190615c18565b88888681811061336f57fe5b90506020028101906133819190615c18565b6040518563ffffffff1660e01b81526004016133a094939291906158a3565b600060405180830381600087803b1580156133ba57600080fd5b505af11580156133ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133f6919081019061565f565b5060010161330e565b50600061340a614c63565b905060005b8281101561347c5761347484848381811061342657fe5b90506020028101906134389190615c5f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250614ca9915050565b60010161340f565b5050505050505050565b6000613490615346565b613499836131e4565b905080606001516134bf6c0c9f2c9cd04674edea400000006134ba84614f16565b615005565b816134c657fe5b049392505050565b60006134d8615346565b6134e18361037b565b905061327f81614f16565b60008060006134f961503f565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b15801561353457600080fd5b505afa158015613548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061356c919061572b565b9250836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b1580156135a757600080fd5b505afa1580156135bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135df919061572b565b91506000806000866001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561361f57600080fd5b505afa158015613633573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061365791906156e2565b9250925092508363ffffffff168163ffffffff16146136b75780840363ffffffff811661368484866136c1565b516001600160e01b031602969096019563ffffffff81166136a585856136c1565b516001600160e01b0316029590950194505b5050509193909250565b6136c961538b565b6000826001600160701b0316116136f25760405162461bcd60e51b815260040161034990615b34565b6040805160208101909152806001600160701b0384166dffffffffffffffffffffffffffff60701b607087901b168161372757fe5b046001600160e01b0316815250905092915050565b60007f000000000000000000000000000000000000000000000000000000000000000082141561376e57506000610352565b7f000000000000000000000000000000000000000000000000000000000000000082141561379e57506001610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156137ce57506002610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156137fe57506003610352565b7f000000000000000000000000000000000000000000000000000000000000000082141561382e57506004610352565b7f000000000000000000000000000000000000000000000000000000000000000082141561385e57506005610352565b7f000000000000000000000000000000000000000000000000000000000000000082141561388e57506006610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156138be57506007610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156138ee57506008610352565b7f000000000000000000000000000000000000000000000000000000000000000082141561391e57506009610352565b7f000000000000000000000000000000000000000000000000000000000000000082141561394e5750600a610352565b7f000000000000000000000000000000000000000000000000000000000000000082141561397e5750600b610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156139ae5750600c610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156139de5750600d610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a0e5750600e610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a3e5750600f610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a6e57506010610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a9e57506011610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613ace57506012610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613afe57506013610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b2e57506014610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b5e57506015610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b8e57506016610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613bbe57506017610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613bee57506018610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613c1e57506019610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613c4e5750601a610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613c7e5750601b610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613cae5750601c610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613cde5750601d610352565b50600019919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613d2b57506000610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613d6d57506001610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613daf57506002610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613df157506003610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613e3357506004610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613e7557506005610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613eb757506006610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613ef957506007610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613f3b57506008610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613f7d57506009610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613fbf5750600a610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140015750600b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140435750600c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140855750600d610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140c75750600e610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156141095750600f610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561414b57506010610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561418d57506011610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156141cf57506012610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561421157506013610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561425357506014610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561429557506015610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156142d757506016610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561431957506017610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561435b57506018610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561439d57506019610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156143df5750601a610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156144215750601b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156144635750601c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613cde5750601d610352565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156144e957506000610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561452b57506001610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561456d57506002610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156145af57506003610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156145f157506004610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561463357506005610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561467557506006610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156146b757506007610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156146f957506008610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561473b57506009610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561477d5750600a610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156147bf5750600b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148015750600c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148435750600d610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148855750600e610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148c75750600f610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561490957506010610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561494b57506011610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561498d57506012610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156149cf57506013610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a1157506014610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a5357506015610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a9557506016610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614ad757506017610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b1957506018610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b5b57506019610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b9d5750601a610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614bdf5750601b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614c215750601c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613cde5750601d610352565b6000614ca46040518060400160405280600381526020016208aa8960eb1b815250614c9660405160200161039790615833565b670de0b6b3a7640000615049565b905090565b614cb1615346565b614cba8361037b565b9050600281608001516002811115614cce57fe5b14614ceb5760405162461bcd60e51b815260040161034990615a02565b600083604051602001614cfe91906157d4565b60405160208183030381529060405280519060200120905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166376977a3a7f0000000000000000000000000000000000000000000000000000000000000000876040518363ffffffff1660e01b8152600401614d86929190615856565b60206040518083038186803b158015614d9e57600080fd5b505afa158015614db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dd69190615743565b67ffffffffffffffff1690506000604051602001614df390615833565b60405160208183030381529060405280519060200120831415614e17575083614e25565b614e22868587615049565b90505b60015460ff1615614e805760008381526020819052604090819020829055517f159e83f4712ba2552e68be9d848e49bf6dd35c24f19564ffd523b6549450a2f490614e7390889084906158d5565b60405180910390a1614f0e565b614e8a8282615161565b15614ed25760008381526020819052604090819020839055517f159e83f4712ba2552e68be9d848e49bf6dd35c24f19564ffd523b6549450a2f490614e7390889085906158d5565b7f90756d4c8646a4591078abac0e4e32dfa8437921729e36d51b88b659d265bfde868383604051614f05939291906158f7565b60405180910390a15b505050505050565b6000600282608001516002811115614f2a57fe5b1415614f485750604080820151600090815260208190522054610352565b600182608001516002811115614f5a57fe5b1415614f6b575060a0810151610352565b600082608001516002811115614f7d57fe5b1415610352576000806000604051602001614f9790615833565b60405160208183030381529060405280519060200120815260200190815260200160002054905060008111614fde5760405162461bcd60e51b815260040161034990615aa5565b670de0b6b3a7640000614ff5828560a00151615005565b81614ffc57fe5b04915050610352565b600082615014575060006103b2565b8282028284828161502157fe5b041461327f5760405162461bcd60e51b81526004016103499061594b565b63ffffffff421690565b600080600080615058866151e9565b92509250925080421161507d5760405162461bcd60e51b815260040161034990615a39565b4281900361508961538b565b6040518060200160405280838688038161509f57fe5b046001600160e01b0316815250905060006150b9826152fc565b905060006150c7828a615005565b905060008a60e00151156150ea578a6060015182816150e257fe5b049050615115565b670de0b6b3a764000080615102848e60600151615005565b8161510957fe5b048161511157fe5b0490505b7ff63d078e0de851897107641e96093a59e5ddc3c25e7b85a2585e3eba9e774a7b8c82884260405161514a949392919061591c565b60405180910390a19b9a5050505050505050505050565b600082156151e05760008361517e84670de0b6b3a7640000615005565b8161518557fe5b0490507f000000000000000000000000000000000000000000000000000000000000000081111580156151d857507f00000000000000000000000000000000000000000000000000000000000000008110155b9150506103b2565b50600092915050565b60008060008084604001519050600061520186615314565b905061520b61539d565b50600082815260036020908152604091829020825180840190935280548084526001909101549183019190915242037f000000000000000000000000000000000000000000000000000000000000000081106152d7578151600085815260026020908152604080832093845581860180516001958601556003909252918290204280825593018690558a82015185519151925190937fe37d39315e3419c0937360f1ac88f2c52ecf67e3b22b367f82047ddb4591904a936152ce93928990615bfd565b60405180910390a25b5050600091825260026020526040909120600181015490549196909550909350915050565b516612725dd1d243ab6001600160e01b039091160490565b60008060006153268460c001516134ec565b50915091508360e001511561533e5791506103529050565b509050610352565b60408051610100810182526000808252602082018190529181018290526060810182905290608082019081526000602082018190526040820181905260609091015290565b60408051602081019091526000815290565b604051806040016040528060008152602001600081525090565b60008083601f8401126153c8578182fd5b50813567ffffffffffffffff8111156153df578182fd5b60208301915083602080830285010111156153f957600080fd5b9250929050565b600082601f830112615410578081fd5b813561542361541e82615c9c565b615c75565b915080825283602082850101111561543a57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112615463578081fd5b815161547161541e82615c9c565b915080825283602082850101111561548857600080fd5b615499816020840160208601615cc0565b5092915050565b6000602082840312156154b1578081fd5b813561327f81615cf0565b6000602082840312156154cd578081fd5b815161327f81615cf0565b600080600080600080606087890312156154f0578182fd5b863567ffffffffffffffff80821115615507578384fd5b6155138a838b016153b7565b9098509650602089013591508082111561552b578384fd5b6155378a838b016153b7565b9096509450604089013591508082111561554f578384fd5b5061555c89828a016153b7565b979a9699509497509295939492505050565b60006020828403121561557f578081fd5b5035919050565b60008060006060848603121561559a578283fd5b8351925060208401519150604084015160ff811681146155b8578182fd5b809150509250925092565b600080604083850312156155d5578182fd5b823567ffffffffffffffff808211156155ec578384fd5b6155f886838701615400565b9350602085013591508082111561560d578283fd5b5061561a85828601615400565b9150509250929050565b600060208284031215615635578081fd5b813567ffffffffffffffff81111561564b578182fd5b61565784828501615400565b949350505050565b600060208284031215615670578081fd5b815167ffffffffffffffff811115615686578182fd5b61565784828501615453565b600080604083850312156156a4578182fd5b825167ffffffffffffffff8111156156ba578283fd5b6156c685828601615453565b92505060208301516156d781615cf0565b809150509250929050565b6000806000606084860312156156f6578283fd5b835161570181615d08565b602085015190935061571281615d08565b604085015190925063ffffffff811681146155b8578182fd5b60006020828403121561573c578081fd5b5051919050565b600060208284031215615754578081fd5b815167ffffffffffffffff8116811461327f578182fd5b6001600160a01b03169052565b15159052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526157c0816020860160208601615cc0565b601f01601f19169290920160200192915050565b600082516157e6818460208701615cc0565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b65726f7461746560d01b815260060190565b6208aa8960eb1b815260030190565b6001600160a01b0391909116815260200190565b6001600160a01b0383168152604060208201819052600090615657908301846157a8565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000604082526158b760408301868861577e565b82810360208401526158ca81858761577e565b979650505050505050565b6000604082526158e860408301856157a8565b90508260208301529392505050565b60006060825261590a60608301866157a8565b60208301949094525060400152919050565b60006080825261592f60808301876157a8565b6020830195909552506040810192909252606090910152919050565b60208082526017908201527f6d756c7469706c69636174696f6e206f766572666c6f77000000000000000000604082015260600190565b6020808252601690820152751d1bdad95b8818dbdb999a59c81b9bdd08199bdd5b9960521b604082015260600190565b60208082526030908201527f696e76616c69646174696f6e206d657373616765206d75737420636f6d65206660408201526f3937b6903a3432903932b837b93a32b960811b606082015260800190565b6020808252601f908201527f6f6e6c79207265706f72746572207072696365732067657420706f7374656400604082015260600190565b6020808252601a908201527f6e6f77206d75737420636f6d65206166746572206265666f7265000000000000604082015260600190565b6020808252818101527f696e76616c6964206d657373616765206d7573742062652027726f7461746527604082015260600190565b6020808252602c908201527f455448207072696365206e6f74207365742c2063616e6e6f7420636f6e76657260408201526b7420746f20646f6c6c61727360a01b606082015260800190565b60208082526023908201527f6d6573736167657320616e64207369676e617475726573206d75737420626520604082015262313a3160e81b606082015260800190565b60208082526017908201527f4669786564506f696e743a204449565f42595f5a45524f000000000000000000604082015260600190565b81516001600160a01b039081168252602080840151909116908201526040808301519082015260608083015190820152608082015161010082019060038110615bb057fe5b8060808401525060a083015160a083015260c0830151615bd360c084018261576b565b5060e083015161549960e0840182615778565b90815260200190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b6000808335601e19843603018112615c2e578283fd5b8084018035925067ffffffffffffffff831115615c49578384fd5b602001925050368190038213156153f957600080fd5b6000808335601e19843603018112615c2e578182fd5b60405181810167ffffffffffffffff81118282101715615c9457600080fd5b604052919050565b600067ffffffffffffffff821115615cb2578081fd5b50601f01601f191660200190565b60005b83811015615cdb578181015183820152602001615cc3565b83811115615cea576000848401525b50505050565b6001600160a01b0381168114615d0557600080fd5b50565b6001600160701b0381168114615d0557600080fdfea26469706673582212208c2a73bb54dfe5f38570c033928b1040c23a175021e768c6af478edcf88cf76164736f6c634300060a0033000000000000000000000000c629c26dced4277419cde234012f8160a0278a79000000000000000000000000fceadafab14d46e20144f48824d0c09b1a03f2bc00000000000000000000000000000000000000000000000002c68af0bb140000000000000000000000000000000000000000000000000000000000000000070800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000004ddc2d193948926d02f9b1fe9e1daa0718270ed50000000000000000000000000000000000000000000000000000000000000000aaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff40000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc00000000000000000000000000000000000000000000000000000000000000010000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36430000000000000000000000006b175474e89094c44da98b954eedeac495271d0fa5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e5680000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039aa39c021dfbae8fac545936693ac917d5e7563000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48d6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa00000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f650c3d88d12db855b8bf7d11be6c55a4e07dcc9000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec78b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c11b1268c1a384e55c48c2391d8d480264a3a7f40000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599e98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e90000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d94000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db550000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b6909b960dbbe7392d405429eb2b3649752b48380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3319f5d18bc0d84dd1b4825dcde5d5f7266d407000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498b8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6f348dd3b91a56d117ec0071c1e9b83c0996de40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000158079ee67fce2f58472a96584a73c7ab9ac95c10000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e86291a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee95040000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec2d2240d02a8cf63c3fa0b7d2c5a3169a3194960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a232603594dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c5320000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012c6adf3a350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035a18000230da775cac24873d00ff85bccded5500000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984fba01d52a7cd84480d0573725899486a0b5e55c20ff45d6628874349375d16500000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d3d2e2692501a5c9ca623199d38826e513033a1700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888b6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab4540000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cffdded873554f362ac02f8fb1f02e5ada10516f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a7790000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2107fa5b38d9bbd2c461d6edf11b11a50f6b97400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd200e44e7f628ff17b7c7961d3f0150b75ab99038e99c1bfc32d5721c1ca23747cbc0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f49c43ae0faf37217bdcb00df478cf793edd66870000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80638aba91b4116100c3578063e83157421161007c578063e831574214610282578063e9206d781461028a578063eaa1c2ca14610292578063ecc1e984146102a5578063fc57d4df146102b8578063fe2c6198146102cb5761014d565b80638aba91b4146102425780638e499bcf1461025757806392b843571461025f5780639f59963114610267578063d1b353b414610227578063e61a5fe41461027a5761014d565b8063482a619311610115578063482a6193146101d95780634da21942146101ec57806360846bc6146101ff578063651ed7881461021257806369aa3ac6146102275780638a0038881461022f5761014d565b8063010ec441146101525780631a125204146101705780632410520914610190578063276c2cba146101a557806337c0e12d146101b8575b600080fd5b61015a6102de565b6040516101679190615842565b60405180910390f35b61018361017e36600461556e565b610302565b6040516101679190615b6b565b610198610357565b6040516101679190615be6565b6101836101b3366004615624565b61037b565b6101cb6101c636600461556e565b6103b8565b604051610167929190615bef565b61015a6101e73660046155c3565b6103d1565b6101836101fa3660046154a0565b61047e565b61019861020d36600461556e565b610491565b61021a6104a3565b604051610167919061587a565b6101986104ac565b61018361023d36600461556e565b6104b8565b6102556102503660046155c3565b613057565b005b61019861319c565b6101986131c0565b6101836102753660046154a0565b6131e4565b61015a613286565b6101986132aa565b6101986132af565b6101cb6102a036600461556e565b6132d3565b6102556102b33660046154d8565b6132ec565b6101986102c63660046154a0565b613486565b6101986102d9366004615624565b6134ce565b7f000000000000000000000000fceadafab14d46e20144f48824d0c09b1a03f2bc81565b61030a615346565b60006103158361373c565b9050600019811461033157610329816104b8565b915050610352565b60405162461bcd60e51b815260040161034990615982565b60405180910390fd5b919050565b7f00000000000000000000000000000000000000000000000010a741a46278000081565b610383615346565b6103b28260405160200161039791906157d4565b60405160208183030381529060405280519060200120610302565b92915050565b6002602052600090815260409020805460019091015482565b600080600080848060200190518101906103eb9190615586565b9250925092506000868051906020012060405160200161040b91906157f0565b604051602081830303815290604052805190602001209050600181838686604051600081526020016040526040516104469493929190615885565b6020604051602081039080840390855afa158015610468573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b610486615346565b600061031583613ce7565b60006020819052908152604090205481565b60015460ff1681565b670de0b6b3a764000081565b6104c0615346565b7f000000000000000000000000000000000000000000000000000000000000000d82106104ff5760405162461bcd60e51b815260040161034990615982565b8161066d576040518061010001604052807f0000000000000000000000004ddc2d193948926d02f9b1fe9e1daa0718270ed56001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017faaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff481526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f000000000000000000000000000000000000000000000000000000000000000260028111156105e657fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc6001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000115158152509050610352565b81600114156107df576040518061010001604052807f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031681526020017f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b031681526020017fa5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e56881526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f0000000000000000000000000000000000000000000000000000000000000002600281111561075857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb116001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160021415610951576040518061010001604052807f00000000000000000000000039aa39c021dfbae8fac545936693ac917d5e75636001600160a01b031681526020017f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b031681526020017fd6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa81526020017f00000000000000000000000000000000000000000000000000000000000f424081526020017f000000000000000000000000000000000000000000000000000000000000000160028111156108ca57fe5b81526020017f00000000000000000000000000000000000000000000000000000000000f424081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160031415610ac3576040518061010001604052807f000000000000000000000000f650c3d88d12db855b8bf7d11be6c55a4e07dcc96001600160a01b031681526020017f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b031681526020017f8b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d081526020017f00000000000000000000000000000000000000000000000000000000000f424081526020017f00000000000000000000000000000000000000000000000000000000000000016002811115610a3c57fe5b81526020017f00000000000000000000000000000000000000000000000000000000000f424081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160041415610c35576040518061010001604052807f000000000000000000000000c11b1268c1a384e55c48c2391d8d480264a3a7f46001600160a01b031681526020017f0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5996001600160a01b031681526020017fe98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e981526020017f0000000000000000000000000000000000000000000000000000000005f5e10081526020017f00000000000000000000000000000000000000000000000000000000000000026002811115610bae57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d9406001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160051415610da7576040518061010001604052807f0000000000000000000000006c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e6001600160a01b031681526020017f0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef6001600160a01b031681526020017f3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db5581526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f00000000000000000000000000000000000000000000000000000000000000026002811115610d2057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000b6909b960dbbe7392d405429eb2b3649752b48386001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160061415610f19576040518061010001604052807f000000000000000000000000b3319f5d18bc0d84dd1b4825dcde5d5f7266d4076001600160a01b031681526020017f000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f4986001600160a01b031681526020017fb8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd81526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f00000000000000000000000000000000000000000000000000000000000000026002811115610e9257fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000c6f348dd3b91a56d117ec0071c1e9b83c0996de46001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000115158152509050610352565b816007141561108b576040518061010001604052807f000000000000000000000000158079ee67fce2f58472a96584a73c7ab9ac95c16001600160a01b031681526020017f0000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e8626001600160a01b031681526020017f91a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee950481526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f0000000000000000000000000000000000000000000000000000000000000002600281111561100457fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000ec2d2240d02a8cf63c3fa0b7d2c5a3169a3194966001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600814156111fd576040518061010001604052807f000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc6001600160a01b031681526020017f00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a232603596001600160a01b031681526020017f4dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c53281526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561117657fe5b81526020017f0000000000000000000000000000000000000000000000000012c6adf3a3500081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b816009141561136f576040518061010001604052807f00000000000000000000000035a18000230da775cac24873d00ff85bccded5506001600160a01b031681526020017f0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9846001600160a01b031681526020017ffba01d52a7cd84480d0573725899486a0b5e55c20ff45d6628874349375d165081526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f000000000000000000000000000000000000000000000000000000000000000260028111156112e857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000d3d2e2692501a5c9ca623199d38826e513033a176001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600a14156114e1576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000c00e94cb662c3520282e6f5717214004a7f268886001600160a01b031681526020017fb6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab45481526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f0000000000000000000000000000000000000000000000000000000000000002600281111561145a57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000cffdded873554f362ac02f8fb1f02e5ada10516f6001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600b1415611653576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b031681526020017f921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a77981526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f000000000000000000000000000000000000000000000000000000000000000260028111156115cc57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000a2107fa5b38d9bbd2c461d6edf11b11a50f6b9746001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600c14156117c5576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd2006001600160a01b031681526020017fe44e7f628ff17b7c7961d3f0150b75ab99038e99c1bfc32d5721c1ca23747cbc81526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f0000000000000000000000000000000000000000000000000000000000000002600281111561173e57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000f49c43ae0faf37217bdcb00df478cf793edd66876001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000115158152509050610352565b81600d1415611937576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156118b057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600e1415611aa9576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611a2257fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600f1415611c1b576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611b9457fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160101415611d8d576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611d0657fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160111415611eff576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611e7857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160121415612071576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611fea57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601314156121e3576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561215c57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160141415612355576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156122ce57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601514156124c7576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561244057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160161415612639576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156125b257fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601714156127ab576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561272457fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b816018141561291d576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561289657fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160191415612a8f576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612a0857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601a1415612c01576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612b7a57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601b1415612d73576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612cec57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601c1415612ee5576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612e5e57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601d1415610352576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612fd057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b60608280602001905181019061306d9190615692565b50905060405160200161307f90615821565b60405160208183030381529060405280519060200120816040516020016130a691906157d4565b60405160208183030381529060405280519060200120146130d95760405162461bcd60e51b815260040161034990615a70565b7f000000000000000000000000fceadafab14d46e20144f48824d0c09b1a03f2bc6001600160a01b031661310d84846103d1565b6001600160a01b0316146131335760405162461bcd60e51b8152600401610349906159b2565b6001805460ff1916811790556040517f98a13f7b181a3a1f99c871e7a3507d4a037d386d157279f978e0d555ae9fe74d9061318f907f000000000000000000000000fceadafab14d46e20144f48824d0c09b1a03f2bc90615842565b60405180910390a1505050565b7f000000000000000000000000000000000000000000000000000000000000000d81565b7f0000000000000000000000000000000000000000000000000b1a2bc2ec50000081565b6131ec615346565b60006131f7836144a5565b9050600019811461320b57610329816104b8565b61327f836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561324757600080fd5b505afa15801561325b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101fa91906154bc565b9392505050565b7f000000000000000000000000c629c26dced4277419cde234012f8160a0278a7981565b601e81565b7f000000000000000000000000000000000000000000000000000000000000070881565b6003602052600090815260409020805460019091015482565b84831461330b5760405162461bcd60e51b815260040161034990615af1565b60005b858110156133ff577f000000000000000000000000c629c26dced4277419cde234012f8160a0278a796001600160a01b03166338636e9a88888481811061335157fe5b90506020028101906133639190615c18565b88888681811061336f57fe5b90506020028101906133819190615c18565b6040518563ffffffff1660e01b81526004016133a094939291906158a3565b600060405180830381600087803b1580156133ba57600080fd5b505af11580156133ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133f6919081019061565f565b5060010161330e565b50600061340a614c63565b905060005b8281101561347c5761347484848381811061342657fe5b90506020028101906134389190615c5f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250614ca9915050565b60010161340f565b5050505050505050565b6000613490615346565b613499836131e4565b905080606001516134bf6c0c9f2c9cd04674edea400000006134ba84614f16565b615005565b816134c657fe5b049392505050565b60006134d8615346565b6134e18361037b565b905061327f81614f16565b60008060006134f961503f565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b15801561353457600080fd5b505afa158015613548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061356c919061572b565b9250836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b1580156135a757600080fd5b505afa1580156135bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135df919061572b565b91506000806000866001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561361f57600080fd5b505afa158015613633573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061365791906156e2565b9250925092508363ffffffff168163ffffffff16146136b75780840363ffffffff811661368484866136c1565b516001600160e01b031602969096019563ffffffff81166136a585856136c1565b516001600160e01b0316029590950194505b5050509193909250565b6136c961538b565b6000826001600160701b0316116136f25760405162461bcd60e51b815260040161034990615b34565b6040805160208101909152806001600160701b0384166dffffffffffffffffffffffffffff60701b607087901b168161372757fe5b046001600160e01b0316815250905092915050565b60007faaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff482141561376e57506000610352565b7fa5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e56882141561379e57506001610352565b7fd6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa8214156137ce57506002610352565b7f8b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d08214156137fe57506003610352565b7fe98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e982141561382e57506004610352565b7f3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db5582141561385e57506005610352565b7fb8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd82141561388e57506006610352565b7f91a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee95048214156138be57506007610352565b7f4dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c5328214156138ee57506008610352565b7ffba01d52a7cd84480d0573725899486a0b5e55c20ff45d6628874349375d165082141561391e57506009610352565b7fb6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab45482141561394e5750600a610352565b7f921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a77982141561397e5750600b610352565b7fe44e7f628ff17b7c7961d3f0150b75ab99038e99c1bfc32d5721c1ca23747cbc8214156139ae5750600c610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156139de5750600d610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a0e5750600e610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a3e5750600f610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a6e57506010610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a9e57506011610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613ace57506012610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613afe57506013610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b2e57506014610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b5e57506015610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b8e57506016610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613bbe57506017610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613bee57506018610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613c1e57506019610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613c4e5750601a610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613c7e5750601b610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613cae5750601c610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613cde5750601d610352565b50600019919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613d2b57506000610352565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316826001600160a01b03161415613d6d57506001610352565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316826001600160a01b03161415613daf57506002610352565b7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b0316826001600160a01b03161415613df157506003610352565b7f0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5996001600160a01b0316826001600160a01b03161415613e3357506004610352565b7f0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef6001600160a01b0316826001600160a01b03161415613e7557506005610352565b7f000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f4986001600160a01b0316826001600160a01b03161415613eb757506006610352565b7f0000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e8626001600160a01b0316826001600160a01b03161415613ef957506007610352565b7f00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a232603596001600160a01b0316826001600160a01b03161415613f3b57506008610352565b7f0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9846001600160a01b0316826001600160a01b03161415613f7d57506009610352565b7f000000000000000000000000c00e94cb662c3520282e6f5717214004a7f268886001600160a01b0316826001600160a01b03161415613fbf5750600a610352565b7f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b0316826001600160a01b031614156140015750600b610352565b7f000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd2006001600160a01b0316826001600160a01b031614156140435750600c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140855750600d610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140c75750600e610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156141095750600f610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561414b57506010610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561418d57506011610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156141cf57506012610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561421157506013610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561425357506014610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561429557506015610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156142d757506016610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561431957506017610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561435b57506018610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561439d57506019610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156143df5750601a610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156144215750601b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156144635750601c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613cde5750601d610352565b60007f0000000000000000000000004ddc2d193948926d02f9b1fe9e1daa0718270ed56001600160a01b0316826001600160a01b031614156144e957506000610352565b7f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b0316826001600160a01b0316141561452b57506001610352565b7f00000000000000000000000039aa39c021dfbae8fac545936693ac917d5e75636001600160a01b0316826001600160a01b0316141561456d57506002610352565b7f000000000000000000000000f650c3d88d12db855b8bf7d11be6c55a4e07dcc96001600160a01b0316826001600160a01b031614156145af57506003610352565b7f000000000000000000000000c11b1268c1a384e55c48c2391d8d480264a3a7f46001600160a01b0316826001600160a01b031614156145f157506004610352565b7f0000000000000000000000006c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e6001600160a01b0316826001600160a01b0316141561463357506005610352565b7f000000000000000000000000b3319f5d18bc0d84dd1b4825dcde5d5f7266d4076001600160a01b0316826001600160a01b0316141561467557506006610352565b7f000000000000000000000000158079ee67fce2f58472a96584a73c7ab9ac95c16001600160a01b0316826001600160a01b031614156146b757506007610352565b7f000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc6001600160a01b0316826001600160a01b031614156146f957506008610352565b7f00000000000000000000000035a18000230da775cac24873d00ff85bccded5506001600160a01b0316826001600160a01b0316141561473b57506009610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561477d5750600a610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156147bf5750600b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148015750600c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148435750600d610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148855750600e610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148c75750600f610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561490957506010610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561494b57506011610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561498d57506012610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156149cf57506013610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a1157506014610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a5357506015610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a9557506016610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614ad757506017610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b1957506018610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b5b57506019610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b9d5750601a610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614bdf5750601b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614c215750601c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613cde5750601d610352565b6000614ca46040518060400160405280600381526020016208aa8960eb1b815250614c9660405160200161039790615833565b670de0b6b3a7640000615049565b905090565b614cb1615346565b614cba8361037b565b9050600281608001516002811115614cce57fe5b14614ceb5760405162461bcd60e51b815260040161034990615a02565b600083604051602001614cfe91906157d4565b60405160208183030381529060405280519060200120905060007f000000000000000000000000c629c26dced4277419cde234012f8160a0278a796001600160a01b03166376977a3a7f000000000000000000000000fceadafab14d46e20144f48824d0c09b1a03f2bc876040518363ffffffff1660e01b8152600401614d86929190615856565b60206040518083038186803b158015614d9e57600080fd5b505afa158015614db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dd69190615743565b67ffffffffffffffff1690506000604051602001614df390615833565b60405160208183030381529060405280519060200120831415614e17575083614e25565b614e22868587615049565b90505b60015460ff1615614e805760008381526020819052604090819020829055517f159e83f4712ba2552e68be9d848e49bf6dd35c24f19564ffd523b6549450a2f490614e7390889084906158d5565b60405180910390a1614f0e565b614e8a8282615161565b15614ed25760008381526020819052604090819020839055517f159e83f4712ba2552e68be9d848e49bf6dd35c24f19564ffd523b6549450a2f490614e7390889085906158d5565b7f90756d4c8646a4591078abac0e4e32dfa8437921729e36d51b88b659d265bfde868383604051614f05939291906158f7565b60405180910390a15b505050505050565b6000600282608001516002811115614f2a57fe5b1415614f485750604080820151600090815260208190522054610352565b600182608001516002811115614f5a57fe5b1415614f6b575060a0810151610352565b600082608001516002811115614f7d57fe5b1415610352576000806000604051602001614f9790615833565b60405160208183030381529060405280519060200120815260200190815260200160002054905060008111614fde5760405162461bcd60e51b815260040161034990615aa5565b670de0b6b3a7640000614ff5828560a00151615005565b81614ffc57fe5b04915050610352565b600082615014575060006103b2565b8282028284828161502157fe5b041461327f5760405162461bcd60e51b81526004016103499061594b565b63ffffffff421690565b600080600080615058866151e9565b92509250925080421161507d5760405162461bcd60e51b815260040161034990615a39565b4281900361508961538b565b6040518060200160405280838688038161509f57fe5b046001600160e01b0316815250905060006150b9826152fc565b905060006150c7828a615005565b905060008a60e00151156150ea578a6060015182816150e257fe5b049050615115565b670de0b6b3a764000080615102848e60600151615005565b8161510957fe5b048161511157fe5b0490505b7ff63d078e0de851897107641e96093a59e5ddc3c25e7b85a2585e3eba9e774a7b8c82884260405161514a949392919061591c565b60405180910390a19b9a5050505050505050505050565b600082156151e05760008361517e84670de0b6b3a7640000615005565b8161518557fe5b0490507f00000000000000000000000000000000000000000000000010a741a46278000081111580156151d857507f0000000000000000000000000000000000000000000000000b1a2bc2ec5000008110155b9150506103b2565b50600092915050565b60008060008084604001519050600061520186615314565b905061520b61539d565b50600082815260036020908152604091829020825180840190935280548084526001909101549183019190915242037f000000000000000000000000000000000000000000000000000000000000070881106152d7578151600085815260026020908152604080832093845581860180516001958601556003909252918290204280825593018690558a82015185519151925190937fe37d39315e3419c0937360f1ac88f2c52ecf67e3b22b367f82047ddb4591904a936152ce93928990615bfd565b60405180910390a25b5050600091825260026020526040909120600181015490549196909550909350915050565b516612725dd1d243ab6001600160e01b039091160490565b60008060006153268460c001516134ec565b50915091508360e001511561533e5791506103529050565b509050610352565b60408051610100810182526000808252602082018190529181018290526060810182905290608082019081526000602082018190526040820181905260609091015290565b60408051602081019091526000815290565b604051806040016040528060008152602001600081525090565b60008083601f8401126153c8578182fd5b50813567ffffffffffffffff8111156153df578182fd5b60208301915083602080830285010111156153f957600080fd5b9250929050565b600082601f830112615410578081fd5b813561542361541e82615c9c565b615c75565b915080825283602082850101111561543a57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112615463578081fd5b815161547161541e82615c9c565b915080825283602082850101111561548857600080fd5b615499816020840160208601615cc0565b5092915050565b6000602082840312156154b1578081fd5b813561327f81615cf0565b6000602082840312156154cd578081fd5b815161327f81615cf0565b600080600080600080606087890312156154f0578182fd5b863567ffffffffffffffff80821115615507578384fd5b6155138a838b016153b7565b9098509650602089013591508082111561552b578384fd5b6155378a838b016153b7565b9096509450604089013591508082111561554f578384fd5b5061555c89828a016153b7565b979a9699509497509295939492505050565b60006020828403121561557f578081fd5b5035919050565b60008060006060848603121561559a578283fd5b8351925060208401519150604084015160ff811681146155b8578182fd5b809150509250925092565b600080604083850312156155d5578182fd5b823567ffffffffffffffff808211156155ec578384fd5b6155f886838701615400565b9350602085013591508082111561560d578283fd5b5061561a85828601615400565b9150509250929050565b600060208284031215615635578081fd5b813567ffffffffffffffff81111561564b578182fd5b61565784828501615400565b949350505050565b600060208284031215615670578081fd5b815167ffffffffffffffff811115615686578182fd5b61565784828501615453565b600080604083850312156156a4578182fd5b825167ffffffffffffffff8111156156ba578283fd5b6156c685828601615453565b92505060208301516156d781615cf0565b809150509250929050565b6000806000606084860312156156f6578283fd5b835161570181615d08565b602085015190935061571281615d08565b604085015190925063ffffffff811681146155b8578182fd5b60006020828403121561573c578081fd5b5051919050565b600060208284031215615754578081fd5b815167ffffffffffffffff8116811461327f578182fd5b6001600160a01b03169052565b15159052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526157c0816020860160208601615cc0565b601f01601f19169290920160200192915050565b600082516157e6818460208701615cc0565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b65726f7461746560d01b815260060190565b6208aa8960eb1b815260030190565b6001600160a01b0391909116815260200190565b6001600160a01b0383168152604060208201819052600090615657908301846157a8565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000604082526158b760408301868861577e565b82810360208401526158ca81858761577e565b979650505050505050565b6000604082526158e860408301856157a8565b90508260208301529392505050565b60006060825261590a60608301866157a8565b60208301949094525060400152919050565b60006080825261592f60808301876157a8565b6020830195909552506040810192909252606090910152919050565b60208082526017908201527f6d756c7469706c69636174696f6e206f766572666c6f77000000000000000000604082015260600190565b6020808252601690820152751d1bdad95b8818dbdb999a59c81b9bdd08199bdd5b9960521b604082015260600190565b60208082526030908201527f696e76616c69646174696f6e206d657373616765206d75737420636f6d65206660408201526f3937b6903a3432903932b837b93a32b960811b606082015260800190565b6020808252601f908201527f6f6e6c79207265706f72746572207072696365732067657420706f7374656400604082015260600190565b6020808252601a908201527f6e6f77206d75737420636f6d65206166746572206265666f7265000000000000604082015260600190565b6020808252818101527f696e76616c6964206d657373616765206d7573742062652027726f7461746527604082015260600190565b6020808252602c908201527f455448207072696365206e6f74207365742c2063616e6e6f7420636f6e76657260408201526b7420746f20646f6c6c61727360a01b606082015260800190565b60208082526023908201527f6d6573736167657320616e64207369676e617475726573206d75737420626520604082015262313a3160e81b606082015260800190565b60208082526017908201527f4669786564506f696e743a204449565f42595f5a45524f000000000000000000604082015260600190565b81516001600160a01b039081168252602080840151909116908201526040808301519082015260608083015190820152608082015161010082019060038110615bb057fe5b8060808401525060a083015160a083015260c0830151615bd360c084018261576b565b5060e083015161549960e0840182615778565b90815260200190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b6000808335601e19843603018112615c2e578283fd5b8084018035925067ffffffffffffffff831115615c49578384fd5b602001925050368190038213156153f957600080fd5b6000808335601e19843603018112615c2e578182fd5b60405181810167ffffffffffffffff81118282101715615c9457600080fd5b604052919050565b600067ffffffffffffffff821115615cb2578081fd5b50601f01601f191660200190565b60005b83811015615cdb578181015183820152602001615cc3565b83811115615cea576000848401525b50505050565b6001600160a01b0381168114615d0557600080fd5b50565b6001600160701b0381168114615d0557600080fdfea26469706673582212208c2a73bb54dfe5f38570c033928b1040c23a175021e768c6af478edcf88cf76164736f6c634300060a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c629c26dced4277419cde234012f8160a0278a79000000000000000000000000fceadafab14d46e20144f48824d0c09b1a03f2bc00000000000000000000000000000000000000000000000002c68af0bb140000000000000000000000000000000000000000000000000000000000000000070800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000004ddc2d193948926d02f9b1fe9e1daa0718270ed50000000000000000000000000000000000000000000000000000000000000000aaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff40000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc00000000000000000000000000000000000000000000000000000000000000010000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36430000000000000000000000006b175474e89094c44da98b954eedeac495271d0fa5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e5680000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039aa39c021dfbae8fac545936693ac917d5e7563000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48d6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa00000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f650c3d88d12db855b8bf7d11be6c55a4e07dcc9000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec78b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c11b1268c1a384e55c48c2391d8d480264a3a7f40000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599e98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e90000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d94000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db550000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b6909b960dbbe7392d405429eb2b3649752b48380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3319f5d18bc0d84dd1b4825dcde5d5f7266d407000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498b8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6f348dd3b91a56d117ec0071c1e9b83c0996de40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000158079ee67fce2f58472a96584a73c7ab9ac95c10000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e86291a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee95040000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec2d2240d02a8cf63c3fa0b7d2c5a3169a3194960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a232603594dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c5320000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012c6adf3a350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035a18000230da775cac24873d00ff85bccded5500000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984fba01d52a7cd84480d0573725899486a0b5e55c20ff45d6628874349375d16500000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d3d2e2692501a5c9ca623199d38826e513033a1700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888b6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab4540000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cffdded873554f362ac02f8fb1f02e5ada10516f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a7790000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2107fa5b38d9bbd2c461d6edf11b11a50f6b97400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd200e44e7f628ff17b7c7961d3f0150b75ab99038e99c1bfc32d5721c1ca23747cbc0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f49c43ae0faf37217bdcb00df478cf793edd66870000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : priceData_ (address): 0xc629C26dcED4277419CDe234012F8160A0278a79
Arg [1] : reporter_ (address): 0xfCEAdAFab14d46e20144F48824d0C09B1a03F2BC
Arg [2] : anchorToleranceMantissa_ (uint256): 200000000000000000
Arg [3] : anchorPeriod_ (uint256): 1800
Arg [4] : configs (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
-----Encoded View---------------
110 Constructor Arguments found :
Arg [0] : 000000000000000000000000c629c26dced4277419cde234012f8160a0278a79
Arg [1] : 000000000000000000000000fceadafab14d46e20144f48824d0c09b1a03f2bc
Arg [2] : 00000000000000000000000000000000000000000000000002c68af0bb140000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000708
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [6] : 0000000000000000000000004ddc2d193948926d02f9b1fe9e1daa0718270ed5
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : aaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff4
Arg [9] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [12] : 000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [14] : 0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e3643
Arg [15] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [16] : a5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e568
Arg [17] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [20] : 000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb11
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [22] : 00000000000000000000000039aa39c021dfbae8fac545936693ac917d5e7563
Arg [23] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [24] : d6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa
Arg [25] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [27] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [30] : 000000000000000000000000f650c3d88d12db855b8bf7d11be6c55a4e07dcc9
Arg [31] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [32] : 8b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d0
Arg [33] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [35] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [36] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [37] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [38] : 000000000000000000000000c11b1268c1a384e55c48c2391d8d480264a3a7f4
Arg [39] : 0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599
Arg [40] : e98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e9
Arg [41] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [42] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [43] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [44] : 000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d940
Arg [45] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [46] : 0000000000000000000000006c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e
Arg [47] : 0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef
Arg [48] : 3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db55
Arg [49] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [50] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [51] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [52] : 000000000000000000000000b6909b960dbbe7392d405429eb2b3649752b4838
Arg [53] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [54] : 000000000000000000000000b3319f5d18bc0d84dd1b4825dcde5d5f7266d407
Arg [55] : 000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498
Arg [56] : b8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd
Arg [57] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [58] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [59] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [60] : 000000000000000000000000c6f348dd3b91a56d117ec0071c1e9b83c0996de4
Arg [61] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [62] : 000000000000000000000000158079ee67fce2f58472a96584a73c7ab9ac95c1
Arg [63] : 0000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e862
Arg [64] : 91a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee9504
Arg [65] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [66] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [67] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [68] : 000000000000000000000000ec2d2240d02a8cf63c3fa0b7d2c5a3169a319496
Arg [69] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [70] : 000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc
Arg [71] : 00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359
Arg [72] : 4dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c532
Arg [73] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [74] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [75] : 0000000000000000000000000000000000000000000000000012c6adf3a35000
Arg [76] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [77] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [78] : 00000000000000000000000035a18000230da775cac24873d00ff85bccded550
Arg [79] : 0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984
Arg [80] : fba01d52a7cd84480d0573725899486a0b5e55c20ff45d6628874349375d1650
Arg [81] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [82] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [83] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [84] : 000000000000000000000000d3d2e2692501a5c9ca623199d38826e513033a17
Arg [85] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [86] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [87] : 000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888
Arg [88] : b6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab454
Arg [89] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [90] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [91] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [92] : 000000000000000000000000cffdded873554f362ac02f8fb1f02e5ada10516f
Arg [93] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [94] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [95] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [96] : 921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a779
Arg [97] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [98] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [99] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [100] : 000000000000000000000000a2107fa5b38d9bbd2c461d6edf11b11a50f6b974
Arg [101] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [102] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [103] : 000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd200
Arg [104] : e44e7f628ff17b7c7961d3f0150b75ab99038e99c1bfc32d5721c1ca23747cbc
Arg [105] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [106] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [107] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [108] : 000000000000000000000000f49c43ae0faf37217bdcb00df478cf793edd6687
Arg [109] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode Sourcemap
50119:14687:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50553:33;;;:::i;:::-;;;;;;;;;;;;;;;;45656:292;;;;;;;;;:::i;:::-;;;;;;;;50715:43;;;:::i;:::-;;;;;;;;45286:184;;;;;;;;;:::i;51381:54::-;;;;;;;;;:::i;:::-;;;;;;;;;64209:344;;;;;;;;;:::i;46725:292::-;;;;;;;;;:::i;51146:38::-;;;;;;;;;:::i;51284:31::-;;;:::i;:::-;;;;;;;;50466:36;;;:::i;37134:7996::-;;;;;;;;;:::i;63295:480::-;;;;;;;;;:::i;:::-;;7103:31;;;:::i;50886:43::-;;;:::i;46221:306::-;;;;;;;;;:::i;50256:46::-;;;:::i;6989:35::-;;;:::i;51055:34::-;;;:::i;51501:54::-;;;;;;;;;:::i;57002:573::-;;;;;;;;;:::i;56135:408::-;;;;;;;;;:::i;55115:182::-;;;;;;;;;:::i;50553:33::-;;;:::o;45656:292::-;45733:18;;:::i;:::-;45764:10;45777:30;45796:10;45777:18;:30::i;:::-;45764:43;;-1:-1:-1;;45822:5:0;:17;45818:78;;45863:21;45878:5;45863:14;:21::i;:::-;45856:28;;;;;45818:78;45908:32;;-1:-1:-1;;;45908:32:0;;;;;;;;;;;;;;;;45656:292;;;;:::o;50715:43::-;;;:::o;45286:184::-;45361:18;;:::i;:::-;45399:63;45453:6;45436:24;;;;;;;;;;;;;;;;;;;;;;45426:35;;;;;;45399:26;:63::i;:::-;45392:70;45286:184;-1:-1:-1;;45286:184:0:o;51381:54::-;;;;;;;;;;;;;;;;;;;:::o;64209:344::-;64292:7;64313:9;64324;64335:7;64357:9;64346:48;;;;;;;;;;;;;;64312:82;;;;;;64405:12;64493:7;64483:18;;;;;;64430:72;;;;;;;;;;;;;;;;;;;;;;64420:83;;;;;;64405:98;;64521:24;64531:4;64537:1;64540;64543;64521:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64521:24:0;;-1:-1:-1;;64521:24:0;;;64209:344;-1:-1:-1;;;;;;;;64209:344:0:o;46725:292::-;46802:18;;:::i;:::-;46833:10;46846:30;46865:10;46846:18;:30::i;51146:38::-;;;;;;;;;;;;;;:::o;51284:31::-;;;;;;:::o;50466:36::-;50498:4;50466:36;:::o;37134:7996::-;37187:18;;:::i;:::-;37230:9;37226:1;:13;37218:48;;;;-1:-1:-1;;;37218:48:0;;;;;;;;;37283:6;37279:250;;37298:231;;;;;;;;37319:8;-1:-1:-1;;;;;37298:231:0;;;;;37341:12;-1:-1:-1;;;;;37298:231:0;;;;;37367:12;37298:231;;;;37391:10;37298:231;;;;37416:13;37298:231;;;;;;;;;;;;37443:12;37298:231;;;;37472:15;-1:-1:-1;;;;;37298:231:0;;;;;37508:19;37298:231;;;;;37291:238;;;;37279:250;37544:1;37549;37544:6;37540:250;;;37559:231;;;;;;;;37580:8;-1:-1:-1;;;;;37559:231:0;;;;;37602:12;-1:-1:-1;;;;;37559:231:0;;;;;37628:12;37559:231;;;;37652:10;37559:231;;;;37677:13;37559:231;;;;;;;;;;;;37704:12;37559:231;;;;37733:15;-1:-1:-1;;;;;37559:231:0;;;;;37769:19;37559:231;;;;;37552:238;;;;37540:250;37805:1;37810;37805:6;37801:250;;;37820:231;;;;;;;;37841:8;-1:-1:-1;;;;;37820:231:0;;;;;37863:12;-1:-1:-1;;;;;37820:231:0;;;;;37889:12;37820:231;;;;37913:10;37820:231;;;;37938:13;37820:231;;;;;;;;;;;;37965:12;37820:231;;;;37994:15;-1:-1:-1;;;;;37820:231:0;;;;;38030:19;37820:231;;;;;37813:238;;;;37801:250;38066:1;38071;38066:6;38062:250;;;38081:231;;;;;;;;38102:8;-1:-1:-1;;;;;38081:231:0;;;;;38124:12;-1:-1:-1;;;;;38081:231:0;;;;;38150:12;38081:231;;;;38174:10;38081:231;;;;38199:13;38081:231;;;;;;;;;;;;38226:12;38081:231;;;;38255:15;-1:-1:-1;;;;;38081:231:0;;;;;38291:19;38081:231;;;;;38074:238;;;;38062:250;38327:1;38332;38327:6;38323:250;;;38342:231;;;;;;;;38363:8;-1:-1:-1;;;;;38342:231:0;;;;;38385:12;-1:-1:-1;;;;;38342:231:0;;;;;38411:12;38342:231;;;;38435:10;38342:231;;;;38460:13;38342:231;;;;;;;;;;;;38487:12;38342:231;;;;38516:15;-1:-1:-1;;;;;38342:231:0;;;;;38552:19;38342:231;;;;;38335:238;;;;38323:250;38588:1;38593;38588:6;38584:250;;;38603:231;;;;;;;;38624:8;-1:-1:-1;;;;;38603:231:0;;;;;38646:12;-1:-1:-1;;;;;38603:231:0;;;;;38672:12;38603:231;;;;38696:10;38603:231;;;;38721:13;38603:231;;;;;;;;;;;;38748:12;38603:231;;;;38777:15;-1:-1:-1;;;;;38603:231:0;;;;;38813:19;38603:231;;;;;38596:238;;;;38584:250;38849:1;38854;38849:6;38845:250;;;38864:231;;;;;;;;38885:8;-1:-1:-1;;;;;38864:231:0;;;;;38907:12;-1:-1:-1;;;;;38864:231:0;;;;;38933:12;38864:231;;;;38957:10;38864:231;;;;38982:13;38864:231;;;;;;;;;;;;39009:12;38864:231;;;;39038:15;-1:-1:-1;;;;;38864:231:0;;;;;39074:19;38864:231;;;;;38857:238;;;;38845:250;39110:1;39115;39110:6;39106:250;;;39125:231;;;;;;;;39146:8;-1:-1:-1;;;;;39125:231:0;;;;;39168:12;-1:-1:-1;;;;;39125:231:0;;;;;39194:12;39125:231;;;;39218:10;39125:231;;;;39243:13;39125:231;;;;;;;;;;;;39270:12;39125:231;;;;39299:15;-1:-1:-1;;;;;39125:231:0;;;;;39335:19;39125:231;;;;;39118:238;;;;39106:250;39371:1;39376;39371:6;39367:250;;;39386:231;;;;;;;;39407:8;-1:-1:-1;;;;;39386:231:0;;;;;39429:12;-1:-1:-1;;;;;39386:231:0;;;;;39455:12;39386:231;;;;39479:10;39386:231;;;;39504:13;39386:231;;;;;;;;;;;;39531:12;39386:231;;;;39560:15;-1:-1:-1;;;;;39386:231:0;;;;;39596:19;39386:231;;;;;39379:238;;;;39367:250;39632:1;39637;39632:6;39628:250;;;39647:231;;;;;;;;39668:8;-1:-1:-1;;;;;39647:231:0;;;;;39690:12;-1:-1:-1;;;;;39647:231:0;;;;;39716:12;39647:231;;;;39740:10;39647:231;;;;39765:13;39647:231;;;;;;;;;;;;39792:12;39647:231;;;;39821:15;-1:-1:-1;;;;;39647:231:0;;;;;39857:19;39647:231;;;;;39640:238;;;;39628:250;39895:1;39900:2;39895:7;39891:251;;;39911:231;;;;;;;;39932:8;-1:-1:-1;;;;;39911:231:0;;;;;39954:12;-1:-1:-1;;;;;39911:231:0;;;;;39980:12;39911:231;;;;40004:10;39911:231;;;;40029:13;39911:231;;;;;;;;;;;;40056:12;39911:231;;;;40085:15;-1:-1:-1;;;;;39911:231:0;;;;;40121:19;39911:231;;;;;39904:238;;;;39891:251;40157:1;40162:2;40157:7;40153:251;;;40173:231;;;;;;;;40194:8;-1:-1:-1;;;;;40173:231:0;;;;;40216:12;-1:-1:-1;;;;;40173:231:0;;;;;40242:12;40173:231;;;;40266:10;40173:231;;;;40291:13;40173:231;;;;;;;;;;;;40318:12;40173:231;;;;40347:15;-1:-1:-1;;;;;40173:231:0;;;;;40383:19;40173:231;;;;;40166:238;;;;40153:251;40419:1;40424:2;40419:7;40415:251;;;40435:231;;;;;;;;40456:8;-1:-1:-1;;;;;40435:231:0;;;;;40478:12;-1:-1:-1;;;;;40435:231:0;;;;;40504:12;40435:231;;;;40528:10;40435:231;;;;40553:13;40435:231;;;;;;;;;;;;40580:12;40435:231;;;;40609:15;-1:-1:-1;;;;;40435:231:0;;;;;40645:19;40435:231;;;;;40428:238;;;;40415:251;40681:1;40686:2;40681:7;40677:251;;;40697:231;;;;;;;;40718:8;-1:-1:-1;;;;;40697:231:0;;;;;40740:12;-1:-1:-1;;;;;40697:231:0;;;;;40766:12;40697:231;;;;40790:10;40697:231;;;;40815:13;40697:231;;;;;;;;;;;;40842:12;40697:231;;;;40871:15;-1:-1:-1;;;;;40697:231:0;;;;;40907:19;40697:231;;;;;40690:238;;;;40677:251;40943:1;40948:2;40943:7;40939:251;;;40959:231;;;;;;;;40980:8;-1:-1:-1;;;;;40959:231:0;;;;;41002:12;-1:-1:-1;;;;;40959:231:0;;;;;41028:12;40959:231;;;;41052:10;40959:231;;;;41077:13;40959:231;;;;;;;;;;;;41104:12;40959:231;;;;41133:15;-1:-1:-1;;;;;40959:231:0;;;;;41169:19;40959:231;;;;;40952:238;;;;40939:251;41205:1;41210:2;41205:7;41201:251;;;41221:231;;;;;;;;41242:8;-1:-1:-1;;;;;41221:231:0;;;;;41264:12;-1:-1:-1;;;;;41221:231:0;;;;;41290:12;41221:231;;;;41314:10;41221:231;;;;41339:13;41221:231;;;;;;;;;;;;41366:12;41221:231;;;;41395:15;-1:-1:-1;;;;;41221:231:0;;;;;41431:19;41221:231;;;;;41214:238;;;;41201:251;41467:1;41472:2;41467:7;41463:251;;;41483:231;;;;;;;;41504:8;-1:-1:-1;;;;;41483:231:0;;;;;41526:12;-1:-1:-1;;;;;41483:231:0;;;;;41552:12;41483:231;;;;41576:10;41483:231;;;;41601:13;41483:231;;;;;;;;;;;;41628:12;41483:231;;;;41657:15;-1:-1:-1;;;;;41483:231:0;;;;;41693:19;41483:231;;;;;41476:238;;;;41463:251;41729:1;41734:2;41729:7;41725:251;;;41745:231;;;;;;;;41766:8;-1:-1:-1;;;;;41745:231:0;;;;;41788:12;-1:-1:-1;;;;;41745:231:0;;;;;41814:12;41745:231;;;;41838:10;41745:231;;;;41863:13;41745:231;;;;;;;;;;;;41890:12;41745:231;;;;41919:15;-1:-1:-1;;;;;41745:231:0;;;;;41955:19;41745:231;;;;;41738:238;;;;41725:251;41991:1;41996:2;41991:7;41987:251;;;42007:231;;;;;;;;42028:8;-1:-1:-1;;;;;42007:231:0;;;;;42050:12;-1:-1:-1;;;;;42007:231:0;;;;;42076:12;42007:231;;;;42100:10;42007:231;;;;42125:13;42007:231;;;;;;;;;;;;42152:12;42007:231;;;;42181:15;-1:-1:-1;;;;;42007:231:0;;;;;42217:19;42007:231;;;;;42000:238;;;;41987:251;42253:1;42258:2;42253:7;42249:251;;;42269:231;;;;;;;;42290:8;-1:-1:-1;;;;;42269:231:0;;;;;42312:12;-1:-1:-1;;;;;42269:231:0;;;;;42338:12;42269:231;;;;42362:10;42269:231;;;;42387:13;42269:231;;;;;;;;;;;;42414:12;42269:231;;;;42443:15;-1:-1:-1;;;;;42269:231:0;;;;;42479:19;42269:231;;;;;42262:238;;;;42249:251;42517:1;42522:2;42517:7;42513:251;;;42533:231;;;;;;;;42554:8;-1:-1:-1;;;;;42533:231:0;;;;;42576:12;-1:-1:-1;;;;;42533:231:0;;;;;42602:12;42533:231;;;;42626:10;42533:231;;;;42651:13;42533:231;;;;;;;;;;;;42678:12;42533:231;;;;42707:15;-1:-1:-1;;;;;42533:231:0;;;;;42743:19;42533:231;;;;;42526:238;;;;42513:251;42779:1;42784:2;42779:7;42775:251;;;42795:231;;;;;;;;42816:8;-1:-1:-1;;;;;42795:231:0;;;;;42838:12;-1:-1:-1;;;;;42795:231:0;;;;;42864:12;42795:231;;;;42888:10;42795:231;;;;42913:13;42795:231;;;;;;;;;;;;42940:12;42795:231;;;;42969:15;-1:-1:-1;;;;;42795:231:0;;;;;43005:19;42795:231;;;;;42788:238;;;;42775:251;43041:1;43046:2;43041:7;43037:251;;;43057:231;;;;;;;;43078:8;-1:-1:-1;;;;;43057:231:0;;;;;43100:12;-1:-1:-1;;;;;43057:231:0;;;;;43126:12;43057:231;;;;43150:10;43057:231;;;;43175:13;43057:231;;;;;;;;;;;;43202:12;43057:231;;;;43231:15;-1:-1:-1;;;;;43057:231:0;;;;;43267:19;43057:231;;;;;43050:238;;;;43037:251;43303:1;43308:2;43303:7;43299:251;;;43319:231;;;;;;;;43340:8;-1:-1:-1;;;;;43319:231:0;;;;;43362:12;-1:-1:-1;;;;;43319:231:0;;;;;43388:12;43319:231;;;;43412:10;43319:231;;;;43437:13;43319:231;;;;;;;;;;;;43464:12;43319:231;;;;43493:15;-1:-1:-1;;;;;43319:231:0;;;;;43529:19;43319:231;;;;;43312:238;;;;43299:251;43565:1;43570:2;43565:7;43561:251;;;43581:231;;;;;;;;43602:8;-1:-1:-1;;;;;43581:231:0;;;;;43624:12;-1:-1:-1;;;;;43581:231:0;;;;;43650:12;43581:231;;;;43674:10;43581:231;;;;43699:13;43581:231;;;;;;;;;;;;43726:12;43581:231;;;;43755:15;-1:-1:-1;;;;;43581:231:0;;;;;43791:19;43581:231;;;;;43574:238;;;;43561:251;43827:1;43832:2;43827:7;43823:251;;;43843:231;;;;;;;;43864:8;-1:-1:-1;;;;;43843:231:0;;;;;43886:12;-1:-1:-1;;;;;43843:231:0;;;;;43912:12;43843:231;;;;43936:10;43843:231;;;;43961:13;43843:231;;;;;;;;;;;;43988:12;43843:231;;;;44017:15;-1:-1:-1;;;;;43843:231:0;;;;;44053:19;43843:231;;;;;43836:238;;;;43823:251;44089:1;44094:2;44089:7;44085:251;;;44105:231;;;;;;;;44126:8;-1:-1:-1;;;;;44105:231:0;;;;;44148:12;-1:-1:-1;;;;;44105:231:0;;;;;44174:12;44105:231;;;;44198:10;44105:231;;;;44223:13;44105:231;;;;;;;;;;;;44250:12;44105:231;;;;44279:15;-1:-1:-1;;;;;44105:231:0;;;;;44315:19;44105:231;;;;;44098:238;;;;44085:251;44351:1;44356:2;44351:7;44347:251;;;44367:231;;;;;;;;44388:8;-1:-1:-1;;;;;44367:231:0;;;;;44410:12;-1:-1:-1;;;;;44367:231:0;;;;;44436:12;44367:231;;;;44460:10;44367:231;;;;44485:13;44367:231;;;;;;;;;;;;44512:12;44367:231;;;;44541:15;-1:-1:-1;;;;;44367:231:0;;;;;44577:19;44367:231;;;;;44360:238;;;;44347:251;44613:1;44618:2;44613:7;44609:251;;;44629:231;;;;;;;;44650:8;-1:-1:-1;;;;;44629:231:0;;;;;44672:12;-1:-1:-1;;;;;44629:231:0;;;;;44698:12;44629:231;;;;44722:10;44629:231;;;;44747:13;44629:231;;;;;;;;;;;;44774:12;44629:231;;;;44803:15;-1:-1:-1;;;;;44629:231:0;;;;;44839:19;44629:231;;;;;44622:238;;;;44609:251;44875:1;44880:2;44875:7;44871:251;;;44891:231;;;;;;;;44912:8;-1:-1:-1;;;;;44891:231:0;;;;;44934:12;-1:-1:-1;;;;;44891:231:0;;;;;44960:12;44891:231;;;;44984:10;44891:231;;;;45009:13;44891:231;;;;;;;;;;;;45036:12;44891:231;;;;45065:15;-1:-1:-1;;;;;44891:231:0;;;;;45101:19;44891:231;;;;;44884:238;;;;63295:480;63390:28;63435:7;63424:38;;;;;;;;;;;;;;63389:73;;;52466:26;;;;;;;;;;;;;;;;;;;;;52456:37;;;;;;63508:14;63491:32;;;;;;;;;;;;;;;;;;;;;;63481:43;;;;;;:57;63473:102;;;;-1:-1:-1;;;63473:102:0;;;;;;;;;63624:8;-1:-1:-1;;;;;63594:38:0;:26;63601:7;63610:9;63594:6;:26::i;:::-;-1:-1:-1;;;;;63594:38:0;;63586:99;;;;-1:-1:-1;;;63586:99:0;;;;;;;;;63718:4;63696:26;;-1:-1:-1;;63696:26:0;;;;;63738:29;;;;;;63758:8;;63738:29;;;;;;;;;;63295:480;;;:::o;7103:31::-;;;:::o;50886:43::-;;;:::o;46221:306::-;46290:18;;:::i;:::-;46321:10;46334:22;46349:6;46334:14;:22::i;:::-;46321:35;;-1:-1:-1;;46371:5:0;:17;46367:78;;46412:21;46427:5;46412:14;:21::i;46367:78::-;46464:55;46498:6;-1:-1:-1;;;;;46491:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46464:55;46457:62;46221:306;-1:-1:-1;;;46221:306:0:o;50256:46::-;;;:::o;6989:35::-;7022:2;6989:35;:::o;51055:34::-;;;:::o;51501:54::-;;;;;;;;;;;;;;;;;;;:::o;57002:573::-;57133:36;;;57125:84;;;;-1:-1:-1;;;57125:84:0;;;;;;;;;57255:6;57250:111;57267:19;;;57250:111;;;57308:9;-1:-1:-1;;;;;57308:13:0;;57322:8;;57331:1;57322:11;;;;;;;;;;;;;;;;;;;;57335:10;;57346:1;57335:13;;;;;;;;;;;;;;;;;;;;57308:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57308:41:0;;;;;;;;;;;;;;-1:-1:-1;57288:3:0;;57250:111;;;;57373:13;57389:15;:13;:15::i;:::-;57373:31;-1:-1:-1;57465:6:0;57460:108;57477:18;;;57460:108;;;57517:39;57535:7;;57543:1;57535:10;;;;;;;;;;;;;;;;;;;;57517:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57547:8:0;;-1:-1:-1;57517:17:0;;-1:-1:-1;;57517:39:0:i;:::-;57497:3;;57460:108;;;;57002:573;;;;;;;:::o;56135:408::-;56202:4;56219:25;;:::i;:::-;56247:30;56270:6;56247:22;:30::i;:::-;56219:58;;56520:6;:15;;;56485:32;56489:4;56495:21;56509:6;56495:13;:21::i;:::-;56485:3;:32::i;:::-;:50;;;;;;;56135:408;-1:-1:-1;;;56135:408:0:o;55115:182::-;55175:4;55192:25;;:::i;:::-;55220:30;55243:6;55220:22;:30::i;:::-;55192:58;;55268:21;55282:6;55268:13;:21::i;48707:1058::-;48793:21;48816;48839;48890:23;:21;:23::i;:::-;48873:40;;48958:4;-1:-1:-1;;;;;48943:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48924:62;;49031:4;-1:-1:-1;;;;;49016:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48997:62;;49174:16;49192;49210:25;49254:4;-1:-1:-1;;;;;49239:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49173:100;;;;;;49310:14;49288:36;;:18;:36;;;49284:474;;49410:35;;;49556:62;;;49561:39;49581:8;49591;49561:19;:39::i;:::-;:42;-1:-1:-1;;;;;49556:48:0;:62;49536:82;;;;;49684:62;;;49689:39;49709:8;49719;49689:19;:39::i;:::-;:42;-1:-1:-1;;;;;49684:48:0;:62;49664:82;;;;;-1:-1:-1;49284:474:0;48707:1058;;;;;;;;:::o;47497:239::-;47578:16;;:::i;:::-;47629:1;47615:11;-1:-1:-1;;;;;47615:15:0;;47607:51;;;;-1:-1:-1;;;47607:51:0;;;;;;;;;47676:52;;;;;;;;;;-1:-1:-1;;;;;47686:41:0;;-1:-1:-1;;;47709:3:0;47687:25;;;;47686:41;;;;;;-1:-1:-1;;;;;47676:52:0;;;;47669:59;;47497:239;;;;:::o;35272:1663::-;35343:4;35378:12;35364:10;:26;35360:40;;;-1:-1:-1;35399:1:0;35392:8;;35360:40;35429:12;35415:10;:26;35411:40;;;-1:-1:-1;35450:1:0;35443:8;;35411:40;35480:12;35466:10;:26;35462:40;;;-1:-1:-1;35501:1:0;35494:8;;35462:40;35531:12;35517:10;:26;35513:40;;;-1:-1:-1;35552:1:0;35545:8;;35513:40;35582:12;35568:10;:26;35564:40;;;-1:-1:-1;35603:1:0;35596:8;;35564:40;35633:12;35619:10;:26;35615:40;;;-1:-1:-1;35654:1:0;35647:8;;35615:40;35684:12;35670:10;:26;35666:40;;;-1:-1:-1;35705:1:0;35698:8;;35666:40;35735:12;35721:10;:26;35717:40;;;-1:-1:-1;35756:1:0;35749:8;;35717:40;35786:12;35772:10;:26;35768:40;;;-1:-1:-1;35807:1:0;35800:8;;35768:40;35837:12;35823:10;:26;35819:40;;;-1:-1:-1;35858:1:0;35851:8;;35819:40;35888:12;35874:10;:26;35870:41;;;-1:-1:-1;35909:2:0;35902:9;;35870:41;35940:12;35926:10;:26;35922:41;;;-1:-1:-1;35961:2:0;35954:9;;35922:41;35992:12;35978:10;:26;35974:41;;;-1:-1:-1;36013:2:0;36006:9;;35974:41;36044:12;36030:10;:26;36026:41;;;-1:-1:-1;36065:2:0;36058:9;;36026:41;36096:12;36082:10;:26;36078:41;;;-1:-1:-1;36117:2:0;36110:9;;36078:41;36148:12;36134:10;:26;36130:41;;;-1:-1:-1;36169:2:0;36162:9;;36130:41;36200:12;36186:10;:26;36182:41;;;-1:-1:-1;36221:2:0;36214:9;;36182:41;36252:12;36238:10;:26;36234:41;;;-1:-1:-1;36273:2:0;36266:9;;36234:41;36304:12;36290:10;:26;36286:41;;;-1:-1:-1;36325:2:0;36318:9;;36286:41;36356:12;36342:10;:26;36338:41;;;-1:-1:-1;36377:2:0;36370:9;;36338:41;36408:12;36394:10;:26;36390:41;;;-1:-1:-1;36429:2:0;36422:9;;36390:41;36460:12;36446:10;:26;36442:41;;;-1:-1:-1;36481:2:0;36474:9;;36442:41;36512:12;36498:10;:26;36494:41;;;-1:-1:-1;36533:2:0;36526:9;;36494:41;36564:12;36550:10;:26;36546:41;;;-1:-1:-1;36585:2:0;36578:9;;36546:41;36616:12;36602:10;:26;36598:41;;;-1:-1:-1;36637:2:0;36630:9;;36598:41;36668:12;36654:10;:26;36650:41;;;-1:-1:-1;36689:2:0;36682:9;;36650:41;36720:12;36706:10;:26;36702:41;;;-1:-1:-1;36741:2:0;36734:9;;36702:41;36772:12;36758:10;:26;36754:41;;;-1:-1:-1;36793:2:0;36786:9;;36754:41;36824:12;36810:10;:26;36806:41;;;-1:-1:-1;36845:2:0;36838:9;;36806:41;36876:12;36862:10;:26;36858:41;;;-1:-1:-1;36897:2:0;36890:9;;36858:41;-1:-1:-1;;;35272:1663:0;;;:::o;33601:::-;33672:4;33707:12;-1:-1:-1;;;;;33693:26:0;:10;-1:-1:-1;;;;;33693:26:0;;33689:40;;;-1:-1:-1;33728:1:0;33721:8;;33689:40;33758:12;-1:-1:-1;;;;;33744:26:0;:10;-1:-1:-1;;;;;33744:26:0;;33740:40;;;-1:-1:-1;33779:1:0;33772:8;;33740:40;33809:12;-1:-1:-1;;;;;33795:26:0;:10;-1:-1:-1;;;;;33795:26:0;;33791:40;;;-1:-1:-1;33830:1:0;33823:8;;33791:40;33860:12;-1:-1:-1;;;;;33846:26:0;:10;-1:-1:-1;;;;;33846:26:0;;33842:40;;;-1:-1:-1;33881:1:0;33874:8;;33842:40;33911:12;-1:-1:-1;;;;;33897:26:0;:10;-1:-1:-1;;;;;33897:26:0;;33893:40;;;-1:-1:-1;33932:1:0;33925:8;;33893:40;33962:12;-1:-1:-1;;;;;33948:26:0;:10;-1:-1:-1;;;;;33948:26:0;;33944:40;;;-1:-1:-1;33983:1:0;33976:8;;33944:40;34013:12;-1:-1:-1;;;;;33999:26:0;:10;-1:-1:-1;;;;;33999:26:0;;33995:40;;;-1:-1:-1;34034:1:0;34027:8;;33995:40;34064:12;-1:-1:-1;;;;;34050:26:0;:10;-1:-1:-1;;;;;34050:26:0;;34046:40;;;-1:-1:-1;34085:1:0;34078:8;;34046:40;34115:12;-1:-1:-1;;;;;34101:26:0;:10;-1:-1:-1;;;;;34101:26:0;;34097:40;;;-1:-1:-1;34136:1:0;34129:8;;34097:40;34166:12;-1:-1:-1;;;;;34152:26:0;:10;-1:-1:-1;;;;;34152:26:0;;34148:40;;;-1:-1:-1;34187:1:0;34180:8;;34148:40;34217:12;-1:-1:-1;;;;;34203:26:0;:10;-1:-1:-1;;;;;34203:26:0;;34199:41;;;-1:-1:-1;34238:2:0;34231:9;;34199:41;34269:12;-1:-1:-1;;;;;34255:26:0;:10;-1:-1:-1;;;;;34255:26:0;;34251:41;;;-1:-1:-1;34290:2:0;34283:9;;34251:41;34321:12;-1:-1:-1;;;;;34307:26:0;:10;-1:-1:-1;;;;;34307:26:0;;34303:41;;;-1:-1:-1;34342:2:0;34335:9;;34303:41;34373:12;-1:-1:-1;;;;;34359:26:0;:10;-1:-1:-1;;;;;34359:26:0;;34355:41;;;-1:-1:-1;34394:2:0;34387:9;;34355:41;34425:12;-1:-1:-1;;;;;34411:26:0;:10;-1:-1:-1;;;;;34411:26:0;;34407:41;;;-1:-1:-1;34446:2:0;34439:9;;34407:41;34477:12;-1:-1:-1;;;;;34463:26:0;:10;-1:-1:-1;;;;;34463:26:0;;34459:41;;;-1:-1:-1;34498:2:0;34491:9;;34459:41;34529:12;-1:-1:-1;;;;;34515:26:0;:10;-1:-1:-1;;;;;34515:26:0;;34511:41;;;-1:-1:-1;34550:2:0;34543:9;;34511:41;34581:12;-1:-1:-1;;;;;34567:26:0;:10;-1:-1:-1;;;;;34567:26:0;;34563:41;;;-1:-1:-1;34602:2:0;34595:9;;34563:41;34633:12;-1:-1:-1;;;;;34619:26:0;:10;-1:-1:-1;;;;;34619:26:0;;34615:41;;;-1:-1:-1;34654:2:0;34647:9;;34615:41;34685:12;-1:-1:-1;;;;;34671:26:0;:10;-1:-1:-1;;;;;34671:26:0;;34667:41;;;-1:-1:-1;34706:2:0;34699:9;;34667:41;34737:12;-1:-1:-1;;;;;34723:26:0;:10;-1:-1:-1;;;;;34723:26:0;;34719:41;;;-1:-1:-1;34758:2:0;34751:9;;34719:41;34789:12;-1:-1:-1;;;;;34775:26:0;:10;-1:-1:-1;;;;;34775:26:0;;34771:41;;;-1:-1:-1;34810:2:0;34803:9;;34771:41;34841:12;-1:-1:-1;;;;;34827:26:0;:10;-1:-1:-1;;;;;34827:26:0;;34823:41;;;-1:-1:-1;34862:2:0;34855:9;;34823:41;34893:12;-1:-1:-1;;;;;34879:26:0;:10;-1:-1:-1;;;;;34879:26:0;;34875:41;;;-1:-1:-1;34914:2:0;34907:9;;34875:41;34945:12;-1:-1:-1;;;;;34931:26:0;:10;-1:-1:-1;;;;;34931:26:0;;34927:41;;;-1:-1:-1;34966:2:0;34959:9;;34927:41;34997:12;-1:-1:-1;;;;;34983:26:0;:10;-1:-1:-1;;;;;34983:26:0;;34979:41;;;-1:-1:-1;35018:2:0;35011:9;;34979:41;35049:12;-1:-1:-1;;;;;35035:26:0;:10;-1:-1:-1;;;;;35035:26:0;;35031:41;;;-1:-1:-1;35070:2:0;35063:9;;35031:41;35101:12;-1:-1:-1;;;;;35087:26:0;:10;-1:-1:-1;;;;;35087:26:0;;35083:41;;;-1:-1:-1;35122:2:0;35115:9;;35083:41;35153:12;-1:-1:-1;;;;;35139:26:0;:10;-1:-1:-1;;;;;35139:26:0;;35135:41;;;-1:-1:-1;35174:2:0;35167:9;;35135:41;35205:12;-1:-1:-1;;;;;35191:26:0;:10;-1:-1:-1;;;;;35191:26:0;;35187:41;;;-1:-1:-1;35226:2:0;35219:9;;32178:1415;32241:4;32272:8;-1:-1:-1;;;;;32262:18:0;:6;-1:-1:-1;;;;;32262:18:0;;32258:32;;;-1:-1:-1;32289:1:0;32282:8;;32258:32;32315:8;-1:-1:-1;;;;;32305:18:0;:6;-1:-1:-1;;;;;32305:18:0;;32301:32;;;-1:-1:-1;32332:1:0;32325:8;;32301:32;32358:8;-1:-1:-1;;;;;32348:18:0;:6;-1:-1:-1;;;;;32348:18:0;;32344:32;;;-1:-1:-1;32375:1:0;32368:8;;32344:32;32401:8;-1:-1:-1;;;;;32391:18:0;:6;-1:-1:-1;;;;;32391:18:0;;32387:32;;;-1:-1:-1;32418:1:0;32411:8;;32387:32;32444:8;-1:-1:-1;;;;;32434:18:0;:6;-1:-1:-1;;;;;32434:18:0;;32430:32;;;-1:-1:-1;32461:1:0;32454:8;;32430:32;32487:8;-1:-1:-1;;;;;32477:18:0;:6;-1:-1:-1;;;;;32477:18:0;;32473:32;;;-1:-1:-1;32504:1:0;32497:8;;32473:32;32530:8;-1:-1:-1;;;;;32520:18:0;:6;-1:-1:-1;;;;;32520:18:0;;32516:32;;;-1:-1:-1;32547:1:0;32540:8;;32516:32;32573:8;-1:-1:-1;;;;;32563:18:0;:6;-1:-1:-1;;;;;32563:18:0;;32559:32;;;-1:-1:-1;32590:1:0;32583:8;;32559:32;32616:8;-1:-1:-1;;;;;32606:18:0;:6;-1:-1:-1;;;;;32606:18:0;;32602:32;;;-1:-1:-1;32633:1:0;32626:8;;32602:32;32659:8;-1:-1:-1;;;;;32649:18:0;:6;-1:-1:-1;;;;;32649:18:0;;32645:32;;;-1:-1:-1;32676:1:0;32669:8;;32645:32;32702:8;-1:-1:-1;;;;;32692:18:0;:6;-1:-1:-1;;;;;32692:18:0;;32688:33;;;-1:-1:-1;32719:2:0;32712:9;;32688:33;32746:8;-1:-1:-1;;;;;32736:18:0;:6;-1:-1:-1;;;;;32736:18:0;;32732:33;;;-1:-1:-1;32763:2:0;32756:9;;32732:33;32790:8;-1:-1:-1;;;;;32780:18:0;:6;-1:-1:-1;;;;;32780:18:0;;32776:33;;;-1:-1:-1;32807:2:0;32800:9;;32776:33;32834:8;-1:-1:-1;;;;;32824:18:0;:6;-1:-1:-1;;;;;32824:18:0;;32820:33;;;-1:-1:-1;32851:2:0;32844:9;;32820:33;32878:8;-1:-1:-1;;;;;32868:18:0;:6;-1:-1:-1;;;;;32868:18:0;;32864:33;;;-1:-1:-1;32895:2:0;32888:9;;32864:33;32922:8;-1:-1:-1;;;;;32912:18:0;:6;-1:-1:-1;;;;;32912:18:0;;32908:33;;;-1:-1:-1;32939:2:0;32932:9;;32908:33;32966:8;-1:-1:-1;;;;;32956:18:0;:6;-1:-1:-1;;;;;32956:18:0;;32952:33;;;-1:-1:-1;32983:2:0;32976:9;;32952:33;33010:8;-1:-1:-1;;;;;33000:18:0;:6;-1:-1:-1;;;;;33000:18:0;;32996:33;;;-1:-1:-1;33027:2:0;33020:9;;32996:33;33054:8;-1:-1:-1;;;;;33044:18:0;:6;-1:-1:-1;;;;;33044:18:0;;33040:33;;;-1:-1:-1;33071:2:0;33064:9;;33040:33;33098:8;-1:-1:-1;;;;;33088:18:0;:6;-1:-1:-1;;;;;33088:18:0;;33084:33;;;-1:-1:-1;33115:2:0;33108:9;;33084:33;33142:8;-1:-1:-1;;;;;33132:18:0;:6;-1:-1:-1;;;;;33132:18:0;;33128:33;;;-1:-1:-1;33159:2:0;33152:9;;33128:33;33186:8;-1:-1:-1;;;;;33176:18:0;:6;-1:-1:-1;;;;;33176:18:0;;33172:33;;;-1:-1:-1;33203:2:0;33196:9;;33172:33;33230:8;-1:-1:-1;;;;;33220:18:0;:6;-1:-1:-1;;;;;33220:18:0;;33216:33;;;-1:-1:-1;33247:2:0;33240:9;;33216:33;33274:8;-1:-1:-1;;;;;33264:18:0;:6;-1:-1:-1;;;;;33264:18:0;;33260:33;;;-1:-1:-1;33291:2:0;33284:9;;33260:33;33318:8;-1:-1:-1;;;;;33308:18:0;:6;-1:-1:-1;;;;;33308:18:0;;33304:33;;;-1:-1:-1;33335:2:0;33328:9;;33304:33;33362:8;-1:-1:-1;;;;;33352:18:0;:6;-1:-1:-1;;;;;33352:18:0;;33348:33;;;-1:-1:-1;33379:2:0;33372:9;;33348:33;33406:8;-1:-1:-1;;;;;33396:18:0;:6;-1:-1:-1;;;;;33396:18:0;;33392:33;;;-1:-1:-1;33423:2:0;33416:9;;33392:33;33450:8;-1:-1:-1;;;;;33440:18:0;:6;-1:-1:-1;;;;;33440:18:0;;33436:33;;;-1:-1:-1;33467:2:0;33460:9;;33436:33;33494:8;-1:-1:-1;;;;;33484:18:0;:6;-1:-1:-1;;;;;33484:18:0;;33480:33;;;-1:-1:-1;33511:2:0;33504:9;;33480:33;33538:8;-1:-1:-1;;;;;33528:18:0;:6;-1:-1:-1;;;;;33528:18:0;;33524:33;;;-1:-1:-1;33555:2:0;33548:9;;59625:148;59668:4;59692:73;;;;;;;;;;;;;;-1:-1:-1;;;59692:73:0;;;59716:35;52395:23;;;;;;;;59716:35;50390:4;59692:16;:73::i;:::-;59685:80;;59625:148;:::o;57583:991::-;57667:25;;:::i;:::-;57695:30;57718:6;57695:22;:30::i;:::-;57667:58;-1:-1:-1;57766:20:0;57744:6;:18;;;:42;;;;;;;;;57736:86;;;;-1:-1:-1;;;57736:86:0;;;;;;;;;57835:18;57883:6;57866:24;;;;;;;;;;;;;;;;;;;;;;57856:35;;;;;;57835:56;;57902:18;57923:9;-1:-1:-1;;;;;57923:18:0;;57942:8;57952:6;57923:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57902:57;;;;57970:16;52395:23;;;;;;;;;;;;;;;;;;;;;52385:34;;;;;;58001:10;:21;57997:165;;;-1:-1:-1;58053:8:0;57997:165;;;58108:42;58125:6;58133;58141:8;58108:16;:42::i;:::-;58094:56;;57997:165;58178:19;;;;58174:393;;;58214:6;:18;;;;;;;;;;;;:32;;;58266:33;;;;;58279:6;;58235:11;;58266:33;;;;;;;;;;58174:393;;;58321:42;58336:13;58351:11;58321:14;:42::i;:::-;58317:250;;;58380:6;:18;;;;;;;;;;;;:34;;;58434:35;;;;;58447:6;;58401:13;;58434:35;;58317:250;58507:48;58520:6;58528:13;58543:11;58507:48;;;;;;;;;;;;;;;;;58317:250;57583:991;;;;;;:::o;55305:534::-;55378:4;55421:20;55399:6;:18;;;:42;;;;;;;;;55395:80;;;-1:-1:-1;55457:17:0;;;;;55450:6;:25;;;;;;;;;55443:32;;55395:80;55512:21;55490:6;:18;;;:43;;;;;;;;;55486:73;;;-1:-1:-1;55542:17:0;;;;55535:24;;55486:73;55596:21;55574:6;:18;;;:43;;;;;;;;;55570:262;;;55634:14;55651:6;:15;52395:23;;;;;;;;;;;;;;;;;;;;;52385:34;;;;;;55651:15;;;;;;;;;;;;55634:32;;55701:1;55689:9;:13;55681:70;;;;-1:-1:-1;;;55681:70:0;;;;;;;;;50390:4;55773:33;55777:9;55788:6;:17;;;55773:3;:33::i;:::-;:47;;;;;;55766:54;;;;;64605:198;64657:4;64678:6;64674:20;;-1:-1:-1;64693:1:0;64686:8;;64674:20;64714:5;;;64718:1;64714;:5;:1;64738:5;;;;;:10;64730:46;;;;-1:-1:-1;;;64730:46:0;;;;;;;;48478:123;48567:25;:15;:25;;48478:123::o;60014:1619::-;60138:4;60156:23;60181;60206:17;60227:24;60244:6;60227:16;:24::i;:::-;60155:96;;;;;;60356:12;60338:15;:30;60330:69;;;;-1:-1:-1;;;60330:69:0;;;;;;;;;60429:15;:30;;;60629:40;;:::i;:::-;60672:86;;;;;;;;60745:11;60723:18;60702;:39;60701:55;;;;;;-1:-1:-1;;;;;60672:86:0;;;;60629:129;;60769:28;60800:30;:12;:28;:30::i;:::-;60769:61;;60841:26;60870:46;60874:23;60899:16;60870:3;:46::i;:::-;60841:75;;60927:16;61161:6;:24;;;61157:350;;;61365:6;:15;;;61341:21;:39;;;;;;61327:53;;61157:350;;;50498:4;50390;61427:43;61431:21;61454:6;:15;;;61427:3;:43::i;:::-;:57;;;;;;:68;;;;;;61413:82;;61157:350;61524:70;61543:6;61551:11;61564:12;61578:15;61524:70;;;;;;;;;;;;;;;;;;61614:11;60014:1619;-1:-1:-1;;;;;;;;;;;60014:1619:0:o;58582:339::-;58667:4;58688:17;;58684:207;;58722:16;58768:13;58741:24;58745:11;58758:6;58741:3;:24::i;:::-;:40;;;;;;58722:59;;58818:21;58803:11;:36;;:76;;;;;58858:21;58843:11;:36;;58803:76;58796:83;;;;;58684:207;-1:-1:-1;58908:5:0;58582:339;;;;:::o;61821:1045::-;61892:4;61898;61904;61921:18;61942:6;:17;;;61921:38;;61970:20;61993:30;62016:6;61993:22;:30::i;:::-;61970:53;;62036:33;;:::i;:::-;-1:-1:-1;62072:27:0;;;;:15;:27;;;;;;;;;62036:63;;;;;;;;;;;;;;;;;;;;;;;;;62233:15;:42;62305:12;62290:27;;62286:466;;62374:24;;;62334:27;;;:15;:27;;;;;;;;:64;;;62447:18;;;;;62413:31;;;;:52;62482:15;:27;;;;;;;62522:15;62482:55;;;62552:31;;:49;;;62642:17;;;;62661:24;;62704:18;;62621:119;;62642:17;;62621:119;;;;62661:24;62586:15;;62621:119;;;;;;;;;;62286:466;-1:-1:-1;;62787:27:0;;;;:15;:27;;;;;;:31;;;;62820:37;;62787:27;;:31;;-1:-1:-1;62820:37:0;;-1:-1:-1;61821:1045:0;-1:-1:-1;;61821:1045:0:o;47813:383::-;48161:7;48172:16;-1:-1:-1;;;;;48156:13:0;;;:32;;47813:383::o;59022:371::-;59104:4;59122:21;59145;59171:68;59218:6;:20;;;59171:46;:68::i;:::-;59121:118;;;;;59254:6;:24;;;59250:136;;;59302:16;-1:-1:-1;59295:23:0;;-1:-1:-1;59295:23:0;59250:136;-1:-1:-1;59358:16:0;-1:-1:-1;59351:23:0;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;456:363::-;;;597:3;590:4;582:6;578:17;574:27;564:2;;-1:-1;;605:12;564:2;-1:-1;635:20;;675:18;664:30;;661:2;;;-1:-1;;697:12;661:2;741:4;733:6;729:17;717:29;;792:3;741:4;;776:6;772:17;733:6;758:32;;755:41;752:2;;;809:1;;799:12;752:2;557:262;;;;;;1495:440;;1596:3;1589:4;1581:6;1577:17;1573:27;1563:2;;-1:-1;;1604:12;1563:2;1651:6;1638:20;1673:64;1688:48;1729:6;1688:48;;;1673:64;;;1664:73;;1757:6;1750:5;1743:21;1861:3;1793:4;1852:6;1785;1843:16;;1840:25;1837:2;;;1878:1;;1868:12;1837:2;32553:6;1793:4;1785:6;1781:17;1793:4;1819:5;1815:16;32530:30;32609:1;32591:16;;;1793:4;32591:16;32584:27;1819:5;1556:379;-1:-1;;1556:379;2395:444;;2508:3;2501:4;2493:6;2489:17;2485:27;2475:2;;-1:-1;;2516:12;2475:2;2556:6;2550:13;2578:65;2593:49;2635:6;2593:49;;2578:65;2569:74;;2663:6;2656:5;2649:21;2767:3;2699:4;2758:6;2691;2749:16;;2746:25;2743:2;;;2784:1;;2774:12;2743:2;2794:39;2826:6;2699:4;2725:5;2721:16;2699:4;2691:6;2687:17;2794:39;;;;2468:371;;;;;3681:241;;3785:2;3773:9;3764:7;3760:23;3756:32;3753:2;;;-1:-1;;3791:12;3753:2;85:6;72:20;97:33;124:5;97:33;;3929:263;;4044:2;4032:9;4023:7;4019:23;4015:32;4012:2;;;-1:-1;;4050:12;4012:2;226:6;220:13;238:33;265:5;238:33;;4199:1027;;;;;;;4476:2;4464:9;4455:7;4451:23;4447:32;4444:2;;;-1:-1;;4482:12;4444:2;4540:17;4527:31;4578:18;;4570:6;4567:30;4564:2;;;-1:-1;;4600:12;4564:2;4638:91;4721:7;4712:6;4701:9;4697:22;4638:91;;;4628:101;;-1:-1;4628:101;-1:-1;4794:2;4779:18;;4766:32;;-1:-1;4807:30;;;4804:2;;;-1:-1;;4840:12;4804:2;4878:91;4961:7;4952:6;4941:9;4937:22;4878:91;;;4868:101;;-1:-1;4868:101;-1:-1;5034:2;5019:18;;5006:32;;-1:-1;5047:30;;;5044:2;;;-1:-1;;5080:12;5044:2;;5118:92;5202:7;5193:6;5182:9;5178:22;5118:92;;;4438:788;;;;-1:-1;4438:788;;-1:-1;4438:788;;5108:102;;4438:788;-1:-1;;;4438:788;5233:241;;5337:2;5325:9;5316:7;5312:23;5308:32;5305:2;;;-1:-1;;5343:12;5305:2;-1:-1;1283:20;;5299:175;-1:-1;5299:175;5481:531;;;;5628:2;5616:9;5607:7;5603:23;5599:32;5596:2;;;-1:-1;;5634:12;5596:2;1437:6;1431:13;5686:74;;5797:2;5851:9;5847:22;1431:13;5805:74;;5916:2;5968:9;5964:22;3620:13;31987:4;34164:5;31976:16;34141:5;34138:33;34128:2;;-1:-1;;34175:12;34128:2;5924:72;;;;5590:422;;;;;;6019:574;;;6158:2;6146:9;6137:7;6133:23;6129:32;6126:2;;;-1:-1;;6164:12;6126:2;6222:17;6209:31;6260:18;;6252:6;6249:30;6246:2;;;-1:-1;;6282:12;6246:2;6312:62;6366:7;6357:6;6346:9;6342:22;6312:62;;;6302:72;;6439:2;6428:9;6424:18;6411:32;6397:46;;6260:18;6455:6;6452:30;6449:2;;;-1:-1;;6485:12;6449:2;;6515:62;6569:7;6560:6;6549:9;6545:22;6515:62;;;6505:72;;;6120:473;;;;;;6600:347;;6714:2;6702:9;6693:7;6689:23;6685:32;6682:2;;;-1:-1;;6720:12;6682:2;6778:17;6765:31;6816:18;6808:6;6805:30;6802:2;;;-1:-1;;6838:12;6802:2;6868:63;6923:7;6914:6;6903:9;6899:22;6868:63;;;6858:73;6676:271;-1:-1;;;;6676:271;6954:362;;7079:2;7067:9;7058:7;7054:23;7050:32;7047:2;;;-1:-1;;7085:12;7047:2;7136:17;7130:24;7174:18;7166:6;7163:30;7160:2;;;-1:-1;;7196:12;7160:2;7226:74;7292:7;7283:6;7272:9;7268:22;7226:74;;7323:514;;;7473:2;7461:9;7452:7;7448:23;7444:32;7441:2;;;-1:-1;;7479:12;7441:2;7530:17;7524:24;7568:18;7560:6;7557:30;7554:2;;;-1:-1;;7590:12;7554:2;7620:74;7686:7;7677:6;7666:9;7662:22;7620:74;;;7610:84;;;7731:2;7793:9;7789:22;369:13;387:41;422:5;387:41;;;7739:82;;;;7435:402;;;;;;7844:533;;;;7992:2;7980:9;7971:7;7967:23;7963:32;7960:2;;;-1:-1;;7998:12;7960:2;2931:6;2925:13;2943:33;2970:5;2943:33;;;8161:2;8211:22;;2925:13;8050:74;;-1:-1;2943:33;2925:13;2943:33;;;8280:2;8329:22;;3343:13;8169:74;;-1:-1;31790:10;31779:22;;33895:34;;33885:2;;-1:-1;;33933:12;8632:263;;8747:2;8735:9;8726:7;8722:23;8718:32;8715:2;;;-1:-1;;8753:12;8715:2;-1:-1;3203:13;;8709:186;-1:-1;8709:186;8902:261;;9016:2;9004:9;8995:7;8991:23;8987:32;8984:2;;;-1:-1;;9022:12;8984:2;3488:6;3482:13;31885:18;34044:5;31874:30;34020:5;34017:34;34007:2;;-1:-1;;34055:12;9170:103;-1:-1;;;;;31573:54;9231:37;;9225:48;9400:94;31147:13;31140:21;9455:34;;9449:45;10024:297;;30495:6;30490:3;30483:19;32553:6;32548:3;30532:4;30527:3;30523:14;32530:30;-1:-1;30532:4;32600:6;30527:3;32591:16;;32584:27;30532:4;33067:7;;33071:2;10307:6;33051:14;33047:28;30527:3;10276:39;;10269:46;;10124:197;;;;;;10665:347;;10810:5;30339:12;30495:6;30490:3;30483:19;10904:52;10949:6;30532:4;30527:3;30523:14;30532:4;10930:5;10926:16;10904:52;;;33067:7;33051:14;-1:-1;;33047:28;10968:39;;;;30532:4;10968:39;;10757:255;-1:-1;;10757:255;17560:275;;11182:5;30339:12;11294:52;11339:6;11334:3;11327:4;11320:5;11316:16;11294:52;;;11358:16;;;;;17696:139;-1:-1;;17696:139;17842:520;11683:66;11663:87;;11647:2;11769:12;;9673:37;;;;18325:12;;;18059:303;18369:381;-1:-1;;;12071:29;;12056:1;12119:11;;18558:192;18757:381;-1:-1;;;14493:26;;14478:1;14538:11;;18946:192;19145:222;-1:-1;;;;;31573:54;;;;9231:37;;19272:2;19257:18;;19243:124;19374:421;-1:-1;;;;;31573:54;;9231:37;;19549:2;19667;19652:18;;19645:48;;;19374:421;;19707:78;;19534:18;;19771:6;19707:78;;19802:210;31147:13;;31140:21;9455:34;;19923:2;19908:18;;19894:118;20019:548;9673:37;;;31987:4;31976:16;;;;20387:2;20372:18;;17513:35;20470:2;20455:18;;9673:37;20553:2;20538:18;;9673:37;20226:3;20211:19;;20197:370;20574:541;;20785:2;20806:17;20799:47;20860:86;20785:2;20774:9;20770:18;20932:6;20924;20860:86;;;20994:9;20988:4;20984:20;20979:2;20968:9;20964:18;20957:48;21019:86;21100:4;21091:6;21083;21019:86;;;21011:94;20756:359;-1:-1;;;;;;;20756:359;21405:421;;21580:2;21601:17;21594:47;21655:78;21580:2;21569:9;21565:18;21719:6;21655:78;;;21647:86;;9703:5;21812:2;21801:9;21797:18;9673:37;21551:275;;;;;;21833:532;;22036:2;22057:17;22050:47;22111:78;22036:2;22025:9;22021:18;22175:6;22111:78;;;22268:2;22253:18;;9673:37;;;;-1:-1;22351:2;22336:18;9673:37;22103:86;22007:358;-1:-1;22007:358;22372:644;;22603:3;22625:17;22618:47;22679:78;22603:3;22592:9;22588:19;22743:6;22679:78;;;22836:2;22821:18;;9673:37;;;;-1:-1;22919:2;22904:18;;9673:37;;;;23002:2;22987:18;;;9673:37;22671:86;22574:442;-1:-1;22574:442;23023:416;23223:2;23237:47;;;12369:2;23208:18;;;30483:19;12405:25;30523:14;;;12385:46;12450:12;;;23194:245;23446:416;23646:2;23660:47;;;12701:2;23631:18;;;30483:19;-1:-1;;;30523:14;;;12717:45;12781:12;;;23617:245;23869:416;24069:2;24083:47;;;13032:2;24054:18;;;30483:19;13068:34;30523:14;;;13048:55;-1:-1;;;13123:12;;;13116:40;13175:12;;;24040:245;24292:416;24492:2;24506:47;;;13426:2;24477:18;;;30483:19;13462:33;30523:14;;;13442:54;13515:12;;;24463:245;24715:416;24915:2;24929:47;;;13766:2;24900:18;;;30483:19;13802:28;30523:14;;;13782:49;13850:12;;;24886:245;25138:416;25338:2;25352:47;;;25323:18;;;30483:19;14137:34;30523:14;;;14117:55;14191:12;;;25309:245;25561:416;25761:2;25775:47;;;14788:2;25746:18;;;30483:19;14824:34;30523:14;;;14804:55;-1:-1;;;14879:12;;;14872:36;14927:12;;;25732:245;25984:416;26184:2;26198:47;;;15178:2;26169:18;;;30483:19;15214:34;30523:14;;;15194:55;-1:-1;;;15269:12;;;15262:27;15308:12;;;26155:245;26407:416;26607:2;26621:47;;;15559:2;26592:18;;;30483:19;15595:25;30523:14;;;15575:46;15640:12;;;26578:245;26830:335;15960:23;;-1:-1;;;;;31573:54;;;9231:37;;16137:4;16126:16;;;16120:23;31573:54;;;16197:14;;;9231:37;16297:4;16286:16;;;16280:23;16357:14;;;9673:37;16455:4;16444:16;;;16438:23;16515:14;;;9673:37;16616:4;16605:16;;16599:23;27013:3;26998:19;;;33172:1;33162:12;;33152:2;;33178:9;33152:2;32420:39;16616:4;16693:3;16689:14;10590:63;;16789:4;16782:5;16778:16;16772:23;16789:4;16853:3;16849:14;9673:37;16952:4;16945:5;16941:16;16935:23;16964:63;16952:4;17016:3;17012:14;16998:12;16964:63;;;;17119:4;17112:5;17108:16;17102:23;17131:57;17119:4;17177:3;17173:14;17159:12;17131:57;;27172:222;9673:37;;;27299:2;27284:18;;27270:124;27401:333;9673:37;;;27720:2;27705:18;;9673:37;27556:2;27541:18;;27527:207;27741:556;9673:37;;;28117:2;28102:18;;9673:37;;;;28200:2;28185:18;;9673:37;28283:2;28268:18;;9673:37;27952:3;27937:19;;27923:374;28304:506;;;28439:11;28426:25;28490:48;;28514:8;28498:14;28494:29;28490:48;28470:18;28466:73;28456:2;;-1:-1;;28543:12;28456:2;28584:18;28574:8;28570:33;28637:4;28624:18;28614:28;;28662:18;28654:6;28651:30;28648:2;;;-1:-1;;28684:12;28648:2;28529:4;28712:13;;-1:-1;;28498:14;28744:38;;;28734:49;;28731:2;;;28796:1;;28786:12;28817:507;;;28953:11;28940:25;28490:48;;29028:8;29012:14;29008:29;29004:48;28984:18;28980:73;28970:2;;-1:-1;;29057:12;29331:256;29393:2;29387:9;29419:17;;;29494:18;29479:34;;29515:22;;;29476:62;29473:2;;;29551:1;;29541:12;29473:2;29393;29560:22;29371:216;;-1:-1;29371:216;29594:321;;29737:18;29729:6;29726:30;29723:2;;;-1:-1;;29759:12;29723:2;-1:-1;33067:7;29813:17;-1:-1;;29809:33;29900:4;29890:15;;29660:255;32626:268;32691:1;32698:101;32712:6;32709:1;32706:13;32698:101;;;32779:11;;;32773:18;32760:11;;;32753:39;32734:2;32727:10;32698:101;;;32814:6;32811:1;32808:13;32805:2;;;32691:1;32870:6;32865:3;32861:16;32854:27;32805:2;;32675:219;;;;33201:117;-1:-1;;;;;31573:54;;33260:35;;33250:2;;33309:1;;33299:12;33250:2;33244:74;;33589:117;-1:-1;;;;;33676:5;31457:42;33651:5;33648:35;33638:2;;33697:1;;33687:12
Swarm Source
ipfs://8c2a73bb54dfe5f38570c033928b1040c23a175021e768c6af478edcf88cf761
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.