From 4016808fa47dfbc93528c1600716c3a4d97a860d Mon Sep 17 00:00:00 2001 From: Lawrence Forman Date: Fri, 31 Jan 2020 15:56:08 -0500 Subject: [PATCH 1/2] Cherry pick `DevUtils` refactor code from #2456 --- contracts/dev-utils/CHANGELOG.json | 13 + .../dev-utils/contracts/src/Addresses.sol | 51 +++ .../dev-utils/contracts/src/AssetBalance.sol | 374 +++++++++++++++++ .../dev-utils/contracts/src/DevUtils.sol | 20 +- .../contracts/src/EthBalanceChecker.sol | 2 +- .../contracts/src/ExternalFunctions.sol | 322 +++++++++++++++ .../dev-utils/contracts/src/LibAssetData.sol | 384 +----------------- .../src/LibOrderTransferSimulation.sol | 227 +++++++++++ .../contracts/src/LibTransactionDecoder.sol | 4 +- .../contracts/src/OrderValidationUtils.sol | 89 ++-- contracts/dev-utils/package.json | 11 +- contracts/dev-utils/src/artifacts.ts | 2 + contracts/dev-utils/src/index.ts | 2 +- contracts/dev-utils/src/wrappers.ts | 1 + contracts/dev-utils/test/artifacts.ts | 8 + contracts/dev-utils/test/wrappers.ts | 4 + contracts/dev-utils/tsconfig.json | 5 + contracts/erc20/CHANGELOG.json | 4 +- .../erc20/contracts/src/LibERC20Token.sol | 47 ++- contracts/integrations/CHANGELOG.json | 4 + .../test/dev-utils/dev_utils_mainnet_test.ts | 3 +- .../test/dev-utils/get_order_hash.ts | 3 +- .../test/dev-utils/lib_asset_data.ts | 219 +++++----- .../test/dev-utils/lib_transaction_decoder.ts | 54 +-- .../test/framework/deployment_manager.ts | 3 +- .../templates/TypeScript/contract.handlebars | 1 + packages/contract-addresses/CHANGELOG.json | 8 + packages/contract-addresses/addresses.json | 17 +- packages/contract-addresses/src/index.ts | 1 - packages/contract-artifacts/CHANGELOG.json | 13 + .../artifacts/DevUtils.json | 367 ++++------------- .../artifacts/LibTransactionDecoder.json | 84 ---- packages/contract-artifacts/src/index.ts | 2 - packages/contract-artifacts/tsconfig.json | 1 - packages/contract-wrappers/CHANGELOG.json | 6 +- .../src/contract_wrappers.ts | 10 - packages/contract-wrappers/src/index.ts | 1 - packages/dev-utils/CHANGELOG.json | 9 + packages/migrations/CHANGELOG.json | 17 + packages/migrations/package.json | 1 - packages/migrations/src/migration.ts | 121 +++--- packages/migrations/src/testnet_migrations.ts | 16 +- 42 files changed, 1490 insertions(+), 1041 deletions(-) create mode 100644 contracts/dev-utils/contracts/src/Addresses.sol create mode 100644 contracts/dev-utils/contracts/src/AssetBalance.sol create mode 100644 contracts/dev-utils/contracts/src/ExternalFunctions.sol create mode 100644 contracts/dev-utils/contracts/src/LibOrderTransferSimulation.sol delete mode 100644 packages/contract-artifacts/artifacts/LibTransactionDecoder.json diff --git a/contracts/dev-utils/CHANGELOG.json b/contracts/dev-utils/CHANGELOG.json index f675accc69..fd067afa40 100644 --- a/contracts/dev-utils/CHANGELOG.json +++ b/contracts/dev-utils/CHANGELOG.json @@ -1,4 +1,17 @@ [ + { + "version": "1.1.0", + "changes": [ + { + "note": "Refactor mixins into public libraries.", + "pr": 2464 + }, + { + "note": "Remove `LibTransactionDecoder` export", + "pr": 2464 + } + ] + }, { "timestamp": 1580988106, "version": "1.0.6", diff --git a/contracts/dev-utils/contracts/src/Addresses.sol b/contracts/dev-utils/contracts/src/Addresses.sol new file mode 100644 index 0000000000..3cd41a329c --- /dev/null +++ b/contracts/dev-utils/contracts/src/Addresses.sol @@ -0,0 +1,51 @@ +/* + + Copyright 2019 ZeroEx Intl. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + +pragma solidity ^0.5.16; +pragma experimental ABIEncoderV2; + +import "@0x/contracts-asset-proxy/contracts/src/interfaces/IAssetData.sol"; +import "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol"; +import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; + + +// solhint-disable no-empty-blocks +contract Addresses is + DeploymentConstants +{ + address public exchangeAddress; + address public erc20ProxyAddress; + address public erc721ProxyAddress; + address public erc1155ProxyAddress; + address public staticCallProxyAddress; + address public chaiBridgeAddress; + + constructor ( + address exchange_, + address chaiBridge_ + ) + public + { + exchangeAddress = exchange_; + chaiBridgeAddress = chaiBridge_; + erc20ProxyAddress = IExchange(exchange_).getAssetProxy(IAssetData(address(0)).ERC20Token.selector); + erc721ProxyAddress = IExchange(exchange_).getAssetProxy(IAssetData(address(0)).ERC721Token.selector); + erc1155ProxyAddress = IExchange(exchange_).getAssetProxy(IAssetData(address(0)).ERC1155Assets.selector); + staticCallProxyAddress = IExchange(exchange_).getAssetProxy(IAssetData(address(0)).StaticCall.selector); + } +} diff --git a/contracts/dev-utils/contracts/src/AssetBalance.sol b/contracts/dev-utils/contracts/src/AssetBalance.sol new file mode 100644 index 0000000000..cc72becb46 --- /dev/null +++ b/contracts/dev-utils/contracts/src/AssetBalance.sol @@ -0,0 +1,374 @@ +/* + + Copyright 2019 ZeroEx Intl. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + +pragma solidity ^0.5.16; +pragma experimental ABIEncoderV2; + +import "@0x/contracts-utils/contracts/src/LibBytes.sol"; +import "@0x/contracts-asset-proxy/contracts/src/interfaces/IAssetData.sol"; +import "@0x/contracts-asset-proxy/contracts/src/interfaces/IAssetProxy.sol"; +import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol"; +import "@0x/contracts-erc721/contracts/src/interfaces/IERC721Token.sol"; +import "@0x/contracts-erc1155/contracts/src/interfaces/IERC1155.sol"; +import "@0x/contracts-asset-proxy/contracts/src/interfaces/IChai.sol"; +import "@0x/contracts-exchange-libs/contracts/src/LibMath.sol"; +import "./Addresses.sol"; +import "./LibAssetData.sol"; + + +contract AssetBalance is + Addresses +{ + // 2^256 - 1 + uint256 constant internal _MAX_UINT256 = uint256(-1); + + using LibBytes for bytes; + + /// @dev Returns the owner's balance of the assets(s) specified in + /// assetData. When the asset data contains multiple assets (eg in + /// ERC1155 or Multi-Asset), the return value indicates how many + /// complete "baskets" of those assets are owned by owner. + /// @param ownerAddress Owner of the assets specified by assetData. + /// @param assetData Details of asset, encoded per the AssetProxy contract specification. + /// @return Number of assets (or asset baskets) held by owner. + function getBalance(address ownerAddress, bytes memory assetData) + public + returns (uint256 balance) + { + // Get id of AssetProxy contract + bytes4 assetProxyId = assetData.readBytes4(0); + + if (assetProxyId == IAssetData(address(0)).ERC20Token.selector) { + // Get ERC20 token address + address tokenAddress = assetData.readAddress(16); + balance = LibERC20Token.balanceOf(tokenAddress, ownerAddress); + + } else if (assetProxyId == IAssetData(address(0)).ERC721Token.selector) { + // Get ERC721 token address and id + (, address tokenAddress, uint256 tokenId) = LibAssetData.decodeERC721AssetData(assetData); + + // Check if id is owned by ownerAddress + bytes memory ownerOfCalldata = abi.encodeWithSelector( + IERC721Token(address(0)).ownerOf.selector, + tokenId + ); + + (bool success, bytes memory returnData) = tokenAddress.staticcall(ownerOfCalldata); + address currentOwnerAddress = (success && returnData.length == 32) ? returnData.readAddress(12) : address(0); + balance = currentOwnerAddress == ownerAddress ? 1 : 0; + + } else if (assetProxyId == IAssetData(address(0)).ERC1155Assets.selector) { + // Get ERC1155 token address, array of ids, and array of values + (, address tokenAddress, uint256[] memory tokenIds, uint256[] memory tokenValues,) = LibAssetData.decodeERC1155AssetData(assetData); + + uint256 length = tokenIds.length; + for (uint256 i = 0; i != length; i++) { + // Skip over the token if the corresponding value is 0. + if (tokenValues[i] == 0) { + continue; + } + + // Encode data for `balanceOf(ownerAddress, tokenIds[i]) + bytes memory balanceOfData = abi.encodeWithSelector( + IERC1155(address(0)).balanceOf.selector, + ownerAddress, + tokenIds[i] + ); + + // Query balance + (bool success, bytes memory returnData) = tokenAddress.staticcall(balanceOfData); + uint256 totalBalance = success && returnData.length == 32 ? returnData.readUint256(0) : 0; + + // Scale total balance down by corresponding value in assetData + uint256 scaledBalance = totalBalance / tokenValues[i]; + if (scaledBalance == 0) { + return 0; + } + if (scaledBalance < balance || balance == 0) { + balance = scaledBalance; + } + } + + } else if (assetProxyId == IAssetData(address(0)).StaticCall.selector) { + // Encode data for `staticCallProxy.transferFrom(assetData,...)` + bytes memory transferFromData = abi.encodeWithSelector( + IAssetProxy(address(0)).transferFrom.selector, + assetData, + address(0), // `from` address is not used + address(0), // `to` address is not used + 0 // `amount` is not used + ); + + // Check if staticcall would be successful + (bool success,) = staticCallProxyAddress.staticcall(transferFromData); + + // Success means that the staticcall can be made an unlimited amount of times + balance = success ? _MAX_UINT256 : 0; + + } else if (assetProxyId == IAssetData(address(0)).ERC20Bridge.selector) { + // Get address of ERC20 token and bridge contract + (, address tokenAddress, address bridgeAddress, ) = LibAssetData.decodeERC20BridgeAssetData(assetData); + if (tokenAddress == _getDaiAddress() && bridgeAddress == chaiBridgeAddress) { + uint256 chaiBalance = LibERC20Token.balanceOf(_getChaiAddress(), ownerAddress); + // Calculate Dai balance + balance = _convertChaiToDaiAmount(chaiBalance); + } + // Balance will be 0 if bridge is not supported + + } else if (assetProxyId == IAssetData(address(0)).MultiAsset.selector) { + // Get array of values and array of assetDatas + (, uint256[] memory assetAmounts, bytes[] memory nestedAssetData) = LibAssetData.decodeMultiAssetData(assetData); + + uint256 length = nestedAssetData.length; + for (uint256 i = 0; i != length; i++) { + // Skip over the asset if the corresponding amount is 0. + if (assetAmounts[i] == 0) { + continue; + } + + // Query balance of individual assetData + uint256 totalBalance = getBalance(ownerAddress, nestedAssetData[i]); + + // Scale total balance down by corresponding value in assetData + uint256 scaledBalance = totalBalance / assetAmounts[i]; + if (scaledBalance == 0) { + return 0; + } + if (scaledBalance < balance || balance == 0) { + balance = scaledBalance; + } + } + } + + // Balance will be 0 if assetProxyId is unknown + return balance; + } + + /// @dev Calls getBalance() for each element of assetData. + /// @param ownerAddress Owner of the assets specified by assetData. + /// @param assetData Array of asset details, each encoded per the AssetProxy contract specification. + /// @return Array of asset balances from getBalance(), with each element + /// corresponding to the same-indexed element in the assetData input. + function getBatchBalances(address ownerAddress, bytes[] memory assetData) + public + returns (uint256[] memory balances) + { + uint256 length = assetData.length; + balances = new uint256[](length); + for (uint256 i = 0; i != length; i++) { + balances[i] = getBalance(ownerAddress, assetData[i]); + } + return balances; + } + + /// @dev Returns the number of asset(s) (described by assetData) that + /// the corresponding AssetProxy contract is authorized to spend. When the asset data contains + /// multiple assets (eg for Multi-Asset), the return value indicates + /// how many complete "baskets" of those assets may be spent by all of the corresponding + /// AssetProxy contracts. + /// @param ownerAddress Owner of the assets specified by assetData. + /// @param assetData Details of asset, encoded per the AssetProxy contract specification. + /// @return Number of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend. + function getAssetProxyAllowance(address ownerAddress, bytes memory assetData) + public + returns (uint256 allowance) + { + // Get id of AssetProxy contract + bytes4 assetProxyId = assetData.readBytes4(0); + + if (assetProxyId == IAssetData(address(0)).MultiAsset.selector) { + // Get array of values and array of assetDatas + (, uint256[] memory amounts, bytes[] memory nestedAssetData) = LibAssetData.decodeMultiAssetData(assetData); + + uint256 length = nestedAssetData.length; + for (uint256 i = 0; i != length; i++) { + // Skip over the asset if the corresponding amount is 0. + if (amounts[i] == 0) { + continue; + } + + // Query allowance of individual assetData + uint256 totalAllowance = getAssetProxyAllowance(ownerAddress, nestedAssetData[i]); + + // Scale total allowance down by corresponding value in assetData + uint256 scaledAllowance = totalAllowance / amounts[i]; + if (scaledAllowance == 0) { + return 0; + } + if (scaledAllowance < allowance || allowance == 0) { + allowance = scaledAllowance; + } + } + return allowance; + } + + if (assetProxyId == IAssetData(address(0)).ERC20Token.selector) { + // Get ERC20 token address + address tokenAddress = assetData.readAddress(16); + allowance = LibERC20Token.allowance(tokenAddress, ownerAddress, erc20ProxyAddress); + + } else if (assetProxyId == IAssetData(address(0)).ERC721Token.selector) { + // Get ERC721 token address and id + (, address tokenAddress, uint256 tokenId) = LibAssetData.decodeERC721AssetData(assetData); + + // Encode data for `isApprovedForAll(ownerAddress, erc721ProxyAddress)` + bytes memory isApprovedForAllData = abi.encodeWithSelector( + IERC721Token(address(0)).isApprovedForAll.selector, + ownerAddress, + erc721ProxyAddress + ); + + (bool success, bytes memory returnData) = tokenAddress.staticcall(isApprovedForAllData); + + // If not approved for all, call `getApproved(tokenId)` + if (!success || returnData.length != 32 || returnData.readUint256(0) != 1) { + // Encode data for `getApproved(tokenId)` + bytes memory getApprovedData = abi.encodeWithSelector(IERC721Token(address(0)).getApproved.selector, tokenId); + (success, returnData) = tokenAddress.staticcall(getApprovedData); + + // Allowance is 1 if successful and the approved address is the ERC721Proxy + allowance = success && returnData.length == 32 && returnData.readAddress(12) == erc721ProxyAddress ? 1 : 0; + } else { + // Allowance is 2^256 - 1 if `isApprovedForAll` returned true + allowance = _MAX_UINT256; + } + + } else if (assetProxyId == IAssetData(address(0)).ERC1155Assets.selector) { + // Get ERC1155 token address + (, address tokenAddress, , , ) = LibAssetData.decodeERC1155AssetData(assetData); + + // Encode data for `isApprovedForAll(ownerAddress, erc1155ProxyAddress)` + bytes memory isApprovedForAllData = abi.encodeWithSelector( + IERC1155(address(0)).isApprovedForAll.selector, + ownerAddress, + erc1155ProxyAddress + ); + + // Query allowance + (bool success, bytes memory returnData) = tokenAddress.staticcall(isApprovedForAllData); + allowance = success && returnData.length == 32 && returnData.readUint256(0) == 1 ? _MAX_UINT256 : 0; + + } else if (assetProxyId == IAssetData(address(0)).StaticCall.selector) { + // The StaticCallProxy does not require any approvals + allowance = _MAX_UINT256; + + } else if (assetProxyId == IAssetData(address(0)).ERC20Bridge.selector) { + // Get address of ERC20 token and bridge contract + (, address tokenAddress, address bridgeAddress,) = LibAssetData.decodeERC20BridgeAssetData(assetData); + if (tokenAddress == _getDaiAddress() && bridgeAddress == chaiBridgeAddress) { + uint256 chaiAllowance = LibERC20Token.allowance(_getChaiAddress(), ownerAddress, chaiBridgeAddress); + // Dai allowance is unlimited if Chai allowance is unlimited + allowance = chaiAllowance == _MAX_UINT256 ? _MAX_UINT256 : _convertChaiToDaiAmount(chaiAllowance); + } + // Allowance will be 0 if bridge is not supported + } + + // Allowance will be 0 if the assetProxyId is unknown + return allowance; + } + + /// @dev Calls getAssetProxyAllowance() for each element of assetData. + /// @param ownerAddress Owner of the assets specified by assetData. + /// @param assetData Array of asset details, each encoded per the AssetProxy contract specification. + /// @return An array of asset allowances from getAllowance(), with each + /// element corresponding to the same-indexed element in the assetData input. + function getBatchAssetProxyAllowances(address ownerAddress, bytes[] memory assetData) + public + returns (uint256[] memory allowances) + { + uint256 length = assetData.length; + allowances = new uint256[](length); + for (uint256 i = 0; i != length; i++) { + allowances[i] = getAssetProxyAllowance(ownerAddress, assetData[i]); + } + return allowances; + } + + /// @dev Calls getBalance() and getAllowance() for assetData. + /// @param ownerAddress Owner of the assets specified by assetData. + /// @param assetData Details of asset, encoded per the AssetProxy contract specification. + /// @return Number of assets (or asset baskets) held by owner, and number + /// of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend. + function getBalanceAndAssetProxyAllowance( + address ownerAddress, + bytes memory assetData + ) + public + returns (uint256 balance, uint256 allowance) + { + balance = getBalance(ownerAddress, assetData); + allowance = getAssetProxyAllowance(ownerAddress, assetData); + return (balance, allowance); + } + + /// @dev Calls getBatchBalances() and getBatchAllowances() for each element of assetData. + /// @param ownerAddress Owner of the assets specified by assetData. + /// @param assetData Array of asset details, each encoded per the AssetProxy contract specification. + /// @return An array of asset balances from getBalance(), and an array of + /// asset allowances from getAllowance(), with each element + /// corresponding to the same-indexed element in the assetData input. + function getBatchBalancesAndAssetProxyAllowances( + address ownerAddress, + bytes[] memory assetData + ) + public + returns (uint256[] memory balances, uint256[] memory allowances) + { + balances = getBatchBalances(ownerAddress, assetData); + allowances = getBatchAssetProxyAllowances(ownerAddress, assetData); + return (balances, allowances); + } + + /// @dev Converts an amount of Chai into its equivalent Dai amount. + /// Also accumulates Dai from DSR if called after the last time it was collected. + /// @param chaiAmount Amount of Chai to converts. + function _convertChaiToDaiAmount(uint256 chaiAmount) + internal + returns (uint256 daiAmount) + { + PotLike pot = IChai(_getChaiAddress()).pot(); + // Accumulate savings if called after last time savings were collected + // solhint-disable-next-line not-rely-on-time + uint256 chiMultiplier = (now > pot.rho()) + ? pot.drip() + : pot.chi(); + daiAmount = LibMath.getPartialAmountFloor(chiMultiplier, 10**27, chaiAmount); + return daiAmount; + } + + /// @dev Returns an order MAKER's balance of the assets(s) specified in + /// makerAssetData. Unlike `getBalanceAndAssetProxyAllowance()`, this + /// can handle maker asset types that depend on taker tokens being + /// transferred to the maker first. + /// @param order The order. + /// @return balance Quantity of assets transferrable from maker to taker. + function _getConvertibleMakerBalanceAndAssetProxyAllowance( + LibOrder.Order memory order + ) + internal + returns (uint256 balance, uint256 allowance) + { + if (order.makerAssetData.length < 4) { + return (0, 0); + } + return ( + getBalance(order.makerAddress, order.makerAssetData), + getAssetProxyAllowance(order.makerAddress, order.makerAssetData) + ); + } +} diff --git a/contracts/dev-utils/contracts/src/DevUtils.sol b/contracts/dev-utils/contracts/src/DevUtils.sol index f0913ab848..45ce184646 100644 --- a/contracts/dev-utils/contracts/src/DevUtils.sol +++ b/contracts/dev-utils/contracts/src/DevUtils.sol @@ -16,7 +16,7 @@ */ -pragma solidity ^0.5.5; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import "@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol"; @@ -24,27 +24,29 @@ import "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol"; import "@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol"; import "@0x/contracts-utils/contracts/src/LibEIP712.sol"; import "@0x/contracts-utils/contracts/src/LibBytes.sol"; +import "./Addresses.sol"; import "./OrderValidationUtils.sol"; -import "./OrderTransferSimulationUtils.sol"; import "./EthBalanceChecker.sol"; +import "./ExternalFunctions.sol"; // solhint-disable no-empty-blocks contract DevUtils is + Addresses, OrderValidationUtils, LibEIP712ExchangeDomain, - EthBalanceChecker + EthBalanceChecker, + ExternalFunctions { constructor ( - address _exchange, - address _chaiBridge + address exchange_, + address chaiBridge_ ) public - OrderValidationUtils( - _exchange, - _chaiBridge + Addresses( + exchange_, + chaiBridge_ ) - OrderTransferSimulationUtils(_exchange) LibEIP712ExchangeDomain(uint256(0), address(0)) // null args because because we only use constants {} diff --git a/contracts/dev-utils/contracts/src/EthBalanceChecker.sol b/contracts/dev-utils/contracts/src/EthBalanceChecker.sol index 88ec3c0255..48e0215692 100644 --- a/contracts/dev-utils/contracts/src/EthBalanceChecker.sol +++ b/contracts/dev-utils/contracts/src/EthBalanceChecker.sol @@ -16,7 +16,7 @@ */ -pragma solidity ^0.5.5; +pragma solidity ^0.5.16; contract EthBalanceChecker { diff --git a/contracts/dev-utils/contracts/src/ExternalFunctions.sol b/contracts/dev-utils/contracts/src/ExternalFunctions.sol new file mode 100644 index 0000000000..e9e1443404 --- /dev/null +++ b/contracts/dev-utils/contracts/src/ExternalFunctions.sol @@ -0,0 +1,322 @@ +/* + + Copyright 2019 ZeroEx Intl. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + +pragma solidity ^0.5.16; +pragma experimental ABIEncoderV2; + +import "./Addresses.sol"; +import "./LibAssetData.sol"; +import "./LibTransactionDecoder.sol"; +import "./LibOrderTransferSimulation.sol"; + + +contract ExternalFunctions is + Addresses +{ + + /// @dev Decodes the call data for an Exchange contract method call. + /// @param transactionData ABI-encoded calldata for an Exchange + /// contract method call. + /// @return The name of the function called, and the parameters it was + /// given. For single-order fills and cancels, the arrays will have + /// just one element. + function decodeZeroExTransactionData(bytes memory transactionData) + public + pure + returns( + string memory functionName, + LibOrder.Order[] memory orders, + uint256[] memory takerAssetFillAmounts, + bytes[] memory signatures + ) + { + return LibTransactionDecoder.decodeZeroExTransactionData(transactionData); + } + + /// @dev Decode AssetProxy identifier + /// @param assetData AssetProxy-compliant asset data describing an ERC-20, ERC-721, ERC1155, or MultiAsset asset. + /// @return The AssetProxy identifier + function decodeAssetProxyId(bytes memory assetData) + public + pure + returns ( + bytes4 assetProxyId + ) + { + return LibAssetData.decodeAssetProxyId(assetData); + } + + /// @dev Encode ERC-20 asset data into the format described in the AssetProxy contract specification. + /// @param tokenAddress The address of the ERC-20 contract hosting the asset to be traded. + /// @return AssetProxy-compliant data describing the asset. + function encodeERC20AssetData(address tokenAddress) + public + pure + returns (bytes memory assetData) + { + return LibAssetData.encodeERC20AssetData(tokenAddress); + } + + /// @dev Decode ERC-20 asset data from the format described in the AssetProxy contract specification. + /// @param assetData AssetProxy-compliant asset data describing an ERC-20 asset. + /// @return The AssetProxy identifier, and the address of the ERC-20 + /// contract hosting this asset. + function decodeERC20AssetData(bytes memory assetData) + public + pure + returns ( + bytes4 assetProxyId, + address tokenAddress + ) + { + return LibAssetData.decodeERC20AssetData(assetData); + } + + /// @dev Encode ERC-721 asset data into the format described in the AssetProxy specification. + /// @param tokenAddress The address of the ERC-721 contract hosting the asset to be traded. + /// @param tokenId The identifier of the specific asset to be traded. + /// @return AssetProxy-compliant asset data describing the asset. + function encodeERC721AssetData(address tokenAddress, uint256 tokenId) + public + pure + returns (bytes memory assetData) + { + return LibAssetData.encodeERC721AssetData(tokenAddress, tokenId); + } + + /// @dev Decode ERC-721 asset data from the format described in the AssetProxy contract specification. + /// @param assetData AssetProxy-compliant asset data describing an ERC-721 asset. + /// @return The ERC-721 AssetProxy identifier, the address of the ERC-721 + /// contract hosting this asset, and the identifier of the specific + /// asset to be traded. + function decodeERC721AssetData(bytes memory assetData) + public + pure + returns ( + bytes4 assetProxyId, + address tokenAddress, + uint256 tokenId + ) + { + return LibAssetData.decodeERC721AssetData(assetData); + } + + /// @dev Encode ERC-1155 asset data into the format described in the AssetProxy contract specification. + /// @param tokenAddress The address of the ERC-1155 contract hosting the asset(s) to be traded. + /// @param tokenIds The identifiers of the specific assets to be traded. + /// @param tokenValues The amounts of each asset to be traded. + /// @param callbackData Data to be passed to receiving contracts when a transfer is performed. + /// @return AssetProxy-compliant asset data describing the set of assets. + function encodeERC1155AssetData( + address tokenAddress, + uint256[] memory tokenIds, + uint256[] memory tokenValues, + bytes memory callbackData + ) + public + pure + returns (bytes memory assetData) + { + return LibAssetData.encodeERC1155AssetData( + tokenAddress, + tokenIds, + tokenValues, + callbackData + ); + } + + /// @dev Decode ERC-1155 asset data from the format described in the AssetProxy contract specification. + /// @param assetData AssetProxy-compliant asset data describing an ERC-1155 set of assets. + /// @return The ERC-1155 AssetProxy identifier, the address of the ERC-1155 + /// contract hosting the assets, an array of the identifiers of the + /// assets to be traded, an array of asset amounts to be traded, and + /// callback data. Each element of the arrays corresponds to the + /// same-indexed element of the other array. Return values specified as + /// `memory` are returned as pointers to locations within the memory of + /// the input parameter `assetData`. + function decodeERC1155AssetData(bytes memory assetData) + public + pure + returns ( + bytes4 assetProxyId, + address tokenAddress, + uint256[] memory tokenIds, + uint256[] memory tokenValues, + bytes memory callbackData + ) + { + return LibAssetData.decodeERC1155AssetData(assetData); + } + + /// @dev Encode data for multiple assets, per the AssetProxy contract specification. + /// @param amounts The amounts of each asset to be traded. + /// @param nestedAssetData AssetProxy-compliant data describing each asset to be traded. + /// @return AssetProxy-compliant data describing the set of assets. + function encodeMultiAssetData(uint256[] memory amounts, bytes[] memory nestedAssetData) + public + pure + returns (bytes memory assetData) + { + return LibAssetData.encodeMultiAssetData(amounts, nestedAssetData); + } + + /// @dev Decode multi-asset data from the format described in the AssetProxy contract specification. + /// @param assetData AssetProxy-compliant data describing a multi-asset basket. + /// @return The Multi-Asset AssetProxy identifier, an array of the amounts + /// of the assets to be traded, and an array of the + /// AssetProxy-compliant data describing each asset to be traded. Each + /// element of the arrays corresponds to the same-indexed element of the other array. + function decodeMultiAssetData(bytes memory assetData) + public + pure + returns ( + bytes4 assetProxyId, + uint256[] memory amounts, + bytes[] memory nestedAssetData + ) + { + return LibAssetData.decodeMultiAssetData(assetData); + } + + /// @dev Encode StaticCall asset data into the format described in the AssetProxy contract specification. + /// @param staticCallTargetAddress Target address of StaticCall. + /// @param staticCallData Data that will be passed to staticCallTargetAddress in the StaticCall. + /// @param expectedReturnDataHash Expected Keccak-256 hash of the StaticCall return data. + /// @return AssetProxy-compliant asset data describing the set of assets. + function encodeStaticCallAssetData( + address staticCallTargetAddress, + bytes memory staticCallData, + bytes32 expectedReturnDataHash + ) + public + pure + returns (bytes memory assetData) + { + return LibAssetData.encodeStaticCallAssetData( + staticCallTargetAddress, + staticCallData, + expectedReturnDataHash + ); + } + + /// @dev Decode StaticCall asset data from the format described in the AssetProxy contract specification. + /// @param assetData AssetProxy-compliant asset data describing a StaticCall asset + /// @return The StaticCall AssetProxy identifier, the target address of the StaticCAll, the data to be + /// passed to the target address, and the expected Keccak-256 hash of the static call return data. + function decodeStaticCallAssetData(bytes memory assetData) + public + pure + returns ( + bytes4 assetProxyId, + address staticCallTargetAddress, + bytes memory staticCallData, + bytes32 expectedReturnDataHash + ) + { + return LibAssetData.decodeStaticCallAssetData(assetData); + } + + /// @dev Decode ERC20Bridge asset data from the format described in the AssetProxy contract specification. + /// @param assetData AssetProxy-compliant asset data describing an ERC20Bridge asset + /// @return The ERC20BridgeProxy identifier, the address of the ERC20 token to transfer, the address + /// of the bridge contract, and extra data to be passed to the bridge contract. + function decodeERC20BridgeAssetData(bytes memory assetData) + public + pure + returns ( + bytes4 assetProxyId, + address tokenAddress, + address bridgeAddress, + bytes memory bridgeData + ) + { + return LibAssetData.decodeERC20BridgeAssetData(assetData); + } + + /// @dev Reverts if assetData is not of a valid format for its given proxy id. + /// @param assetData AssetProxy compliant asset data. + function revertIfInvalidAssetData(bytes memory assetData) + public + pure + { + return LibAssetData.revertIfInvalidAssetData(assetData); + } + + /// @dev Simulates the maker transfers within an order and returns the index of the first failed transfer. + /// @param order The order to simulate transfers for. + /// @param takerAddress The address of the taker that will fill the order. + /// @param takerAssetFillAmount The amount of takerAsset that the taker wished to fill. + /// @return The index of the first failed transfer (or 4 if all transfers are successful). + function getSimulatedOrderMakerTransferResults( + LibOrder.Order memory order, + address takerAddress, + uint256 takerAssetFillAmount + ) + public + returns (LibOrderTransferSimulation.OrderTransferResults orderTransferResults) + { + return LibOrderTransferSimulation.getSimulatedOrderMakerTransferResults( + exchangeAddress, + order, + takerAddress, + takerAssetFillAmount + ); + } + + /// @dev Simulates all of the transfers within an order and returns the index of the first failed transfer. + /// @param order The order to simulate transfers for. + /// @param takerAddress The address of the taker that will fill the order. + /// @param takerAssetFillAmount The amount of takerAsset that the taker wished to fill. + /// @return The index of the first failed transfer (or 4 if all transfers are successful). + function getSimulatedOrderTransferResults( + LibOrder.Order memory order, + address takerAddress, + uint256 takerAssetFillAmount + ) + public + returns (LibOrderTransferSimulation.OrderTransferResults orderTransferResults) + { + return LibOrderTransferSimulation.getSimulatedOrderTransferResults( + exchangeAddress, + order, + takerAddress, + takerAssetFillAmount + ); + } + + /// @dev Simulates all of the transfers for each given order and returns the indices of each first failed transfer. + /// @param orders Array of orders to individually simulate transfers for. + /// @param takerAddresses Array of addresses of takers that will fill each order. + /// @param takerAssetFillAmounts Array of amounts of takerAsset that will be filled for each order. + /// @return The indices of the first failed transfer (or 4 if all transfers are successful) for each order. + function getSimulatedOrdersTransferResults( + LibOrder.Order[] memory orders, + address[] memory takerAddresses, + uint256[] memory takerAssetFillAmounts + ) + public + returns (LibOrderTransferSimulation.OrderTransferResults[] memory orderTransferResults) + { + return LibOrderTransferSimulation.getSimulatedOrdersTransferResults( + exchangeAddress, + orders, + takerAddresses, + takerAssetFillAmounts + ); + } +} diff --git a/contracts/dev-utils/contracts/src/LibAssetData.sol b/contracts/dev-utils/contracts/src/LibAssetData.sol index 95aa3bee26..2408c9dae4 100644 --- a/contracts/dev-utils/contracts/src/LibAssetData.sol +++ b/contracts/dev-utils/contracts/src/LibAssetData.sol @@ -16,357 +16,17 @@ */ -pragma solidity ^0.5.5; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import "@0x/contracts-utils/contracts/src/LibBytes.sol"; -import "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol"; import "@0x/contracts-asset-proxy/contracts/src/interfaces/IAssetData.sol"; -import "@0x/contracts-asset-proxy/contracts/src/interfaces/IAssetProxy.sol"; -import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol"; -import "@0x/contracts-erc721/contracts/src/interfaces/IERC721Token.sol"; -import "@0x/contracts-erc1155/contracts/src/interfaces/IERC1155.sol"; -import "@0x/contracts-asset-proxy/contracts/src/interfaces/IChai.sol"; -import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; -import "@0x/contracts-exchange-libs/contracts/src/LibMath.sol"; -contract LibAssetData is - DeploymentConstants -{ - // 2^256 - 1 - uint256 constant internal _MAX_UINT256 = uint256(-1); +library LibAssetData { using LibBytes for bytes; - // solhint-disable var-name-mixedcase - IExchange internal _EXCHANGE; - address internal _ERC20_PROXY_ADDRESS; - address internal _ERC721_PROXY_ADDRESS; - address internal _ERC1155_PROXY_ADDRESS; - address internal _STATIC_CALL_PROXY_ADDRESS; - address internal _CHAI_BRIDGE_ADDRESS; - // solhint-enable var-name-mixedcase - - constructor ( - address _exchange, - address _chaiBridge - ) - public - { - _EXCHANGE = IExchange(_exchange); - _ERC20_PROXY_ADDRESS = _EXCHANGE.getAssetProxy(IAssetData(address(0)).ERC20Token.selector); - _ERC721_PROXY_ADDRESS = _EXCHANGE.getAssetProxy(IAssetData(address(0)).ERC721Token.selector); - _ERC1155_PROXY_ADDRESS = _EXCHANGE.getAssetProxy(IAssetData(address(0)).ERC1155Assets.selector); - _STATIC_CALL_PROXY_ADDRESS = _EXCHANGE.getAssetProxy(IAssetData(address(0)).StaticCall.selector); - _CHAI_BRIDGE_ADDRESS = _chaiBridge; - } - - /// @dev Returns the owner's balance of the assets(s) specified in - /// assetData. When the asset data contains multiple assets (eg in - /// ERC1155 or Multi-Asset), the return value indicates how many - /// complete "baskets" of those assets are owned by owner. - /// @param ownerAddress Owner of the assets specified by assetData. - /// @param assetData Details of asset, encoded per the AssetProxy contract specification. - /// @return Number of assets (or asset baskets) held by owner. - function getBalance(address ownerAddress, bytes memory assetData) - public - returns (uint256 balance) - { - // Get id of AssetProxy contract - bytes4 assetProxyId = assetData.readBytes4(0); - - if (assetProxyId == IAssetData(address(0)).ERC20Token.selector) { - // Get ERC20 token address - address tokenAddress = assetData.readAddress(16); - balance = _erc20BalanceOf(tokenAddress, ownerAddress); - - } else if (assetProxyId == IAssetData(address(0)).ERC721Token.selector) { - // Get ERC721 token address and id - (, address tokenAddress, uint256 tokenId) = decodeERC721AssetData(assetData); - - // Check if id is owned by ownerAddress - bytes memory ownerOfCalldata = abi.encodeWithSelector( - IERC721Token(address(0)).ownerOf.selector, - tokenId - ); - - (bool success, bytes memory returnData) = tokenAddress.staticcall(ownerOfCalldata); - address currentOwnerAddress = (success && returnData.length == 32) ? returnData.readAddress(12) : address(0); - balance = currentOwnerAddress == ownerAddress ? 1 : 0; - - } else if (assetProxyId == IAssetData(address(0)).ERC1155Assets.selector) { - // Get ERC1155 token address, array of ids, and array of values - (, address tokenAddress, uint256[] memory tokenIds, uint256[] memory tokenValues,) = decodeERC1155AssetData(assetData); - - uint256 length = tokenIds.length; - for (uint256 i = 0; i != length; i++) { - // Skip over the token if the corresponding value is 0. - if (tokenValues[i] == 0) { - continue; - } - - // Encode data for `balanceOf(ownerAddress, tokenIds[i]) - bytes memory balanceOfData = abi.encodeWithSelector( - IERC1155(address(0)).balanceOf.selector, - ownerAddress, - tokenIds[i] - ); - - // Query balance - (bool success, bytes memory returnData) = tokenAddress.staticcall(balanceOfData); - uint256 totalBalance = success && returnData.length == 32 ? returnData.readUint256(0) : 0; - - // Scale total balance down by corresponding value in assetData - uint256 scaledBalance = totalBalance / tokenValues[i]; - if (scaledBalance == 0) { - return 0; - } - if (scaledBalance < balance || balance == 0) { - balance = scaledBalance; - } - } - - } else if (assetProxyId == IAssetData(address(0)).StaticCall.selector) { - // Encode data for `staticCallProxy.transferFrom(assetData,...)` - bytes memory transferFromData = abi.encodeWithSelector( - IAssetProxy(address(0)).transferFrom.selector, - assetData, - address(0), // `from` address is not used - address(0), // `to` address is not used - 0 // `amount` is not used - ); - - // Check if staticcall would be successful - (bool success,) = _STATIC_CALL_PROXY_ADDRESS.staticcall(transferFromData); - - // Success means that the staticcall can be made an unlimited amount of times - balance = success ? _MAX_UINT256 : 0; - - } else if (assetProxyId == IAssetData(address(0)).ERC20Bridge.selector) { - // Get address of ERC20 token and bridge contract - (, address tokenAddress, address bridgeAddress,) = decodeERC20BridgeAssetData(assetData); - if (tokenAddress == _getDaiAddress() && bridgeAddress == _CHAI_BRIDGE_ADDRESS) { - uint256 chaiBalance = _erc20BalanceOf(_getChaiAddress(), ownerAddress); - // Calculate Dai balance - balance = _convertChaiToDaiAmount(chaiBalance); - } - // Balance will be 0 if bridge is not supported - - } else if (assetProxyId == IAssetData(address(0)).MultiAsset.selector) { - // Get array of values and array of assetDatas - (, uint256[] memory assetAmounts, bytes[] memory nestedAssetData) = decodeMultiAssetData(assetData); - - uint256 length = nestedAssetData.length; - for (uint256 i = 0; i != length; i++) { - // Skip over the asset if the corresponding amount is 0. - if (assetAmounts[i] == 0) { - continue; - } - - // Query balance of individual assetData - uint256 totalBalance = getBalance(ownerAddress, nestedAssetData[i]); - - // Scale total balance down by corresponding value in assetData - uint256 scaledBalance = totalBalance / assetAmounts[i]; - if (scaledBalance == 0) { - return 0; - } - if (scaledBalance < balance || balance == 0) { - balance = scaledBalance; - } - } - } - - // Balance will be 0 if assetProxyId is unknown - return balance; - } - - /// @dev Calls getBalance() for each element of assetData. - /// @param ownerAddress Owner of the assets specified by assetData. - /// @param assetData Array of asset details, each encoded per the AssetProxy contract specification. - /// @return Array of asset balances from getBalance(), with each element - /// corresponding to the same-indexed element in the assetData input. - function getBatchBalances(address ownerAddress, bytes[] memory assetData) - public - returns (uint256[] memory balances) - { - uint256 length = assetData.length; - balances = new uint256[](length); - for (uint256 i = 0; i != length; i++) { - balances[i] = getBalance(ownerAddress, assetData[i]); - } - return balances; - } - - /// @dev Returns the number of asset(s) (described by assetData) that - /// the corresponding AssetProxy contract is authorized to spend. When the asset data contains - /// multiple assets (eg for Multi-Asset), the return value indicates - /// how many complete "baskets" of those assets may be spent by all of the corresponding - /// AssetProxy contracts. - /// @param ownerAddress Owner of the assets specified by assetData. - /// @param assetData Details of asset, encoded per the AssetProxy contract specification. - /// @return Number of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend. - function getAssetProxyAllowance(address ownerAddress, bytes memory assetData) - public - returns (uint256 allowance) - { - // Get id of AssetProxy contract - bytes4 assetProxyId = assetData.readBytes4(0); - - if (assetProxyId == IAssetData(address(0)).MultiAsset.selector) { - // Get array of values and array of assetDatas - (, uint256[] memory amounts, bytes[] memory nestedAssetData) = decodeMultiAssetData(assetData); - - uint256 length = nestedAssetData.length; - for (uint256 i = 0; i != length; i++) { - // Skip over the asset if the corresponding amount is 0. - if (amounts[i] == 0) { - continue; - } - - // Query allowance of individual assetData - uint256 totalAllowance = getAssetProxyAllowance(ownerAddress, nestedAssetData[i]); - - // Scale total allowance down by corresponding value in assetData - uint256 scaledAllowance = totalAllowance / amounts[i]; - if (scaledAllowance == 0) { - return 0; - } - if (scaledAllowance < allowance || allowance == 0) { - allowance = scaledAllowance; - } - } - return allowance; - } - - if (assetProxyId == IAssetData(address(0)).ERC20Token.selector) { - // Get ERC20 token address - address tokenAddress = assetData.readAddress(16); - - // Encode data for `allowance(ownerAddress, _ERC20_PROXY_ADDRESS)` - bytes memory allowanceData = abi.encodeWithSelector( - IERC20Token(address(0)).allowance.selector, - ownerAddress, - _ERC20_PROXY_ADDRESS - ); - - // Query allowance - (bool success, bytes memory returnData) = tokenAddress.staticcall(allowanceData); - allowance = success && returnData.length == 32 ? returnData.readUint256(0) : 0; - - } else if (assetProxyId == IAssetData(address(0)).ERC721Token.selector) { - // Get ERC721 token address and id - (, address tokenAddress, uint256 tokenId) = decodeERC721AssetData(assetData); - - // Encode data for `isApprovedForAll(ownerAddress, _ERC721_PROXY_ADDRESS)` - bytes memory isApprovedForAllData = abi.encodeWithSelector( - IERC721Token(address(0)).isApprovedForAll.selector, - ownerAddress, - _ERC721_PROXY_ADDRESS - ); - - (bool success, bytes memory returnData) = tokenAddress.staticcall(isApprovedForAllData); - - // If not approved for all, call `getApproved(tokenId)` - if (!success || returnData.length != 32 || returnData.readUint256(0) != 1) { - // Encode data for `getApproved(tokenId)` - bytes memory getApprovedData = abi.encodeWithSelector(IERC721Token(address(0)).getApproved.selector, tokenId); - (success, returnData) = tokenAddress.staticcall(getApprovedData); - - // Allowance is 1 if successful and the approved address is the ERC721Proxy - allowance = success && returnData.length == 32 && returnData.readAddress(12) == _ERC721_PROXY_ADDRESS ? 1 : 0; - } else { - // Allowance is 2^256 - 1 if `isApprovedForAll` returned true - allowance = _MAX_UINT256; - } - - } else if (assetProxyId == IAssetData(address(0)).ERC1155Assets.selector) { - // Get ERC1155 token address - (, address tokenAddress, , , ) = decodeERC1155AssetData(assetData); - - // Encode data for `isApprovedForAll(ownerAddress, _ERC1155_PROXY_ADDRESS)` - bytes memory isApprovedForAllData = abi.encodeWithSelector( - IERC1155(address(0)).isApprovedForAll.selector, - ownerAddress, - _ERC1155_PROXY_ADDRESS - ); - - // Query allowance - (bool success, bytes memory returnData) = tokenAddress.staticcall(isApprovedForAllData); - allowance = success && returnData.length == 32 && returnData.readUint256(0) == 1 ? _MAX_UINT256 : 0; - - } else if (assetProxyId == IAssetData(address(0)).StaticCall.selector) { - // The StaticCallProxy does not require any approvals - allowance = _MAX_UINT256; - - } else if (assetProxyId == IAssetData(address(0)).ERC20Bridge.selector) { - // Get address of ERC20 token and bridge contract - (, address tokenAddress, address bridgeAddress,) = decodeERC20BridgeAssetData(assetData); - if (tokenAddress == _getDaiAddress() && bridgeAddress == _CHAI_BRIDGE_ADDRESS) { - bytes memory allowanceData = abi.encodeWithSelector( - IERC20Token(address(0)).allowance.selector, - ownerAddress, - _CHAI_BRIDGE_ADDRESS - ); - (bool success, bytes memory returnData) = _getChaiAddress().staticcall(allowanceData); - uint256 chaiAllowance = success && returnData.length == 32 ? returnData.readUint256(0) : 0; - // Dai allowance is unlimited if Chai allowance is unlimited - allowance = chaiAllowance == _MAX_UINT256 ? _MAX_UINT256 : _convertChaiToDaiAmount(chaiAllowance); - } - // Allowance will be 0 if bridge is not supported - } - - // Allowance will be 0 if the assetProxyId is unknown - return allowance; - } - - /// @dev Calls getAssetProxyAllowance() for each element of assetData. - /// @param ownerAddress Owner of the assets specified by assetData. - /// @param assetData Array of asset details, each encoded per the AssetProxy contract specification. - /// @return An array of asset allowances from getAllowance(), with each - /// element corresponding to the same-indexed element in the assetData input. - function getBatchAssetProxyAllowances(address ownerAddress, bytes[] memory assetData) - public - returns (uint256[] memory allowances) - { - uint256 length = assetData.length; - allowances = new uint256[](length); - for (uint256 i = 0; i != length; i++) { - allowances[i] = getAssetProxyAllowance(ownerAddress, assetData[i]); - } - return allowances; - } - - /// @dev Calls getBalance() and getAllowance() for assetData. - /// @param ownerAddress Owner of the assets specified by assetData. - /// @param assetData Details of asset, encoded per the AssetProxy contract specification. - /// @return Number of assets (or asset baskets) held by owner, and number - /// of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend. - function getBalanceAndAssetProxyAllowance(address ownerAddress, bytes memory assetData) - public - returns (uint256 balance, uint256 allowance) - { - balance = getBalance(ownerAddress, assetData); - allowance = getAssetProxyAllowance(ownerAddress, assetData); - return (balance, allowance); - } - - /// @dev Calls getBatchBalances() and getBatchAllowances() for each element of assetData. - /// @param ownerAddress Owner of the assets specified by assetData. - /// @param assetData Array of asset details, each encoded per the AssetProxy contract specification. - /// @return An array of asset balances from getBalance(), and an array of - /// asset allowances from getAllowance(), with each element - /// corresponding to the same-indexed element in the assetData input. - function getBatchBalancesAndAssetProxyAllowances(address ownerAddress, bytes[] memory assetData) - public - returns (uint256[] memory balances, uint256[] memory allowances) - { - balances = getBatchBalances(ownerAddress, assetData); - allowances = getBatchAssetProxyAllowances(ownerAddress, assetData); - return (balances, allowances); - } - /// @dev Decode AssetProxy identifier /// @param assetData AssetProxy-compliant asset data describing an ERC-20, ERC-721, ERC1155, or MultiAsset asset. /// @return The AssetProxy identifier @@ -691,44 +351,4 @@ contract LibAssetData is revert("WRONG_PROXY_ID"); } } - - /// @dev Queries balance of an ERC20 token. Returns 0 if call was unsuccessful. - /// @param tokenAddress Address of ERC20 token. - /// @param ownerAddress Address of owner of ERC20 token. - /// @return balance ERC20 token balance of owner. - function _erc20BalanceOf( - address tokenAddress, - address ownerAddress - ) - internal - view - returns (uint256 balance) - { - // Encode data for `balanceOf(ownerAddress)` - bytes memory balanceOfData = abi.encodeWithSelector( - IERC20Token(address(0)).balanceOf.selector, - ownerAddress - ); - - // Query balance - (bool success, bytes memory returnData) = tokenAddress.staticcall(balanceOfData); - balance = success && returnData.length == 32 ? returnData.readUint256(0) : 0; - return balance; - } - - /// @dev Converts an amount of Chai into its equivalent Dai amount. - /// Also accumulates Dai from DSR if called after the last time it was collected. - /// @param chaiAmount Amount of Chai to converts. - function _convertChaiToDaiAmount(uint256 chaiAmount) - internal - returns (uint256 daiAmount) - { - PotLike pot = IChai(_getChaiAddress()).pot(); - // Accumulate savings if called after last time savings were collected - uint256 chiMultiplier = (now > pot.rho()) - ? pot.drip() - : pot.chi(); - daiAmount = LibMath.getPartialAmountFloor(chiMultiplier, 10**27, chaiAmount); - return daiAmount; - } } diff --git a/contracts/dev-utils/contracts/src/LibOrderTransferSimulation.sol b/contracts/dev-utils/contracts/src/LibOrderTransferSimulation.sol new file mode 100644 index 0000000000..7dbe548211 --- /dev/null +++ b/contracts/dev-utils/contracts/src/LibOrderTransferSimulation.sol @@ -0,0 +1,227 @@ +/* + + Copyright 2019 ZeroEx Intl. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + +pragma solidity ^0.5.16; +pragma experimental ABIEncoderV2; + + +import "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol"; +import "@0x/contracts-exchange/contracts/src/libs/LibExchangeRichErrorDecoder.sol"; +import "@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol"; +import "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol"; +import "@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol"; +import "@0x/contracts-utils/contracts/src/LibBytes.sol"; + + +library LibOrderTransferSimulation { + using LibBytes for bytes; + + enum OrderTransferResults { + TakerAssetDataFailed, // Transfer of takerAsset failed + MakerAssetDataFailed, // Transfer of makerAsset failed + TakerFeeAssetDataFailed, // Transfer of takerFeeAsset failed + MakerFeeAssetDataFailed, // Transfer of makerFeeAsset failed + TransfersSuccessful // All transfers in the order were successful + } + + // NOTE(jalextowle): This is a random address that we use to avoid issues that addresses like `address(1)` + // may cause later. + address constant internal UNUSED_ADDRESS = address(0x377f698C4c287018D09b516F415317aEC5919332); + + // keccak256(abi.encodeWithSignature("Error(string)", "TRANSFERS_SUCCESSFUL")); + bytes32 constant internal _TRANSFERS_SUCCESSFUL_RESULT_HASH = 0xf43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce0; + + /// @dev Simulates the maker transfers within an order and returns the index of the first failed transfer. + /// @param order The order to simulate transfers for. + /// @param takerAddress The address of the taker that will fill the order. + /// @param takerAssetFillAmount The amount of takerAsset that the taker wished to fill. + /// @return The index of the first failed transfer (or 4 if all transfers are successful). + function getSimulatedOrderMakerTransferResults( + address exchange, + LibOrder.Order memory order, + address takerAddress, + uint256 takerAssetFillAmount + ) + public + returns (OrderTransferResults orderTransferResults) + { + LibFillResults.FillResults memory fillResults = LibFillResults.calculateFillResults( + order, + takerAssetFillAmount, + IExchange(exchange).protocolFeeMultiplier(), + tx.gasprice + ); + + bytes[] memory assetData = new bytes[](2); + address[] memory fromAddresses = new address[](2); + address[] memory toAddresses = new address[](2); + uint256[] memory amounts = new uint256[](2); + + // Transfer `makerAsset` from maker to taker + assetData[0] = order.makerAssetData; + fromAddresses[0] = order.makerAddress; + toAddresses[0] = takerAddress == address(0) ? UNUSED_ADDRESS : takerAddress; + amounts[0] = fillResults.makerAssetFilledAmount; + + // Transfer `makerFeeAsset` from maker to feeRecipient + assetData[1] = order.makerFeeAssetData; + fromAddresses[1] = order.makerAddress; + toAddresses[1] = order.feeRecipientAddress == address(0) ? UNUSED_ADDRESS : order.feeRecipientAddress; + amounts[1] = fillResults.makerFeePaid; + + return _simulateTransferFromCalls( + exchange, + assetData, + fromAddresses, + toAddresses, + amounts + ); + } + + /// @dev Simulates all of the transfers within an order and returns the index of the first failed transfer. + /// @param order The order to simulate transfers for. + /// @param takerAddress The address of the taker that will fill the order. + /// @param takerAssetFillAmount The amount of takerAsset that the taker wished to fill. + /// @return The index of the first failed transfer (or 4 if all transfers are successful). + function getSimulatedOrderTransferResults( + address exchange, + LibOrder.Order memory order, + address takerAddress, + uint256 takerAssetFillAmount + ) + public + returns (OrderTransferResults orderTransferResults) + { + LibFillResults.FillResults memory fillResults = LibFillResults.calculateFillResults( + order, + takerAssetFillAmount, + IExchange(exchange).protocolFeeMultiplier(), + tx.gasprice + ); + + // Create input arrays + bytes[] memory assetData = new bytes[](4); + address[] memory fromAddresses = new address[](4); + address[] memory toAddresses = new address[](4); + uint256[] memory amounts = new uint256[](4); + + // Transfer `takerAsset` from taker to maker + assetData[0] = order.takerAssetData; + fromAddresses[0] = takerAddress; + toAddresses[0] = order.makerAddress; + amounts[0] = takerAssetFillAmount; + + // Transfer `makerAsset` from maker to taker + assetData[1] = order.makerAssetData; + fromAddresses[1] = order.makerAddress; + toAddresses[1] = takerAddress == address(0) ? UNUSED_ADDRESS : takerAddress; + amounts[1] = fillResults.makerAssetFilledAmount; + + // Transfer `takerFeeAsset` from taker to feeRecipient + assetData[2] = order.takerFeeAssetData; + fromAddresses[2] = takerAddress; + toAddresses[2] = order.feeRecipientAddress == address(0) ? UNUSED_ADDRESS : order.feeRecipientAddress; + amounts[2] = fillResults.takerFeePaid; + + // Transfer `makerFeeAsset` from maker to feeRecipient + assetData[3] = order.makerFeeAssetData; + fromAddresses[3] = order.makerAddress; + toAddresses[3] = order.feeRecipientAddress == address(0) ? UNUSED_ADDRESS : order.feeRecipientAddress; + amounts[3] = fillResults.makerFeePaid; + + return _simulateTransferFromCalls( + exchange, + assetData, + fromAddresses, + toAddresses, + amounts + ); + } + + /// @dev Simulates all of the transfers for each given order and returns the indices of each first failed transfer. + /// @param orders Array of orders to individually simulate transfers for. + /// @param takerAddresses Array of addresses of takers that will fill each order. + /// @param takerAssetFillAmounts Array of amounts of takerAsset that will be filled for each order. + /// @return The indices of the first failed transfer (or 4 if all transfers are successful) for each order. + function getSimulatedOrdersTransferResults( + address exchange, + LibOrder.Order[] memory orders, + address[] memory takerAddresses, + uint256[] memory takerAssetFillAmounts + ) + public + returns (OrderTransferResults[] memory orderTransferResults) + { + uint256 length = orders.length; + orderTransferResults = new OrderTransferResults[](length); + for (uint256 i = 0; i != length; i++) { + orderTransferResults[i] = getSimulatedOrderTransferResults( + exchange, + orders[i], + takerAddresses[i], + takerAssetFillAmounts[i] + ); + } + return orderTransferResults; + } + + /// @dev Makes the simulation call with information about the transfers and processes + /// the returndata. + /// @param assetData The assetdata to use to make transfers. + /// @param fromAddresses The addresses to transfer funds. + /// @param toAddresses The addresses that will receive funds + /// @param amounts The amounts involved in the transfer. + function _simulateTransferFromCalls( + address exchange, + bytes[] memory assetData, + address[] memory fromAddresses, + address[] memory toAddresses, + uint256[] memory amounts + ) + private + returns (OrderTransferResults orderTransferResults) + { + // Encode data for `simulateDispatchTransferFromCalls(assetData, fromAddresses, toAddresses, amounts)` + bytes memory simulateDispatchTransferFromCallsData = abi.encodeWithSelector( + IExchange(address(0)).simulateDispatchTransferFromCalls.selector, + assetData, + fromAddresses, + toAddresses, + amounts + ); + + // Perform call and catch revert + (, bytes memory returnData) = address(exchange).call(simulateDispatchTransferFromCallsData); + + bytes4 selector = returnData.readBytes4(0); + if (selector == LibExchangeRichErrors.AssetProxyDispatchErrorSelector()) { + // Decode AssetProxyDispatchError and return index of failed transfer + (, bytes32 failedTransferIndex,) = LibExchangeRichErrorDecoder.decodeAssetProxyDispatchError(returnData); + return OrderTransferResults(uint8(uint256(failedTransferIndex))); + } else if (selector == LibExchangeRichErrors.AssetProxyTransferErrorSelector()) { + // Decode AssetProxyTransferError and return index of failed transfer + (bytes32 failedTransferIndex, ,) = LibExchangeRichErrorDecoder.decodeAssetProxyTransferError(returnData); + return OrderTransferResults(uint8(uint256(failedTransferIndex))); + } else if (keccak256(returnData) == _TRANSFERS_SUCCESSFUL_RESULT_HASH) { + // All transfers were successful + return OrderTransferResults.TransfersSuccessful; + } else { + revert("UNKNOWN_RETURN_DATA"); + } + } +} diff --git a/contracts/dev-utils/contracts/src/LibTransactionDecoder.sol b/contracts/dev-utils/contracts/src/LibTransactionDecoder.sol index 476cf1c4c5..34df3cdebc 100644 --- a/contracts/dev-utils/contracts/src/LibTransactionDecoder.sol +++ b/contracts/dev-utils/contracts/src/LibTransactionDecoder.sol @@ -16,7 +16,7 @@ */ -pragma solidity ^0.5.5; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol"; @@ -24,7 +24,7 @@ import "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol"; import "@0x/contracts-utils/contracts/src/LibBytes.sol"; -contract LibTransactionDecoder { +library LibTransactionDecoder { using LibBytes for bytes; diff --git a/contracts/dev-utils/contracts/src/OrderValidationUtils.sol b/contracts/dev-utils/contracts/src/OrderValidationUtils.sol index 0ed383f779..c7435165dd 100644 --- a/contracts/dev-utils/contracts/src/OrderValidationUtils.sol +++ b/contracts/dev-utils/contracts/src/OrderValidationUtils.sol @@ -16,36 +16,26 @@ */ -pragma solidity ^0.5.9; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; -import "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol"; import "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol"; import "@0x/contracts-exchange-libs/contracts/src/LibMath.sol"; import "@0x/contracts-utils/contracts/src/LibBytes.sol"; import "@0x/contracts-utils/contracts/src/LibSafeMath.sol"; +import "./Addresses.sol"; +import "./AssetBalance.sol"; import "./LibAssetData.sol"; -import "./OrderTransferSimulationUtils.sol"; +import "./LibOrderTransferSimulation.sol"; contract OrderValidationUtils is - LibAssetData, - OrderTransferSimulationUtils + Addresses, + AssetBalance { using LibBytes for bytes; using LibSafeMath for uint256; - constructor ( - address _exchange, - address _chaiBridge - ) - public - LibAssetData( - _exchange, - _chaiBridge - ) - {} - /// @dev Fetches all order-relevant information needed to validate if the supplied order is fillable. /// @param order The order structure. /// @param signature Signature provided by maker that proves the order's authenticity. @@ -65,23 +55,22 @@ contract OrderValidationUtils is ) { // Get info specific to order - orderInfo = _EXCHANGE.getOrderInfo(order); + orderInfo = IExchange(exchangeAddress).getOrderInfo(order); // Validate the maker's signature address makerAddress = order.makerAddress; - isValidSignature = _EXCHANGE.isValidOrderSignature( + isValidSignature = IExchange(exchangeAddress).isValidOrderSignature( order, signature ); // Get the transferable amount of the `makerAsset` - uint256 transferableMakerAssetAmount = getTransferableAssetAmount(makerAddress, order.makerAssetData); + uint256 transferableMakerAssetAmount = _getTransferableConvertedMakerAssetAmount( + order + ); - // Assign to stack variables to reduce redundant mloads/sloads - uint256 takerAssetAmount = order.takerAssetAmount; - uint256 makerFee = order.makerFee; - - // Get the amount of `takerAsset` that is transferable to maker given the transferability of `makerAsset`, `makerFeeAsset`, + // Get the amount of `takerAsset` that is transferable to maker given the + // transferability of `makerAsset`, `makerFeeAsset`, // and the total amounts specified in the order uint256 transferableTakerAssetAmount; if (order.makerAssetData.equals(order.makerFeeAssetData)) { @@ -89,32 +78,35 @@ contract OrderValidationUtils is // transferableMakerAssetAmount / (makerAssetAmount + makerFee) transferableTakerAssetAmount = LibMath.getPartialAmountFloor( transferableMakerAssetAmount, - order.makerAssetAmount.safeAdd(makerFee), - takerAssetAmount + order.makerAssetAmount.safeAdd(order.makerFee), + order.takerAssetAmount ); } else { // If `makerFee` is 0, the % that can be filled is (transferableMakerAssetAmount / makerAssetAmount) - if (makerFee == 0) { + if (order.makerFee == 0) { transferableTakerAssetAmount = LibMath.getPartialAmountFloor( transferableMakerAssetAmount, order.makerAssetAmount, - takerAssetAmount + order.takerAssetAmount ); // If `makerAsset` does not equal `makerFeeAsset`, the % that can be filled is the lower of // (transferableMakerAssetAmount / makerAssetAmount) and (transferableMakerAssetFeeAmount / makerFee) } else { // Get the transferable amount of the `makerFeeAsset` - uint256 transferableMakerFeeAssetAmount = getTransferableAssetAmount(makerAddress, order.makerFeeAssetData); + uint256 transferableMakerFeeAssetAmount = getTransferableAssetAmount( + makerAddress, + order.makerFeeAssetData + ); uint256 transferableMakerToTakerAmount = LibMath.getPartialAmountFloor( transferableMakerAssetAmount, order.makerAssetAmount, - takerAssetAmount + order.takerAssetAmount ); uint256 transferableMakerFeeToTakerAmount = LibMath.getPartialAmountFloor( transferableMakerFeeAssetAmount, - makerFee, - takerAssetAmount + order.makerFee, + order.takerAssetAmount ); transferableTakerAssetAmount = LibSafeMath.min256(transferableMakerToTakerAmount, transferableMakerFeeToTakerAmount); } @@ -122,16 +114,17 @@ contract OrderValidationUtils is // `fillableTakerAssetAmount` is the lower of the order's remaining `takerAssetAmount` and the `transferableTakerAssetAmount` fillableTakerAssetAmount = LibSafeMath.min256( - takerAssetAmount.safeSub(orderInfo.orderTakerAssetFilledAmount), + order.takerAssetAmount.safeSub(orderInfo.orderTakerAssetFilledAmount), transferableTakerAssetAmount ); // Execute the maker transfers. - fillableTakerAssetAmount = getSimulatedOrderMakerTransferResults( + fillableTakerAssetAmount = LibOrderTransferSimulation.getSimulatedOrderMakerTransferResults( + exchangeAddress, order, order.takerAddress, fillableTakerAssetAmount - ) == OrderTransferResults.TransfersSuccessful ? fillableTakerAssetAmount : 0; + ) == LibOrderTransferSimulation.OrderTransferResults.TransfersSuccessful ? fillableTakerAssetAmount : 0; if (!_isAssetDataValid(order.takerAssetData)) { fillableTakerAssetAmount = 0; @@ -181,7 +174,7 @@ contract OrderValidationUtils is return (ordersInfo, fillableTakerAssetAmounts, isValidSignature); } - /// @dev Gets the amount of an asset transferable by the owner. + /// @dev Gets the amount of an asset transferable by the maker of an order. /// @param ownerAddress Address of the owner of the asset. /// @param assetData Description of tokens, per the AssetProxy contract specification. /// @return The amount of the asset tranferable by the owner. @@ -193,7 +186,26 @@ contract OrderValidationUtils is public returns (uint256 transferableAssetAmount) { - (uint256 balance, uint256 allowance) = getBalanceAndAssetProxyAllowance(ownerAddress, assetData); + (uint256 balance, uint256 allowance) = getBalanceAndAssetProxyAllowance( + ownerAddress, + assetData + ); + transferableAssetAmount = LibSafeMath.min256(balance, allowance); + return transferableAssetAmount; + } + + /// @dev Gets the amount of an asset transferable by the maker of an order. + /// Similar to `getTransferableAssetAmount()`, but can handle maker asset + /// types that depend on taker assets being transferred first (e.g., Dydx bridge). + /// @param order The order. + /// @return transferableAssetAmount Amount of maker asset that can be transferred. + function _getTransferableConvertedMakerAssetAmount( + LibOrder.Order memory order + ) + internal + returns (uint256 transferableAssetAmount) + { + (uint256 balance, uint256 allowance) = _getConvertibleMakerBalanceAndAssetProxyAllowance(order); transferableAssetAmount = LibSafeMath.min256(balance, allowance); return transferableAssetAmount; } @@ -221,7 +233,8 @@ contract OrderValidationUtils is } // Get array of values and array of assetDatas - (, uint256[] memory assetAmounts, bytes[] memory nestedAssetData) = decodeMultiAssetData(assetData); + (, , bytes[] memory nestedAssetData) = + LibAssetData.decodeMultiAssetData(assetData); uint256 length = nestedAssetData.length; for (uint256 i = 0; i != length; i++) { diff --git a/contracts/dev-utils/package.json b/contracts/dev-utils/package.json index 7f9ca9eb90..3bfd4b84b9 100644 --- a/contracts/dev-utils/package.json +++ b/contracts/dev-utils/package.json @@ -8,7 +8,7 @@ "main": "lib/src/index.js", "scripts": { "build": "yarn pre_build && tsc -b", - "test": "yarn assert_deployable && echo !!! Tests are run via @0x/contracts-integrations !!!", + "test": "yarn assert_deployable", "assert_deployable": "node -e \"const bytecodeLen = (require('./generated-artifacts/DevUtils.json').compilerOutput.evm.bytecode.object.length-2)/2; assert(bytecodeLen<=0x6000,'DevUtils contract is too big to deploy, per EIP-170. '+bytecodeLen+'>'+0x6000)\"", "build:ci": "yarn build", "pre_build": "run-s compile quantify_bytecode contracts:gen generate_contract_wrappers contracts:copy", @@ -27,8 +27,8 @@ "docs:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES" }, "config": { - "publicInterfaceContracts": "DevUtils,LibAssetData,LibTransactionDecoder", - "abis": "./test/generated-artifacts/@(DevUtils|EthBalanceChecker|LibAssetData|LibTransactionDecoder|OrderTransferSimulationUtils|OrderValidationUtils).json", + "publicInterfaceContracts": "DevUtils,LibAssetData,LibOrderTransferSimulation,LibTransactionDecoder", + "abis": "./test/generated-artifacts/@(Addresses|AssetBalance|DevUtils|EthBalanceChecker|ExternalFunctions|LibAssetData|LibOrderTransferSimulation|LibTransactionDecoder|OrderTransferSimulationUtils|OrderValidationUtils).json", "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually." }, "repository": { @@ -41,12 +41,17 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/contracts/dev-utils/README.md", "devDependencies": { + "@0x/contracts-asset-proxy": "^3.1.3", + "@0x/contracts-erc20": "^3.0.6", + "@0x/contracts-test-utils": "^5.1.3", + "@0x/types": "^3.1.1", "@0x/abi-gen": "^5.1.2", "@0x/assert": "^3.0.5", "@0x/contracts-gen": "^2.0.6", "@0x/sol-compiler": "^4.0.6", "@0x/ts-doc-gen": "^0.0.22", "@0x/tslint-config": "^4.0.0", + "@0x/utils": "^5.2.0", "@types/node": "*", "ethereum-types": "^3.0.0", "ethers": "~4.0.4", diff --git a/contracts/dev-utils/src/artifacts.ts b/contracts/dev-utils/src/artifacts.ts index 3c2f022c66..37178cef1e 100644 --- a/contracts/dev-utils/src/artifacts.ts +++ b/contracts/dev-utils/src/artifacts.ts @@ -7,9 +7,11 @@ import { ContractArtifact } from 'ethereum-types'; import * as DevUtils from '../generated-artifacts/DevUtils.json'; import * as LibAssetData from '../generated-artifacts/LibAssetData.json'; +import * as LibOrderTransferSimulation from '../generated-artifacts/LibOrderTransferSimulation.json'; import * as LibTransactionDecoder from '../generated-artifacts/LibTransactionDecoder.json'; export const artifacts = { DevUtils: DevUtils as ContractArtifact, LibAssetData: LibAssetData as ContractArtifact, + LibOrderTransferSimulation: LibOrderTransferSimulation as ContractArtifact, LibTransactionDecoder: LibTransactionDecoder as ContractArtifact, }; diff --git a/contracts/dev-utils/src/index.ts b/contracts/dev-utils/src/index.ts index 86d122eb2e..91a089b69a 100644 --- a/contracts/dev-utils/src/index.ts +++ b/contracts/dev-utils/src/index.ts @@ -1,5 +1,5 @@ export { artifacts } from './artifacts'; -export { DevUtilsContract, LibAssetDataContract, LibTransactionDecoderContract } from './wrappers'; +export { DevUtilsContract } from './wrappers'; export { ContractArtifact, ContractChains, diff --git a/contracts/dev-utils/src/wrappers.ts b/contracts/dev-utils/src/wrappers.ts index e07c65436d..c00882a21a 100644 --- a/contracts/dev-utils/src/wrappers.ts +++ b/contracts/dev-utils/src/wrappers.ts @@ -5,4 +5,5 @@ */ export * from '../generated-wrappers/dev_utils'; export * from '../generated-wrappers/lib_asset_data'; +export * from '../generated-wrappers/lib_order_transfer_simulation'; export * from '../generated-wrappers/lib_transaction_decoder'; diff --git a/contracts/dev-utils/test/artifacts.ts b/contracts/dev-utils/test/artifacts.ts index 767d984040..7a57acf66b 100644 --- a/contracts/dev-utils/test/artifacts.ts +++ b/contracts/dev-utils/test/artifacts.ts @@ -5,16 +5,24 @@ */ import { ContractArtifact } from 'ethereum-types'; +import * as Addresses from '../test/generated-artifacts/Addresses.json'; +import * as AssetBalance from '../test/generated-artifacts/AssetBalance.json'; import * as DevUtils from '../test/generated-artifacts/DevUtils.json'; import * as EthBalanceChecker from '../test/generated-artifacts/EthBalanceChecker.json'; +import * as ExternalFunctions from '../test/generated-artifacts/ExternalFunctions.json'; import * as LibAssetData from '../test/generated-artifacts/LibAssetData.json'; +import * as LibOrderTransferSimulation from '../test/generated-artifacts/LibOrderTransferSimulation.json'; import * as LibTransactionDecoder from '../test/generated-artifacts/LibTransactionDecoder.json'; import * as OrderTransferSimulationUtils from '../test/generated-artifacts/OrderTransferSimulationUtils.json'; import * as OrderValidationUtils from '../test/generated-artifacts/OrderValidationUtils.json'; export const artifacts = { + Addresses: Addresses as ContractArtifact, + AssetBalance: AssetBalance as ContractArtifact, DevUtils: DevUtils as ContractArtifact, EthBalanceChecker: EthBalanceChecker as ContractArtifact, + ExternalFunctions: ExternalFunctions as ContractArtifact, LibAssetData: LibAssetData as ContractArtifact, + LibOrderTransferSimulation: LibOrderTransferSimulation as ContractArtifact, LibTransactionDecoder: LibTransactionDecoder as ContractArtifact, OrderTransferSimulationUtils: OrderTransferSimulationUtils as ContractArtifact, OrderValidationUtils: OrderValidationUtils as ContractArtifact, diff --git a/contracts/dev-utils/test/wrappers.ts b/contracts/dev-utils/test/wrappers.ts index cbbea9c7cc..0760a7390d 100644 --- a/contracts/dev-utils/test/wrappers.ts +++ b/contracts/dev-utils/test/wrappers.ts @@ -3,9 +3,13 @@ * Warning: This file is auto-generated by contracts-gen. Don't edit manually. * ----------------------------------------------------------------------------- */ +export * from '../test/generated-wrappers/addresses'; +export * from '../test/generated-wrappers/asset_balance'; export * from '../test/generated-wrappers/dev_utils'; export * from '../test/generated-wrappers/eth_balance_checker'; +export * from '../test/generated-wrappers/external_functions'; export * from '../test/generated-wrappers/lib_asset_data'; +export * from '../test/generated-wrappers/lib_order_transfer_simulation'; export * from '../test/generated-wrappers/lib_transaction_decoder'; export * from '../test/generated-wrappers/order_transfer_simulation_utils'; export * from '../test/generated-wrappers/order_validation_utils'; diff --git a/contracts/dev-utils/tsconfig.json b/contracts/dev-utils/tsconfig.json index ec5f1f9157..9c2a01383f 100644 --- a/contracts/dev-utils/tsconfig.json +++ b/contracts/dev-utils/tsconfig.json @@ -5,10 +5,15 @@ "files": [ "generated-artifacts/DevUtils.json", "generated-artifacts/LibAssetData.json", + "generated-artifacts/LibOrderTransferSimulation.json", "generated-artifacts/LibTransactionDecoder.json", + "test/generated-artifacts/Addresses.json", + "test/generated-artifacts/AssetBalance.json", "test/generated-artifacts/DevUtils.json", "test/generated-artifacts/EthBalanceChecker.json", + "test/generated-artifacts/ExternalFunctions.json", "test/generated-artifacts/LibAssetData.json", + "test/generated-artifacts/LibOrderTransferSimulation.json", "test/generated-artifacts/LibTransactionDecoder.json", "test/generated-artifacts/OrderTransferSimulationUtils.json", "test/generated-artifacts/OrderValidationUtils.json" diff --git a/contracts/erc20/CHANGELOG.json b/contracts/erc20/CHANGELOG.json index 948d6f2933..2e0d94daa6 100644 --- a/contracts/erc20/CHANGELOG.json +++ b/contracts/erc20/CHANGELOG.json @@ -4,11 +4,11 @@ "changes": [ { "note": "Add `allowance()` and `balanceOf()` to `LibERC20Token`", - "pr": 2462 + "pr": 2464 }, { "note": "Fix broken tests", - "pr": 2462 + "pr": 2456 } ] }, diff --git a/contracts/erc20/contracts/src/LibERC20Token.sol b/contracts/erc20/contracts/src/LibERC20Token.sol index 830ef11f8f..2ba86732b3 100644 --- a/contracts/erc20/contracts/src/LibERC20Token.sol +++ b/contracts/erc20/contracts/src/LibERC20Token.sol @@ -94,7 +94,8 @@ library LibERC20Token { /// @dev Retrieves the number of decimals for a token. /// Returns `18` if the call reverts. - /// @return The number of decimals places for the token. + /// @param token The address of the token contract. + /// @return tokenDecimals The number of decimals places for the token. function decimals(address token) internal view @@ -107,6 +108,50 @@ library LibERC20Token { } } + /// @dev Retrieves the allowance for a token, owner, and spender. + /// Returns `0` if the call reverts. + /// @param token The address of the token contract. + /// @param owner The owner of the tokens. + /// @param spender The address the spender. + /// @return allowance The allowance for a token, owner, and spender. + function allowance(address token, address owner, address spender) + internal + view + returns (uint256 allowance_) + { + (bool didSucceed, bytes memory resultData) = token.staticcall( + abi.encodeWithSelector( + IERC20Token(0).allowance.selector, + owner, + spender + ) + ); + if (didSucceed && resultData.length == 32) { + allowance_ = LibBytes.readUint256(resultData, 0); + } + } + + /// @dev Retrieves the balance for a token owner. + /// Returns `0` if the call reverts. + /// @param token The address of the token contract. + /// @param owner The owner of the tokens. + /// @return balance The token balance of an owner. + function balanceOf(address token, address owner) + internal + view + returns (uint256 balance) + { + (bool didSucceed, bytes memory resultData) = token.staticcall( + abi.encodeWithSelector( + IERC20Token(0).balanceOf.selector, + owner + ) + ); + if (didSucceed && resultData.length == 32) { + balance = LibBytes.readUint256(resultData, 0); + } + } + /// @dev Executes a call on address `target` with calldata `callData` /// and asserts that either nothing was returned or a single boolean /// was returned equal to `true`. diff --git a/contracts/integrations/CHANGELOG.json b/contracts/integrations/CHANGELOG.json index 398abdf72f..b0f62e226f 100644 --- a/contracts/integrations/CHANGELOG.json +++ b/contracts/integrations/CHANGELOG.json @@ -5,6 +5,10 @@ { "note": "Remove dependency on `DevUtils` for asset data encoding/decoding", "pr": 2462 + }, + { + "note": "Update tests for refactored `DevUtils`", + "pr": 2464 } ] }, diff --git a/contracts/integrations/test/dev-utils/dev_utils_mainnet_test.ts b/contracts/integrations/test/dev-utils/dev_utils_mainnet_test.ts index b042ed628f..1aa36ff346 100644 --- a/contracts/integrations/test/dev-utils/dev_utils_mainnet_test.ts +++ b/contracts/integrations/test/dev-utils/dev_utils_mainnet_test.ts @@ -26,8 +26,9 @@ blockchainTests.fork.resets('DevUtils mainnet tests', env => { before(async () => { [noDaiAddress] = await env.getAccountAddressesAsync(); - devUtils = await DevUtilsContract.deployFrom0xArtifactAsync( + devUtils = await DevUtilsContract.deployWithLibrariesFrom0xArtifactAsync( devUtilsArtifacts.DevUtils, + devUtilsArtifacts, env.provider, env.txDefaults, devUtilsArtifacts, diff --git a/contracts/integrations/test/dev-utils/get_order_hash.ts b/contracts/integrations/test/dev-utils/get_order_hash.ts index bfa31dc6c1..862b9a188b 100644 --- a/contracts/integrations/test/dev-utils/get_order_hash.ts +++ b/contracts/integrations/test/dev-utils/get_order_hash.ts @@ -19,8 +19,9 @@ blockchainTests('DevUtils.getOrderHash', env => { exchangeArtifacts, new BigNumber(chainId), ); - devUtils = await DevUtilsContract.deployFrom0xArtifactAsync( + devUtils = await DevUtilsContract.deployWithLibrariesFrom0xArtifactAsync( artifacts.DevUtils, + artifacts, env.provider, env.txDefaults, artifacts, diff --git a/contracts/integrations/test/dev-utils/lib_asset_data.ts b/contracts/integrations/test/dev-utils/lib_asset_data.ts index 442e31ee9f..7594a44f11 100644 --- a/contracts/integrations/test/dev-utils/lib_asset_data.ts +++ b/contracts/integrations/test/dev-utils/lib_asset_data.ts @@ -1,13 +1,13 @@ import * as crypto from 'crypto'; import { artifacts as proxyArtifacts, TestStaticCallTargetContract } from '@0x/contracts-asset-proxy'; -import { artifacts, LibAssetDataContract } from '@0x/contracts-dev-utils'; +import { artifacts, DevUtilsContract } from '@0x/contracts-dev-utils'; import { ERC1155MintableContract } from '@0x/contracts-erc1155'; import { DummyERC20TokenContract } from '@0x/contracts-erc20'; import { DummyERC721TokenContract } from '@0x/contracts-erc721'; import { blockchainTests, constants, expect } from '@0x/contracts-test-utils'; import { AssetProxyId } from '@0x/types'; -import { BigNumber, hexUtils, LibBytesRevertErrors, StringRevertError } from '@0x/utils'; +import { BigNumber, hexUtils, LibBytesRevertErrors } from '@0x/utils'; import { Actor } from '../framework/actors/base'; import { DeploymentManager } from '../framework/deployment_manager'; @@ -53,7 +53,7 @@ const KNOWN_STATIC_CALL_ENCODING = { blockchainTests.resets('LibAssetData', env => { let deployment: DeploymentManager; let staticCallTarget: TestStaticCallTargetContract; - let libAssetData: LibAssetDataContract; + let devUtils: DevUtilsContract; let tokenOwner: Actor; @@ -73,8 +73,9 @@ blockchainTests.resets('LibAssetData', env => { }); tokenOwner = new Actor({ name: 'Token Owner', deployment }); - libAssetData = await LibAssetDataContract.deployFrom0xArtifactAsync( - artifacts.LibAssetData, + devUtils = await DevUtilsContract.deployWithLibrariesFrom0xArtifactAsync( + artifacts.DevUtils, + artifacts, env.provider, env.txDefaults, artifacts, @@ -104,7 +105,7 @@ blockchainTests.resets('LibAssetData', env => { }); it('should have a deployed-to address', () => { - expect(libAssetData.address.slice(0, 2)).to.equal('0x'); + expect(devUtils.address.slice(0, 2)).to.equal('0x'); }); describe('encoding and decoding', () => { @@ -117,17 +118,17 @@ blockchainTests.resets('LibAssetData', env => { ]; for (const [assetData, proxyId] of assetDataScenarios) { - expect(await libAssetData.decodeAssetProxyId(assetData).callAsync()).to.equal(proxyId); + expect(await devUtils.decodeAssetProxyId(assetData).callAsync()).to.equal(proxyId); } }); it('should encode ERC20 asset data', async () => { - expect(await libAssetData.encodeERC20AssetData(KNOWN_ERC20_ENCODING.address).callAsync()).to.equal( + expect(await devUtils.encodeERC20AssetData(KNOWN_ERC20_ENCODING.address).callAsync()).to.equal( KNOWN_ERC20_ENCODING.assetData, ); }); it('should decode ERC20 asset data', async () => { - expect(await libAssetData.decodeERC20AssetData(KNOWN_ERC20_ENCODING.assetData).callAsync()).to.deep.equal([ + expect(await devUtils.decodeERC20AssetData(KNOWN_ERC20_ENCODING.assetData).callAsync()).to.deep.equal([ AssetProxyId.ERC20, KNOWN_ERC20_ENCODING.address, ]); @@ -135,21 +136,23 @@ blockchainTests.resets('LibAssetData', env => { it('should encode ERC721 asset data', async () => { expect( - await libAssetData + await devUtils .encodeERC721AssetData(KNOWN_ERC721_ENCODING.address, KNOWN_ERC721_ENCODING.tokenId) .callAsync(), ).to.equal(KNOWN_ERC721_ENCODING.assetData); }); it('should decode ERC721 asset data', async () => { - expect(await libAssetData.decodeERC721AssetData(KNOWN_ERC721_ENCODING.assetData).callAsync()).to.deep.equal( - [AssetProxyId.ERC721, KNOWN_ERC721_ENCODING.address, KNOWN_ERC721_ENCODING.tokenId], - ); + expect(await devUtils.decodeERC721AssetData(KNOWN_ERC721_ENCODING.assetData).callAsync()).to.deep.equal([ + AssetProxyId.ERC721, + KNOWN_ERC721_ENCODING.address, + KNOWN_ERC721_ENCODING.tokenId, + ]); }); it('should encode ERC1155 asset data', async () => { expect( - await libAssetData + await devUtils .encodeERC1155AssetData( KNOWN_ERC1155_ENCODING.tokenAddress, KNOWN_ERC1155_ENCODING.tokenIds, @@ -161,9 +164,7 @@ blockchainTests.resets('LibAssetData', env => { }); it('should decode ERC1155 asset data', async () => { - expect( - await libAssetData.decodeERC1155AssetData(KNOWN_ERC1155_ENCODING.assetData).callAsync(), - ).to.deep.equal([ + expect(await devUtils.decodeERC1155AssetData(KNOWN_ERC1155_ENCODING.assetData).callAsync()).to.deep.equal([ AssetProxyId.ERC1155, KNOWN_ERC1155_ENCODING.tokenAddress, KNOWN_ERC1155_ENCODING.tokenIds, @@ -174,7 +175,7 @@ blockchainTests.resets('LibAssetData', env => { it('should encode multiasset data', async () => { expect( - await libAssetData + await devUtils .encodeMultiAssetData( KNOWN_MULTI_ASSET_ENCODING.amounts, KNOWN_MULTI_ASSET_ENCODING.nestedAssetData, @@ -184,18 +185,18 @@ blockchainTests.resets('LibAssetData', env => { }); it('should decode multiasset data', async () => { - expect( - await libAssetData.decodeMultiAssetData(KNOWN_MULTI_ASSET_ENCODING.assetData).callAsync(), - ).to.deep.equal([ - AssetProxyId.MultiAsset, - KNOWN_MULTI_ASSET_ENCODING.amounts, - KNOWN_MULTI_ASSET_ENCODING.nestedAssetData, - ]); + expect(await devUtils.decodeMultiAssetData(KNOWN_MULTI_ASSET_ENCODING.assetData).callAsync()).to.deep.equal( + [ + AssetProxyId.MultiAsset, + KNOWN_MULTI_ASSET_ENCODING.amounts, + KNOWN_MULTI_ASSET_ENCODING.nestedAssetData, + ], + ); }); it('should encode StaticCall data', async () => { expect( - await libAssetData + await devUtils .encodeStaticCallAssetData( KNOWN_STATIC_CALL_ENCODING.staticCallTargetAddress, KNOWN_STATIC_CALL_ENCODING.staticCallData, @@ -207,7 +208,7 @@ blockchainTests.resets('LibAssetData', env => { it('should decode StaticCall data', async () => { expect( - await libAssetData.decodeStaticCallAssetData(KNOWN_STATIC_CALL_ENCODING.assetData).callAsync(), + await devUtils.decodeStaticCallAssetData(KNOWN_STATIC_CALL_ENCODING.assetData).callAsync(), ).to.deep.equal([ AssetProxyId.StaticCall, KNOWN_STATIC_CALL_ENCODING.staticCallTargetAddress, @@ -227,16 +228,14 @@ blockchainTests.resets('LibAssetData', env => { ]; for (const data of assetData) { - await libAssetData.revertIfInvalidAssetData(data).callAsync(); + await devUtils.revertIfInvalidAssetData(data).callAsync(); } return; }); it('should revert for invalid assetProxyId', async () => { const badAssetData = `0x${crypto.randomBytes(4).toString('hex')}${constants.NULL_ADDRESS}`; - await expect(libAssetData.revertIfInvalidAssetData(badAssetData).callAsync()).to.eventually.be.rejectedWith( - StringRevertError, - ); + await expect(devUtils.revertIfInvalidAssetData(badAssetData).callAsync()).to.revertWith('WRONG_PROXY_ID'); }); it('should revert for invalid assetData with valid assetProxyId', async () => { @@ -245,8 +244,8 @@ blockchainTests.resets('LibAssetData', env => { for (const data of assetData) { const badData = data.substring(0, data.length - 2); // drop one byte but retain assetProxyId - await expect(libAssetData.revertIfInvalidAssetData(badData).callAsync()).to.eventually.be.rejectedWith( - LibBytesRevertErrors.InvalidByteOperationError, + await expect(devUtils.revertIfInvalidAssetData(badData).callAsync()).to.revertWith( + new LibBytesRevertErrors.InvalidByteOperationError(), ); } }); @@ -254,33 +253,31 @@ blockchainTests.resets('LibAssetData', env => { describe('getBalance', () => { it('should query ERC20 balance by asset data', async () => { - const assetData = await libAssetData.encodeERC20AssetData(erc20Token.address).callAsync(); - expect(await libAssetData.getBalance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal( + const assetData = await devUtils.encodeERC20AssetData(erc20Token.address).callAsync(); + expect(await devUtils.getBalance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal( constants.INITIAL_ERC20_BALANCE, ); }); it('should return 0 if ERC20 token does not exist', async () => { - const assetData = await libAssetData.encodeERC20AssetData(constants.NULL_ADDRESS).callAsync(); - const balance = await libAssetData.getBalance(tokenOwner.address, assetData).callAsync(); + const assetData = await devUtils.encodeERC20AssetData(constants.NULL_ADDRESS).callAsync(); + const balance = await devUtils.getBalance(tokenOwner.address, assetData).callAsync(); expect(balance).to.bignumber.equal(constants.ZERO_AMOUNT); }); it('should query ERC721 balance by asset data', async () => { - const assetData = await libAssetData.encodeERC721AssetData(erc721Token.address, erc721TokenId).callAsync(); - expect(await libAssetData.getBalance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal(1); + const assetData = await devUtils.encodeERC721AssetData(erc721Token.address, erc721TokenId).callAsync(); + expect(await devUtils.getBalance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal(1); }); it('should return 0 if ERC721 token does not exist', async () => { - const assetData = await libAssetData - .encodeERC721AssetData(constants.NULL_ADDRESS, erc721TokenId) - .callAsync(); - const balance = await libAssetData.getBalance(tokenOwner.address, assetData).callAsync(); + const assetData = await devUtils.encodeERC721AssetData(constants.NULL_ADDRESS, erc721TokenId).callAsync(); + const balance = await devUtils.getBalance(tokenOwner.address, assetData).callAsync(); expect(balance).to.bignumber.equal(constants.ZERO_AMOUNT); }); it('should query ERC1155 balances by asset data', async () => { - const assetData = await libAssetData + const assetData = await devUtils .encodeERC1155AssetData( erc1155Token.address, [erc1155TokenId], @@ -288,11 +285,11 @@ blockchainTests.resets('LibAssetData', env => { constants.NULL_BYTES, ) .callAsync(); - expect(await libAssetData.getBalance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal(1); + expect(await devUtils.getBalance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal(1); }); it('should return 0 if ERC1155 token does not exist', async () => { - const assetData = await libAssetData + const assetData = await devUtils .encodeERC1155AssetData( constants.NULL_ADDRESS, [erc1155TokenId], @@ -300,84 +297,84 @@ blockchainTests.resets('LibAssetData', env => { constants.NULL_BYTES, ) .callAsync(); - const balance = await libAssetData.getBalance(tokenOwner.address, assetData).callAsync(); + const balance = await devUtils.getBalance(tokenOwner.address, assetData).callAsync(); expect(balance).to.bignumber.equal(constants.ZERO_AMOUNT); }); it('should query multi-asset batch balance by asset data', async () => { - const assetData = await libAssetData + const assetData = await devUtils .encodeMultiAssetData( [new BigNumber(1), new BigNumber(1)], [ - await libAssetData.encodeERC20AssetData(erc20Token.address).callAsync(), - await libAssetData.encodeERC721AssetData(erc721Token.address, erc721TokenId).callAsync(), + await devUtils.encodeERC20AssetData(erc20Token.address).callAsync(), + await devUtils.encodeERC721AssetData(erc721Token.address, erc721TokenId).callAsync(), ], ) .callAsync(); - expect(await libAssetData.getBalance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal(1); + expect(await devUtils.getBalance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal(1); }); it('should query multi-asset batch balance by asset data, skipping over a nested asset if its amount == 0', async () => { - const assetData = await libAssetData + const assetData = await devUtils .encodeMultiAssetData( [constants.ZERO_AMOUNT, new BigNumber(1)], [ - await libAssetData.encodeERC20AssetData(erc20Token.address).callAsync(), - await libAssetData.encodeERC721AssetData(erc721Token.address, erc721TokenId).callAsync(), + await devUtils.encodeERC20AssetData(erc20Token.address).callAsync(), + await devUtils.encodeERC721AssetData(erc721Token.address, erc721TokenId).callAsync(), ], ) .callAsync(); - expect(await libAssetData.getBalance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal(1); + expect(await devUtils.getBalance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal(1); }); it('should return a balance of 0 if the balance for a nested asset is 0', async () => { - const assetData = await libAssetData + const assetData = await devUtils .encodeMultiAssetData( [new BigNumber(1), new BigNumber(1)], [ - await libAssetData.encodeERC20AssetData(secondErc20Token.address).callAsync(), - await libAssetData.encodeERC20AssetData(erc20Token.address).callAsync(), + await devUtils.encodeERC20AssetData(secondErc20Token.address).callAsync(), + await devUtils.encodeERC20AssetData(erc20Token.address).callAsync(), ], ) .callAsync(); - expect(await libAssetData.getBalance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal( + expect(await devUtils.getBalance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal( constants.ZERO_AMOUNT, ); }); it('should return a balance of 0 if the assetData does not correspond to an AssetProxy contract', async () => { const fakeAssetData = '0x01020304'; - const balance = await libAssetData.getBalance(tokenOwner.address, fakeAssetData).callAsync(); + const balance = await devUtils.getBalance(tokenOwner.address, fakeAssetData).callAsync(); expect(balance).to.bignumber.equal(constants.ZERO_AMOUNT); }); it('should return a balance of MAX_UINT256 if the the StaticCallProxy assetData contains data for a successful staticcall', async () => { const staticCallData = staticCallTarget.isOddNumber(new BigNumber(1)).getABIEncodedTransactionData(); const expectedResultHash = hexUtils.hash(hexUtils.leftPad(1)); - const assetData = await libAssetData + const assetData = await devUtils .encodeStaticCallAssetData(staticCallTarget.address, staticCallData, expectedResultHash) .callAsync(); - const balance = await libAssetData.getBalance(tokenOwner.address, assetData).callAsync(); + const balance = await devUtils.getBalance(tokenOwner.address, assetData).callAsync(); expect(balance).to.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); }); it('should return a balance of 0 if the the StaticCallProxy assetData contains data for an unsuccessful staticcall', async () => { const staticCallData = staticCallTarget.isOddNumber(new BigNumber(0)).getABIEncodedTransactionData(); const expectedResultHash = hexUtils.hash(hexUtils.leftPad(1)); - const assetData = await libAssetData + const assetData = await devUtils .encodeStaticCallAssetData(staticCallTarget.address, staticCallData, expectedResultHash) .callAsync(); - const balance = await libAssetData.getBalance(tokenOwner.address, assetData).callAsync(); + const balance = await devUtils.getBalance(tokenOwner.address, assetData).callAsync(); expect(balance).to.bignumber.equal(constants.ZERO_AMOUNT); }); }); describe('getAssetProxyAllowance', () => { it('should query ERC20 allowances by asset data', async () => { - const assetData = await libAssetData.encodeERC20AssetData(erc20Token.address).callAsync(); - expect( - await libAssetData.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync(), - ).to.bignumber.equal(constants.MAX_UINT256); + const assetData = await devUtils.encodeERC20AssetData(erc20Token.address).callAsync(); + expect(await devUtils.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal( + constants.MAX_UINT256, + ); }); it('should query ERC721 approval by asset data', async () => { @@ -390,21 +387,21 @@ blockchainTests.resets('LibAssetData', env => { .awaitTransactionSuccessAsync({ from: tokenOwner.address, }); - const assetData = await libAssetData.encodeERC721AssetData(erc721Token.address, erc721TokenId).callAsync(); - expect( - await libAssetData.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync(), - ).to.bignumber.equal(1); + const assetData = await devUtils.encodeERC721AssetData(erc721Token.address, erc721TokenId).callAsync(); + expect(await devUtils.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal( + 1, + ); }); it('should query ERC721 approvalForAll by assetData', async () => { - const assetData = await libAssetData.encodeERC721AssetData(erc721Token.address, erc721TokenId).callAsync(); - expect( - await libAssetData.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync(), - ).to.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); + const assetData = await devUtils.encodeERC721AssetData(erc721Token.address, erc721TokenId).callAsync(); + expect(await devUtils.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal( + constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS, + ); }); it('should query ERC1155 allowances by asset data', async () => { - const assetData = await libAssetData + const assetData = await devUtils .encodeERC1155AssetData( erc1155Token.address, [erc1155TokenId], @@ -412,9 +409,9 @@ blockchainTests.resets('LibAssetData', env => { constants.NULL_BYTES, ) .callAsync(); - expect( - await libAssetData.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync(), - ).to.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); + expect(await devUtils.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal( + constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS, + ); }); it('should query multi-asset allowances by asset data', async () => { @@ -424,18 +421,18 @@ blockchainTests.resets('LibAssetData', env => { .awaitTransactionSuccessAsync({ from: tokenOwner.address, }); - const assetData = await libAssetData + const assetData = await devUtils .encodeMultiAssetData( [new BigNumber(1), new BigNumber(1)], [ - await libAssetData.encodeERC20AssetData(erc20Token.address).callAsync(), - await libAssetData.encodeERC721AssetData(erc721Token.address, erc721TokenId).callAsync(), + await devUtils.encodeERC20AssetData(erc20Token.address).callAsync(), + await devUtils.encodeERC721AssetData(erc721Token.address, erc721TokenId).callAsync(), ], ) .callAsync(); - expect( - await libAssetData.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync(), - ).to.bignumber.equal(1); + expect(await devUtils.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal( + 1, + ); return; }); @@ -446,60 +443,60 @@ blockchainTests.resets('LibAssetData', env => { .awaitTransactionSuccessAsync({ from: tokenOwner.address, }); - const assetData = await libAssetData + const assetData = await devUtils .encodeMultiAssetData( [constants.ZERO_AMOUNT, new BigNumber(1)], [ - await libAssetData.encodeERC20AssetData(erc20Token.address).callAsync(), - await libAssetData.encodeERC721AssetData(erc721Token.address, erc721TokenId).callAsync(), + await devUtils.encodeERC20AssetData(erc20Token.address).callAsync(), + await devUtils.encodeERC721AssetData(erc721Token.address, erc721TokenId).callAsync(), ], ) .callAsync(); - expect( - await libAssetData.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync(), - ).to.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); + expect(await devUtils.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal( + constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS, + ); return; }); it('should return an allowance of 0 if the allowance for a nested asset is 0', async () => { - const assetData = await libAssetData + const assetData = await devUtils .encodeMultiAssetData( [new BigNumber(1), new BigNumber(1)], [ - await libAssetData.encodeERC20AssetData(secondErc20Token.address).callAsync(), - await libAssetData.encodeERC20AssetData(erc20Token.address).callAsync(), + await devUtils.encodeERC20AssetData(secondErc20Token.address).callAsync(), + await devUtils.encodeERC20AssetData(erc20Token.address).callAsync(), ], ) .callAsync(); - expect( - await libAssetData.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync(), - ).to.bignumber.equal(constants.ZERO_AMOUNT); + expect(await devUtils.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync()).to.bignumber.equal( + constants.ZERO_AMOUNT, + ); }); it('should return an allowance of 0 if the assetData does not correspond to an AssetProxy contract', async () => { const fakeAssetData = '0x01020304'; - const allowance = await libAssetData.getAssetProxyAllowance(tokenOwner.address, fakeAssetData).callAsync(); + const allowance = await devUtils.getAssetProxyAllowance(tokenOwner.address, fakeAssetData).callAsync(); expect(allowance).to.bignumber.equal(constants.ZERO_AMOUNT); }); it('should return an allowance of MAX_UINT256 for any staticCallAssetData', async () => { const staticCallData = AssetProxyId.StaticCall; - const assetData = await libAssetData + const assetData = await devUtils .encodeStaticCallAssetData(staticCallTarget.address, staticCallData, constants.KECCAK256_NULL) .callAsync(); - const allowance = await libAssetData.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync(); + const allowance = await devUtils.getAssetProxyAllowance(tokenOwner.address, assetData).callAsync(); expect(allowance).to.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); }); }); describe('getBatchBalances', () => { it('should query balances for a batch of asset data strings', async () => { - const erc20AssetData = await libAssetData.encodeERC20AssetData(erc20Token.address).callAsync(); - const erc721AssetData = await libAssetData + const erc20AssetData = await devUtils.encodeERC20AssetData(erc20Token.address).callAsync(); + const erc721AssetData = await devUtils .encodeERC721AssetData(erc721Token.address, erc721TokenId) .callAsync(); expect( - await libAssetData.getBatchBalances(tokenOwner.address, [erc20AssetData, erc721AssetData]).callAsync(), + await devUtils.getBatchBalances(tokenOwner.address, [erc20AssetData, erc721AssetData]).callAsync(), ).to.deep.equal([new BigNumber(constants.INITIAL_ERC20_BALANCE), new BigNumber(1)]); }); }); @@ -512,9 +509,9 @@ blockchainTests.resets('LibAssetData', env => { .awaitTransactionSuccessAsync({ from: tokenOwner.address, }); - const assetData = await libAssetData.encodeERC20AssetData(erc20Token.address).callAsync(); + const assetData = await devUtils.encodeERC20AssetData(erc20Token.address).callAsync(); expect( - await libAssetData.getBalanceAndAssetProxyAllowance(tokenOwner.address, assetData).callAsync(), + await devUtils.getBalanceAndAssetProxyAllowance(tokenOwner.address, assetData).callAsync(), ).to.deep.equal([new BigNumber(constants.INITIAL_ERC20_BALANCE), allowance]); }); }); @@ -526,9 +523,9 @@ blockchainTests.resets('LibAssetData', env => { .awaitTransactionSuccessAsync({ from: tokenOwner.address, }); - const assetData = await libAssetData.encodeERC20AssetData(erc20Token.address).callAsync(); + const assetData = await devUtils.encodeERC20AssetData(erc20Token.address).callAsync(); expect( - await libAssetData.getBatchBalancesAndAssetProxyAllowances(tokenOwner.address, [assetData]).callAsync(), + await devUtils.getBatchBalancesAndAssetProxyAllowances(tokenOwner.address, [assetData]).callAsync(), ).to.deep.equal([[new BigNumber(constants.INITIAL_ERC20_BALANCE)], [allowance]]); }); }); @@ -541,12 +538,12 @@ blockchainTests.resets('LibAssetData', env => { .awaitTransactionSuccessAsync({ from: tokenOwner.address, }); - const erc20AssetData = await libAssetData.encodeERC20AssetData(erc20Token.address).callAsync(); - const erc721AssetData = await libAssetData + const erc20AssetData = await devUtils.encodeERC20AssetData(erc20Token.address).callAsync(); + const erc721AssetData = await devUtils .encodeERC721AssetData(erc721Token.address, erc721TokenId) .callAsync(); expect( - await libAssetData + await devUtils .getBatchAssetProxyAllowances(tokenOwner.address, [erc20AssetData, erc721AssetData]) .callAsync(), ).to.deep.equal([allowance, constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS]); diff --git a/contracts/integrations/test/dev-utils/lib_transaction_decoder.ts b/contracts/integrations/test/dev-utils/lib_transaction_decoder.ts index 5e23eda5c8..98313cd893 100644 --- a/contracts/integrations/test/dev-utils/lib_transaction_decoder.ts +++ b/contracts/integrations/test/dev-utils/lib_transaction_decoder.ts @@ -1,14 +1,8 @@ -import { ExchangeContract } from '@0x/contracts-exchange'; -import { chaiSetup, constants, provider, txDefaults, web3Wrapper } from '@0x/contracts-test-utils'; -import { BlockchainLifecycle } from '@0x/dev-utils'; +import { artifacts as exchangeArtifacts, ExchangeContract } from '@0x/contracts-exchange'; +import { blockchainTests, constants, expect } from '@0x/contracts-test-utils'; import { BigNumber } from '@0x/utils'; -import * as chai from 'chai'; -import { artifacts, LibTransactionDecoderContract } from '@0x/contracts-dev-utils'; - -chaiSetup.configure(); -const expect = chai.expect; -const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper); +import { artifacts, DevUtilsContract } from '@0x/contracts-dev-utils'; const order = { makerAddress: '0xe36ea790bc9d7ab70c55260c66d52b1eca985f84', @@ -30,25 +24,31 @@ const takerAssetFillAmount = new BigNumber('100000000000000000000'); const signature = '0x1ce8e3c600d933423172b5021158a6be2e818613ff8e762d70ef490c752fd98a626a215f09f169668990414de75a53da221c294a3002f796d004827258b641876e03'; -describe('LibTransactionDecoder', () => { - let libTxDecoder: LibTransactionDecoderContract; - const exchangeInterface = new ExchangeContract(constants.NULL_ADDRESS, provider, txDefaults); +blockchainTests('LibTransactionDecoder', env => { + let devUtils: DevUtilsContract; + const exchangeInterface = new ExchangeContract(constants.NULL_ADDRESS, { isEIP1193: true } as any); before(async () => { - await blockchainLifecycle.startAsync(); - libTxDecoder = await LibTransactionDecoderContract.deployFrom0xArtifactAsync( - artifacts.LibTransactionDecoder, - provider, - txDefaults, - artifacts, + const exchange = await ExchangeContract.deployFrom0xArtifactAsync( + exchangeArtifacts.Exchange, + env.provider, + env.txDefaults, + exchangeArtifacts, + new BigNumber(1), + ); + devUtils = await DevUtilsContract.deployWithLibrariesFrom0xArtifactAsync( + artifacts.DevUtils, + artifacts, + env.provider, + env.txDefaults, + artifacts, + exchange.address, + constants.NULL_ADDRESS, ); - }); - after(async () => { - await blockchainLifecycle.revertAsync(); }); it('should decode an Exchange.batchCancelOrders() transaction', async () => { const input = exchangeInterface.batchCancelOrders([order, order]).getABIEncodedTransactionData(); - expect(await libTxDecoder.decodeZeroExTransactionData(input).callAsync()).to.deep.equal([ + expect(await devUtils.decodeZeroExTransactionData(input).callAsync()).to.deep.equal([ 'batchCancelOrders', [order, order], [], @@ -61,7 +61,7 @@ describe('LibTransactionDecoder', () => { [func]([order, order], [takerAssetFillAmount, takerAssetFillAmount], [signature, signature]) .getABIEncodedTransactionData(); it(`should decode an Exchange.${func}() transaction`, async () => { - expect(await libTxDecoder.decodeZeroExTransactionData(input).callAsync()).to.deep.equal([ + expect(await devUtils.decodeZeroExTransactionData(input).callAsync()).to.deep.equal([ func, [order, order], [takerAssetFillAmount, takerAssetFillAmount], @@ -72,7 +72,7 @@ describe('LibTransactionDecoder', () => { it('should decode an Exchange.cancelOrder() transaction', async () => { const input = exchangeInterface.cancelOrder(order).getABIEncodedTransactionData(); - expect(await libTxDecoder.decodeZeroExTransactionData(input).callAsync()).to.deep.equal([ + expect(await devUtils.decodeZeroExTransactionData(input).callAsync()).to.deep.equal([ 'cancelOrder', [order], [], @@ -85,7 +85,7 @@ describe('LibTransactionDecoder', () => { [func](order, takerAssetFillAmount, signature) .getABIEncodedTransactionData(); it(`should decode an Exchange.${func}() transaction`, async () => { - expect(await libTxDecoder.decodeZeroExTransactionData(input).callAsync()).to.deep.equal([ + expect(await devUtils.decodeZeroExTransactionData(input).callAsync()).to.deep.equal([ func, [order], [takerAssetFillAmount], @@ -104,7 +104,7 @@ describe('LibTransactionDecoder', () => { [func]([order, order], takerAssetFillAmount, [signature, signature]) .getABIEncodedTransactionData(); it(`should decode an Exchange.${func}() transaction`, async () => { - expect(await libTxDecoder.decodeZeroExTransactionData(input).callAsync()).to.deep.equal([ + expect(await devUtils.decodeZeroExTransactionData(input).callAsync()).to.deep.equal([ func, [order, order], [takerAssetFillAmount], @@ -130,7 +130,7 @@ describe('LibTransactionDecoder', () => { const input = exchangeInterface .matchOrders(order, complementaryOrder, signature, signature) .getABIEncodedTransactionData(); - expect(await libTxDecoder.decodeZeroExTransactionData(input).callAsync()).to.deep.equal([ + expect(await devUtils.decodeZeroExTransactionData(input).callAsync()).to.deep.equal([ 'matchOrders', [order, complementaryOrder], [order.takerAssetAmount, complementaryOrder.takerAssetAmount], diff --git a/contracts/integrations/test/framework/deployment_manager.ts b/contracts/integrations/test/framework/deployment_manager.ts index f76b7b3bc0..4b0dd9aa8b 100644 --- a/contracts/integrations/test/framework/deployment_manager.ts +++ b/contracts/integrations/test/framework/deployment_manager.ts @@ -195,8 +195,9 @@ export class DeploymentManager { exchange, staking.stakingProxy, ]); - const devUtils = await DevUtilsContract.deployFrom0xArtifactAsync( + const devUtils = await DevUtilsContract.deployWithLibrariesFrom0xArtifactAsync( devUtilsArtifacts.DevUtils, + devUtilsArtifacts, environment.provider, environment.txDefaults, devUtilsArtifacts, diff --git a/packages/abi-gen/templates/TypeScript/contract.handlebars b/packages/abi-gen/templates/TypeScript/contract.handlebars index 7a5ba5ead9..c7c4db38e1 100644 --- a/packages/abi-gen/templates/TypeScript/contract.handlebars +++ b/packages/abi-gen/templates/TypeScript/contract.handlebars @@ -55,6 +55,7 @@ export enum {{contractName}}Events { {{/if}} /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class {{contractName}}Contract extends BaseContract { diff --git a/packages/contract-addresses/CHANGELOG.json b/packages/contract-addresses/CHANGELOG.json index d4af75be78..14099db240 100644 --- a/packages/contract-addresses/CHANGELOG.json +++ b/packages/contract-addresses/CHANGELOG.json @@ -18,6 +18,14 @@ { "note": "Update `ERC20BridgeSampler` on mainnet and kovan.", "pr": 2459 + }, + { + "note": "Remove `libTransactionDecoder`", + "pr": 2456 + }, + { + "note": "Update snapshot addresses", + "pr": 2464 } ], "timestamp": 1580811564 diff --git a/packages/contract-addresses/addresses.json b/packages/contract-addresses/addresses.json index 1066c000a8..19c2f01fd6 100644 --- a/packages/contract-addresses/addresses.json +++ b/packages/contract-addresses/addresses.json @@ -13,7 +13,6 @@ "dutchAuction": "0x0000000000000000000000000000000000000000", "coordinatorRegistry": "0x45797531b873fd5e519477a070a955764c1a5b07", "coordinator": "0x38a795580d0f687e399913a00ddef6a17612c722", - "libTransactionDecoder": "0x5f20e82643ce007d87692eb1b3d3fc059588b224", "multiAssetProxy": "0xef701d5389ae74503d633396c4d654eabedc9d78", "staticCallProxy": "0x3517b88c19508c08650616019062b898ab65ed29", "erc1155Proxy": "0x7eefbd48fd63d441ec7435d024ec7c5131019add", @@ -43,7 +42,6 @@ "dutchAuction": "0x0000000000000000000000000000000000000000", "coordinatorRegistry": "0x403cc23e88c17c4652fb904784d1af640a6722d9", "coordinator": "0x6ff734d96104965c9c1b0108f83abc46e6e501df", - "libTransactionDecoder": "0xb20f3b07afb0e38b6151b9be4f53218bdd7dc231", "multiAssetProxy": "0xab8fbd189c569ccdee3a4d929bb7f557be4028f6", "staticCallProxy": "0xe1b97e47aa3796276033a5341e884d2ba46b6ac1", "erc1155Proxy": "0x19bb6caa3bc34d39e5a23cedfa3e6c7e7f3c931d", @@ -69,7 +67,6 @@ "assetProxyOwner": "0x0000000000000000000000000000000000000000", "zeroExGovernor": "0x3f46b98061a3e1e1f41dff296ec19402c298f8a9", "forwarder": "0xd67f2f346f6e85db70632d9f18f50e04192ab54d", - "libTransactionDecoder": "0x34b37611db8190469b735fb2a007d8236c29eb88", "orderValidator": "0x0000000000000000000000000000000000000000", "dutchAuction": "0x0000000000000000000000000000000000000000", "coordinatorRegistry": "0x1084b6a398e47907bae43fec3ff4b677db6e4fee", @@ -100,7 +97,6 @@ "zeroExGovernor": "0x6ff734d96104965c9c1b0108f83abc46e6e501df", "forwarder": "0x2759a4c639fa4882d6d64973630ef81faf901d27", "orderValidator": "0x0000000000000000000000000000000000000000", - "libTransactionDecoder": "0x067b5997c9058eade0bb03d8fb5e6db7feda80a3", "dutchAuction": "0x0000000000000000000000000000000000000000", "coordinatorRegistry": "0x09fb99968c016a3ff537bf58fb3d9fe55a7975d5", "coordinator": "0xd29e59e51e8ab5f94121efaeebd935ca4214e257", @@ -127,21 +123,20 @@ "etherToken": "0x0b1ba0af832d7c05fd64161e0db78e85978e8082", "exchange": "0x48bacb9266a570d521063ef5dd96e61686dbe788", "assetProxyOwner": "0x0000000000000000000000000000000000000000", - "erc20BridgeProxy": "0x8ea76477cfaca8f7ea06477fd3c09a740ac6012a", + "erc20BridgeProxy": "0x038f9b392fb9a9676dbaddf78ea5fdbf6c7d9710", "zeroExGovernor": "0x0000000000000000000000000000000000000000", - "libTransactionDecoder": "0xb48e1b16829c7f5bd62b76cb878a6bb1c4625d7a", - "forwarder": "0x5d3ad3561a1235273cbcb4e82fce63a0073d19be", + "forwarder": "0xe704967449b57b2382b7fa482718748c13c63190", "orderValidator": "0x0000000000000000000000000000000000000000", "dutchAuction": "0x0000000000000000000000000000000000000000", "coordinatorRegistry": "0xaa86dda78e9434aca114b6676fc742a18d15a1cc", "coordinator": "0x4d3d5c850dd5bd9d6f4adda3dd039a3c8054ca29", "multiAssetProxy": "0xcfc18cec799fbd1793b5c43e773c98d4d61cc2db", "staticCallProxy": "0x6dfff22588be9b3ef8cf0ad6dc9b84796f9fb45f", - "devUtils": "0xa31e64ea55b9b6bbb9d6a676738e9a5b23149f84", + "devUtils": "0x74341e87b1c4db7d5ed95f92b37509f2525a7a90", "exchangeV2": "0x48bacb9266a570d521063ef5dd96e61686dbe788", - "zrxVault": "0x1941ff73d1154774d87521d2d0aaad5d19c8df60", - "staking": "0x0d8b0dd11f5d34ed41d556def5f841900d5b1c6b", - "stakingProxy": "0x38ef19fdf8e8415f18c307ed71967e19aac28ba1", + "zrxVault": "0xc4df27466183c0fe2a5924d6ea56e334deff146a", + "staking": "0xf23276778860e420acfc18ebeebf7e829b06965c", + "stakingProxy": "0x8a063452f7df2614db1bca3a85ef35da40cf0835", "uniswapBridge": "0x0000000000000000000000000000000000000000", "eth2DaiBridge": "0x0000000000000000000000000000000000000000", "erc20BridgeSampler": "0x0000000000000000000000000000000000000000", diff --git a/packages/contract-addresses/src/index.ts b/packages/contract-addresses/src/index.ts index 4a38643e5d..56d231d8b0 100644 --- a/packages/contract-addresses/src/index.ts +++ b/packages/contract-addresses/src/index.ts @@ -14,7 +14,6 @@ export interface ContractAddresses { forwarder: string; coordinatorRegistry: string; coordinator: string; - libTransactionDecoder: string; multiAssetProxy: string; staticCallProxy: string; erc1155Proxy: string; diff --git a/packages/contract-artifacts/CHANGELOG.json b/packages/contract-artifacts/CHANGELOG.json index ad1a623918..2f9e274956 100644 --- a/packages/contract-artifacts/CHANGELOG.json +++ b/packages/contract-artifacts/CHANGELOG.json @@ -1,4 +1,17 @@ [ + { + "version": "3.5.0", + "changes": [ + { + "note": "Update `DevUtils` artifact", + "pr": 2464 + }, + { + "note": "Remove `LibTransactionDecoder` artifact", + "pr": 2464 + } + ] + }, { "timestamp": 1580988106, "version": "3.4.1", diff --git a/packages/contract-artifacts/artifacts/DevUtils.json b/packages/contract-artifacts/artifacts/DevUtils.json index 70d3c69d1c..0c25914b4f 100644 --- a/packages/contract-artifacts/artifacts/DevUtils.json +++ b/packages/contract-artifacts/artifacts/DevUtils.json @@ -5,8 +5,8 @@ "abi": [ { "inputs": [ - { "internalType": "address", "name": "_exchange", "type": "address" }, - { "internalType": "address", "name": "_chaiBridge", "type": "address" } + { "internalType": "address", "name": "exchange_", "type": "address" }, + { "internalType": "address", "name": "chaiBridge_", "type": "address" } ], "payable": false, "stateMutability": "nonpayable", @@ -23,31 +23,11 @@ }, { "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeAssetProxyDispatchError", - "outputs": [ - { - "internalType": "enum LibExchangeRichErrors.AssetProxyDispatchErrorCodes", - "name": "errorCode", - "type": "uint8" - }, - { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, - { "internalType": "bytes", "name": "assetData", "type": "bytes" } - ], + "inputs": [], + "name": "chaiBridgeAddress", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeAssetProxyExistsError", - "outputs": [ - { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" }, - { "internalType": "address", "name": "assetProxyAddress", "type": "address" } - ], - "payable": false, - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -59,33 +39,6 @@ "stateMutability": "pure", "type": "function" }, - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeAssetProxyTransferError", - "outputs": [ - { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, - { "internalType": "bytes", "name": "assetData", "type": "bytes" }, - { "internalType": "bytes", "name": "errorData", "type": "bytes" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeEIP1271SignatureError", - "outputs": [ - { "internalType": "address", "name": "verifyingContractAddress", "type": "address" }, - { "internalType": "bytes", "name": "data", "type": "bytes" }, - { "internalType": "bytes", "name": "signature", "type": "bytes" }, - { "internalType": "bytes", "name": "errorData", "type": "bytes" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": true, "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], @@ -140,56 +93,6 @@ "stateMutability": "pure", "type": "function" }, - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeExchangeInvalidContextError", - "outputs": [ - { - "internalType": "enum LibExchangeRichErrors.ExchangeContextErrorCodes", - "name": "errorCode", - "type": "uint8" - }, - { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, - { "internalType": "address", "name": "contextAddress", "type": "address" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeFillError", - "outputs": [ - { - "internalType": "enum LibExchangeRichErrors.FillErrorCodes", - "name": "errorCode", - "type": "uint8" - }, - { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeIncompleteFillError", - "outputs": [ - { - "internalType": "enum LibExchangeRichErrors.IncompleteFillErrorCode", - "name": "errorCode", - "type": "uint8" - }, - { "internalType": "uint256", "name": "expectedAssetFillAmount", "type": "uint256" }, - { "internalType": "uint256", "name": "actualAssetFillAmount", "type": "uint256" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": true, "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], @@ -203,87 +106,6 @@ "stateMutability": "pure", "type": "function" }, - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeNegativeSpreadError", - "outputs": [ - { "internalType": "bytes32", "name": "leftOrderHash", "type": "bytes32" }, - { "internalType": "bytes32", "name": "rightOrderHash", "type": "bytes32" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeOrderEpochError", - "outputs": [ - { "internalType": "address", "name": "makerAddress", "type": "address" }, - { "internalType": "address", "name": "orderSenderAddress", "type": "address" }, - { "internalType": "uint256", "name": "currentEpoch", "type": "uint256" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeOrderStatusError", - "outputs": [ - { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, - { "internalType": "enum LibOrder.OrderStatus", "name": "orderStatus", "type": "uint8" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeSignatureError", - "outputs": [ - { - "internalType": "enum LibExchangeRichErrors.SignatureErrorCodes", - "name": "errorCode", - "type": "uint8" - }, - { "internalType": "bytes32", "name": "hash", "type": "bytes32" }, - { "internalType": "address", "name": "signerAddress", "type": "address" }, - { "internalType": "bytes", "name": "signature", "type": "bytes" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeSignatureValidatorNotApprovedError", - "outputs": [ - { "internalType": "address", "name": "signerAddress", "type": "address" }, - { "internalType": "address", "name": "validatorAddress", "type": "address" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeSignatureWalletError", - "outputs": [ - { "internalType": "bytes32", "name": "hash", "type": "bytes32" }, - { "internalType": "address", "name": "signerAddress", "type": "address" }, - { "internalType": "bytes", "name": "signature", "type": "bytes" }, - { "internalType": "bytes", "name": "errorData", "type": "bytes" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": true, "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], @@ -300,27 +122,33 @@ }, { "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeTransactionError", + "inputs": [{ "internalType": "bytes", "name": "transactionData", "type": "bytes" }], + "name": "decodeZeroExTransactionData", "outputs": [ + { "internalType": "string", "name": "functionName", "type": "string" }, { - "internalType": "enum LibExchangeRichErrors.TransactionErrorCodes", - "name": "errorCode", - "type": "uint8" + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order[]", + "name": "orders", + "type": "tuple[]" }, - { "internalType": "bytes32", "name": "transactionHash", "type": "bytes32" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], - "name": "decodeTransactionExecutionError", - "outputs": [ - { "internalType": "bytes32", "name": "transactionHash", "type": "bytes32" }, - { "internalType": "bytes", "name": "errorData", "type": "bytes" } + { "internalType": "uint256[]", "name": "takerAssetFillAmounts", "type": "uint256[]" }, + { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" } ], "payable": false, "stateMutability": "pure", @@ -386,6 +214,42 @@ "stateMutability": "pure", "type": "function" }, + { + "constant": true, + "inputs": [], + "name": "erc1155ProxyAddress", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "erc20ProxyAddress", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "erc721ProxyAddress", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "exchangeAddress", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": false, "inputs": [ @@ -626,7 +490,7 @@ "name": "getSimulatedOrderMakerTransferResults", "outputs": [ { - "internalType": "enum OrderTransferSimulationUtils.OrderTransferResults", + "internalType": "enum LibOrderTransferSimulation.OrderTransferResults", "name": "orderTransferResults", "type": "uint8" } @@ -665,7 +529,7 @@ "name": "getSimulatedOrderTransferResults", "outputs": [ { - "internalType": "enum OrderTransferSimulationUtils.OrderTransferResults", + "internalType": "enum LibOrderTransferSimulation.OrderTransferResults", "name": "orderTransferResults", "type": "uint8" } @@ -704,7 +568,7 @@ "name": "getSimulatedOrdersTransferResults", "outputs": [ { - "internalType": "enum OrderTransferSimulationUtils.OrderTransferResults[]", + "internalType": "enum LibOrderTransferSimulation.OrderTransferResults[]", "name": "orderTransferResults", "type": "uint8[]" } @@ -757,20 +621,19 @@ "payable": false, "stateMutability": "pure", "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "staticCallProxyAddress", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" } ], "devdoc": { "methods": { - "decodeAssetProxyDispatchError(bytes)": { - "details": "Decompose an ABI-encoded AssetProxyDispatchError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "errorCode The error code.orderHash Hash of the order being dispatched.assetData Asset data of the order being dispatched." - }, - "decodeAssetProxyExistsError(bytes)": { - "details": "Decompose an ABI-encoded AssetProxyExistsError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "assetProxyId Id of asset proxy.assetProxyAddress The address of the asset proxy." - }, "decodeAssetProxyId(bytes)": { "details": "Decode AssetProxy identifier", "params": { @@ -778,16 +641,6 @@ }, "return": "The AssetProxy identifier" }, - "decodeAssetProxyTransferError(bytes)": { - "details": "Decompose an ABI-encoded AssetProxyTransferError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "orderHash Hash of the order being dispatched.assetData Asset data of the order being dispatched.errorData ABI-encoded revert data from the asset proxy." - }, - "decodeEIP1271SignatureError(bytes)": { - "details": "Decompose an ABI-encoded SignatureValidatorError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "signerAddress The expected signer of the hash.signature The full signature bytes.errorData The revert data thrown by the validator contract." - }, "decodeERC1155AssetData(bytes)": { "details": "Decode ERC-1155 asset data from the format described in the AssetProxy contract specification.", "params": { "assetData": "AssetProxy-compliant asset data describing an ERC-1155 set of assets." }, @@ -808,70 +661,20 @@ "params": { "assetData": "AssetProxy-compliant asset data describing an ERC-721 asset." }, "return": "The ERC-721 AssetProxy identifier, the address of the ERC-721 contract hosting this asset, and the identifier of the specific asset to be traded." }, - "decodeExchangeInvalidContextError(bytes)": { - "details": "Decompose an ABI-encoded OrderStatusError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "errorCode Error code that corresponds to invalid maker, taker, or sender.orderHash The order hash.contextAddress The maker, taker, or sender address" - }, - "decodeFillError(bytes)": { - "details": "Decompose an ABI-encoded FillError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "errorCode The error code.orderHash The order hash." - }, - "decodeIncompleteFillError(bytes)": { - "details": "Decompose an ABI-encoded IncompleteFillError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "orderHash Hash of the order being filled." - }, "decodeMultiAssetData(bytes)": { "details": "Decode multi-asset data from the format described in the AssetProxy contract specification.", "params": { "assetData": "AssetProxy-compliant data describing a multi-asset basket." }, "return": "The Multi-Asset AssetProxy identifier, an array of the amounts of the assets to be traded, and an array of the AssetProxy-compliant data describing each asset to be traded. Each element of the arrays corresponds to the same-indexed element of the other array." }, - "decodeNegativeSpreadError(bytes)": { - "details": "Decompose an ABI-encoded NegativeSpreadError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "leftOrderHash Hash of the left order being matched.rightOrderHash Hash of the right order being matched." - }, - "decodeOrderEpochError(bytes)": { - "details": "Decompose an ABI-encoded OrderEpochError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "makerAddress The order maker.orderSenderAddress The order sender.currentEpoch The current epoch for the maker." - }, - "decodeOrderStatusError(bytes)": { - "details": "Decompose an ABI-encoded OrderStatusError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "orderHash The order hash.orderStatus The order status." - }, - "decodeSignatureError(bytes)": { - "details": "Decompose an ABI-encoded SignatureError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "errorCode The error code.signerAddress The expected signer of the hash.signature The full signature." - }, - "decodeSignatureValidatorNotApprovedError(bytes)": { - "details": "Decompose an ABI-encoded SignatureValidatorNotApprovedError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "signerAddress The expected signer of the hash.validatorAddress The expected validator." - }, - "decodeSignatureWalletError(bytes)": { - "details": "Decompose an ABI-encoded SignatureWalletError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "errorCode The error code.signerAddress The expected signer of the hash.signature The full signature bytes.errorData The revert data thrown by the validator contract." - }, "decodeStaticCallAssetData(bytes)": { "details": "Decode StaticCall asset data from the format described in the AssetProxy contract specification.", "params": { "assetData": "AssetProxy-compliant asset data describing a StaticCall asset" }, "return": "The StaticCall AssetProxy identifier, the target address of the StaticCAll, the data to be passed to the target address, and the expected Keccak-256 hash of the static call return data." }, - "decodeTransactionError(bytes)": { - "details": "Decompose an ABI-encoded TransactionError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "errorCode The error code.transactionHash Hash of the transaction." - }, - "decodeTransactionExecutionError(bytes)": { - "details": "Decompose an ABI-encoded TransactionExecutionError.", - "params": { "encoded": "ABI-encoded revert error." }, - "return": "transactionHash Hash of the transaction.errorData Error thrown by exeucteTransaction()." + "decodeZeroExTransactionData(bytes)": { + "details": "Decodes the call data for an Exchange contract method call.", + "params": { "transactionData": "ABI-encoded calldata for an Exchange contract method call." }, + "return": "The name of the function called, and the parameters it was given. For single-order fills and cancels, the arrays will have just one element." }, "encodeERC1155AssetData(address,uint256[],uint256[],bytes)": { "details": "Encode ERC-1155 asset data into the format described in the AssetProxy contract specification.", @@ -1010,7 +813,7 @@ "return": "The indices of the first failed transfer (or 4 if all transfers are successful) for each order." }, "getTransferableAssetAmount(address,bytes)": { - "details": "Gets the amount of an asset transferable by the owner.", + "details": "Gets the amount of an asset transferable by the maker of an order.", "params": { "assetData": "Description of tokens, per the AssetProxy contract specification.", "ownerAddress": "Address of the owner of the asset." @@ -1025,10 +828,10 @@ }, "evm": { "bytecode": { - "object": "0x60806040523480156200001157600080fd5b5060405162005cff38038062005cff833981016040819052620000349162000409565b600080546001600160a01b0319166001600160a01b0384811691909117808355604051630c0e082160e31b81528392869286928492839285929116906360704108906200008d90630f47261b60e41b9060040162000447565b60206040518083038186803b158015620000a657600080fd5b505afa158015620000bb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620000e19190810190620003d9565b600180546001600160a01b0319166001600160a01b03928316179055600054604051630c0e082160e31b81529116906360704108906200012d9063012b8bc960e11b9060040162000447565b60206040518083038186803b1580156200014657600080fd5b505afa1580156200015b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001819190810190620003d9565b600280546001600160a01b0319166001600160a01b03928316179055600054604051630c0e082160e31b8152911690636070410890620001cd9063a7cb5fb760e01b9060040162000447565b60206040518083038186803b158015620001e657600080fd5b505afa158015620001fb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002219190810190620003d9565b600380546001600160a01b0319166001600160a01b03928316179055600054604051630c0e082160e31b81529116906360704108906200026d9063619ce88560e11b9060040162000447565b60206040518083038186803b1580156200028657600080fd5b505afa1580156200029b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002c19190810190620003d9565b600480546001600160a01b03199081166001600160a01b039384161790915560058054821693831693909317909255600680549092169381169390931790555060009250831615905062000316578162000318565b305b9050620003736040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b81525085846200038260201b620034e61760201c565b60075550620004759350505050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600060208284031215620003eb578081fd5b81516001600160a01b038116811462000402578182fd5b9392505050565b600080604083850312156200041c578081fd5b825162000429816200045c565b60208401519092506200043c816200045c565b809150509250929050565b6001600160e01b031991909116815260200190565b6001600160a01b03811681146200047257600080fd5b50565b61587a80620004856000396000f3fe608060405234801561001057600080fd5b50600436106102f45760003560e01c80639a7e752611610191578063ca49f47c116100e3578063d3d862d111610097578063e4e6e7da11610071578063e4e6e7da1461077e578063e77286eb1461079f578063ee4f5a94146107c1576102f4565b8063d3d862d114610729578063d46950281461073c578063e25cabf71461075c576102f4565b8063d001c5dc116100c8578063d001c5dc146106f0578063d186037f14610703578063d363790514610716576102f4565b8063ca49f47c146106ac578063cafd3a07146106cf576102f4565b8063a6627e9f11610145578063bbb2dcf61161011f578063bbb2dcf614610661578063bc03f96414610683578063c26cfecd146106a4576102f4565b8063a6627e9f14610618578063acaedc741461062b578063b43cffe11461064e576102f4565b8063a070cac811610176578063a070cac8146105d2578063a0901e51146105e5578063a5cd62ba146105f8576102f4565b80639a7e75261461058b5780639eadc835146105ae576102f4565b80634dfdac201161024a5780637914b2ec116101fe5780637b66ad34116101d85780637b66ad34146105445780637d727512146105655780638f4ce47914610578576102f4565b80637914b2ec146104f05780637982653e1461051157806379c9c42614610531576102f4565b806363eb39921161022f57806363eb39921461049857806365129042146104ab578063750bdb30146104cd576102f4565b80634dfdac2014610458578063590aa87514610478576102f4565b8063314853ff116102ac5780633db6dc61116102865780633db6dc61146103ff578063459be5e21461042257806346eb65cb14610443576102f4565b8063314853ff146103a8578063327d3054146103ca57806332aae3ad146103dd576102f4565b80630d7b7d76116102dd5780630d7b7d7614610345578063165979e1146103665780632322cf7614610388576102f4565b806302d0aec3146102f957806304a5618a14610323575b600080fd5b61030c610307366004614a21565b6107e3565b60405161031a92919061535e565b60405180910390f35b610336610331366004614a21565b61083f565b60405161031a93929190615488565b610358610353366004614603565b6108ba565b60405161031a92919061530c565b610379610374366004614a21565b6108dc565b60405161031a939291906155c3565b61039b610396366004614603565b610939565b60405161031a91906152c9565b6103bb6103b6366004614a21565b610961565b60405161031a93929190615333565b6103586103d8366004614a21565b6109a8565b6103f06103eb366004614a21565b6109ea565b60405161031a93929190615539565b61041261040d366004614a21565b610a3d565b60405161031a94939291906152d2565b610435610430366004614a21565b610a87565b60405161031a9291906155ac565b610456610451366004614a21565b610add565b005b61046b61046636600461452a565b610c5f565b60405161031a9190615263565b61048b610486366004614341565b610ce2565b60405161031a91906154e8565b61048b6104a6366004614647565b610d52565b6104be6104b9366004614a21565b610dc8565b60405161031a9392919061502f565b6104e06104db366004614a21565b610e02565b60405161031a94939291906153b3565b6105036104fe366004614a21565b610e99565b60405161031a929190615390565b61052461051f366004614ab8565b610ed1565b60405161031a91906155de565b61039b61053f366004614bc0565b61118c565b610557610552366004614a21565b611215565b60405161031a929190615015565b61039b610573366004614603565b61124d565b610503610586366004614a21565b6118a4565b61059e610599366004614a21565b61191a565b60405161031a94939291906155f2565b6105c16105bc366004614a21565b61197b565b60405161031a9594939291906153ef565b61039b6105e0366004614b67565b611a0c565b61046b6105f33660046146c9565b611a8d565b61060b6106063660046146fc565b611b06565b60405161031a919061517b565b61048b61062636600461469e565b611bc9565b61063e610639366004614a21565b611c22565b60405161031a94939291906150d7565b61048b61065c366004614578565b611c5e565b61067461066f366004614a21565b611cd6565b60405161031a939291906154b3565b610696610691366004614a21565b611d50565b60405161031a92919061531a565b61039b611d89565b6106bf6106ba366004614a21565b611d8f565b60405161031a9493929190615445565b6106e26106dd366004614a21565b611e19565b60405161031a929190615629565b61046b6106fe36600461452a565b611e67565b61039b610711366004614603565b611ed5565b610524610724366004614ab8565b6126c7565b61048b6107373660046147cd565b612a77565b61074f61074a366004614a21565b612a96565b60405161031a919061537b565b61076f61076a366004614776565b612b91565b60405161031a939291906151c8565b61079161078c36600461452a565b612cc9565b60405161031a9291906152a4565b6107b26107ad366004614b10565b612ce2565b60405161031a939291906156db565b6107d46107cf366004614a21565b612fa4565b60405161031a93929190615582565b6000806107f7836107f2612fe1565b613005565b600061081060048551866130459092919063ffffffff16565b80602001905161082391908101906149d4565b909350905060ff8116600681111561083757fe5b915050915091565b60008080610853848263ffffffff61308816565b92506001600160e01b0319831663012b8bc960e11b1461088e5760405162461bcd60e51b8152600401610885906156a4565b60405180910390fd5b61089f84601063ffffffff6130bc16565b91506108b284602463ffffffff6130ef16565b929491935050565b6000806108c7848461124d565b91506108d38484611ed5565b90509250929050565b60008060006108ed846107f26130fb565b600061090660048651876130459092919063ffffffff16565b8060200190516109199190810190614d92565b9094509250905060ff8116600281111561092f57fe5b9350509193909250565b600080600061094885856108ba565b91509150610956828261311f565b925050505b92915050565b6000606080610972846107f2613135565b835161098890859060049063ffffffff61304516565b80602001905161099b9190810190614974565b9196909550909350915050565b6000806109b7836107f2613159565b82516109cd90849060049063ffffffff61304516565b8060200190516109e09190810190614916565b9094909350915050565b60008060606109fb846107f261317d565b6000610a1460048651876130459092919063ffffffff16565b806020019051610a279190810190614d52565b9094509250905060ff8116600181111561092f57fe5b600080606080610a4f856107f26131a1565b8451610a6590869060049063ffffffff61304516565b806020019051610a7891908101906148d2565b92989197509550909350915050565b600080610a96836107f26131c5565b6000610aaf60048551866130459092919063ffffffff16565b806020019051610ac29190810190614c90565b9250905060ff81166003811115610ad557fe5b925050915091565b6000610aef828263ffffffff61308816565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415610b3357610b2c826118a4565b5050610c5b565b6001600160e01b0319811663012b8bc960e11b1415610b5d57610b558261083f565b505050610c5b565b6001600160e01b031981167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415610ba257610b988261197b565b5050505050610c5b565b6001600160e01b031981166394cfcdd760e01b1415610bc457610b5582611cd6565b6001600160e01b031981167fc339d10a000000000000000000000000000000000000000000000000000000001415610c0857610bff82611d8f565b50505050610c5b565b6001600160e01b031981167fdc1600f3000000000000000000000000000000000000000000000000000000001415610c4357610bff82610e02565b60405162461bcd60e51b8152600401610885906156a4565b5050565b606060008251905080604051908082528060200260200182016040528015610c91578160200160208202803883390190505b50915060005b818114610cda57610cbb85858381518110610cae57fe5b6020026020010151611ed5565b838281518110610cc757fe5b6020908102919091010152600101610c97565b505092915050565b6040516060907ff47261b00000000000000000000000000000000000000000000000000000000090610d18908490602401615001565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b919050565b6040516060907fc339d10a0000000000000000000000000000000000000000000000000000000090610d8c908690869086906024016150a5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b9392505050565b6000806000610dd9846107f26131e9565b8351610def90859060049063ffffffff61304516565b80602001905161099b91908101906143f8565b600080806060610e18858363ffffffff61308816565b93506001600160e01b031984167fdc1600f30000000000000000000000000000000000000000000000000000000014610e635760405162461bcd60e51b8152600401610885906156a4565b8451610e7990869060049063ffffffff61320d16565b806020019051610e8c9190810190614396565b9597919650949350915050565b600080610ea8836107f261328d565b8251610ebe90849060049063ffffffff61304516565b8060200190516109e091908101906149f8565b6000610edb613f0c565b610f6c8584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b505afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f669190810190614c78565b3a6132b1565b60408051600280825260608281019093529293509091816020015b6060815260200190600190039081610f8757505060408051600280825260608083018452939450909160208301908038833950506040805160028082526060808301845294955090925090602083019080388339505060408051600280825260608083018452949550909250906020830190803883390190505090508861014001518460008151811061101657fe5b602002602001018190525088600001518360008151811061103357fe5b6001600160a01b039283166020918202929092010152881615611056578761106c565b73377f698c4c287018d09b516f415317aec59193325b8260008151811061107957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460000151816000815181106110ab57fe5b602002602001018181525050886101800151846001815181106110ca57fe5b60200260200101819052508860000151836001815181106110e757fe5b6001600160a01b03928316602091820292909201015260408a01511615611112578860400151611128565b73377f698c4c287018d09b516f415317aec59193325b8260018151811061113557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160018151811061116757fe5b60200260200101818152505061117f84848484613328565b9998505050505050505050565b600061120d846112086040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876134e6565b61353d565b949350505050565b600080611224836107f2613551565b825161123a90849060049063ffffffff61304516565b8060200190516109e0919081019061435d565b600080611260838263ffffffff61308816565b90506001600160e01b031981167ff47261b00000000000000000000000000000000000000000000000000000000014156112bb5760006112a784601063ffffffff6130bc16565b90506112b38186613575565b92505061189d565b6001600160e01b0319811663012b8bc960e11b1415611413576000806112e08561083f565b6040519194509250606091507f6352211e000000000000000000000000000000000000000000000000000000009061131c9084906024016152c9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b03168360405161136d9190614fe5565b600060405180830381855afa9150503d80600081146113a8576040519150601f19603f3d011682016040523d82523d6000602084013e6113ad565b606091505b509150915060008280156113c2575081516020145b6113cd5760006113de565b6113de82600c63ffffffff6130bc16565b9050896001600160a01b0316816001600160a01b031614611400576000611403565b60015b60ff16975050505050505061189d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156116035760006060806114538661197b565b5081519296509094509250905060005b8181146115f95782818151811061147657fe5b60200260200101516000141561148b576115f1565b83516060907efdd58e00000000000000000000000000000000000000000000000000000000908b908790859081106114bf57fe5b60200260200101516040516024016114d892919061510b565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060876001600160a01b0316836040516115299190614fe5565b600060405180830381855afa9150503d8060008114611564576040519150601f19603f3d011682016040523d82523d6000602084013e611569565b606091505b5091509150600082801561157e575081516020145b61158957600061159a565b61159a82600063ffffffff6130ef16565b905060008786815181106115aa57fe5b602002602001015182816115ba57fe5b049050806115d65760009b50505050505050505050505061095b565b8b8110806115e257508b155b156115eb57809b505b50505050505b600101611463565b505050505061189d565b6001600160e01b031981167fc339d10a000000000000000000000000000000000000000000000000000000001415611721576040516060907fa85e59e40000000000000000000000000000000000000000000000000000000090611672908690600090819081906024016154fb565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260045491519092506000916001600160a01b0316906116c4908490614fe5565b600060405180830381855afa9150503d80600081146116ff576040519150601f19603f3d011682016040523d82523d6000602084013e611704565b606091505b5050905080611714576000611718565b6000195b9350505061189d565b6001600160e01b031981167fdc1600f30000000000000000000000000000000000000000000000000000000014156117c85760008061175f85610e02565b50925092505061176d613678565b6001600160a01b0316826001600160a01b031614801561179a57506005546001600160a01b038281169116145b156117c15760006117b26117ac613690565b88613575565b90506117bd816136a8565b9450505b505061189d565b6001600160e01b031981166394cfcdd760e01b141561189d576060806117ed85611cd6565b80519194509250905060005b8181146118985783818151811061180c57fe5b60200260200101516000141561182157611890565b60006118408985848151811061183357fe5b602002602001015161124d565b9050600085838151811061185057fe5b6020026020010151828161186057fe5b0490508061187857600097505050505050505061095b565b87811080611884575087155b1561188d578097505b50505b6001016117f9565b505050505b5092915050565b6000806118b7838263ffffffff61308816565b91506001600160e01b031982167ff47261b000000000000000000000000000000000000000000000000000000000146119025760405162461bcd60e51b8152600401610885906156a4565b61191383601063ffffffff6130bc16565b9050915091565b6000806000606061192d856107f26138a6565b600061194660048751886130459092919063ffffffff16565b8060200190516119599190810190614cf4565b91965094509250905060ff8116600681111561197157fe5b9450509193509193565b60008060608080611992868563ffffffff61308816565b94506001600160e01b031985167fa7cb5fb700000000000000000000000000000000000000000000000000000000146119dd5760405162461bcd60e51b8152600401610885906156a4565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b600061120d84611a886040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876134e6565b6138ca565b6060808251604051908082528060200260200182016040528015611abb578160200160208202803883390190505b50905060005b8351811461189d57838181518110611ad557fe5b60200260200101516001600160a01b031631828281518110611af357fe5b6020908102919091010152600101611ac1565b606060008451905080604051908082528060200260200182016040528015611b38578160200160208202803883390190505b50915060005b818114611bc057611b89868281518110611b5457fe5b6020026020010151868381518110611b6857fe5b6020026020010151868481518110611b7c57fe5b60200260200101516126c7565b838281518110611b9557fe5b60200260200101906004811115611ba857fe5b90816004811115611bb557fe5b905250600101611b3e565b50509392505050565b60405160609063012b8bc960e11b90611be8908590859060240161510b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905092915050565b60006060806060611c35856107f26138d9565b8451611c4b90869060049063ffffffff61304516565b806020019051610a789190810190614492565b6040516060907fa7cb5fb70000000000000000000000000000000000000000000000000000000090611c9a908790879087908790602401615053565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050949350505050565b6000606080611ceb848463ffffffff61308816565b92506001600160e01b031983166394cfcdd760e01b14611d1d5760405162461bcd60e51b8152600401610885906156a4565b8351611d3390859060049063ffffffff61320d16565b806020019051611d469190810190614802565b9395909450915050565b60006060611d60836107f26138fd565b8251611d7690849060049063ffffffff61304516565b8060200190516109e09190810190614939565b60075481565b600080606081611da5858263ffffffff61308816565b93506001600160e01b031984167fc339d10a0000000000000000000000000000000000000000000000000000000014611df05760405162461bcd60e51b8152600401610885906156a4565b8451611e0690869060049063ffffffff61320d16565b806020019051610e8c919081019061443a565b600080611e28836107f2613921565b6000611e4160048551866130459092919063ffffffff16565b806020019051611e549190810190614c90565b9250905060ff81166001811115610ad557fe5b606060008251905080604051908082528060200260200182016040528015611e99578160200160208202803883390190505b50915060005b818114610cda57611eb68585838151811061183357fe5b838281518110611ec257fe5b6020908102919091010152600101611e9f565b600080611ee8838263ffffffff61308816565b90506001600160e01b031981166394cfcdd760e01b1415611fb857606080611f0f85611cd6565b80519194509250905060005b818114611fad57838181518110611f2e57fe5b602002602001015160001415611f4357611fa5565b6000611f5589858481518110610cae57fe5b90506000858381518110611f6557fe5b60200260200101518281611f7557fe5b04905080611f8d57600097505050505050505061095b565b87811080611f99575087155b15611fa2578097505b50505b600101611f1b565b5061095b9350505050565b6001600160e01b031981167ff47261b000000000000000000000000000000000000000000000000000000000141561210e576000611ffd84601063ffffffff6130bc16565b6001546040519192506060917fdd62ed3e00000000000000000000000000000000000000000000000000000000916120439189916001600160a01b031690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b0316836040516120949190614fe5565b600060405180830381855afa9150503d80600081146120cf576040519150601f19603f3d011682016040523d82523d6000602084013e6120d4565b606091505b50915091508180156120e7575080516020145b6120f2576000612103565b61210381600063ffffffff6130ef16565b95505050505061189d565b6001600160e01b0319811663012b8bc960e11b1415612373576000806121338561083f565b600254604051929550909350606092507fe985e9c5000000000000000000000000000000000000000000000000000000009161217f918a916001600160a01b0390911690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516121d09190614fe5565b600060405180830381855afa9150503d806000811461220b576040519150601f19603f3d011682016040523d82523d6000602084013e612210565b606091505b509150915081158061222457508051602014155b80612240575061223b81600063ffffffff6130ef16565b600114155b15612364576040516060907f081812fc000000000000000000000000000000000000000000000000000000009061227b9087906024016152c9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050856001600160a01b0316816040516122c89190614fe5565b600060405180830381855afa9150503d8060008114612303576040519150601f19603f3d011682016040523d82523d6000602084013e612308565b606091505b50909350915082801561231c575081516020145b801561234b57506002546001600160a01b031661234083600c63ffffffff6130bc16565b6001600160a01b0316145b612356576000612359565b60015b60ff169750506115f9565b6000199650505050505061189d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156124d35760006123b08461197b565b5050600354604051929450606093507fe985e9c500000000000000000000000000000000000000000000000000000000926123fa925089916001600160a01b031690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b03168360405161244b9190614fe5565b600060405180830381855afa9150503d8060008114612486576040519150601f19603f3d011682016040523d82523d6000602084013e61248b565b606091505b509150915081801561249e575080516020145b80156124ba57506124b681600063ffffffff6130ef16565b6001145b6124c5576000612103565b60001995505050505061189d565b6001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000141561250f57600019915061189d565b6001600160e01b031981167fdc1600f300000000000000000000000000000000000000000000000000000000141561189d5760008061254d85610e02565b50925092505061255b613678565b6001600160a01b0316826001600160a01b031614801561258857506005546001600160a01b038281169116145b156126be576005546040516060917fdd62ed3e00000000000000000000000000000000000000000000000000000000916125d2918a916001600160a01b0390911690602401615015565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905060006060612612613690565b6001600160a01b0316836040516126299190614fe5565b600060405180830381855afa9150503d8060008114612664576040519150601f19603f3d011682016040523d82523d6000602084013e612669565b606091505b5091509150600082801561267e575081516020145b61268957600061269a565b61269a82600063ffffffff6130ef16565b905060001981146126b3576126ae816136a8565b6126b7565b6000195b9750505050505b50505092915050565b60006126d1613f0c565b6127248584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b60408051600480825260a0820190925291925060609190816020015b606081526020019060019003908161274057505060408051600480825260a082019092529192506060919060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339019050509050886101600151846000815181106127d657fe5b602002602001018190525087836000815181106127ef57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088600001518260008151811061282157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050868160008151811061284f57fe5b6020026020010181815250508861014001518460018151811061286e57fe5b602002602001018190525088600001518360018151811061288b57fe5b6001600160a01b0392831660209182029290920101528816156128ae57876128c4565b73377f698c4c287018d09b516f415317aec59193325b826001815181106128d157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084600001518160018151811061290357fe5b602002602001018181525050886101a001518460028151811061292257fe5b6020026020010181905250878360028151811061293b57fe5b6001600160a01b03928316602091820292909201015260408a0151161561296657886040015161297c565b73377f698c4c287018d09b516f415317aec59193325b8260028151811061298957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460600151816002815181106129bb57fe5b602002602001018181525050886101800151846003815181106129da57fe5b60200260200101819052508860000151836003815181106129f757fe5b6001600160a01b03928316602091820292909201015260408a01511615612a22578860400151612a38565b73377f698c4c287018d09b516f415317aec59193325b82600381518110612a4557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160038151811061116757fe5b6040516060906394cfcdd760e01b90611be89085908590602401615276565b6000612aa8828263ffffffff61308816565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001480612af257506001600160e01b0319811663012b8bc960e11b145b80612b2657506001600160e01b031981167fa7cb5fb700000000000000000000000000000000000000000000000000000000145b80612b4157506001600160e01b031981166394cfcdd760e01b145b80612b7557506001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000145b610d4d5760405162461bcd60e51b8152600401610885906156a4565b606080606060008551905080604051908082528060200260200182016040528015612bd657816020015b612bc3613f3b565b815260200190600190039081612bbb5790505b50935080604051908082528060200260200182016040528015612c03578160200160208202803883390190505b50925080604051908082528060200260200182016040528015612c30578160200160208202803883390190505b50915060005b818114612cc057612c6d878281518110612c4c57fe5b6020026020010151878381518110612c6057fe5b6020026020010151612ce2565b8751889085908110612c7b57fe5b60200260200101878581518110612c8e57fe5b60200260200101878681518110612ca157fe5b9315156020948502919091019093019290925291905252600101612c36565b50509250925092565b606080612cd68484611e67565b91506108d38484610c5f565b612cea613f3b565b6006546040517f9d3fa4b900000000000000000000000000000000000000000000000000000000815260009182916001600160a01b0390911690639d3fa4b990612d389088906004016156ff565b60606040518083038186803b158015612d5057600080fd5b505afa158015612d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d889190810190614a70565b85516006546040517fa12dcc6f00000000000000000000000000000000000000000000000000000000815292955090916001600160a01b039091169063a12dcc6f90612dda9089908990600401615712565b60206040518083038186803b158015612df257600080fd5b505afa158015612e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e2a91908101906148b2565b91506000612e3d82886101400151610939565b60a088015160c08901516101808a01516101408b015193945091929091600091612e6c9163ffffffff61394516565b15612e9957612e9284612e8c848d6080015161396a90919063ffffffff16565b85613986565b9050612ef2565b81612ead57612e92848b6080015185613986565b6000612ebe868c6101800151610939565b90506000612ed1868d6080015187613986565b90506000612ee0838688613986565b9050612eec828261311f565b93505050505b612f12612f0c8960400151856139a890919063ffffffff16565b8261311f565b96506004612f258b8c602001518a610ed1565b6004811115612f3057fe5b14612f3c576000612f3e565b865b9650612f4e8a61016001516139c7565b612f5757600096505b60e08a015115801590612f755750612f738a6101a001516139c7565b155b15612f7f57600096505b600388516006811115612f8e57fe5b14612f9857600096505b50505050509250925092565b6000806000612fb5846107f2613ab1565b6000612fce60048651876130459092919063ffffffff16565b8060200190516109199190810190614cbd565b7ffdb6ca8d0000000000000000000000000000000000000000000000000000000090565b6000613012836000613088565b90506001600160e01b0319808216908316146130405760405162461bcd60e51b81526004016108859061566d565b505050565b6060818311156130635761306361305e60008585613ad5565b613af4565b835182111561307c5761307c61305e6001848751613ad5565b50819003910190815290565b600081600401835110156130a9576130a961305e6003855185600401613ad5565b5001602001516001600160e01b03191690565b600081601401835110156130dd576130dd61305e6004855185601401613ad5565b5001601401516001600160a01b031690565b6000610dc18383613afc565b7f18e4b1410000000000000000000000000000000000000000000000000000000090565b600081831061312e5781610dc1565b5090919050565b7f4678472b0000000000000000000000000000000000000000000000000000000090565b7fb6555d6f0000000000000000000000000000000000000000000000000000000090565b7f488219a60000000000000000000000000000000000000000000000000000000090565b7f1b8388f70000000000000000000000000000000000000000000000000000000090565b7fe94a7ed00000000000000000000000000000000000000000000000000000000090565b7f4ad312750000000000000000000000000000000000000000000000000000000090565b6060818311156132265761322661305e60008585613ad5565b835182111561323f5761323f61305e6001848751613ad5565b8282036040519080825280601f01601f19166020018201604052801561326c576020820181803883390190505b509050610dc161327b82613b26565b8461328587613b26565b018351613b2c565b7f11c7b7200000000000000000000000000000000000000000000000000000000090565b6132b9613f0c565b6020810184905260a085015160808601516132d5918691613bd1565b815260a085015160c08601516132ec918691613bd1565b604082015260a085015160e0860151613306918691613bd1565b606082015261331b828463ffffffff613c0516565b6080820152949350505050565b6040516000906060907fb04fbddd0000000000000000000000000000000000000000000000000000000090613367908890889088908890602401615124565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260065491519092506060916001600160a01b0316906133b9908490614fe5565b6000604051808303816000865af19150503d80600081146133f6576040519150601f19603f3d011682016040523d82523d6000602084013e6133fb565b606091505b50915060009050613412828263ffffffff61308816565b905061341c61317d565b6001600160e01b03198281169116141561345957600061343b836109ea565b5091505060ff8116600481111561344e57fe5b94505050505061120d565b613461613135565b6001600160e01b03198281169116141561349457600061348083610961565b509091505060ff8116600481111561344e57fe5b815160208301207ff43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce014156134ce576004935050505061120d565b60405162461bcd60e51b815260040161088590615636565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b6000610dc18261354c85613c36565b613cb1565b7fa15c0d060000000000000000000000000000000000000000000000000000000090565b6040516000906060907f70a0823100000000000000000000000000000000000000000000000000000000906135ae908590602401615001565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060856001600160a01b0316836040516135ff9190614fe5565b600060405180830381855afa9150503d806000811461363a576040519150601f19603f3d011682016040523d82523d6000602084013e61363f565b606091505b5091509150818015613652575080516020145b61365d57600061366e565b61366e81600063ffffffff6130ef16565b9695505050505050565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b6000806136b3613690565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156136ed57600080fd5b505af1158015613701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137259190810190614a54565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561376457600080fd5b505af1158015613778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061379c9190810190614c78565b421161381a57816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156137dd57600080fd5b505af11580156137f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506138159190810190614c78565b61388d565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561385557600080fd5b505af1158015613869573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061388d9190810190614c78565b905061120d816b033b2e3c9fd0803ce800000086613986565b7f7e5a23180000000000000000000000000000000000000000000000000000000090565b6000610dc18261354c85613ceb565b7f5bd0428d0000000000000000000000000000000000000000000000000000000090565b7f20d11f610000000000000000000000000000000000000000000000000000000090565b7ff59851840000000000000000000000000000000000000000000000000000000090565b600081518351148015610dc15750508051602091820120825192909101919091201490565b600082820183811015610dc157610dc161305e60008686613da4565b600061120d8361399c868563ffffffff613c0516565b9063ffffffff613dc316565b6000828211156139c1576139c161305e60028585613da4565b50900390565b600060208251816139d457fe5b066004146139e457506000610d4d565b60006139f6838263ffffffff61308816565b90506001600160e01b031981166394cfcdd760e01b14613a1a576001915050610d4d565b606080613a2685611cd6565b80519194509250905060005b818114613aa4576000613a626000858481518110613a4c57fe5b602002602001015161308890919063ffffffff16565b90506001600160e01b0319811663012b8bc960e11b1415613a9b57613a878483613ded565b15613a9b5760009650505050505050610d4d565b50600101613a32565b5060019695505050505050565b7fe53c76c80000000000000000000000000000000000000000000000000000000090565b6060632800659560e01b848484604051602401610d8c939291906155d0565b805160208201fd5b60008160200183511015613b1d57613b1d61305e6005855185602001613ad5565b50016020015190565b60200190565b6020811015613b56576001816020036101000a038019835116818551168082178652505050613040565b82821415613b6357613040565b82821115613b9d5760208103905080820181840181515b82851015613b95578451865260209586019590940193613b7a565b905250613040565b60208103905080820181840183515b81861215613bc85782518252601f199283019290910190613bac565b85525050505050565b6000613bde848484613e50565b15613bf157613bf161305e858585613eb6565b61120d8361399c868563ffffffff613c0516565b600082613c145750600061095b565b82820282848281613c2157fe5b0414610dc157610dc161305e60018686613da4565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613d3757fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b606063e946c1bb60e01b848484604051602401610d8c93929190615561565b600081613dd957613dd961305e60038585613da4565b6000828481613de457fe5b04949350505050565b8151600090600183015b81811015610cda57613e38858281518110613e0e57fe5b6020026020010151868681518110613e2257fe5b602002602001015161394590919063ffffffff16565b15613e485760019250505061095b565b600101613df7565b600082613e6257613e6261305e613ed5565b811580613e6d575083155b15613e7a57506000610dc1565b60008380613e8457fe5b8584099050613e99858463ffffffff613c0516565b613eab826103e863ffffffff613c0516565b101595945050505050565b606063339f3de260e01b848484604051602401610d8c93929190615737565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b803561095b81615813565b600082601f830112613f78578081fd5b8135613f8b613f8682615774565b61574d565b818152915060208083019084810181840286018201871015613fac57600080fd5b60005b84811015611898578135613fc281615813565b84529282019290820190600101613faf565b600082601f830112613fe4578081fd5b8151613ff2613f8682615774565b8181529150602080830190840160005b8381101561402f5761401a876020845189010161419b565b83526020928301929190910190600101614002565b5050505092915050565b600082601f830112614049578081fd5b8135614057613f8682615774565b8181529150602080830190840160005b8381101561402f5761407f876020843589010161414d565b83526020928301929190910190600101614067565b600082601f8301126140a4578081fd5b81356140b2613f8682615774565b8181529150602080830190840160005b8381101561402f576140da87602084358901016141e1565b835260209283019291909101906001016140c2565b600082601f8301126140ff578081fd5b813561410d613f8682615774565b81815291506020808301908481018184028601820187101561412e57600080fd5b60005b8481101561189857813584529282019290820190600101614131565b600082601f83011261415d578081fd5b813561416b613f8682615794565b915080825283602082850101111561418257600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126141ab578081fd5b81516141b9613f8682615794565b91508082528360208285010111156141d057600080fd5b61189d8160208401602086016157b8565b60006101c08083850312156141f4578182fd5b6141fd8161574d565b91505061420a8383613f5d565b81526142198360208401613f5d565b602082015261422b8360408401613f5d565b604082015261423d8360608401613f5d565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561429f57600080fd5b6142ab8683870161414d565b838501526101609250828501359150808211156142c757600080fd5b6142d38683870161414d565b838501526101809250828501359150808211156142ef57600080fd5b6142fb8683870161414d565b838501526101a092508285013591508082111561431757600080fd5b506143248582860161414d565b82840152505092915050565b805160ff8116811461095b57600080fd5b600060208284031215614352578081fd5b8135610dc181615813565b6000806040838503121561436f578081fd5b825161437a81615813565b602084015190925061438b81615813565b809150509250929050565b6000806000606084860312156143aa578081fd5b83516143b581615813565b60208501519093506143c681615813565b604085015190925067ffffffffffffffff8111156143e2578182fd5b6143ee8682870161419b565b9150509250925092565b60008060006060848603121561440c578081fd5b835161441781615813565b602085015190935061442881615813565b80925050604084015190509250925092565b60008060006060848603121561444e578081fd5b835161445981615813565b602085015190935067ffffffffffffffff811115614475578182fd5b6144818682870161419b565b925050604084015190509250925092565b600080600080608085870312156144a7578182fd5b84516144b281615813565b602086015190945067ffffffffffffffff808211156144cf578384fd5b6144db8883890161419b565b945060408701519150808211156144f0578384fd5b6144fc8883890161419b565b93506060870151915080821115614511578283fd5b5061451e8782880161419b565b91505092959194509250565b6000806040838503121561453c578182fd5b823561454781615813565b9150602083013567ffffffffffffffff811115614562578182fd5b61456e85828601614039565b9150509250929050565b6000806000806080858703121561458d578182fd5b843561459881615813565b9350602085013567ffffffffffffffff808211156145b4578384fd5b6145c0888389016140ef565b945060408701359150808211156145d5578384fd5b6145e1888389016140ef565b935060608701359150808211156145f6578283fd5b5061451e8782880161414d565b60008060408385031215614615578182fd5b823561462081615813565b9150602083013567ffffffffffffffff81111561463b578182fd5b61456e8582860161414d565b60008060006060848603121561465b578081fd5b833561466681615813565b9250602084013567ffffffffffffffff811115614681578182fd5b61468d8682870161414d565b925050604084013590509250925092565b600080604083850312156146b0578182fd5b82356146bb81615813565b946020939093013593505050565b6000602082840312156146da578081fd5b813567ffffffffffffffff8111156146f0578182fd5b61120d84828501613f68565b600080600060608486031215614710578081fd5b833567ffffffffffffffff80821115614727578283fd5b61473387838801614094565b94506020860135915080821115614748578283fd5b61475487838801613f68565b93506040860135915080821115614769578283fd5b506143ee868287016140ef565b60008060408385031215614788578182fd5b823567ffffffffffffffff8082111561479f578384fd5b6147ab86838701614094565b935060208501359150808211156147c0578283fd5b5061456e85828601614039565b600080604083850312156147df578182fd5b823567ffffffffffffffff808211156147f6578384fd5b6147ab868387016140ef565b60008060408385031215614814578182fd5b825167ffffffffffffffff8082111561482b578384fd5b81850186601f82011261483c578485fd5b8051925061484c613f8684615774565b80848252602080830192508084018a82838902870101111561486c578889fd5b8894505b8685101561488e578051845260019490940193928101928101614870565b5088015190965093505050808211156148a5578283fd5b5061456e85828601613fd4565b6000602082840312156148c3578081fd5b81518015158114610dc1578182fd5b600080600080608085870312156148e7578182fd5b8451935060208501516148f981615813565b604086015190935067ffffffffffffffff808211156144f0578384fd5b60008060408385031215614928578182fd5b505080516020909101519092909150565b6000806040838503121561494b578182fd5b82519150602083015167ffffffffffffffff811115614968578182fd5b61456e8582860161419b565b600080600060608486031215614988578081fd5b83519250602084015167ffffffffffffffff808211156149a6578283fd5b6149b28783880161419b565b935060408601519150808211156149c7578283fd5b506143ee8682870161419b565b600080604083850312156149e6578182fd5b82519150602083015161438b81615828565b60008060408385031215614a0a578182fd5b82516001600160e01b03198116811461437a578283fd5b600060208284031215614a32578081fd5b813567ffffffffffffffff811115614a48578182fd5b61120d8482850161414d565b600060208284031215614a65578081fd5b8151610dc181615813565b600060608284031215614a81578081fd5b614a8b606061574d565b825160078110614a99578283fd5b8152602083810151908201526040928301519281019290925250919050565b600080600060608486031215614acc578081fd5b833567ffffffffffffffff811115614ae2578182fd5b614aee868287016141e1565b9350506020840135614aff81615813565b929592945050506040919091013590565b60008060408385031215614b22578182fd5b823567ffffffffffffffff80821115614b39578384fd5b614b45868387016141e1565b93506020850135915080821115614b5a578283fd5b5061456e8582860161414d565b600080600060608486031215614b7b578081fd5b833567ffffffffffffffff811115614b91578182fd5b614b9d868287016141e1565b935050602084013591506040840135614bb581615813565b809150509250925092565b600080600060608486031215614bd4578081fd5b833567ffffffffffffffff80821115614beb578283fd5b81860160a08189031215614bfd578384fd5b614c0760a061574d565b9250803583526020810135602084015260408101356040840152614c2e8860608301613f5d565b6060840152608081013582811115614c44578485fd5b614c508982840161414d565b608085015250919450505060208401359150614c6f8560408601613f5d565b90509250925092565b600060208284031215614c89578081fd5b5051919050565b60008060408385031215614ca2578182fd5b8251614cad81615828565b6020939093015192949293505050565b600080600060608486031215614cd1578081fd5b8351614cdc81615828565b602085015160408601519194509250614bb581615813565b60008060008060808587031215614d09578182fd5b614d138686614330565b9350602085015192506040850151614d2a81615813565b606086015190925067ffffffffffffffff811115614d46578182fd5b61451e8782880161419b565b600080600060608486031215614d66578081fd5b614d708585614330565b925060208401519150604084015167ffffffffffffffff8111156143e2578182fd5b600080600060608486031215614da6578081fd5b614db08585614330565b925060208401519150604084015190509250925092565b6001600160a01b03169052565b6000815180845260208401935060208301825b82811015614e0e5781516001600160a01b0316865260209586019590910190600101614de7565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b84811015614e63578284038852614e4d848351614ea0565b6020988901989094509190910190600101614e35565b50919695505050505050565b6000815180845260208401935060208301825b82811015614e0e578151865260209586019590910190600101614e82565b60008151808452614eb88160208601602086016157b8565b601f01601f19169290920160200192915050565b8051614ed781615809565b825260208181015190830152604090810151910152565b60006101c0614efe848451614dc7565b6020830151614f106020860182614dc7565b506040830151614f236040860182614dc7565b506060830151614f366060860182614dc7565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518186015250610120808401518186015250610140808401518282870152614f8f83870182614ea0565b91505061016091508184015185820383870152614fac8282614ea0565b925050506101808084015185830382870152614fc88382614ea0565b9150506101a09150818401518582038387015261366e8282614ea0565b60008251614ff78184602087016157b8565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006001600160a01b0386168252608060208301526150756080830186614e6f565b82810360408401526150878186614e6f565b83810360608501526150998186614ea0565b98975050505050505050565b60006001600160a01b0385168252606060208301526150c76060830185614ea0565b9050826040830152949350505050565b60006001600160a01b0386168252608060208301526150f96080830186614ea0565b82810360408401526150878186614ea0565b6001600160a01b03929092168252602082015260400190565b6000608082526151376080830187614e18565b82810360208401526151498187614dd4565b838103604085015261515b8187614dd4565b91505082810360608401526151708185614e6f565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156151bd578351600581106151a957fe5b835260209384019390920191600101615195565b509095945050505050565b606080825284519082018190526000906020906080840190828801845b8281101561520b576151f8848351614ecc565b60609390930192908401906001016151e5565b5050508381038285015261521f8187614e6f565b84810360408601528551808252908301915082860190845b81811015615255578251151584529284019291840191600101615237565b509198975050505050505050565b600060208252610dc16020830184614e6f565b6000604082526152896040830185614e6f565b828103602084015261529b8185614e18565b95945050505050565b6000604082526152b76040830185614e6f565b828103602084015261529b8185614e6f565b90815260200190565b60008582526001600160a01b0385166020830152608060408301526152fa6080830185614ea0565b82810360608401526151708185614ea0565b918252602082015260400190565b60008382526040602083015261120d6040830184614ea0565b60008482526060602083015261534c6060830185614ea0565b828103604084015261366e8185614ea0565b8281526040810161536e83615809565b8260208301529392505050565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b60006001600160e01b0319861682526001600160a01b0380861660208401528085166040840152506080606083015261366e6080830184614ea0565b60006001600160e01b0319871682526001600160a01b038616602083015260a0604083015261542160a0830186614e6f565b82810360608401526154338186614e6f565b838103608085015261117f8186614ea0565b60006001600160e01b0319861682526001600160a01b0385166020830152608060408301526154776080830185614ea0565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b60006001600160e01b031985168252606060208301526154d66060830185614e6f565b828103604084015261366e8185614e18565b600060208252610dc16020830184614ea0565b60006080825261550e6080830187614ea0565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6000615544856157e8565b8482528360208301526060604083015261529b6060830184614ea0565b6060810161556e856157f5565b938152602081019290925260409091015290565b6060810161558f856157ff565b93815260208101929092526001600160a01b031660409091015290565b604081016155b9846157f5565b9281526020015290565b6060810161556e856157ff565b606081016008851061556e57fe5b60208101600583106155ec57fe5b91905290565b60006155fd86615809565b8582528460208301526001600160a01b03841660408301526080606083015261366e6080830184614ea0565b604081016155b9846157e8565b60208082526013908201527f554e4b4e4f574e5f52455455524e5f4441544100000000000000000000000000604082015260600190565b6020808252600c908201527f4241445f53454c4543544f520000000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f57524f4e475f50524f58595f4944000000000000000000000000000000000000604082015260600190565b60a081016156e98286614ecc565b8360608301528215156080830152949350505050565b600060208252610dc16020830184614eee565b6000604082526157256040830185614eee565b828103602084015261529b8185614ea0565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561576c57600080fd5b604052919050565b600067ffffffffffffffff82111561578a578081fd5b5060209081020190565b600067ffffffffffffffff8211156157aa578081fd5b50601f01601f191660200190565b60005b838110156157d35781810151838201526020016157bb565b838111156157e2576000848401525b50505050565b600281106157f257fe5b50565b600481106157f257fe5b600381106157f257fe5b600781106157f257fe5b6001600160a01b03811681146157f257600080fd5b60ff811681146157f257600080fdfea365627a7a72315820b8f5e1baee716487ac576e78a6a19b92db1db8535a5a9d8ed8a3c9e3e2968a386c6578706572696d656e74616cf564736f6c63430005100040" + "object": "0x60806040523480156200001157600080fd5b5060405162005228380380620052288339810160408190526200003491620003e5565b600080546001600160a01b03199081166001600160a01b0385811691821784556005805490931690851617909155604051630c0e082160e31b8152829185918591906360704108906200009390630f47261b60e41b9060040162000423565b60206040518083038186803b158015620000ac57600080fd5b505afa158015620000c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620000e79190810190620003b5565b600180546001600160a01b0319166001600160a01b03928316179055604051630c0e082160e31b815290831690636070410890620001319063012b8bc960e11b9060040162000423565b60206040518083038186803b1580156200014a57600080fd5b505afa1580156200015f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001859190810190620003b5565b600280546001600160a01b0319166001600160a01b03928316179055604051630c0e082160e31b815290831690636070410890620001cf9063a7cb5fb760e01b9060040162000423565b60206040518083038186803b158015620001e857600080fd5b505afa158015620001fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002239190810190620003b5565b600380546001600160a01b0319166001600160a01b03928316179055604051630c0e082160e31b8152908316906360704108906200026d9063619ce88560e11b9060040162000423565b60206040518083038186803b1580156200028657600080fd5b505afa1580156200029b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002c19190810190620003b5565b600480546001600160a01b0319166001600160a01b03928316179055600092508316159050620002f25781620002f4565b305b90506200034f6040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b81525085846200035e60201b620029c31760201c565b60065550620004519350505050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600060208284031215620003c7578081fd5b81516001600160a01b0381168114620003de578182fd5b9392505050565b60008060408385031215620003f8578081fd5b8251620004058162000438565b6020840151909250620004188162000438565b809150509250929050565b6001600160e01b031991909116815260200190565b6001600160a01b03811681146200044e57600080fd5b50565b614dc780620004616000396000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c8063a5cd62ba11610145578063d3637905116100bd578063e4e6e7da1161008c578063ee18599711610071578063ee185997146105b5578063ef3bb097146105bd578063ff84e7cc146105c55761025c565b8063e4e6e7da14610572578063e77286eb146105935761025c565b8063d36379051461050a578063d3d862d11461051d578063d469502814610530578063e25cabf7146105505761025c565b8063c26cfecd11610114578063ca49f47c116100f9578063ca49f47c146104c1578063d001c5dc146104e4578063d186037f146104f75761025c565b8063c26cfecd146104b1578063c82037ef146104b95761025c565b8063a5cd62ba14610449578063a6627e9f14610469578063b43cffe11461047c578063bbb2dcf61461048f5761025c565b80637982653e116101d85780639baf2705116101a75780639eadc8351161018c5780639eadc835146103ff578063a070cac814610423578063a0901e51146104365761025c565b80639baf2705146103e25780639cd01605146103f75761025c565b80637982653e1461037b57806379c9c4261461039b5780637d727512146103ae5780638f4ce479146103c15761025c565b80634dfdac201161022f57806363eb39921161021457806363eb3992146103225780636f83188e14610335578063750bdb30146103585761025c565b80634dfdac20146102e2578063590aa875146103025761025c565b806304a5618a146102615780630d7b7d761461028c5780632322cf76146102ad57806346eb65cb146102cd575b600080fd5b61027461026f36600461406c565b6105cd565b60405161028393929190614abe565b60405180910390f35b61029f61029a366004613b30565b610666565b604051610283929190614ca6565b6102c06102bb366004613b30565b610688565b604051610283919061499b565b6102e06102db36600461406c565b6106b0565b005b6102f56102f0366004613a4b565b610734565b60405161028391906148f3565b610315610310366004613a2f565b6107b7565b6040516102839190614b1e565b610315610330366004613b74565b610866565b61034861034336600461406c565b610919565b6040516102839493929190614bb2565b61036b61036636600461406c565b6109b9565b60405161028394939291906149dc565b61038e610389366004614242565b610a4b565b6040516102839190614b9f565b6102c06103a936600461434a565b610afd565b6102c06103bc366004613b30565b610b7e565b6103d46103cf36600461406c565b611474565b6040516102839291906149b9565b6103ea611507565b604051610283919061465f565b6103ea611516565b61041261040d36600461406c565b611525565b604051610283959493929190614a18565b6102c06104313660046142f1565b6115ca565b6102f5610444366004613bf6565b61164b565b61045c610457366004613cc4565b6116c4565b604051610283919061480c565b610315610477366004613bcb565b61177e565b61031561048a366004613a99565b61182e565b6104a261049d36600461406c565b6118e4565b60405161028393929190614ae9565b6102c0611974565b6103ea61197a565b6104d46104cf36600461406c565b611989565b6040516102839493929190614a7b565b6102f56104f2366004613a4b565b611a1b565b6102c0610505366004613b30565b611a89565b61038e610518366004614242565b612365565b61031561052b366004613d9f565b6123c7565b61054361053e36600461406c565b61241c565b60405161028391906149a4565b61056361055e366004613d48565b6124bf565b60405161028393929190614858565b610585610580366004613a4b565b6125f7565b604051610283929190614976565b6105a66105a136600461429a565b612610565b60405161028393929190614c4a565b6103ea612980565b6103ea61298f565b6103ea61299e565b600080600073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a856040518263ffffffff1660e01b81526004016106099190614b1e565b60606040518083038186803b15801561062157600080fd5b505af4158015610635573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106599190810190613fc2565b9250925092509193909250565b6000806106738484610b7e565b915061067f8484611a89565b90509250929050565b60008060006106978585610666565b915091506106a582826129ad565b925050505b92915050565b6040517f46eb65cb00000000000000000000000000000000000000000000000000000000815273__$d8b635de2bf4a097b4e18b67d0fb68e779$__906346eb65cb90610700908490600401614b1e565b60006040518083038186803b15801561071857600080fd5b505af415801561072c573d6000803e3d6000fd5b505050505b50565b606060008251905080604051908082528060200260200182016040528015610766578160200160208202803883390190505b50915060005b8181146107af576107908585838151811061078357fe5b6020026020010151611a89565b83828151811061079c57fe5b602090810291909101015260010161076c565b505092915050565b6040517f590aa87500000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063590aa8759061080a90859060040161465f565b60006040518083038186803b15801561082257600080fd5b505af4158015610836573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085e919081019061409f565b90505b919050565b6040517f63eb399200000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__906363eb3992906108bd9087908790879060040161478c565b60006040518083038186803b1580156108d557600080fd5b505af41580156108e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610911919081019061409f565b949350505050565b60608060608073__$fddee3b26a806429350031cf3481976d2e$__636f83188e866040518263ffffffff1660e01b81526004016109569190614b1e565b60006040518083038186803b15801561096e57600080fd5b505af4158015610982573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa919081019061410d565b93509350935093509193509193565b6000806000606073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016109f79190614b1e565b60006040518083038186803b158015610a0f57600080fd5b505af4158015610a23573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa9190810190613e46565b600080546040517f9caa023b00000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__91639caa023b91610aad916001600160a01b0316908890889088906004016147be565b60206040518083038186803b158015610ac557600080fd5b505af4158015610ad9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061091191908101906140ee565b600061091184610b796040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876129c3565b612a1a565b600080610b91838263ffffffff612a2e16565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415610bec576000610bd884601063ffffffff612a6716565b9050610be48186612a9a565b92505061146d565b6001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415610e055760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a866040518263ffffffff1660e01b8152600401610c589190614b1e565b60606040518083038186803b158015610c7057600080fd5b505af4158015610c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ca89190810190613fc2565b6040519194509250606091507f6352211e0000000000000000000000000000000000000000000000000000000090610ce490849060240161499b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b031683604051610d5f9190614643565b600060405180830381855afa9150503d8060008114610d9a576040519150601f19603f3d011682016040523d82523d6000602084013e610d9f565b606091505b50915091506000828015610db4575081516020145b610dbf576000610dd0565b610dd082600c63ffffffff612a6716565b9050896001600160a01b0316816001600160a01b031614610df2576000610df5565b60015b60ff16975050505050505061146d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156110a157600060608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__639eadc835876040518263ffffffff1660e01b8152600401610e739190614b1e565b60006040518083038186803b158015610e8b57600080fd5b505af4158015610e9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ec79190810190613eb0565b5081519296509094509250905060005b81811461109757828181518110610eea57fe5b602002602001015160001415610eff5761108f565b83516060907efdd58e00000000000000000000000000000000000000000000000000000000908b90879085908110610f3357fe5b6020026020010151604051602401610f4c9291906147f3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060876001600160a01b031683604051610fc79190614643565b600060405180830381855afa9150503d8060008114611002576040519150601f19603f3d011682016040523d82523d6000602084013e611007565b606091505b5091509150600082801561101c575081516020145b611027576000611038565b61103882600063ffffffff612b9216565b9050600087868151811061104857fe5b6020026020010151828161105857fe5b049050806110745760009b5050505050505050505050506106aa565b8b81108061108057508b155b1561108957809b505b50505050505b600101610ed7565b505050505061146d565b6001600160e01b031981167fc339d10a0000000000000000000000000000000000000000000000000000000014156111d4576040516060907fa85e59e4000000000000000000000000000000000000000000000000000000009061111090869060009081908190602401614b31565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611177908490614643565b600060405180830381855afa9150503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b50509050806111c75760006111cb565b6000195b9350505061146d565b6001600160e01b031981167fdc1600f30000000000000000000000000000000000000000000000000000000014156112fd5760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016112409190614b1e565b60006040518083038186803b15801561125857600080fd5b505af415801561126c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112949190810190613e46565b5092509250506112a2612b9e565b6001600160a01b0316826001600160a01b03161480156112cf57506005546001600160a01b038281169116145b156112f65760006112e76112e1612bb6565b88612a9a565b90506112f281612bce565b9450505b505061146d565b6001600160e01b031981167f94cfcdd700000000000000000000000000000000000000000000000000000000141561146d5760608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6866040518263ffffffff1660e01b81526004016113699190614b1e565b60006040518083038186803b15801561138157600080fd5b505af4158015611395573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113bd9190810190614002565b80519194509250905060005b818114611468578381815181106113dc57fe5b6020026020010151600014156113f157611460565b60006114108985848151811061140357fe5b6020026020010151610b7e565b9050600085838151811061142057fe5b6020026020010151828161143057fe5b049050806114485760009750505050505050506106aa565b87811080611454575087155b1561145d578097505b50505b6001016113c9565b505050505b5092915050565b60008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__638f4ce479846040518263ffffffff1660e01b81526004016114ae9190614b1e565b604080518083038186803b1580156114c557600080fd5b505af41580156114d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114fd9190810190613e0f565b915091505b915091565b6004546001600160a01b031681565b6000546001600160a01b031681565b600080606080606073__$d8b635de2bf4a097b4e18b67d0fb68e779$__639eadc835876040518263ffffffff1660e01b81526004016115649190614b1e565b60006040518083038186803b15801561157c57600080fd5b505af4158015611590573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115b89190810190613eb0565b939a9299509097509550909350915050565b6000610911846116466040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876129c3565b612dcc565b6060808251604051908082528060200260200182016040528015611679578160200160208202803883390190505b50905060005b8351811461146d5783818151811061169357fe5b60200260200101516001600160a01b0316318282815181106116b157fe5b602090810291909101015260010161167f565b6000546040517f02cffc4500000000000000000000000000000000000000000000000000000000815260609173__$7a69f714cdde1cb6b62e3c39bc8c94deae$__916302cffc459161172a916001600160a01b039091169088908890889060040161468d565b60006040518083038186803b15801561174257600080fd5b505af4158015611756573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109119190810190613c29565b6040517fa6627e9f00000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063a6627e9f906117d390869086906004016147f3565b60006040518083038186803b1580156117eb57600080fd5b505af41580156117ff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611827919081019061409f565b9392505050565b6040517fb43cffe100000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063b43cffe190611887908890889088908890600401614746565b60006040518083038186803b15801561189f57600080fd5b505af41580156118b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118db919081019061409f565b95945050505050565b600060608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6856040518263ffffffff1660e01b81526004016119209190614b1e565b60006040518083038186803b15801561193857600080fd5b505af415801561194c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106599190810190614002565b60065481565b6005546001600160a01b031681565b6000806060600073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63ca49f47c866040518263ffffffff1660e01b81526004016119c79190614b1e565b60006040518083038186803b1580156119df57600080fd5b505af41580156119f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa9190810190613f5a565b606060008251905080604051908082528060200260200182016040528015611a4d578160200160208202803883390190505b50915060005b8181146107af57611a6a8585838151811061140357fe5b838281518110611a7657fe5b6020908102919091010152600101611a53565b600080611a9c838263ffffffff612a2e16565b90506001600160e01b031981167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611c075760608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6866040518263ffffffff1660e01b8152600401611b0a9190614b1e565b60006040518083038186803b158015611b2257600080fd5b505af4158015611b36573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b5e9190810190614002565b80519194509250905060005b818114611bfc57838181518110611b7d57fe5b602002602001015160001415611b9257611bf4565b6000611ba48985848151811061078357fe5b90506000858381518110611bb457fe5b60200260200101518281611bc457fe5b04905080611bdc5760009750505050505050506106aa565b87811080611be8575087155b15611bf1578097505b50505b600101611b6a565b506106aa9350505050565b6001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415611c68576000611c4c84601063ffffffff612a6716565b600154909150610be490829087906001600160a01b0316612ddb565b6001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415611fb85760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a866040518263ffffffff1660e01b8152600401611cd49190614b1e565b60606040518083038186803b158015611cec57600080fd5b505af4158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d249190810190613fc2565b600254604051929550909350606092507fe985e9c50000000000000000000000000000000000000000000000000000000091611d70918a916001600160a01b0390911690602401614673565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b031683604051611deb9190614643565b600060405180830381855afa9150503d8060008114611e26576040519150601f19603f3d011682016040523d82523d6000602084013e611e2b565b606091505b5091509150811580611e3f57508051602014155b80611e5b5750611e5681600063ffffffff612b9216565b600114155b15611fa9576040516060907f081812fc0000000000000000000000000000000000000000000000000000000090611e9690879060240161499b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050856001600160a01b031681604051611f0d9190614643565b600060405180830381855afa9150503d8060008114611f48576040519150601f19603f3d011682016040523d82523d6000602084013e611f4d565b606091505b509093509150828015611f61575081516020145b8015611f9057506002546001600160a01b0316611f8583600c63ffffffff612a6716565b6001600160a01b0316145b611f9b576000611f9e565b60015b60ff16975050611097565b6000199650505050505061146d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156121df576040517f9eadc83500000000000000000000000000000000000000000000000000000000815260009073__$d8b635de2bf4a097b4e18b67d0fb68e779$__90639eadc8359061203d908790600401614b1e565b60006040518083038186803b15801561205557600080fd5b505af4158015612069573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120919190810190613eb0565b5050600354604051929450606093507fe985e9c500000000000000000000000000000000000000000000000000000000926120db925089916001600160a01b031690602401614673565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060836001600160a01b0316836040516121569190614643565b600060405180830381855afa9150503d8060008114612191576040519150601f19603f3d011682016040523d82523d6000602084013e612196565b606091505b50915091508180156121a9575080516020145b80156121c557506121c181600063ffffffff612b9216565b6001145b6121d05760006121d4565b6000195b95505050505061146d565b6001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000141561221b57600019915061146d565b6001600160e01b031981167fdc1600f300000000000000000000000000000000000000000000000000000000141561146d5760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016122879190614b1e565b60006040518083038186803b15801561229f57600080fd5b505af41580156122b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122db9190810190613e46565b5092509250506122e9612b9e565b6001600160a01b0316826001600160a01b031614801561231657506005546001600160a01b038281169116145b1561235c57600061233b612328612bb6565b60055489906001600160a01b0316612ddb565b905060001981146123545761234f81612bce565b612358565b6000195b9450505b50505092915050565b600080546040517f8dccde0400000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__91638dccde0491610aad916001600160a01b0316908890889088906004016147be565b6040517fd3d862d100000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063d3d862d1906117d39086908690600401614906565b6040517fd469502800000000000000000000000000000000000000000000000000000000815260009073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063d46950289061246f908590600401614b1e565b60206040518083038186803b15801561248757600080fd5b505af415801561249b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061085e9190810190613df4565b60608060606000855190508060405190808252806020026020018201604052801561250457816020015b6124f1613467565b8152602001906001900390816124e95790505b50935080604051908082528060200260200182016040528015612531578160200160208202803883390190505b5092508060405190808252806020026020018201604052801561255e578160200160208202803883390190505b50915060005b8181146125ee5761259b87828151811061257a57fe5b602002602001015187838151811061258e57fe5b6020026020010151612610565b87518890859081106125a957fe5b602002602001018785815181106125bc57fe5b602002602001018786815181106125cf57fe5b9315156020948502919091019093019290925291905252600101612564565b50509250925092565b6060806126048484611a1b565b915061067f8484610734565b612618613467565b600080546040517f9d3fa4b900000000000000000000000000000000000000000000000000000000815282916001600160a01b031690639d3fa4b990612662908890600401614c6e565b60606040518083038186803b15801561267a57600080fd5b505afa15801561268e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126b291908101906141fa565b85516000546040517fa12dcc6f00000000000000000000000000000000000000000000000000000000815292955090916001600160a01b039091169063a12dcc6f906127049089908990600401614c81565b60206040518083038186803b15801561271c57600080fd5b505afa158015612730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127549190810190613dd4565b9150600061276187612ee5565b90506000612782886101800151896101400151612f0190919063ffffffff16565b156127b7576127b0826127a68a60c001518b60800151612f2690919063ffffffff16565b8a60a00151612f42565b9050612824565b60c08801516127d3576127b08289608001518a60a00151612f42565b60006127e4848a6101800151610688565b905060006127fb848b608001518c60a00151612f42565b90506000612812838c60c001518d60a00151612f42565b905061281e82826129ad565b93505050505b61284861284287604001518a60a00151612f6490919063ffffffff16565b826129ad565b9450600460005460208a01516040517f9caa023b00000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__92639caa023b926128b3926001600160a01b03909216918e91908c906004016147be565b60206040518083038186803b1580156128cb57600080fd5b505af41580156128df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061290391908101906140ee565b600481111561290e57fe5b1461291a57600061291c565b845b945061292c886101600151612f83565b61293557600094505b60e0880151158015906129535750612951886101a00151612f83565b155b1561295d57600094505b60038651600681111561296c57fe5b1461297657600094505b5050509250925092565b6001546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b031681565b60008183106129bc5781611827565b5090919050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600061182782612a2985613138565b6131b3565b60008160040183511015612a5457612a54612a4f60038551856004016131ed565b61325c565b5001602001516001600160e01b03191690565b60008160140183511015612a8857612a88612a4f60048551856014016131ed565b5001601401516001600160a01b031690565b60405160009081906060906001600160a01b038616907f70a082310000000000000000000000000000000000000000000000000000000090612ae090879060240161465f565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909416939093179092529051612b339190614643565b600060405180830381855afa9150503d8060008114612b6e576040519150601f19603f3d011682016040523d82523d6000602084013e612b73565b606091505b5091509150818015612b86575080516020145b156107af576106a58160005b60006118278383613264565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b600080612bd9612bb6565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c1357600080fd5b505af1158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c4b91908101906140d2565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c8a57600080fd5b505af1158015612c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612cc29190810190614402565b4211612d4057816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d0357600080fd5b505af1158015612d17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d3b9190810190614402565b612db3565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d7b57600080fd5b505af1158015612d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612db39190810190614402565b9050610911816b033b2e3c9fd0803ce800000086612f42565b600061182782612a298561328e565b60405160009081906060906001600160a01b038716907fdd62ed3e0000000000000000000000000000000000000000000000000000000090612e239088908890602401614673565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909416939093179092529051612e769190614643565b600060405180830381855afa9150503d8060008114612eb1576040519150601f19603f3d011682016040523d82523d6000602084013e612eb6565b606091505b5091509150818015612ec9575080516020145b15612edc57612ed9816000612b92565b92505b50509392505050565b6000806000612ef384613347565b9150915061091182826129ad565b6000815183511480156118275750508051602091820120825192909101919091201490565b60008282018381101561182757611827612a4f6000868661338a565b600061091183612f58868563ffffffff6133a916565b9063ffffffff6133da16565b600082821115612f7d57612f7d612a4f6002858561338a565b50900390565b60006020825181612f9057fe5b06600414612fa057506000610861565b6000612fb2838263ffffffff612a2e16565b90506001600160e01b031981167f94cfcdd70000000000000000000000000000000000000000000000000000000014612fef576001915050610861565b6040517fbbb2dcf600000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063bbb2dcf690613042908790600401614b1e565b60006040518083038186803b15801561305a57600080fd5b505af415801561306e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130969190810190614002565b80519093509150600090505b81811461312c5760006130d260008584815181106130bc57fe5b6020026020010151612a2e90919063ffffffff16565b90506001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415613123576131108483613404565b1561312357600095505050505050610861565b506001016130a2565b50600195945050505050565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6060632800659560e01b84848460405160240161320c93929190614b91565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b6000816020018351101561328557613285612a4f60058551856020016131ed565b50016020015190565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534939092909160208710156132da57fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b600080600483610140015151101561336457506000905080611502565b6133778360000151846101400151610b7e565b6114fd8460000151856101400151611a89565b606063e946c1bb60e01b84848460405160240161320c93929190614b6f565b6000826133b8575060006106aa565b828202828482816133c557fe5b041461182757611827612a4f6001868661338a565b6000816133f0576133f0612a4f6003858561338a565b60008284816133fb57fe5b04949350505050565b8151600090600183015b818110156107af5761344f85828151811061342557fe5b602002602001015186868151811061343957fe5b6020026020010151612f0190919063ffffffff16565b1561345f576001925050506106aa565b60010161340e565b6040805160608101909152806000815260006020820181905260409091015290565b80356106aa81614d59565b80516106aa81614d59565b600082601f8301126134af578081fd5b81356134c26134bd82614cdb565b614cb4565b8181529150602080830190848101818402860182018710156134e357600080fd5b60005b848110156114685781356134f981614d59565b845292820192908201906001016134e6565b600082601f83011261351b578081fd5b81356135296134bd82614cdb565b8181529150602080830190840160005b838110156135665761355187602084358901016136fa565b83526020928301929190910190600101613539565b5050505092915050565b600082601f830112613580578081fd5b815161358e6134bd82614cdb565b8181529150602080830190840160005b83811015613566576135b68760208451890101613748565b8352602092830192919091019060010161359e565b600082601f8301126135db578081fd5b81356135e96134bd82614cdb565b8181529150602080830190840160005b8381101561356657613611876020843589010161379d565b835260209283019291909101906001016135f9565b600082601f830112613636578081fd5b81356136446134bd82614cdb565b81815291506020808301908481018184028601820187101561366557600080fd5b60005b8481101561146857813584529282019290820190600101613668565b600082601f830112613694578081fd5b81516136a26134bd82614cdb565b8181529150602080830190848101818402860182018710156136c357600080fd5b60005b84811015611468578151845292820192908201906001016136c6565b80516001600160e01b0319811681146106aa57600080fd5b600082601f83011261370a578081fd5b81356137186134bd82614cfb565b915080825283602082850101111561372f57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613758578081fd5b81516137666134bd82614cfb565b915080825283602082850101111561377d57600080fd5b61146d816020840160208601614d1f565b8051600581106106aa57600080fd5b60006101c08083850312156137b0578182fd5b6137b981614cb4565b9150506137c68383613489565b81526137d58360208401613489565b60208201526137e78360408401613489565b60408201526137f98360608401613489565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561385b57600080fd5b613867868387016136fa565b8385015261016092508285013591508082111561388357600080fd5b61388f868387016136fa565b838501526101809250828501359150808211156138ab57600080fd5b6138b7868387016136fa565b838501526101a09250828501359150808211156138d357600080fd5b506138e0858286016136fa565b82840152505092915050565b60006101c08083850312156138ff578182fd5b61390881614cb4565b9150506139158383613494565b81526139248360208401613494565b60208201526139368360408401613494565b60408201526139488360608401613494565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156139aa57600080fd5b6139b686838701613748565b838501526101609250828501519150808211156139d257600080fd5b6139de86838701613748565b838501526101809250828501519150808211156139fa57600080fd5b613a0686838701613748565b838501526101a0925082850151915080821115613a2257600080fd5b506138e085828601613748565b600060208284031215613a40578081fd5b813561182781614d59565b60008060408385031215613a5d578081fd5b8235613a6881614d59565b9150602083013567ffffffffffffffff811115613a83578182fd5b613a8f8582860161350b565b9150509250929050565b60008060008060808587031215613aae578182fd5b8435613ab981614d59565b9350602085013567ffffffffffffffff80821115613ad5578384fd5b613ae188838901613626565b94506040870135915080821115613af6578384fd5b613b0288838901613626565b93506060870135915080821115613b17578283fd5b50613b24878288016136fa565b91505092959194509250565b60008060408385031215613b42578182fd5b8235613b4d81614d59565b9150602083013567ffffffffffffffff811115613b68578182fd5b613a8f858286016136fa565b600080600060608486031215613b88578081fd5b8335613b9381614d59565b9250602084013567ffffffffffffffff811115613bae578182fd5b613bba868287016136fa565b925050604084013590509250925092565b60008060408385031215613bdd578182fd5b8235613be881614d59565b946020939093013593505050565b600060208284031215613c07578081fd5b813567ffffffffffffffff811115613c1d578182fd5b6109118482850161349f565b60006020808385031215613c3b578182fd5b825167ffffffffffffffff811115613c51578283fd5b80840185601f820112613c62578384fd5b80519150613c726134bd83614cdb565b8281528381019082850185850284018601891015613c8e578687fd5b8693505b84841015613cb857613ca4898261378e565b835260019390930192918501918501613c92565b50979650505050505050565b600080600060608486031215613cd8578081fd5b833567ffffffffffffffff80821115613cef578283fd5b613cfb878388016135cb565b94506020860135915080821115613d10578283fd5b613d1c8783880161349f565b93506040860135915080821115613d31578283fd5b50613d3e86828701613626565b9150509250925092565b60008060408385031215613d5a578182fd5b823567ffffffffffffffff80821115613d71578384fd5b613d7d868387016135cb565b93506020850135915080821115613d92578283fd5b50613a8f8582860161350b565b60008060408385031215613db1578182fd5b823567ffffffffffffffff80821115613dc8578384fd5b613d7d86838701613626565b600060208284031215613de5578081fd5b81518015158114611827578182fd5b600060208284031215613e05578081fd5b61182783836136e2565b60008060408385031215613e21578182fd5b613e2b84846136e2565b91506020830151613e3b81614d59565b809150509250929050565b60008060008060808587031215613e5b578182fd5b8451613e6681614d6e565b6020860151909450613e7781614d59565b6040860151909350613e8881614d59565b606086015190925067ffffffffffffffff811115613ea4578182fd5b613b2487828801613748565b600080600080600060a08688031215613ec7578283fd5b613ed187876136e2565b94506020860151613ee181614d59565b604087015190945067ffffffffffffffff80821115613efe578485fd5b613f0a89838a01613684565b94506060880151915080821115613f1f578283fd5b613f2b89838a01613684565b93506080880151915080821115613f40578283fd5b50613f4d88828901613748565b9150509295509295909350565b60008060008060808587031215613f6f578182fd5b613f7986866136e2565b93506020850151613f8981614d59565b604086015190935067ffffffffffffffff811115613fa5578283fd5b613fb187828801613748565b606096909601519497939650505050565b600080600060608486031215613fd6578081fd5b613fe085856136e2565b92506020840151613ff081614d59565b80925050604084015190509250925092565b600080600060608486031215614016578081fd5b835161402181614d6e565b602085015190935067ffffffffffffffff8082111561403e578283fd5b61404a87838801613684565b9350604086015191508082111561405f578283fd5b50613d3e86828701613570565b60006020828403121561407d578081fd5b813567ffffffffffffffff811115614093578182fd5b610911848285016136fa565b6000602082840312156140b0578081fd5b815167ffffffffffffffff8111156140c6578182fd5b61091184828501613748565b6000602082840312156140e3578081fd5b815161182781614d59565b6000602082840312156140ff578081fd5b815160058110611827578182fd5b60008060008060808587031215614122578182fd5b845167ffffffffffffffff80821115614139578384fd5b61414588838901613748565b955060209150818701518181111561415b578485fd5b80880189601f82011261416c578586fd5b8051915061417c6134bd83614cdb565b82815284810190828601885b858110156141b15761419f8e8984518801016138ec565b84529287019290870190600101614188565b505060408b01519098509450505050808211156141cc578384fd5b6141d888838901613684565b935060608701519150808211156141ed578283fd5b50613b2487828801613570565b60006060828403121561420b578081fd5b6142156060614cb4565b825160078110614223578283fd5b8152602083810151908201526040928301519281019290925250919050565b600080600060608486031215614256578081fd5b833567ffffffffffffffff81111561426c578182fd5b6142788682870161379d565b935050602084013561428981614d59565b929592945050506040919091013590565b600080604083850312156142ac578182fd5b823567ffffffffffffffff808211156142c3578384fd5b6142cf8683870161379d565b935060208501359150808211156142e4578283fd5b50613a8f858286016136fa565b600080600060608486031215614305578081fd5b833567ffffffffffffffff81111561431b578182fd5b6143278682870161379d565b93505060208401359150604084013561433f81614d59565b809150509250925092565b60008060006060848603121561435e578081fd5b833567ffffffffffffffff80821115614375578283fd5b81860160a08189031215614387578384fd5b61439160a0614cb4565b92508035835260208101356020840152604081013560408401526143b88860608301613489565b60608401526080810135828111156143ce578485fd5b6143da898284016136fa565b6080850152509194505050602084013591506143f98560408601613489565b90509250925092565b600060208284031215614413578081fd5b5051919050565b6001600160a01b03169052565b6000815180845260208401935060208301825b828110156144615781516001600160a01b031686526020958601959091019060010161443a565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b848110156144b65782840388526144a08483516144f3565b6020988901989094509190910190600101614488565b50919695505050505050565b6000815180845260208401935060208301825b828110156144615781518652602095860195909101906001016144d5565b6000815180845261450b816020860160208601614d1f565b601f01601f19169290920160200192915050565b80516007811061452b57fe5b825260208181015190830152604090810151910152565b60006101c061455284845161441a565b6020830151614564602086018261441a565b506040830151614577604086018261441a565b50606083015161458a606086018261441a565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152506101408084015182828701526145e3838701826144f3565b9150506101609150818401518582038387015261460082826144f3565b92505050610180808401518583038287015261461c83826144f3565b9150506101a09150818401518582038387015261463982826144f3565b9695505050505050565b60008251614655818460208701614d1f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6000608082016001600160a01b03871683526080602084015280865180835260a08501915060a060208202860101925060208801845b82811015614712577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608786030184526146fd858351614542565b945060209384019391909101906001016146c3565b5050505082810360408401526147288186614427565b838103606085015261473a81866144c2565b98975050505050505050565b60006001600160a01b03861682526080602083015261476860808301866144c2565b828103604084015261477a81866144c2565b838103606085015261473a81866144f3565b60006001600160a01b0385168252606060208301526147ae60608301856144f3565b9050826040830152949350505050565b60006001600160a01b038087168352608060208401526147e16080840187614542565b94166040830152506060015292915050565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561484d57835161483981614d4f565b835260209384019390920191600101614826565b509095945050505050565b606080825284519082018190526000906020906080840190828801845b8281101561489b5761488884835161451f565b6060939093019290840190600101614875565b505050838103828501526148af81876144c2565b84810360408601528551808252908301915082860190845b818110156148e55782511515845292840192918401916001016148c7565b509198975050505050505050565b60006020825261182760208301846144c2565b60006040825261491960408301856144c2565b602083820381850152818551808452828401915082838202850101838801865b8381101561496757601f198784030185526149558383516144f3565b94860194925090850190600101614939565b50909998505050505050505050565b60006040825261498960408301856144c2565b82810360208401526118db81856144c2565b90815260200190565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b60006001600160e01b0319861682526001600160a01b0380861660208401528085166040840152506080606083015261463960808301846144f3565b60006001600160e01b0319871682526001600160a01b038616602083015260a06040830152614a4a60a08301866144c2565b8281036060840152614a5c81866144c2565b8381036080850152614a6e81866144f3565b9998505050505050505050565b60006001600160e01b0319861682526001600160a01b038516602083015260806040830152614aad60808301856144f3565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b60006001600160e01b03198516825260606020830152614b0c60608301856144c2565b8281036040840152614639818561446b565b60006020825261182760208301846144f3565b600060808252614b4460808301876144f3565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6060810160048510614b7d57fe5b938152602081019290925260409091015290565b6060810160088510614b7d57fe5b60208101614bac83614d4f565b91905290565b600060808252614bc560808301876144f3565b602083820381850152818751808452828401915082838202850101838a01865b83811015614c1357601f19878403018552614c01838351614542565b94860194925090850190600101614be5565b50508681036040880152614c27818a6144c2565b9450505050508281036060840152614c3f818561446b565b979650505050505050565b60a08101614c58828661451f565b8360608301528215156080830152949350505050565b6000602082526118276020830184614542565b600060408252614c946040830185614542565b82810360208401526118db81856144f3565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715614cd357600080fd5b604052919050565b600067ffffffffffffffff821115614cf1578081fd5b5060209081020190565b600067ffffffffffffffff821115614d11578081fd5b50601f01601f191660200190565b60005b83811015614d3a578181015183820152602001614d22565b83811115614d49576000848401525b50505050565b6005811061073157fe5b6001600160a01b038116811461073157600080fd5b6001600160e01b03198116811461073157600080fdfea365627a7a7231582034aeeb2766e909a7bf6404cf5556e26fa49952bdd5ea533d25447be58f55ed9a6c6578706572696d656e74616cf564736f6c63430005100040" }, "deployedBytecode": { - "object": "0x608060405234801561001057600080fd5b50600436106102f45760003560e01c80639a7e752611610191578063ca49f47c116100e3578063d3d862d111610097578063e4e6e7da11610071578063e4e6e7da1461077e578063e77286eb1461079f578063ee4f5a94146107c1576102f4565b8063d3d862d114610729578063d46950281461073c578063e25cabf71461075c576102f4565b8063d001c5dc116100c8578063d001c5dc146106f0578063d186037f14610703578063d363790514610716576102f4565b8063ca49f47c146106ac578063cafd3a07146106cf576102f4565b8063a6627e9f11610145578063bbb2dcf61161011f578063bbb2dcf614610661578063bc03f96414610683578063c26cfecd146106a4576102f4565b8063a6627e9f14610618578063acaedc741461062b578063b43cffe11461064e576102f4565b8063a070cac811610176578063a070cac8146105d2578063a0901e51146105e5578063a5cd62ba146105f8576102f4565b80639a7e75261461058b5780639eadc835146105ae576102f4565b80634dfdac201161024a5780637914b2ec116101fe5780637b66ad34116101d85780637b66ad34146105445780637d727512146105655780638f4ce47914610578576102f4565b80637914b2ec146104f05780637982653e1461051157806379c9c42614610531576102f4565b806363eb39921161022f57806363eb39921461049857806365129042146104ab578063750bdb30146104cd576102f4565b80634dfdac2014610458578063590aa87514610478576102f4565b8063314853ff116102ac5780633db6dc61116102865780633db6dc61146103ff578063459be5e21461042257806346eb65cb14610443576102f4565b8063314853ff146103a8578063327d3054146103ca57806332aae3ad146103dd576102f4565b80630d7b7d76116102dd5780630d7b7d7614610345578063165979e1146103665780632322cf7614610388576102f4565b806302d0aec3146102f957806304a5618a14610323575b600080fd5b61030c610307366004614a21565b6107e3565b60405161031a92919061535e565b60405180910390f35b610336610331366004614a21565b61083f565b60405161031a93929190615488565b610358610353366004614603565b6108ba565b60405161031a92919061530c565b610379610374366004614a21565b6108dc565b60405161031a939291906155c3565b61039b610396366004614603565b610939565b60405161031a91906152c9565b6103bb6103b6366004614a21565b610961565b60405161031a93929190615333565b6103586103d8366004614a21565b6109a8565b6103f06103eb366004614a21565b6109ea565b60405161031a93929190615539565b61041261040d366004614a21565b610a3d565b60405161031a94939291906152d2565b610435610430366004614a21565b610a87565b60405161031a9291906155ac565b610456610451366004614a21565b610add565b005b61046b61046636600461452a565b610c5f565b60405161031a9190615263565b61048b610486366004614341565b610ce2565b60405161031a91906154e8565b61048b6104a6366004614647565b610d52565b6104be6104b9366004614a21565b610dc8565b60405161031a9392919061502f565b6104e06104db366004614a21565b610e02565b60405161031a94939291906153b3565b6105036104fe366004614a21565b610e99565b60405161031a929190615390565b61052461051f366004614ab8565b610ed1565b60405161031a91906155de565b61039b61053f366004614bc0565b61118c565b610557610552366004614a21565b611215565b60405161031a929190615015565b61039b610573366004614603565b61124d565b610503610586366004614a21565b6118a4565b61059e610599366004614a21565b61191a565b60405161031a94939291906155f2565b6105c16105bc366004614a21565b61197b565b60405161031a9594939291906153ef565b61039b6105e0366004614b67565b611a0c565b61046b6105f33660046146c9565b611a8d565b61060b6106063660046146fc565b611b06565b60405161031a919061517b565b61048b61062636600461469e565b611bc9565b61063e610639366004614a21565b611c22565b60405161031a94939291906150d7565b61048b61065c366004614578565b611c5e565b61067461066f366004614a21565b611cd6565b60405161031a939291906154b3565b610696610691366004614a21565b611d50565b60405161031a92919061531a565b61039b611d89565b6106bf6106ba366004614a21565b611d8f565b60405161031a9493929190615445565b6106e26106dd366004614a21565b611e19565b60405161031a929190615629565b61046b6106fe36600461452a565b611e67565b61039b610711366004614603565b611ed5565b610524610724366004614ab8565b6126c7565b61048b6107373660046147cd565b612a77565b61074f61074a366004614a21565b612a96565b60405161031a919061537b565b61076f61076a366004614776565b612b91565b60405161031a939291906151c8565b61079161078c36600461452a565b612cc9565b60405161031a9291906152a4565b6107b26107ad366004614b10565b612ce2565b60405161031a939291906156db565b6107d46107cf366004614a21565b612fa4565b60405161031a93929190615582565b6000806107f7836107f2612fe1565b613005565b600061081060048551866130459092919063ffffffff16565b80602001905161082391908101906149d4565b909350905060ff8116600681111561083757fe5b915050915091565b60008080610853848263ffffffff61308816565b92506001600160e01b0319831663012b8bc960e11b1461088e5760405162461bcd60e51b8152600401610885906156a4565b60405180910390fd5b61089f84601063ffffffff6130bc16565b91506108b284602463ffffffff6130ef16565b929491935050565b6000806108c7848461124d565b91506108d38484611ed5565b90509250929050565b60008060006108ed846107f26130fb565b600061090660048651876130459092919063ffffffff16565b8060200190516109199190810190614d92565b9094509250905060ff8116600281111561092f57fe5b9350509193909250565b600080600061094885856108ba565b91509150610956828261311f565b925050505b92915050565b6000606080610972846107f2613135565b835161098890859060049063ffffffff61304516565b80602001905161099b9190810190614974565b9196909550909350915050565b6000806109b7836107f2613159565b82516109cd90849060049063ffffffff61304516565b8060200190516109e09190810190614916565b9094909350915050565b60008060606109fb846107f261317d565b6000610a1460048651876130459092919063ffffffff16565b806020019051610a279190810190614d52565b9094509250905060ff8116600181111561092f57fe5b600080606080610a4f856107f26131a1565b8451610a6590869060049063ffffffff61304516565b806020019051610a7891908101906148d2565b92989197509550909350915050565b600080610a96836107f26131c5565b6000610aaf60048551866130459092919063ffffffff16565b806020019051610ac29190810190614c90565b9250905060ff81166003811115610ad557fe5b925050915091565b6000610aef828263ffffffff61308816565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415610b3357610b2c826118a4565b5050610c5b565b6001600160e01b0319811663012b8bc960e11b1415610b5d57610b558261083f565b505050610c5b565b6001600160e01b031981167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415610ba257610b988261197b565b5050505050610c5b565b6001600160e01b031981166394cfcdd760e01b1415610bc457610b5582611cd6565b6001600160e01b031981167fc339d10a000000000000000000000000000000000000000000000000000000001415610c0857610bff82611d8f565b50505050610c5b565b6001600160e01b031981167fdc1600f3000000000000000000000000000000000000000000000000000000001415610c4357610bff82610e02565b60405162461bcd60e51b8152600401610885906156a4565b5050565b606060008251905080604051908082528060200260200182016040528015610c91578160200160208202803883390190505b50915060005b818114610cda57610cbb85858381518110610cae57fe5b6020026020010151611ed5565b838281518110610cc757fe5b6020908102919091010152600101610c97565b505092915050565b6040516060907ff47261b00000000000000000000000000000000000000000000000000000000090610d18908490602401615001565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b919050565b6040516060907fc339d10a0000000000000000000000000000000000000000000000000000000090610d8c908690869086906024016150a5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b9392505050565b6000806000610dd9846107f26131e9565b8351610def90859060049063ffffffff61304516565b80602001905161099b91908101906143f8565b600080806060610e18858363ffffffff61308816565b93506001600160e01b031984167fdc1600f30000000000000000000000000000000000000000000000000000000014610e635760405162461bcd60e51b8152600401610885906156a4565b8451610e7990869060049063ffffffff61320d16565b806020019051610e8c9190810190614396565b9597919650949350915050565b600080610ea8836107f261328d565b8251610ebe90849060049063ffffffff61304516565b8060200190516109e091908101906149f8565b6000610edb613f0c565b610f6c8584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b505afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f669190810190614c78565b3a6132b1565b60408051600280825260608281019093529293509091816020015b6060815260200190600190039081610f8757505060408051600280825260608083018452939450909160208301908038833950506040805160028082526060808301845294955090925090602083019080388339505060408051600280825260608083018452949550909250906020830190803883390190505090508861014001518460008151811061101657fe5b602002602001018190525088600001518360008151811061103357fe5b6001600160a01b039283166020918202929092010152881615611056578761106c565b73377f698c4c287018d09b516f415317aec59193325b8260008151811061107957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460000151816000815181106110ab57fe5b602002602001018181525050886101800151846001815181106110ca57fe5b60200260200101819052508860000151836001815181106110e757fe5b6001600160a01b03928316602091820292909201015260408a01511615611112578860400151611128565b73377f698c4c287018d09b516f415317aec59193325b8260018151811061113557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160018151811061116757fe5b60200260200101818152505061117f84848484613328565b9998505050505050505050565b600061120d846112086040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876134e6565b61353d565b949350505050565b600080611224836107f2613551565b825161123a90849060049063ffffffff61304516565b8060200190516109e0919081019061435d565b600080611260838263ffffffff61308816565b90506001600160e01b031981167ff47261b00000000000000000000000000000000000000000000000000000000014156112bb5760006112a784601063ffffffff6130bc16565b90506112b38186613575565b92505061189d565b6001600160e01b0319811663012b8bc960e11b1415611413576000806112e08561083f565b6040519194509250606091507f6352211e000000000000000000000000000000000000000000000000000000009061131c9084906024016152c9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b03168360405161136d9190614fe5565b600060405180830381855afa9150503d80600081146113a8576040519150601f19603f3d011682016040523d82523d6000602084013e6113ad565b606091505b509150915060008280156113c2575081516020145b6113cd5760006113de565b6113de82600c63ffffffff6130bc16565b9050896001600160a01b0316816001600160a01b031614611400576000611403565b60015b60ff16975050505050505061189d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156116035760006060806114538661197b565b5081519296509094509250905060005b8181146115f95782818151811061147657fe5b60200260200101516000141561148b576115f1565b83516060907efdd58e00000000000000000000000000000000000000000000000000000000908b908790859081106114bf57fe5b60200260200101516040516024016114d892919061510b565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060876001600160a01b0316836040516115299190614fe5565b600060405180830381855afa9150503d8060008114611564576040519150601f19603f3d011682016040523d82523d6000602084013e611569565b606091505b5091509150600082801561157e575081516020145b61158957600061159a565b61159a82600063ffffffff6130ef16565b905060008786815181106115aa57fe5b602002602001015182816115ba57fe5b049050806115d65760009b50505050505050505050505061095b565b8b8110806115e257508b155b156115eb57809b505b50505050505b600101611463565b505050505061189d565b6001600160e01b031981167fc339d10a000000000000000000000000000000000000000000000000000000001415611721576040516060907fa85e59e40000000000000000000000000000000000000000000000000000000090611672908690600090819081906024016154fb565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260045491519092506000916001600160a01b0316906116c4908490614fe5565b600060405180830381855afa9150503d80600081146116ff576040519150601f19603f3d011682016040523d82523d6000602084013e611704565b606091505b5050905080611714576000611718565b6000195b9350505061189d565b6001600160e01b031981167fdc1600f30000000000000000000000000000000000000000000000000000000014156117c85760008061175f85610e02565b50925092505061176d613678565b6001600160a01b0316826001600160a01b031614801561179a57506005546001600160a01b038281169116145b156117c15760006117b26117ac613690565b88613575565b90506117bd816136a8565b9450505b505061189d565b6001600160e01b031981166394cfcdd760e01b141561189d576060806117ed85611cd6565b80519194509250905060005b8181146118985783818151811061180c57fe5b60200260200101516000141561182157611890565b60006118408985848151811061183357fe5b602002602001015161124d565b9050600085838151811061185057fe5b6020026020010151828161186057fe5b0490508061187857600097505050505050505061095b565b87811080611884575087155b1561188d578097505b50505b6001016117f9565b505050505b5092915050565b6000806118b7838263ffffffff61308816565b91506001600160e01b031982167ff47261b000000000000000000000000000000000000000000000000000000000146119025760405162461bcd60e51b8152600401610885906156a4565b61191383601063ffffffff6130bc16565b9050915091565b6000806000606061192d856107f26138a6565b600061194660048751886130459092919063ffffffff16565b8060200190516119599190810190614cf4565b91965094509250905060ff8116600681111561197157fe5b9450509193509193565b60008060608080611992868563ffffffff61308816565b94506001600160e01b031985167fa7cb5fb700000000000000000000000000000000000000000000000000000000146119dd5760405162461bcd60e51b8152600401610885906156a4565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b600061120d84611a886040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876134e6565b6138ca565b6060808251604051908082528060200260200182016040528015611abb578160200160208202803883390190505b50905060005b8351811461189d57838181518110611ad557fe5b60200260200101516001600160a01b031631828281518110611af357fe5b6020908102919091010152600101611ac1565b606060008451905080604051908082528060200260200182016040528015611b38578160200160208202803883390190505b50915060005b818114611bc057611b89868281518110611b5457fe5b6020026020010151868381518110611b6857fe5b6020026020010151868481518110611b7c57fe5b60200260200101516126c7565b838281518110611b9557fe5b60200260200101906004811115611ba857fe5b90816004811115611bb557fe5b905250600101611b3e565b50509392505050565b60405160609063012b8bc960e11b90611be8908590859060240161510b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905092915050565b60006060806060611c35856107f26138d9565b8451611c4b90869060049063ffffffff61304516565b806020019051610a789190810190614492565b6040516060907fa7cb5fb70000000000000000000000000000000000000000000000000000000090611c9a908790879087908790602401615053565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050949350505050565b6000606080611ceb848463ffffffff61308816565b92506001600160e01b031983166394cfcdd760e01b14611d1d5760405162461bcd60e51b8152600401610885906156a4565b8351611d3390859060049063ffffffff61320d16565b806020019051611d469190810190614802565b9395909450915050565b60006060611d60836107f26138fd565b8251611d7690849060049063ffffffff61304516565b8060200190516109e09190810190614939565b60075481565b600080606081611da5858263ffffffff61308816565b93506001600160e01b031984167fc339d10a0000000000000000000000000000000000000000000000000000000014611df05760405162461bcd60e51b8152600401610885906156a4565b8451611e0690869060049063ffffffff61320d16565b806020019051610e8c919081019061443a565b600080611e28836107f2613921565b6000611e4160048551866130459092919063ffffffff16565b806020019051611e549190810190614c90565b9250905060ff81166001811115610ad557fe5b606060008251905080604051908082528060200260200182016040528015611e99578160200160208202803883390190505b50915060005b818114610cda57611eb68585838151811061183357fe5b838281518110611ec257fe5b6020908102919091010152600101611e9f565b600080611ee8838263ffffffff61308816565b90506001600160e01b031981166394cfcdd760e01b1415611fb857606080611f0f85611cd6565b80519194509250905060005b818114611fad57838181518110611f2e57fe5b602002602001015160001415611f4357611fa5565b6000611f5589858481518110610cae57fe5b90506000858381518110611f6557fe5b60200260200101518281611f7557fe5b04905080611f8d57600097505050505050505061095b565b87811080611f99575087155b15611fa2578097505b50505b600101611f1b565b5061095b9350505050565b6001600160e01b031981167ff47261b000000000000000000000000000000000000000000000000000000000141561210e576000611ffd84601063ffffffff6130bc16565b6001546040519192506060917fdd62ed3e00000000000000000000000000000000000000000000000000000000916120439189916001600160a01b031690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b0316836040516120949190614fe5565b600060405180830381855afa9150503d80600081146120cf576040519150601f19603f3d011682016040523d82523d6000602084013e6120d4565b606091505b50915091508180156120e7575080516020145b6120f2576000612103565b61210381600063ffffffff6130ef16565b95505050505061189d565b6001600160e01b0319811663012b8bc960e11b1415612373576000806121338561083f565b600254604051929550909350606092507fe985e9c5000000000000000000000000000000000000000000000000000000009161217f918a916001600160a01b0390911690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516121d09190614fe5565b600060405180830381855afa9150503d806000811461220b576040519150601f19603f3d011682016040523d82523d6000602084013e612210565b606091505b509150915081158061222457508051602014155b80612240575061223b81600063ffffffff6130ef16565b600114155b15612364576040516060907f081812fc000000000000000000000000000000000000000000000000000000009061227b9087906024016152c9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050856001600160a01b0316816040516122c89190614fe5565b600060405180830381855afa9150503d8060008114612303576040519150601f19603f3d011682016040523d82523d6000602084013e612308565b606091505b50909350915082801561231c575081516020145b801561234b57506002546001600160a01b031661234083600c63ffffffff6130bc16565b6001600160a01b0316145b612356576000612359565b60015b60ff169750506115f9565b6000199650505050505061189d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156124d35760006123b08461197b565b5050600354604051929450606093507fe985e9c500000000000000000000000000000000000000000000000000000000926123fa925089916001600160a01b031690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b03168360405161244b9190614fe5565b600060405180830381855afa9150503d8060008114612486576040519150601f19603f3d011682016040523d82523d6000602084013e61248b565b606091505b509150915081801561249e575080516020145b80156124ba57506124b681600063ffffffff6130ef16565b6001145b6124c5576000612103565b60001995505050505061189d565b6001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000141561250f57600019915061189d565b6001600160e01b031981167fdc1600f300000000000000000000000000000000000000000000000000000000141561189d5760008061254d85610e02565b50925092505061255b613678565b6001600160a01b0316826001600160a01b031614801561258857506005546001600160a01b038281169116145b156126be576005546040516060917fdd62ed3e00000000000000000000000000000000000000000000000000000000916125d2918a916001600160a01b0390911690602401615015565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905060006060612612613690565b6001600160a01b0316836040516126299190614fe5565b600060405180830381855afa9150503d8060008114612664576040519150601f19603f3d011682016040523d82523d6000602084013e612669565b606091505b5091509150600082801561267e575081516020145b61268957600061269a565b61269a82600063ffffffff6130ef16565b905060001981146126b3576126ae816136a8565b6126b7565b6000195b9750505050505b50505092915050565b60006126d1613f0c565b6127248584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b60408051600480825260a0820190925291925060609190816020015b606081526020019060019003908161274057505060408051600480825260a082019092529192506060919060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339019050509050886101600151846000815181106127d657fe5b602002602001018190525087836000815181106127ef57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088600001518260008151811061282157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050868160008151811061284f57fe5b6020026020010181815250508861014001518460018151811061286e57fe5b602002602001018190525088600001518360018151811061288b57fe5b6001600160a01b0392831660209182029290920101528816156128ae57876128c4565b73377f698c4c287018d09b516f415317aec59193325b826001815181106128d157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084600001518160018151811061290357fe5b602002602001018181525050886101a001518460028151811061292257fe5b6020026020010181905250878360028151811061293b57fe5b6001600160a01b03928316602091820292909201015260408a0151161561296657886040015161297c565b73377f698c4c287018d09b516f415317aec59193325b8260028151811061298957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460600151816002815181106129bb57fe5b602002602001018181525050886101800151846003815181106129da57fe5b60200260200101819052508860000151836003815181106129f757fe5b6001600160a01b03928316602091820292909201015260408a01511615612a22578860400151612a38565b73377f698c4c287018d09b516f415317aec59193325b82600381518110612a4557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160038151811061116757fe5b6040516060906394cfcdd760e01b90611be89085908590602401615276565b6000612aa8828263ffffffff61308816565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001480612af257506001600160e01b0319811663012b8bc960e11b145b80612b2657506001600160e01b031981167fa7cb5fb700000000000000000000000000000000000000000000000000000000145b80612b4157506001600160e01b031981166394cfcdd760e01b145b80612b7557506001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000145b610d4d5760405162461bcd60e51b8152600401610885906156a4565b606080606060008551905080604051908082528060200260200182016040528015612bd657816020015b612bc3613f3b565b815260200190600190039081612bbb5790505b50935080604051908082528060200260200182016040528015612c03578160200160208202803883390190505b50925080604051908082528060200260200182016040528015612c30578160200160208202803883390190505b50915060005b818114612cc057612c6d878281518110612c4c57fe5b6020026020010151878381518110612c6057fe5b6020026020010151612ce2565b8751889085908110612c7b57fe5b60200260200101878581518110612c8e57fe5b60200260200101878681518110612ca157fe5b9315156020948502919091019093019290925291905252600101612c36565b50509250925092565b606080612cd68484611e67565b91506108d38484610c5f565b612cea613f3b565b6006546040517f9d3fa4b900000000000000000000000000000000000000000000000000000000815260009182916001600160a01b0390911690639d3fa4b990612d389088906004016156ff565b60606040518083038186803b158015612d5057600080fd5b505afa158015612d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d889190810190614a70565b85516006546040517fa12dcc6f00000000000000000000000000000000000000000000000000000000815292955090916001600160a01b039091169063a12dcc6f90612dda9089908990600401615712565b60206040518083038186803b158015612df257600080fd5b505afa158015612e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e2a91908101906148b2565b91506000612e3d82886101400151610939565b60a088015160c08901516101808a01516101408b015193945091929091600091612e6c9163ffffffff61394516565b15612e9957612e9284612e8c848d6080015161396a90919063ffffffff16565b85613986565b9050612ef2565b81612ead57612e92848b6080015185613986565b6000612ebe868c6101800151610939565b90506000612ed1868d6080015187613986565b90506000612ee0838688613986565b9050612eec828261311f565b93505050505b612f12612f0c8960400151856139a890919063ffffffff16565b8261311f565b96506004612f258b8c602001518a610ed1565b6004811115612f3057fe5b14612f3c576000612f3e565b865b9650612f4e8a61016001516139c7565b612f5757600096505b60e08a015115801590612f755750612f738a6101a001516139c7565b155b15612f7f57600096505b600388516006811115612f8e57fe5b14612f9857600096505b50505050509250925092565b6000806000612fb5846107f2613ab1565b6000612fce60048651876130459092919063ffffffff16565b8060200190516109199190810190614cbd565b7ffdb6ca8d0000000000000000000000000000000000000000000000000000000090565b6000613012836000613088565b90506001600160e01b0319808216908316146130405760405162461bcd60e51b81526004016108859061566d565b505050565b6060818311156130635761306361305e60008585613ad5565b613af4565b835182111561307c5761307c61305e6001848751613ad5565b50819003910190815290565b600081600401835110156130a9576130a961305e6003855185600401613ad5565b5001602001516001600160e01b03191690565b600081601401835110156130dd576130dd61305e6004855185601401613ad5565b5001601401516001600160a01b031690565b6000610dc18383613afc565b7f18e4b1410000000000000000000000000000000000000000000000000000000090565b600081831061312e5781610dc1565b5090919050565b7f4678472b0000000000000000000000000000000000000000000000000000000090565b7fb6555d6f0000000000000000000000000000000000000000000000000000000090565b7f488219a60000000000000000000000000000000000000000000000000000000090565b7f1b8388f70000000000000000000000000000000000000000000000000000000090565b7fe94a7ed00000000000000000000000000000000000000000000000000000000090565b7f4ad312750000000000000000000000000000000000000000000000000000000090565b6060818311156132265761322661305e60008585613ad5565b835182111561323f5761323f61305e6001848751613ad5565b8282036040519080825280601f01601f19166020018201604052801561326c576020820181803883390190505b509050610dc161327b82613b26565b8461328587613b26565b018351613b2c565b7f11c7b7200000000000000000000000000000000000000000000000000000000090565b6132b9613f0c565b6020810184905260a085015160808601516132d5918691613bd1565b815260a085015160c08601516132ec918691613bd1565b604082015260a085015160e0860151613306918691613bd1565b606082015261331b828463ffffffff613c0516565b6080820152949350505050565b6040516000906060907fb04fbddd0000000000000000000000000000000000000000000000000000000090613367908890889088908890602401615124565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260065491519092506060916001600160a01b0316906133b9908490614fe5565b6000604051808303816000865af19150503d80600081146133f6576040519150601f19603f3d011682016040523d82523d6000602084013e6133fb565b606091505b50915060009050613412828263ffffffff61308816565b905061341c61317d565b6001600160e01b03198281169116141561345957600061343b836109ea565b5091505060ff8116600481111561344e57fe5b94505050505061120d565b613461613135565b6001600160e01b03198281169116141561349457600061348083610961565b509091505060ff8116600481111561344e57fe5b815160208301207ff43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce014156134ce576004935050505061120d565b60405162461bcd60e51b815260040161088590615636565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b6000610dc18261354c85613c36565b613cb1565b7fa15c0d060000000000000000000000000000000000000000000000000000000090565b6040516000906060907f70a0823100000000000000000000000000000000000000000000000000000000906135ae908590602401615001565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060856001600160a01b0316836040516135ff9190614fe5565b600060405180830381855afa9150503d806000811461363a576040519150601f19603f3d011682016040523d82523d6000602084013e61363f565b606091505b5091509150818015613652575080516020145b61365d57600061366e565b61366e81600063ffffffff6130ef16565b9695505050505050565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b6000806136b3613690565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156136ed57600080fd5b505af1158015613701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137259190810190614a54565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561376457600080fd5b505af1158015613778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061379c9190810190614c78565b421161381a57816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156137dd57600080fd5b505af11580156137f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506138159190810190614c78565b61388d565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561385557600080fd5b505af1158015613869573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061388d9190810190614c78565b905061120d816b033b2e3c9fd0803ce800000086613986565b7f7e5a23180000000000000000000000000000000000000000000000000000000090565b6000610dc18261354c85613ceb565b7f5bd0428d0000000000000000000000000000000000000000000000000000000090565b7f20d11f610000000000000000000000000000000000000000000000000000000090565b7ff59851840000000000000000000000000000000000000000000000000000000090565b600081518351148015610dc15750508051602091820120825192909101919091201490565b600082820183811015610dc157610dc161305e60008686613da4565b600061120d8361399c868563ffffffff613c0516565b9063ffffffff613dc316565b6000828211156139c1576139c161305e60028585613da4565b50900390565b600060208251816139d457fe5b066004146139e457506000610d4d565b60006139f6838263ffffffff61308816565b90506001600160e01b031981166394cfcdd760e01b14613a1a576001915050610d4d565b606080613a2685611cd6565b80519194509250905060005b818114613aa4576000613a626000858481518110613a4c57fe5b602002602001015161308890919063ffffffff16565b90506001600160e01b0319811663012b8bc960e11b1415613a9b57613a878483613ded565b15613a9b5760009650505050505050610d4d565b50600101613a32565b5060019695505050505050565b7fe53c76c80000000000000000000000000000000000000000000000000000000090565b6060632800659560e01b848484604051602401610d8c939291906155d0565b805160208201fd5b60008160200183511015613b1d57613b1d61305e6005855185602001613ad5565b50016020015190565b60200190565b6020811015613b56576001816020036101000a038019835116818551168082178652505050613040565b82821415613b6357613040565b82821115613b9d5760208103905080820181840181515b82851015613b95578451865260209586019590940193613b7a565b905250613040565b60208103905080820181840183515b81861215613bc85782518252601f199283019290910190613bac565b85525050505050565b6000613bde848484613e50565b15613bf157613bf161305e858585613eb6565b61120d8361399c868563ffffffff613c0516565b600082613c145750600061095b565b82820282848281613c2157fe5b0414610dc157610dc161305e60018686613da4565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613d3757fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b606063e946c1bb60e01b848484604051602401610d8c93929190615561565b600081613dd957613dd961305e60038585613da4565b6000828481613de457fe5b04949350505050565b8151600090600183015b81811015610cda57613e38858281518110613e0e57fe5b6020026020010151868681518110613e2257fe5b602002602001015161394590919063ffffffff16565b15613e485760019250505061095b565b600101613df7565b600082613e6257613e6261305e613ed5565b811580613e6d575083155b15613e7a57506000610dc1565b60008380613e8457fe5b8584099050613e99858463ffffffff613c0516565b613eab826103e863ffffffff613c0516565b101595945050505050565b606063339f3de260e01b848484604051602401610d8c93929190615737565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b803561095b81615813565b600082601f830112613f78578081fd5b8135613f8b613f8682615774565b61574d565b818152915060208083019084810181840286018201871015613fac57600080fd5b60005b84811015611898578135613fc281615813565b84529282019290820190600101613faf565b600082601f830112613fe4578081fd5b8151613ff2613f8682615774565b8181529150602080830190840160005b8381101561402f5761401a876020845189010161419b565b83526020928301929190910190600101614002565b5050505092915050565b600082601f830112614049578081fd5b8135614057613f8682615774565b8181529150602080830190840160005b8381101561402f5761407f876020843589010161414d565b83526020928301929190910190600101614067565b600082601f8301126140a4578081fd5b81356140b2613f8682615774565b8181529150602080830190840160005b8381101561402f576140da87602084358901016141e1565b835260209283019291909101906001016140c2565b600082601f8301126140ff578081fd5b813561410d613f8682615774565b81815291506020808301908481018184028601820187101561412e57600080fd5b60005b8481101561189857813584529282019290820190600101614131565b600082601f83011261415d578081fd5b813561416b613f8682615794565b915080825283602082850101111561418257600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126141ab578081fd5b81516141b9613f8682615794565b91508082528360208285010111156141d057600080fd5b61189d8160208401602086016157b8565b60006101c08083850312156141f4578182fd5b6141fd8161574d565b91505061420a8383613f5d565b81526142198360208401613f5d565b602082015261422b8360408401613f5d565b604082015261423d8360608401613f5d565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561429f57600080fd5b6142ab8683870161414d565b838501526101609250828501359150808211156142c757600080fd5b6142d38683870161414d565b838501526101809250828501359150808211156142ef57600080fd5b6142fb8683870161414d565b838501526101a092508285013591508082111561431757600080fd5b506143248582860161414d565b82840152505092915050565b805160ff8116811461095b57600080fd5b600060208284031215614352578081fd5b8135610dc181615813565b6000806040838503121561436f578081fd5b825161437a81615813565b602084015190925061438b81615813565b809150509250929050565b6000806000606084860312156143aa578081fd5b83516143b581615813565b60208501519093506143c681615813565b604085015190925067ffffffffffffffff8111156143e2578182fd5b6143ee8682870161419b565b9150509250925092565b60008060006060848603121561440c578081fd5b835161441781615813565b602085015190935061442881615813565b80925050604084015190509250925092565b60008060006060848603121561444e578081fd5b835161445981615813565b602085015190935067ffffffffffffffff811115614475578182fd5b6144818682870161419b565b925050604084015190509250925092565b600080600080608085870312156144a7578182fd5b84516144b281615813565b602086015190945067ffffffffffffffff808211156144cf578384fd5b6144db8883890161419b565b945060408701519150808211156144f0578384fd5b6144fc8883890161419b565b93506060870151915080821115614511578283fd5b5061451e8782880161419b565b91505092959194509250565b6000806040838503121561453c578182fd5b823561454781615813565b9150602083013567ffffffffffffffff811115614562578182fd5b61456e85828601614039565b9150509250929050565b6000806000806080858703121561458d578182fd5b843561459881615813565b9350602085013567ffffffffffffffff808211156145b4578384fd5b6145c0888389016140ef565b945060408701359150808211156145d5578384fd5b6145e1888389016140ef565b935060608701359150808211156145f6578283fd5b5061451e8782880161414d565b60008060408385031215614615578182fd5b823561462081615813565b9150602083013567ffffffffffffffff81111561463b578182fd5b61456e8582860161414d565b60008060006060848603121561465b578081fd5b833561466681615813565b9250602084013567ffffffffffffffff811115614681578182fd5b61468d8682870161414d565b925050604084013590509250925092565b600080604083850312156146b0578182fd5b82356146bb81615813565b946020939093013593505050565b6000602082840312156146da578081fd5b813567ffffffffffffffff8111156146f0578182fd5b61120d84828501613f68565b600080600060608486031215614710578081fd5b833567ffffffffffffffff80821115614727578283fd5b61473387838801614094565b94506020860135915080821115614748578283fd5b61475487838801613f68565b93506040860135915080821115614769578283fd5b506143ee868287016140ef565b60008060408385031215614788578182fd5b823567ffffffffffffffff8082111561479f578384fd5b6147ab86838701614094565b935060208501359150808211156147c0578283fd5b5061456e85828601614039565b600080604083850312156147df578182fd5b823567ffffffffffffffff808211156147f6578384fd5b6147ab868387016140ef565b60008060408385031215614814578182fd5b825167ffffffffffffffff8082111561482b578384fd5b81850186601f82011261483c578485fd5b8051925061484c613f8684615774565b80848252602080830192508084018a82838902870101111561486c578889fd5b8894505b8685101561488e578051845260019490940193928101928101614870565b5088015190965093505050808211156148a5578283fd5b5061456e85828601613fd4565b6000602082840312156148c3578081fd5b81518015158114610dc1578182fd5b600080600080608085870312156148e7578182fd5b8451935060208501516148f981615813565b604086015190935067ffffffffffffffff808211156144f0578384fd5b60008060408385031215614928578182fd5b505080516020909101519092909150565b6000806040838503121561494b578182fd5b82519150602083015167ffffffffffffffff811115614968578182fd5b61456e8582860161419b565b600080600060608486031215614988578081fd5b83519250602084015167ffffffffffffffff808211156149a6578283fd5b6149b28783880161419b565b935060408601519150808211156149c7578283fd5b506143ee8682870161419b565b600080604083850312156149e6578182fd5b82519150602083015161438b81615828565b60008060408385031215614a0a578182fd5b82516001600160e01b03198116811461437a578283fd5b600060208284031215614a32578081fd5b813567ffffffffffffffff811115614a48578182fd5b61120d8482850161414d565b600060208284031215614a65578081fd5b8151610dc181615813565b600060608284031215614a81578081fd5b614a8b606061574d565b825160078110614a99578283fd5b8152602083810151908201526040928301519281019290925250919050565b600080600060608486031215614acc578081fd5b833567ffffffffffffffff811115614ae2578182fd5b614aee868287016141e1565b9350506020840135614aff81615813565b929592945050506040919091013590565b60008060408385031215614b22578182fd5b823567ffffffffffffffff80821115614b39578384fd5b614b45868387016141e1565b93506020850135915080821115614b5a578283fd5b5061456e8582860161414d565b600080600060608486031215614b7b578081fd5b833567ffffffffffffffff811115614b91578182fd5b614b9d868287016141e1565b935050602084013591506040840135614bb581615813565b809150509250925092565b600080600060608486031215614bd4578081fd5b833567ffffffffffffffff80821115614beb578283fd5b81860160a08189031215614bfd578384fd5b614c0760a061574d565b9250803583526020810135602084015260408101356040840152614c2e8860608301613f5d565b6060840152608081013582811115614c44578485fd5b614c508982840161414d565b608085015250919450505060208401359150614c6f8560408601613f5d565b90509250925092565b600060208284031215614c89578081fd5b5051919050565b60008060408385031215614ca2578182fd5b8251614cad81615828565b6020939093015192949293505050565b600080600060608486031215614cd1578081fd5b8351614cdc81615828565b602085015160408601519194509250614bb581615813565b60008060008060808587031215614d09578182fd5b614d138686614330565b9350602085015192506040850151614d2a81615813565b606086015190925067ffffffffffffffff811115614d46578182fd5b61451e8782880161419b565b600080600060608486031215614d66578081fd5b614d708585614330565b925060208401519150604084015167ffffffffffffffff8111156143e2578182fd5b600080600060608486031215614da6578081fd5b614db08585614330565b925060208401519150604084015190509250925092565b6001600160a01b03169052565b6000815180845260208401935060208301825b82811015614e0e5781516001600160a01b0316865260209586019590910190600101614de7565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b84811015614e63578284038852614e4d848351614ea0565b6020988901989094509190910190600101614e35565b50919695505050505050565b6000815180845260208401935060208301825b82811015614e0e578151865260209586019590910190600101614e82565b60008151808452614eb88160208601602086016157b8565b601f01601f19169290920160200192915050565b8051614ed781615809565b825260208181015190830152604090810151910152565b60006101c0614efe848451614dc7565b6020830151614f106020860182614dc7565b506040830151614f236040860182614dc7565b506060830151614f366060860182614dc7565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518186015250610120808401518186015250610140808401518282870152614f8f83870182614ea0565b91505061016091508184015185820383870152614fac8282614ea0565b925050506101808084015185830382870152614fc88382614ea0565b9150506101a09150818401518582038387015261366e8282614ea0565b60008251614ff78184602087016157b8565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006001600160a01b0386168252608060208301526150756080830186614e6f565b82810360408401526150878186614e6f565b83810360608501526150998186614ea0565b98975050505050505050565b60006001600160a01b0385168252606060208301526150c76060830185614ea0565b9050826040830152949350505050565b60006001600160a01b0386168252608060208301526150f96080830186614ea0565b82810360408401526150878186614ea0565b6001600160a01b03929092168252602082015260400190565b6000608082526151376080830187614e18565b82810360208401526151498187614dd4565b838103604085015261515b8187614dd4565b91505082810360608401526151708185614e6f565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156151bd578351600581106151a957fe5b835260209384019390920191600101615195565b509095945050505050565b606080825284519082018190526000906020906080840190828801845b8281101561520b576151f8848351614ecc565b60609390930192908401906001016151e5565b5050508381038285015261521f8187614e6f565b84810360408601528551808252908301915082860190845b81811015615255578251151584529284019291840191600101615237565b509198975050505050505050565b600060208252610dc16020830184614e6f565b6000604082526152896040830185614e6f565b828103602084015261529b8185614e18565b95945050505050565b6000604082526152b76040830185614e6f565b828103602084015261529b8185614e6f565b90815260200190565b60008582526001600160a01b0385166020830152608060408301526152fa6080830185614ea0565b82810360608401526151708185614ea0565b918252602082015260400190565b60008382526040602083015261120d6040830184614ea0565b60008482526060602083015261534c6060830185614ea0565b828103604084015261366e8185614ea0565b8281526040810161536e83615809565b8260208301529392505050565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b60006001600160e01b0319861682526001600160a01b0380861660208401528085166040840152506080606083015261366e6080830184614ea0565b60006001600160e01b0319871682526001600160a01b038616602083015260a0604083015261542160a0830186614e6f565b82810360608401526154338186614e6f565b838103608085015261117f8186614ea0565b60006001600160e01b0319861682526001600160a01b0385166020830152608060408301526154776080830185614ea0565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b60006001600160e01b031985168252606060208301526154d66060830185614e6f565b828103604084015261366e8185614e18565b600060208252610dc16020830184614ea0565b60006080825261550e6080830187614ea0565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6000615544856157e8565b8482528360208301526060604083015261529b6060830184614ea0565b6060810161556e856157f5565b938152602081019290925260409091015290565b6060810161558f856157ff565b93815260208101929092526001600160a01b031660409091015290565b604081016155b9846157f5565b9281526020015290565b6060810161556e856157ff565b606081016008851061556e57fe5b60208101600583106155ec57fe5b91905290565b60006155fd86615809565b8582528460208301526001600160a01b03841660408301526080606083015261366e6080830184614ea0565b604081016155b9846157e8565b60208082526013908201527f554e4b4e4f574e5f52455455524e5f4441544100000000000000000000000000604082015260600190565b6020808252600c908201527f4241445f53454c4543544f520000000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f57524f4e475f50524f58595f4944000000000000000000000000000000000000604082015260600190565b60a081016156e98286614ecc565b8360608301528215156080830152949350505050565b600060208252610dc16020830184614eee565b6000604082526157256040830185614eee565b828103602084015261529b8185614ea0565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561576c57600080fd5b604052919050565b600067ffffffffffffffff82111561578a578081fd5b5060209081020190565b600067ffffffffffffffff8211156157aa578081fd5b50601f01601f191660200190565b60005b838110156157d35781810151838201526020016157bb565b838111156157e2576000848401525b50505050565b600281106157f257fe5b50565b600481106157f257fe5b600381106157f257fe5b600781106157f257fe5b6001600160a01b03811681146157f257600080fd5b60ff811681146157f257600080fdfea365627a7a72315820b8f5e1baee716487ac576e78a6a19b92db1db8535a5a9d8ed8a3c9e3e2968a386c6578706572696d656e74616cf564736f6c63430005100040" + "object": "0x608060405234801561001057600080fd5b506004361061025c5760003560e01c8063a5cd62ba11610145578063d3637905116100bd578063e4e6e7da1161008c578063ee18599711610071578063ee185997146105b5578063ef3bb097146105bd578063ff84e7cc146105c55761025c565b8063e4e6e7da14610572578063e77286eb146105935761025c565b8063d36379051461050a578063d3d862d11461051d578063d469502814610530578063e25cabf7146105505761025c565b8063c26cfecd11610114578063ca49f47c116100f9578063ca49f47c146104c1578063d001c5dc146104e4578063d186037f146104f75761025c565b8063c26cfecd146104b1578063c82037ef146104b95761025c565b8063a5cd62ba14610449578063a6627e9f14610469578063b43cffe11461047c578063bbb2dcf61461048f5761025c565b80637982653e116101d85780639baf2705116101a75780639eadc8351161018c5780639eadc835146103ff578063a070cac814610423578063a0901e51146104365761025c565b80639baf2705146103e25780639cd01605146103f75761025c565b80637982653e1461037b57806379c9c4261461039b5780637d727512146103ae5780638f4ce479146103c15761025c565b80634dfdac201161022f57806363eb39921161021457806363eb3992146103225780636f83188e14610335578063750bdb30146103585761025c565b80634dfdac20146102e2578063590aa875146103025761025c565b806304a5618a146102615780630d7b7d761461028c5780632322cf76146102ad57806346eb65cb146102cd575b600080fd5b61027461026f36600461406c565b6105cd565b60405161028393929190614abe565b60405180910390f35b61029f61029a366004613b30565b610666565b604051610283929190614ca6565b6102c06102bb366004613b30565b610688565b604051610283919061499b565b6102e06102db36600461406c565b6106b0565b005b6102f56102f0366004613a4b565b610734565b60405161028391906148f3565b610315610310366004613a2f565b6107b7565b6040516102839190614b1e565b610315610330366004613b74565b610866565b61034861034336600461406c565b610919565b6040516102839493929190614bb2565b61036b61036636600461406c565b6109b9565b60405161028394939291906149dc565b61038e610389366004614242565b610a4b565b6040516102839190614b9f565b6102c06103a936600461434a565b610afd565b6102c06103bc366004613b30565b610b7e565b6103d46103cf36600461406c565b611474565b6040516102839291906149b9565b6103ea611507565b604051610283919061465f565b6103ea611516565b61041261040d36600461406c565b611525565b604051610283959493929190614a18565b6102c06104313660046142f1565b6115ca565b6102f5610444366004613bf6565b61164b565b61045c610457366004613cc4565b6116c4565b604051610283919061480c565b610315610477366004613bcb565b61177e565b61031561048a366004613a99565b61182e565b6104a261049d36600461406c565b6118e4565b60405161028393929190614ae9565b6102c0611974565b6103ea61197a565b6104d46104cf36600461406c565b611989565b6040516102839493929190614a7b565b6102f56104f2366004613a4b565b611a1b565b6102c0610505366004613b30565b611a89565b61038e610518366004614242565b612365565b61031561052b366004613d9f565b6123c7565b61054361053e36600461406c565b61241c565b60405161028391906149a4565b61056361055e366004613d48565b6124bf565b60405161028393929190614858565b610585610580366004613a4b565b6125f7565b604051610283929190614976565b6105a66105a136600461429a565b612610565b60405161028393929190614c4a565b6103ea612980565b6103ea61298f565b6103ea61299e565b600080600073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a856040518263ffffffff1660e01b81526004016106099190614b1e565b60606040518083038186803b15801561062157600080fd5b505af4158015610635573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106599190810190613fc2565b9250925092509193909250565b6000806106738484610b7e565b915061067f8484611a89565b90509250929050565b60008060006106978585610666565b915091506106a582826129ad565b925050505b92915050565b6040517f46eb65cb00000000000000000000000000000000000000000000000000000000815273__$d8b635de2bf4a097b4e18b67d0fb68e779$__906346eb65cb90610700908490600401614b1e565b60006040518083038186803b15801561071857600080fd5b505af415801561072c573d6000803e3d6000fd5b505050505b50565b606060008251905080604051908082528060200260200182016040528015610766578160200160208202803883390190505b50915060005b8181146107af576107908585838151811061078357fe5b6020026020010151611a89565b83828151811061079c57fe5b602090810291909101015260010161076c565b505092915050565b6040517f590aa87500000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063590aa8759061080a90859060040161465f565b60006040518083038186803b15801561082257600080fd5b505af4158015610836573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085e919081019061409f565b90505b919050565b6040517f63eb399200000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__906363eb3992906108bd9087908790879060040161478c565b60006040518083038186803b1580156108d557600080fd5b505af41580156108e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610911919081019061409f565b949350505050565b60608060608073__$fddee3b26a806429350031cf3481976d2e$__636f83188e866040518263ffffffff1660e01b81526004016109569190614b1e565b60006040518083038186803b15801561096e57600080fd5b505af4158015610982573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa919081019061410d565b93509350935093509193509193565b6000806000606073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016109f79190614b1e565b60006040518083038186803b158015610a0f57600080fd5b505af4158015610a23573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa9190810190613e46565b600080546040517f9caa023b00000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__91639caa023b91610aad916001600160a01b0316908890889088906004016147be565b60206040518083038186803b158015610ac557600080fd5b505af4158015610ad9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061091191908101906140ee565b600061091184610b796040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876129c3565b612a1a565b600080610b91838263ffffffff612a2e16565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415610bec576000610bd884601063ffffffff612a6716565b9050610be48186612a9a565b92505061146d565b6001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415610e055760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a866040518263ffffffff1660e01b8152600401610c589190614b1e565b60606040518083038186803b158015610c7057600080fd5b505af4158015610c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ca89190810190613fc2565b6040519194509250606091507f6352211e0000000000000000000000000000000000000000000000000000000090610ce490849060240161499b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b031683604051610d5f9190614643565b600060405180830381855afa9150503d8060008114610d9a576040519150601f19603f3d011682016040523d82523d6000602084013e610d9f565b606091505b50915091506000828015610db4575081516020145b610dbf576000610dd0565b610dd082600c63ffffffff612a6716565b9050896001600160a01b0316816001600160a01b031614610df2576000610df5565b60015b60ff16975050505050505061146d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156110a157600060608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__639eadc835876040518263ffffffff1660e01b8152600401610e739190614b1e565b60006040518083038186803b158015610e8b57600080fd5b505af4158015610e9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ec79190810190613eb0565b5081519296509094509250905060005b81811461109757828181518110610eea57fe5b602002602001015160001415610eff5761108f565b83516060907efdd58e00000000000000000000000000000000000000000000000000000000908b90879085908110610f3357fe5b6020026020010151604051602401610f4c9291906147f3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060876001600160a01b031683604051610fc79190614643565b600060405180830381855afa9150503d8060008114611002576040519150601f19603f3d011682016040523d82523d6000602084013e611007565b606091505b5091509150600082801561101c575081516020145b611027576000611038565b61103882600063ffffffff612b9216565b9050600087868151811061104857fe5b6020026020010151828161105857fe5b049050806110745760009b5050505050505050505050506106aa565b8b81108061108057508b155b1561108957809b505b50505050505b600101610ed7565b505050505061146d565b6001600160e01b031981167fc339d10a0000000000000000000000000000000000000000000000000000000014156111d4576040516060907fa85e59e4000000000000000000000000000000000000000000000000000000009061111090869060009081908190602401614b31565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611177908490614643565b600060405180830381855afa9150503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b50509050806111c75760006111cb565b6000195b9350505061146d565b6001600160e01b031981167fdc1600f30000000000000000000000000000000000000000000000000000000014156112fd5760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016112409190614b1e565b60006040518083038186803b15801561125857600080fd5b505af415801561126c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112949190810190613e46565b5092509250506112a2612b9e565b6001600160a01b0316826001600160a01b03161480156112cf57506005546001600160a01b038281169116145b156112f65760006112e76112e1612bb6565b88612a9a565b90506112f281612bce565b9450505b505061146d565b6001600160e01b031981167f94cfcdd700000000000000000000000000000000000000000000000000000000141561146d5760608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6866040518263ffffffff1660e01b81526004016113699190614b1e565b60006040518083038186803b15801561138157600080fd5b505af4158015611395573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113bd9190810190614002565b80519194509250905060005b818114611468578381815181106113dc57fe5b6020026020010151600014156113f157611460565b60006114108985848151811061140357fe5b6020026020010151610b7e565b9050600085838151811061142057fe5b6020026020010151828161143057fe5b049050806114485760009750505050505050506106aa565b87811080611454575087155b1561145d578097505b50505b6001016113c9565b505050505b5092915050565b60008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__638f4ce479846040518263ffffffff1660e01b81526004016114ae9190614b1e565b604080518083038186803b1580156114c557600080fd5b505af41580156114d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114fd9190810190613e0f565b915091505b915091565b6004546001600160a01b031681565b6000546001600160a01b031681565b600080606080606073__$d8b635de2bf4a097b4e18b67d0fb68e779$__639eadc835876040518263ffffffff1660e01b81526004016115649190614b1e565b60006040518083038186803b15801561157c57600080fd5b505af4158015611590573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115b89190810190613eb0565b939a9299509097509550909350915050565b6000610911846116466040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876129c3565b612dcc565b6060808251604051908082528060200260200182016040528015611679578160200160208202803883390190505b50905060005b8351811461146d5783818151811061169357fe5b60200260200101516001600160a01b0316318282815181106116b157fe5b602090810291909101015260010161167f565b6000546040517f02cffc4500000000000000000000000000000000000000000000000000000000815260609173__$7a69f714cdde1cb6b62e3c39bc8c94deae$__916302cffc459161172a916001600160a01b039091169088908890889060040161468d565b60006040518083038186803b15801561174257600080fd5b505af4158015611756573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109119190810190613c29565b6040517fa6627e9f00000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063a6627e9f906117d390869086906004016147f3565b60006040518083038186803b1580156117eb57600080fd5b505af41580156117ff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611827919081019061409f565b9392505050565b6040517fb43cffe100000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063b43cffe190611887908890889088908890600401614746565b60006040518083038186803b15801561189f57600080fd5b505af41580156118b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118db919081019061409f565b95945050505050565b600060608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6856040518263ffffffff1660e01b81526004016119209190614b1e565b60006040518083038186803b15801561193857600080fd5b505af415801561194c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106599190810190614002565b60065481565b6005546001600160a01b031681565b6000806060600073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63ca49f47c866040518263ffffffff1660e01b81526004016119c79190614b1e565b60006040518083038186803b1580156119df57600080fd5b505af41580156119f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa9190810190613f5a565b606060008251905080604051908082528060200260200182016040528015611a4d578160200160208202803883390190505b50915060005b8181146107af57611a6a8585838151811061140357fe5b838281518110611a7657fe5b6020908102919091010152600101611a53565b600080611a9c838263ffffffff612a2e16565b90506001600160e01b031981167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611c075760608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6866040518263ffffffff1660e01b8152600401611b0a9190614b1e565b60006040518083038186803b158015611b2257600080fd5b505af4158015611b36573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b5e9190810190614002565b80519194509250905060005b818114611bfc57838181518110611b7d57fe5b602002602001015160001415611b9257611bf4565b6000611ba48985848151811061078357fe5b90506000858381518110611bb457fe5b60200260200101518281611bc457fe5b04905080611bdc5760009750505050505050506106aa565b87811080611be8575087155b15611bf1578097505b50505b600101611b6a565b506106aa9350505050565b6001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415611c68576000611c4c84601063ffffffff612a6716565b600154909150610be490829087906001600160a01b0316612ddb565b6001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415611fb85760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a866040518263ffffffff1660e01b8152600401611cd49190614b1e565b60606040518083038186803b158015611cec57600080fd5b505af4158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d249190810190613fc2565b600254604051929550909350606092507fe985e9c50000000000000000000000000000000000000000000000000000000091611d70918a916001600160a01b0390911690602401614673565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b031683604051611deb9190614643565b600060405180830381855afa9150503d8060008114611e26576040519150601f19603f3d011682016040523d82523d6000602084013e611e2b565b606091505b5091509150811580611e3f57508051602014155b80611e5b5750611e5681600063ffffffff612b9216565b600114155b15611fa9576040516060907f081812fc0000000000000000000000000000000000000000000000000000000090611e9690879060240161499b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050856001600160a01b031681604051611f0d9190614643565b600060405180830381855afa9150503d8060008114611f48576040519150601f19603f3d011682016040523d82523d6000602084013e611f4d565b606091505b509093509150828015611f61575081516020145b8015611f9057506002546001600160a01b0316611f8583600c63ffffffff612a6716565b6001600160a01b0316145b611f9b576000611f9e565b60015b60ff16975050611097565b6000199650505050505061146d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156121df576040517f9eadc83500000000000000000000000000000000000000000000000000000000815260009073__$d8b635de2bf4a097b4e18b67d0fb68e779$__90639eadc8359061203d908790600401614b1e565b60006040518083038186803b15801561205557600080fd5b505af4158015612069573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120919190810190613eb0565b5050600354604051929450606093507fe985e9c500000000000000000000000000000000000000000000000000000000926120db925089916001600160a01b031690602401614673565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060836001600160a01b0316836040516121569190614643565b600060405180830381855afa9150503d8060008114612191576040519150601f19603f3d011682016040523d82523d6000602084013e612196565b606091505b50915091508180156121a9575080516020145b80156121c557506121c181600063ffffffff612b9216565b6001145b6121d05760006121d4565b6000195b95505050505061146d565b6001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000141561221b57600019915061146d565b6001600160e01b031981167fdc1600f300000000000000000000000000000000000000000000000000000000141561146d5760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016122879190614b1e565b60006040518083038186803b15801561229f57600080fd5b505af41580156122b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122db9190810190613e46565b5092509250506122e9612b9e565b6001600160a01b0316826001600160a01b031614801561231657506005546001600160a01b038281169116145b1561235c57600061233b612328612bb6565b60055489906001600160a01b0316612ddb565b905060001981146123545761234f81612bce565b612358565b6000195b9450505b50505092915050565b600080546040517f8dccde0400000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__91638dccde0491610aad916001600160a01b0316908890889088906004016147be565b6040517fd3d862d100000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063d3d862d1906117d39086908690600401614906565b6040517fd469502800000000000000000000000000000000000000000000000000000000815260009073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063d46950289061246f908590600401614b1e565b60206040518083038186803b15801561248757600080fd5b505af415801561249b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061085e9190810190613df4565b60608060606000855190508060405190808252806020026020018201604052801561250457816020015b6124f1613467565b8152602001906001900390816124e95790505b50935080604051908082528060200260200182016040528015612531578160200160208202803883390190505b5092508060405190808252806020026020018201604052801561255e578160200160208202803883390190505b50915060005b8181146125ee5761259b87828151811061257a57fe5b602002602001015187838151811061258e57fe5b6020026020010151612610565b87518890859081106125a957fe5b602002602001018785815181106125bc57fe5b602002602001018786815181106125cf57fe5b9315156020948502919091019093019290925291905252600101612564565b50509250925092565b6060806126048484611a1b565b915061067f8484610734565b612618613467565b600080546040517f9d3fa4b900000000000000000000000000000000000000000000000000000000815282916001600160a01b031690639d3fa4b990612662908890600401614c6e565b60606040518083038186803b15801561267a57600080fd5b505afa15801561268e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126b291908101906141fa565b85516000546040517fa12dcc6f00000000000000000000000000000000000000000000000000000000815292955090916001600160a01b039091169063a12dcc6f906127049089908990600401614c81565b60206040518083038186803b15801561271c57600080fd5b505afa158015612730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127549190810190613dd4565b9150600061276187612ee5565b90506000612782886101800151896101400151612f0190919063ffffffff16565b156127b7576127b0826127a68a60c001518b60800151612f2690919063ffffffff16565b8a60a00151612f42565b9050612824565b60c08801516127d3576127b08289608001518a60a00151612f42565b60006127e4848a6101800151610688565b905060006127fb848b608001518c60a00151612f42565b90506000612812838c60c001518d60a00151612f42565b905061281e82826129ad565b93505050505b61284861284287604001518a60a00151612f6490919063ffffffff16565b826129ad565b9450600460005460208a01516040517f9caa023b00000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__92639caa023b926128b3926001600160a01b03909216918e91908c906004016147be565b60206040518083038186803b1580156128cb57600080fd5b505af41580156128df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061290391908101906140ee565b600481111561290e57fe5b1461291a57600061291c565b845b945061292c886101600151612f83565b61293557600094505b60e0880151158015906129535750612951886101a00151612f83565b155b1561295d57600094505b60038651600681111561296c57fe5b1461297657600094505b5050509250925092565b6001546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b031681565b60008183106129bc5781611827565b5090919050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600061182782612a2985613138565b6131b3565b60008160040183511015612a5457612a54612a4f60038551856004016131ed565b61325c565b5001602001516001600160e01b03191690565b60008160140183511015612a8857612a88612a4f60048551856014016131ed565b5001601401516001600160a01b031690565b60405160009081906060906001600160a01b038616907f70a082310000000000000000000000000000000000000000000000000000000090612ae090879060240161465f565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909416939093179092529051612b339190614643565b600060405180830381855afa9150503d8060008114612b6e576040519150601f19603f3d011682016040523d82523d6000602084013e612b73565b606091505b5091509150818015612b86575080516020145b156107af576106a58160005b60006118278383613264565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b600080612bd9612bb6565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c1357600080fd5b505af1158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c4b91908101906140d2565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c8a57600080fd5b505af1158015612c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612cc29190810190614402565b4211612d4057816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d0357600080fd5b505af1158015612d17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d3b9190810190614402565b612db3565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d7b57600080fd5b505af1158015612d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612db39190810190614402565b9050610911816b033b2e3c9fd0803ce800000086612f42565b600061182782612a298561328e565b60405160009081906060906001600160a01b038716907fdd62ed3e0000000000000000000000000000000000000000000000000000000090612e239088908890602401614673565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909416939093179092529051612e769190614643565b600060405180830381855afa9150503d8060008114612eb1576040519150601f19603f3d011682016040523d82523d6000602084013e612eb6565b606091505b5091509150818015612ec9575080516020145b15612edc57612ed9816000612b92565b92505b50509392505050565b6000806000612ef384613347565b9150915061091182826129ad565b6000815183511480156118275750508051602091820120825192909101919091201490565b60008282018381101561182757611827612a4f6000868661338a565b600061091183612f58868563ffffffff6133a916565b9063ffffffff6133da16565b600082821115612f7d57612f7d612a4f6002858561338a565b50900390565b60006020825181612f9057fe5b06600414612fa057506000610861565b6000612fb2838263ffffffff612a2e16565b90506001600160e01b031981167f94cfcdd70000000000000000000000000000000000000000000000000000000014612fef576001915050610861565b6040517fbbb2dcf600000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063bbb2dcf690613042908790600401614b1e565b60006040518083038186803b15801561305a57600080fd5b505af415801561306e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130969190810190614002565b80519093509150600090505b81811461312c5760006130d260008584815181106130bc57fe5b6020026020010151612a2e90919063ffffffff16565b90506001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415613123576131108483613404565b1561312357600095505050505050610861565b506001016130a2565b50600195945050505050565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6060632800659560e01b84848460405160240161320c93929190614b91565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b6000816020018351101561328557613285612a4f60058551856020016131ed565b50016020015190565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534939092909160208710156132da57fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b600080600483610140015151101561336457506000905080611502565b6133778360000151846101400151610b7e565b6114fd8460000151856101400151611a89565b606063e946c1bb60e01b84848460405160240161320c93929190614b6f565b6000826133b8575060006106aa565b828202828482816133c557fe5b041461182757611827612a4f6001868661338a565b6000816133f0576133f0612a4f6003858561338a565b60008284816133fb57fe5b04949350505050565b8151600090600183015b818110156107af5761344f85828151811061342557fe5b602002602001015186868151811061343957fe5b6020026020010151612f0190919063ffffffff16565b1561345f576001925050506106aa565b60010161340e565b6040805160608101909152806000815260006020820181905260409091015290565b80356106aa81614d59565b80516106aa81614d59565b600082601f8301126134af578081fd5b81356134c26134bd82614cdb565b614cb4565b8181529150602080830190848101818402860182018710156134e357600080fd5b60005b848110156114685781356134f981614d59565b845292820192908201906001016134e6565b600082601f83011261351b578081fd5b81356135296134bd82614cdb565b8181529150602080830190840160005b838110156135665761355187602084358901016136fa565b83526020928301929190910190600101613539565b5050505092915050565b600082601f830112613580578081fd5b815161358e6134bd82614cdb565b8181529150602080830190840160005b83811015613566576135b68760208451890101613748565b8352602092830192919091019060010161359e565b600082601f8301126135db578081fd5b81356135e96134bd82614cdb565b8181529150602080830190840160005b8381101561356657613611876020843589010161379d565b835260209283019291909101906001016135f9565b600082601f830112613636578081fd5b81356136446134bd82614cdb565b81815291506020808301908481018184028601820187101561366557600080fd5b60005b8481101561146857813584529282019290820190600101613668565b600082601f830112613694578081fd5b81516136a26134bd82614cdb565b8181529150602080830190848101818402860182018710156136c357600080fd5b60005b84811015611468578151845292820192908201906001016136c6565b80516001600160e01b0319811681146106aa57600080fd5b600082601f83011261370a578081fd5b81356137186134bd82614cfb565b915080825283602082850101111561372f57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613758578081fd5b81516137666134bd82614cfb565b915080825283602082850101111561377d57600080fd5b61146d816020840160208601614d1f565b8051600581106106aa57600080fd5b60006101c08083850312156137b0578182fd5b6137b981614cb4565b9150506137c68383613489565b81526137d58360208401613489565b60208201526137e78360408401613489565b60408201526137f98360608401613489565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561385b57600080fd5b613867868387016136fa565b8385015261016092508285013591508082111561388357600080fd5b61388f868387016136fa565b838501526101809250828501359150808211156138ab57600080fd5b6138b7868387016136fa565b838501526101a09250828501359150808211156138d357600080fd5b506138e0858286016136fa565b82840152505092915050565b60006101c08083850312156138ff578182fd5b61390881614cb4565b9150506139158383613494565b81526139248360208401613494565b60208201526139368360408401613494565b60408201526139488360608401613494565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156139aa57600080fd5b6139b686838701613748565b838501526101609250828501519150808211156139d257600080fd5b6139de86838701613748565b838501526101809250828501519150808211156139fa57600080fd5b613a0686838701613748565b838501526101a0925082850151915080821115613a2257600080fd5b506138e085828601613748565b600060208284031215613a40578081fd5b813561182781614d59565b60008060408385031215613a5d578081fd5b8235613a6881614d59565b9150602083013567ffffffffffffffff811115613a83578182fd5b613a8f8582860161350b565b9150509250929050565b60008060008060808587031215613aae578182fd5b8435613ab981614d59565b9350602085013567ffffffffffffffff80821115613ad5578384fd5b613ae188838901613626565b94506040870135915080821115613af6578384fd5b613b0288838901613626565b93506060870135915080821115613b17578283fd5b50613b24878288016136fa565b91505092959194509250565b60008060408385031215613b42578182fd5b8235613b4d81614d59565b9150602083013567ffffffffffffffff811115613b68578182fd5b613a8f858286016136fa565b600080600060608486031215613b88578081fd5b8335613b9381614d59565b9250602084013567ffffffffffffffff811115613bae578182fd5b613bba868287016136fa565b925050604084013590509250925092565b60008060408385031215613bdd578182fd5b8235613be881614d59565b946020939093013593505050565b600060208284031215613c07578081fd5b813567ffffffffffffffff811115613c1d578182fd5b6109118482850161349f565b60006020808385031215613c3b578182fd5b825167ffffffffffffffff811115613c51578283fd5b80840185601f820112613c62578384fd5b80519150613c726134bd83614cdb565b8281528381019082850185850284018601891015613c8e578687fd5b8693505b84841015613cb857613ca4898261378e565b835260019390930192918501918501613c92565b50979650505050505050565b600080600060608486031215613cd8578081fd5b833567ffffffffffffffff80821115613cef578283fd5b613cfb878388016135cb565b94506020860135915080821115613d10578283fd5b613d1c8783880161349f565b93506040860135915080821115613d31578283fd5b50613d3e86828701613626565b9150509250925092565b60008060408385031215613d5a578182fd5b823567ffffffffffffffff80821115613d71578384fd5b613d7d868387016135cb565b93506020850135915080821115613d92578283fd5b50613a8f8582860161350b565b60008060408385031215613db1578182fd5b823567ffffffffffffffff80821115613dc8578384fd5b613d7d86838701613626565b600060208284031215613de5578081fd5b81518015158114611827578182fd5b600060208284031215613e05578081fd5b61182783836136e2565b60008060408385031215613e21578182fd5b613e2b84846136e2565b91506020830151613e3b81614d59565b809150509250929050565b60008060008060808587031215613e5b578182fd5b8451613e6681614d6e565b6020860151909450613e7781614d59565b6040860151909350613e8881614d59565b606086015190925067ffffffffffffffff811115613ea4578182fd5b613b2487828801613748565b600080600080600060a08688031215613ec7578283fd5b613ed187876136e2565b94506020860151613ee181614d59565b604087015190945067ffffffffffffffff80821115613efe578485fd5b613f0a89838a01613684565b94506060880151915080821115613f1f578283fd5b613f2b89838a01613684565b93506080880151915080821115613f40578283fd5b50613f4d88828901613748565b9150509295509295909350565b60008060008060808587031215613f6f578182fd5b613f7986866136e2565b93506020850151613f8981614d59565b604086015190935067ffffffffffffffff811115613fa5578283fd5b613fb187828801613748565b606096909601519497939650505050565b600080600060608486031215613fd6578081fd5b613fe085856136e2565b92506020840151613ff081614d59565b80925050604084015190509250925092565b600080600060608486031215614016578081fd5b835161402181614d6e565b602085015190935067ffffffffffffffff8082111561403e578283fd5b61404a87838801613684565b9350604086015191508082111561405f578283fd5b50613d3e86828701613570565b60006020828403121561407d578081fd5b813567ffffffffffffffff811115614093578182fd5b610911848285016136fa565b6000602082840312156140b0578081fd5b815167ffffffffffffffff8111156140c6578182fd5b61091184828501613748565b6000602082840312156140e3578081fd5b815161182781614d59565b6000602082840312156140ff578081fd5b815160058110611827578182fd5b60008060008060808587031215614122578182fd5b845167ffffffffffffffff80821115614139578384fd5b61414588838901613748565b955060209150818701518181111561415b578485fd5b80880189601f82011261416c578586fd5b8051915061417c6134bd83614cdb565b82815284810190828601885b858110156141b15761419f8e8984518801016138ec565b84529287019290870190600101614188565b505060408b01519098509450505050808211156141cc578384fd5b6141d888838901613684565b935060608701519150808211156141ed578283fd5b50613b2487828801613570565b60006060828403121561420b578081fd5b6142156060614cb4565b825160078110614223578283fd5b8152602083810151908201526040928301519281019290925250919050565b600080600060608486031215614256578081fd5b833567ffffffffffffffff81111561426c578182fd5b6142788682870161379d565b935050602084013561428981614d59565b929592945050506040919091013590565b600080604083850312156142ac578182fd5b823567ffffffffffffffff808211156142c3578384fd5b6142cf8683870161379d565b935060208501359150808211156142e4578283fd5b50613a8f858286016136fa565b600080600060608486031215614305578081fd5b833567ffffffffffffffff81111561431b578182fd5b6143278682870161379d565b93505060208401359150604084013561433f81614d59565b809150509250925092565b60008060006060848603121561435e578081fd5b833567ffffffffffffffff80821115614375578283fd5b81860160a08189031215614387578384fd5b61439160a0614cb4565b92508035835260208101356020840152604081013560408401526143b88860608301613489565b60608401526080810135828111156143ce578485fd5b6143da898284016136fa565b6080850152509194505050602084013591506143f98560408601613489565b90509250925092565b600060208284031215614413578081fd5b5051919050565b6001600160a01b03169052565b6000815180845260208401935060208301825b828110156144615781516001600160a01b031686526020958601959091019060010161443a565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b848110156144b65782840388526144a08483516144f3565b6020988901989094509190910190600101614488565b50919695505050505050565b6000815180845260208401935060208301825b828110156144615781518652602095860195909101906001016144d5565b6000815180845261450b816020860160208601614d1f565b601f01601f19169290920160200192915050565b80516007811061452b57fe5b825260208181015190830152604090810151910152565b60006101c061455284845161441a565b6020830151614564602086018261441a565b506040830151614577604086018261441a565b50606083015161458a606086018261441a565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152506101408084015182828701526145e3838701826144f3565b9150506101609150818401518582038387015261460082826144f3565b92505050610180808401518583038287015261461c83826144f3565b9150506101a09150818401518582038387015261463982826144f3565b9695505050505050565b60008251614655818460208701614d1f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6000608082016001600160a01b03871683526080602084015280865180835260a08501915060a060208202860101925060208801845b82811015614712577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608786030184526146fd858351614542565b945060209384019391909101906001016146c3565b5050505082810360408401526147288186614427565b838103606085015261473a81866144c2565b98975050505050505050565b60006001600160a01b03861682526080602083015261476860808301866144c2565b828103604084015261477a81866144c2565b838103606085015261473a81866144f3565b60006001600160a01b0385168252606060208301526147ae60608301856144f3565b9050826040830152949350505050565b60006001600160a01b038087168352608060208401526147e16080840187614542565b94166040830152506060015292915050565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561484d57835161483981614d4f565b835260209384019390920191600101614826565b509095945050505050565b606080825284519082018190526000906020906080840190828801845b8281101561489b5761488884835161451f565b6060939093019290840190600101614875565b505050838103828501526148af81876144c2565b84810360408601528551808252908301915082860190845b818110156148e55782511515845292840192918401916001016148c7565b509198975050505050505050565b60006020825261182760208301846144c2565b60006040825261491960408301856144c2565b602083820381850152818551808452828401915082838202850101838801865b8381101561496757601f198784030185526149558383516144f3565b94860194925090850190600101614939565b50909998505050505050505050565b60006040825261498960408301856144c2565b82810360208401526118db81856144c2565b90815260200190565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b60006001600160e01b0319861682526001600160a01b0380861660208401528085166040840152506080606083015261463960808301846144f3565b60006001600160e01b0319871682526001600160a01b038616602083015260a06040830152614a4a60a08301866144c2565b8281036060840152614a5c81866144c2565b8381036080850152614a6e81866144f3565b9998505050505050505050565b60006001600160e01b0319861682526001600160a01b038516602083015260806040830152614aad60808301856144f3565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b60006001600160e01b03198516825260606020830152614b0c60608301856144c2565b8281036040840152614639818561446b565b60006020825261182760208301846144f3565b600060808252614b4460808301876144f3565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6060810160048510614b7d57fe5b938152602081019290925260409091015290565b6060810160088510614b7d57fe5b60208101614bac83614d4f565b91905290565b600060808252614bc560808301876144f3565b602083820381850152818751808452828401915082838202850101838a01865b83811015614c1357601f19878403018552614c01838351614542565b94860194925090850190600101614be5565b50508681036040880152614c27818a6144c2565b9450505050508281036060840152614c3f818561446b565b979650505050505050565b60a08101614c58828661451f565b8360608301528215156080830152949350505050565b6000602082526118276020830184614542565b600060408252614c946040830185614542565b82810360208401526118db81856144f3565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715614cd357600080fd5b604052919050565b600067ffffffffffffffff821115614cf1578081fd5b5060209081020190565b600067ffffffffffffffff821115614d11578081fd5b50601f01601f191660200190565b60005b83811015614d3a578181015183820152602001614d22565b83811115614d49576000848401525b50505050565b6005811061073157fe5b6001600160a01b038116811461073157600080fd5b6001600160e01b03198116811461073157600080fdfea365627a7a7231582034aeeb2766e909a7bf6404cf5556e26fa49952bdd5ea533d25447be58f55ed9a6c6578706572696d656e74616cf564736f6c63430005100040" } } }, diff --git a/packages/contract-artifacts/artifacts/LibTransactionDecoder.json b/packages/contract-artifacts/artifacts/LibTransactionDecoder.json deleted file mode 100644 index 7aaf6848c9..0000000000 --- a/packages/contract-artifacts/artifacts/LibTransactionDecoder.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "schemaVersion": "2.0.0", - "contractName": "LibTransactionDecoder", - "compilerOutput": { - "abi": [ - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "transactionData", "type": "bytes" }], - "name": "decodeZeroExTransactionData", - "outputs": [ - { "internalType": "string", "name": "functionName", "type": "string" }, - { - "components": [ - { "internalType": "address", "name": "makerAddress", "type": "address" }, - { "internalType": "address", "name": "takerAddress", "type": "address" }, - { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, - { "internalType": "address", "name": "senderAddress", "type": "address" }, - { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, - { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, - { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, - { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, - { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, - { "internalType": "uint256", "name": "salt", "type": "uint256" }, - { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, - { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, - { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, - { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } - ], - "internalType": "struct LibOrder.Order[]", - "name": "orders", - "type": "tuple[]" - }, - { "internalType": "uint256[]", "name": "takerAssetFillAmounts", "type": "uint256[]" }, - { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - } - ], - "devdoc": { - "methods": { - "decodeZeroExTransactionData(bytes)": { - "details": "Decodes the call data for an Exchange contract method call.", - "params": { "transactionData": "ABI-encoded calldata for an Exchange contract method call." }, - "return": "The name of the function called, and the parameters it was given. For single-order fills and cancels, the arrays will have just one element." - } - } - }, - "evm": { - "bytecode": { - "object": "0x608060405234801561001057600080fd5b5061198b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80636f83188e14610030575b600080fd5b61004361003e3660046113f4565b61005c565b604051610053949392919061176e565b60405180910390f35b60608080806000610073868263ffffffff610ba616565b90506001600160e01b031981167fdedfc1f10000000000000000000000000000000000000000000000000000000014156100e4576040518060400160405280601181526020017f626174636843616e63656c4f7264657273000000000000000000000000000000815250945061067c565b6001600160e01b031981167f9694a402000000000000000000000000000000000000000000000000000000001415610153576040518060400160405280600f81526020017f626174636846696c6c4f72646572730000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f8ea8dfe40000000000000000000000000000000000000000000000000000000014156101c2576040518060400160405280601681526020017f626174636846696c6c4f72646572734e6f5468726f7700000000000000000000815250945061067c565b6001600160e01b031981167fbeee2e14000000000000000000000000000000000000000000000000000000001415610231576040518060400160405280601581526020017f626174636846696c6c4f724b696c6c4f72646572730000000000000000000000815250945061067c565b6001600160e01b031981167f2da629870000000000000000000000000000000000000000000000000000000014156102a0576040518060400160405280600b81526020017f63616e63656c4f72646572000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f9b44d55600000000000000000000000000000000000000000000000000000000141561030f576040518060400160405280600981526020017f66696c6c4f726465720000000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167fe14b58c400000000000000000000000000000000000000000000000000000000141561037e576040518060400160405280600f81526020017f66696c6c4f724b696c6c4f726465720000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f78d29ac10000000000000000000000000000000000000000000000000000000014156103ed576040518060400160405280601681526020017f6d61726b65744275794f72646572734e6f5468726f7700000000000000000000815250945061067c565b6001600160e01b031981167f369da09900000000000000000000000000000000000000000000000000000000141561045c576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f77000000000000000000815250945061067c565b6001600160e01b031981167f8bc8efb30000000000000000000000000000000000000000000000000000000014156104cb576040518060400160405280601981526020017f6d61726b65744275794f726465727346696c6c4f724b696c6c00000000000000815250945061067c565b6001600160e01b031981167fa6c3bf3300000000000000000000000000000000000000000000000000000000141561053a576040518060400160405280601a81526020017f6d61726b657453656c6c4f726465727346696c6c4f724b696c6c000000000000815250945061067c565b6001600160e01b031981167f88ec79fb0000000000000000000000000000000000000000000000000000000014156105a9576040518060400160405280600b81526020017f6d617463684f7264657273000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f4f9559b100000000000000000000000000000000000000000000000000000000148061060a57506001600160e01b031981167f2280c91000000000000000000000000000000000000000000000000000000000145b1561064a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061186d565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190611836565b6001600160e01b031981167fdedfc1f10000000000000000000000000000000000000000000000000000000014156107215785516106c490879060049063ffffffff610be916565b8060200190516106d79190810190611289565b604080516000808252602082019092529195505b5060408051600080825260208201909252919450610719565b60608152602001906001900390816107045790505b509150610b9e565b6001600160e01b031981167fbeee2e1400000000000000000000000000000000000000000000000000000000148061078257506001600160e01b031981167f9694a40200000000000000000000000000000000000000000000000000000000145b806107b657506001600160e01b031981167f8ea8dfe400000000000000000000000000000000000000000000000000000000145b156107d0576107c486610c70565b91955093509150610b9e565b6001600160e01b031981167f2da629870000000000000000000000000000000000000000000000000000000014156108b85760408051600180825281830190925290816020015b61081f610f3d565b815260200190600190039081610817575050865190945061084a90879060049063ffffffff610be916565b80602001905161085d919081019061146b565b8460008151811061086a57fe5b602002602001018190525060006040519080825280602002602001820160405280156106eb578160200160208202803883390190505060408051600080825260208201909252919450610719565b6001600160e01b031981167fe14b58c400000000000000000000000000000000000000000000000000000000148061091957506001600160e01b031981167f9b44d55600000000000000000000000000000000000000000000000000000000145b15610927576107c486610cac565b6001600160e01b031981167f78d29ac100000000000000000000000000000000000000000000000000000000148061098857506001600160e01b031981167f369da09900000000000000000000000000000000000000000000000000000000145b806109bc57506001600160e01b031981167f8bc8efb300000000000000000000000000000000000000000000000000000000145b806109f057506001600160e01b031981167fa6c3bf3300000000000000000000000000000000000000000000000000000000145b156109fe576107c486610da6565b6001600160e01b031981167f88ec79fb000000000000000000000000000000000000000000000000000000001415610b9e57610a38610f3d565b610a40610f3d565b606080610a5a60048b518c610be99092919063ffffffff16565b806020019051610a6d919081019061149e565b604080516002808252606082019092529498509296509094509250816020015b610a95610f3d565b815260200190600190039081610a8d5790505097508388600081518110610ab857fe5b60200260200101819052508288600181518110610ad157fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a0015187600081518110610b1157fe5b6020026020010181815250508260a0015187600181518110610b2f57fe5b60209081029190910101526040805160028082526060820190925290816020015b6060815260200190600190039081610b505790505095508186600081518110610b7557fe5b60200260200101819052508086600181518110610b8e57fe5b6020026020010181905250505050505b509193509193565b60008160040183511015610bcc57610bcc610bc76003855185600401610e1a565b610e89565b5060208183018101519101906001600160e01b0319165b92915050565b606081831115610c0257610c02610bc760008585610e1a565b8351821115610c1b57610c1b610bc76001848751610e1a565b8282036040519080825280601f01601f191660200182016040528015610c48576020820181803883390190505b509050610c69610c5782610e91565b84610c6187610e91565b018351610e97565b9392505050565b6060806060610c8c6004855186610be99092919063ffffffff16565b806020019051610c9f91908101906112c4565b9196909550909350915050565b60408051600180825281830190925260609182918291816020015b610ccf610f3d565b815260200190600190039081610cc75750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b6060815260200190600190039081610d185750508451909150610d4590859060049063ffffffff610be916565b806020019051610d589190810190611546565b85600081518110610d6557fe5b6020026020010185600081518110610d7957fe5b6020026020010185600081518110610d8d57fe5b6020908102919091010192909252919052529193909250565b604080516001808252818301909252606091829182916020808301908038833950508551919350610de29186915060049063ffffffff610be916565b806020019051610df591908101906113a1565b84518590600090610e0257fe5b60209081029190910101919091529095929450925050565b6060632800659560e01b848484604051602401610e399392919061174c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b60200190565b6020811015610ec1576001816020036101000a038019835116818551168082178652505050610f38565b82821415610ece57610f38565b82821115610f085760208103905080820181840181515b82851015610f00578451865260209586019590940193610ee5565b905250610f38565b60208103905080820181840183515b81861215610f335782518252601f199283019290910190610f17565b855250505b505050565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b805173ffffffffffffffffffffffffffffffffffffffff81168114610be357600080fd5b600082601f830112611038578081fd5b815161104b611046826118cb565b6118a4565b8181529150602080830190840160005b838110156110885761107387602084518901016110ed565b8352602092830192919091019060010161105b565b5050505092915050565b600082601f8301126110a2578081fd5b81516110b0611046826118cb565b8181529150602080830190840160005b83811015611088576110d8876020845189010161113a565b835260209283019291909101906001016110c0565b600082601f8301126110fd578081fd5b815161110b611046826118eb565b915080825283602082850101111561112257600080fd5b611133816020840160208601611918565b5092915050565b60006101c080838503121561114d578182fd5b611156816118a4565b9150506111638383611004565b81526111728360208401611004565b60208201526111848360408401611004565b60408201526111968360608401611004565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156111f857600080fd5b611204868387016110ed565b8385015261016092508285015191508082111561122057600080fd5b61122c868387016110ed565b8385015261018092508285015191508082111561124857600080fd5b611254868387016110ed565b838501526101a092508285015191508082111561127057600080fd5b5061127d858286016110ed565b82840152505092915050565b60006020828403121561129a578081fd5b815167ffffffffffffffff8111156112b0578182fd5b6112bc84828501611092565b949350505050565b6000806000606084860312156112d8578182fd5b835167ffffffffffffffff808211156112ef578384fd5b6112fb87838801611092565b9450602091508186015181811115611311578485fd5b80870188601f820112611322578586fd5b80519150611332611046836118cb565b82815284810190828601868502840187018c101561134e578889fd5b8893505b84841015611370578051835260019390930192918601918601611352565b5060408a015190975094505050508082111561138a578283fd5b5061139786828701611028565b9150509250925092565b6000806000606084860312156113b5578283fd5b835167ffffffffffffffff808211156113cc578485fd5b6113d887838801611092565b945060208601519350604086015191508082111561138a578283fd5b600060208284031215611405578081fd5b813567ffffffffffffffff81111561141b578182fd5b80830184601f82011261142c578283fd5b8035915061143c611046836118eb565b828152856020848401011115611450578384fd5b82602083016020830137918201602001929092529392505050565b60006020828403121561147c578081fd5b815167ffffffffffffffff811115611492578182fd5b6112bc8482850161113a565b600080600080608085870312156114b3578081fd5b845167ffffffffffffffff808211156114ca578283fd5b6114d68883890161113a565b955060208701519150808211156114eb578283fd5b6114f78883890161113a565b9450604087015191508082111561150c578283fd5b611518888389016110ed565b9350606087015191508082111561152d578283fd5b5061153a878288016110ed565b91505092959194509250565b60008060006060848603121561155a578283fd5b835167ffffffffffffffff80821115611571578485fd5b61157d8783880161113a565b9450602086015193506040860151915080821115611599578283fd5b50611397868287016110ed565b60006101c06115b68484516116af565b60208301516115c860208601826116af565b5060408301516115db60408601826116af565b5060608301516115ee60608601826116af565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e085015261010080840151818601525061012080840151818601525061014080840151828287015261164783870182611720565b915050610160915081840151858203838701526116648282611720565b9250505061018080840151858303828701526116808382611720565b9150506101a09150818401518582038387015261169d8282611720565b9695505050505050565b815260200190565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526020840180819550602083028101915060208501845b848110156117145782840388526116fe848351611720565b60209889019890945091909101906001016116e6565b50919695505050505050565b60008151808452611738816020860160208601611918565b601f01601f19169290920160200192915050565b606081016008851061175a57fe5b938152602081019290925260409091015290565b6000608082526117816080830187611720565b602083820381850152818751611797818561190f565b91508193508281028201838a01865b838110156117d05786830385526117be8383516115a6565b948601949250908501906001016117a6565b50508681036040880152809450885192506117eb838261190f565b94505050818701845b82811015611815576118078583516116a7565b9450908301906001016117f4565b50505050828103606084015261182b81856116c9565b979650505050505050565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201527f554e494d504c454d454e54454400000000000000000000000000000000000000604082015260600190565b60405181810167ffffffffffffffff811182821017156118c357600080fd5b604052919050565b600067ffffffffffffffff8211156118e1578081fd5b5060209081020190565b600067ffffffffffffffff821115611901578081fd5b50601f01601f191660200190565b90815260200190565b60005b8381101561193357818101518382015260200161191b565b83811115611942576000848401525b5050505056fea365627a7a72315820884abdfe69fd82b726a34318b3e10d0da6e8c516e328d10258429ee105f0ad396c6578706572696d656e74616cf564736f6c63430005100040" - }, - "deployedBytecode": { - "object": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80636f83188e14610030575b600080fd5b61004361003e3660046113f4565b61005c565b604051610053949392919061176e565b60405180910390f35b60608080806000610073868263ffffffff610ba616565b90506001600160e01b031981167fdedfc1f10000000000000000000000000000000000000000000000000000000014156100e4576040518060400160405280601181526020017f626174636843616e63656c4f7264657273000000000000000000000000000000815250945061067c565b6001600160e01b031981167f9694a402000000000000000000000000000000000000000000000000000000001415610153576040518060400160405280600f81526020017f626174636846696c6c4f72646572730000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f8ea8dfe40000000000000000000000000000000000000000000000000000000014156101c2576040518060400160405280601681526020017f626174636846696c6c4f72646572734e6f5468726f7700000000000000000000815250945061067c565b6001600160e01b031981167fbeee2e14000000000000000000000000000000000000000000000000000000001415610231576040518060400160405280601581526020017f626174636846696c6c4f724b696c6c4f72646572730000000000000000000000815250945061067c565b6001600160e01b031981167f2da629870000000000000000000000000000000000000000000000000000000014156102a0576040518060400160405280600b81526020017f63616e63656c4f72646572000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f9b44d55600000000000000000000000000000000000000000000000000000000141561030f576040518060400160405280600981526020017f66696c6c4f726465720000000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167fe14b58c400000000000000000000000000000000000000000000000000000000141561037e576040518060400160405280600f81526020017f66696c6c4f724b696c6c4f726465720000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f78d29ac10000000000000000000000000000000000000000000000000000000014156103ed576040518060400160405280601681526020017f6d61726b65744275794f72646572734e6f5468726f7700000000000000000000815250945061067c565b6001600160e01b031981167f369da09900000000000000000000000000000000000000000000000000000000141561045c576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f77000000000000000000815250945061067c565b6001600160e01b031981167f8bc8efb30000000000000000000000000000000000000000000000000000000014156104cb576040518060400160405280601981526020017f6d61726b65744275794f726465727346696c6c4f724b696c6c00000000000000815250945061067c565b6001600160e01b031981167fa6c3bf3300000000000000000000000000000000000000000000000000000000141561053a576040518060400160405280601a81526020017f6d61726b657453656c6c4f726465727346696c6c4f724b696c6c000000000000815250945061067c565b6001600160e01b031981167f88ec79fb0000000000000000000000000000000000000000000000000000000014156105a9576040518060400160405280600b81526020017f6d617463684f7264657273000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f4f9559b100000000000000000000000000000000000000000000000000000000148061060a57506001600160e01b031981167f2280c91000000000000000000000000000000000000000000000000000000000145b1561064a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061186d565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190611836565b6001600160e01b031981167fdedfc1f10000000000000000000000000000000000000000000000000000000014156107215785516106c490879060049063ffffffff610be916565b8060200190516106d79190810190611289565b604080516000808252602082019092529195505b5060408051600080825260208201909252919450610719565b60608152602001906001900390816107045790505b509150610b9e565b6001600160e01b031981167fbeee2e1400000000000000000000000000000000000000000000000000000000148061078257506001600160e01b031981167f9694a40200000000000000000000000000000000000000000000000000000000145b806107b657506001600160e01b031981167f8ea8dfe400000000000000000000000000000000000000000000000000000000145b156107d0576107c486610c70565b91955093509150610b9e565b6001600160e01b031981167f2da629870000000000000000000000000000000000000000000000000000000014156108b85760408051600180825281830190925290816020015b61081f610f3d565b815260200190600190039081610817575050865190945061084a90879060049063ffffffff610be916565b80602001905161085d919081019061146b565b8460008151811061086a57fe5b602002602001018190525060006040519080825280602002602001820160405280156106eb578160200160208202803883390190505060408051600080825260208201909252919450610719565b6001600160e01b031981167fe14b58c400000000000000000000000000000000000000000000000000000000148061091957506001600160e01b031981167f9b44d55600000000000000000000000000000000000000000000000000000000145b15610927576107c486610cac565b6001600160e01b031981167f78d29ac100000000000000000000000000000000000000000000000000000000148061098857506001600160e01b031981167f369da09900000000000000000000000000000000000000000000000000000000145b806109bc57506001600160e01b031981167f8bc8efb300000000000000000000000000000000000000000000000000000000145b806109f057506001600160e01b031981167fa6c3bf3300000000000000000000000000000000000000000000000000000000145b156109fe576107c486610da6565b6001600160e01b031981167f88ec79fb000000000000000000000000000000000000000000000000000000001415610b9e57610a38610f3d565b610a40610f3d565b606080610a5a60048b518c610be99092919063ffffffff16565b806020019051610a6d919081019061149e565b604080516002808252606082019092529498509296509094509250816020015b610a95610f3d565b815260200190600190039081610a8d5790505097508388600081518110610ab857fe5b60200260200101819052508288600181518110610ad157fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a0015187600081518110610b1157fe5b6020026020010181815250508260a0015187600181518110610b2f57fe5b60209081029190910101526040805160028082526060820190925290816020015b6060815260200190600190039081610b505790505095508186600081518110610b7557fe5b60200260200101819052508086600181518110610b8e57fe5b6020026020010181905250505050505b509193509193565b60008160040183511015610bcc57610bcc610bc76003855185600401610e1a565b610e89565b5060208183018101519101906001600160e01b0319165b92915050565b606081831115610c0257610c02610bc760008585610e1a565b8351821115610c1b57610c1b610bc76001848751610e1a565b8282036040519080825280601f01601f191660200182016040528015610c48576020820181803883390190505b509050610c69610c5782610e91565b84610c6187610e91565b018351610e97565b9392505050565b6060806060610c8c6004855186610be99092919063ffffffff16565b806020019051610c9f91908101906112c4565b9196909550909350915050565b60408051600180825281830190925260609182918291816020015b610ccf610f3d565b815260200190600190039081610cc75750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b6060815260200190600190039081610d185750508451909150610d4590859060049063ffffffff610be916565b806020019051610d589190810190611546565b85600081518110610d6557fe5b6020026020010185600081518110610d7957fe5b6020026020010185600081518110610d8d57fe5b6020908102919091010192909252919052529193909250565b604080516001808252818301909252606091829182916020808301908038833950508551919350610de29186915060049063ffffffff610be916565b806020019051610df591908101906113a1565b84518590600090610e0257fe5b60209081029190910101919091529095929450925050565b6060632800659560e01b848484604051602401610e399392919061174c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b60200190565b6020811015610ec1576001816020036101000a038019835116818551168082178652505050610f38565b82821415610ece57610f38565b82821115610f085760208103905080820181840181515b82851015610f00578451865260209586019590940193610ee5565b905250610f38565b60208103905080820181840183515b81861215610f335782518252601f199283019290910190610f17565b855250505b505050565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b805173ffffffffffffffffffffffffffffffffffffffff81168114610be357600080fd5b600082601f830112611038578081fd5b815161104b611046826118cb565b6118a4565b8181529150602080830190840160005b838110156110885761107387602084518901016110ed565b8352602092830192919091019060010161105b565b5050505092915050565b600082601f8301126110a2578081fd5b81516110b0611046826118cb565b8181529150602080830190840160005b83811015611088576110d8876020845189010161113a565b835260209283019291909101906001016110c0565b600082601f8301126110fd578081fd5b815161110b611046826118eb565b915080825283602082850101111561112257600080fd5b611133816020840160208601611918565b5092915050565b60006101c080838503121561114d578182fd5b611156816118a4565b9150506111638383611004565b81526111728360208401611004565b60208201526111848360408401611004565b60408201526111968360608401611004565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156111f857600080fd5b611204868387016110ed565b8385015261016092508285015191508082111561122057600080fd5b61122c868387016110ed565b8385015261018092508285015191508082111561124857600080fd5b611254868387016110ed565b838501526101a092508285015191508082111561127057600080fd5b5061127d858286016110ed565b82840152505092915050565b60006020828403121561129a578081fd5b815167ffffffffffffffff8111156112b0578182fd5b6112bc84828501611092565b949350505050565b6000806000606084860312156112d8578182fd5b835167ffffffffffffffff808211156112ef578384fd5b6112fb87838801611092565b9450602091508186015181811115611311578485fd5b80870188601f820112611322578586fd5b80519150611332611046836118cb565b82815284810190828601868502840187018c101561134e578889fd5b8893505b84841015611370578051835260019390930192918601918601611352565b5060408a015190975094505050508082111561138a578283fd5b5061139786828701611028565b9150509250925092565b6000806000606084860312156113b5578283fd5b835167ffffffffffffffff808211156113cc578485fd5b6113d887838801611092565b945060208601519350604086015191508082111561138a578283fd5b600060208284031215611405578081fd5b813567ffffffffffffffff81111561141b578182fd5b80830184601f82011261142c578283fd5b8035915061143c611046836118eb565b828152856020848401011115611450578384fd5b82602083016020830137918201602001929092529392505050565b60006020828403121561147c578081fd5b815167ffffffffffffffff811115611492578182fd5b6112bc8482850161113a565b600080600080608085870312156114b3578081fd5b845167ffffffffffffffff808211156114ca578283fd5b6114d68883890161113a565b955060208701519150808211156114eb578283fd5b6114f78883890161113a565b9450604087015191508082111561150c578283fd5b611518888389016110ed565b9350606087015191508082111561152d578283fd5b5061153a878288016110ed565b91505092959194509250565b60008060006060848603121561155a578283fd5b835167ffffffffffffffff80821115611571578485fd5b61157d8783880161113a565b9450602086015193506040860151915080821115611599578283fd5b50611397868287016110ed565b60006101c06115b68484516116af565b60208301516115c860208601826116af565b5060408301516115db60408601826116af565b5060608301516115ee60608601826116af565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e085015261010080840151818601525061012080840151818601525061014080840151828287015261164783870182611720565b915050610160915081840151858203838701526116648282611720565b9250505061018080840151858303828701526116808382611720565b9150506101a09150818401518582038387015261169d8282611720565b9695505050505050565b815260200190565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526020840180819550602083028101915060208501845b848110156117145782840388526116fe848351611720565b60209889019890945091909101906001016116e6565b50919695505050505050565b60008151808452611738816020860160208601611918565b601f01601f19169290920160200192915050565b606081016008851061175a57fe5b938152602081019290925260409091015290565b6000608082526117816080830187611720565b602083820381850152818751611797818561190f565b91508193508281028201838a01865b838110156117d05786830385526117be8383516115a6565b948601949250908501906001016117a6565b50508681036040880152809450885192506117eb838261190f565b94505050818701845b82811015611815576118078583516116a7565b9450908301906001016117f4565b50505050828103606084015261182b81856116c9565b979650505050505050565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201527f554e494d504c454d454e54454400000000000000000000000000000000000000604082015260600190565b60405181810167ffffffffffffffff811182821017156118c357600080fd5b604052919050565b600067ffffffffffffffff8211156118e1578081fd5b5060209081020190565b600067ffffffffffffffff821115611901578081fd5b50601f01601f191660200190565b90815260200190565b60005b8381101561193357818101518382015260200161191b565b83811115611942576000848401525b5050505056fea365627a7a72315820884abdfe69fd82b726a34318b3e10d0da6e8c516e328d10258429ee105f0ad396c6578706572696d656e74616cf564736f6c63430005100040" - } - } - }, - "compiler": { - "name": "solc", - "version": "soljson-v0.5.16+commit.9c3226ce.js", - "settings": { - "optimizer": { - "enabled": true, - "runs": 5000, - "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "devdoc", - "evm.bytecode.object", - "evm.bytecode.sourceMap", - "evm.deployedBytecode.object", - "evm.deployedBytecode.sourceMap" - ] - } - }, - "evmVersion": "istanbul" - } - }, - "chains": {} -} diff --git a/packages/contract-artifacts/src/index.ts b/packages/contract-artifacts/src/index.ts index f4678b2976..c9f07ebfb6 100644 --- a/packages/contract-artifacts/src/index.ts +++ b/packages/contract-artifacts/src/index.ts @@ -15,7 +15,6 @@ import * as Forwarder from '../artifacts/Forwarder.json'; import * as IAssetProxy from '../artifacts/IAssetProxy.json'; import * as IValidator from '../artifacts/IValidator.json'; import * as IWallet from '../artifacts/IWallet.json'; -import * as LibTransactionDecoder from '../artifacts/LibTransactionDecoder.json'; import * as MultiAssetProxy from '../artifacts/MultiAssetProxy.json'; import * as Staking from '../artifacts/Staking.json'; import * as StakingProxy from '../artifacts/StakingProxy.json'; @@ -43,7 +42,6 @@ export { IAssetProxy, IValidator, IWallet, - LibTransactionDecoder, MultiAssetProxy, StaticCallProxy, WETH9, diff --git a/packages/contract-artifacts/tsconfig.json b/packages/contract-artifacts/tsconfig.json index 681825c0cf..36866ab760 100644 --- a/packages/contract-artifacts/tsconfig.json +++ b/packages/contract-artifacts/tsconfig.json @@ -19,7 +19,6 @@ "./artifacts/ERC721Token.json", "./artifacts/Exchange.json", "./artifacts/Forwarder.json", - "./artifacts/LibTransactionDecoder.json", "./artifacts/IAssetProxy.json", "./artifacts/IValidator.json", "./artifacts/IWallet.json", diff --git a/packages/contract-wrappers/CHANGELOG.json b/packages/contract-wrappers/CHANGELOG.json index 3b72493133..284d85ff28 100644 --- a/packages/contract-wrappers/CHANGELOG.json +++ b/packages/contract-wrappers/CHANGELOG.json @@ -3,8 +3,12 @@ "version": "13.5.0", "changes": [ { - "note": "export `evmbytecodeoutputlinkreferences` type.", + "note": "Export `EvmBytecodeOutputLinkReferences` type.", "pr": 2462 + }, + { + "note": "Remove `LibTransactionDecoder`", + "pr": 2464 } ] }, diff --git a/packages/contract-wrappers/src/contract_wrappers.ts b/packages/contract-wrappers/src/contract_wrappers.ts index 3057564899..a7e14f3304 100644 --- a/packages/contract-wrappers/src/contract_wrappers.ts +++ b/packages/contract-wrappers/src/contract_wrappers.ts @@ -11,7 +11,6 @@ import { ERC20TokenContract } from './generated-wrappers/erc20_token'; import { ERC721TokenContract } from './generated-wrappers/erc721_token'; import { ExchangeContract } from './generated-wrappers/exchange'; import { ForwarderContract } from './generated-wrappers/forwarder'; -import { LibTransactionDecoderContract } from './generated-wrappers/lib_transaction_decoder'; import { StakingContract } from './generated-wrappers/staking'; import { WETH9Contract } from './generated-wrappers/weth9'; import { ContractWrappersConfig } from './types'; @@ -50,10 +49,6 @@ export class ContractWrappers { * An instance of the StakingContract class containing methods for interacting with the Staking contracts. */ public staking: StakingContract; - /** - * An instance of the LibTransactionDecoder class containing methods for interacting with the LibTransactionDecoder smart contract. - */ - public libTransactionDecoder: LibTransactionDecoderContract; private readonly _web3Wrapper: Web3Wrapper; /** @@ -78,7 +73,6 @@ export class ContractWrappers { ForwarderContract, StakingContract, WETH9Contract, - LibTransactionDecoderContract, ]; contractsArray.forEach(contract => { this._web3Wrapper.abiDecoder.addABI(contract.ABI(), contract.contractName); @@ -93,10 +87,6 @@ export class ContractWrappers { this.staking = new StakingContract(contractAddresses.stakingProxy, this.getProvider()); this.devUtils = new DevUtilsContract(contractAddresses.devUtils, this.getProvider()); this.coordinator = new CoordinatorContract(contractAddresses.coordinator, this.getProvider()); - this.libTransactionDecoder = new LibTransactionDecoderContract( - contractAddresses.libTransactionDecoder, - this.getProvider(), - ); this.contractAddresses = contractAddresses; } /** diff --git a/packages/contract-wrappers/src/index.ts b/packages/contract-wrappers/src/index.ts index 1c0b138e53..afe2195848 100644 --- a/packages/contract-wrappers/src/index.ts +++ b/packages/contract-wrappers/src/index.ts @@ -81,7 +81,6 @@ export { StakingProxyStakingContractAttachedToProxyEventArgs, StakingProxyStakingContractDetachedFromProxyEventArgs, } from './generated-wrappers/staking_proxy'; -export { LibTransactionDecoderContract } from './generated-wrappers/lib_transaction_decoder'; export { BlockRange, SupportedProvider, diff --git a/packages/dev-utils/CHANGELOG.json b/packages/dev-utils/CHANGELOG.json index 2146fc83ef..ce1dd2a943 100644 --- a/packages/dev-utils/CHANGELOG.json +++ b/packages/dev-utils/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "3.2.0", + "changes": [ + { + "note": "Refactor into public libraries.", + "pr": 2464 + } + ] + }, { "timestamp": 1580988106, "version": "3.1.3", diff --git a/packages/migrations/CHANGELOG.json b/packages/migrations/CHANGELOG.json index d2c128c742..8223a4215a 100644 --- a/packages/migrations/CHANGELOG.json +++ b/packages/migrations/CHANGELOG.json @@ -1,4 +1,21 @@ [ + { + "version": "6.1.0", + "changes": [ + { + "note": "Update `DevUtils` deployment", + "pr": 2456 + }, + { + "note": "Remove `LibTransactionDecoder` deployment", + "pr": 2456 + }, + { + "note": "Use contract package artifacts in ganache migrations", + "pr": 2456 + } + ] + }, { "timestamp": 1580988106, "version": "6.0.2", diff --git a/packages/migrations/package.json b/packages/migrations/package.json index 43ba5feab5..863a02b310 100644 --- a/packages/migrations/package.json +++ b/packages/migrations/package.json @@ -63,7 +63,6 @@ "dependencies": { "@0x/base-contract": "^6.1.2", "@0x/contract-addresses": "^4.4.0", - "@0x/contract-artifacts": "^3.4.1", "@0x/contract-wrappers": "^13.4.2", "@0x/contracts-asset-proxy": "^3.1.3", "@0x/contracts-coordinator": "^3.0.6", diff --git a/packages/migrations/src/migration.ts b/packages/migrations/src/migration.ts index 6674bb21e7..2b39e40078 100644 --- a/packages/migrations/src/migration.ts +++ b/packages/migrations/src/migration.ts @@ -1,7 +1,6 @@ import { ContractAddresses, getContractAddressesForChainOrThrow } from '@0x/contract-addresses'; -import * as artifacts from '@0x/contract-artifacts'; -import { ForwarderContract } from '@0x/contract-wrappers'; import { + artifacts as assetProxyArtifacts, ERC1155ProxyContract, ERC20BridgeProxyContract, ERC20ProxyContract, @@ -9,12 +8,17 @@ import { MultiAssetProxyContract, StaticCallProxyContract, } from '@0x/contracts-asset-proxy'; -import { CoordinatorContract, CoordinatorRegistryContract } from '@0x/contracts-coordinator'; -import { DevUtilsContract, LibTransactionDecoderContract } from '@0x/contracts-dev-utils'; -import { ERC1155MintableContract } from '@0x/contracts-erc1155'; -import { DummyERC20TokenContract, WETH9Contract } from '@0x/contracts-erc20'; -import { DummyERC721TokenContract } from '@0x/contracts-erc721'; -import { ExchangeContract } from '@0x/contracts-exchange'; +import { + artifacts as coordinatorArtifacts, + CoordinatorContract, + CoordinatorRegistryContract, +} from '@0x/contracts-coordinator'; +import { artifacts as devUtilsArtifacts, DevUtilsContract } from '@0x/contracts-dev-utils'; +import { artifacts as erc1155Artifacts, ERC1155MintableContract } from '@0x/contracts-erc1155'; +import { artifacts as erc20Artifacts, DummyERC20TokenContract, WETH9Contract } from '@0x/contracts-erc20'; +import { artifacts as erc721Artifacts, DummyERC721TokenContract } from '@0x/contracts-erc721'; +import { artifacts as exchangeArtifacts, ExchangeContract } from '@0x/contracts-exchange'; +import { artifacts as forwarderArtifacts, ForwarderContract } from '@0x/contracts-exchange-forwarder'; import { artifacts as stakingArtifacts, StakingProxyContract, @@ -28,6 +32,18 @@ import { SupportedProvider, TxData } from 'ethereum-types'; import { constants } from './utils/constants'; import { erc20TokenInfo, erc721TokenInfo } from './utils/token_info'; +const allArtifacts = { + ...assetProxyArtifacts, + ...coordinatorArtifacts, + ...devUtilsArtifacts, + ...erc1155Artifacts, + ...erc20Artifacts, + ...erc721Artifacts, + ...exchangeArtifacts, + ...forwarderArtifacts, + ...stakingArtifacts, +}; + /** * Creates and deploys all the contracts that are required for the latest * version of the 0x protocol. @@ -44,24 +60,24 @@ export async function runMigrationsAsync( // Proxies const erc20Proxy = await ERC20ProxyContract.deployFrom0xArtifactAsync( - artifacts.ERC20Proxy, + assetProxyArtifacts.ERC20Proxy, provider, txDefaults, - artifacts, + allArtifacts, ); const erc721Proxy = await ERC721ProxyContract.deployFrom0xArtifactAsync( - artifacts.ERC721Proxy, + assetProxyArtifacts.ERC721Proxy, provider, txDefaults, - artifacts, + allArtifacts, ); // ZRX const zrxToken = await DummyERC20TokenContract.deployFrom0xArtifactAsync( - artifacts.DummyERC20Token, + erc20Artifacts.DummyERC20Token, provider, txDefaults, - artifacts, + allArtifacts, '0x Protocol Token', 'ZRX', new BigNumber(18), @@ -69,14 +85,19 @@ export async function runMigrationsAsync( ); // Ether token - const etherToken = await WETH9Contract.deployFrom0xArtifactAsync(artifacts.WETH9, provider, txDefaults, artifacts); + const etherToken = await WETH9Contract.deployFrom0xArtifactAsync( + erc20Artifacts.WETH9, + provider, + txDefaults, + allArtifacts, + ); // Exchange const exchange = await ExchangeContract.deployFrom0xArtifactAsync( - artifacts.Exchange, + exchangeArtifacts.Exchange, provider, txDefaults, - artifacts, + allArtifacts, chainId, ); @@ -85,10 +106,10 @@ export async function runMigrationsAsync( const totalSupply = new BigNumber(1000000000000000000000000000); // tslint:disable-next-line:no-unused-variable const dummyErc20Token = await DummyERC20TokenContract.deployFrom0xArtifactAsync( - artifacts.DummyERC20Token, + erc20Artifacts.DummyERC20Token, provider, txDefaults, - artifacts, + allArtifacts, token.name, token.symbol, token.decimals, @@ -99,34 +120,34 @@ export async function runMigrationsAsync( // ERC721 // tslint:disable-next-line:no-unused-variable const cryptoKittieToken = await DummyERC721TokenContract.deployFrom0xArtifactAsync( - artifacts.DummyERC721Token, + erc721Artifacts.DummyERC721Token, provider, txDefaults, - artifacts, + allArtifacts, erc721TokenInfo[0].name, erc721TokenInfo[0].symbol, ); // 1155 Asset Proxy const erc1155Proxy = await ERC1155ProxyContract.deployFrom0xArtifactAsync( - artifacts.ERC1155Proxy, + assetProxyArtifacts.ERC1155Proxy, provider, txDefaults, - artifacts, + allArtifacts, ); const staticCallProxy = await StaticCallProxyContract.deployFrom0xArtifactAsync( - artifacts.StaticCallProxy, + assetProxyArtifacts.StaticCallProxy, provider, txDefaults, - artifacts, + allArtifacts, ); const multiAssetProxy = await MultiAssetProxyContract.deployFrom0xArtifactAsync( - artifacts.MultiAssetProxy, + assetProxyArtifacts.MultiAssetProxy, provider, txDefaults, - artifacts, + allArtifacts, ); await erc20Proxy.addAuthorizedAddress(exchange.address).awaitTransactionSuccessAsync(txDefaults); @@ -152,45 +173,46 @@ export async function runMigrationsAsync( // CoordinatorRegistry const coordinatorRegistry = await CoordinatorRegistryContract.deployFrom0xArtifactAsync( - artifacts.CoordinatorRegistry, + coordinatorArtifacts.CoordinatorRegistry, provider, txDefaults, - artifacts, + allArtifacts, ); // Coordinator const coordinator = await CoordinatorContract.deployFrom0xArtifactAsync( - artifacts.Coordinator, + coordinatorArtifacts.Coordinator, provider, txDefaults, - artifacts, + allArtifacts, exchange.address, chainId, ); // Dev Utils - const devUtils = await DevUtilsContract.deployFrom0xArtifactAsync( - artifacts.DevUtils, + const devUtils = await DevUtilsContract.deployWithLibrariesFrom0xArtifactAsync( + devUtilsArtifacts.DevUtils, + devUtilsArtifacts, provider, txDefaults, - artifacts, + allArtifacts, exchange.address, constants.NULL_ADDRESS, ); // tslint:disable-next-line:no-unused-variable const erc1155DummyToken = await ERC1155MintableContract.deployFrom0xArtifactAsync( - artifacts.ERC1155Mintable, + erc1155Artifacts.ERC1155Mintable, provider, txDefaults, - artifacts, + allArtifacts, ); const erc20BridgeProxy = await ERC20BridgeProxyContract.deployFrom0xArtifactAsync( - artifacts.ERC20BridgeProxy, + assetProxyArtifacts.ERC20BridgeProxy, provider, txDefaults, - {}, + allArtifacts, ); await exchange.registerAssetProxy(erc20BridgeProxy.address).awaitTransactionSuccessAsync(txDefaults); await erc20BridgeProxy.addAuthorizedAddress(exchange.address).awaitTransactionSuccessAsync(txDefaults); @@ -199,10 +221,10 @@ export async function runMigrationsAsync( const zrxProxy = erc20Proxy.address; const zrxVault = await ZrxVaultContract.deployFrom0xArtifactAsync( - artifacts.ZrxVault, + stakingArtifacts.ZrxVault, provider, txDefaults, - {}, + allArtifacts, zrxProxy, zrxToken.address, ); @@ -213,16 +235,16 @@ export async function runMigrationsAsync( stakingArtifacts.TestStaking, provider, txDefaults, - {}, + allArtifacts, etherToken.address, zrxVault.address, ); const stakingProxy = await StakingProxyContract.deployFrom0xArtifactAsync( - artifacts.StakingProxy, + stakingArtifacts.StakingProxy, provider, txDefaults, - {}, + allArtifacts, stakingLogic.address, ); @@ -245,23 +267,15 @@ export async function runMigrationsAsync( // in the constructor const { exchangeV2: exchangeV2Address } = getContractAddressesForChainOrThrow(chainId.toNumber()); const forwarder = await ForwarderContract.deployFrom0xArtifactAsync( - artifacts.Forwarder, + forwarderArtifacts.Forwarder, provider, txDefaults, - artifacts, + allArtifacts, exchange.address, exchangeV2Address || constants.NULL_ADDRESS, etherToken.address, ); - // LibTransactionDecoder - const libTransactionDecoder = await LibTransactionDecoderContract.deployFrom0xArtifactAsync( - artifacts.LibTransactionDecoder, - provider, - txDefaults, - artifacts, - ); - const contractAddresses = { erc20Proxy: erc20Proxy.address, erc721Proxy: erc721Proxy.address, @@ -273,7 +287,6 @@ export async function runMigrationsAsync( erc20BridgeProxy: erc20BridgeProxy.address, zeroExGovernor: constants.NULL_ADDRESS, forwarder: forwarder.address, - libTransactionDecoder: libTransactionDecoder.address, orderValidator: constants.NULL_ADDRESS, dutchAuction: constants.NULL_ADDRESS, coordinatorRegistry: coordinatorRegistry.address, diff --git a/packages/migrations/src/testnet_migrations.ts b/packages/migrations/src/testnet_migrations.ts index 445a6a0884..f5b6f45324 100644 --- a/packages/migrations/src/testnet_migrations.ts +++ b/packages/migrations/src/testnet_migrations.ts @@ -9,11 +9,7 @@ import { UniswapBridgeContract, } from '@0x/contracts-asset-proxy'; import { artifacts as coordinatorArtifacts, CoordinatorContract } from '@0x/contracts-coordinator'; -import { - artifacts as devUtilsArtifacts, - DevUtilsContract, - LibTransactionDecoderContract, -} from '@0x/contracts-dev-utils'; +import { artifacts as devUtilsArtifacts, DevUtilsContract } from '@0x/contracts-dev-utils'; import { artifacts as exchangeArtifacts, ExchangeContract } from '@0x/contracts-exchange'; import { artifacts as forwarderArtifacts, ForwarderContract } from '@0x/contracts-exchange-forwarder'; import { @@ -249,8 +245,9 @@ export async function runMigrationsAsync(supportedProvider: SupportedProvider, t ]); await submitAndExecuteTransactionAsync(governor, governor.address, batchTransactionData); - await DevUtilsContract.deployFrom0xArtifactAsync( + await DevUtilsContract.deployWithLibrariesFrom0xArtifactAsync( devUtilsArtifacts.DevUtils, + devUtilsArtifacts, provider, txDefaults, devUtilsArtifacts, @@ -276,13 +273,6 @@ export async function runMigrationsAsync(supportedProvider: SupportedProvider, t deployedAddresses.exchangeV2, deployedAddresses.etherToken, ); - - await LibTransactionDecoderContract.deployFrom0xArtifactAsync( - devUtilsArtifacts.LibTransactionDecoder, - provider, - txDefaults, - devUtilsArtifacts, - ); } (async () => { From a08399dfeeffbc082573757e83064656f53a2566 Mon Sep 17 00:00:00 2001 From: Lawrence Forman Date: Fri, 7 Feb 2020 23:22:11 -0500 Subject: [PATCH 2/2] regenerate artifacts and wrappers --- .../output/typescript/abi_gen_dummy.ts | 1 + .../test-cli/output/typescript/lib_dummy.ts | 1 + .../output/typescript/test_lib_dummy.ts | 1 + .../artifacts/DevUtils.json | 4 +- .../artifacts/ERC1155Mintable.json | 4 +- .../artifacts/ERC1155Proxy.json | 4 +- .../artifacts/Exchange.json | 4 +- .../artifacts/Forwarder.json | 74 +- .../contract-artifacts/artifacts/Staking.json | 4 +- .../src/generated-wrappers/coordinator.ts | 1 + .../src/generated-wrappers/dev_utils.ts | 1187 +++++------------ .../src/generated-wrappers/erc20_token.ts | 1 + .../src/generated-wrappers/erc721_token.ts | 1 + .../src/generated-wrappers/exchange.ts | 1 + .../src/generated-wrappers/forwarder.ts | 283 ++++ .../src/generated-wrappers/i_asset_data.ts | 1 + .../i_erc20_bridge_sampler.ts | 9 +- .../lib_transaction_decoder.ts | 464 ------- .../src/generated-wrappers/staking.ts | 1 + .../src/generated-wrappers/staking_proxy.ts | 1 + .../src/generated-wrappers/weth9.ts | 1 + 21 files changed, 734 insertions(+), 1314 deletions(-) delete mode 100644 packages/contract-wrappers/src/generated-wrappers/lib_transaction_decoder.ts diff --git a/packages/abi-gen/test-cli/output/typescript/abi_gen_dummy.ts b/packages/abi-gen/test-cli/output/typescript/abi_gen_dummy.ts index b443443c88..5cedf49268 100644 --- a/packages/abi-gen/test-cli/output/typescript/abi_gen_dummy.ts +++ b/packages/abi-gen/test-cli/output/typescript/abi_gen_dummy.ts @@ -53,6 +53,7 @@ export interface AbiGenDummyWithdrawalEventArgs extends DecodedLogArgs { } /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class AbiGenDummyContract extends BaseContract { diff --git a/packages/abi-gen/test-cli/output/typescript/lib_dummy.ts b/packages/abi-gen/test-cli/output/typescript/lib_dummy.ts index b76c5771e5..ae07b236b3 100644 --- a/packages/abi-gen/test-cli/output/typescript/lib_dummy.ts +++ b/packages/abi-gen/test-cli/output/typescript/lib_dummy.ts @@ -34,6 +34,7 @@ import * as ethers from 'ethers'; // tslint:enable:no-unused-variable /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class LibDummyContract extends BaseContract { diff --git a/packages/abi-gen/test-cli/output/typescript/test_lib_dummy.ts b/packages/abi-gen/test-cli/output/typescript/test_lib_dummy.ts index 95306317ac..517c7bb5c9 100644 --- a/packages/abi-gen/test-cli/output/typescript/test_lib_dummy.ts +++ b/packages/abi-gen/test-cli/output/typescript/test_lib_dummy.ts @@ -34,6 +34,7 @@ import * as ethers from 'ethers'; // tslint:enable:no-unused-variable /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class TestLibDummyContract extends BaseContract { diff --git a/packages/contract-artifacts/artifacts/DevUtils.json b/packages/contract-artifacts/artifacts/DevUtils.json index 0c25914b4f..f80842ad18 100644 --- a/packages/contract-artifacts/artifacts/DevUtils.json +++ b/packages/contract-artifacts/artifacts/DevUtils.json @@ -828,10 +828,10 @@ }, "evm": { "bytecode": { - "object": "0x60806040523480156200001157600080fd5b5060405162005228380380620052288339810160408190526200003491620003e5565b600080546001600160a01b03199081166001600160a01b0385811691821784556005805490931690851617909155604051630c0e082160e31b8152829185918591906360704108906200009390630f47261b60e41b9060040162000423565b60206040518083038186803b158015620000ac57600080fd5b505afa158015620000c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620000e79190810190620003b5565b600180546001600160a01b0319166001600160a01b03928316179055604051630c0e082160e31b815290831690636070410890620001319063012b8bc960e11b9060040162000423565b60206040518083038186803b1580156200014a57600080fd5b505afa1580156200015f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001859190810190620003b5565b600280546001600160a01b0319166001600160a01b03928316179055604051630c0e082160e31b815290831690636070410890620001cf9063a7cb5fb760e01b9060040162000423565b60206040518083038186803b158015620001e857600080fd5b505afa158015620001fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002239190810190620003b5565b600380546001600160a01b0319166001600160a01b03928316179055604051630c0e082160e31b8152908316906360704108906200026d9063619ce88560e11b9060040162000423565b60206040518083038186803b1580156200028657600080fd5b505afa1580156200029b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002c19190810190620003b5565b600480546001600160a01b0319166001600160a01b03928316179055600092508316159050620002f25781620002f4565b305b90506200034f6040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b81525085846200035e60201b620029c31760201c565b60065550620004519350505050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600060208284031215620003c7578081fd5b81516001600160a01b0381168114620003de578182fd5b9392505050565b60008060408385031215620003f8578081fd5b8251620004058162000438565b6020840151909250620004188162000438565b809150509250929050565b6001600160e01b031991909116815260200190565b6001600160a01b03811681146200044e57600080fd5b50565b614dc780620004616000396000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c8063a5cd62ba11610145578063d3637905116100bd578063e4e6e7da1161008c578063ee18599711610071578063ee185997146105b5578063ef3bb097146105bd578063ff84e7cc146105c55761025c565b8063e4e6e7da14610572578063e77286eb146105935761025c565b8063d36379051461050a578063d3d862d11461051d578063d469502814610530578063e25cabf7146105505761025c565b8063c26cfecd11610114578063ca49f47c116100f9578063ca49f47c146104c1578063d001c5dc146104e4578063d186037f146104f75761025c565b8063c26cfecd146104b1578063c82037ef146104b95761025c565b8063a5cd62ba14610449578063a6627e9f14610469578063b43cffe11461047c578063bbb2dcf61461048f5761025c565b80637982653e116101d85780639baf2705116101a75780639eadc8351161018c5780639eadc835146103ff578063a070cac814610423578063a0901e51146104365761025c565b80639baf2705146103e25780639cd01605146103f75761025c565b80637982653e1461037b57806379c9c4261461039b5780637d727512146103ae5780638f4ce479146103c15761025c565b80634dfdac201161022f57806363eb39921161021457806363eb3992146103225780636f83188e14610335578063750bdb30146103585761025c565b80634dfdac20146102e2578063590aa875146103025761025c565b806304a5618a146102615780630d7b7d761461028c5780632322cf76146102ad57806346eb65cb146102cd575b600080fd5b61027461026f36600461406c565b6105cd565b60405161028393929190614abe565b60405180910390f35b61029f61029a366004613b30565b610666565b604051610283929190614ca6565b6102c06102bb366004613b30565b610688565b604051610283919061499b565b6102e06102db36600461406c565b6106b0565b005b6102f56102f0366004613a4b565b610734565b60405161028391906148f3565b610315610310366004613a2f565b6107b7565b6040516102839190614b1e565b610315610330366004613b74565b610866565b61034861034336600461406c565b610919565b6040516102839493929190614bb2565b61036b61036636600461406c565b6109b9565b60405161028394939291906149dc565b61038e610389366004614242565b610a4b565b6040516102839190614b9f565b6102c06103a936600461434a565b610afd565b6102c06103bc366004613b30565b610b7e565b6103d46103cf36600461406c565b611474565b6040516102839291906149b9565b6103ea611507565b604051610283919061465f565b6103ea611516565b61041261040d36600461406c565b611525565b604051610283959493929190614a18565b6102c06104313660046142f1565b6115ca565b6102f5610444366004613bf6565b61164b565b61045c610457366004613cc4565b6116c4565b604051610283919061480c565b610315610477366004613bcb565b61177e565b61031561048a366004613a99565b61182e565b6104a261049d36600461406c565b6118e4565b60405161028393929190614ae9565b6102c0611974565b6103ea61197a565b6104d46104cf36600461406c565b611989565b6040516102839493929190614a7b565b6102f56104f2366004613a4b565b611a1b565b6102c0610505366004613b30565b611a89565b61038e610518366004614242565b612365565b61031561052b366004613d9f565b6123c7565b61054361053e36600461406c565b61241c565b60405161028391906149a4565b61056361055e366004613d48565b6124bf565b60405161028393929190614858565b610585610580366004613a4b565b6125f7565b604051610283929190614976565b6105a66105a136600461429a565b612610565b60405161028393929190614c4a565b6103ea612980565b6103ea61298f565b6103ea61299e565b600080600073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a856040518263ffffffff1660e01b81526004016106099190614b1e565b60606040518083038186803b15801561062157600080fd5b505af4158015610635573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106599190810190613fc2565b9250925092509193909250565b6000806106738484610b7e565b915061067f8484611a89565b90509250929050565b60008060006106978585610666565b915091506106a582826129ad565b925050505b92915050565b6040517f46eb65cb00000000000000000000000000000000000000000000000000000000815273__$d8b635de2bf4a097b4e18b67d0fb68e779$__906346eb65cb90610700908490600401614b1e565b60006040518083038186803b15801561071857600080fd5b505af415801561072c573d6000803e3d6000fd5b505050505b50565b606060008251905080604051908082528060200260200182016040528015610766578160200160208202803883390190505b50915060005b8181146107af576107908585838151811061078357fe5b6020026020010151611a89565b83828151811061079c57fe5b602090810291909101015260010161076c565b505092915050565b6040517f590aa87500000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063590aa8759061080a90859060040161465f565b60006040518083038186803b15801561082257600080fd5b505af4158015610836573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085e919081019061409f565b90505b919050565b6040517f63eb399200000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__906363eb3992906108bd9087908790879060040161478c565b60006040518083038186803b1580156108d557600080fd5b505af41580156108e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610911919081019061409f565b949350505050565b60608060608073__$fddee3b26a806429350031cf3481976d2e$__636f83188e866040518263ffffffff1660e01b81526004016109569190614b1e565b60006040518083038186803b15801561096e57600080fd5b505af4158015610982573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa919081019061410d565b93509350935093509193509193565b6000806000606073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016109f79190614b1e565b60006040518083038186803b158015610a0f57600080fd5b505af4158015610a23573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa9190810190613e46565b600080546040517f9caa023b00000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__91639caa023b91610aad916001600160a01b0316908890889088906004016147be565b60206040518083038186803b158015610ac557600080fd5b505af4158015610ad9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061091191908101906140ee565b600061091184610b796040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876129c3565b612a1a565b600080610b91838263ffffffff612a2e16565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415610bec576000610bd884601063ffffffff612a6716565b9050610be48186612a9a565b92505061146d565b6001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415610e055760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a866040518263ffffffff1660e01b8152600401610c589190614b1e565b60606040518083038186803b158015610c7057600080fd5b505af4158015610c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ca89190810190613fc2565b6040519194509250606091507f6352211e0000000000000000000000000000000000000000000000000000000090610ce490849060240161499b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b031683604051610d5f9190614643565b600060405180830381855afa9150503d8060008114610d9a576040519150601f19603f3d011682016040523d82523d6000602084013e610d9f565b606091505b50915091506000828015610db4575081516020145b610dbf576000610dd0565b610dd082600c63ffffffff612a6716565b9050896001600160a01b0316816001600160a01b031614610df2576000610df5565b60015b60ff16975050505050505061146d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156110a157600060608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__639eadc835876040518263ffffffff1660e01b8152600401610e739190614b1e565b60006040518083038186803b158015610e8b57600080fd5b505af4158015610e9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ec79190810190613eb0565b5081519296509094509250905060005b81811461109757828181518110610eea57fe5b602002602001015160001415610eff5761108f565b83516060907efdd58e00000000000000000000000000000000000000000000000000000000908b90879085908110610f3357fe5b6020026020010151604051602401610f4c9291906147f3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060876001600160a01b031683604051610fc79190614643565b600060405180830381855afa9150503d8060008114611002576040519150601f19603f3d011682016040523d82523d6000602084013e611007565b606091505b5091509150600082801561101c575081516020145b611027576000611038565b61103882600063ffffffff612b9216565b9050600087868151811061104857fe5b6020026020010151828161105857fe5b049050806110745760009b5050505050505050505050506106aa565b8b81108061108057508b155b1561108957809b505b50505050505b600101610ed7565b505050505061146d565b6001600160e01b031981167fc339d10a0000000000000000000000000000000000000000000000000000000014156111d4576040516060907fa85e59e4000000000000000000000000000000000000000000000000000000009061111090869060009081908190602401614b31565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611177908490614643565b600060405180830381855afa9150503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b50509050806111c75760006111cb565b6000195b9350505061146d565b6001600160e01b031981167fdc1600f30000000000000000000000000000000000000000000000000000000014156112fd5760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016112409190614b1e565b60006040518083038186803b15801561125857600080fd5b505af415801561126c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112949190810190613e46565b5092509250506112a2612b9e565b6001600160a01b0316826001600160a01b03161480156112cf57506005546001600160a01b038281169116145b156112f65760006112e76112e1612bb6565b88612a9a565b90506112f281612bce565b9450505b505061146d565b6001600160e01b031981167f94cfcdd700000000000000000000000000000000000000000000000000000000141561146d5760608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6866040518263ffffffff1660e01b81526004016113699190614b1e565b60006040518083038186803b15801561138157600080fd5b505af4158015611395573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113bd9190810190614002565b80519194509250905060005b818114611468578381815181106113dc57fe5b6020026020010151600014156113f157611460565b60006114108985848151811061140357fe5b6020026020010151610b7e565b9050600085838151811061142057fe5b6020026020010151828161143057fe5b049050806114485760009750505050505050506106aa565b87811080611454575087155b1561145d578097505b50505b6001016113c9565b505050505b5092915050565b60008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__638f4ce479846040518263ffffffff1660e01b81526004016114ae9190614b1e565b604080518083038186803b1580156114c557600080fd5b505af41580156114d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114fd9190810190613e0f565b915091505b915091565b6004546001600160a01b031681565b6000546001600160a01b031681565b600080606080606073__$d8b635de2bf4a097b4e18b67d0fb68e779$__639eadc835876040518263ffffffff1660e01b81526004016115649190614b1e565b60006040518083038186803b15801561157c57600080fd5b505af4158015611590573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115b89190810190613eb0565b939a9299509097509550909350915050565b6000610911846116466040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876129c3565b612dcc565b6060808251604051908082528060200260200182016040528015611679578160200160208202803883390190505b50905060005b8351811461146d5783818151811061169357fe5b60200260200101516001600160a01b0316318282815181106116b157fe5b602090810291909101015260010161167f565b6000546040517f02cffc4500000000000000000000000000000000000000000000000000000000815260609173__$7a69f714cdde1cb6b62e3c39bc8c94deae$__916302cffc459161172a916001600160a01b039091169088908890889060040161468d565b60006040518083038186803b15801561174257600080fd5b505af4158015611756573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109119190810190613c29565b6040517fa6627e9f00000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063a6627e9f906117d390869086906004016147f3565b60006040518083038186803b1580156117eb57600080fd5b505af41580156117ff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611827919081019061409f565b9392505050565b6040517fb43cffe100000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063b43cffe190611887908890889088908890600401614746565b60006040518083038186803b15801561189f57600080fd5b505af41580156118b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118db919081019061409f565b95945050505050565b600060608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6856040518263ffffffff1660e01b81526004016119209190614b1e565b60006040518083038186803b15801561193857600080fd5b505af415801561194c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106599190810190614002565b60065481565b6005546001600160a01b031681565b6000806060600073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63ca49f47c866040518263ffffffff1660e01b81526004016119c79190614b1e565b60006040518083038186803b1580156119df57600080fd5b505af41580156119f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa9190810190613f5a565b606060008251905080604051908082528060200260200182016040528015611a4d578160200160208202803883390190505b50915060005b8181146107af57611a6a8585838151811061140357fe5b838281518110611a7657fe5b6020908102919091010152600101611a53565b600080611a9c838263ffffffff612a2e16565b90506001600160e01b031981167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611c075760608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6866040518263ffffffff1660e01b8152600401611b0a9190614b1e565b60006040518083038186803b158015611b2257600080fd5b505af4158015611b36573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b5e9190810190614002565b80519194509250905060005b818114611bfc57838181518110611b7d57fe5b602002602001015160001415611b9257611bf4565b6000611ba48985848151811061078357fe5b90506000858381518110611bb457fe5b60200260200101518281611bc457fe5b04905080611bdc5760009750505050505050506106aa565b87811080611be8575087155b15611bf1578097505b50505b600101611b6a565b506106aa9350505050565b6001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415611c68576000611c4c84601063ffffffff612a6716565b600154909150610be490829087906001600160a01b0316612ddb565b6001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415611fb85760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a866040518263ffffffff1660e01b8152600401611cd49190614b1e565b60606040518083038186803b158015611cec57600080fd5b505af4158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d249190810190613fc2565b600254604051929550909350606092507fe985e9c50000000000000000000000000000000000000000000000000000000091611d70918a916001600160a01b0390911690602401614673565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b031683604051611deb9190614643565b600060405180830381855afa9150503d8060008114611e26576040519150601f19603f3d011682016040523d82523d6000602084013e611e2b565b606091505b5091509150811580611e3f57508051602014155b80611e5b5750611e5681600063ffffffff612b9216565b600114155b15611fa9576040516060907f081812fc0000000000000000000000000000000000000000000000000000000090611e9690879060240161499b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050856001600160a01b031681604051611f0d9190614643565b600060405180830381855afa9150503d8060008114611f48576040519150601f19603f3d011682016040523d82523d6000602084013e611f4d565b606091505b509093509150828015611f61575081516020145b8015611f9057506002546001600160a01b0316611f8583600c63ffffffff612a6716565b6001600160a01b0316145b611f9b576000611f9e565b60015b60ff16975050611097565b6000199650505050505061146d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156121df576040517f9eadc83500000000000000000000000000000000000000000000000000000000815260009073__$d8b635de2bf4a097b4e18b67d0fb68e779$__90639eadc8359061203d908790600401614b1e565b60006040518083038186803b15801561205557600080fd5b505af4158015612069573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120919190810190613eb0565b5050600354604051929450606093507fe985e9c500000000000000000000000000000000000000000000000000000000926120db925089916001600160a01b031690602401614673565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060836001600160a01b0316836040516121569190614643565b600060405180830381855afa9150503d8060008114612191576040519150601f19603f3d011682016040523d82523d6000602084013e612196565b606091505b50915091508180156121a9575080516020145b80156121c557506121c181600063ffffffff612b9216565b6001145b6121d05760006121d4565b6000195b95505050505061146d565b6001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000141561221b57600019915061146d565b6001600160e01b031981167fdc1600f300000000000000000000000000000000000000000000000000000000141561146d5760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016122879190614b1e565b60006040518083038186803b15801561229f57600080fd5b505af41580156122b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122db9190810190613e46565b5092509250506122e9612b9e565b6001600160a01b0316826001600160a01b031614801561231657506005546001600160a01b038281169116145b1561235c57600061233b612328612bb6565b60055489906001600160a01b0316612ddb565b905060001981146123545761234f81612bce565b612358565b6000195b9450505b50505092915050565b600080546040517f8dccde0400000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__91638dccde0491610aad916001600160a01b0316908890889088906004016147be565b6040517fd3d862d100000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063d3d862d1906117d39086908690600401614906565b6040517fd469502800000000000000000000000000000000000000000000000000000000815260009073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063d46950289061246f908590600401614b1e565b60206040518083038186803b15801561248757600080fd5b505af415801561249b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061085e9190810190613df4565b60608060606000855190508060405190808252806020026020018201604052801561250457816020015b6124f1613467565b8152602001906001900390816124e95790505b50935080604051908082528060200260200182016040528015612531578160200160208202803883390190505b5092508060405190808252806020026020018201604052801561255e578160200160208202803883390190505b50915060005b8181146125ee5761259b87828151811061257a57fe5b602002602001015187838151811061258e57fe5b6020026020010151612610565b87518890859081106125a957fe5b602002602001018785815181106125bc57fe5b602002602001018786815181106125cf57fe5b9315156020948502919091019093019290925291905252600101612564565b50509250925092565b6060806126048484611a1b565b915061067f8484610734565b612618613467565b600080546040517f9d3fa4b900000000000000000000000000000000000000000000000000000000815282916001600160a01b031690639d3fa4b990612662908890600401614c6e565b60606040518083038186803b15801561267a57600080fd5b505afa15801561268e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126b291908101906141fa565b85516000546040517fa12dcc6f00000000000000000000000000000000000000000000000000000000815292955090916001600160a01b039091169063a12dcc6f906127049089908990600401614c81565b60206040518083038186803b15801561271c57600080fd5b505afa158015612730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127549190810190613dd4565b9150600061276187612ee5565b90506000612782886101800151896101400151612f0190919063ffffffff16565b156127b7576127b0826127a68a60c001518b60800151612f2690919063ffffffff16565b8a60a00151612f42565b9050612824565b60c08801516127d3576127b08289608001518a60a00151612f42565b60006127e4848a6101800151610688565b905060006127fb848b608001518c60a00151612f42565b90506000612812838c60c001518d60a00151612f42565b905061281e82826129ad565b93505050505b61284861284287604001518a60a00151612f6490919063ffffffff16565b826129ad565b9450600460005460208a01516040517f9caa023b00000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__92639caa023b926128b3926001600160a01b03909216918e91908c906004016147be565b60206040518083038186803b1580156128cb57600080fd5b505af41580156128df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061290391908101906140ee565b600481111561290e57fe5b1461291a57600061291c565b845b945061292c886101600151612f83565b61293557600094505b60e0880151158015906129535750612951886101a00151612f83565b155b1561295d57600094505b60038651600681111561296c57fe5b1461297657600094505b5050509250925092565b6001546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b031681565b60008183106129bc5781611827565b5090919050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600061182782612a2985613138565b6131b3565b60008160040183511015612a5457612a54612a4f60038551856004016131ed565b61325c565b5001602001516001600160e01b03191690565b60008160140183511015612a8857612a88612a4f60048551856014016131ed565b5001601401516001600160a01b031690565b60405160009081906060906001600160a01b038616907f70a082310000000000000000000000000000000000000000000000000000000090612ae090879060240161465f565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909416939093179092529051612b339190614643565b600060405180830381855afa9150503d8060008114612b6e576040519150601f19603f3d011682016040523d82523d6000602084013e612b73565b606091505b5091509150818015612b86575080516020145b156107af576106a58160005b60006118278383613264565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b600080612bd9612bb6565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c1357600080fd5b505af1158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c4b91908101906140d2565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c8a57600080fd5b505af1158015612c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612cc29190810190614402565b4211612d4057816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d0357600080fd5b505af1158015612d17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d3b9190810190614402565b612db3565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d7b57600080fd5b505af1158015612d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612db39190810190614402565b9050610911816b033b2e3c9fd0803ce800000086612f42565b600061182782612a298561328e565b60405160009081906060906001600160a01b038716907fdd62ed3e0000000000000000000000000000000000000000000000000000000090612e239088908890602401614673565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909416939093179092529051612e769190614643565b600060405180830381855afa9150503d8060008114612eb1576040519150601f19603f3d011682016040523d82523d6000602084013e612eb6565b606091505b5091509150818015612ec9575080516020145b15612edc57612ed9816000612b92565b92505b50509392505050565b6000806000612ef384613347565b9150915061091182826129ad565b6000815183511480156118275750508051602091820120825192909101919091201490565b60008282018381101561182757611827612a4f6000868661338a565b600061091183612f58868563ffffffff6133a916565b9063ffffffff6133da16565b600082821115612f7d57612f7d612a4f6002858561338a565b50900390565b60006020825181612f9057fe5b06600414612fa057506000610861565b6000612fb2838263ffffffff612a2e16565b90506001600160e01b031981167f94cfcdd70000000000000000000000000000000000000000000000000000000014612fef576001915050610861565b6040517fbbb2dcf600000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063bbb2dcf690613042908790600401614b1e565b60006040518083038186803b15801561305a57600080fd5b505af415801561306e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130969190810190614002565b80519093509150600090505b81811461312c5760006130d260008584815181106130bc57fe5b6020026020010151612a2e90919063ffffffff16565b90506001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415613123576131108483613404565b1561312357600095505050505050610861565b506001016130a2565b50600195945050505050565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6060632800659560e01b84848460405160240161320c93929190614b91565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b6000816020018351101561328557613285612a4f60058551856020016131ed565b50016020015190565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534939092909160208710156132da57fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b600080600483610140015151101561336457506000905080611502565b6133778360000151846101400151610b7e565b6114fd8460000151856101400151611a89565b606063e946c1bb60e01b84848460405160240161320c93929190614b6f565b6000826133b8575060006106aa565b828202828482816133c557fe5b041461182757611827612a4f6001868661338a565b6000816133f0576133f0612a4f6003858561338a565b60008284816133fb57fe5b04949350505050565b8151600090600183015b818110156107af5761344f85828151811061342557fe5b602002602001015186868151811061343957fe5b6020026020010151612f0190919063ffffffff16565b1561345f576001925050506106aa565b60010161340e565b6040805160608101909152806000815260006020820181905260409091015290565b80356106aa81614d59565b80516106aa81614d59565b600082601f8301126134af578081fd5b81356134c26134bd82614cdb565b614cb4565b8181529150602080830190848101818402860182018710156134e357600080fd5b60005b848110156114685781356134f981614d59565b845292820192908201906001016134e6565b600082601f83011261351b578081fd5b81356135296134bd82614cdb565b8181529150602080830190840160005b838110156135665761355187602084358901016136fa565b83526020928301929190910190600101613539565b5050505092915050565b600082601f830112613580578081fd5b815161358e6134bd82614cdb565b8181529150602080830190840160005b83811015613566576135b68760208451890101613748565b8352602092830192919091019060010161359e565b600082601f8301126135db578081fd5b81356135e96134bd82614cdb565b8181529150602080830190840160005b8381101561356657613611876020843589010161379d565b835260209283019291909101906001016135f9565b600082601f830112613636578081fd5b81356136446134bd82614cdb565b81815291506020808301908481018184028601820187101561366557600080fd5b60005b8481101561146857813584529282019290820190600101613668565b600082601f830112613694578081fd5b81516136a26134bd82614cdb565b8181529150602080830190848101818402860182018710156136c357600080fd5b60005b84811015611468578151845292820192908201906001016136c6565b80516001600160e01b0319811681146106aa57600080fd5b600082601f83011261370a578081fd5b81356137186134bd82614cfb565b915080825283602082850101111561372f57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613758578081fd5b81516137666134bd82614cfb565b915080825283602082850101111561377d57600080fd5b61146d816020840160208601614d1f565b8051600581106106aa57600080fd5b60006101c08083850312156137b0578182fd5b6137b981614cb4565b9150506137c68383613489565b81526137d58360208401613489565b60208201526137e78360408401613489565b60408201526137f98360608401613489565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561385b57600080fd5b613867868387016136fa565b8385015261016092508285013591508082111561388357600080fd5b61388f868387016136fa565b838501526101809250828501359150808211156138ab57600080fd5b6138b7868387016136fa565b838501526101a09250828501359150808211156138d357600080fd5b506138e0858286016136fa565b82840152505092915050565b60006101c08083850312156138ff578182fd5b61390881614cb4565b9150506139158383613494565b81526139248360208401613494565b60208201526139368360408401613494565b60408201526139488360608401613494565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156139aa57600080fd5b6139b686838701613748565b838501526101609250828501519150808211156139d257600080fd5b6139de86838701613748565b838501526101809250828501519150808211156139fa57600080fd5b613a0686838701613748565b838501526101a0925082850151915080821115613a2257600080fd5b506138e085828601613748565b600060208284031215613a40578081fd5b813561182781614d59565b60008060408385031215613a5d578081fd5b8235613a6881614d59565b9150602083013567ffffffffffffffff811115613a83578182fd5b613a8f8582860161350b565b9150509250929050565b60008060008060808587031215613aae578182fd5b8435613ab981614d59565b9350602085013567ffffffffffffffff80821115613ad5578384fd5b613ae188838901613626565b94506040870135915080821115613af6578384fd5b613b0288838901613626565b93506060870135915080821115613b17578283fd5b50613b24878288016136fa565b91505092959194509250565b60008060408385031215613b42578182fd5b8235613b4d81614d59565b9150602083013567ffffffffffffffff811115613b68578182fd5b613a8f858286016136fa565b600080600060608486031215613b88578081fd5b8335613b9381614d59565b9250602084013567ffffffffffffffff811115613bae578182fd5b613bba868287016136fa565b925050604084013590509250925092565b60008060408385031215613bdd578182fd5b8235613be881614d59565b946020939093013593505050565b600060208284031215613c07578081fd5b813567ffffffffffffffff811115613c1d578182fd5b6109118482850161349f565b60006020808385031215613c3b578182fd5b825167ffffffffffffffff811115613c51578283fd5b80840185601f820112613c62578384fd5b80519150613c726134bd83614cdb565b8281528381019082850185850284018601891015613c8e578687fd5b8693505b84841015613cb857613ca4898261378e565b835260019390930192918501918501613c92565b50979650505050505050565b600080600060608486031215613cd8578081fd5b833567ffffffffffffffff80821115613cef578283fd5b613cfb878388016135cb565b94506020860135915080821115613d10578283fd5b613d1c8783880161349f565b93506040860135915080821115613d31578283fd5b50613d3e86828701613626565b9150509250925092565b60008060408385031215613d5a578182fd5b823567ffffffffffffffff80821115613d71578384fd5b613d7d868387016135cb565b93506020850135915080821115613d92578283fd5b50613a8f8582860161350b565b60008060408385031215613db1578182fd5b823567ffffffffffffffff80821115613dc8578384fd5b613d7d86838701613626565b600060208284031215613de5578081fd5b81518015158114611827578182fd5b600060208284031215613e05578081fd5b61182783836136e2565b60008060408385031215613e21578182fd5b613e2b84846136e2565b91506020830151613e3b81614d59565b809150509250929050565b60008060008060808587031215613e5b578182fd5b8451613e6681614d6e565b6020860151909450613e7781614d59565b6040860151909350613e8881614d59565b606086015190925067ffffffffffffffff811115613ea4578182fd5b613b2487828801613748565b600080600080600060a08688031215613ec7578283fd5b613ed187876136e2565b94506020860151613ee181614d59565b604087015190945067ffffffffffffffff80821115613efe578485fd5b613f0a89838a01613684565b94506060880151915080821115613f1f578283fd5b613f2b89838a01613684565b93506080880151915080821115613f40578283fd5b50613f4d88828901613748565b9150509295509295909350565b60008060008060808587031215613f6f578182fd5b613f7986866136e2565b93506020850151613f8981614d59565b604086015190935067ffffffffffffffff811115613fa5578283fd5b613fb187828801613748565b606096909601519497939650505050565b600080600060608486031215613fd6578081fd5b613fe085856136e2565b92506020840151613ff081614d59565b80925050604084015190509250925092565b600080600060608486031215614016578081fd5b835161402181614d6e565b602085015190935067ffffffffffffffff8082111561403e578283fd5b61404a87838801613684565b9350604086015191508082111561405f578283fd5b50613d3e86828701613570565b60006020828403121561407d578081fd5b813567ffffffffffffffff811115614093578182fd5b610911848285016136fa565b6000602082840312156140b0578081fd5b815167ffffffffffffffff8111156140c6578182fd5b61091184828501613748565b6000602082840312156140e3578081fd5b815161182781614d59565b6000602082840312156140ff578081fd5b815160058110611827578182fd5b60008060008060808587031215614122578182fd5b845167ffffffffffffffff80821115614139578384fd5b61414588838901613748565b955060209150818701518181111561415b578485fd5b80880189601f82011261416c578586fd5b8051915061417c6134bd83614cdb565b82815284810190828601885b858110156141b15761419f8e8984518801016138ec565b84529287019290870190600101614188565b505060408b01519098509450505050808211156141cc578384fd5b6141d888838901613684565b935060608701519150808211156141ed578283fd5b50613b2487828801613570565b60006060828403121561420b578081fd5b6142156060614cb4565b825160078110614223578283fd5b8152602083810151908201526040928301519281019290925250919050565b600080600060608486031215614256578081fd5b833567ffffffffffffffff81111561426c578182fd5b6142788682870161379d565b935050602084013561428981614d59565b929592945050506040919091013590565b600080604083850312156142ac578182fd5b823567ffffffffffffffff808211156142c3578384fd5b6142cf8683870161379d565b935060208501359150808211156142e4578283fd5b50613a8f858286016136fa565b600080600060608486031215614305578081fd5b833567ffffffffffffffff81111561431b578182fd5b6143278682870161379d565b93505060208401359150604084013561433f81614d59565b809150509250925092565b60008060006060848603121561435e578081fd5b833567ffffffffffffffff80821115614375578283fd5b81860160a08189031215614387578384fd5b61439160a0614cb4565b92508035835260208101356020840152604081013560408401526143b88860608301613489565b60608401526080810135828111156143ce578485fd5b6143da898284016136fa565b6080850152509194505050602084013591506143f98560408601613489565b90509250925092565b600060208284031215614413578081fd5b5051919050565b6001600160a01b03169052565b6000815180845260208401935060208301825b828110156144615781516001600160a01b031686526020958601959091019060010161443a565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b848110156144b65782840388526144a08483516144f3565b6020988901989094509190910190600101614488565b50919695505050505050565b6000815180845260208401935060208301825b828110156144615781518652602095860195909101906001016144d5565b6000815180845261450b816020860160208601614d1f565b601f01601f19169290920160200192915050565b80516007811061452b57fe5b825260208181015190830152604090810151910152565b60006101c061455284845161441a565b6020830151614564602086018261441a565b506040830151614577604086018261441a565b50606083015161458a606086018261441a565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152506101408084015182828701526145e3838701826144f3565b9150506101609150818401518582038387015261460082826144f3565b92505050610180808401518583038287015261461c83826144f3565b9150506101a09150818401518582038387015261463982826144f3565b9695505050505050565b60008251614655818460208701614d1f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6000608082016001600160a01b03871683526080602084015280865180835260a08501915060a060208202860101925060208801845b82811015614712577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608786030184526146fd858351614542565b945060209384019391909101906001016146c3565b5050505082810360408401526147288186614427565b838103606085015261473a81866144c2565b98975050505050505050565b60006001600160a01b03861682526080602083015261476860808301866144c2565b828103604084015261477a81866144c2565b838103606085015261473a81866144f3565b60006001600160a01b0385168252606060208301526147ae60608301856144f3565b9050826040830152949350505050565b60006001600160a01b038087168352608060208401526147e16080840187614542565b94166040830152506060015292915050565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561484d57835161483981614d4f565b835260209384019390920191600101614826565b509095945050505050565b606080825284519082018190526000906020906080840190828801845b8281101561489b5761488884835161451f565b6060939093019290840190600101614875565b505050838103828501526148af81876144c2565b84810360408601528551808252908301915082860190845b818110156148e55782511515845292840192918401916001016148c7565b509198975050505050505050565b60006020825261182760208301846144c2565b60006040825261491960408301856144c2565b602083820381850152818551808452828401915082838202850101838801865b8381101561496757601f198784030185526149558383516144f3565b94860194925090850190600101614939565b50909998505050505050505050565b60006040825261498960408301856144c2565b82810360208401526118db81856144c2565b90815260200190565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b60006001600160e01b0319861682526001600160a01b0380861660208401528085166040840152506080606083015261463960808301846144f3565b60006001600160e01b0319871682526001600160a01b038616602083015260a06040830152614a4a60a08301866144c2565b8281036060840152614a5c81866144c2565b8381036080850152614a6e81866144f3565b9998505050505050505050565b60006001600160e01b0319861682526001600160a01b038516602083015260806040830152614aad60808301856144f3565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b60006001600160e01b03198516825260606020830152614b0c60608301856144c2565b8281036040840152614639818561446b565b60006020825261182760208301846144f3565b600060808252614b4460808301876144f3565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6060810160048510614b7d57fe5b938152602081019290925260409091015290565b6060810160088510614b7d57fe5b60208101614bac83614d4f565b91905290565b600060808252614bc560808301876144f3565b602083820381850152818751808452828401915082838202850101838a01865b83811015614c1357601f19878403018552614c01838351614542565b94860194925090850190600101614be5565b50508681036040880152614c27818a6144c2565b9450505050508281036060840152614c3f818561446b565b979650505050505050565b60a08101614c58828661451f565b8360608301528215156080830152949350505050565b6000602082526118276020830184614542565b600060408252614c946040830185614542565b82810360208401526118db81856144f3565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715614cd357600080fd5b604052919050565b600067ffffffffffffffff821115614cf1578081fd5b5060209081020190565b600067ffffffffffffffff821115614d11578081fd5b50601f01601f191660200190565b60005b83811015614d3a578181015183820152602001614d22565b83811115614d49576000848401525b50505050565b6005811061073157fe5b6001600160a01b038116811461073157600080fd5b6001600160e01b03198116811461073157600080fdfea365627a7a7231582034aeeb2766e909a7bf6404cf5556e26fa49952bdd5ea533d25447be58f55ed9a6c6578706572696d656e74616cf564736f6c63430005100040" + "object": "0x60806040523480156200001157600080fd5b5060405162005258380380620052588339810160408190526200003491620003e5565b600080546001600160a01b03199081166001600160a01b0385811691821784556005805490931690851617909155604051630c0e082160e31b8152829185918591906360704108906200009390630f47261b60e41b9060040162000423565b60206040518083038186803b158015620000ac57600080fd5b505afa158015620000c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620000e79190810190620003b5565b600180546001600160a01b0319166001600160a01b03928316179055604051630c0e082160e31b815290831690636070410890620001319063012b8bc960e11b9060040162000423565b60206040518083038186803b1580156200014a57600080fd5b505afa1580156200015f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001859190810190620003b5565b600280546001600160a01b0319166001600160a01b03928316179055604051630c0e082160e31b815290831690636070410890620001cf9063a7cb5fb760e01b9060040162000423565b60206040518083038186803b158015620001e857600080fd5b505afa158015620001fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002239190810190620003b5565b600380546001600160a01b0319166001600160a01b03928316179055604051630c0e082160e31b8152908316906360704108906200026d9063619ce88560e11b9060040162000423565b60206040518083038186803b1580156200028657600080fd5b505afa1580156200029b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002c19190810190620003b5565b600480546001600160a01b0319166001600160a01b03928316179055600092508316159050620002f25781620002f4565b305b90506200034f6040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b81525085846200035e60201b620029c31760201c565b60065550620004519350505050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600060208284031215620003c7578081fd5b81516001600160a01b0381168114620003de578182fd5b9392505050565b60008060408385031215620003f8578081fd5b8251620004058162000438565b6020840151909250620004188162000438565b809150509250929050565b6001600160e01b031991909116815260200190565b6001600160a01b03811681146200044e57600080fd5b50565b614df780620004616000396000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c8063a5cd62ba11610145578063d3637905116100bd578063e4e6e7da1161008c578063ee18599711610071578063ee185997146105b5578063ef3bb097146105bd578063ff84e7cc146105c55761025c565b8063e4e6e7da14610572578063e77286eb146105935761025c565b8063d36379051461050a578063d3d862d11461051d578063d469502814610530578063e25cabf7146105505761025c565b8063c26cfecd11610114578063ca49f47c116100f9578063ca49f47c146104c1578063d001c5dc146104e4578063d186037f146104f75761025c565b8063c26cfecd146104b1578063c82037ef146104b95761025c565b8063a5cd62ba14610449578063a6627e9f14610469578063b43cffe11461047c578063bbb2dcf61461048f5761025c565b80637982653e116101d85780639baf2705116101a75780639eadc8351161018c5780639eadc835146103ff578063a070cac814610423578063a0901e51146104365761025c565b80639baf2705146103e25780639cd01605146103f75761025c565b80637982653e1461037b57806379c9c4261461039b5780637d727512146103ae5780638f4ce479146103c15761025c565b80634dfdac201161022f57806363eb39921161021457806363eb3992146103225780636f83188e14610335578063750bdb30146103585761025c565b80634dfdac20146102e2578063590aa875146103025761025c565b806304a5618a146102615780630d7b7d761461028c5780632322cf76146102ad57806346eb65cb146102cd575b600080fd5b61027461026f36600461406c565b6105cd565b60405161028393929190614aee565b60405180910390f35b61029f61029a366004613b30565b610666565b604051610283929190614cd6565b6102c06102bb366004613b30565b610688565b60405161028391906149cb565b6102e06102db36600461406c565b6106b0565b005b6102f56102f0366004613a4b565b610734565b6040516102839190614923565b610315610310366004613a2f565b6107b7565b6040516102839190614b4e565b610315610330366004613b74565b610866565b61034861034336600461406c565b610919565b6040516102839493929190614be2565b61036b61036636600461406c565b6109b9565b6040516102839493929190614a0c565b61038e610389366004614242565b610a4b565b6040516102839190614bcf565b6102c06103a936600461434a565b610afd565b6102c06103bc366004613b30565b610b7e565b6103d46103cf36600461406c565b611474565b6040516102839291906149e9565b6103ea611507565b604051610283919061467e565b6103ea611516565b61041261040d36600461406c565b611525565b604051610283959493929190614a48565b6102c06104313660046142f1565b6115ca565b6102f5610444366004613bf6565b61164b565b61045c610457366004613cc4565b6116c4565b604051610283919061482b565b610315610477366004613bcb565b61177e565b61031561048a366004613a99565b61182e565b6104a261049d36600461406c565b6118e4565b60405161028393929190614b19565b6102c0611974565b6103ea61197a565b6104d46104cf36600461406c565b611989565b6040516102839493929190614aab565b6102f56104f2366004613a4b565b611a1b565b6102c0610505366004613b30565b611a89565b61038e610518366004614242565b612365565b61031561052b366004613d9f565b6123c7565b61054361053e36600461406c565b61241c565b60405161028391906149d4565b61056361055e366004613d48565b6124bf565b60405161028393929190614877565b610585610580366004613a4b565b6125f7565b6040516102839291906149a6565b6105a66105a136600461429a565b612610565b60405161028393929190614c7a565b6103ea612980565b6103ea61298f565b6103ea61299e565b600080600073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a856040518263ffffffff1660e01b81526004016106099190614b4e565b60606040518083038186803b15801561062157600080fd5b505af4158015610635573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106599190810190613fc2565b9250925092509193909250565b6000806106738484610b7e565b915061067f8484611a89565b90509250929050565b60008060006106978585610666565b915091506106a582826129ad565b925050505b92915050565b6040517f46eb65cb00000000000000000000000000000000000000000000000000000000815273__$d8b635de2bf4a097b4e18b67d0fb68e779$__906346eb65cb90610700908490600401614b4e565b60006040518083038186803b15801561071857600080fd5b505af415801561072c573d6000803e3d6000fd5b505050505b50565b606060008251905080604051908082528060200260200182016040528015610766578160200160208202803883390190505b50915060005b8181146107af576107908585838151811061078357fe5b6020026020010151611a89565b83828151811061079c57fe5b602090810291909101015260010161076c565b505092915050565b6040517f590aa87500000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063590aa8759061080a90859060040161467e565b60006040518083038186803b15801561082257600080fd5b505af4158015610836573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085e919081019061409f565b90505b919050565b6040517f63eb399200000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__906363eb3992906108bd908790879087906004016147ab565b60006040518083038186803b1580156108d557600080fd5b505af41580156108e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610911919081019061409f565b949350505050565b60608060608073__$fddee3b26a806429350031cf3481976d2e$__636f83188e866040518263ffffffff1660e01b81526004016109569190614b4e565b60006040518083038186803b15801561096e57600080fd5b505af4158015610982573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa919081019061410d565b93509350935093509193509193565b6000806000606073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016109f79190614b4e565b60006040518083038186803b158015610a0f57600080fd5b505af4158015610a23573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa9190810190613e46565b600080546040517f9caa023b00000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__91639caa023b91610aad916001600160a01b0316908890889088906004016147dd565b60206040518083038186803b158015610ac557600080fd5b505af4158015610ad9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061091191908101906140ee565b600061091184610b796040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876129c3565b612a1a565b600080610b91838263ffffffff612a2e16565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415610bec576000610bd884601063ffffffff612a6716565b9050610be48186612a9a565b92505061146d565b6001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415610e055760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a866040518263ffffffff1660e01b8152600401610c589190614b4e565b60606040518083038186803b158015610c7057600080fd5b505af4158015610c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ca89190810190613fc2565b6040519194509250606091507f6352211e0000000000000000000000000000000000000000000000000000000090610ce49084906024016149cb565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b031683604051610d5f9190614662565b600060405180830381855afa9150503d8060008114610d9a576040519150601f19603f3d011682016040523d82523d6000602084013e610d9f565b606091505b50915091506000828015610db4575081516020145b610dbf576000610dd0565b610dd082600c63ffffffff612a6716565b9050896001600160a01b0316816001600160a01b031614610df2576000610df5565b60015b60ff16975050505050505061146d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156110a157600060608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__639eadc835876040518263ffffffff1660e01b8152600401610e739190614b4e565b60006040518083038186803b158015610e8b57600080fd5b505af4158015610e9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ec79190810190613eb0565b5081519296509094509250905060005b81811461109757828181518110610eea57fe5b602002602001015160001415610eff5761108f565b83516060907efdd58e00000000000000000000000000000000000000000000000000000000908b90879085908110610f3357fe5b6020026020010151604051602401610f4c929190614812565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060876001600160a01b031683604051610fc79190614662565b600060405180830381855afa9150503d8060008114611002576040519150601f19603f3d011682016040523d82523d6000602084013e611007565b606091505b5091509150600082801561101c575081516020145b611027576000611038565b61103882600063ffffffff612b9216565b9050600087868151811061104857fe5b6020026020010151828161105857fe5b049050806110745760009b5050505050505050505050506106aa565b8b81108061108057508b155b1561108957809b505b50505050505b600101610ed7565b505050505061146d565b6001600160e01b031981167fc339d10a0000000000000000000000000000000000000000000000000000000014156111d4576040516060907fa85e59e4000000000000000000000000000000000000000000000000000000009061111090869060009081908190602401614b61565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611177908490614662565b600060405180830381855afa9150503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b50509050806111c75760006111cb565b6000195b9350505061146d565b6001600160e01b031981167fdc1600f30000000000000000000000000000000000000000000000000000000014156112fd5760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016112409190614b4e565b60006040518083038186803b15801561125857600080fd5b505af415801561126c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112949190810190613e46565b5092509250506112a2612b9e565b6001600160a01b0316826001600160a01b03161480156112cf57506005546001600160a01b038281169116145b156112f65760006112e76112e1612bb6565b88612a9a565b90506112f281612bce565b9450505b505061146d565b6001600160e01b031981167f94cfcdd700000000000000000000000000000000000000000000000000000000141561146d5760608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6866040518263ffffffff1660e01b81526004016113699190614b4e565b60006040518083038186803b15801561138157600080fd5b505af4158015611395573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113bd9190810190614002565b80519194509250905060005b818114611468578381815181106113dc57fe5b6020026020010151600014156113f157611460565b60006114108985848151811061140357fe5b6020026020010151610b7e565b9050600085838151811061142057fe5b6020026020010151828161143057fe5b049050806114485760009750505050505050506106aa565b87811080611454575087155b1561145d578097505b50505b6001016113c9565b505050505b5092915050565b60008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__638f4ce479846040518263ffffffff1660e01b81526004016114ae9190614b4e565b604080518083038186803b1580156114c557600080fd5b505af41580156114d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114fd9190810190613e0f565b915091505b915091565b6004546001600160a01b031681565b6000546001600160a01b031681565b600080606080606073__$d8b635de2bf4a097b4e18b67d0fb68e779$__639eadc835876040518263ffffffff1660e01b81526004016115649190614b4e565b60006040518083038186803b15801561157c57600080fd5b505af4158015611590573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115b89190810190613eb0565b939a9299509097509550909350915050565b6000610911846116466040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876129c3565b612dcc565b6060808251604051908082528060200260200182016040528015611679578160200160208202803883390190505b50905060005b8351811461146d5783818151811061169357fe5b60200260200101516001600160a01b0316318282815181106116b157fe5b602090810291909101015260010161167f565b6000546040517f02cffc4500000000000000000000000000000000000000000000000000000000815260609173__$7a69f714cdde1cb6b62e3c39bc8c94deae$__916302cffc459161172a916001600160a01b03909116908890889088906004016146ac565b60006040518083038186803b15801561174257600080fd5b505af4158015611756573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109119190810190613c29565b6040517fa6627e9f00000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063a6627e9f906117d39086908690600401614812565b60006040518083038186803b1580156117eb57600080fd5b505af41580156117ff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611827919081019061409f565b9392505050565b6040517fb43cffe100000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063b43cffe190611887908890889088908890600401614765565b60006040518083038186803b15801561189f57600080fd5b505af41580156118b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118db919081019061409f565b95945050505050565b600060608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6856040518263ffffffff1660e01b81526004016119209190614b4e565b60006040518083038186803b15801561193857600080fd5b505af415801561194c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106599190810190614002565b60065481565b6005546001600160a01b031681565b6000806060600073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63ca49f47c866040518263ffffffff1660e01b81526004016119c79190614b4e565b60006040518083038186803b1580156119df57600080fd5b505af41580156119f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa9190810190613f5a565b606060008251905080604051908082528060200260200182016040528015611a4d578160200160208202803883390190505b50915060005b8181146107af57611a6a8585838151811061140357fe5b838281518110611a7657fe5b6020908102919091010152600101611a53565b600080611a9c838263ffffffff612a2e16565b90506001600160e01b031981167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611c075760608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6866040518263ffffffff1660e01b8152600401611b0a9190614b4e565b60006040518083038186803b158015611b2257600080fd5b505af4158015611b36573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b5e9190810190614002565b80519194509250905060005b818114611bfc57838181518110611b7d57fe5b602002602001015160001415611b9257611bf4565b6000611ba48985848151811061078357fe5b90506000858381518110611bb457fe5b60200260200101518281611bc457fe5b04905080611bdc5760009750505050505050506106aa565b87811080611be8575087155b15611bf1578097505b50505b600101611b6a565b506106aa9350505050565b6001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415611c68576000611c4c84601063ffffffff612a6716565b600154909150610be490829087906001600160a01b0316612ddb565b6001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415611fb85760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a866040518263ffffffff1660e01b8152600401611cd49190614b4e565b60606040518083038186803b158015611cec57600080fd5b505af4158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d249190810190613fc2565b600254604051929550909350606092507fe985e9c50000000000000000000000000000000000000000000000000000000091611d70918a916001600160a01b0390911690602401614692565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b031683604051611deb9190614662565b600060405180830381855afa9150503d8060008114611e26576040519150601f19603f3d011682016040523d82523d6000602084013e611e2b565b606091505b5091509150811580611e3f57508051602014155b80611e5b5750611e5681600063ffffffff612b9216565b600114155b15611fa9576040516060907f081812fc0000000000000000000000000000000000000000000000000000000090611e969087906024016149cb565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050856001600160a01b031681604051611f0d9190614662565b600060405180830381855afa9150503d8060008114611f48576040519150601f19603f3d011682016040523d82523d6000602084013e611f4d565b606091505b509093509150828015611f61575081516020145b8015611f9057506002546001600160a01b0316611f8583600c63ffffffff612a6716565b6001600160a01b0316145b611f9b576000611f9e565b60015b60ff16975050611097565b6000199650505050505061146d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156121df576040517f9eadc83500000000000000000000000000000000000000000000000000000000815260009073__$d8b635de2bf4a097b4e18b67d0fb68e779$__90639eadc8359061203d908790600401614b4e565b60006040518083038186803b15801561205557600080fd5b505af4158015612069573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120919190810190613eb0565b5050600354604051929450606093507fe985e9c500000000000000000000000000000000000000000000000000000000926120db925089916001600160a01b031690602401614692565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060836001600160a01b0316836040516121569190614662565b600060405180830381855afa9150503d8060008114612191576040519150601f19603f3d011682016040523d82523d6000602084013e612196565b606091505b50915091508180156121a9575080516020145b80156121c557506121c181600063ffffffff612b9216565b6001145b6121d05760006121d4565b6000195b95505050505061146d565b6001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000141561221b57600019915061146d565b6001600160e01b031981167fdc1600f300000000000000000000000000000000000000000000000000000000141561146d5760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016122879190614b4e565b60006040518083038186803b15801561229f57600080fd5b505af41580156122b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122db9190810190613e46565b5092509250506122e9612b9e565b6001600160a01b0316826001600160a01b031614801561231657506005546001600160a01b038281169116145b1561235c57600061233b612328612bb6565b60055489906001600160a01b0316612ddb565b905060001981146123545761234f81612bce565b612358565b6000195b9450505b50505092915050565b600080546040517f8dccde0400000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__91638dccde0491610aad916001600160a01b0316908890889088906004016147dd565b6040517fd3d862d100000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063d3d862d1906117d39086908690600401614936565b6040517fd469502800000000000000000000000000000000000000000000000000000000815260009073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063d46950289061246f908590600401614b4e565b60206040518083038186803b15801561248757600080fd5b505af415801561249b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061085e9190810190613df4565b60608060606000855190508060405190808252806020026020018201604052801561250457816020015b6124f1613467565b8152602001906001900390816124e95790505b50935080604051908082528060200260200182016040528015612531578160200160208202803883390190505b5092508060405190808252806020026020018201604052801561255e578160200160208202803883390190505b50915060005b8181146125ee5761259b87828151811061257a57fe5b602002602001015187838151811061258e57fe5b6020026020010151612610565b87518890859081106125a957fe5b602002602001018785815181106125bc57fe5b602002602001018786815181106125cf57fe5b9315156020948502919091019093019290925291905252600101612564565b50509250925092565b6060806126048484611a1b565b915061067f8484610734565b612618613467565b600080546040517f9d3fa4b900000000000000000000000000000000000000000000000000000000815282916001600160a01b031690639d3fa4b990612662908890600401614c9e565b60606040518083038186803b15801561267a57600080fd5b505afa15801561268e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126b291908101906141fa565b85516000546040517fa12dcc6f00000000000000000000000000000000000000000000000000000000815292955090916001600160a01b039091169063a12dcc6f906127049089908990600401614cb1565b60206040518083038186803b15801561271c57600080fd5b505afa158015612730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127549190810190613dd4565b9150600061276187612ee5565b90506000612782886101800151896101400151612f0190919063ffffffff16565b156127b7576127b0826127a68a60c001518b60800151612f2690919063ffffffff16565b8a60a00151612f42565b9050612824565b60c08801516127d3576127b08289608001518a60a00151612f42565b60006127e4848a6101800151610688565b905060006127fb848b608001518c60a00151612f42565b90506000612812838c60c001518d60a00151612f42565b905061281e82826129ad565b93505050505b61284861284287604001518a60a00151612f6490919063ffffffff16565b826129ad565b9450600460005460208a01516040517f9caa023b00000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__92639caa023b926128b3926001600160a01b03909216918e91908c906004016147dd565b60206040518083038186803b1580156128cb57600080fd5b505af41580156128df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061290391908101906140ee565b600481111561290e57fe5b1461291a57600061291c565b845b945061292c886101600151612f83565b61293557600094505b60e0880151158015906129535750612951886101a00151612f83565b155b1561295d57600094505b60038651600681111561296c57fe5b1461297657600094505b5050509250925092565b6001546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b031681565b60008183106129bc5781611827565b5090919050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600061182782612a2985613138565b6131b3565b60008160040183511015612a5457612a54612a4f60038551856004016131ed565b61325c565b5001602001516001600160e01b03191690565b60008160140183511015612a8857612a88612a4f60048551856014016131ed565b5001601401516001600160a01b031690565b60405160009081906060906001600160a01b038616907f70a082310000000000000000000000000000000000000000000000000000000090612ae090879060240161467e565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909416939093179092529051612b339190614662565b600060405180830381855afa9150503d8060008114612b6e576040519150601f19603f3d011682016040523d82523d6000602084013e612b73565b606091505b5091509150818015612b86575080516020145b156107af576106a58160005b60006118278383613264565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b600080612bd9612bb6565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c1357600080fd5b505af1158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c4b91908101906140d2565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c8a57600080fd5b505af1158015612c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612cc29190810190614403565b4211612d4057816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d0357600080fd5b505af1158015612d17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d3b9190810190614403565b612db3565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d7b57600080fd5b505af1158015612d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612db39190810190614403565b9050610911816b033b2e3c9fd0803ce800000086612f42565b600061182782612a298561328e565b60405160009081906060906001600160a01b038716907fdd62ed3e0000000000000000000000000000000000000000000000000000000090612e239088908890602401614692565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909416939093179092529051612e769190614662565b600060405180830381855afa9150503d8060008114612eb1576040519150601f19603f3d011682016040523d82523d6000602084013e612eb6565b606091505b5091509150818015612ec9575080516020145b15612edc57612ed9816000612b92565b92505b50509392505050565b6000806000612ef384613347565b9150915061091182826129ad565b6000815183511480156118275750508051602091820120825192909101919091201490565b60008282018381101561182757611827612a4f6000868661338a565b600061091183612f58868563ffffffff6133a916565b9063ffffffff6133da16565b600082821115612f7d57612f7d612a4f6002858561338a565b50900390565b60006020825181612f9057fe5b06600414612fa057506000610861565b6000612fb2838263ffffffff612a2e16565b90506001600160e01b031981167f94cfcdd70000000000000000000000000000000000000000000000000000000014612fef576001915050610861565b6040517fbbb2dcf600000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063bbb2dcf690613042908790600401614b4e565b60006040518083038186803b15801561305a57600080fd5b505af415801561306e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130969190810190614002565b80519093509150600090505b81811461312c5760006130d260008584815181106130bc57fe5b6020026020010151612a2e90919063ffffffff16565b90506001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415613123576131108483613404565b1561312357600095505050505050610861565b506001016130a2565b50600195945050505050565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6060632800659560e01b84848460405160240161320c93929190614bc1565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b6000816020018351101561328557613285612a4f60058551856020016131ed565b50016020015190565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534939092909160208710156132da57fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b600080600483610140015151101561336457506000905080611502565b6133778360000151846101400151610b7e565b6114fd8460000151856101400151611a89565b606063e946c1bb60e01b84848460405160240161320c93929190614b9f565b6000826133b8575060006106aa565b828202828482816133c557fe5b041461182757611827612a4f6001868661338a565b6000816133f0576133f0612a4f6003858561338a565b60008284816133fb57fe5b04949350505050565b8151600090600183015b818110156107af5761344f85828151811061342557fe5b602002602001015186868151811061343957fe5b6020026020010151612f0190919063ffffffff16565b1561345f576001925050506106aa565b60010161340e565b6040805160608101909152806000815260006020820181905260409091015290565b80356106aa81614d89565b80516106aa81614d89565b600082601f8301126134af578081fd5b81356134c26134bd82614d0b565b614ce4565b8181529150602080830190848101818402860182018710156134e357600080fd5b60005b848110156114685781356134f981614d89565b845292820192908201906001016134e6565b600082601f83011261351b578081fd5b81356135296134bd82614d0b565b8181529150602080830190840160005b838110156135665761355187602084358901016136fa565b83526020928301929190910190600101613539565b5050505092915050565b600082601f830112613580578081fd5b815161358e6134bd82614d0b565b8181529150602080830190840160005b83811015613566576135b68760208451890101613748565b8352602092830192919091019060010161359e565b600082601f8301126135db578081fd5b81356135e96134bd82614d0b565b8181529150602080830190840160005b8381101561356657613611876020843589010161379d565b835260209283019291909101906001016135f9565b600082601f830112613636578081fd5b81356136446134bd82614d0b565b81815291506020808301908481018184028601820187101561366557600080fd5b60005b8481101561146857813584529282019290820190600101613668565b600082601f830112613694578081fd5b81516136a26134bd82614d0b565b8181529150602080830190848101818402860182018710156136c357600080fd5b60005b84811015611468578151845292820192908201906001016136c6565b80516001600160e01b0319811681146106aa57600080fd5b600082601f83011261370a578081fd5b81356137186134bd82614d2b565b915080825283602082850101111561372f57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613758578081fd5b81516137666134bd82614d2b565b915080825283602082850101111561377d57600080fd5b61146d816020840160208601614d4f565b8051600581106106aa57600080fd5b60006101c08083850312156137b0578182fd5b6137b981614ce4565b9150506137c68383613489565b81526137d58360208401613489565b60208201526137e78360408401613489565b60408201526137f98360608401613489565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561385b57600080fd5b613867868387016136fa565b8385015261016092508285013591508082111561388357600080fd5b61388f868387016136fa565b838501526101809250828501359150808211156138ab57600080fd5b6138b7868387016136fa565b838501526101a09250828501359150808211156138d357600080fd5b506138e0858286016136fa565b82840152505092915050565b60006101c08083850312156138ff578182fd5b61390881614ce4565b9150506139158383613494565b81526139248360208401613494565b60208201526139368360408401613494565b60408201526139488360608401613494565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156139aa57600080fd5b6139b686838701613748565b838501526101609250828501519150808211156139d257600080fd5b6139de86838701613748565b838501526101809250828501519150808211156139fa57600080fd5b613a0686838701613748565b838501526101a0925082850151915080821115613a2257600080fd5b506138e085828601613748565b600060208284031215613a40578081fd5b813561182781614d89565b60008060408385031215613a5d578081fd5b8235613a6881614d89565b9150602083013567ffffffffffffffff811115613a83578182fd5b613a8f8582860161350b565b9150509250929050565b60008060008060808587031215613aae578182fd5b8435613ab981614d89565b9350602085013567ffffffffffffffff80821115613ad5578384fd5b613ae188838901613626565b94506040870135915080821115613af6578384fd5b613b0288838901613626565b93506060870135915080821115613b17578283fd5b50613b24878288016136fa565b91505092959194509250565b60008060408385031215613b42578182fd5b8235613b4d81614d89565b9150602083013567ffffffffffffffff811115613b68578182fd5b613a8f858286016136fa565b600080600060608486031215613b88578081fd5b8335613b9381614d89565b9250602084013567ffffffffffffffff811115613bae578182fd5b613bba868287016136fa565b925050604084013590509250925092565b60008060408385031215613bdd578182fd5b8235613be881614d89565b946020939093013593505050565b600060208284031215613c07578081fd5b813567ffffffffffffffff811115613c1d578182fd5b6109118482850161349f565b60006020808385031215613c3b578182fd5b825167ffffffffffffffff811115613c51578283fd5b80840185601f820112613c62578384fd5b80519150613c726134bd83614d0b565b8281528381019082850185850284018601891015613c8e578687fd5b8693505b84841015613cb857613ca4898261378e565b835260019390930192918501918501613c92565b50979650505050505050565b600080600060608486031215613cd8578081fd5b833567ffffffffffffffff80821115613cef578283fd5b613cfb878388016135cb565b94506020860135915080821115613d10578283fd5b613d1c8783880161349f565b93506040860135915080821115613d31578283fd5b50613d3e86828701613626565b9150509250925092565b60008060408385031215613d5a578182fd5b823567ffffffffffffffff80821115613d71578384fd5b613d7d868387016135cb565b93506020850135915080821115613d92578283fd5b50613a8f8582860161350b565b60008060408385031215613db1578182fd5b823567ffffffffffffffff80821115613dc8578384fd5b613d7d86838701613626565b600060208284031215613de5578081fd5b81518015158114611827578182fd5b600060208284031215613e05578081fd5b61182783836136e2565b60008060408385031215613e21578182fd5b613e2b84846136e2565b91506020830151613e3b81614d89565b809150509250929050565b60008060008060808587031215613e5b578182fd5b8451613e6681614d9e565b6020860151909450613e7781614d89565b6040860151909350613e8881614d89565b606086015190925067ffffffffffffffff811115613ea4578182fd5b613b2487828801613748565b600080600080600060a08688031215613ec7578283fd5b613ed187876136e2565b94506020860151613ee181614d89565b604087015190945067ffffffffffffffff80821115613efe578485fd5b613f0a89838a01613684565b94506060880151915080821115613f1f578283fd5b613f2b89838a01613684565b93506080880151915080821115613f40578283fd5b50613f4d88828901613748565b9150509295509295909350565b60008060008060808587031215613f6f578182fd5b613f7986866136e2565b93506020850151613f8981614d89565b604086015190935067ffffffffffffffff811115613fa5578283fd5b613fb187828801613748565b606096909601519497939650505050565b600080600060608486031215613fd6578081fd5b613fe085856136e2565b92506020840151613ff081614d89565b80925050604084015190509250925092565b600080600060608486031215614016578081fd5b835161402181614d9e565b602085015190935067ffffffffffffffff8082111561403e578283fd5b61404a87838801613684565b9350604086015191508082111561405f578283fd5b50613d3e86828701613570565b60006020828403121561407d578081fd5b813567ffffffffffffffff811115614093578182fd5b610911848285016136fa565b6000602082840312156140b0578081fd5b815167ffffffffffffffff8111156140c6578182fd5b61091184828501613748565b6000602082840312156140e3578081fd5b815161182781614d89565b6000602082840312156140ff578081fd5b815160058110611827578182fd5b60008060008060808587031215614122578182fd5b845167ffffffffffffffff80821115614139578384fd5b61414588838901613748565b955060209150818701518181111561415b578485fd5b80880189601f82011261416c578586fd5b8051915061417c6134bd83614d0b565b82815284810190828601885b858110156141b15761419f8e8984518801016138ec565b84529287019290870190600101614188565b505060408b01519098509450505050808211156141cc578384fd5b6141d888838901613684565b935060608701519150808211156141ed578283fd5b50613b2487828801613570565b60006060828403121561420b578081fd5b6142156060614ce4565b825160078110614223578283fd5b8152602083810151908201526040928301519281019290925250919050565b600080600060608486031215614256578081fd5b833567ffffffffffffffff81111561426c578182fd5b6142788682870161379d565b935050602084013561428981614d89565b929592945050506040919091013590565b600080604083850312156142ac578182fd5b823567ffffffffffffffff808211156142c3578384fd5b6142cf8683870161379d565b935060208501359150808211156142e4578283fd5b50613a8f858286016136fa565b600080600060608486031215614305578081fd5b833567ffffffffffffffff81111561431b578182fd5b6143278682870161379d565b93505060208401359150604084013561433f81614d89565b809150509250925092565b60008060006060848603121561435e578081fd5b833567ffffffffffffffff80821115614375578283fd5b81860160a08189031215614387578384fd5b61439160a0614ce4565b925080358352602081013560208401526040810135604084015260608101356143b981614d89565b60608401526080810135828111156143cf578485fd5b6143db898284016136fa565b6080850152509194505050602084013591506143fa8560408601613489565b90509250925092565b600060208284031215614414578081fd5b5051919050565b1515815260200190565b6000614431838361453e565b505060600190565b6001600160a01b03169052565b6000815180845260208401935060208301825b828110156144805781516001600160a01b0316865260209586019590910190600101614459565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b848110156144d55782840388526144bf848351614512565b60209889019890945091909101906001016144a7565b50919695505050505050565b6000815180845260208401935060208301825b828110156144805781518652602095860195909101906001016144f4565b6000815180845261452a816020860160208601614d4f565b601f01601f19169290920160200192915050565b80516007811061454a57fe5b825260208181015190830152604090810151910152565b60006101c0614571848451614439565b60208301516145836020860182614439565b5060408301516145966040860182614439565b5060608301516145a96060860182614439565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e085015261010080840151818601525061012080840151818601525061014080840151828287015261460283870182614512565b9150506101609150818401518582038387015261461f8282614512565b92505050610180808401518583038287015261463b8382614512565b9150506101a0915081840151858203838701526146588282614512565b9695505050505050565b60008251614674818460208701614d4f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6000608082016001600160a01b03871683526080602084015280865180835260a08501915060a060208202860101925060208801845b82811015614731577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6087860301845261471c858351614561565b945060209384019391909101906001016146e2565b5050505082810360408401526147478186614446565b838103606085015261475981866144e1565b98975050505050505050565b60006001600160a01b03861682526080602083015261478760808301866144e1565b828103604084015261479981866144e1565b83810360608501526147598186614512565b60006001600160a01b0385168252606060208301526147cd6060830185614512565b9050826040830152949350505050565b60006001600160a01b038087168352608060208401526148006080840187614561565b94166040830152506060015292915050565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561486c57835161485881614d7f565b835260209384019390920191600101614845565b509095945050505050565b6000606082016060835280865161488e81846149cb565b9150602088019250835b818110156148bc576148ab838551614425565b602094909401939250600101614898565b505083810360208501526148d081876144e1565b91505082810360408401528084516148e881846149cb565b9150602086019250835b818110156149165761490583855161441b565b6020949094019392506001016148f2565b5090979650505050505050565b60006020825261182760208301846144e1565b60006040825261494960408301856144e1565b602083820381850152818551808452828401915082838202850101838801865b8381101561499757601f19878403018552614985838351614512565b94860194925090850190600101614969565b50909998505050505050505050565b6000604082526149b960408301856144e1565b82810360208401526118db81856144e1565b90815260200190565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b60006001600160e01b0319861682526001600160a01b038086166020840152808516604084015250608060608301526146586080830184614512565b60006001600160e01b0319871682526001600160a01b038616602083015260a06040830152614a7a60a08301866144e1565b8281036060840152614a8c81866144e1565b8381036080850152614a9e8186614512565b9998505050505050505050565b60006001600160e01b0319861682526001600160a01b038516602083015260806040830152614add6080830185614512565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b60006001600160e01b03198516825260606020830152614b3c60608301856144e1565b8281036040840152614658818561448a565b6000602082526118276020830184614512565b600060808252614b746080830187614512565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6060810160048510614bad57fe5b938152602081019290925260409091015290565b6060810160088510614bad57fe5b60208101614bdc83614d7f565b91905290565b600060808252614bf56080830187614512565b602083820381850152818751808452828401915082838202850101838a01865b83811015614c4357601f19878403018552614c31838351614561565b94860194925090850190600101614c15565b50508681036040880152614c57818a6144e1565b9450505050508281036060840152614c6f818561448a565b979650505050505050565b60a08101614c88828661453e565b8360608301528215156080830152949350505050565b6000602082526118276020830184614561565b600060408252614cc46040830185614561565b82810360208401526118db8185614512565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715614d0357600080fd5b604052919050565b600067ffffffffffffffff821115614d21578081fd5b5060209081020190565b600067ffffffffffffffff821115614d41578081fd5b50601f01601f191660200190565b60005b83811015614d6a578181015183820152602001614d52565b83811115614d79576000848401525b50505050565b6005811061073157fe5b6001600160a01b038116811461073157600080fd5b6001600160e01b03198116811461073157600080fdfea365627a7a72315820d5f953a2f0be372b5155353406d20980ed27dc327f638f1b56f5c24fc55036106c6578706572696d656e74616cf564736f6c63430005100040" }, "deployedBytecode": { - "object": "0x608060405234801561001057600080fd5b506004361061025c5760003560e01c8063a5cd62ba11610145578063d3637905116100bd578063e4e6e7da1161008c578063ee18599711610071578063ee185997146105b5578063ef3bb097146105bd578063ff84e7cc146105c55761025c565b8063e4e6e7da14610572578063e77286eb146105935761025c565b8063d36379051461050a578063d3d862d11461051d578063d469502814610530578063e25cabf7146105505761025c565b8063c26cfecd11610114578063ca49f47c116100f9578063ca49f47c146104c1578063d001c5dc146104e4578063d186037f146104f75761025c565b8063c26cfecd146104b1578063c82037ef146104b95761025c565b8063a5cd62ba14610449578063a6627e9f14610469578063b43cffe11461047c578063bbb2dcf61461048f5761025c565b80637982653e116101d85780639baf2705116101a75780639eadc8351161018c5780639eadc835146103ff578063a070cac814610423578063a0901e51146104365761025c565b80639baf2705146103e25780639cd01605146103f75761025c565b80637982653e1461037b57806379c9c4261461039b5780637d727512146103ae5780638f4ce479146103c15761025c565b80634dfdac201161022f57806363eb39921161021457806363eb3992146103225780636f83188e14610335578063750bdb30146103585761025c565b80634dfdac20146102e2578063590aa875146103025761025c565b806304a5618a146102615780630d7b7d761461028c5780632322cf76146102ad57806346eb65cb146102cd575b600080fd5b61027461026f36600461406c565b6105cd565b60405161028393929190614abe565b60405180910390f35b61029f61029a366004613b30565b610666565b604051610283929190614ca6565b6102c06102bb366004613b30565b610688565b604051610283919061499b565b6102e06102db36600461406c565b6106b0565b005b6102f56102f0366004613a4b565b610734565b60405161028391906148f3565b610315610310366004613a2f565b6107b7565b6040516102839190614b1e565b610315610330366004613b74565b610866565b61034861034336600461406c565b610919565b6040516102839493929190614bb2565b61036b61036636600461406c565b6109b9565b60405161028394939291906149dc565b61038e610389366004614242565b610a4b565b6040516102839190614b9f565b6102c06103a936600461434a565b610afd565b6102c06103bc366004613b30565b610b7e565b6103d46103cf36600461406c565b611474565b6040516102839291906149b9565b6103ea611507565b604051610283919061465f565b6103ea611516565b61041261040d36600461406c565b611525565b604051610283959493929190614a18565b6102c06104313660046142f1565b6115ca565b6102f5610444366004613bf6565b61164b565b61045c610457366004613cc4565b6116c4565b604051610283919061480c565b610315610477366004613bcb565b61177e565b61031561048a366004613a99565b61182e565b6104a261049d36600461406c565b6118e4565b60405161028393929190614ae9565b6102c0611974565b6103ea61197a565b6104d46104cf36600461406c565b611989565b6040516102839493929190614a7b565b6102f56104f2366004613a4b565b611a1b565b6102c0610505366004613b30565b611a89565b61038e610518366004614242565b612365565b61031561052b366004613d9f565b6123c7565b61054361053e36600461406c565b61241c565b60405161028391906149a4565b61056361055e366004613d48565b6124bf565b60405161028393929190614858565b610585610580366004613a4b565b6125f7565b604051610283929190614976565b6105a66105a136600461429a565b612610565b60405161028393929190614c4a565b6103ea612980565b6103ea61298f565b6103ea61299e565b600080600073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a856040518263ffffffff1660e01b81526004016106099190614b1e565b60606040518083038186803b15801561062157600080fd5b505af4158015610635573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106599190810190613fc2565b9250925092509193909250565b6000806106738484610b7e565b915061067f8484611a89565b90509250929050565b60008060006106978585610666565b915091506106a582826129ad565b925050505b92915050565b6040517f46eb65cb00000000000000000000000000000000000000000000000000000000815273__$d8b635de2bf4a097b4e18b67d0fb68e779$__906346eb65cb90610700908490600401614b1e565b60006040518083038186803b15801561071857600080fd5b505af415801561072c573d6000803e3d6000fd5b505050505b50565b606060008251905080604051908082528060200260200182016040528015610766578160200160208202803883390190505b50915060005b8181146107af576107908585838151811061078357fe5b6020026020010151611a89565b83828151811061079c57fe5b602090810291909101015260010161076c565b505092915050565b6040517f590aa87500000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063590aa8759061080a90859060040161465f565b60006040518083038186803b15801561082257600080fd5b505af4158015610836573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085e919081019061409f565b90505b919050565b6040517f63eb399200000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__906363eb3992906108bd9087908790879060040161478c565b60006040518083038186803b1580156108d557600080fd5b505af41580156108e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610911919081019061409f565b949350505050565b60608060608073__$fddee3b26a806429350031cf3481976d2e$__636f83188e866040518263ffffffff1660e01b81526004016109569190614b1e565b60006040518083038186803b15801561096e57600080fd5b505af4158015610982573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa919081019061410d565b93509350935093509193509193565b6000806000606073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016109f79190614b1e565b60006040518083038186803b158015610a0f57600080fd5b505af4158015610a23573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa9190810190613e46565b600080546040517f9caa023b00000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__91639caa023b91610aad916001600160a01b0316908890889088906004016147be565b60206040518083038186803b158015610ac557600080fd5b505af4158015610ad9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061091191908101906140ee565b600061091184610b796040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876129c3565b612a1a565b600080610b91838263ffffffff612a2e16565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415610bec576000610bd884601063ffffffff612a6716565b9050610be48186612a9a565b92505061146d565b6001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415610e055760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a866040518263ffffffff1660e01b8152600401610c589190614b1e565b60606040518083038186803b158015610c7057600080fd5b505af4158015610c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ca89190810190613fc2565b6040519194509250606091507f6352211e0000000000000000000000000000000000000000000000000000000090610ce490849060240161499b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b031683604051610d5f9190614643565b600060405180830381855afa9150503d8060008114610d9a576040519150601f19603f3d011682016040523d82523d6000602084013e610d9f565b606091505b50915091506000828015610db4575081516020145b610dbf576000610dd0565b610dd082600c63ffffffff612a6716565b9050896001600160a01b0316816001600160a01b031614610df2576000610df5565b60015b60ff16975050505050505061146d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156110a157600060608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__639eadc835876040518263ffffffff1660e01b8152600401610e739190614b1e565b60006040518083038186803b158015610e8b57600080fd5b505af4158015610e9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ec79190810190613eb0565b5081519296509094509250905060005b81811461109757828181518110610eea57fe5b602002602001015160001415610eff5761108f565b83516060907efdd58e00000000000000000000000000000000000000000000000000000000908b90879085908110610f3357fe5b6020026020010151604051602401610f4c9291906147f3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060876001600160a01b031683604051610fc79190614643565b600060405180830381855afa9150503d8060008114611002576040519150601f19603f3d011682016040523d82523d6000602084013e611007565b606091505b5091509150600082801561101c575081516020145b611027576000611038565b61103882600063ffffffff612b9216565b9050600087868151811061104857fe5b6020026020010151828161105857fe5b049050806110745760009b5050505050505050505050506106aa565b8b81108061108057508b155b1561108957809b505b50505050505b600101610ed7565b505050505061146d565b6001600160e01b031981167fc339d10a0000000000000000000000000000000000000000000000000000000014156111d4576040516060907fa85e59e4000000000000000000000000000000000000000000000000000000009061111090869060009081908190602401614b31565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611177908490614643565b600060405180830381855afa9150503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b50509050806111c75760006111cb565b6000195b9350505061146d565b6001600160e01b031981167fdc1600f30000000000000000000000000000000000000000000000000000000014156112fd5760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016112409190614b1e565b60006040518083038186803b15801561125857600080fd5b505af415801561126c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112949190810190613e46565b5092509250506112a2612b9e565b6001600160a01b0316826001600160a01b03161480156112cf57506005546001600160a01b038281169116145b156112f65760006112e76112e1612bb6565b88612a9a565b90506112f281612bce565b9450505b505061146d565b6001600160e01b031981167f94cfcdd700000000000000000000000000000000000000000000000000000000141561146d5760608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6866040518263ffffffff1660e01b81526004016113699190614b1e565b60006040518083038186803b15801561138157600080fd5b505af4158015611395573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113bd9190810190614002565b80519194509250905060005b818114611468578381815181106113dc57fe5b6020026020010151600014156113f157611460565b60006114108985848151811061140357fe5b6020026020010151610b7e565b9050600085838151811061142057fe5b6020026020010151828161143057fe5b049050806114485760009750505050505050506106aa565b87811080611454575087155b1561145d578097505b50505b6001016113c9565b505050505b5092915050565b60008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__638f4ce479846040518263ffffffff1660e01b81526004016114ae9190614b1e565b604080518083038186803b1580156114c557600080fd5b505af41580156114d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114fd9190810190613e0f565b915091505b915091565b6004546001600160a01b031681565b6000546001600160a01b031681565b600080606080606073__$d8b635de2bf4a097b4e18b67d0fb68e779$__639eadc835876040518263ffffffff1660e01b81526004016115649190614b1e565b60006040518083038186803b15801561157c57600080fd5b505af4158015611590573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115b89190810190613eb0565b939a9299509097509550909350915050565b6000610911846116466040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876129c3565b612dcc565b6060808251604051908082528060200260200182016040528015611679578160200160208202803883390190505b50905060005b8351811461146d5783818151811061169357fe5b60200260200101516001600160a01b0316318282815181106116b157fe5b602090810291909101015260010161167f565b6000546040517f02cffc4500000000000000000000000000000000000000000000000000000000815260609173__$7a69f714cdde1cb6b62e3c39bc8c94deae$__916302cffc459161172a916001600160a01b039091169088908890889060040161468d565b60006040518083038186803b15801561174257600080fd5b505af4158015611756573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109119190810190613c29565b6040517fa6627e9f00000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063a6627e9f906117d390869086906004016147f3565b60006040518083038186803b1580156117eb57600080fd5b505af41580156117ff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611827919081019061409f565b9392505050565b6040517fb43cffe100000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063b43cffe190611887908890889088908890600401614746565b60006040518083038186803b15801561189f57600080fd5b505af41580156118b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118db919081019061409f565b95945050505050565b600060608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6856040518263ffffffff1660e01b81526004016119209190614b1e565b60006040518083038186803b15801561193857600080fd5b505af415801561194c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106599190810190614002565b60065481565b6005546001600160a01b031681565b6000806060600073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63ca49f47c866040518263ffffffff1660e01b81526004016119c79190614b1e565b60006040518083038186803b1580156119df57600080fd5b505af41580156119f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa9190810190613f5a565b606060008251905080604051908082528060200260200182016040528015611a4d578160200160208202803883390190505b50915060005b8181146107af57611a6a8585838151811061140357fe5b838281518110611a7657fe5b6020908102919091010152600101611a53565b600080611a9c838263ffffffff612a2e16565b90506001600160e01b031981167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611c075760608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6866040518263ffffffff1660e01b8152600401611b0a9190614b1e565b60006040518083038186803b158015611b2257600080fd5b505af4158015611b36573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b5e9190810190614002565b80519194509250905060005b818114611bfc57838181518110611b7d57fe5b602002602001015160001415611b9257611bf4565b6000611ba48985848151811061078357fe5b90506000858381518110611bb457fe5b60200260200101518281611bc457fe5b04905080611bdc5760009750505050505050506106aa565b87811080611be8575087155b15611bf1578097505b50505b600101611b6a565b506106aa9350505050565b6001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415611c68576000611c4c84601063ffffffff612a6716565b600154909150610be490829087906001600160a01b0316612ddb565b6001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415611fb85760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a866040518263ffffffff1660e01b8152600401611cd49190614b1e565b60606040518083038186803b158015611cec57600080fd5b505af4158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d249190810190613fc2565b600254604051929550909350606092507fe985e9c50000000000000000000000000000000000000000000000000000000091611d70918a916001600160a01b0390911690602401614673565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b031683604051611deb9190614643565b600060405180830381855afa9150503d8060008114611e26576040519150601f19603f3d011682016040523d82523d6000602084013e611e2b565b606091505b5091509150811580611e3f57508051602014155b80611e5b5750611e5681600063ffffffff612b9216565b600114155b15611fa9576040516060907f081812fc0000000000000000000000000000000000000000000000000000000090611e9690879060240161499b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050856001600160a01b031681604051611f0d9190614643565b600060405180830381855afa9150503d8060008114611f48576040519150601f19603f3d011682016040523d82523d6000602084013e611f4d565b606091505b509093509150828015611f61575081516020145b8015611f9057506002546001600160a01b0316611f8583600c63ffffffff612a6716565b6001600160a01b0316145b611f9b576000611f9e565b60015b60ff16975050611097565b6000199650505050505061146d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156121df576040517f9eadc83500000000000000000000000000000000000000000000000000000000815260009073__$d8b635de2bf4a097b4e18b67d0fb68e779$__90639eadc8359061203d908790600401614b1e565b60006040518083038186803b15801561205557600080fd5b505af4158015612069573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120919190810190613eb0565b5050600354604051929450606093507fe985e9c500000000000000000000000000000000000000000000000000000000926120db925089916001600160a01b031690602401614673565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060836001600160a01b0316836040516121569190614643565b600060405180830381855afa9150503d8060008114612191576040519150601f19603f3d011682016040523d82523d6000602084013e612196565b606091505b50915091508180156121a9575080516020145b80156121c557506121c181600063ffffffff612b9216565b6001145b6121d05760006121d4565b6000195b95505050505061146d565b6001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000141561221b57600019915061146d565b6001600160e01b031981167fdc1600f300000000000000000000000000000000000000000000000000000000141561146d5760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016122879190614b1e565b60006040518083038186803b15801561229f57600080fd5b505af41580156122b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122db9190810190613e46565b5092509250506122e9612b9e565b6001600160a01b0316826001600160a01b031614801561231657506005546001600160a01b038281169116145b1561235c57600061233b612328612bb6565b60055489906001600160a01b0316612ddb565b905060001981146123545761234f81612bce565b612358565b6000195b9450505b50505092915050565b600080546040517f8dccde0400000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__91638dccde0491610aad916001600160a01b0316908890889088906004016147be565b6040517fd3d862d100000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063d3d862d1906117d39086908690600401614906565b6040517fd469502800000000000000000000000000000000000000000000000000000000815260009073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063d46950289061246f908590600401614b1e565b60206040518083038186803b15801561248757600080fd5b505af415801561249b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061085e9190810190613df4565b60608060606000855190508060405190808252806020026020018201604052801561250457816020015b6124f1613467565b8152602001906001900390816124e95790505b50935080604051908082528060200260200182016040528015612531578160200160208202803883390190505b5092508060405190808252806020026020018201604052801561255e578160200160208202803883390190505b50915060005b8181146125ee5761259b87828151811061257a57fe5b602002602001015187838151811061258e57fe5b6020026020010151612610565b87518890859081106125a957fe5b602002602001018785815181106125bc57fe5b602002602001018786815181106125cf57fe5b9315156020948502919091019093019290925291905252600101612564565b50509250925092565b6060806126048484611a1b565b915061067f8484610734565b612618613467565b600080546040517f9d3fa4b900000000000000000000000000000000000000000000000000000000815282916001600160a01b031690639d3fa4b990612662908890600401614c6e565b60606040518083038186803b15801561267a57600080fd5b505afa15801561268e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126b291908101906141fa565b85516000546040517fa12dcc6f00000000000000000000000000000000000000000000000000000000815292955090916001600160a01b039091169063a12dcc6f906127049089908990600401614c81565b60206040518083038186803b15801561271c57600080fd5b505afa158015612730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127549190810190613dd4565b9150600061276187612ee5565b90506000612782886101800151896101400151612f0190919063ffffffff16565b156127b7576127b0826127a68a60c001518b60800151612f2690919063ffffffff16565b8a60a00151612f42565b9050612824565b60c08801516127d3576127b08289608001518a60a00151612f42565b60006127e4848a6101800151610688565b905060006127fb848b608001518c60a00151612f42565b90506000612812838c60c001518d60a00151612f42565b905061281e82826129ad565b93505050505b61284861284287604001518a60a00151612f6490919063ffffffff16565b826129ad565b9450600460005460208a01516040517f9caa023b00000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__92639caa023b926128b3926001600160a01b03909216918e91908c906004016147be565b60206040518083038186803b1580156128cb57600080fd5b505af41580156128df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061290391908101906140ee565b600481111561290e57fe5b1461291a57600061291c565b845b945061292c886101600151612f83565b61293557600094505b60e0880151158015906129535750612951886101a00151612f83565b155b1561295d57600094505b60038651600681111561296c57fe5b1461297657600094505b5050509250925092565b6001546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b031681565b60008183106129bc5781611827565b5090919050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600061182782612a2985613138565b6131b3565b60008160040183511015612a5457612a54612a4f60038551856004016131ed565b61325c565b5001602001516001600160e01b03191690565b60008160140183511015612a8857612a88612a4f60048551856014016131ed565b5001601401516001600160a01b031690565b60405160009081906060906001600160a01b038616907f70a082310000000000000000000000000000000000000000000000000000000090612ae090879060240161465f565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909416939093179092529051612b339190614643565b600060405180830381855afa9150503d8060008114612b6e576040519150601f19603f3d011682016040523d82523d6000602084013e612b73565b606091505b5091509150818015612b86575080516020145b156107af576106a58160005b60006118278383613264565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b600080612bd9612bb6565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c1357600080fd5b505af1158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c4b91908101906140d2565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c8a57600080fd5b505af1158015612c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612cc29190810190614402565b4211612d4057816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d0357600080fd5b505af1158015612d17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d3b9190810190614402565b612db3565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d7b57600080fd5b505af1158015612d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612db39190810190614402565b9050610911816b033b2e3c9fd0803ce800000086612f42565b600061182782612a298561328e565b60405160009081906060906001600160a01b038716907fdd62ed3e0000000000000000000000000000000000000000000000000000000090612e239088908890602401614673565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909416939093179092529051612e769190614643565b600060405180830381855afa9150503d8060008114612eb1576040519150601f19603f3d011682016040523d82523d6000602084013e612eb6565b606091505b5091509150818015612ec9575080516020145b15612edc57612ed9816000612b92565b92505b50509392505050565b6000806000612ef384613347565b9150915061091182826129ad565b6000815183511480156118275750508051602091820120825192909101919091201490565b60008282018381101561182757611827612a4f6000868661338a565b600061091183612f58868563ffffffff6133a916565b9063ffffffff6133da16565b600082821115612f7d57612f7d612a4f6002858561338a565b50900390565b60006020825181612f9057fe5b06600414612fa057506000610861565b6000612fb2838263ffffffff612a2e16565b90506001600160e01b031981167f94cfcdd70000000000000000000000000000000000000000000000000000000014612fef576001915050610861565b6040517fbbb2dcf600000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063bbb2dcf690613042908790600401614b1e565b60006040518083038186803b15801561305a57600080fd5b505af415801561306e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130969190810190614002565b80519093509150600090505b81811461312c5760006130d260008584815181106130bc57fe5b6020026020010151612a2e90919063ffffffff16565b90506001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415613123576131108483613404565b1561312357600095505050505050610861565b506001016130a2565b50600195945050505050565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6060632800659560e01b84848460405160240161320c93929190614b91565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b6000816020018351101561328557613285612a4f60058551856020016131ed565b50016020015190565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534939092909160208710156132da57fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b600080600483610140015151101561336457506000905080611502565b6133778360000151846101400151610b7e565b6114fd8460000151856101400151611a89565b606063e946c1bb60e01b84848460405160240161320c93929190614b6f565b6000826133b8575060006106aa565b828202828482816133c557fe5b041461182757611827612a4f6001868661338a565b6000816133f0576133f0612a4f6003858561338a565b60008284816133fb57fe5b04949350505050565b8151600090600183015b818110156107af5761344f85828151811061342557fe5b602002602001015186868151811061343957fe5b6020026020010151612f0190919063ffffffff16565b1561345f576001925050506106aa565b60010161340e565b6040805160608101909152806000815260006020820181905260409091015290565b80356106aa81614d59565b80516106aa81614d59565b600082601f8301126134af578081fd5b81356134c26134bd82614cdb565b614cb4565b8181529150602080830190848101818402860182018710156134e357600080fd5b60005b848110156114685781356134f981614d59565b845292820192908201906001016134e6565b600082601f83011261351b578081fd5b81356135296134bd82614cdb565b8181529150602080830190840160005b838110156135665761355187602084358901016136fa565b83526020928301929190910190600101613539565b5050505092915050565b600082601f830112613580578081fd5b815161358e6134bd82614cdb565b8181529150602080830190840160005b83811015613566576135b68760208451890101613748565b8352602092830192919091019060010161359e565b600082601f8301126135db578081fd5b81356135e96134bd82614cdb565b8181529150602080830190840160005b8381101561356657613611876020843589010161379d565b835260209283019291909101906001016135f9565b600082601f830112613636578081fd5b81356136446134bd82614cdb565b81815291506020808301908481018184028601820187101561366557600080fd5b60005b8481101561146857813584529282019290820190600101613668565b600082601f830112613694578081fd5b81516136a26134bd82614cdb565b8181529150602080830190848101818402860182018710156136c357600080fd5b60005b84811015611468578151845292820192908201906001016136c6565b80516001600160e01b0319811681146106aa57600080fd5b600082601f83011261370a578081fd5b81356137186134bd82614cfb565b915080825283602082850101111561372f57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613758578081fd5b81516137666134bd82614cfb565b915080825283602082850101111561377d57600080fd5b61146d816020840160208601614d1f565b8051600581106106aa57600080fd5b60006101c08083850312156137b0578182fd5b6137b981614cb4565b9150506137c68383613489565b81526137d58360208401613489565b60208201526137e78360408401613489565b60408201526137f98360608401613489565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561385b57600080fd5b613867868387016136fa565b8385015261016092508285013591508082111561388357600080fd5b61388f868387016136fa565b838501526101809250828501359150808211156138ab57600080fd5b6138b7868387016136fa565b838501526101a09250828501359150808211156138d357600080fd5b506138e0858286016136fa565b82840152505092915050565b60006101c08083850312156138ff578182fd5b61390881614cb4565b9150506139158383613494565b81526139248360208401613494565b60208201526139368360408401613494565b60408201526139488360608401613494565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156139aa57600080fd5b6139b686838701613748565b838501526101609250828501519150808211156139d257600080fd5b6139de86838701613748565b838501526101809250828501519150808211156139fa57600080fd5b613a0686838701613748565b838501526101a0925082850151915080821115613a2257600080fd5b506138e085828601613748565b600060208284031215613a40578081fd5b813561182781614d59565b60008060408385031215613a5d578081fd5b8235613a6881614d59565b9150602083013567ffffffffffffffff811115613a83578182fd5b613a8f8582860161350b565b9150509250929050565b60008060008060808587031215613aae578182fd5b8435613ab981614d59565b9350602085013567ffffffffffffffff80821115613ad5578384fd5b613ae188838901613626565b94506040870135915080821115613af6578384fd5b613b0288838901613626565b93506060870135915080821115613b17578283fd5b50613b24878288016136fa565b91505092959194509250565b60008060408385031215613b42578182fd5b8235613b4d81614d59565b9150602083013567ffffffffffffffff811115613b68578182fd5b613a8f858286016136fa565b600080600060608486031215613b88578081fd5b8335613b9381614d59565b9250602084013567ffffffffffffffff811115613bae578182fd5b613bba868287016136fa565b925050604084013590509250925092565b60008060408385031215613bdd578182fd5b8235613be881614d59565b946020939093013593505050565b600060208284031215613c07578081fd5b813567ffffffffffffffff811115613c1d578182fd5b6109118482850161349f565b60006020808385031215613c3b578182fd5b825167ffffffffffffffff811115613c51578283fd5b80840185601f820112613c62578384fd5b80519150613c726134bd83614cdb565b8281528381019082850185850284018601891015613c8e578687fd5b8693505b84841015613cb857613ca4898261378e565b835260019390930192918501918501613c92565b50979650505050505050565b600080600060608486031215613cd8578081fd5b833567ffffffffffffffff80821115613cef578283fd5b613cfb878388016135cb565b94506020860135915080821115613d10578283fd5b613d1c8783880161349f565b93506040860135915080821115613d31578283fd5b50613d3e86828701613626565b9150509250925092565b60008060408385031215613d5a578182fd5b823567ffffffffffffffff80821115613d71578384fd5b613d7d868387016135cb565b93506020850135915080821115613d92578283fd5b50613a8f8582860161350b565b60008060408385031215613db1578182fd5b823567ffffffffffffffff80821115613dc8578384fd5b613d7d86838701613626565b600060208284031215613de5578081fd5b81518015158114611827578182fd5b600060208284031215613e05578081fd5b61182783836136e2565b60008060408385031215613e21578182fd5b613e2b84846136e2565b91506020830151613e3b81614d59565b809150509250929050565b60008060008060808587031215613e5b578182fd5b8451613e6681614d6e565b6020860151909450613e7781614d59565b6040860151909350613e8881614d59565b606086015190925067ffffffffffffffff811115613ea4578182fd5b613b2487828801613748565b600080600080600060a08688031215613ec7578283fd5b613ed187876136e2565b94506020860151613ee181614d59565b604087015190945067ffffffffffffffff80821115613efe578485fd5b613f0a89838a01613684565b94506060880151915080821115613f1f578283fd5b613f2b89838a01613684565b93506080880151915080821115613f40578283fd5b50613f4d88828901613748565b9150509295509295909350565b60008060008060808587031215613f6f578182fd5b613f7986866136e2565b93506020850151613f8981614d59565b604086015190935067ffffffffffffffff811115613fa5578283fd5b613fb187828801613748565b606096909601519497939650505050565b600080600060608486031215613fd6578081fd5b613fe085856136e2565b92506020840151613ff081614d59565b80925050604084015190509250925092565b600080600060608486031215614016578081fd5b835161402181614d6e565b602085015190935067ffffffffffffffff8082111561403e578283fd5b61404a87838801613684565b9350604086015191508082111561405f578283fd5b50613d3e86828701613570565b60006020828403121561407d578081fd5b813567ffffffffffffffff811115614093578182fd5b610911848285016136fa565b6000602082840312156140b0578081fd5b815167ffffffffffffffff8111156140c6578182fd5b61091184828501613748565b6000602082840312156140e3578081fd5b815161182781614d59565b6000602082840312156140ff578081fd5b815160058110611827578182fd5b60008060008060808587031215614122578182fd5b845167ffffffffffffffff80821115614139578384fd5b61414588838901613748565b955060209150818701518181111561415b578485fd5b80880189601f82011261416c578586fd5b8051915061417c6134bd83614cdb565b82815284810190828601885b858110156141b15761419f8e8984518801016138ec565b84529287019290870190600101614188565b505060408b01519098509450505050808211156141cc578384fd5b6141d888838901613684565b935060608701519150808211156141ed578283fd5b50613b2487828801613570565b60006060828403121561420b578081fd5b6142156060614cb4565b825160078110614223578283fd5b8152602083810151908201526040928301519281019290925250919050565b600080600060608486031215614256578081fd5b833567ffffffffffffffff81111561426c578182fd5b6142788682870161379d565b935050602084013561428981614d59565b929592945050506040919091013590565b600080604083850312156142ac578182fd5b823567ffffffffffffffff808211156142c3578384fd5b6142cf8683870161379d565b935060208501359150808211156142e4578283fd5b50613a8f858286016136fa565b600080600060608486031215614305578081fd5b833567ffffffffffffffff81111561431b578182fd5b6143278682870161379d565b93505060208401359150604084013561433f81614d59565b809150509250925092565b60008060006060848603121561435e578081fd5b833567ffffffffffffffff80821115614375578283fd5b81860160a08189031215614387578384fd5b61439160a0614cb4565b92508035835260208101356020840152604081013560408401526143b88860608301613489565b60608401526080810135828111156143ce578485fd5b6143da898284016136fa565b6080850152509194505050602084013591506143f98560408601613489565b90509250925092565b600060208284031215614413578081fd5b5051919050565b6001600160a01b03169052565b6000815180845260208401935060208301825b828110156144615781516001600160a01b031686526020958601959091019060010161443a565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b848110156144b65782840388526144a08483516144f3565b6020988901989094509190910190600101614488565b50919695505050505050565b6000815180845260208401935060208301825b828110156144615781518652602095860195909101906001016144d5565b6000815180845261450b816020860160208601614d1f565b601f01601f19169290920160200192915050565b80516007811061452b57fe5b825260208181015190830152604090810151910152565b60006101c061455284845161441a565b6020830151614564602086018261441a565b506040830151614577604086018261441a565b50606083015161458a606086018261441a565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152506101408084015182828701526145e3838701826144f3565b9150506101609150818401518582038387015261460082826144f3565b92505050610180808401518583038287015261461c83826144f3565b9150506101a09150818401518582038387015261463982826144f3565b9695505050505050565b60008251614655818460208701614d1f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6000608082016001600160a01b03871683526080602084015280865180835260a08501915060a060208202860101925060208801845b82811015614712577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608786030184526146fd858351614542565b945060209384019391909101906001016146c3565b5050505082810360408401526147288186614427565b838103606085015261473a81866144c2565b98975050505050505050565b60006001600160a01b03861682526080602083015261476860808301866144c2565b828103604084015261477a81866144c2565b838103606085015261473a81866144f3565b60006001600160a01b0385168252606060208301526147ae60608301856144f3565b9050826040830152949350505050565b60006001600160a01b038087168352608060208401526147e16080840187614542565b94166040830152506060015292915050565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561484d57835161483981614d4f565b835260209384019390920191600101614826565b509095945050505050565b606080825284519082018190526000906020906080840190828801845b8281101561489b5761488884835161451f565b6060939093019290840190600101614875565b505050838103828501526148af81876144c2565b84810360408601528551808252908301915082860190845b818110156148e55782511515845292840192918401916001016148c7565b509198975050505050505050565b60006020825261182760208301846144c2565b60006040825261491960408301856144c2565b602083820381850152818551808452828401915082838202850101838801865b8381101561496757601f198784030185526149558383516144f3565b94860194925090850190600101614939565b50909998505050505050505050565b60006040825261498960408301856144c2565b82810360208401526118db81856144c2565b90815260200190565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b60006001600160e01b0319861682526001600160a01b0380861660208401528085166040840152506080606083015261463960808301846144f3565b60006001600160e01b0319871682526001600160a01b038616602083015260a06040830152614a4a60a08301866144c2565b8281036060840152614a5c81866144c2565b8381036080850152614a6e81866144f3565b9998505050505050505050565b60006001600160e01b0319861682526001600160a01b038516602083015260806040830152614aad60808301856144f3565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b60006001600160e01b03198516825260606020830152614b0c60608301856144c2565b8281036040840152614639818561446b565b60006020825261182760208301846144f3565b600060808252614b4460808301876144f3565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6060810160048510614b7d57fe5b938152602081019290925260409091015290565b6060810160088510614b7d57fe5b60208101614bac83614d4f565b91905290565b600060808252614bc560808301876144f3565b602083820381850152818751808452828401915082838202850101838a01865b83811015614c1357601f19878403018552614c01838351614542565b94860194925090850190600101614be5565b50508681036040880152614c27818a6144c2565b9450505050508281036060840152614c3f818561446b565b979650505050505050565b60a08101614c58828661451f565b8360608301528215156080830152949350505050565b6000602082526118276020830184614542565b600060408252614c946040830185614542565b82810360208401526118db81856144f3565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715614cd357600080fd5b604052919050565b600067ffffffffffffffff821115614cf1578081fd5b5060209081020190565b600067ffffffffffffffff821115614d11578081fd5b50601f01601f191660200190565b60005b83811015614d3a578181015183820152602001614d22565b83811115614d49576000848401525b50505050565b6005811061073157fe5b6001600160a01b038116811461073157600080fd5b6001600160e01b03198116811461073157600080fdfea365627a7a7231582034aeeb2766e909a7bf6404cf5556e26fa49952bdd5ea533d25447be58f55ed9a6c6578706572696d656e74616cf564736f6c63430005100040" + "object": "0x608060405234801561001057600080fd5b506004361061025c5760003560e01c8063a5cd62ba11610145578063d3637905116100bd578063e4e6e7da1161008c578063ee18599711610071578063ee185997146105b5578063ef3bb097146105bd578063ff84e7cc146105c55761025c565b8063e4e6e7da14610572578063e77286eb146105935761025c565b8063d36379051461050a578063d3d862d11461051d578063d469502814610530578063e25cabf7146105505761025c565b8063c26cfecd11610114578063ca49f47c116100f9578063ca49f47c146104c1578063d001c5dc146104e4578063d186037f146104f75761025c565b8063c26cfecd146104b1578063c82037ef146104b95761025c565b8063a5cd62ba14610449578063a6627e9f14610469578063b43cffe11461047c578063bbb2dcf61461048f5761025c565b80637982653e116101d85780639baf2705116101a75780639eadc8351161018c5780639eadc835146103ff578063a070cac814610423578063a0901e51146104365761025c565b80639baf2705146103e25780639cd01605146103f75761025c565b80637982653e1461037b57806379c9c4261461039b5780637d727512146103ae5780638f4ce479146103c15761025c565b80634dfdac201161022f57806363eb39921161021457806363eb3992146103225780636f83188e14610335578063750bdb30146103585761025c565b80634dfdac20146102e2578063590aa875146103025761025c565b806304a5618a146102615780630d7b7d761461028c5780632322cf76146102ad57806346eb65cb146102cd575b600080fd5b61027461026f36600461406c565b6105cd565b60405161028393929190614aee565b60405180910390f35b61029f61029a366004613b30565b610666565b604051610283929190614cd6565b6102c06102bb366004613b30565b610688565b60405161028391906149cb565b6102e06102db36600461406c565b6106b0565b005b6102f56102f0366004613a4b565b610734565b6040516102839190614923565b610315610310366004613a2f565b6107b7565b6040516102839190614b4e565b610315610330366004613b74565b610866565b61034861034336600461406c565b610919565b6040516102839493929190614be2565b61036b61036636600461406c565b6109b9565b6040516102839493929190614a0c565b61038e610389366004614242565b610a4b565b6040516102839190614bcf565b6102c06103a936600461434a565b610afd565b6102c06103bc366004613b30565b610b7e565b6103d46103cf36600461406c565b611474565b6040516102839291906149e9565b6103ea611507565b604051610283919061467e565b6103ea611516565b61041261040d36600461406c565b611525565b604051610283959493929190614a48565b6102c06104313660046142f1565b6115ca565b6102f5610444366004613bf6565b61164b565b61045c610457366004613cc4565b6116c4565b604051610283919061482b565b610315610477366004613bcb565b61177e565b61031561048a366004613a99565b61182e565b6104a261049d36600461406c565b6118e4565b60405161028393929190614b19565b6102c0611974565b6103ea61197a565b6104d46104cf36600461406c565b611989565b6040516102839493929190614aab565b6102f56104f2366004613a4b565b611a1b565b6102c0610505366004613b30565b611a89565b61038e610518366004614242565b612365565b61031561052b366004613d9f565b6123c7565b61054361053e36600461406c565b61241c565b60405161028391906149d4565b61056361055e366004613d48565b6124bf565b60405161028393929190614877565b610585610580366004613a4b565b6125f7565b6040516102839291906149a6565b6105a66105a136600461429a565b612610565b60405161028393929190614c7a565b6103ea612980565b6103ea61298f565b6103ea61299e565b600080600073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a856040518263ffffffff1660e01b81526004016106099190614b4e565b60606040518083038186803b15801561062157600080fd5b505af4158015610635573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106599190810190613fc2565b9250925092509193909250565b6000806106738484610b7e565b915061067f8484611a89565b90509250929050565b60008060006106978585610666565b915091506106a582826129ad565b925050505b92915050565b6040517f46eb65cb00000000000000000000000000000000000000000000000000000000815273__$d8b635de2bf4a097b4e18b67d0fb68e779$__906346eb65cb90610700908490600401614b4e565b60006040518083038186803b15801561071857600080fd5b505af415801561072c573d6000803e3d6000fd5b505050505b50565b606060008251905080604051908082528060200260200182016040528015610766578160200160208202803883390190505b50915060005b8181146107af576107908585838151811061078357fe5b6020026020010151611a89565b83828151811061079c57fe5b602090810291909101015260010161076c565b505092915050565b6040517f590aa87500000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063590aa8759061080a90859060040161467e565b60006040518083038186803b15801561082257600080fd5b505af4158015610836573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085e919081019061409f565b90505b919050565b6040517f63eb399200000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__906363eb3992906108bd908790879087906004016147ab565b60006040518083038186803b1580156108d557600080fd5b505af41580156108e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610911919081019061409f565b949350505050565b60608060608073__$fddee3b26a806429350031cf3481976d2e$__636f83188e866040518263ffffffff1660e01b81526004016109569190614b4e565b60006040518083038186803b15801561096e57600080fd5b505af4158015610982573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa919081019061410d565b93509350935093509193509193565b6000806000606073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016109f79190614b4e565b60006040518083038186803b158015610a0f57600080fd5b505af4158015610a23573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa9190810190613e46565b600080546040517f9caa023b00000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__91639caa023b91610aad916001600160a01b0316908890889088906004016147dd565b60206040518083038186803b158015610ac557600080fd5b505af4158015610ad9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061091191908101906140ee565b600061091184610b796040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876129c3565b612a1a565b600080610b91838263ffffffff612a2e16565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415610bec576000610bd884601063ffffffff612a6716565b9050610be48186612a9a565b92505061146d565b6001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415610e055760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a866040518263ffffffff1660e01b8152600401610c589190614b4e565b60606040518083038186803b158015610c7057600080fd5b505af4158015610c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ca89190810190613fc2565b6040519194509250606091507f6352211e0000000000000000000000000000000000000000000000000000000090610ce49084906024016149cb565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b031683604051610d5f9190614662565b600060405180830381855afa9150503d8060008114610d9a576040519150601f19603f3d011682016040523d82523d6000602084013e610d9f565b606091505b50915091506000828015610db4575081516020145b610dbf576000610dd0565b610dd082600c63ffffffff612a6716565b9050896001600160a01b0316816001600160a01b031614610df2576000610df5565b60015b60ff16975050505050505061146d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156110a157600060608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__639eadc835876040518263ffffffff1660e01b8152600401610e739190614b4e565b60006040518083038186803b158015610e8b57600080fd5b505af4158015610e9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ec79190810190613eb0565b5081519296509094509250905060005b81811461109757828181518110610eea57fe5b602002602001015160001415610eff5761108f565b83516060907efdd58e00000000000000000000000000000000000000000000000000000000908b90879085908110610f3357fe5b6020026020010151604051602401610f4c929190614812565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060876001600160a01b031683604051610fc79190614662565b600060405180830381855afa9150503d8060008114611002576040519150601f19603f3d011682016040523d82523d6000602084013e611007565b606091505b5091509150600082801561101c575081516020145b611027576000611038565b61103882600063ffffffff612b9216565b9050600087868151811061104857fe5b6020026020010151828161105857fe5b049050806110745760009b5050505050505050505050506106aa565b8b81108061108057508b155b1561108957809b505b50505050505b600101610ed7565b505050505061146d565b6001600160e01b031981167fc339d10a0000000000000000000000000000000000000000000000000000000014156111d4576040516060907fa85e59e4000000000000000000000000000000000000000000000000000000009061111090869060009081908190602401614b61565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611177908490614662565b600060405180830381855afa9150503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b50509050806111c75760006111cb565b6000195b9350505061146d565b6001600160e01b031981167fdc1600f30000000000000000000000000000000000000000000000000000000014156112fd5760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016112409190614b4e565b60006040518083038186803b15801561125857600080fd5b505af415801561126c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112949190810190613e46565b5092509250506112a2612b9e565b6001600160a01b0316826001600160a01b03161480156112cf57506005546001600160a01b038281169116145b156112f65760006112e76112e1612bb6565b88612a9a565b90506112f281612bce565b9450505b505061146d565b6001600160e01b031981167f94cfcdd700000000000000000000000000000000000000000000000000000000141561146d5760608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6866040518263ffffffff1660e01b81526004016113699190614b4e565b60006040518083038186803b15801561138157600080fd5b505af4158015611395573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113bd9190810190614002565b80519194509250905060005b818114611468578381815181106113dc57fe5b6020026020010151600014156113f157611460565b60006114108985848151811061140357fe5b6020026020010151610b7e565b9050600085838151811061142057fe5b6020026020010151828161143057fe5b049050806114485760009750505050505050506106aa565b87811080611454575087155b1561145d578097505b50505b6001016113c9565b505050505b5092915050565b60008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__638f4ce479846040518263ffffffff1660e01b81526004016114ae9190614b4e565b604080518083038186803b1580156114c557600080fd5b505af41580156114d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114fd9190810190613e0f565b915091505b915091565b6004546001600160a01b031681565b6000546001600160a01b031681565b600080606080606073__$d8b635de2bf4a097b4e18b67d0fb68e779$__639eadc835876040518263ffffffff1660e01b81526004016115649190614b4e565b60006040518083038186803b15801561157c57600080fd5b505af4158015611590573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115b89190810190613eb0565b939a9299509097509550909350915050565b6000610911846116466040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876129c3565b612dcc565b6060808251604051908082528060200260200182016040528015611679578160200160208202803883390190505b50905060005b8351811461146d5783818151811061169357fe5b60200260200101516001600160a01b0316318282815181106116b157fe5b602090810291909101015260010161167f565b6000546040517f02cffc4500000000000000000000000000000000000000000000000000000000815260609173__$7a69f714cdde1cb6b62e3c39bc8c94deae$__916302cffc459161172a916001600160a01b03909116908890889088906004016146ac565b60006040518083038186803b15801561174257600080fd5b505af4158015611756573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109119190810190613c29565b6040517fa6627e9f00000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063a6627e9f906117d39086908690600401614812565b60006040518083038186803b1580156117eb57600080fd5b505af41580156117ff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611827919081019061409f565b9392505050565b6040517fb43cffe100000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063b43cffe190611887908890889088908890600401614765565b60006040518083038186803b15801561189f57600080fd5b505af41580156118b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118db919081019061409f565b95945050505050565b600060608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6856040518263ffffffff1660e01b81526004016119209190614b4e565b60006040518083038186803b15801561193857600080fd5b505af415801561194c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106599190810190614002565b60065481565b6005546001600160a01b031681565b6000806060600073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63ca49f47c866040518263ffffffff1660e01b81526004016119c79190614b4e565b60006040518083038186803b1580156119df57600080fd5b505af41580156119f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa9190810190613f5a565b606060008251905080604051908082528060200260200182016040528015611a4d578160200160208202803883390190505b50915060005b8181146107af57611a6a8585838151811061140357fe5b838281518110611a7657fe5b6020908102919091010152600101611a53565b600080611a9c838263ffffffff612a2e16565b90506001600160e01b031981167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611c075760608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6866040518263ffffffff1660e01b8152600401611b0a9190614b4e565b60006040518083038186803b158015611b2257600080fd5b505af4158015611b36573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b5e9190810190614002565b80519194509250905060005b818114611bfc57838181518110611b7d57fe5b602002602001015160001415611b9257611bf4565b6000611ba48985848151811061078357fe5b90506000858381518110611bb457fe5b60200260200101518281611bc457fe5b04905080611bdc5760009750505050505050506106aa565b87811080611be8575087155b15611bf1578097505b50505b600101611b6a565b506106aa9350505050565b6001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415611c68576000611c4c84601063ffffffff612a6716565b600154909150610be490829087906001600160a01b0316612ddb565b6001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415611fb85760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a866040518263ffffffff1660e01b8152600401611cd49190614b4e565b60606040518083038186803b158015611cec57600080fd5b505af4158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d249190810190613fc2565b600254604051929550909350606092507fe985e9c50000000000000000000000000000000000000000000000000000000091611d70918a916001600160a01b0390911690602401614692565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b031683604051611deb9190614662565b600060405180830381855afa9150503d8060008114611e26576040519150601f19603f3d011682016040523d82523d6000602084013e611e2b565b606091505b5091509150811580611e3f57508051602014155b80611e5b5750611e5681600063ffffffff612b9216565b600114155b15611fa9576040516060907f081812fc0000000000000000000000000000000000000000000000000000000090611e969087906024016149cb565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050856001600160a01b031681604051611f0d9190614662565b600060405180830381855afa9150503d8060008114611f48576040519150601f19603f3d011682016040523d82523d6000602084013e611f4d565b606091505b509093509150828015611f61575081516020145b8015611f9057506002546001600160a01b0316611f8583600c63ffffffff612a6716565b6001600160a01b0316145b611f9b576000611f9e565b60015b60ff16975050611097565b6000199650505050505061146d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156121df576040517f9eadc83500000000000000000000000000000000000000000000000000000000815260009073__$d8b635de2bf4a097b4e18b67d0fb68e779$__90639eadc8359061203d908790600401614b4e565b60006040518083038186803b15801561205557600080fd5b505af4158015612069573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120919190810190613eb0565b5050600354604051929450606093507fe985e9c500000000000000000000000000000000000000000000000000000000926120db925089916001600160a01b031690602401614692565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060836001600160a01b0316836040516121569190614662565b600060405180830381855afa9150503d8060008114612191576040519150601f19603f3d011682016040523d82523d6000602084013e612196565b606091505b50915091508180156121a9575080516020145b80156121c557506121c181600063ffffffff612b9216565b6001145b6121d05760006121d4565b6000195b95505050505061146d565b6001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000141561221b57600019915061146d565b6001600160e01b031981167fdc1600f300000000000000000000000000000000000000000000000000000000141561146d5760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016122879190614b4e565b60006040518083038186803b15801561229f57600080fd5b505af41580156122b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122db9190810190613e46565b5092509250506122e9612b9e565b6001600160a01b0316826001600160a01b031614801561231657506005546001600160a01b038281169116145b1561235c57600061233b612328612bb6565b60055489906001600160a01b0316612ddb565b905060001981146123545761234f81612bce565b612358565b6000195b9450505b50505092915050565b600080546040517f8dccde0400000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__91638dccde0491610aad916001600160a01b0316908890889088906004016147dd565b6040517fd3d862d100000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063d3d862d1906117d39086908690600401614936565b6040517fd469502800000000000000000000000000000000000000000000000000000000815260009073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063d46950289061246f908590600401614b4e565b60206040518083038186803b15801561248757600080fd5b505af415801561249b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061085e9190810190613df4565b60608060606000855190508060405190808252806020026020018201604052801561250457816020015b6124f1613467565b8152602001906001900390816124e95790505b50935080604051908082528060200260200182016040528015612531578160200160208202803883390190505b5092508060405190808252806020026020018201604052801561255e578160200160208202803883390190505b50915060005b8181146125ee5761259b87828151811061257a57fe5b602002602001015187838151811061258e57fe5b6020026020010151612610565b87518890859081106125a957fe5b602002602001018785815181106125bc57fe5b602002602001018786815181106125cf57fe5b9315156020948502919091019093019290925291905252600101612564565b50509250925092565b6060806126048484611a1b565b915061067f8484610734565b612618613467565b600080546040517f9d3fa4b900000000000000000000000000000000000000000000000000000000815282916001600160a01b031690639d3fa4b990612662908890600401614c9e565b60606040518083038186803b15801561267a57600080fd5b505afa15801561268e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126b291908101906141fa565b85516000546040517fa12dcc6f00000000000000000000000000000000000000000000000000000000815292955090916001600160a01b039091169063a12dcc6f906127049089908990600401614cb1565b60206040518083038186803b15801561271c57600080fd5b505afa158015612730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127549190810190613dd4565b9150600061276187612ee5565b90506000612782886101800151896101400151612f0190919063ffffffff16565b156127b7576127b0826127a68a60c001518b60800151612f2690919063ffffffff16565b8a60a00151612f42565b9050612824565b60c08801516127d3576127b08289608001518a60a00151612f42565b60006127e4848a6101800151610688565b905060006127fb848b608001518c60a00151612f42565b90506000612812838c60c001518d60a00151612f42565b905061281e82826129ad565b93505050505b61284861284287604001518a60a00151612f6490919063ffffffff16565b826129ad565b9450600460005460208a01516040517f9caa023b00000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__92639caa023b926128b3926001600160a01b03909216918e91908c906004016147dd565b60206040518083038186803b1580156128cb57600080fd5b505af41580156128df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061290391908101906140ee565b600481111561290e57fe5b1461291a57600061291c565b845b945061292c886101600151612f83565b61293557600094505b60e0880151158015906129535750612951886101a00151612f83565b155b1561295d57600094505b60038651600681111561296c57fe5b1461297657600094505b5050509250925092565b6001546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b031681565b60008183106129bc5781611827565b5090919050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600061182782612a2985613138565b6131b3565b60008160040183511015612a5457612a54612a4f60038551856004016131ed565b61325c565b5001602001516001600160e01b03191690565b60008160140183511015612a8857612a88612a4f60048551856014016131ed565b5001601401516001600160a01b031690565b60405160009081906060906001600160a01b038616907f70a082310000000000000000000000000000000000000000000000000000000090612ae090879060240161467e565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909416939093179092529051612b339190614662565b600060405180830381855afa9150503d8060008114612b6e576040519150601f19603f3d011682016040523d82523d6000602084013e612b73565b606091505b5091509150818015612b86575080516020145b156107af576106a58160005b60006118278383613264565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b600080612bd9612bb6565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c1357600080fd5b505af1158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c4b91908101906140d2565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c8a57600080fd5b505af1158015612c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612cc29190810190614403565b4211612d4057816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d0357600080fd5b505af1158015612d17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d3b9190810190614403565b612db3565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d7b57600080fd5b505af1158015612d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612db39190810190614403565b9050610911816b033b2e3c9fd0803ce800000086612f42565b600061182782612a298561328e565b60405160009081906060906001600160a01b038716907fdd62ed3e0000000000000000000000000000000000000000000000000000000090612e239088908890602401614692565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909416939093179092529051612e769190614662565b600060405180830381855afa9150503d8060008114612eb1576040519150601f19603f3d011682016040523d82523d6000602084013e612eb6565b606091505b5091509150818015612ec9575080516020145b15612edc57612ed9816000612b92565b92505b50509392505050565b6000806000612ef384613347565b9150915061091182826129ad565b6000815183511480156118275750508051602091820120825192909101919091201490565b60008282018381101561182757611827612a4f6000868661338a565b600061091183612f58868563ffffffff6133a916565b9063ffffffff6133da16565b600082821115612f7d57612f7d612a4f6002858561338a565b50900390565b60006020825181612f9057fe5b06600414612fa057506000610861565b6000612fb2838263ffffffff612a2e16565b90506001600160e01b031981167f94cfcdd70000000000000000000000000000000000000000000000000000000014612fef576001915050610861565b6040517fbbb2dcf600000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063bbb2dcf690613042908790600401614b4e565b60006040518083038186803b15801561305a57600080fd5b505af415801561306e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130969190810190614002565b80519093509150600090505b81811461312c5760006130d260008584815181106130bc57fe5b6020026020010151612a2e90919063ffffffff16565b90506001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415613123576131108483613404565b1561312357600095505050505050610861565b506001016130a2565b50600195945050505050565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6060632800659560e01b84848460405160240161320c93929190614bc1565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b6000816020018351101561328557613285612a4f60058551856020016131ed565b50016020015190565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534939092909160208710156132da57fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b600080600483610140015151101561336457506000905080611502565b6133778360000151846101400151610b7e565b6114fd8460000151856101400151611a89565b606063e946c1bb60e01b84848460405160240161320c93929190614b9f565b6000826133b8575060006106aa565b828202828482816133c557fe5b041461182757611827612a4f6001868661338a565b6000816133f0576133f0612a4f6003858561338a565b60008284816133fb57fe5b04949350505050565b8151600090600183015b818110156107af5761344f85828151811061342557fe5b602002602001015186868151811061343957fe5b6020026020010151612f0190919063ffffffff16565b1561345f576001925050506106aa565b60010161340e565b6040805160608101909152806000815260006020820181905260409091015290565b80356106aa81614d89565b80516106aa81614d89565b600082601f8301126134af578081fd5b81356134c26134bd82614d0b565b614ce4565b8181529150602080830190848101818402860182018710156134e357600080fd5b60005b848110156114685781356134f981614d89565b845292820192908201906001016134e6565b600082601f83011261351b578081fd5b81356135296134bd82614d0b565b8181529150602080830190840160005b838110156135665761355187602084358901016136fa565b83526020928301929190910190600101613539565b5050505092915050565b600082601f830112613580578081fd5b815161358e6134bd82614d0b565b8181529150602080830190840160005b83811015613566576135b68760208451890101613748565b8352602092830192919091019060010161359e565b600082601f8301126135db578081fd5b81356135e96134bd82614d0b565b8181529150602080830190840160005b8381101561356657613611876020843589010161379d565b835260209283019291909101906001016135f9565b600082601f830112613636578081fd5b81356136446134bd82614d0b565b81815291506020808301908481018184028601820187101561366557600080fd5b60005b8481101561146857813584529282019290820190600101613668565b600082601f830112613694578081fd5b81516136a26134bd82614d0b565b8181529150602080830190848101818402860182018710156136c357600080fd5b60005b84811015611468578151845292820192908201906001016136c6565b80516001600160e01b0319811681146106aa57600080fd5b600082601f83011261370a578081fd5b81356137186134bd82614d2b565b915080825283602082850101111561372f57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613758578081fd5b81516137666134bd82614d2b565b915080825283602082850101111561377d57600080fd5b61146d816020840160208601614d4f565b8051600581106106aa57600080fd5b60006101c08083850312156137b0578182fd5b6137b981614ce4565b9150506137c68383613489565b81526137d58360208401613489565b60208201526137e78360408401613489565b60408201526137f98360608401613489565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561385b57600080fd5b613867868387016136fa565b8385015261016092508285013591508082111561388357600080fd5b61388f868387016136fa565b838501526101809250828501359150808211156138ab57600080fd5b6138b7868387016136fa565b838501526101a09250828501359150808211156138d357600080fd5b506138e0858286016136fa565b82840152505092915050565b60006101c08083850312156138ff578182fd5b61390881614ce4565b9150506139158383613494565b81526139248360208401613494565b60208201526139368360408401613494565b60408201526139488360608401613494565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156139aa57600080fd5b6139b686838701613748565b838501526101609250828501519150808211156139d257600080fd5b6139de86838701613748565b838501526101809250828501519150808211156139fa57600080fd5b613a0686838701613748565b838501526101a0925082850151915080821115613a2257600080fd5b506138e085828601613748565b600060208284031215613a40578081fd5b813561182781614d89565b60008060408385031215613a5d578081fd5b8235613a6881614d89565b9150602083013567ffffffffffffffff811115613a83578182fd5b613a8f8582860161350b565b9150509250929050565b60008060008060808587031215613aae578182fd5b8435613ab981614d89565b9350602085013567ffffffffffffffff80821115613ad5578384fd5b613ae188838901613626565b94506040870135915080821115613af6578384fd5b613b0288838901613626565b93506060870135915080821115613b17578283fd5b50613b24878288016136fa565b91505092959194509250565b60008060408385031215613b42578182fd5b8235613b4d81614d89565b9150602083013567ffffffffffffffff811115613b68578182fd5b613a8f858286016136fa565b600080600060608486031215613b88578081fd5b8335613b9381614d89565b9250602084013567ffffffffffffffff811115613bae578182fd5b613bba868287016136fa565b925050604084013590509250925092565b60008060408385031215613bdd578182fd5b8235613be881614d89565b946020939093013593505050565b600060208284031215613c07578081fd5b813567ffffffffffffffff811115613c1d578182fd5b6109118482850161349f565b60006020808385031215613c3b578182fd5b825167ffffffffffffffff811115613c51578283fd5b80840185601f820112613c62578384fd5b80519150613c726134bd83614d0b565b8281528381019082850185850284018601891015613c8e578687fd5b8693505b84841015613cb857613ca4898261378e565b835260019390930192918501918501613c92565b50979650505050505050565b600080600060608486031215613cd8578081fd5b833567ffffffffffffffff80821115613cef578283fd5b613cfb878388016135cb565b94506020860135915080821115613d10578283fd5b613d1c8783880161349f565b93506040860135915080821115613d31578283fd5b50613d3e86828701613626565b9150509250925092565b60008060408385031215613d5a578182fd5b823567ffffffffffffffff80821115613d71578384fd5b613d7d868387016135cb565b93506020850135915080821115613d92578283fd5b50613a8f8582860161350b565b60008060408385031215613db1578182fd5b823567ffffffffffffffff80821115613dc8578384fd5b613d7d86838701613626565b600060208284031215613de5578081fd5b81518015158114611827578182fd5b600060208284031215613e05578081fd5b61182783836136e2565b60008060408385031215613e21578182fd5b613e2b84846136e2565b91506020830151613e3b81614d89565b809150509250929050565b60008060008060808587031215613e5b578182fd5b8451613e6681614d9e565b6020860151909450613e7781614d89565b6040860151909350613e8881614d89565b606086015190925067ffffffffffffffff811115613ea4578182fd5b613b2487828801613748565b600080600080600060a08688031215613ec7578283fd5b613ed187876136e2565b94506020860151613ee181614d89565b604087015190945067ffffffffffffffff80821115613efe578485fd5b613f0a89838a01613684565b94506060880151915080821115613f1f578283fd5b613f2b89838a01613684565b93506080880151915080821115613f40578283fd5b50613f4d88828901613748565b9150509295509295909350565b60008060008060808587031215613f6f578182fd5b613f7986866136e2565b93506020850151613f8981614d89565b604086015190935067ffffffffffffffff811115613fa5578283fd5b613fb187828801613748565b606096909601519497939650505050565b600080600060608486031215613fd6578081fd5b613fe085856136e2565b92506020840151613ff081614d89565b80925050604084015190509250925092565b600080600060608486031215614016578081fd5b835161402181614d9e565b602085015190935067ffffffffffffffff8082111561403e578283fd5b61404a87838801613684565b9350604086015191508082111561405f578283fd5b50613d3e86828701613570565b60006020828403121561407d578081fd5b813567ffffffffffffffff811115614093578182fd5b610911848285016136fa565b6000602082840312156140b0578081fd5b815167ffffffffffffffff8111156140c6578182fd5b61091184828501613748565b6000602082840312156140e3578081fd5b815161182781614d89565b6000602082840312156140ff578081fd5b815160058110611827578182fd5b60008060008060808587031215614122578182fd5b845167ffffffffffffffff80821115614139578384fd5b61414588838901613748565b955060209150818701518181111561415b578485fd5b80880189601f82011261416c578586fd5b8051915061417c6134bd83614d0b565b82815284810190828601885b858110156141b15761419f8e8984518801016138ec565b84529287019290870190600101614188565b505060408b01519098509450505050808211156141cc578384fd5b6141d888838901613684565b935060608701519150808211156141ed578283fd5b50613b2487828801613570565b60006060828403121561420b578081fd5b6142156060614ce4565b825160078110614223578283fd5b8152602083810151908201526040928301519281019290925250919050565b600080600060608486031215614256578081fd5b833567ffffffffffffffff81111561426c578182fd5b6142788682870161379d565b935050602084013561428981614d89565b929592945050506040919091013590565b600080604083850312156142ac578182fd5b823567ffffffffffffffff808211156142c3578384fd5b6142cf8683870161379d565b935060208501359150808211156142e4578283fd5b50613a8f858286016136fa565b600080600060608486031215614305578081fd5b833567ffffffffffffffff81111561431b578182fd5b6143278682870161379d565b93505060208401359150604084013561433f81614d89565b809150509250925092565b60008060006060848603121561435e578081fd5b833567ffffffffffffffff80821115614375578283fd5b81860160a08189031215614387578384fd5b61439160a0614ce4565b925080358352602081013560208401526040810135604084015260608101356143b981614d89565b60608401526080810135828111156143cf578485fd5b6143db898284016136fa565b6080850152509194505050602084013591506143fa8560408601613489565b90509250925092565b600060208284031215614414578081fd5b5051919050565b1515815260200190565b6000614431838361453e565b505060600190565b6001600160a01b03169052565b6000815180845260208401935060208301825b828110156144805781516001600160a01b0316865260209586019590910190600101614459565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b848110156144d55782840388526144bf848351614512565b60209889019890945091909101906001016144a7565b50919695505050505050565b6000815180845260208401935060208301825b828110156144805781518652602095860195909101906001016144f4565b6000815180845261452a816020860160208601614d4f565b601f01601f19169290920160200192915050565b80516007811061454a57fe5b825260208181015190830152604090810151910152565b60006101c0614571848451614439565b60208301516145836020860182614439565b5060408301516145966040860182614439565b5060608301516145a96060860182614439565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e085015261010080840151818601525061012080840151818601525061014080840151828287015261460283870182614512565b9150506101609150818401518582038387015261461f8282614512565b92505050610180808401518583038287015261463b8382614512565b9150506101a0915081840151858203838701526146588282614512565b9695505050505050565b60008251614674818460208701614d4f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6000608082016001600160a01b03871683526080602084015280865180835260a08501915060a060208202860101925060208801845b82811015614731577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6087860301845261471c858351614561565b945060209384019391909101906001016146e2565b5050505082810360408401526147478186614446565b838103606085015261475981866144e1565b98975050505050505050565b60006001600160a01b03861682526080602083015261478760808301866144e1565b828103604084015261479981866144e1565b83810360608501526147598186614512565b60006001600160a01b0385168252606060208301526147cd6060830185614512565b9050826040830152949350505050565b60006001600160a01b038087168352608060208401526148006080840187614561565b94166040830152506060015292915050565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561486c57835161485881614d7f565b835260209384019390920191600101614845565b509095945050505050565b6000606082016060835280865161488e81846149cb565b9150602088019250835b818110156148bc576148ab838551614425565b602094909401939250600101614898565b505083810360208501526148d081876144e1565b91505082810360408401528084516148e881846149cb565b9150602086019250835b818110156149165761490583855161441b565b6020949094019392506001016148f2565b5090979650505050505050565b60006020825261182760208301846144e1565b60006040825261494960408301856144e1565b602083820381850152818551808452828401915082838202850101838801865b8381101561499757601f19878403018552614985838351614512565b94860194925090850190600101614969565b50909998505050505050505050565b6000604082526149b960408301856144e1565b82810360208401526118db81856144e1565b90815260200190565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b60006001600160e01b0319861682526001600160a01b038086166020840152808516604084015250608060608301526146586080830184614512565b60006001600160e01b0319871682526001600160a01b038616602083015260a06040830152614a7a60a08301866144e1565b8281036060840152614a8c81866144e1565b8381036080850152614a9e8186614512565b9998505050505050505050565b60006001600160e01b0319861682526001600160a01b038516602083015260806040830152614add6080830185614512565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b60006001600160e01b03198516825260606020830152614b3c60608301856144e1565b8281036040840152614658818561448a565b6000602082526118276020830184614512565b600060808252614b746080830187614512565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6060810160048510614bad57fe5b938152602081019290925260409091015290565b6060810160088510614bad57fe5b60208101614bdc83614d7f565b91905290565b600060808252614bf56080830187614512565b602083820381850152818751808452828401915082838202850101838a01865b83811015614c4357601f19878403018552614c31838351614561565b94860194925090850190600101614c15565b50508681036040880152614c57818a6144e1565b9450505050508281036060840152614c6f818561448a565b979650505050505050565b60a08101614c88828661453e565b8360608301528215156080830152949350505050565b6000602082526118276020830184614561565b600060408252614cc46040830185614561565b82810360208401526118db8185614512565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715614d0357600080fd5b604052919050565b600067ffffffffffffffff821115614d21578081fd5b5060209081020190565b600067ffffffffffffffff821115614d41578081fd5b50601f01601f191660200190565b60005b83811015614d6a578181015183820152602001614d52565b83811115614d79576000848401525b50505050565b6005811061073157fe5b6001600160a01b038116811461073157600080fd5b6001600160e01b03198116811461073157600080fdfea365627a7a72315820d5f953a2f0be372b5155353406d20980ed27dc327f638f1b56f5c24fc55036106c6578706572696d656e74616cf564736f6c63430005100040" } } }, diff --git a/packages/contract-artifacts/artifacts/ERC1155Mintable.json b/packages/contract-artifacts/artifacts/ERC1155Mintable.json index 5793337287..da08fb9cde 100644 --- a/packages/contract-artifacts/artifacts/ERC1155Mintable.json +++ b/packages/contract-artifacts/artifacts/ERC1155Mintable.json @@ -349,10 +349,10 @@ }, "evm": { "bytecode": { - "object": "0x608060405234801561001057600080fd5b50612610806100206000396000f3fe608060405234801561001057600080fd5b50600436106101765760003560e01c80639f4b286a116100d8578063e0a5c9491161008c578063f242432a11610066578063f242432a146107bb578063f94190881461085d578063fc67bf1c146108d457610176565b8063e0a5c94914610726578063e44591f014610763578063e985e9c51461078057610176565b8063adebf6f2116100bd578063adebf6f21461067a578063cc10e40114610697578063cd53d08e1461070957610176565b80639f4b286a146105c8578063a22cb4651461063f57610176565b80636352211e1161012f5780637269a327116101145780637269a327146104c557806378b27221146104e25780639cca1c64146105ab57610176565b80636352211e146104625780636f969c2d146104a857610176565b80632eb2c2d6116101605780632eb2c2d6146101e35780634e1273f41461031f5780635e81b9581461043157610176565b8062fdd58e1461017b57806308d7d469146101c6575b600080fd5b6101b46004803603604081101561019157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356108dc565b60408051918252519081900360200190f35b6101b4600480360360208110156101dc57600080fd5b5035610966565b61031d600480360360a08110156101f957600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169181019060608101604082013564010000000081111561023a57600080fd5b82018360208201111561024c57600080fd5b8035906020019184602083028401116401000000008311171561026e57600080fd5b91939092909160208101903564010000000081111561028c57600080fd5b82018360208201111561029e57600080fd5b803590602001918460208302840111640100000000831117156102c057600080fd5b9193909290916020810190356401000000008111156102de57600080fd5b8201836020820111156102f057600080fd5b8035906020019184600183028401116401000000008311171561031257600080fd5b509092509050610978565b005b6103e16004803603604081101561033557600080fd5b81019060208101813564010000000081111561035057600080fd5b82018360208201111561036257600080fd5b8035906020019184602083028401116401000000008311171561038457600080fd5b9193909290916020810190356401000000008111156103a257600080fd5b8201836020820111156103b457600080fd5b803590602001918460208302840111640100000000831117156103d657600080fd5b5090925090506111a1565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561041d578181015183820152602001610405565b505050509050019250505060405180910390f35b61044e6004803603602081101561044757600080fd5b5035611366565b604080519115158252519081900360200190f35b61047f6004803603602081101561047857600080fd5b50356113ac565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101b4600480360360208110156104be57600080fd5b50356113d4565b61044e600480360360208110156104db57600080fd5b50356113f9565b61031d600480360360608110156104f857600080fd5b8135919081019060408101602082013564010000000081111561051a57600080fd5b82018360208201111561052c57600080fd5b8035906020019184602083028401116401000000008311171561054e57600080fd5b91939092909160208101903564010000000081111561056c57600080fd5b82018360208201111561057e57600080fd5b803590602001918460208302840111640100000000831117156105a057600080fd5b50909250905061143e565b6101b4600480360360208110156105c157600080fd5b5035611775565b61031d600480360360408110156105de57600080fd5b8135919081019060408101602082013564010000000081111561060057600080fd5b82018360208201111561061257600080fd5b8035906020019184600183028401116401000000008311171561063457600080fd5b50909250905061178a565b61031d6004803603604081101561065557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135151561188a565b61044e6004803603602081101561069057600080fd5b5035611923565b6101b4600480360360408110156106ad57600080fd5b8101906020810181356401000000008111156106c857600080fd5b8201836020820111156106da57600080fd5b803590602001918460018302840111640100000000831117156106fc57600080fd5b9193509150351515611949565b61047f6004803603602081101561071f57600080fd5b5035611a82565b61072e611aaa565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b61044e6004803603602081101561077957600080fd5b5035611ace565b61044e6004803603604081101561079657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611af6565b61031d600480360360a08110156107d157600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184600183028401116401000000008311171561085257600080fd5b509092509050611b31565b61031d6004803603604081101561087357600080fd5b8135919081019060408101602082013564010000000081111561089557600080fd5b8201836020820111156108a757600080fd5b803590602001918460208302840111640100000000831117156108c957600080fd5b509092509050612116565b61072e61244c565b60006108e782611366565b1561092e5760008281526020819052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610921576000610924565b60015b60ff169050610960565b50600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b60056020526000908152604090205481565b73ffffffffffffffffffffffffffffffffffffffff87166109fa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f43414e4e4f545f5452414e534645525f544f5f414444524553535f5a45524f00604482015290519081900360640190fd5b848314610a6857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f544f4b454e5f414e445f56414c5545535f4c454e4754485f4d49534d41544348604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8816331480610ac1575073ffffffffffffffffffffffffffffffffffffffff8816600090815260026020908152604080832033845290915290205460ff1615156001145b610b2c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e53554646494349454e545f414c4c4f57414e434500000000000000000000604482015290519081900360640190fd5b60005b85811015610dfa576000878783818110610b4557fe5b9050602002013590506000868684818110610b5c57fe5b905060200201359050610b6e82611ace565b15610cc85780600114610be257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f414d4f554e545f455155414c5f544f5f4f4e455f524551554952454400000000604482015290519081900360640190fd5b60008281526020819052604090205473ffffffffffffffffffffffffffffffffffffffff8c8116911614610c7757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4e46545f4e4f545f4f574e45445f42595f46524f4d5f41444452455353000000604482015290519081900360640190fd5b600082815260208190526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c16179055610df0565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8f168452909152902054610d08908263ffffffff61247016565b6001600084815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610dbf816001600085815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461249490919063ffffffff16565b600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8f1684529091529020555b5050600101610b2f565b508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb898989896040518080602001806020018381038352878782818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018481038352858152602090810191508690860280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039850909650505050505050a4610f2e8773ffffffffffffffffffffffffffffffffffffffff166124b0565b156111975760008773ffffffffffffffffffffffffffffffffffffffff1663bc197c81338b8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018060200184810384528a8a82818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018581038452888152602090810191508990890280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910185810383528681526020019050868680828437600081840152601f19601f8201169050808301925050509b505050505050505050505050602060405180830381600087803b1580156110b757600080fd5b505af11580156110cb573d6000803e3d6000fd5b505050506040513d60208110156110e157600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461119557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4241445f52454345495645525f52455455524e5f56414c554500000000000000604482015290519081900360640190fd5b505b5050505050505050565b60608382146111fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061258b6024913960400191505060405180910390fd5b604080518581526020808702820101909152848015611224578160200160208202803883390190505b50905060005b8481101561135d57600084848381811061124057fe5b90506020020135905061125281611366565b156112c85786868381811061126357fe5b600084815260208181526040909120549102929092013573ffffffffffffffffffffffffffffffffffffffff90811692169190911490506112a55760006112a8565b60015b60ff168383815181106112b757fe5b602002602001018181525050611354565b6000818152600160205260408120908888858181106112e357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483838151811061134757fe5b6020026020010181815250505b5060010161122a565b50949350505050565b60007f80000000000000000000000000000000000000000000000000000000000000008083161480156109605750506fffffffffffffffffffffffffffffffff16151590565b60009081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000001690565b60007f80000000000000000000000000000000000000000000000000000000000000008083161480156109605750506fffffffffffffffffffffffffffffffff161590565b600085815260046020526040902054859073ffffffffffffffffffffffffffffffffffffffff16331461147057600080fd5b61147986611923565b6114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806125af602d913960400191505060405180910390fd5b60005b8481101561176c5760008686838181106114e757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff169050600085858481811061151457fe5b60008c815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8916845282529091205491029290920135925061155f9183915063ffffffff61249416565b60008a815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083528184209490945580518d8152918201859052805133927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6292908290030190a46115eb8273ffffffffffffffffffffffffffffffffffffffff166124b0565b1561176257604080517ff23a6e6100000000000000000000000000000000000000000000000000000000815233600482018190526024820152604481018b90526064810183905260a06084820152600060a48201819052915173ffffffffffffffffffffffffffffffffffffffff85169163f23a6e619160e480830192602092919082900301818787803b15801561168257600080fd5b505af1158015611696573d6000803e3d6000fd5b505050506040513d60208110156116ac57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461176057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4241445f52454345495645525f52455455524e5f56414c554500000000000000604482015290519081900360640190fd5b505b50506001016114d1565b50505050505050565b6fffffffffffffffffffffffffffffffff1690565b600083815260046020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000163390811790915581518781529283018490528151849391927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62928290030190a4801561188557827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b838360405180806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039550909350505050a25b505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b7f8000000000000000000000000000000000000000000000000000000000000000161590565b600380546001019081905560801b8115611980577f8000000000000000000000000000000000000000000000000000000000000000175b600081815260046020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000163390811790915581518581529283018490528151849391927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62928290030190a48215611a7b57807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b858560405180806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039550909350505050a25b9392505050565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b7ff23a6e610000000000000000000000000000000000000000000000000000000081565b7f80000000000000000000000000000000000000000000000000000000000000009081161490565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff8516611bb357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f43414e4e4f545f5452414e534645525f544f5f414444524553535f5a45524f00604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8616331480611c0c575073ffffffffffffffffffffffffffffffffffffffff8616600090815260026020908152604080832033845290915290205460ff1615156001145b611c7757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e53554646494349454e545f414c4c4f57414e434500000000000000000000604482015290519081900360640190fd5b611c8084611ace565b15611dda5782600114611cf457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f414d4f554e545f455155414c5f544f5f4f4e455f524551554952454400000000604482015290519081900360640190fd5b60008481526020819052604090205473ffffffffffffffffffffffffffffffffffffffff878116911614611d8957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4e46545f4e4f545f4f574e45445f42595f46524f4d5f41444452455353000000604482015290519081900360640190fd5b600084815260208190526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716179055611e8f565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a168452909152902054611e1a908463ffffffff61247016565b600085815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b81168552925280832093909355871681522054611e5e9084612494565b600085815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a1684529091529020555b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4611f328573ffffffffffffffffffffffffffffffffffffffff166124b0565b1561210e5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e613389888888886040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050975050505050505050602060405180830381600087803b15801561203057600080fd5b505af1158015612044573d6000803e3d6000fd5b505050506040513d602081101561205a57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461176c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4241445f52454345495645525f52455455524e5f56414c554500000000000000604482015290519081900360640190fd5b505050505050565b600083815260046020526040902054839073ffffffffffffffffffffffffffffffffffffffff16331461214857600080fd5b61215184611ace565b6121a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061255e602d913960400191505060405180910390fd5b600084815260056020526040812054600101905b838110156124125760008585838181106121d057fe5b8486018a176000818152602081815260408083208054958302979097013573ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000009095168517909655855183815260019181019190915285519396509194869450909233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6292908290030190a46122918273ffffffffffffffffffffffffffffffffffffffff166124b0565b1561240857604080517ff23a6e6100000000000000000000000000000000000000000000000000000000815233600482018190526024820152604481018390526001606482015260a06084820152600060a48201819052915173ffffffffffffffffffffffffffffffffffffffff85169163f23a6e619160e480830192602092919082900301818787803b15801561232857600080fd5b505af115801561233c573d6000803e3d6000fd5b505050506040513d602081101561235257600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461240657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4241445f52454345495645525f52455455524e5f56414c554500000000000000604482015290519081900360640190fd5b505b50506001016121ba565b5060008581526005602052604090205461243390849063ffffffff61249416565b6000958652600560205260409095209490945550505050565b7fbc197c810000000000000000000000000000000000000000000000000000000081565b60008282111561248e5761248e612489600285856124b6565b612555565b50900390565b600082820183811015611a7b57611a7b612489600086866124b6565b3b151590565b606063e946c1bb60e01b848484604051602401808460038111156124d657fe5b60ff1681526020018381526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090509392505050565b805160208201fdfe54524945445f544f5f4d494e545f4e4f4e5f46554e4749424c455f464f525f46554e4749424c455f544f4b454e4f574e4552535f414e445f4944535f4d5553545f484156455f53414d455f4c454e47544854524945445f544f5f4d494e545f46554e4749424c455f464f525f4e4f4e5f46554e4749424c455f544f4b454ea265627a7a72315820d264d7e8e50717ab727f8f6967d7f8c458d505b1de265584755ff1ebf2464a8264736f6c63430005100032" + "object": "0x608060405234801561001057600080fd5b50612448806100206000396000f3fe608060405234801561001057600080fd5b50600436106101765760003560e01c80639f4b286a116100d8578063e0a5c9491161008c578063f242432a11610066578063f242432a14610312578063f941908814610325578063fc67bf1c1461033857610176565b8063e0a5c949146102d7578063e44591f0146102ec578063e985e9c5146102ff57610176565b8063adebf6f2116100bd578063adebf6f21461029e578063cc10e401146102b1578063cd53d08e146102c457610176565b80639f4b286a14610278578063a22cb4651461028b57610176565b80636352211e1161012f5780637269a327116101145780637269a3271461023f57806378b27221146102525780639cca1c641461026557610176565b80636352211e1461020c5780636f969c2d1461022c57610176565b80632eb2c2d6116101605780632eb2c2d6146101b75780634e1273f4146101cc5780635e81b958146101ec57610176565b8062fdd58e1461017b57806308d7d469146101a4575b600080fd5b61018e610189366004611c80565b610340565b60405161019b91906123c9565b60405180910390f35b61018e6101b2366004611dac565b6103ca565b6101ca6101c5366004611b12565b6103dc565b005b6101df6101da366004611caa565b610943565b60405161019b91906120b1565b6101ff6101fa366004611dac565b610ae9565b60405161019b91906120f4565b61021f61021a366004611dac565b610b2f565b60405161019b9190611f57565b61018e61023a366004611dac565b610b57565b6101ff61024d366004611dac565b610b7c565b6101ca610260366004611e0e565b610bc1565b61018e610273366004611dac565b610e8d565b6101ca610286366004611e85565b610ea2565b6101ca610299366004611c45565b610f5e565b6101ff6102ac366004611dac565b610ff8565b61018e6102bf366004611d53565b61101e565b61021f6102d2366004611dac565b611113565b6102df61113b565b60405161019b91906120ff565b6101ff6102fa366004611dac565b61115f565b6101ff61030d366004611ade565b611187565b6101ca610320366004611bcb565b6111c2565b6101ca610333366004611dc4565b611624565b6102df6118ff565b600061034b82610ae9565b156103925760008281526020819052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610385576000610388565b60015b60ff1690506103c4565b50600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b60056020526000908152604090205481565b73ffffffffffffffffffffffffffffffffffffffff8716610432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104299061216a565b60405180910390fd5b84831461046b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610429906121a1565b73ffffffffffffffffffffffffffffffffffffffff88163314806104c4575073ffffffffffffffffffffffffffffffffffffffff8816600090815260026020908152604080832033845290915290205460ff1615156001145b6104fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104299061220d565b60005b8581101561075e57600087878381811061051357fe5b905060200201359050600086868481811061052a57fe5b90506020020135905061053c8261115f565b1561062c578060011461057b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990612244565b60008281526020819052604090205473ffffffffffffffffffffffffffffffffffffffff8c81169116146105db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610429906121d6565b600082815260208190526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c16179055610754565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8f16845290915290205461066c908263ffffffff61192316565b6001600084815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610723816001600085815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194790919063ffffffff16565b600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8f1684529091529020555b50506001016104fd565b508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb898989896040516107d9949392919061207f565b60405180910390a46108008773ffffffffffffffffffffffffffffffffffffffff16611963565b15610939576040517fbc197c8100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff89169063bc197c81906108689033908d908c908c908c908c908c908c90600401611fbd565b602060405180830381600087803b15801561088257600080fd5b505af1158015610896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108ba9190810190611d13565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990612392565b505b5050505050505050565b606083821461097e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610429906122d8565b6040805185815260208087028201019091528480156109a7578160200160208202803883390190505b50905060005b84811015610ae05760008484838181106109c357fe5b9050602002013590506109d581610ae9565b15610a53578686838181106109e657fe5b90506020020160206109fb9190810190611ac3565b60008281526020819052604090205473ffffffffffffffffffffffffffffffffffffffff908116911614610a30576000610a33565b60015b60ff16838381518110610a4257fe5b602002602001018181525050610ad7565b600081815260016020526040812090888885818110610a6e57fe5b9050602002016020610a839190810190611ac3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054838381518110610aca57fe5b6020026020010181815250505b506001016109ad565b50949350505050565b60007f80000000000000000000000000000000000000000000000000000000000000008083161480156103c45750506fffffffffffffffffffffffffffffffff16151590565b60009081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000001690565b60007f80000000000000000000000000000000000000000000000000000000000000008083161480156103c45750506fffffffffffffffffffffffffffffffff161590565b600085815260046020526040902054859073ffffffffffffffffffffffffffffffffffffffff163314610bf357600080fd5b610bfc86610ff8565b610c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990612335565b60005b84811015610e84576000868683818110610c4b57fe5b9050602002016020610c609190810190611ac3565b90506000858584818110610c7057fe5b60008c815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452825290912054910292909201359250610cbb9183915063ffffffff61194716565b60008a815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832093909355915133907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6290610d22908e9087906123d2565b60405180910390a4610d498273ffffffffffffffffffffffffffffffffffffffff16611963565b15610e7a576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff84169063f23a6e6190610da990339081908f908890600401611f78565b602060405180830381600087803b158015610dc357600080fd5b505af1158015610dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dfb9190810190611d13565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610e78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990612392565b505b5050600101610c35565b50505050505050565b6fffffffffffffffffffffffffffffffff1690565b60008381526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000163390811790915590518291907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6290610f1090889085906123d2565b60405180910390a48015610f5957827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b8383604051610f5092919061214e565b60405180910390a25b505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff871680855292529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610fec9085906120f4565b60405180910390a35050565b7f8000000000000000000000000000000000000000000000000000000000000000161590565b600380546001019081905560801b8115611055577f8000000000000000000000000000000000000000000000000000000000000000175b60008181526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000163390811790915590518291907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906110c390869085906123d2565b60405180910390a4821561110c57807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b858560405161110392919061214e565b60405180910390a25b9392505050565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b7ff23a6e610000000000000000000000000000000000000000000000000000000081565b7f80000000000000000000000000000000000000000000000000000000000000009081161490565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff851661120f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104299061216a565b73ffffffffffffffffffffffffffffffffffffffff8616331480611268575073ffffffffffffffffffffffffffffffffffffffff8616600090815260026020908152604080832033845290915290205460ff1615156001145b61129e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104299061220d565b6112a78461115f565b1561139757826001146112e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990612244565b60008481526020819052604090205473ffffffffffffffffffffffffffffffffffffffff878116911614611346576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610429906121d6565b600084815260208190526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617905561144c565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a1684529091529020546113d7908463ffffffff61192316565b600085815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b8116855292528083209390935587168152205461141b9084611947565b600085815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a1684529091529020555b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516114c29291906123d2565b60405180910390a46114e98573ffffffffffffffffffffffffffffffffffffffff16611963565b1561161c576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff87169063f23a6e619061154d9033908b908a908a908a908a9060040161202d565b602060405180830381600087803b15801561156757600080fd5b505af115801561157b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061159f9190810190611d13565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610e84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990612392565b505050505050565b600083815260046020526040902054839073ffffffffffffffffffffffffffffffffffffffff16331461165657600080fd5b61165f8461115f565b611695576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104299061227b565b600084815260056020526040812054600101905b838110156118c55760008585838181106116bf57fe5b90506020020160206116d49190810190611ac3565b828401881760008181526020819052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86169081179091559051939450919233907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906117629086906001906123d2565b60405180910390a46117898273ffffffffffffffffffffffffffffffffffffffff16611963565b156118bb576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff84169063f23a6e61906117ea90339081908790600190600401611f78565b602060405180830381600087803b15801561180457600080fd5b505af1158015611818573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061183c9190810190611d13565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146118b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990612392565b505b50506001016116a9565b506000858152600560205260409020546118e690849063ffffffff61194716565b6000958652600560205260409095209490945550505050565b7fbc197c810000000000000000000000000000000000000000000000000000000081565b6000828211156119415761194161193c60028585611969565b611a0e565b50900390565b60008282018381101561110c5761110c61193c60008686611969565b3b151590565b606063e946c1bb60e01b8484846040516024016119889392919061212c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146103c457600080fd5b60008083601f840112611a4b578182fd5b50813567ffffffffffffffff811115611a62578182fd5b6020830191508360208083028501011115611a7c57600080fd5b9250929050565b60008083601f840112611a94578182fd5b50813567ffffffffffffffff811115611aab578182fd5b602083019150836020828501011115611a7c57600080fd5b600060208284031215611ad4578081fd5b61110c8383611a16565b60008060408385031215611af0578081fd5b611afa8484611a16565b9150611b098460208501611a16565b90509250929050565b60008060008060008060008060a0898b031215611b2d578384fd5b611b378a8a611a16565b9750611b468a60208b01611a16565b9650604089013567ffffffffffffffff80821115611b62578586fd5b611b6e8c838d01611a3a565b909850965060608b0135915080821115611b86578586fd5b611b928c838d01611a3a565b909650945060808b0135915080821115611baa578384fd5b50611bb78b828c01611a83565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611be3578182fd5b8635611bee816123e0565b95506020870135611bfe816123e0565b94506040870135935060608701359250608087013567ffffffffffffffff811115611c27578283fd5b611c3389828a01611a83565b979a9699509497509295939492505050565b60008060408385031215611c57578182fd5b611c618484611a16565b915060208301358015158114611c75578182fd5b809150509250929050565b60008060408385031215611c92578182fd5b611c9c8484611a16565b946020939093013593505050565b60008060008060408587031215611cbf578384fd5b843567ffffffffffffffff80821115611cd6578586fd5b611ce288838901611a3a565b90965094506020870135915080821115611cfa578384fd5b50611d0787828801611a3a565b95989497509550505050565b600060208284031215611d24578081fd5b81517fffffffff000000000000000000000000000000000000000000000000000000008116811461110c578182fd5b600080600060408486031215611d67578283fd5b833567ffffffffffffffff811115611d7d578384fd5b611d8986828701611a83565b90945092505060208401358015158114611da1578182fd5b809150509250925092565b600060208284031215611dbd578081fd5b5035919050565b600080600060408486031215611dd8578283fd5b83359250602084013567ffffffffffffffff811115611df5578283fd5b611e0186828701611a3a565b9497909650939450505050565b600080600080600060608688031215611e25578081fd5b85359450602086013567ffffffffffffffff80821115611e43578283fd5b611e4f89838a01611a3a565b90965094506040880135915080821115611e67578283fd5b50611e7488828901611a3a565b969995985093965092949392505050565b600080600060408486031215611e99578081fd5b83359250602084013567ffffffffffffffff811115611eb6578182fd5b611e0186828701611a83565b60008284527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611ef3578081fd5b6020830280836020870137939093016020019283525090919050565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b600073ffffffffffffffffffffffffffffffffffffffff808b168352808a1660208401525060a06040830152611ff760a08301888a611ec2565b828103606084015261200a818789611ec2565b838103608085015261201d818688611f0f565b9c9b505050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015284606083015260a0608083015261207360a083018486611f0f565b98975050505050505050565b600060408252612093604083018688611ec2565b82810360208401526120a6818587611ec2565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156120e95783518352602093840193909201916001016120cb565b509095945050505050565b901515815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b606081016004851061213a57fe5b938152602081019290925260409091015290565b600060208252612162602083018486611f0f565b949350505050565b6020808252601f908201527f43414e4e4f545f5452414e534645525f544f5f414444524553535f5a45524f00604082015260600190565b6020808252818101527f544f4b454e5f414e445f56414c5545535f4c454e4754485f4d49534d41544348604082015260600190565b6020808252601d908201527f4e46545f4e4f545f4f574e45445f42595f46524f4d5f41444452455353000000604082015260600190565b60208082526016908201527f494e53554646494349454e545f414c4c4f57414e434500000000000000000000604082015260600190565b6020808252601c908201527f414d4f554e545f455155414c5f544f5f4f4e455f524551554952454400000000604082015260600190565b6020808252602d908201527f54524945445f544f5f4d494e545f4e4f4e5f46554e4749424c455f464f525f4660408201527f554e4749424c455f544f4b454e00000000000000000000000000000000000000606082015260800190565b60208082526024908201527f4f574e4552535f414e445f4944535f4d5553545f484156455f53414d455f4c4560408201527f4e47544800000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f54524945445f544f5f4d494e545f46554e4749424c455f464f525f4e4f4e5f4660408201527f554e4749424c455f544f4b454e00000000000000000000000000000000000000606082015260800190565b60208082526019908201527f4241445f52454345495645525f52455455524e5f56414c554500000000000000604082015260600190565b90815260200190565b918252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff8116811461240257600080fd5b5056fea365627a7a7231582066e9e02679a1339247a560b2455f640fc604f18add8b680d9fbe0bb5f4302a6d6c6578706572696d656e74616cf564736f6c63430005100040" }, "deployedBytecode": { - "object": "0x608060405234801561001057600080fd5b50600436106101765760003560e01c80639f4b286a116100d8578063e0a5c9491161008c578063f242432a11610066578063f242432a146107bb578063f94190881461085d578063fc67bf1c146108d457610176565b8063e0a5c94914610726578063e44591f014610763578063e985e9c51461078057610176565b8063adebf6f2116100bd578063adebf6f21461067a578063cc10e40114610697578063cd53d08e1461070957610176565b80639f4b286a146105c8578063a22cb4651461063f57610176565b80636352211e1161012f5780637269a327116101145780637269a327146104c557806378b27221146104e25780639cca1c64146105ab57610176565b80636352211e146104625780636f969c2d146104a857610176565b80632eb2c2d6116101605780632eb2c2d6146101e35780634e1273f41461031f5780635e81b9581461043157610176565b8062fdd58e1461017b57806308d7d469146101c6575b600080fd5b6101b46004803603604081101561019157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356108dc565b60408051918252519081900360200190f35b6101b4600480360360208110156101dc57600080fd5b5035610966565b61031d600480360360a08110156101f957600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169181019060608101604082013564010000000081111561023a57600080fd5b82018360208201111561024c57600080fd5b8035906020019184602083028401116401000000008311171561026e57600080fd5b91939092909160208101903564010000000081111561028c57600080fd5b82018360208201111561029e57600080fd5b803590602001918460208302840111640100000000831117156102c057600080fd5b9193909290916020810190356401000000008111156102de57600080fd5b8201836020820111156102f057600080fd5b8035906020019184600183028401116401000000008311171561031257600080fd5b509092509050610978565b005b6103e16004803603604081101561033557600080fd5b81019060208101813564010000000081111561035057600080fd5b82018360208201111561036257600080fd5b8035906020019184602083028401116401000000008311171561038457600080fd5b9193909290916020810190356401000000008111156103a257600080fd5b8201836020820111156103b457600080fd5b803590602001918460208302840111640100000000831117156103d657600080fd5b5090925090506111a1565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561041d578181015183820152602001610405565b505050509050019250505060405180910390f35b61044e6004803603602081101561044757600080fd5b5035611366565b604080519115158252519081900360200190f35b61047f6004803603602081101561047857600080fd5b50356113ac565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101b4600480360360208110156104be57600080fd5b50356113d4565b61044e600480360360208110156104db57600080fd5b50356113f9565b61031d600480360360608110156104f857600080fd5b8135919081019060408101602082013564010000000081111561051a57600080fd5b82018360208201111561052c57600080fd5b8035906020019184602083028401116401000000008311171561054e57600080fd5b91939092909160208101903564010000000081111561056c57600080fd5b82018360208201111561057e57600080fd5b803590602001918460208302840111640100000000831117156105a057600080fd5b50909250905061143e565b6101b4600480360360208110156105c157600080fd5b5035611775565b61031d600480360360408110156105de57600080fd5b8135919081019060408101602082013564010000000081111561060057600080fd5b82018360208201111561061257600080fd5b8035906020019184600183028401116401000000008311171561063457600080fd5b50909250905061178a565b61031d6004803603604081101561065557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135151561188a565b61044e6004803603602081101561069057600080fd5b5035611923565b6101b4600480360360408110156106ad57600080fd5b8101906020810181356401000000008111156106c857600080fd5b8201836020820111156106da57600080fd5b803590602001918460018302840111640100000000831117156106fc57600080fd5b9193509150351515611949565b61047f6004803603602081101561071f57600080fd5b5035611a82565b61072e611aaa565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b61044e6004803603602081101561077957600080fd5b5035611ace565b61044e6004803603604081101561079657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611af6565b61031d600480360360a08110156107d157600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184600183028401116401000000008311171561085257600080fd5b509092509050611b31565b61031d6004803603604081101561087357600080fd5b8135919081019060408101602082013564010000000081111561089557600080fd5b8201836020820111156108a757600080fd5b803590602001918460208302840111640100000000831117156108c957600080fd5b509092509050612116565b61072e61244c565b60006108e782611366565b1561092e5760008281526020819052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610921576000610924565b60015b60ff169050610960565b50600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b60056020526000908152604090205481565b73ffffffffffffffffffffffffffffffffffffffff87166109fa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f43414e4e4f545f5452414e534645525f544f5f414444524553535f5a45524f00604482015290519081900360640190fd5b848314610a6857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f544f4b454e5f414e445f56414c5545535f4c454e4754485f4d49534d41544348604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8816331480610ac1575073ffffffffffffffffffffffffffffffffffffffff8816600090815260026020908152604080832033845290915290205460ff1615156001145b610b2c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e53554646494349454e545f414c4c4f57414e434500000000000000000000604482015290519081900360640190fd5b60005b85811015610dfa576000878783818110610b4557fe5b9050602002013590506000868684818110610b5c57fe5b905060200201359050610b6e82611ace565b15610cc85780600114610be257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f414d4f554e545f455155414c5f544f5f4f4e455f524551554952454400000000604482015290519081900360640190fd5b60008281526020819052604090205473ffffffffffffffffffffffffffffffffffffffff8c8116911614610c7757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4e46545f4e4f545f4f574e45445f42595f46524f4d5f41444452455353000000604482015290519081900360640190fd5b600082815260208190526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c16179055610df0565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8f168452909152902054610d08908263ffffffff61247016565b6001600084815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610dbf816001600085815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461249490919063ffffffff16565b600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8f1684529091529020555b5050600101610b2f565b508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb898989896040518080602001806020018381038352878782818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018481038352858152602090810191508690860280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039850909650505050505050a4610f2e8773ffffffffffffffffffffffffffffffffffffffff166124b0565b156111975760008773ffffffffffffffffffffffffffffffffffffffff1663bc197c81338b8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018060200184810384528a8a82818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018581038452888152602090810191508990890280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910185810383528681526020019050868680828437600081840152601f19601f8201169050808301925050509b505050505050505050505050602060405180830381600087803b1580156110b757600080fd5b505af11580156110cb573d6000803e3d6000fd5b505050506040513d60208110156110e157600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461119557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4241445f52454345495645525f52455455524e5f56414c554500000000000000604482015290519081900360640190fd5b505b5050505050505050565b60608382146111fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061258b6024913960400191505060405180910390fd5b604080518581526020808702820101909152848015611224578160200160208202803883390190505b50905060005b8481101561135d57600084848381811061124057fe5b90506020020135905061125281611366565b156112c85786868381811061126357fe5b600084815260208181526040909120549102929092013573ffffffffffffffffffffffffffffffffffffffff90811692169190911490506112a55760006112a8565b60015b60ff168383815181106112b757fe5b602002602001018181525050611354565b6000818152600160205260408120908888858181106112e357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483838151811061134757fe5b6020026020010181815250505b5060010161122a565b50949350505050565b60007f80000000000000000000000000000000000000000000000000000000000000008083161480156109605750506fffffffffffffffffffffffffffffffff16151590565b60009081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000001690565b60007f80000000000000000000000000000000000000000000000000000000000000008083161480156109605750506fffffffffffffffffffffffffffffffff161590565b600085815260046020526040902054859073ffffffffffffffffffffffffffffffffffffffff16331461147057600080fd5b61147986611923565b6114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806125af602d913960400191505060405180910390fd5b60005b8481101561176c5760008686838181106114e757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff169050600085858481811061151457fe5b60008c815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8916845282529091205491029290920135925061155f9183915063ffffffff61249416565b60008a815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083528184209490945580518d8152918201859052805133927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6292908290030190a46115eb8273ffffffffffffffffffffffffffffffffffffffff166124b0565b1561176257604080517ff23a6e6100000000000000000000000000000000000000000000000000000000815233600482018190526024820152604481018b90526064810183905260a06084820152600060a48201819052915173ffffffffffffffffffffffffffffffffffffffff85169163f23a6e619160e480830192602092919082900301818787803b15801561168257600080fd5b505af1158015611696573d6000803e3d6000fd5b505050506040513d60208110156116ac57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461176057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4241445f52454345495645525f52455455524e5f56414c554500000000000000604482015290519081900360640190fd5b505b50506001016114d1565b50505050505050565b6fffffffffffffffffffffffffffffffff1690565b600083815260046020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000163390811790915581518781529283018490528151849391927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62928290030190a4801561188557827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b838360405180806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039550909350505050a25b505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b7f8000000000000000000000000000000000000000000000000000000000000000161590565b600380546001019081905560801b8115611980577f8000000000000000000000000000000000000000000000000000000000000000175b600081815260046020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000163390811790915581518581529283018490528151849391927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62928290030190a48215611a7b57807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b858560405180806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039550909350505050a25b9392505050565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b7ff23a6e610000000000000000000000000000000000000000000000000000000081565b7f80000000000000000000000000000000000000000000000000000000000000009081161490565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff8516611bb357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f43414e4e4f545f5452414e534645525f544f5f414444524553535f5a45524f00604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8616331480611c0c575073ffffffffffffffffffffffffffffffffffffffff8616600090815260026020908152604080832033845290915290205460ff1615156001145b611c7757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e53554646494349454e545f414c4c4f57414e434500000000000000000000604482015290519081900360640190fd5b611c8084611ace565b15611dda5782600114611cf457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f414d4f554e545f455155414c5f544f5f4f4e455f524551554952454400000000604482015290519081900360640190fd5b60008481526020819052604090205473ffffffffffffffffffffffffffffffffffffffff878116911614611d8957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4e46545f4e4f545f4f574e45445f42595f46524f4d5f41444452455353000000604482015290519081900360640190fd5b600084815260208190526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716179055611e8f565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a168452909152902054611e1a908463ffffffff61247016565b600085815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b81168552925280832093909355871681522054611e5e9084612494565b600085815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a1684529091529020555b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4611f328573ffffffffffffffffffffffffffffffffffffffff166124b0565b1561210e5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e613389888888886040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050975050505050505050602060405180830381600087803b15801561203057600080fd5b505af1158015612044573d6000803e3d6000fd5b505050506040513d602081101561205a57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461176c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4241445f52454345495645525f52455455524e5f56414c554500000000000000604482015290519081900360640190fd5b505050505050565b600083815260046020526040902054839073ffffffffffffffffffffffffffffffffffffffff16331461214857600080fd5b61215184611ace565b6121a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061255e602d913960400191505060405180910390fd5b600084815260056020526040812054600101905b838110156124125760008585838181106121d057fe5b8486018a176000818152602081815260408083208054958302979097013573ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000009095168517909655855183815260019181019190915285519396509194869450909233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6292908290030190a46122918273ffffffffffffffffffffffffffffffffffffffff166124b0565b1561240857604080517ff23a6e6100000000000000000000000000000000000000000000000000000000815233600482018190526024820152604481018390526001606482015260a06084820152600060a48201819052915173ffffffffffffffffffffffffffffffffffffffff85169163f23a6e619160e480830192602092919082900301818787803b15801561232857600080fd5b505af115801561233c573d6000803e3d6000fd5b505050506040513d602081101561235257600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461240657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4241445f52454345495645525f52455455524e5f56414c554500000000000000604482015290519081900360640190fd5b505b50506001016121ba565b5060008581526005602052604090205461243390849063ffffffff61249416565b6000958652600560205260409095209490945550505050565b7fbc197c810000000000000000000000000000000000000000000000000000000081565b60008282111561248e5761248e612489600285856124b6565b612555565b50900390565b600082820183811015611a7b57611a7b612489600086866124b6565b3b151590565b606063e946c1bb60e01b848484604051602401808460038111156124d657fe5b60ff1681526020018381526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090509392505050565b805160208201fdfe54524945445f544f5f4d494e545f4e4f4e5f46554e4749424c455f464f525f46554e4749424c455f544f4b454e4f574e4552535f414e445f4944535f4d5553545f484156455f53414d455f4c454e47544854524945445f544f5f4d494e545f46554e4749424c455f464f525f4e4f4e5f46554e4749424c455f544f4b454ea265627a7a72315820d264d7e8e50717ab727f8f6967d7f8c458d505b1de265584755ff1ebf2464a8264736f6c63430005100032" + "object": "0x608060405234801561001057600080fd5b50600436106101765760003560e01c80639f4b286a116100d8578063e0a5c9491161008c578063f242432a11610066578063f242432a14610312578063f941908814610325578063fc67bf1c1461033857610176565b8063e0a5c949146102d7578063e44591f0146102ec578063e985e9c5146102ff57610176565b8063adebf6f2116100bd578063adebf6f21461029e578063cc10e401146102b1578063cd53d08e146102c457610176565b80639f4b286a14610278578063a22cb4651461028b57610176565b80636352211e1161012f5780637269a327116101145780637269a3271461023f57806378b27221146102525780639cca1c641461026557610176565b80636352211e1461020c5780636f969c2d1461022c57610176565b80632eb2c2d6116101605780632eb2c2d6146101b75780634e1273f4146101cc5780635e81b958146101ec57610176565b8062fdd58e1461017b57806308d7d469146101a4575b600080fd5b61018e610189366004611c80565b610340565b60405161019b91906123c9565b60405180910390f35b61018e6101b2366004611dac565b6103ca565b6101ca6101c5366004611b12565b6103dc565b005b6101df6101da366004611caa565b610943565b60405161019b91906120b1565b6101ff6101fa366004611dac565b610ae9565b60405161019b91906120f4565b61021f61021a366004611dac565b610b2f565b60405161019b9190611f57565b61018e61023a366004611dac565b610b57565b6101ff61024d366004611dac565b610b7c565b6101ca610260366004611e0e565b610bc1565b61018e610273366004611dac565b610e8d565b6101ca610286366004611e85565b610ea2565b6101ca610299366004611c45565b610f5e565b6101ff6102ac366004611dac565b610ff8565b61018e6102bf366004611d53565b61101e565b61021f6102d2366004611dac565b611113565b6102df61113b565b60405161019b91906120ff565b6101ff6102fa366004611dac565b61115f565b6101ff61030d366004611ade565b611187565b6101ca610320366004611bcb565b6111c2565b6101ca610333366004611dc4565b611624565b6102df6118ff565b600061034b82610ae9565b156103925760008281526020819052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610385576000610388565b60015b60ff1690506103c4565b50600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b60056020526000908152604090205481565b73ffffffffffffffffffffffffffffffffffffffff8716610432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104299061216a565b60405180910390fd5b84831461046b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610429906121a1565b73ffffffffffffffffffffffffffffffffffffffff88163314806104c4575073ffffffffffffffffffffffffffffffffffffffff8816600090815260026020908152604080832033845290915290205460ff1615156001145b6104fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104299061220d565b60005b8581101561075e57600087878381811061051357fe5b905060200201359050600086868481811061052a57fe5b90506020020135905061053c8261115f565b1561062c578060011461057b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990612244565b60008281526020819052604090205473ffffffffffffffffffffffffffffffffffffffff8c81169116146105db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610429906121d6565b600082815260208190526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c16179055610754565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8f16845290915290205461066c908263ffffffff61192316565b6001600084815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610723816001600085815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194790919063ffffffff16565b600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8f1684529091529020555b50506001016104fd565b508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb898989896040516107d9949392919061207f565b60405180910390a46108008773ffffffffffffffffffffffffffffffffffffffff16611963565b15610939576040517fbc197c8100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff89169063bc197c81906108689033908d908c908c908c908c908c908c90600401611fbd565b602060405180830381600087803b15801561088257600080fd5b505af1158015610896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108ba9190810190611d13565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990612392565b505b5050505050505050565b606083821461097e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610429906122d8565b6040805185815260208087028201019091528480156109a7578160200160208202803883390190505b50905060005b84811015610ae05760008484838181106109c357fe5b9050602002013590506109d581610ae9565b15610a53578686838181106109e657fe5b90506020020160206109fb9190810190611ac3565b60008281526020819052604090205473ffffffffffffffffffffffffffffffffffffffff908116911614610a30576000610a33565b60015b60ff16838381518110610a4257fe5b602002602001018181525050610ad7565b600081815260016020526040812090888885818110610a6e57fe5b9050602002016020610a839190810190611ac3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054838381518110610aca57fe5b6020026020010181815250505b506001016109ad565b50949350505050565b60007f80000000000000000000000000000000000000000000000000000000000000008083161480156103c45750506fffffffffffffffffffffffffffffffff16151590565b60009081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000001690565b60007f80000000000000000000000000000000000000000000000000000000000000008083161480156103c45750506fffffffffffffffffffffffffffffffff161590565b600085815260046020526040902054859073ffffffffffffffffffffffffffffffffffffffff163314610bf357600080fd5b610bfc86610ff8565b610c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990612335565b60005b84811015610e84576000868683818110610c4b57fe5b9050602002016020610c609190810190611ac3565b90506000858584818110610c7057fe5b60008c815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452825290912054910292909201359250610cbb9183915063ffffffff61194716565b60008a815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832093909355915133907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6290610d22908e9087906123d2565b60405180910390a4610d498273ffffffffffffffffffffffffffffffffffffffff16611963565b15610e7a576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff84169063f23a6e6190610da990339081908f908890600401611f78565b602060405180830381600087803b158015610dc357600080fd5b505af1158015610dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dfb9190810190611d13565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610e78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990612392565b505b5050600101610c35565b50505050505050565b6fffffffffffffffffffffffffffffffff1690565b60008381526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000163390811790915590518291907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6290610f1090889085906123d2565b60405180910390a48015610f5957827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b8383604051610f5092919061214e565b60405180910390a25b505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff871680855292529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610fec9085906120f4565b60405180910390a35050565b7f8000000000000000000000000000000000000000000000000000000000000000161590565b600380546001019081905560801b8115611055577f8000000000000000000000000000000000000000000000000000000000000000175b60008181526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000163390811790915590518291907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906110c390869085906123d2565b60405180910390a4821561110c57807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b858560405161110392919061214e565b60405180910390a25b9392505050565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b7ff23a6e610000000000000000000000000000000000000000000000000000000081565b7f80000000000000000000000000000000000000000000000000000000000000009081161490565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff851661120f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104299061216a565b73ffffffffffffffffffffffffffffffffffffffff8616331480611268575073ffffffffffffffffffffffffffffffffffffffff8616600090815260026020908152604080832033845290915290205460ff1615156001145b61129e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104299061220d565b6112a78461115f565b1561139757826001146112e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990612244565b60008481526020819052604090205473ffffffffffffffffffffffffffffffffffffffff878116911614611346576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610429906121d6565b600084815260208190526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617905561144c565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a1684529091529020546113d7908463ffffffff61192316565b600085815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b8116855292528083209390935587168152205461141b9084611947565b600085815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a1684529091529020555b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516114c29291906123d2565b60405180910390a46114e98573ffffffffffffffffffffffffffffffffffffffff16611963565b1561161c576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff87169063f23a6e619061154d9033908b908a908a908a908a9060040161202d565b602060405180830381600087803b15801561156757600080fd5b505af115801561157b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061159f9190810190611d13565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610e84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990612392565b505050505050565b600083815260046020526040902054839073ffffffffffffffffffffffffffffffffffffffff16331461165657600080fd5b61165f8461115f565b611695576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104299061227b565b600084815260056020526040812054600101905b838110156118c55760008585838181106116bf57fe5b90506020020160206116d49190810190611ac3565b828401881760008181526020819052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86169081179091559051939450919233907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906117629086906001906123d2565b60405180910390a46117898273ffffffffffffffffffffffffffffffffffffffff16611963565b156118bb576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff84169063f23a6e61906117ea90339081908790600190600401611f78565b602060405180830381600087803b15801561180457600080fd5b505af1158015611818573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061183c9190810190611d13565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146118b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990612392565b505b50506001016116a9565b506000858152600560205260409020546118e690849063ffffffff61194716565b6000958652600560205260409095209490945550505050565b7fbc197c810000000000000000000000000000000000000000000000000000000081565b6000828211156119415761194161193c60028585611969565b611a0e565b50900390565b60008282018381101561110c5761110c61193c60008686611969565b3b151590565b606063e946c1bb60e01b8484846040516024016119889392919061212c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146103c457600080fd5b60008083601f840112611a4b578182fd5b50813567ffffffffffffffff811115611a62578182fd5b6020830191508360208083028501011115611a7c57600080fd5b9250929050565b60008083601f840112611a94578182fd5b50813567ffffffffffffffff811115611aab578182fd5b602083019150836020828501011115611a7c57600080fd5b600060208284031215611ad4578081fd5b61110c8383611a16565b60008060408385031215611af0578081fd5b611afa8484611a16565b9150611b098460208501611a16565b90509250929050565b60008060008060008060008060a0898b031215611b2d578384fd5b611b378a8a611a16565b9750611b468a60208b01611a16565b9650604089013567ffffffffffffffff80821115611b62578586fd5b611b6e8c838d01611a3a565b909850965060608b0135915080821115611b86578586fd5b611b928c838d01611a3a565b909650945060808b0135915080821115611baa578384fd5b50611bb78b828c01611a83565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611be3578182fd5b8635611bee816123e0565b95506020870135611bfe816123e0565b94506040870135935060608701359250608087013567ffffffffffffffff811115611c27578283fd5b611c3389828a01611a83565b979a9699509497509295939492505050565b60008060408385031215611c57578182fd5b611c618484611a16565b915060208301358015158114611c75578182fd5b809150509250929050565b60008060408385031215611c92578182fd5b611c9c8484611a16565b946020939093013593505050565b60008060008060408587031215611cbf578384fd5b843567ffffffffffffffff80821115611cd6578586fd5b611ce288838901611a3a565b90965094506020870135915080821115611cfa578384fd5b50611d0787828801611a3a565b95989497509550505050565b600060208284031215611d24578081fd5b81517fffffffff000000000000000000000000000000000000000000000000000000008116811461110c578182fd5b600080600060408486031215611d67578283fd5b833567ffffffffffffffff811115611d7d578384fd5b611d8986828701611a83565b90945092505060208401358015158114611da1578182fd5b809150509250925092565b600060208284031215611dbd578081fd5b5035919050565b600080600060408486031215611dd8578283fd5b83359250602084013567ffffffffffffffff811115611df5578283fd5b611e0186828701611a3a565b9497909650939450505050565b600080600080600060608688031215611e25578081fd5b85359450602086013567ffffffffffffffff80821115611e43578283fd5b611e4f89838a01611a3a565b90965094506040880135915080821115611e67578283fd5b50611e7488828901611a3a565b969995985093965092949392505050565b600080600060408486031215611e99578081fd5b83359250602084013567ffffffffffffffff811115611eb6578182fd5b611e0186828701611a83565b60008284527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611ef3578081fd5b6020830280836020870137939093016020019283525090919050565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b600073ffffffffffffffffffffffffffffffffffffffff808b168352808a1660208401525060a06040830152611ff760a08301888a611ec2565b828103606084015261200a818789611ec2565b838103608085015261201d818688611f0f565b9c9b505050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015284606083015260a0608083015261207360a083018486611f0f565b98975050505050505050565b600060408252612093604083018688611ec2565b82810360208401526120a6818587611ec2565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156120e95783518352602093840193909201916001016120cb565b509095945050505050565b901515815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b606081016004851061213a57fe5b938152602081019290925260409091015290565b600060208252612162602083018486611f0f565b949350505050565b6020808252601f908201527f43414e4e4f545f5452414e534645525f544f5f414444524553535f5a45524f00604082015260600190565b6020808252818101527f544f4b454e5f414e445f56414c5545535f4c454e4754485f4d49534d41544348604082015260600190565b6020808252601d908201527f4e46545f4e4f545f4f574e45445f42595f46524f4d5f41444452455353000000604082015260600190565b60208082526016908201527f494e53554646494349454e545f414c4c4f57414e434500000000000000000000604082015260600190565b6020808252601c908201527f414d4f554e545f455155414c5f544f5f4f4e455f524551554952454400000000604082015260600190565b6020808252602d908201527f54524945445f544f5f4d494e545f4e4f4e5f46554e4749424c455f464f525f4660408201527f554e4749424c455f544f4b454e00000000000000000000000000000000000000606082015260800190565b60208082526024908201527f4f574e4552535f414e445f4944535f4d5553545f484156455f53414d455f4c4560408201527f4e47544800000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f54524945445f544f5f4d494e545f46554e4749424c455f464f525f4e4f4e5f4660408201527f554e4749424c455f544f4b454e00000000000000000000000000000000000000606082015260800190565b60208082526019908201527f4241445f52454345495645525f52455455524e5f56414c554500000000000000604082015260600190565b90815260200190565b918252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff8116811461240257600080fd5b5056fea365627a7a7231582066e9e02679a1339247a560b2455f640fc604f18add8b680d9fbe0bb5f4302a6d6c6578706572696d656e74616cf564736f6c63430005100040" } } }, diff --git a/packages/contract-artifacts/artifacts/ERC1155Proxy.json b/packages/contract-artifacts/artifacts/ERC1155Proxy.json index a7f1ee7043..59cbd9827a 100644 --- a/packages/contract-artifacts/artifacts/ERC1155Proxy.json +++ b/packages/contract-artifacts/artifacts/ERC1155Proxy.json @@ -167,10 +167,10 @@ }, "evm": { "bytecode": { - "object": "0x6080604052600080546001600160a01b031916331790556114bc806100256000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063a85e59e411610076578063b91816111161005b578063b918161114610285578063d39de6e9146102cc578063f2fde38b14610324576100be565b8063a85e59e4146101b2578063ae25532e14610248576100be565b806370712939116100a7578063707129391461013e5780638da5cb5b146101715780639ad2674414610179576100be565b806342f1181e146100c3578063494503d4146100f8575b600080fd5b6100f6600480360360208110156100d957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610357565b005b6101156004803603602081101561010e57600080fd5b5035610543565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100f66004803603602081101561015457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610577565b61011561086a565b6100f66004803603604081101561018f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610886565b6100f6600480360360808110156101c857600080fd5b8101906020810181356401000000008111156101e357600080fd5b8201836020820111156101f557600080fd5b8035906020019184600183028401116401000000008311171561021757600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610c37565b610250611141565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b6102b86004803603602081101561029b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611162565b604080519115158252519081900360200190f35b6102d4611177565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103105781810151838201526020016102f8565b505050509050019250505060405180910390f35b6100f66004803603602081101561033a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166111e6565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff161561047257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5441524745545f414c52454144595f415554484f52495a454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b6002818154811061055057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105fd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff1661069157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600254811015610823578173ffffffffffffffffffffffffffffffffffffffff166002828154811061070b57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561081b57600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061076357fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff909216918390811061079657fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906108159082611410565b50610823565b6001016106dd565b50604051339073ffffffffffffffffffffffffffffffffffffffff8316907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a350565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16331461090c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff166109a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b6002548110610a1057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000604482015290519081900360640190fd5b8173ffffffffffffffffffffffffffffffffffffffff1660028281548110610a3457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614610ac257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f415554484f52495a45445f414444524553535f4d49534d415443480000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610b3d57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610b7057fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610bef9082611410565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b3360009081526001602052604090205460ff16610cb557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b60006060806060610d0b60048a8a90508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092949392505063ffffffff6112cc169050565b8060200190516080811015610d1f57600080fd5b815160208301805160405192949293830192919084640100000000821115610d4657600080fd5b908301906020820185811115610d5b57600080fd5b8251866020820283011164010000000082111715610d7857600080fd5b82525081516020918201928201910280838360005b83811015610da5578181015183820152602001610d8d565b5050505090500160405260200180516040519392919084640100000000821115610dce57600080fd5b908301906020820185811115610de357600080fd5b8251866020820283011164010000000082111715610e0057600080fd5b82525081516020918201928201910280838360005b83811015610e2d578181015183820152602001610e15565b5050505090500160405260200180516040519392919084640100000000821115610e5657600080fd5b908301906020820185811115610e6b57600080fd5b8251640100000000811182820188101715610e8557600080fd5b82525081516020918201929091019080838360005b83811015610eb2578181015183820152602001610e9a565b50505050905090810190601f168015610edf5780820380516001836020036101000a031916815260200191505b506040525050509350935093509350600082519050606081604051908082528060200260200182016040528015610f20578160200160208202803883390190505b50905060005b828114610f7257610f5388868381518110610f3d57fe5b602002602001015161130f90919063ffffffff16565b828281518110610f5f57fe5b6020908102919091010152600101610f26565b508573ffffffffffffffffffffffffffffffffffffffff16632eb2c2d68a8a8885886040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561104f578181015183820152602001611037565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561108e578181015183820152602001611076565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156110ca5781810151838201526020016110b2565b50505050905090810190601f1680156110f75780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561111c57600080fd5b505af1158015611130573d6000803e3d6000fd5b505050505050505050505050505050565b60006040518080611458603091396030019050604051809103902090505b90565b60016020526000908152604090205460ff1681565b606060028054806020026020016040519081016040528092919081815260200182805480156111dc57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111b1575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff16331461126c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116156112c957600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b6060818311156112ea576112ea6112e560008585611349565b6113e8565b8351821115611303576113036112e56001848751611349565b50819003910190815290565b60008261131e57506000611343565b8282028284828161132b57fe5b0414611340576113406112e5600186866113f0565b90505b92915050565b6060632800659560e01b8484846040516024018084600781111561136957fe5b60ff1681526020018381526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090509392505050565b805160208201fd5b606063e946c1bb60e01b8484846040516024018084600381111561136957fe5b81548183558181111561143457600083815260209020611434918101908301611439565b505050565b61115f91905b80821115611453576000815560010161143f565b509056fe4552433131353541737365747328616464726573732c75696e743235365b5d2c75696e743235365b5d2c627974657329a265627a7a72315820c21966e12d2a564c986f80e108732503ca0ac4445e1ee20b7fcc8f79968ac47d64736f6c63430005100032" + "object": "0x6080604052600080546001600160a01b031916331790556114bc806100256000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063a85e59e411610076578063b91816111161005b578063b918161114610285578063d39de6e9146102cc578063f2fde38b14610324576100be565b8063a85e59e4146101b2578063ae25532e14610248576100be565b806370712939116100a7578063707129391461013e5780638da5cb5b146101715780639ad2674414610179576100be565b806342f1181e146100c3578063494503d4146100f8575b600080fd5b6100f6600480360360208110156100d957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610357565b005b6101156004803603602081101561010e57600080fd5b5035610543565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100f66004803603602081101561015457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610577565b61011561086a565b6100f66004803603604081101561018f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610886565b6100f6600480360360808110156101c857600080fd5b8101906020810181356401000000008111156101e357600080fd5b8201836020820111156101f557600080fd5b8035906020019184600183028401116401000000008311171561021757600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610c37565b610250611141565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b6102b86004803603602081101561029b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611162565b604080519115158252519081900360200190f35b6102d4611177565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103105781810151838201526020016102f8565b505050509050019250505060405180910390f35b6100f66004803603602081101561033a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166111e6565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff161561047257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5441524745545f414c52454144595f415554484f52495a454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b6002818154811061055057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105fd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff1661069157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600254811015610823578173ffffffffffffffffffffffffffffffffffffffff166002828154811061070b57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561081b57600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061076357fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff909216918390811061079657fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906108159082611410565b50610823565b6001016106dd565b50604051339073ffffffffffffffffffffffffffffffffffffffff8316907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a350565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16331461090c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff166109a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b6002548110610a1057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000604482015290519081900360640190fd5b8173ffffffffffffffffffffffffffffffffffffffff1660028281548110610a3457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614610ac257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f415554484f52495a45445f414444524553535f4d49534d415443480000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610b3d57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610b7057fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610bef9082611410565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b3360009081526001602052604090205460ff16610cb557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b60006060806060610d0b60048a8a90508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092949392505063ffffffff6112cc169050565b8060200190516080811015610d1f57600080fd5b815160208301805160405192949293830192919084640100000000821115610d4657600080fd5b908301906020820185811115610d5b57600080fd5b8251866020820283011164010000000082111715610d7857600080fd5b82525081516020918201928201910280838360005b83811015610da5578181015183820152602001610d8d565b5050505090500160405260200180516040519392919084640100000000821115610dce57600080fd5b908301906020820185811115610de357600080fd5b8251866020820283011164010000000082111715610e0057600080fd5b82525081516020918201928201910280838360005b83811015610e2d578181015183820152602001610e15565b5050505090500160405260200180516040519392919084640100000000821115610e5657600080fd5b908301906020820185811115610e6b57600080fd5b8251640100000000811182820188101715610e8557600080fd5b82525081516020918201929091019080838360005b83811015610eb2578181015183820152602001610e9a565b50505050905090810190601f168015610edf5780820380516001836020036101000a031916815260200191505b506040525050509350935093509350600082519050606081604051908082528060200260200182016040528015610f20578160200160208202803883390190505b50905060005b828114610f7257610f5388868381518110610f3d57fe5b602002602001015161130f90919063ffffffff16565b828281518110610f5f57fe5b6020908102919091010152600101610f26565b508573ffffffffffffffffffffffffffffffffffffffff16632eb2c2d68a8a8885886040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561104f578181015183820152602001611037565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561108e578181015183820152602001611076565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156110ca5781810151838201526020016110b2565b50505050905090810190601f1680156110f75780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561111c57600080fd5b505af1158015611130573d6000803e3d6000fd5b505050505050505050505050505050565b60006040518080611458603091396030019050604051809103902090505b90565b60016020526000908152604090205460ff1681565b606060028054806020026020016040519081016040528092919081815260200182805480156111dc57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111b1575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff16331461126c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116156112c957600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b6060818311156112ea576112ea6112e560008585611349565b6113e8565b8351821115611303576113036112e56001848751611349565b50819003910190815290565b60008261131e57506000611343565b8282028284828161132b57fe5b0414611340576113406112e5600186866113f0565b90505b92915050565b6060632800659560e01b8484846040516024018084600781111561136957fe5b60ff1681526020018381526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090509392505050565b805160208201fd5b606063e946c1bb60e01b8484846040516024018084600381111561136957fe5b81548183558181111561143457600083815260209020611434918101908301611439565b505050565b61115f91905b80821115611453576000815560010161143f565b509056fe4552433131353541737365747328616464726573732c75696e743235365b5d2c75696e743235365b5d2c627974657329a265627a7a723158201776c74f30e9d9e14fbe836f80264afb611d3aa6a23417488ac84cae624768ba64736f6c63430005100032" }, "deployedBytecode": { - "object": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c8063a85e59e411610076578063b91816111161005b578063b918161114610285578063d39de6e9146102cc578063f2fde38b14610324576100be565b8063a85e59e4146101b2578063ae25532e14610248576100be565b806370712939116100a7578063707129391461013e5780638da5cb5b146101715780639ad2674414610179576100be565b806342f1181e146100c3578063494503d4146100f8575b600080fd5b6100f6600480360360208110156100d957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610357565b005b6101156004803603602081101561010e57600080fd5b5035610543565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100f66004803603602081101561015457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610577565b61011561086a565b6100f66004803603604081101561018f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610886565b6100f6600480360360808110156101c857600080fd5b8101906020810181356401000000008111156101e357600080fd5b8201836020820111156101f557600080fd5b8035906020019184600183028401116401000000008311171561021757600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610c37565b610250611141565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b6102b86004803603602081101561029b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611162565b604080519115158252519081900360200190f35b6102d4611177565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103105781810151838201526020016102f8565b505050509050019250505060405180910390f35b6100f66004803603602081101561033a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166111e6565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff161561047257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5441524745545f414c52454144595f415554484f52495a454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b6002818154811061055057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105fd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff1661069157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600254811015610823578173ffffffffffffffffffffffffffffffffffffffff166002828154811061070b57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561081b57600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061076357fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff909216918390811061079657fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906108159082611410565b50610823565b6001016106dd565b50604051339073ffffffffffffffffffffffffffffffffffffffff8316907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a350565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16331461090c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff166109a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b6002548110610a1057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000604482015290519081900360640190fd5b8173ffffffffffffffffffffffffffffffffffffffff1660028281548110610a3457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614610ac257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f415554484f52495a45445f414444524553535f4d49534d415443480000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610b3d57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610b7057fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610bef9082611410565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b3360009081526001602052604090205460ff16610cb557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b60006060806060610d0b60048a8a90508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092949392505063ffffffff6112cc169050565b8060200190516080811015610d1f57600080fd5b815160208301805160405192949293830192919084640100000000821115610d4657600080fd5b908301906020820185811115610d5b57600080fd5b8251866020820283011164010000000082111715610d7857600080fd5b82525081516020918201928201910280838360005b83811015610da5578181015183820152602001610d8d565b5050505090500160405260200180516040519392919084640100000000821115610dce57600080fd5b908301906020820185811115610de357600080fd5b8251866020820283011164010000000082111715610e0057600080fd5b82525081516020918201928201910280838360005b83811015610e2d578181015183820152602001610e15565b5050505090500160405260200180516040519392919084640100000000821115610e5657600080fd5b908301906020820185811115610e6b57600080fd5b8251640100000000811182820188101715610e8557600080fd5b82525081516020918201929091019080838360005b83811015610eb2578181015183820152602001610e9a565b50505050905090810190601f168015610edf5780820380516001836020036101000a031916815260200191505b506040525050509350935093509350600082519050606081604051908082528060200260200182016040528015610f20578160200160208202803883390190505b50905060005b828114610f7257610f5388868381518110610f3d57fe5b602002602001015161130f90919063ffffffff16565b828281518110610f5f57fe5b6020908102919091010152600101610f26565b508573ffffffffffffffffffffffffffffffffffffffff16632eb2c2d68a8a8885886040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561104f578181015183820152602001611037565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561108e578181015183820152602001611076565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156110ca5781810151838201526020016110b2565b50505050905090810190601f1680156110f75780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561111c57600080fd5b505af1158015611130573d6000803e3d6000fd5b505050505050505050505050505050565b60006040518080611458603091396030019050604051809103902090505b90565b60016020526000908152604090205460ff1681565b606060028054806020026020016040519081016040528092919081815260200182805480156111dc57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111b1575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff16331461126c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116156112c957600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b6060818311156112ea576112ea6112e560008585611349565b6113e8565b8351821115611303576113036112e56001848751611349565b50819003910190815290565b60008261131e57506000611343565b8282028284828161132b57fe5b0414611340576113406112e5600186866113f0565b90505b92915050565b6060632800659560e01b8484846040516024018084600781111561136957fe5b60ff1681526020018381526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090509392505050565b805160208201fd5b606063e946c1bb60e01b8484846040516024018084600381111561136957fe5b81548183558181111561143457600083815260209020611434918101908301611439565b505050565b61115f91905b80821115611453576000815560010161143f565b509056fe4552433131353541737365747328616464726573732c75696e743235365b5d2c75696e743235365b5d2c627974657329a265627a7a72315820c21966e12d2a564c986f80e108732503ca0ac4445e1ee20b7fcc8f79968ac47d64736f6c63430005100032" + "object": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c8063a85e59e411610076578063b91816111161005b578063b918161114610285578063d39de6e9146102cc578063f2fde38b14610324576100be565b8063a85e59e4146101b2578063ae25532e14610248576100be565b806370712939116100a7578063707129391461013e5780638da5cb5b146101715780639ad2674414610179576100be565b806342f1181e146100c3578063494503d4146100f8575b600080fd5b6100f6600480360360208110156100d957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610357565b005b6101156004803603602081101561010e57600080fd5b5035610543565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100f66004803603602081101561015457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610577565b61011561086a565b6100f66004803603604081101561018f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610886565b6100f6600480360360808110156101c857600080fd5b8101906020810181356401000000008111156101e357600080fd5b8201836020820111156101f557600080fd5b8035906020019184600183028401116401000000008311171561021757600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610c37565b610250611141565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b6102b86004803603602081101561029b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611162565b604080519115158252519081900360200190f35b6102d4611177565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103105781810151838201526020016102f8565b505050509050019250505060405180910390f35b6100f66004803603602081101561033a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166111e6565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff161561047257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5441524745545f414c52454144595f415554484f52495a454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b6002818154811061055057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105fd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff1661069157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600254811015610823578173ffffffffffffffffffffffffffffffffffffffff166002828154811061070b57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561081b57600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061076357fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff909216918390811061079657fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906108159082611410565b50610823565b6001016106dd565b50604051339073ffffffffffffffffffffffffffffffffffffffff8316907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a350565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16331461090c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff166109a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b6002548110610a1057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000604482015290519081900360640190fd5b8173ffffffffffffffffffffffffffffffffffffffff1660028281548110610a3457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614610ac257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f415554484f52495a45445f414444524553535f4d49534d415443480000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610b3d57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610b7057fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610bef9082611410565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b3360009081526001602052604090205460ff16610cb557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b60006060806060610d0b60048a8a90508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092949392505063ffffffff6112cc169050565b8060200190516080811015610d1f57600080fd5b815160208301805160405192949293830192919084640100000000821115610d4657600080fd5b908301906020820185811115610d5b57600080fd5b8251866020820283011164010000000082111715610d7857600080fd5b82525081516020918201928201910280838360005b83811015610da5578181015183820152602001610d8d565b5050505090500160405260200180516040519392919084640100000000821115610dce57600080fd5b908301906020820185811115610de357600080fd5b8251866020820283011164010000000082111715610e0057600080fd5b82525081516020918201928201910280838360005b83811015610e2d578181015183820152602001610e15565b5050505090500160405260200180516040519392919084640100000000821115610e5657600080fd5b908301906020820185811115610e6b57600080fd5b8251640100000000811182820188101715610e8557600080fd5b82525081516020918201929091019080838360005b83811015610eb2578181015183820152602001610e9a565b50505050905090810190601f168015610edf5780820380516001836020036101000a031916815260200191505b506040525050509350935093509350600082519050606081604051908082528060200260200182016040528015610f20578160200160208202803883390190505b50905060005b828114610f7257610f5388868381518110610f3d57fe5b602002602001015161130f90919063ffffffff16565b828281518110610f5f57fe5b6020908102919091010152600101610f26565b508573ffffffffffffffffffffffffffffffffffffffff16632eb2c2d68a8a8885886040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561104f578181015183820152602001611037565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561108e578181015183820152602001611076565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156110ca5781810151838201526020016110b2565b50505050905090810190601f1680156110f75780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561111c57600080fd5b505af1158015611130573d6000803e3d6000fd5b505050505050505050505050505050565b60006040518080611458603091396030019050604051809103902090505b90565b60016020526000908152604090205460ff1681565b606060028054806020026020016040519081016040528092919081815260200182805480156111dc57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111b1575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff16331461126c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116156112c957600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b6060818311156112ea576112ea6112e560008585611349565b6113e8565b8351821115611303576113036112e56001848751611349565b50819003910190815290565b60008261131e57506000611343565b8282028284828161132b57fe5b0414611340576113406112e5600186866113f0565b90505b92915050565b6060632800659560e01b8484846040516024018084600781111561136957fe5b60ff1681526020018381526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090509392505050565b805160208201fd5b606063e946c1bb60e01b8484846040516024018084600381111561136957fe5b81548183558181111561143457600083815260209020611434918101908301611439565b505050565b61115f91905b80821115611453576000815560010161143f565b509056fe4552433131353541737365747328616464726573732c75696e743235365b5d2c75696e743235365b5d2c627974657329a265627a7a723158201776c74f30e9d9e14fbe836f80264afb611d3aa6a23417488ac84cae624768ba64736f6c63430005100032" } } }, diff --git a/packages/contract-artifacts/artifacts/Exchange.json b/packages/contract-artifacts/artifacts/Exchange.json index f176193936..0c07063343 100644 --- a/packages/contract-artifacts/artifacts/Exchange.json +++ b/packages/contract-artifacts/artifacts/Exchange.json @@ -1571,10 +1571,10 @@ }, "evm": { "bytecode": { - "object": "0x60806040526000805460ff60a01b191690553480156200001e57600080fd5b5060405162005dbb38038062005dbb833981016040819052620000419162000117565b600080546001600160a01b03191633178155819080309050620000b26040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b8152508584620000c060201b62005be11760201c565b600155506200013092505050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b60006020828403121562000129578081fd5b5051919050565b615c7b80620001406000396000f3fe6080604052600436106102dc5760003560e01c80638d45cd2311610184578063beee2e14116100d6578063dd885e2d1161008a578063eea086ba11610064578063eea086ba14610735578063f2fde38b1461074a578063fc74896d1461076a576102dc565b8063dd885e2d146106ed578063dedfc1f11461070f578063e14b58c414610722576102dc565b8063c26cfecd116100bb578063c26cfecd14610698578063c585bb93146106ad578063d9bfa73e146106cd576102dc565b8063beee2e1414610665578063c0fa16cc14610678576102dc565b80639b44d55611610138578063a6c3bf3311610112578063a6c3bf331461061f578063b04fbddd14610632578063b718e29214610652576102dc565b80639b44d556146105bf5780639d3fa4b9146105d2578063a12dcc6f146105ff576102dc565b80638ea8dfe4116101695780638ea8dfe41461056c5780639331c7421461058c5780639694a402146105ac576102dc565b80638d45cd23146105375780638da5cb5b14610557576102dc565b8063607041081161023d5780637b8e3514116101f1578063850a1501116101cb578063850a1501146104ef57806388ec79fb146105045780638bc8efb314610524576102dc565b80637b8e35141461048f5780638171c407146104af57806382c174d0146104cf576102dc565b80636fcf3e9e116102225780636fcf3e9e1461045657806377fcce681461046957806378d29ac11461047c576102dc565b806360704108146104095780636a1a80fd14610436576102dc565b80632ac1262211610294578063369da09911610279578063369da099146103c357806346c02d7a146103e35780634f9559b1146103f6576102dc565b80632ac12622146103905780632da62987146103b0576102dc565b80631ce4c78b116102c55780631ce4c78b1461032e5780632280c91014610350578063288cdc9114610370576102dc565b80630228e168146102e15780630efca18514610317575b600080fd5b3480156102ed57600080fd5b506103016102fc366004614e6f565b61078a565b60405161030e91906154c3565b60405180910390f35b34801561032357600080fd5b5061032c61079f565b005b34801561033a57600080fd5b506103436107b3565b60405161030e91906154ce565b61036361035e366004615107565b6107b9565b60405161030e919061569f565b34801561037c57600080fd5b5061034361038b366004614e6f565b6107fb565b34801561039c57600080fd5b506103016103ab366004614e6f565b61080d565b61032c6103be366004614f81565b610822565b6103d66103d1366004614d6b565b610846565b60405161030e91906159c1565b61032c6103f1366004614e6f565b61096d565b61032c610404366004614e6f565b6109e0565b34801561041557600080fd5b50610429610424366004614ef8565b610aed565b60405161030e919061535a565b610449610444366004614c4b565b610b3b565b60405161030e919061594a565b610449610464366004614c4b565b610b73565b61032c610477366004614b35565b610b91565b6103d661048a366004614d6b565b610c54565b34801561049b57600080fd5b506103016104aa366004614b01565b610da4565b3480156104bb57600080fd5b506103016104ca366004614eab565b610dc4565b3480156104db57600080fd5b506103016104ea366004614e87565b610e23565b3480156104fb57600080fd5b50610429610e43565b61051761051236600461500b565b610e5f565b60405161030e91906159cf565b6103d6610532366004614d6b565b610e7d565b34801561054357600080fd5b50610301610552366004615107565b610eb1565b34801561056357600080fd5b50610429610ed6565b61057f61057a366004614ce7565b610ef2565b60405161030e91906154b0565b34801561059857600080fd5b5061032c6105a7366004614e6f565b61101d565b61057f6105ba366004614ce7565b611065565b6103d66105cd3660046150a7565b61112c565b3480156105de57600080fd5b506105f26105ed366004614f81565b611151565b60405161030e9190615a11565b34801561060b57600080fd5b5061030161061a366004614fb4565b611246565b6103d661062d366004614d6b565b61126b565b34801561063e57600080fd5b5061032c61064d366004614b70565b61129f565b61051761066036600461500b565b61134b565b61057f610673366004614ce7565b611369565b34801561068457600080fd5b5061032c610693366004614ae6565b61141e565b3480156106a457600080fd5b5061034361142f565b3480156106b957600080fd5b5061032c6106c8366004614ae6565b611435565b3480156106d957600080fd5b506103436106e8366004614b01565b6115c9565b3480156106f957600080fd5b506107026115e6565b60405161030e919061562a565b61032c61071d366004614c18565b61160a565b6103d66107303660046150a7565b61164c565b34801561074157600080fd5b50610429611667565b34801561075657600080fd5b5061032c610765366004614ae6565b611683565b61077d610778366004614dbe565b611726565b60405161030e9190615432565b60056020526000908152604090205460ff1681565b6107a761184f565b6107b16000611896565b565b60035481565b60606107c3611931565b156107d9576107d28383611953565b90506107f5565b6107e1611a6d565b6107eb8383611953565b90506107f5611aaf565b92915050565b60096020526000908152604090205481565b600a6020526000908152604090205460ff1681565b61082a611adf565b61083381611b4e565b61083b611b93565b610843611ba7565b50565b61084e61456a565b610856611931565b156108ec57835160005b8181146108e5576000610880846020015187611bd190919063ffffffff16565b905061088a61456a565b6108bb88848151811061089957fe5b6020026020010151838886815181106108ae57fe5b6020026020010151611bf0565b90506108c78582611d31565b9450868560200151106108db5750506108e5565b5050600101610860565b5050610966565b6108f4611a6d565b835160005b81811461095c576000610919846020015187611bd190919063ffffffff16565b905061092361456a565b61093288848151811061089957fe5b905061093e8582611d31565b94508685602001511061095257505061095c565b50506001016108f9565b5050610966611aaf565b9392505050565b610975611adf565b600061097f611dcc565b600083815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff90941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555061083b611b93565b6109e8611adf565b60006109f2611dcc565b9050600073ffffffffffffffffffffffffffffffffffffffff82163314610a195733610a1c565b60005b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600b60209081526040808320938516835292905220549091506001840190808211610a7157610a71610a6c858584611dfe565b611ea3565b73ffffffffffffffffffffffffffffffffffffffff8085166000818152600b602090815260408083209488168084529490915290819020859055517f82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f090610ad99086906154ce565b60405180910390a35050505061083b611b93565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b610b43614599565b610b4b611adf565b610b59858585856001611eab565b9050610b63611b93565b610b6b611ba7565b949350505050565b610b7b614599565b610b83611adf565b610b59858585856000611eab565b610b99611adf565b6000610ba3611dcc565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600860209081526040808320948916808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555192935090917fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190610c379086906154c3565b60405180910390a350610c48611b93565b610c50611ba7565b5050565b610c5c61456a565b610c64611931565b15610d2257835160005b8181146108e5578251600090610c8b90879063ffffffff611bd116565b90506000610cc8888481518110610c9e57fe5b602002602001015160a00151898581518110610cb657fe5b60200260200101516080015184612218565b9050610cd261456a565b610cf6898581518110610ce157fe5b6020026020010151838987815181106108ae57fe5b9050610d028682611d31565b955087866000015110610d17575050506108e5565b505050600101610c6e565b610d2a611a6d565b835160005b81811461095c578251600090610d4c90879063ffffffff611bd116565b90506000610d5f888481518110610c9e57fe5b9050610d6961456a565b610d78898581518110610ce157fe5b9050610d848682611d31565b955087866000015110610d995750505061095c565b505050600101610d2f565b600860209081526000928352604080842090915290825290205460ff1681565b600080610dd285858561225a565b90506005816008811115610de257fe5b1480610df957506007816008811115610df757fe5b145b15610e0e57610e0e610a6c60058787876122d9565b610e1a81868686612381565b95945050505050565b600760209081526000928352604080842090915290825290205460ff1681565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b610e676145c1565b610e6f611adf565b610b598585858560006125f1565b610e8561456a565b610e90848484610c54565b9050828160000151101561096657610966610a6c60008584600001516126de565b600080610ec9600154856126fd90919063ffffffff16565b9050610b6b848285612711565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6060610efc611931565b15610f9f578351604080518281526020808402820101909152818015610f3c57816020015b610f2961456a565b815260200190600190039081610f215790505b50915060005b8181146108e557610f80868281518110610f5857fe5b6020026020010151868381518110610f6c57fe5b60200260200101518684815181106108ae57fe5b838281518110610f8c57fe5b6020908102919091010152600101610f42565b610fa7611a6d565b8351604080518281526020808402820101909152818015610fe257816020015b610fcf61456a565b815260200190600190039081610fc75790505b50915060005b81811461095c57610ffe868281518110610f5857fe5b83828151811061100a57fe5b6020908102919091010152600101610fe8565b61102561184f565b7f3a3e76d7a75e198aef1f53137e4f2a8a2ec74e2e9526db8404d08ccc9f1e621d60035482604051611058929190615542565b60405180910390a1600355565b606061106f611adf565b83516040805182815260208084028201019091528180156110aa57816020015b61109761456a565b81526020019060019003908161108f5790505b50915060005b81811461111a576110fb8682815181106110c657fe5b60200260200101518683815181106110da57fe5b60200260200101518684815181106110ee57fe5b6020026020010151612797565b83828151811061110757fe5b60209081029190910101526001016110b0565b5050611124611b93565b610966611ba7565b61113461456a565b61113c611adf565b611147848484612797565b9050611124611b93565b6111596145f5565b61116282612839565b60408301526020820152608082015161118e578060015b9081600681111561118657fe5b905250610b36565b60a082015161119f57806002611179565b8160a001518160400151106111b657806005611179565b81610100015142106111ca57806004611179565b6020808201516000908152600a909152604090205460ff16156111ef57806006611179565b610120820151825173ffffffffffffffffffffffffffffffffffffffff9081166000908152600b60209081526040808320606088015190941683529290522054111561123d57806006611179565b60038152919050565b60008061125e6001548561286a90919063ffffffff16565b9050610b6b848285612879565b61127361456a565b61127e848484610846565b9050828160200151101561096657610966610a6c60018584602001516126de565b835160005b81811461130f576113078160001b8783815181106112be57fe5b60200260200101518784815181106112d257fe5b60200260200101518785815181106112e657fe5b60200260200101518786815181106112fa57fe5b60200260200101516128ce565b6001016112a4565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134290615913565b60405180910390fd5b6113536145c1565b61135b611adf565b610b598585858560016125f1565b6060611373611adf565b83516040805182815260208084028201019091528180156113ae57816020015b61139b61456a565b8152602001906001900390816113935790505b50915060005b81811461111a576113ff8682815181106113ca57fe5b60200260200101518683815181106113de57fe5b60200260200101518684815181106113f257fe5b6020026020010151612a92565b83828151811061140b57fe5b60209081029190910101526001016113b4565b61142661184f565b61084381611896565b60015481565b61143d61184f565b60008173ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561148557600080fd5b505afa158015611499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114bd9190810190614f14565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205490915073ffffffffffffffffffffffffffffffffffffffff16801561151b5761151b610a6c8383612ac5565b7fffffffff0000000000000000000000000000000000000000000000000000000082166000908152600260205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c03194906115bc9084908690615657565b60405180910390a1505050565b600b60209081526000928352604080842090915290825290205481565b7f20c13b0b0000000000000000000000000000000000000000000000000000000081565b611612611adf565b805160005b8181146116425761163a83828151811061162d57fe5b6020026020010151611b4e565b600101611617565b505061083b611b93565b61165461456a565b61165c611adf565b611147848484612a92565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b61168b61184f565b73ffffffffffffffffffffffffffffffffffffffff81166116b6576116b1610a6c612b67565b610843565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6060611730611931565b156117cd57825160408051828152602080840282010190915281801561176a57816020015b60608152602001906001900390816117555790505b50915060005b8181146117c6576117a785828151811061178657fe5b602002602001015185838151811061179a57fe5b6020026020010151611953565b8382815181106117b357fe5b6020908102919091010152600101611770565b50506107f5565b6117d5611a6d565b825160408051828152602080840282010190915281801561180a57816020015b60608152602001906001900390816117f55790505b50915060005b8181146118455761182685828151811061178657fe5b83828151811061183257fe5b6020908102919091010152600101611810565b50506107f5611aaf565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107b1576000546107b190610a6c90339073ffffffffffffffffffffffffffffffffffffffff16612b9e565b6004546040517fe1a5430ebec577336427f40f15822f1f36c5e3509ff209d6db9e6c9e6941cb0b916118e29173ffffffffffffffffffffffffffffffffffffffff90911690849061537b565b60405180910390a1600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000547501000000000000000000000000000000000000000000900460ff1690565b6060600061196c600154856126fd90919063ffffffff16565b9050611979848483612bbb565b60608401516119888180612c8f565b60008281526005602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556080870151905160609130916119d6919061530d565b600060405180830381855af49150503d8060008114611a11576040519150601f19603f3d011682016040523d82523d6000602084013e611a16565b606091505b509150915081611a2d57611a2d610a6c8583612cf2565b611a38836000612c8f565b60405184907fa4a7329f1dd821363067e07d359e347b4af9b1efe4b6cccf13240228af3c800d90600090a29695505050505050565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690556107b1612d0f565b60005474010000000000000000000000000000000000000000900460ff1615611b0d57611b0d610a6c612d43565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b611b566145f5565b611b5f82611151565b9050611b6b8282612d7a565b600381516006811115611b7a57fe5b14611b855750610843565b610c50828260200151612e29565b611b9b611931565b6107b1576107b1612d0f565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b600082821115611bea57611bea610a6c60028585612ed2565b50900390565b611bf861456a565b6040516060907f9b44d5560000000000000000000000000000000000000000000000000000000090611c3290879087908790602401615a61565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060603073ffffffffffffffffffffffffffffffffffffffff1683604051611cba919061530d565b600060405180830381855af49150503d8060008114611cf5576040519150601f19603f3d011682016040523d82523d6000602084013e611cfa565b606091505b50915091508115611d2757805160a014611d1057fe5b80806020019051611d249190810190614f30565b93505b5050509392505050565b611d3961456a565b81518351611d4c9163ffffffff612ef116565b815260208083015190840151611d679163ffffffff612ef116565b602082015260408083015190840151611d859163ffffffff612ef116565b604082015260608083015190840151611da39163ffffffff612ef116565b606082015260808083015190840151611dc19163ffffffff612ef116565b608082015292915050565b60065460009073ffffffffffffffffffffffffffffffffffffffff16818115611df55781611df7565b335b9250505090565b6060634ad3127560e01b848484604051602401611e1d939291906153a2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b611eb3614599565b8551611ec657611ec6610a6c6000612f0d565b8451611ed957611ed9610a6c6001612f0d565b8351865114611eef57611eef610a6c6002612f0d565b8251855114611f0557611f05610a6c6003612f0d565b8551604051908082528060200260200182016040528015611f4057816020015b611f2d61456a565b815260200190600190039081611f255790505b5081528451604080518281526020808402820101909152908015611f7e57816020015b611f6b61456a565b815260200190600190039081611f635790505b506020820152600080611f8f614617565b88600081518110611f9c57fe5b60200260200101519050611fae614617565b88600081518110611fbb57fe5b602002602001015190506000611fd083612839565b9150506000611fde83612839565b915050611fe961456a565b611ff161456a565b611ff96145c1565b61202c87878f8c8151811061200a57fe5b60200260200101518f8c8151811061201e57fe5b60200260200101518f6125f1565b80516020015190915061204690869063ffffffff612ef116565b945061206381602001516020015185612ef190919063ffffffff16565b9350612073838260000151611d31565b9250612083828260200151611d31565b91506120a081604001518b60400151612ef190919063ffffffff16565b60408b0152606080820151908b01516120be9163ffffffff612ef116565b60608b015260a08701518510612169578951805160018b019a85929181106120e257fe5b60200260200101819052506040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525092508e5189141561214657818a60200151898151811061213557fe5b602002602001018190525050612207565b8e898151811061215257fe5b6020026020010151965061216587612839565b9550505b8560a00151841061220157818a6020015189806001019a508151811061218b57fe5b60200260200101819052506040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525091508d518814156121de57828a600001518a8151811061213557fe5b8d88815181106121ea57fe5b602002602001015195506121fd86612839565b9450505b50611ff1565b505050505050505095945050505050565b6000610b6b8361224e61223282600163ffffffff611bd116565b612242888763ffffffff612fac16565b9063ffffffff612ef116565b9063ffffffff612fdd16565b6000612267848484613007565b905073ffffffffffffffffffffffffffffffffffffffff831661229457612294610a6c60068686866122d9565b600881818111156122a157fe5b60ff16106122b9576122b9610a6c60038686866122d9565b60008160088111156122c757fe5b141561096657610966610a6c60048686865b6060637e5a231860e01b858585856040516024016122fa94939291906158b8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050949350505050565b6000600185600881111561239157fe5b14156123b85781516001146123b0576123b0610a6c60028686866122d9565b506000610b6b565b60028560088111156123c657fe5b14156124bf5781516042146123e5576123e5610a6c60028686866122d9565b6000826000815181106123f457fe5b016020015160f81c9050600061241184600163ffffffff61304616565b9050600061242685602163ffffffff61304616565b905060006001888585856040516000815260200160405260405161244d949392919061560c565b6020604051602081039080840390855afa15801561246f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8981169116149550610b6b945050505050565b60038560088111156124cd57fe5b141561257a5781516042146124ec576124ec610a6c60028686866122d9565b6000826000815181106124fb57fe5b016020015160f81c9050600061251884600163ffffffff61304616565b9050600061252d85602163ffffffff61304616565b905060006001886040516020016125449190615329565b604051602081830303815290604052805190602001208585856040516000815260200160405260405161244d949392919061560c565b600485600881111561258857fe5b14156125a057612599848484613070565b9050610b6b565b60068560088111156125ae57fe5b146125b557fe5b50600083815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205460ff16949350505050565b6125f96145c1565b6101608087015161014080880191909152870151908601526126196145f5565b61262287611151565b905061262c6145f5565b61263587611151565b90506000612641611dcc565b905061264f8984838a613266565b61265b88838389613266565b61266f89898560200151856020015161337e565b6126888989856040015185604001516003543a8b6133c3565b93506126a38982856020015186604001518860000151613518565b6126bc8882846020015185604001518860200151613518565b6126d2836020015183602001518b8b85896135f6565b50505095945050505050565b60606318e4b14160e01b848484604051602401611e1d9392919061589d565b60006109668261270c8561379d565b613825565b60608301516000908161272585838661225a565b9050600581600881111561273557fe5b141561275757612750612748878761385f565b868487613897565b925061278e565b600781600881111561276557fe5b141561277f57612750612778878761385f565b838661394b565b61278b81868487612381565b92505b50509392505050565b61279f61456a565b6127a76145f5565b6127b085611151565b905060006127bc611dcc565b90506127ca86838387613266565b60006127e783604001518860a00151611bd190919063ffffffff16565b905060006127f5878361395a565b905061280588826003543a613970565b945060008460200151905061282189858388604001518a613518565b61282d818a86896139e7565b50505050509392505050565b6000806128516001548461286a90919063ffffffff16565b6000818152600960205260409020549092509050915091565b60006109668261270c85613a7e565b82516000908161288a85838661225a565b9050600581600881111561289a57fe5b14156128ad576127506127488787613b55565b60078160088111156128bb57fe5b141561277f576127506127788787613b55565b8015612a8b5760208451816128df57fe5b066004146128f6576128f6610a6c60008787613b8d565b6000612908858263ffffffff613bac16565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205490915073ffffffffffffffffffffffffffffffffffffffff168061296757612967610a6c60018989613b8d565b6040516060907fa85e59e400000000000000000000000000000000000000000000000000000000906129a39089908990899089906024016156b2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608373ffffffffffffffffffffffffffffffffffffffff1683604051612a2b919061530d565b6000604051808303816000865af19150503d8060008114612a68576040519150601f19603f3d011682016040523d82523d6000602084013e612a6d565b606091505b509150915081612a8557612a85610a6c8b8b84613bf8565b50505050505b5050505050565b612a9a61456a565b612aa5848484612797565b90508281602001511461096657610966610a6c60028584602001516126de565b60606311c7b72060e01b8383604051602401612ae2929190615657565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060631de45ad160e01b8383604051602401612ae292919061537b565b82602001514210612bd457612bd4610a6c600183613c17565b60408301513a8114612bee57612bee610a6c833a84613c34565b60065473ffffffffffffffffffffffffffffffffffffffff168015612c1a57612c1a610a6c8483613c53565b60008381526005602052604090205460ff1615612c3f57612c3f610a6c600085613c17565b606085015173ffffffffffffffffffffffffffffffffffffffff81163314801590612c725750612c70868587612711565b155b15612c8757612c87610a6c60018684896122d9565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff82163314610c50576006805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790555050565b60606320d11f6160e01b8383604051602401612ae2929190615550565b47801561084357604051339082156108fc029083906000818181858888f19350505050158015610c50573d6000803e3d6000fd5b60408051808201909152600481527f0c3b823f00000000000000000000000000000000000000000000000000000000602082015290565b606082015173ffffffffffffffffffffffffffffffffffffffff1615612dce57606082015173ffffffffffffffffffffffffffffffffffffffff163314612dce57612dce610a6c6002836020015133613c70565b6000612dd8611dcc565b90508073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614612e2457612e24610a6c6000846020015184613c70565b505050565b6000818152600a60205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558281015183516101408501516101608601519351859473ffffffffffffffffffffffffffffffffffffffff9485169493909316927f02c310a9a43963ff31a754a4099cc435ed498049687539d72d7818d9b093415c92612ec692909190339061571a565b60405180910390a45050565b606063e946c1bb60e01b848484604051602401611e1d93929190615845565b60008282018381101561096657610966610a6c60008686612ed2565b606063d4092f4f60e01b82604051602401612f289190615832565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b600082612fbb575060006107f5565b82820282848281612fc857fe5b041461096657610966610a6c60018686612ed2565b600081612ff357612ff3610a6c60038585612ed2565b6000828481612ffe57fe5b04949350505050565b600081516000141561302357613023610a6c60028686866122d9565b8160018351038151811061303357fe5b016020015160f81c6008811115610b6b57fe5b6000816020018351101561306757613067610a6c6005855185602001613c8f565b50016020015190565b80516000906130a7837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830163ffffffff613cae16565b6040516060907f1626ba7e00000000000000000000000000000000000000000000000000000000906130df9088908790602401615550565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061316e848363ffffffff613cae16565b600060608673ffffffffffffffffffffffffffffffffffffffff1683604051613197919061530d565b600060405180830381855afa9150503d80600081146131d2576040519150601f19603f3d011682016040523d82523d6000602084013e6131d7565b606091505b50915091508180156131ea575080516020145b1561324c577fb06713810000000000000000000000000000000000000000000000000000000061322182600063ffffffff613bac16565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614945050505050610966565b61325b610a6c89898985613cb2565b505050509392505050565b60038351600681111561327557fe5b1461328f5761328f610a6c84602001518560000151613cd3565b606084015173ffffffffffffffffffffffffffffffffffffffff16156132e357606084015173ffffffffffffffffffffffffffffffffffffffff1633146132e3576132e3610a6c6002856020015133613c70565b602084015173ffffffffffffffffffffffffffffffffffffffff161561334d578173ffffffffffffffffffffffffffffffffffffffff16846020015173ffffffffffffffffffffffffffffffffffffffff161461334d5761334d610a6c6001856020015185613c70565b61335c84846020015183612879565b61337857613378610a6c600085602001518760000151856122d9565b50505050565b60a080840151908501516133979163ffffffff612fac16565b608080850151908601516133b09163ffffffff612fac16565b101561337857613378610a6c8383613cf0565b6133cb6145c1565b60a08801516000906133e3908863ffffffff611bd116565b905060006133fa8a608001518b60a0015184613d0d565b90506000613415888b60a00151611bd190919063ffffffff16565b9050600061342c8b608001518c60a0015184613d0d565b90508515613449576134428c8c85878587613d41565b945061345a565b6134578c8c85878587613e13565b94505b84515160808d015160c08e0151613472929190613d0d565b85516040015284516020015160a08d015160e08e0151613493929190613d0d565b85516060015260208501515160808c015160c08d01516134b4929190613d0d565b856020015160400181815250506134dc8560200151602001518c60a001518d60e00151613d0d565b60208601516060015260006134f7888a63ffffffff612fac16565b86516080908101829052602088015101525050505050979650505050505050565b602081015161352e90839063ffffffff612ef116565b600960008581526020019081526020016000208190555082856040015173ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff167f6869791f0a34781b29882982cc39e882768cf2c96995c2a110c577c53bc932d58861014001518961016001518a61018001518b6101a001518b338a600001518b602001518c604001518d606001518e608001516040516135e79b9a99989796959493929190615766565b60405180910390a45050505050565b835183516040808701519086015161014087015185516020015161361f918b91869088906128ce565b6136398a89610140015186868960200151602001516128ce565b6136538988610180015185848960200151604001516128ce565b61366d8a89610180015186858960000151604001516128ce565b6136838a896101400151868989604001516128ce565b61369989886101400151858989606001516128ce565b60006136b18b8b88600001516080015188888c613eac565b9050806136ce578551600060809182018190526020880151909101525b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614801561371e57506101a080890151908a015161371e9163ffffffff613f0816565b1561375c576137578b8a6101a0015189866137528b60200151606001518c6000015160600151612ef190919063ffffffff16565b6128ce565b613790565b6137768a896101a0015189858a60200151606001516128ce565b6137908b8a6101a0015189868a60000151606001516128ce565b5050505050505050505050565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc71541508815294850195909552908301919091529481019490945273ffffffffffffffffffffffffffffffffffffffff9091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6040516060907fde047db40000000000000000000000000000000000000000000000000000000090612ae29085908590602401615a8c565b805160009060158110156138b5576138b5610a6c60028787876122d9565b60006138e9847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb840163ffffffff613f2d16565b73ffffffffffffffffffffffffffffffffffffffff80871660009081526008602090815260408083209385168352929052205490915060ff1661393357613933610a6c8683613f6d565b6139408188866015613f8a565b979650505050505050565b6000610b6b8385846001613f8a565b60008183106139695781610966565b5090919050565b61397861456a565b6020810184905260a08501516080860151613994918691613d0d565b815260a085015160c08601516139ab918691613d0d565b604082015260a085015160e08601516139c5918691613d0d565b60608201526139da828463ffffffff612fac16565b6080820152949350505050565b613a018484610160015184866000015185602001516128ce565b613a1b8484610140015185600001518585600001516128ce565b613a3584846101a0015184866040015185606001516128ce565b613a53848461018001518560000151866040015185604001516128ce565b6000613a69858360800151866000015186614161565b905080612a8b57600060808301525050505050565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613aca57fe5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b6040516060907f3efe50c80000000000000000000000000000000000000000000000000000000090612ae29085908590602401615a3f565b606063488219a660e01b848484604051602401611e1d9392919061580a565b60008160040183511015613bcd57613bcd610a6c6003855185600401613c8f565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6060634678472b60e01b848484604051602401611e1d93929190615569565b606063f598518460e01b8383604051602401612ae29291906158fc565b606063a26dac0960e01b848484604051602401611e1d939291906155f6565b606063dec4aedf60e01b8383604051602401612ae29291906154d7565b606063e53c76c860e01b848484604051602401611e1d93929190615866565b6060632800659560e01b848484604051602401611e1d939291906158aa565b9052565b6060631b8388f760e01b858585856040516024016122fa94939291906154fb565b606063fdb6ca8d60e01b8383604051602401612ae2929190615594565b606063b6555d6f60e01b8383604051602401612ae2929190615542565b6000613d1a8484846141a6565b15613d2d57613d2d610a6c85858561420c565b610b6b8361224e868563ffffffff612fac16565b613d496145c1565b81851184841184861115613d6957613d6289868661422b565b9250613db8565b86841115613da95782518790528251602001869052608088015160a0890151613d93919089613d0d565b6020808501805192909252905101879052613db8565b613db587878787614268565b92505b8115613dde576020808401510151835151613dd89163ffffffff611bd116565b60408401525b8015613e065782516020908101519084015151613e009163ffffffff611bd116565b60608401525b50505b9695505050505050565b613e1b6145c1565b82841115613e3557613e2e87848461422b565b9050613e83565b82841015613e745780518590528051602090810185905281015184905260a08601516080870151613e67919086614293565b6020808301510152613e83565b613e8085858585614268565b90505b6020808201510151815151613e9d9163ffffffff611bd116565b60408201529695505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff168015613efe57476000613edf8a84848b8b8a6142cb565b9050613ef189848385038b8a8a6142cb565b5060019350505050613e09565b6000915050613e09565b6000815183511480156109665750508051602091820120825192909101919091201490565b60008160140183511015613f4e57613f4e610a6c6004855185601401613c8f565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b606063a15c0d0660e01b8383604051602401612ae292919061537b565b8151600090613fa18484830363ffffffff613cae16565b6040516060907f20c13b0b0000000000000000000000000000000000000000000000000000000090613fd990889088906024016156f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050614068858363ffffffff613cae16565b600060608873ffffffffffffffffffffffffffffffffffffffff1683604051614091919061530d565b600060405180830381855afa9150503d80600081146140cc576040519150601f19603f3d011682016040523d82523d6000602084013e6140d1565b606091505b50915091508180156140e4575080516020145b15614146577f20c13b0b0000000000000000000000000000000000000000000000000000000061411b82600063ffffffff613bac16565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614945050505050610b6b565b614155610a6c8a8a8a85614403565b50505050949350505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff16801561419c576141918682478888886142cb565b506001915050610b6b565b6000915050610b6b565b6000826141b8576141b8610a6c614424565b8115806141c3575083155b156141d057506000610966565b600083806141da57fe5b85840990506141ef858463ffffffff612fac16565b614201826103e863ffffffff612fac16565b101595945050505050565b606063339f3de260e01b848484604051602401611e1d939291906155f6565b6142336145c1565b60208082018051859052518101839052815101839052608084015160a085015161425e919085613d0d565b8151529392505050565b6142706145c1565b805194909452835160209081019390935282840180519290925290519091015290565b60006142a084848461445b565b156142b3576142b3610a6c85858561420c565b610b6b8361224e61223282600163ffffffff611bd116565b60008385106142d75750825b6040516060907fa3b4a3270000000000000000000000000000000000000000000000000000000090614311908690869089906024016153a2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608873ffffffffffffffffffffffffffffffffffffffff16848460405161439a919061530d565b60006040518083038185875af1925050503d80600081146143d7576040519150601f19603f3d011682016040523d82523d6000602084013e6143dc565b606091505b5091509150816143f6576143f6610a6c8b898989866144bf565b5050509695505050505050565b6060635bd0428d60e01b858585856040516024016122fa94939291906153d3565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b60008261446d5761446d610a6c614424565b811580614478575083155b1561448557506000610966565b6000838061448f57fe5b8584099050836144a5818363ffffffff611bd116565b816144ac57fe5b0690506141ef858463ffffffff612fac16565b60606387cb1e7560e01b86868686866040516024016144e29594939291906155b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905095945050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040518060800160405280606081526020016060815260200160008152602001600081525090565b60405180608001604052806145d461456a565b81526020016145e161456a565b815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b803573ffffffffffffffffffffffffffffffffffffffff811681146107f557600080fd5b600082601f830112614712578081fd5b813561472561472082615b1d565b615af6565b81815291506020808301908481018184028601820187101561474657600080fd5b60005b8481101561476d5761475b88836146de565b84529282019290820190600101614749565b505050505092915050565b600082601f830112614788578081fd5b813561479661472082615b1d565b8181529150602080830190840160005b838110156147d3576147be8760208435890101614896565b835260209283019291909101906001016147a6565b5050505092915050565b600082601f8301126147ed578081fd5b81356147fb61472082615b1d565b8181529150602080830190840160005b838110156147d357614823876020843589010161491d565b8352602092830192919091019060010161480b565b600082601f830112614848578081fd5b813561485661472082615b1d565b81815291506020808301908481018184028601820187101561487757600080fd5b60005b8481101561476d5781358452928201929082019060010161487a565b600082601f8301126148a6578081fd5b813567ffffffffffffffff8111156148bc578182fd5b6148ed60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601615af6565b915080825283602082850101111561490457600080fd5b8060208401602084013760009082016020015292915050565b60006101c0808385031215614930578182fd5b61493981615af6565b91505061494683836146de565b815261495583602084016146de565b602082015261496783604084016146de565b604082015261497983606084016146de565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff808211156149db57600080fd5b6149e786838701614896565b83850152610160925082850135915080821115614a0357600080fd5b614a0f86838701614896565b83850152610180925082850135915080821115614a2b57600080fd5b614a3786838701614896565b838501526101a0925082850135915080821115614a5357600080fd5b50614a6085828601614896565b82840152505092915050565b600060a08284031215614a7d578081fd5b614a8760a0615af6565b90508135815260208201356020820152604082013560408201526060820135614aaf81615b91565b6060820152608082013567ffffffffffffffff811115614ace57600080fd5b614ada84828501614896565b60808301525092915050565b600060208284031215614af7578081fd5b61096683836146de565b60008060408385031215614b13578081fd5b614b1d84846146de565b9150614b2c84602085016146de565b90509250929050565b60008060408385031215614b47578182fd5b614b5184846146de565b915060208301358015158114614b65578182fd5b809150509250929050565b60008060008060808587031215614b85578182fd5b843567ffffffffffffffff80821115614b9c578384fd5b614ba888838901614778565b95506020870135915080821115614bbd578384fd5b614bc988838901614702565b94506040870135915080821115614bde578384fd5b614bea88838901614702565b93506060870135915080821115614bff578283fd5b50614c0c87828801614838565b91505092959194509250565b600060208284031215614c29578081fd5b813567ffffffffffffffff811115614c3f578182fd5b610b6b848285016147dd565b60008060008060808587031215614c60578182fd5b843567ffffffffffffffff80821115614c77578384fd5b614c83888389016147dd565b95506020870135915080821115614c98578384fd5b614ca4888389016147dd565b94506040870135915080821115614cb9578384fd5b614cc588838901614778565b93506060870135915080821115614cda578283fd5b50614c0c87828801614778565b600080600060608486031215614cfb578081fd5b833567ffffffffffffffff80821115614d12578283fd5b614d1e878388016147dd565b94506020860135915080821115614d33578283fd5b614d3f87838801614838565b93506040860135915080821115614d54578283fd5b50614d6186828701614778565b9150509250925092565b600080600060608486031215614d7f578081fd5b833567ffffffffffffffff80821115614d96578283fd5b614da2878388016147dd565b9450602086013593506040860135915080821115614d54578283fd5b60008060408385031215614dd0578182fd5b823567ffffffffffffffff80821115614de7578384fd5b81850186601f820112614df8578485fd5b80359250614e0861472084615b1d565b83815260208082019190838101885b87811015614e4057614e2e8c848435890101614a6c565b85529382019390820190600101614e17565b50919750880135945050505080821115614e58578283fd5b50614e6585828601614778565b9150509250929050565b600060208284031215614e80578081fd5b5035919050565b60008060408385031215614e99578182fd5b823591506020830135614b6581615b91565b600080600060608486031215614ebf578081fd5b833592506020840135614ed181615b91565b9150604084013567ffffffffffffffff811115614eec578182fd5b614d6186828701614896565b600060208284031215614f09578081fd5b813561096681615bb3565b600060208284031215614f25578081fd5b815161096681615bb3565b600060a08284031215614f41578081fd5b614f4b60a0615af6565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215614f92578081fd5b813567ffffffffffffffff811115614fa8578182fd5b610b6b8482850161491d565b60008060408385031215614fc6578182fd5b823567ffffffffffffffff80821115614fdd578384fd5b614fe98683870161491d565b93506020850135915080821115614ffe578283fd5b50614e6585828601614896565b60008060008060808587031215615020578182fd5b843567ffffffffffffffff80821115615037578384fd5b6150438883890161491d565b95506020870135915080821115615058578384fd5b6150648883890161491d565b94506040870135915080821115615079578384fd5b61508588838901614896565b9350606087013591508082111561509a578283fd5b50614c0c87828801614896565b6000806000606084860312156150bb578081fd5b833567ffffffffffffffff808211156150d2578283fd5b6150de8783880161491d565b94506020860135935060408601359150808211156150fa578283fd5b50614d6186828701614896565b60008060408385031215615119578182fd5b823567ffffffffffffffff80821115615130578384fd5b614fe986838701614a6c565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156151925761517c8683516151e6565b60a0959095019460209190910190600101615169565b5093949350505050565b600081518084526151b4816020860160208601615b3d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b80518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b60006101c061522684845161513c565b6020830151615238602086018261513c565b50604083015161524b604086018261513c565b50606083015161525e606086018261513c565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152506101408084015182828701526152b78387018261519c565b915050610160915081840151858203838701526152d4828261519c565b9250505061018080840151858303828701526152f0838261519c565b9150506101a091508184015185820383870152613e09828261519c565b6000825161531f818460208701615b3d565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff8616825260806020830152615402608083018661519c565b8281036040840152615414818661519c565b8381036060850152615426818661519c565b98975050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156154a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261549185835161519c565b94509285019290850190600101615457565b5092979650505050505050565b6000602082526109666020830184615156565b901515815260200190565b90815260200190565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600085825273ffffffffffffffffffffffffffffffffffffffff8516602083015260806040830152615530608083018561519c565b8281036060840152613940818561519c565b918252602082015260400190565b600083825260406020830152610b6b604083018461519c565b600084825260606020830152615582606083018561519c565b8281036040840152613e09818561519c565b828152604081016155a483615b87565b8260208301529392505050565b600086825285602083015273ffffffffffffffffffffffffffffffffffffffff808616604084015280851660608401525060a0608083015261394060a083018461519c565b9283526020830191909152604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000092909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060208252610966602083018461519c565b6000608082526156c5608083018761519c565b73ffffffffffffffffffffffffffffffffffffffff95861660208401529390941660408201526060015292915050565b600060408252615708604083018561519c565b8281036020840152610e1a818561519c565b60006060825261572d606083018661519c565b828103602084015261573f818661519c565b91505073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600061016080835261577a8184018f61519c565b838103602085015261578c818f61519c565b91505082810360408401526157a1818d61519c565b83810360608501526157b3818d61519c565b73ffffffffffffffffffffffffffffffffffffffff9b8c16608086015299909a1660a0840152505060c081019590955260e08501939093526101008401919091526101208301526101409091015295945050505050565b600061581585615b69565b84825283602083015260606040830152610e1a606083018461519c565b6020810161583f83615b73565b91905290565b6060810161585285615b73565b938152602081019290925260409091015290565b6060810161587385615b7d565b938152602081019290925273ffffffffffffffffffffffffffffffffffffffff1660409091015290565b6060810161585285615b7d565b606081016008851061585257fe5b60006158c386615b87565b85825284602083015273ffffffffffffffffffffffffffffffffffffffff8416604083015260806060830152613e09608083018461519c565b6040810161590984615b69565b9281526020015290565b60208082526014908201527f5452414e53464552535f5355434345535346554c000000000000000000000000604082015260600190565b60006020825282516080602084015261596660a0840182615156565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08482030160408501526159a18183615156565b604086015160608601526060860151608086015280935050505092915050565b60a081016107f582846151e6565b6000610180820190506159e38284516151e6565b60208301516159f560a08401826151e6565b5060408301516101408301526060909201516101609091015290565b81516060820190615a2181615b87565b80835250602083015160208301526040830151604083015292915050565b600060408252615a526040830185615216565b90508260208301529392505050565b600060608252615a746060830186615216565b8460208401528281036040840152613e09818561519c565b60006040825283516040830152602084015160608301526040840151608083015273ffffffffffffffffffffffffffffffffffffffff60608501511660a0830152608084015160a060c0840152615ae660e084018261519c565b9150508260208301529392505050565b60405181810167ffffffffffffffff81118282101715615b1557600080fd5b604052919050565b600067ffffffffffffffff821115615b33578081fd5b5060209081020190565b60005b83811015615b58578181015183820152602001615b40565b838111156133785750506000910152565b6002811061084357fe5b6004811061084357fe5b6003811061084357fe5b6007811061084357fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461084357600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461084357600080fd5b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a090209056fea365627a7a72315820897f450a05992000843ffc258f91408c60af4df0c5e254daaee4892d72aa3da26c6578706572696d656e74616cf564736f6c63430005100040" + "object": "0x60806040526000805460ff60a01b191690553480156200001e57600080fd5b5060405162005db338038062005db3833981016040819052620000419162000117565b600080546001600160a01b03191633178155819080309050620000b26040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b8152508584620000c060201b62005bd91760201c565b600155506200013092505050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b60006020828403121562000129578081fd5b5051919050565b615c7380620001406000396000f3fe6080604052600436106102dc5760003560e01c80638d45cd2311610184578063beee2e14116100d6578063dd885e2d1161008a578063eea086ba11610064578063eea086ba14610735578063f2fde38b1461074a578063fc74896d1461076a576102dc565b8063dd885e2d146106ed578063dedfc1f11461070f578063e14b58c414610722576102dc565b8063c26cfecd116100bb578063c26cfecd14610698578063c585bb93146106ad578063d9bfa73e146106cd576102dc565b8063beee2e1414610665578063c0fa16cc14610678576102dc565b80639b44d55611610138578063a6c3bf3311610112578063a6c3bf331461061f578063b04fbddd14610632578063b718e29214610652576102dc565b80639b44d556146105bf5780639d3fa4b9146105d2578063a12dcc6f146105ff576102dc565b80638ea8dfe4116101695780638ea8dfe41461056c5780639331c7421461058c5780639694a402146105ac576102dc565b80638d45cd23146105375780638da5cb5b14610557576102dc565b8063607041081161023d5780637b8e3514116101f1578063850a1501116101cb578063850a1501146104ef57806388ec79fb146105045780638bc8efb314610524576102dc565b80637b8e35141461048f5780638171c407146104af57806382c174d0146104cf576102dc565b80636fcf3e9e116102225780636fcf3e9e1461045657806377fcce681461046957806378d29ac11461047c576102dc565b806360704108146104095780636a1a80fd14610436576102dc565b80632ac1262211610294578063369da09911610279578063369da099146103c357806346c02d7a146103e35780634f9559b1146103f6576102dc565b80632ac12622146103905780632da62987146103b0576102dc565b80631ce4c78b116102c55780631ce4c78b1461032e5780632280c91014610350578063288cdc9114610370576102dc565b80630228e168146102e15780630efca18514610317575b600080fd5b3480156102ed57600080fd5b506103016102fc366004614e6f565b61078a565b60405161030e91906154c3565b60405180910390f35b34801561032357600080fd5b5061032c61079f565b005b34801561033a57600080fd5b506103436107b3565b60405161030e91906154ce565b61036361035e366004615107565b6107b9565b60405161030e919061569f565b34801561037c57600080fd5b5061034361038b366004614e6f565b6107fb565b34801561039c57600080fd5b506103016103ab366004614e6f565b61080d565b61032c6103be366004614f81565b610822565b6103d66103d1366004614d6b565b610846565b60405161030e91906159c3565b61032c6103f1366004614e6f565b61096d565b61032c610404366004614e6f565b6109e0565b34801561041557600080fd5b50610429610424366004614ef8565b610aed565b60405161030e919061535a565b610449610444366004614c4b565b610b3b565b60405161030e919061594c565b610449610464366004614c4b565b610b73565b61032c610477366004614b35565b610b91565b6103d661048a366004614d6b565b610c54565b34801561049b57600080fd5b506103016104aa366004614b01565b610da4565b3480156104bb57600080fd5b506103016104ca366004614eab565b610dc4565b3480156104db57600080fd5b506103016104ea366004614e87565b610e23565b3480156104fb57600080fd5b50610429610e43565b61051761051236600461500b565b610e5f565b60405161030e91906159d1565b6103d6610532366004614d6b565b610e7d565b34801561054357600080fd5b50610301610552366004615107565b610eb1565b34801561056357600080fd5b50610429610ed6565b61057f61057a366004614ce7565b610ef2565b60405161030e91906154b0565b34801561059857600080fd5b5061032c6105a7366004614e6f565b61101d565b61057f6105ba366004614ce7565b611065565b6103d66105cd3660046150a7565b61112c565b3480156105de57600080fd5b506105f26105ed366004614f81565b611151565b60405161030e9190615a13565b34801561060b57600080fd5b5061030161061a366004614fb4565b611246565b6103d661062d366004614d6b565b61126b565b34801561063e57600080fd5b5061032c61064d366004614b70565b61129f565b61051761066036600461500b565b61134b565b61057f610673366004614ce7565b611369565b34801561068457600080fd5b5061032c610693366004614ae6565b61141e565b3480156106a457600080fd5b5061034361142f565b3480156106b957600080fd5b5061032c6106c8366004614ae6565b611435565b3480156106d957600080fd5b506103436106e8366004614b01565b6115c9565b3480156106f957600080fd5b506107026115e6565b60405161030e919061562a565b61032c61071d366004614c18565b61160a565b6103d66107303660046150a7565b61164c565b34801561074157600080fd5b50610429611667565b34801561075657600080fd5b5061032c610765366004614ae6565b611683565b61077d610778366004614dbe565b611726565b60405161030e9190615432565b60056020526000908152604090205460ff1681565b6107a761184f565b6107b16000611896565b565b60035481565b60606107c3611931565b156107d9576107d28383611953565b90506107f5565b6107e1611a6d565b6107eb8383611953565b90506107f5611aaf565b92915050565b60096020526000908152604090205481565b600a6020526000908152604090205460ff1681565b61082a611adf565b61083381611b4e565b61083b611b93565b610843611ba7565b50565b61084e61456a565b610856611931565b156108ec57835160005b8181146108e5576000610880846020015187611bd190919063ffffffff16565b905061088a61456a565b6108bb88848151811061089957fe5b6020026020010151838886815181106108ae57fe5b6020026020010151611bf0565b90506108c78582611d31565b9450868560200151106108db5750506108e5565b5050600101610860565b5050610966565b6108f4611a6d565b835160005b81811461095c576000610919846020015187611bd190919063ffffffff16565b905061092361456a565b61093288848151811061089957fe5b905061093e8582611d31565b94508685602001511061095257505061095c565b50506001016108f9565b5050610966611aaf565b9392505050565b610975611adf565b600061097f611dcc565b600083815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff90941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555061083b611b93565b6109e8611adf565b60006109f2611dcc565b9050600073ffffffffffffffffffffffffffffffffffffffff82163314610a195733610a1c565b60005b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600b60209081526040808320938516835292905220549091506001840190808211610a7157610a71610a6c858584611dfe565b611ea3565b73ffffffffffffffffffffffffffffffffffffffff8085166000818152600b602090815260408083209488168084529490915290819020859055517f82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f090610ad99086906154ce565b60405180910390a35050505061083b611b93565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b610b43614599565b610b4b611adf565b610b59858585856001611eab565b9050610b63611b93565b610b6b611ba7565b949350505050565b610b7b614599565b610b83611adf565b610b59858585856000611eab565b610b99611adf565b6000610ba3611dcc565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600860209081526040808320948916808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555192935090917fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190610c379086906154c3565b60405180910390a350610c48611b93565b610c50611ba7565b5050565b610c5c61456a565b610c64611931565b15610d2257835160005b8181146108e5578251600090610c8b90879063ffffffff611bd116565b90506000610cc8888481518110610c9e57fe5b602002602001015160a00151898581518110610cb657fe5b60200260200101516080015184612218565b9050610cd261456a565b610cf6898581518110610ce157fe5b6020026020010151838987815181106108ae57fe5b9050610d028682611d31565b955087866000015110610d17575050506108e5565b505050600101610c6e565b610d2a611a6d565b835160005b81811461095c578251600090610d4c90879063ffffffff611bd116565b90506000610d5f888481518110610c9e57fe5b9050610d6961456a565b610d78898581518110610ce157fe5b9050610d848682611d31565b955087866000015110610d995750505061095c565b505050600101610d2f565b600860209081526000928352604080842090915290825290205460ff1681565b600080610dd285858561225a565b90506005816008811115610de257fe5b1480610df957506007816008811115610df757fe5b145b15610e0e57610e0e610a6c60058787876122d9565b610e1a81868686612381565b95945050505050565b600760209081526000928352604080842090915290825290205460ff1681565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b610e676145c1565b610e6f611adf565b610b598585858560006125f1565b610e8561456a565b610e90848484610c54565b9050828160000151101561096657610966610a6c60008584600001516126de565b600080610ec9600154856126fd90919063ffffffff16565b9050610b6b848285612711565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6060610efc611931565b15610f9f578351604080518281526020808402820101909152818015610f3c57816020015b610f2961456a565b815260200190600190039081610f215790505b50915060005b8181146108e557610f80868281518110610f5857fe5b6020026020010151868381518110610f6c57fe5b60200260200101518684815181106108ae57fe5b838281518110610f8c57fe5b6020908102919091010152600101610f42565b610fa7611a6d565b8351604080518281526020808402820101909152818015610fe257816020015b610fcf61456a565b815260200190600190039081610fc75790505b50915060005b81811461095c57610ffe868281518110610f5857fe5b83828151811061100a57fe5b6020908102919091010152600101610fe8565b61102561184f565b7f3a3e76d7a75e198aef1f53137e4f2a8a2ec74e2e9526db8404d08ccc9f1e621d60035482604051611058929190615542565b60405180910390a1600355565b606061106f611adf565b83516040805182815260208084028201019091528180156110aa57816020015b61109761456a565b81526020019060019003908161108f5790505b50915060005b81811461111a576110fb8682815181106110c657fe5b60200260200101518683815181106110da57fe5b60200260200101518684815181106110ee57fe5b6020026020010151612797565b83828151811061110757fe5b60209081029190910101526001016110b0565b5050611124611b93565b610966611ba7565b61113461456a565b61113c611adf565b611147848484612797565b9050611124611b93565b6111596145f5565b61116282612839565b60408301526020820152608082015161118e578060015b9081600681111561118657fe5b905250610b36565b60a082015161119f57806002611179565b8160a001518160400151106111b657806005611179565b81610100015142106111ca57806004611179565b6020808201516000908152600a909152604090205460ff16156111ef57806006611179565b610120820151825173ffffffffffffffffffffffffffffffffffffffff9081166000908152600b60209081526040808320606088015190941683529290522054111561123d57806006611179565b60038152919050565b60008061125e6001548561286a90919063ffffffff16565b9050610b6b848285612879565b61127361456a565b61127e848484610846565b9050828160200151101561096657610966610a6c60018584602001516126de565b835160005b81811461130f576113078160001b8783815181106112be57fe5b60200260200101518784815181106112d257fe5b60200260200101518785815181106112e657fe5b60200260200101518786815181106112fa57fe5b60200260200101516128ce565b6001016112a4565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134290615915565b60405180910390fd5b6113536145c1565b61135b611adf565b610b598585858560016125f1565b6060611373611adf565b83516040805182815260208084028201019091528180156113ae57816020015b61139b61456a565b8152602001906001900390816113935790505b50915060005b81811461111a576113ff8682815181106113ca57fe5b60200260200101518683815181106113de57fe5b60200260200101518684815181106113f257fe5b6020026020010151612a92565b83828151811061140b57fe5b60209081029190910101526001016113b4565b61142661184f565b61084381611896565b60015481565b61143d61184f565b60008173ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561148557600080fd5b505afa158015611499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114bd9190810190614f14565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205490915073ffffffffffffffffffffffffffffffffffffffff16801561151b5761151b610a6c8383612ac5565b7fffffffff0000000000000000000000000000000000000000000000000000000082166000908152600260205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c03194906115bc9084908690615657565b60405180910390a1505050565b600b60209081526000928352604080842090915290825290205481565b7f20c13b0b0000000000000000000000000000000000000000000000000000000081565b611612611adf565b805160005b8181146116425761163a83828151811061162d57fe5b6020026020010151611b4e565b600101611617565b505061083b611b93565b61165461456a565b61165c611adf565b611147848484612a92565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b61168b61184f565b73ffffffffffffffffffffffffffffffffffffffff81166116b6576116b1610a6c612b67565b610843565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6060611730611931565b156117cd57825160408051828152602080840282010190915281801561176a57816020015b60608152602001906001900390816117555790505b50915060005b8181146117c6576117a785828151811061178657fe5b602002602001015185838151811061179a57fe5b6020026020010151611953565b8382815181106117b357fe5b6020908102919091010152600101611770565b50506107f5565b6117d5611a6d565b825160408051828152602080840282010190915281801561180a57816020015b60608152602001906001900390816117f55790505b50915060005b8181146118455761182685828151811061178657fe5b83828151811061183257fe5b6020908102919091010152600101611810565b50506107f5611aaf565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107b1576000546107b190610a6c90339073ffffffffffffffffffffffffffffffffffffffff16612b9e565b6004546040517fe1a5430ebec577336427f40f15822f1f36c5e3509ff209d6db9e6c9e6941cb0b916118e29173ffffffffffffffffffffffffffffffffffffffff90911690849061537b565b60405180910390a1600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000547501000000000000000000000000000000000000000000900460ff1690565b6060600061196c600154856126fd90919063ffffffff16565b9050611979848483612bbb565b60608401516119888180612c8f565b60008281526005602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556080870151905160609130916119d6919061530d565b600060405180830381855af49150503d8060008114611a11576040519150601f19603f3d011682016040523d82523d6000602084013e611a16565b606091505b509150915081611a2d57611a2d610a6c8583612cf2565b611a38836000612c8f565b60405184907fa4a7329f1dd821363067e07d359e347b4af9b1efe4b6cccf13240228af3c800d90600090a29695505050505050565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690556107b1612d0f565b60005474010000000000000000000000000000000000000000900460ff1615611b0d57611b0d610a6c612d43565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b611b566145f5565b611b5f82611151565b9050611b6b8282612d7a565b600381516006811115611b7a57fe5b14611b855750610843565b610c50828260200151612e29565b611b9b611931565b6107b1576107b1612d0f565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b600082821115611bea57611bea610a6c60028585612ed2565b50900390565b611bf861456a565b6040516060907f9b44d5560000000000000000000000000000000000000000000000000000000090611c3290879087908790602401615a63565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060603073ffffffffffffffffffffffffffffffffffffffff1683604051611cba919061530d565b600060405180830381855af49150503d8060008114611cf5576040519150601f19603f3d011682016040523d82523d6000602084013e611cfa565b606091505b50915091508115611d2757805160a014611d1057fe5b80806020019051611d249190810190614f30565b93505b5050509392505050565b611d3961456a565b81518351611d4c9163ffffffff612ef116565b815260208083015190840151611d679163ffffffff612ef116565b602082015260408083015190840151611d859163ffffffff612ef116565b604082015260608083015190840151611da39163ffffffff612ef116565b606082015260808083015190840151611dc19163ffffffff612ef116565b608082015292915050565b60065460009073ffffffffffffffffffffffffffffffffffffffff16818115611df55781611df7565b335b9250505090565b6060634ad3127560e01b848484604051602401611e1d939291906153a2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b611eb3614599565b8551611ec657611ec6610a6c6000612f0d565b8451611ed957611ed9610a6c6001612f0d565b8351865114611eef57611eef610a6c6002612f0d565b8251855114611f0557611f05610a6c6003612f0d565b8551604051908082528060200260200182016040528015611f4057816020015b611f2d61456a565b815260200190600190039081611f255790505b5081528451604080518281526020808402820101909152908015611f7e57816020015b611f6b61456a565b815260200190600190039081611f635790505b506020820152600080611f8f614617565b88600081518110611f9c57fe5b60200260200101519050611fae614617565b88600081518110611fbb57fe5b602002602001015190506000611fd083612839565b9150506000611fde83612839565b915050611fe961456a565b611ff161456a565b611ff96145c1565b61202c87878f8c8151811061200a57fe5b60200260200101518f8c8151811061201e57fe5b60200260200101518f6125f1565b80516020015190915061204690869063ffffffff612ef116565b945061206381602001516020015185612ef190919063ffffffff16565b9350612073838260000151611d31565b9250612083828260200151611d31565b91506120a081604001518b60400151612ef190919063ffffffff16565b60408b0152606080820151908b01516120be9163ffffffff612ef116565b60608b015260a08701518510612169578951805160018b019a85929181106120e257fe5b60200260200101819052506040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525092508e5189141561214657818a60200151898151811061213557fe5b602002602001018190525050612207565b8e898151811061215257fe5b6020026020010151965061216587612839565b9550505b8560a00151841061220157818a6020015189806001019a508151811061218b57fe5b60200260200101819052506040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525091508d518814156121de57828a600001518a8151811061213557fe5b8d88815181106121ea57fe5b602002602001015195506121fd86612839565b9450505b50611ff1565b505050505050505095945050505050565b6000610b6b8361224e61223282600163ffffffff611bd116565b612242888763ffffffff612fac16565b9063ffffffff612ef116565b9063ffffffff612fdd16565b6000612267848484613007565b905073ffffffffffffffffffffffffffffffffffffffff831661229457612294610a6c60068686866122d9565b600881818111156122a157fe5b60ff16106122b9576122b9610a6c60038686866122d9565b60008160088111156122c757fe5b141561096657610966610a6c60048686865b6060637e5a231860e01b858585856040516024016122fa94939291906158ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050949350505050565b6000600185600881111561239157fe5b14156123b85781516001146123b0576123b0610a6c60028686866122d9565b506000610b6b565b60028560088111156123c657fe5b14156124bf5781516042146123e5576123e5610a6c60028686866122d9565b6000826000815181106123f457fe5b016020015160f81c9050600061241184600163ffffffff61304616565b9050600061242685602163ffffffff61304616565b905060006001888585856040516000815260200160405260405161244d949392919061560c565b6020604051602081039080840390855afa15801561246f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8981169116149550610b6b945050505050565b60038560088111156124cd57fe5b141561257a5781516042146124ec576124ec610a6c60028686866122d9565b6000826000815181106124fb57fe5b016020015160f81c9050600061251884600163ffffffff61304616565b9050600061252d85602163ffffffff61304616565b905060006001886040516020016125449190615329565b604051602081830303815290604052805190602001208585856040516000815260200160405260405161244d949392919061560c565b600485600881111561258857fe5b14156125a057612599848484613070565b9050610b6b565b60068560088111156125ae57fe5b146125b557fe5b50600083815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205460ff16949350505050565b6125f96145c1565b6101608087015161014080880191909152870151908601526126196145f5565b61262287611151565b905061262c6145f5565b61263587611151565b90506000612641611dcc565b905061264f8984838a613266565b61265b88838389613266565b61266f89898560200151856020015161337e565b6126888989856040015185604001516003543a8b6133c3565b93506126a38982856020015186604001518860000151613518565b6126bc8882846020015185604001518860200151613518565b6126d2836020015183602001518b8b85896135f6565b50505095945050505050565b60606318e4b14160e01b848484604051602401611e1d9392919061589e565b60006109668261270c8561379d565b613825565b60608301516000908161272585838661225a565b9050600581600881111561273557fe5b141561275757612750612748878761385f565b868487613897565b925061278e565b600781600881111561276557fe5b141561277f57612750612778878761385f565b838661394b565b61278b81868487612381565b92505b50509392505050565b61279f61456a565b6127a76145f5565b6127b085611151565b905060006127bc611dcc565b90506127ca86838387613266565b60006127e783604001518860a00151611bd190919063ffffffff16565b905060006127f5878361395a565b905061280588826003543a613970565b945060008460200151905061282189858388604001518a613518565b61282d818a86896139e7565b50505050509392505050565b6000806128516001548461286a90919063ffffffff16565b6000818152600960205260409020549092509050915091565b60006109668261270c85613a7e565b82516000908161288a85838661225a565b9050600581600881111561289a57fe5b14156128ad576127506127488787613b55565b60078160088111156128bb57fe5b141561277f576127506127788787613b55565b8015612a8b5760208451816128df57fe5b066004146128f6576128f6610a6c60008787613b8d565b6000612908858263ffffffff613bac16565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205490915073ffffffffffffffffffffffffffffffffffffffff168061296757612967610a6c60018989613b8d565b6040516060907fa85e59e400000000000000000000000000000000000000000000000000000000906129a39089908990899089906024016156b2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608373ffffffffffffffffffffffffffffffffffffffff1683604051612a2b919061530d565b6000604051808303816000865af19150503d8060008114612a68576040519150601f19603f3d011682016040523d82523d6000602084013e612a6d565b606091505b509150915081612a8557612a85610a6c8b8b84613bf8565b50505050505b5050505050565b612a9a61456a565b612aa5848484612797565b90508281602001511461096657610966610a6c60028584602001516126de565b60606311c7b72060e01b8383604051602401612ae2929190615657565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060631de45ad160e01b8383604051602401612ae292919061537b565b82602001514210612bd457612bd4610a6c600183613c17565b60408301513a8114612bee57612bee610a6c833a84613c34565b60065473ffffffffffffffffffffffffffffffffffffffff168015612c1a57612c1a610a6c8483613c53565b60008381526005602052604090205460ff1615612c3f57612c3f610a6c600085613c17565b606085015173ffffffffffffffffffffffffffffffffffffffff81163314801590612c725750612c70868587612711565b155b15612c8757612c87610a6c60018684896122d9565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff82163314610c50576006805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790555050565b60606320d11f6160e01b8383604051602401612ae2929190615550565b47801561084357604051339082156108fc029083906000818181858888f19350505050158015610c50573d6000803e3d6000fd5b60408051808201909152600481527f0c3b823f00000000000000000000000000000000000000000000000000000000602082015290565b606082015173ffffffffffffffffffffffffffffffffffffffff1615612dce57606082015173ffffffffffffffffffffffffffffffffffffffff163314612dce57612dce610a6c6002836020015133613c70565b6000612dd8611dcc565b90508073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614612e2457612e24610a6c6000846020015184613c70565b505050565b6000818152600a60205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558281015183516101408501516101608601519351859473ffffffffffffffffffffffffffffffffffffffff9485169493909316927f02c310a9a43963ff31a754a4099cc435ed498049687539d72d7818d9b093415c92612ec692909190339061571a565b60405180910390a45050565b606063e946c1bb60e01b848484604051602401611e1d93929190615845565b60008282018381101561096657610966610a6c60008686612ed2565b606063d4092f4f60e01b82604051602401612f289190615832565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b600082612fbb575060006107f5565b82820282848281612fc857fe5b041461096657610966610a6c60018686612ed2565b600081612ff357612ff3610a6c60038585612ed2565b6000828481612ffe57fe5b04949350505050565b600081516000141561302357613023610a6c60028686866122d9565b8160018351038151811061303357fe5b016020015160f81c6008811115610b6b57fe5b6000816020018351101561306757613067610a6c6005855185602001613c8f565b50016020015190565b80516000906130a7837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830163ffffffff613cae16565b6040516060907f1626ba7e00000000000000000000000000000000000000000000000000000000906130df9088908790602401615550565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061316e848363ffffffff613cae16565b600060608673ffffffffffffffffffffffffffffffffffffffff1683604051613197919061530d565b600060405180830381855afa9150503d80600081146131d2576040519150601f19603f3d011682016040523d82523d6000602084013e6131d7565b606091505b50915091508180156131ea575080516020145b1561324c577fb06713810000000000000000000000000000000000000000000000000000000061322182600063ffffffff613bac16565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614945050505050610966565b61325b610a6c89898985613cb2565b505050509392505050565b60038351600681111561327557fe5b1461328f5761328f610a6c84602001518560000151613cd3565b606084015173ffffffffffffffffffffffffffffffffffffffff16156132e357606084015173ffffffffffffffffffffffffffffffffffffffff1633146132e3576132e3610a6c6002856020015133613c70565b602084015173ffffffffffffffffffffffffffffffffffffffff161561334d578173ffffffffffffffffffffffffffffffffffffffff16846020015173ffffffffffffffffffffffffffffffffffffffff161461334d5761334d610a6c6001856020015185613c70565b61335c84846020015183612879565b61337857613378610a6c600085602001518760000151856122d9565b50505050565b60a080840151908501516133979163ffffffff612fac16565b608080850151908601516133b09163ffffffff612fac16565b101561337857613378610a6c8383613cf0565b6133cb6145c1565b60a08801516000906133e3908863ffffffff611bd116565b905060006133fa8a608001518b60a0015184613d0d565b90506000613415888b60a00151611bd190919063ffffffff16565b9050600061342c8b608001518c60a0015184613d0d565b90508515613449576134428c8c85878587613d41565b945061345a565b6134578c8c85878587613e13565b94505b84515160808d015160c08e0151613472929190613d0d565b85516040015284516020015160a08d015160e08e0151613493929190613d0d565b85516060015260208501515160808c015160c08d01516134b4929190613d0d565b856020015160400181815250506134dc8560200151602001518c60a001518d60e00151613d0d565b60208601516060015260006134f7888a63ffffffff612fac16565b86516080908101829052602088015101525050505050979650505050505050565b602081015161352e90839063ffffffff612ef116565b600960008581526020019081526020016000208190555082856040015173ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff167f6869791f0a34781b29882982cc39e882768cf2c96995c2a110c577c53bc932d58861014001518961016001518a61018001518b6101a001518b338a600001518b602001518c604001518d606001518e608001516040516135e79b9a99989796959493929190615766565b60405180910390a45050505050565b835183516040808701519086015161014087015185516020015161361f918b91869088906128ce565b6136398a89610140015186868960200151602001516128ce565b6136538988610180015185848960200151604001516128ce565b61366d8a89610180015186858960000151604001516128ce565b6136838a896101400151868989604001516128ce565b61369989886101400151858989606001516128ce565b60006136b18b8b88600001516080015188888c613eac565b9050806136ce578551600060809182018190526020880151909101525b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614801561371e57506101a080890151908a015161371e9163ffffffff613f0816565b1561375c576137578b8a6101a0015189866137528b60200151606001518c6000015160600151612ef190919063ffffffff16565b6128ce565b613790565b6137768a896101a0015189858a60200151606001516128ce565b6137908b8a6101a0015189868a60000151606001516128ce565b5050505050505050505050565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc71541508815294850195909552908301919091529481019490945273ffffffffffffffffffffffffffffffffffffffff9091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6040516060907fde047db40000000000000000000000000000000000000000000000000000000090612ae29085908590602401615a8e565b805160009060158110156138b5576138b5610a6c60028787876122d9565b60006138e9847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb840163ffffffff613f2d16565b73ffffffffffffffffffffffffffffffffffffffff80871660009081526008602090815260408083209385168352929052205490915060ff1661393357613933610a6c8683613f6d565b6139408188866015613f8a565b979650505050505050565b6000610b6b8385846001613f8a565b60008183106139695781610966565b5090919050565b61397861456a565b6020810184905260a08501516080860151613994918691613d0d565b815260a085015160c08601516139ab918691613d0d565b604082015260a085015160e08601516139c5918691613d0d565b60608201526139da828463ffffffff612fac16565b6080820152949350505050565b613a018484610160015184866000015185602001516128ce565b613a1b8484610140015185600001518585600001516128ce565b613a3584846101a0015184866040015185606001516128ce565b613a53848461018001518560000151866040015185604001516128ce565b6000613a69858360800151866000015186614161565b905080612a8b57600060808301525050505050565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613aca57fe5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b6040516060907f3efe50c80000000000000000000000000000000000000000000000000000000090612ae29085908590602401615a41565b606063488219a660e01b848484604051602401611e1d9392919061580a565b60008160040183511015613bcd57613bcd610a6c6003855185600401613c8f565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6060634678472b60e01b848484604051602401611e1d93929190615569565b606063f598518460e01b8383604051602401612ae29291906158fe565b606063a26dac0960e01b848484604051602401611e1d939291906155f6565b606063dec4aedf60e01b8383604051602401612ae29291906154d7565b606063e53c76c860e01b848484604051602401611e1d93929190615866565b6060632800659560e01b848484604051602401611e1d939291906158ac565b9052565b6060631b8388f760e01b858585856040516024016122fa94939291906154fb565b606063fdb6ca8d60e01b8383604051602401612ae2929190615594565b606063b6555d6f60e01b8383604051602401612ae2929190615542565b6000613d1a8484846141a6565b15613d2d57613d2d610a6c85858561420c565b610b6b8361224e868563ffffffff612fac16565b613d496145c1565b81851184841184861115613d6957613d6289868661422b565b9250613db8565b86841115613da95782518790528251602001869052608088015160a0890151613d93919089613d0d565b6020808501805192909252905101879052613db8565b613db587878787614268565b92505b8115613dde576020808401510151835151613dd89163ffffffff611bd116565b60408401525b8015613e065782516020908101519084015151613e009163ffffffff611bd116565b60608401525b50505b9695505050505050565b613e1b6145c1565b82841115613e3557613e2e87848461422b565b9050613e83565b82841015613e745780518590528051602090810185905281015184905260a08601516080870151613e67919086614293565b6020808301510152613e83565b613e8085858585614268565b90505b6020808201510151815151613e9d9163ffffffff611bd116565b60408201529695505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff168015613efe57476000613edf8a84848b8b8a6142cb565b9050613ef189848385038b8a8a6142cb565b5060019350505050613e09565b6000915050613e09565b6000815183511480156109665750508051602091820120825192909101919091201490565b60008160140183511015613f4e57613f4e610a6c6004855185601401613c8f565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b606063a15c0d0660e01b8383604051602401612ae292919061537b565b8151600090613fa18484830363ffffffff613cae16565b6040516060907f20c13b0b0000000000000000000000000000000000000000000000000000000090613fd990889088906024016156f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050614068858363ffffffff613cae16565b600060608873ffffffffffffffffffffffffffffffffffffffff1683604051614091919061530d565b600060405180830381855afa9150503d80600081146140cc576040519150601f19603f3d011682016040523d82523d6000602084013e6140d1565b606091505b50915091508180156140e4575080516020145b15614146577f20c13b0b0000000000000000000000000000000000000000000000000000000061411b82600063ffffffff613bac16565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614945050505050610b6b565b614155610a6c8a8a8a85614403565b50505050949350505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff16801561419c576141918682478888886142cb565b506001915050610b6b565b6000915050610b6b565b6000826141b8576141b8610a6c614424565b8115806141c3575083155b156141d057506000610966565b600083806141da57fe5b85840990506141ef858463ffffffff612fac16565b614201826103e863ffffffff612fac16565b101595945050505050565b606063339f3de260e01b848484604051602401611e1d939291906155f6565b6142336145c1565b60208082018051859052518101839052815101839052608084015160a085015161425e919085613d0d565b8151529392505050565b6142706145c1565b805194909452835160209081019390935282840180519290925290519091015290565b60006142a084848461445b565b156142b3576142b3610a6c85858561420c565b610b6b8361224e61223282600163ffffffff611bd116565b60008385106142d75750825b6040516060907fa3b4a3270000000000000000000000000000000000000000000000000000000090614311908690869089906024016153a2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608873ffffffffffffffffffffffffffffffffffffffff16848460405161439a919061530d565b60006040518083038185875af1925050503d80600081146143d7576040519150601f19603f3d011682016040523d82523d6000602084013e6143dc565b606091505b5091509150816143f6576143f6610a6c8b898989866144bf565b5050509695505050505050565b6060635bd0428d60e01b858585856040516024016122fa94939291906153d3565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b60008261446d5761446d610a6c614424565b811580614478575083155b1561448557506000610966565b6000838061448f57fe5b8584099050836144a5818363ffffffff611bd116565b816144ac57fe5b0690506141ef858463ffffffff612fac16565b60606387cb1e7560e01b86868686866040516024016144e29594939291906155b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905095945050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040518060800160405280606081526020016060815260200160008152602001600081525090565b60405180608001604052806145d461456a565b81526020016145e161456a565b815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b803573ffffffffffffffffffffffffffffffffffffffff811681146107f557600080fd5b600082601f830112614712578081fd5b813561472561472082615b1f565b615af8565b81815291506020808301908481018184028601820187101561474657600080fd5b60005b8481101561476d5761475b88836146de565b84529282019290820190600101614749565b505050505092915050565b600082601f830112614788578081fd5b813561479661472082615b1f565b8181529150602080830190840160005b838110156147d3576147be8760208435890101614896565b835260209283019291909101906001016147a6565b5050505092915050565b600082601f8301126147ed578081fd5b81356147fb61472082615b1f565b8181529150602080830190840160005b838110156147d357614823876020843589010161491d565b8352602092830192919091019060010161480b565b600082601f830112614848578081fd5b813561485661472082615b1f565b81815291506020808301908481018184028601820187101561487757600080fd5b60005b8481101561476d5781358452928201929082019060010161487a565b600082601f8301126148a6578081fd5b813567ffffffffffffffff8111156148bc578182fd5b6148ed60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601615af8565b915080825283602082850101111561490457600080fd5b8060208401602084013760009082016020015292915050565b60006101c0808385031215614930578182fd5b61493981615af8565b91505061494683836146de565b815261495583602084016146de565b602082015261496783604084016146de565b604082015261497983606084016146de565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff808211156149db57600080fd5b6149e786838701614896565b83850152610160925082850135915080821115614a0357600080fd5b614a0f86838701614896565b83850152610180925082850135915080821115614a2b57600080fd5b614a3786838701614896565b838501526101a0925082850135915080821115614a5357600080fd5b50614a6085828601614896565b82840152505092915050565b600060a08284031215614a7d578081fd5b614a8760a0615af8565b90508135815260208201356020820152604082013560408201526060820135614aaf81615b89565b6060820152608082013567ffffffffffffffff811115614ace57600080fd5b614ada84828501614896565b60808301525092915050565b600060208284031215614af7578081fd5b61096683836146de565b60008060408385031215614b13578081fd5b614b1d84846146de565b9150614b2c84602085016146de565b90509250929050565b60008060408385031215614b47578182fd5b614b5184846146de565b915060208301358015158114614b65578182fd5b809150509250929050565b60008060008060808587031215614b85578182fd5b843567ffffffffffffffff80821115614b9c578384fd5b614ba888838901614778565b95506020870135915080821115614bbd578384fd5b614bc988838901614702565b94506040870135915080821115614bde578384fd5b614bea88838901614702565b93506060870135915080821115614bff578283fd5b50614c0c87828801614838565b91505092959194509250565b600060208284031215614c29578081fd5b813567ffffffffffffffff811115614c3f578182fd5b610b6b848285016147dd565b60008060008060808587031215614c60578182fd5b843567ffffffffffffffff80821115614c77578384fd5b614c83888389016147dd565b95506020870135915080821115614c98578384fd5b614ca4888389016147dd565b94506040870135915080821115614cb9578384fd5b614cc588838901614778565b93506060870135915080821115614cda578283fd5b50614c0c87828801614778565b600080600060608486031215614cfb578081fd5b833567ffffffffffffffff80821115614d12578283fd5b614d1e878388016147dd565b94506020860135915080821115614d33578283fd5b614d3f87838801614838565b93506040860135915080821115614d54578283fd5b50614d6186828701614778565b9150509250925092565b600080600060608486031215614d7f578081fd5b833567ffffffffffffffff80821115614d96578283fd5b614da2878388016147dd565b9450602086013593506040860135915080821115614d54578283fd5b60008060408385031215614dd0578182fd5b823567ffffffffffffffff80821115614de7578384fd5b81850186601f820112614df8578485fd5b80359250614e0861472084615b1f565b83815260208082019190838101885b87811015614e4057614e2e8c848435890101614a6c565b85529382019390820190600101614e17565b50919750880135945050505080821115614e58578283fd5b50614e6585828601614778565b9150509250929050565b600060208284031215614e80578081fd5b5035919050565b60008060408385031215614e99578182fd5b823591506020830135614b6581615b89565b600080600060608486031215614ebf578081fd5b833592506020840135614ed181615b89565b9150604084013567ffffffffffffffff811115614eec578182fd5b614d6186828701614896565b600060208284031215614f09578081fd5b813561096681615bab565b600060208284031215614f25578081fd5b815161096681615bab565b600060a08284031215614f41578081fd5b614f4b60a0615af8565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215614f92578081fd5b813567ffffffffffffffff811115614fa8578182fd5b610b6b8482850161491d565b60008060408385031215614fc6578182fd5b823567ffffffffffffffff80821115614fdd578384fd5b614fe98683870161491d565b93506020850135915080821115614ffe578283fd5b50614e6585828601614896565b60008060008060808587031215615020578182fd5b843567ffffffffffffffff80821115615037578384fd5b6150438883890161491d565b95506020870135915080821115615058578384fd5b6150648883890161491d565b94506040870135915080821115615079578384fd5b61508588838901614896565b9350606087013591508082111561509a578283fd5b50614c0c87828801614896565b6000806000606084860312156150bb578081fd5b833567ffffffffffffffff808211156150d2578283fd5b6150de8783880161491d565b94506020860135935060408601359150808211156150fa578283fd5b50614d6186828701614896565b60008060408385031215615119578182fd5b823567ffffffffffffffff80821115615130578384fd5b614fe986838701614a6c565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156151925761517c8683516151e6565b60a0959095019460209190910190600101615169565b5093949350505050565b600081518084526151b4816020860160208601615b3f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b80518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b60006101c061522684845161513c565b6020830151615238602086018261513c565b50604083015161524b604086018261513c565b50606083015161525e606086018261513c565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152506101408084015182828701526152b78387018261519c565b915050610160915081840151858203838701526152d4828261519c565b9250505061018080840151858303828701526152f0838261519c565b9150506101a091508184015185820383870152613e09828261519c565b6000825161531f818460208701615b3f565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff8616825260806020830152615402608083018661519c565b8281036040840152615414818661519c565b8381036060850152615426818661519c565b98975050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156154a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261549185835161519c565b94509285019290850190600101615457565b5092979650505050505050565b6000602082526109666020830184615156565b901515815260200190565b90815260200190565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600085825273ffffffffffffffffffffffffffffffffffffffff8516602083015260806040830152615530608083018561519c565b8281036060840152613940818561519c565b918252602082015260400190565b600083825260406020830152610b6b604083018461519c565b600084825260606020830152615582606083018561519c565b8281036040840152613e09818561519c565b828152604081016155a483615b7f565b8260208301529392505050565b600086825285602083015273ffffffffffffffffffffffffffffffffffffffff808616604084015280851660608401525060a0608083015261394060a083018461519c565b9283526020830191909152604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000092909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060208252610966602083018461519c565b6000608082526156c5608083018761519c565b73ffffffffffffffffffffffffffffffffffffffff95861660208401529390941660408201526060015292915050565b600060408252615708604083018561519c565b8281036020840152610e1a818561519c565b60006060825261572d606083018661519c565b828103602084015261573f818661519c565b91505073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600061016080835261577a8184018f61519c565b838103602085015261578c818f61519c565b91505082810360408401526157a1818d61519c565b83810360608501526157b3818d61519c565b73ffffffffffffffffffffffffffffffffffffffff9b8c16608086015299909a1660a0840152505060c081019590955260e08501939093526101008401919091526101208301526101409091015295945050505050565b600061581585615b6b565b84825283602083015260606040830152610e1a606083018461519c565b6020810161583f83615b75565b91905290565b6060810161585285615b75565b938152602081019290925260409091015290565b606081016003851061587457fe5b938152602081019290925273ffffffffffffffffffffffffffffffffffffffff1660409091015290565b606081016003851061585257fe5b606081016008851061585257fe5b60006158c586615b7f565b85825284602083015273ffffffffffffffffffffffffffffffffffffffff8416604083015260806060830152613e09608083018461519c565b6040810161590b84615b6b565b9281526020015290565b60208082526014908201527f5452414e53464552535f5355434345535346554c000000000000000000000000604082015260600190565b60006020825282516080602084015261596860a0840182615156565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08482030160408501526159a38183615156565b604086015160608601526060860151608086015280935050505092915050565b60a081016107f582846151e6565b6000610180820190506159e58284516151e6565b60208301516159f760a08401826151e6565b5060408301516101408301526060909201516101609091015290565b81516060820190615a2381615b7f565b80835250602083015160208301526040830151604083015292915050565b600060408252615a546040830185615216565b90508260208301529392505050565b600060608252615a766060830186615216565b8460208401528281036040840152613e09818561519c565b60006040825283516040830152602084015160608301526040840151608083015273ffffffffffffffffffffffffffffffffffffffff60608501511660a0830152608084015160a060c0840152615ae860e084018261519c565b9150508260208301529392505050565b60405181810167ffffffffffffffff81118282101715615b1757600080fd5b604052919050565b600067ffffffffffffffff821115615b35578081fd5b5060209081020190565b60005b83811015615b5a578181015183820152602001615b42565b838111156133785750506000910152565b6002811061084357fe5b6004811061084357fe5b6007811061084357fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461084357600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461084357600080fd5b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a090209056fea365627a7a72315820897f450a05992000843ffc258f91408c60af4df0c5e254daaee4892d72aa3da26c6578706572696d656e74616cf564736f6c63430005100040" }, "deployedBytecode": { - "object": "0x6080604052600436106102dc5760003560e01c80638d45cd2311610184578063beee2e14116100d6578063dd885e2d1161008a578063eea086ba11610064578063eea086ba14610735578063f2fde38b1461074a578063fc74896d1461076a576102dc565b8063dd885e2d146106ed578063dedfc1f11461070f578063e14b58c414610722576102dc565b8063c26cfecd116100bb578063c26cfecd14610698578063c585bb93146106ad578063d9bfa73e146106cd576102dc565b8063beee2e1414610665578063c0fa16cc14610678576102dc565b80639b44d55611610138578063a6c3bf3311610112578063a6c3bf331461061f578063b04fbddd14610632578063b718e29214610652576102dc565b80639b44d556146105bf5780639d3fa4b9146105d2578063a12dcc6f146105ff576102dc565b80638ea8dfe4116101695780638ea8dfe41461056c5780639331c7421461058c5780639694a402146105ac576102dc565b80638d45cd23146105375780638da5cb5b14610557576102dc565b8063607041081161023d5780637b8e3514116101f1578063850a1501116101cb578063850a1501146104ef57806388ec79fb146105045780638bc8efb314610524576102dc565b80637b8e35141461048f5780638171c407146104af57806382c174d0146104cf576102dc565b80636fcf3e9e116102225780636fcf3e9e1461045657806377fcce681461046957806378d29ac11461047c576102dc565b806360704108146104095780636a1a80fd14610436576102dc565b80632ac1262211610294578063369da09911610279578063369da099146103c357806346c02d7a146103e35780634f9559b1146103f6576102dc565b80632ac12622146103905780632da62987146103b0576102dc565b80631ce4c78b116102c55780631ce4c78b1461032e5780632280c91014610350578063288cdc9114610370576102dc565b80630228e168146102e15780630efca18514610317575b600080fd5b3480156102ed57600080fd5b506103016102fc366004614e6f565b61078a565b60405161030e91906154c3565b60405180910390f35b34801561032357600080fd5b5061032c61079f565b005b34801561033a57600080fd5b506103436107b3565b60405161030e91906154ce565b61036361035e366004615107565b6107b9565b60405161030e919061569f565b34801561037c57600080fd5b5061034361038b366004614e6f565b6107fb565b34801561039c57600080fd5b506103016103ab366004614e6f565b61080d565b61032c6103be366004614f81565b610822565b6103d66103d1366004614d6b565b610846565b60405161030e91906159c1565b61032c6103f1366004614e6f565b61096d565b61032c610404366004614e6f565b6109e0565b34801561041557600080fd5b50610429610424366004614ef8565b610aed565b60405161030e919061535a565b610449610444366004614c4b565b610b3b565b60405161030e919061594a565b610449610464366004614c4b565b610b73565b61032c610477366004614b35565b610b91565b6103d661048a366004614d6b565b610c54565b34801561049b57600080fd5b506103016104aa366004614b01565b610da4565b3480156104bb57600080fd5b506103016104ca366004614eab565b610dc4565b3480156104db57600080fd5b506103016104ea366004614e87565b610e23565b3480156104fb57600080fd5b50610429610e43565b61051761051236600461500b565b610e5f565b60405161030e91906159cf565b6103d6610532366004614d6b565b610e7d565b34801561054357600080fd5b50610301610552366004615107565b610eb1565b34801561056357600080fd5b50610429610ed6565b61057f61057a366004614ce7565b610ef2565b60405161030e91906154b0565b34801561059857600080fd5b5061032c6105a7366004614e6f565b61101d565b61057f6105ba366004614ce7565b611065565b6103d66105cd3660046150a7565b61112c565b3480156105de57600080fd5b506105f26105ed366004614f81565b611151565b60405161030e9190615a11565b34801561060b57600080fd5b5061030161061a366004614fb4565b611246565b6103d661062d366004614d6b565b61126b565b34801561063e57600080fd5b5061032c61064d366004614b70565b61129f565b61051761066036600461500b565b61134b565b61057f610673366004614ce7565b611369565b34801561068457600080fd5b5061032c610693366004614ae6565b61141e565b3480156106a457600080fd5b5061034361142f565b3480156106b957600080fd5b5061032c6106c8366004614ae6565b611435565b3480156106d957600080fd5b506103436106e8366004614b01565b6115c9565b3480156106f957600080fd5b506107026115e6565b60405161030e919061562a565b61032c61071d366004614c18565b61160a565b6103d66107303660046150a7565b61164c565b34801561074157600080fd5b50610429611667565b34801561075657600080fd5b5061032c610765366004614ae6565b611683565b61077d610778366004614dbe565b611726565b60405161030e9190615432565b60056020526000908152604090205460ff1681565b6107a761184f565b6107b16000611896565b565b60035481565b60606107c3611931565b156107d9576107d28383611953565b90506107f5565b6107e1611a6d565b6107eb8383611953565b90506107f5611aaf565b92915050565b60096020526000908152604090205481565b600a6020526000908152604090205460ff1681565b61082a611adf565b61083381611b4e565b61083b611b93565b610843611ba7565b50565b61084e61456a565b610856611931565b156108ec57835160005b8181146108e5576000610880846020015187611bd190919063ffffffff16565b905061088a61456a565b6108bb88848151811061089957fe5b6020026020010151838886815181106108ae57fe5b6020026020010151611bf0565b90506108c78582611d31565b9450868560200151106108db5750506108e5565b5050600101610860565b5050610966565b6108f4611a6d565b835160005b81811461095c576000610919846020015187611bd190919063ffffffff16565b905061092361456a565b61093288848151811061089957fe5b905061093e8582611d31565b94508685602001511061095257505061095c565b50506001016108f9565b5050610966611aaf565b9392505050565b610975611adf565b600061097f611dcc565b600083815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff90941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555061083b611b93565b6109e8611adf565b60006109f2611dcc565b9050600073ffffffffffffffffffffffffffffffffffffffff82163314610a195733610a1c565b60005b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600b60209081526040808320938516835292905220549091506001840190808211610a7157610a71610a6c858584611dfe565b611ea3565b73ffffffffffffffffffffffffffffffffffffffff8085166000818152600b602090815260408083209488168084529490915290819020859055517f82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f090610ad99086906154ce565b60405180910390a35050505061083b611b93565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b610b43614599565b610b4b611adf565b610b59858585856001611eab565b9050610b63611b93565b610b6b611ba7565b949350505050565b610b7b614599565b610b83611adf565b610b59858585856000611eab565b610b99611adf565b6000610ba3611dcc565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600860209081526040808320948916808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555192935090917fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190610c379086906154c3565b60405180910390a350610c48611b93565b610c50611ba7565b5050565b610c5c61456a565b610c64611931565b15610d2257835160005b8181146108e5578251600090610c8b90879063ffffffff611bd116565b90506000610cc8888481518110610c9e57fe5b602002602001015160a00151898581518110610cb657fe5b60200260200101516080015184612218565b9050610cd261456a565b610cf6898581518110610ce157fe5b6020026020010151838987815181106108ae57fe5b9050610d028682611d31565b955087866000015110610d17575050506108e5565b505050600101610c6e565b610d2a611a6d565b835160005b81811461095c578251600090610d4c90879063ffffffff611bd116565b90506000610d5f888481518110610c9e57fe5b9050610d6961456a565b610d78898581518110610ce157fe5b9050610d848682611d31565b955087866000015110610d995750505061095c565b505050600101610d2f565b600860209081526000928352604080842090915290825290205460ff1681565b600080610dd285858561225a565b90506005816008811115610de257fe5b1480610df957506007816008811115610df757fe5b145b15610e0e57610e0e610a6c60058787876122d9565b610e1a81868686612381565b95945050505050565b600760209081526000928352604080842090915290825290205460ff1681565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b610e676145c1565b610e6f611adf565b610b598585858560006125f1565b610e8561456a565b610e90848484610c54565b9050828160000151101561096657610966610a6c60008584600001516126de565b600080610ec9600154856126fd90919063ffffffff16565b9050610b6b848285612711565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6060610efc611931565b15610f9f578351604080518281526020808402820101909152818015610f3c57816020015b610f2961456a565b815260200190600190039081610f215790505b50915060005b8181146108e557610f80868281518110610f5857fe5b6020026020010151868381518110610f6c57fe5b60200260200101518684815181106108ae57fe5b838281518110610f8c57fe5b6020908102919091010152600101610f42565b610fa7611a6d565b8351604080518281526020808402820101909152818015610fe257816020015b610fcf61456a565b815260200190600190039081610fc75790505b50915060005b81811461095c57610ffe868281518110610f5857fe5b83828151811061100a57fe5b6020908102919091010152600101610fe8565b61102561184f565b7f3a3e76d7a75e198aef1f53137e4f2a8a2ec74e2e9526db8404d08ccc9f1e621d60035482604051611058929190615542565b60405180910390a1600355565b606061106f611adf565b83516040805182815260208084028201019091528180156110aa57816020015b61109761456a565b81526020019060019003908161108f5790505b50915060005b81811461111a576110fb8682815181106110c657fe5b60200260200101518683815181106110da57fe5b60200260200101518684815181106110ee57fe5b6020026020010151612797565b83828151811061110757fe5b60209081029190910101526001016110b0565b5050611124611b93565b610966611ba7565b61113461456a565b61113c611adf565b611147848484612797565b9050611124611b93565b6111596145f5565b61116282612839565b60408301526020820152608082015161118e578060015b9081600681111561118657fe5b905250610b36565b60a082015161119f57806002611179565b8160a001518160400151106111b657806005611179565b81610100015142106111ca57806004611179565b6020808201516000908152600a909152604090205460ff16156111ef57806006611179565b610120820151825173ffffffffffffffffffffffffffffffffffffffff9081166000908152600b60209081526040808320606088015190941683529290522054111561123d57806006611179565b60038152919050565b60008061125e6001548561286a90919063ffffffff16565b9050610b6b848285612879565b61127361456a565b61127e848484610846565b9050828160200151101561096657610966610a6c60018584602001516126de565b835160005b81811461130f576113078160001b8783815181106112be57fe5b60200260200101518784815181106112d257fe5b60200260200101518785815181106112e657fe5b60200260200101518786815181106112fa57fe5b60200260200101516128ce565b6001016112a4565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134290615913565b60405180910390fd5b6113536145c1565b61135b611adf565b610b598585858560016125f1565b6060611373611adf565b83516040805182815260208084028201019091528180156113ae57816020015b61139b61456a565b8152602001906001900390816113935790505b50915060005b81811461111a576113ff8682815181106113ca57fe5b60200260200101518683815181106113de57fe5b60200260200101518684815181106113f257fe5b6020026020010151612a92565b83828151811061140b57fe5b60209081029190910101526001016113b4565b61142661184f565b61084381611896565b60015481565b61143d61184f565b60008173ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561148557600080fd5b505afa158015611499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114bd9190810190614f14565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205490915073ffffffffffffffffffffffffffffffffffffffff16801561151b5761151b610a6c8383612ac5565b7fffffffff0000000000000000000000000000000000000000000000000000000082166000908152600260205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c03194906115bc9084908690615657565b60405180910390a1505050565b600b60209081526000928352604080842090915290825290205481565b7f20c13b0b0000000000000000000000000000000000000000000000000000000081565b611612611adf565b805160005b8181146116425761163a83828151811061162d57fe5b6020026020010151611b4e565b600101611617565b505061083b611b93565b61165461456a565b61165c611adf565b611147848484612a92565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b61168b61184f565b73ffffffffffffffffffffffffffffffffffffffff81166116b6576116b1610a6c612b67565b610843565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6060611730611931565b156117cd57825160408051828152602080840282010190915281801561176a57816020015b60608152602001906001900390816117555790505b50915060005b8181146117c6576117a785828151811061178657fe5b602002602001015185838151811061179a57fe5b6020026020010151611953565b8382815181106117b357fe5b6020908102919091010152600101611770565b50506107f5565b6117d5611a6d565b825160408051828152602080840282010190915281801561180a57816020015b60608152602001906001900390816117f55790505b50915060005b8181146118455761182685828151811061178657fe5b83828151811061183257fe5b6020908102919091010152600101611810565b50506107f5611aaf565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107b1576000546107b190610a6c90339073ffffffffffffffffffffffffffffffffffffffff16612b9e565b6004546040517fe1a5430ebec577336427f40f15822f1f36c5e3509ff209d6db9e6c9e6941cb0b916118e29173ffffffffffffffffffffffffffffffffffffffff90911690849061537b565b60405180910390a1600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000547501000000000000000000000000000000000000000000900460ff1690565b6060600061196c600154856126fd90919063ffffffff16565b9050611979848483612bbb565b60608401516119888180612c8f565b60008281526005602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556080870151905160609130916119d6919061530d565b600060405180830381855af49150503d8060008114611a11576040519150601f19603f3d011682016040523d82523d6000602084013e611a16565b606091505b509150915081611a2d57611a2d610a6c8583612cf2565b611a38836000612c8f565b60405184907fa4a7329f1dd821363067e07d359e347b4af9b1efe4b6cccf13240228af3c800d90600090a29695505050505050565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690556107b1612d0f565b60005474010000000000000000000000000000000000000000900460ff1615611b0d57611b0d610a6c612d43565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b611b566145f5565b611b5f82611151565b9050611b6b8282612d7a565b600381516006811115611b7a57fe5b14611b855750610843565b610c50828260200151612e29565b611b9b611931565b6107b1576107b1612d0f565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b600082821115611bea57611bea610a6c60028585612ed2565b50900390565b611bf861456a565b6040516060907f9b44d5560000000000000000000000000000000000000000000000000000000090611c3290879087908790602401615a61565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060603073ffffffffffffffffffffffffffffffffffffffff1683604051611cba919061530d565b600060405180830381855af49150503d8060008114611cf5576040519150601f19603f3d011682016040523d82523d6000602084013e611cfa565b606091505b50915091508115611d2757805160a014611d1057fe5b80806020019051611d249190810190614f30565b93505b5050509392505050565b611d3961456a565b81518351611d4c9163ffffffff612ef116565b815260208083015190840151611d679163ffffffff612ef116565b602082015260408083015190840151611d859163ffffffff612ef116565b604082015260608083015190840151611da39163ffffffff612ef116565b606082015260808083015190840151611dc19163ffffffff612ef116565b608082015292915050565b60065460009073ffffffffffffffffffffffffffffffffffffffff16818115611df55781611df7565b335b9250505090565b6060634ad3127560e01b848484604051602401611e1d939291906153a2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b611eb3614599565b8551611ec657611ec6610a6c6000612f0d565b8451611ed957611ed9610a6c6001612f0d565b8351865114611eef57611eef610a6c6002612f0d565b8251855114611f0557611f05610a6c6003612f0d565b8551604051908082528060200260200182016040528015611f4057816020015b611f2d61456a565b815260200190600190039081611f255790505b5081528451604080518281526020808402820101909152908015611f7e57816020015b611f6b61456a565b815260200190600190039081611f635790505b506020820152600080611f8f614617565b88600081518110611f9c57fe5b60200260200101519050611fae614617565b88600081518110611fbb57fe5b602002602001015190506000611fd083612839565b9150506000611fde83612839565b915050611fe961456a565b611ff161456a565b611ff96145c1565b61202c87878f8c8151811061200a57fe5b60200260200101518f8c8151811061201e57fe5b60200260200101518f6125f1565b80516020015190915061204690869063ffffffff612ef116565b945061206381602001516020015185612ef190919063ffffffff16565b9350612073838260000151611d31565b9250612083828260200151611d31565b91506120a081604001518b60400151612ef190919063ffffffff16565b60408b0152606080820151908b01516120be9163ffffffff612ef116565b60608b015260a08701518510612169578951805160018b019a85929181106120e257fe5b60200260200101819052506040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525092508e5189141561214657818a60200151898151811061213557fe5b602002602001018190525050612207565b8e898151811061215257fe5b6020026020010151965061216587612839565b9550505b8560a00151841061220157818a6020015189806001019a508151811061218b57fe5b60200260200101819052506040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525091508d518814156121de57828a600001518a8151811061213557fe5b8d88815181106121ea57fe5b602002602001015195506121fd86612839565b9450505b50611ff1565b505050505050505095945050505050565b6000610b6b8361224e61223282600163ffffffff611bd116565b612242888763ffffffff612fac16565b9063ffffffff612ef116565b9063ffffffff612fdd16565b6000612267848484613007565b905073ffffffffffffffffffffffffffffffffffffffff831661229457612294610a6c60068686866122d9565b600881818111156122a157fe5b60ff16106122b9576122b9610a6c60038686866122d9565b60008160088111156122c757fe5b141561096657610966610a6c60048686865b6060637e5a231860e01b858585856040516024016122fa94939291906158b8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050949350505050565b6000600185600881111561239157fe5b14156123b85781516001146123b0576123b0610a6c60028686866122d9565b506000610b6b565b60028560088111156123c657fe5b14156124bf5781516042146123e5576123e5610a6c60028686866122d9565b6000826000815181106123f457fe5b016020015160f81c9050600061241184600163ffffffff61304616565b9050600061242685602163ffffffff61304616565b905060006001888585856040516000815260200160405260405161244d949392919061560c565b6020604051602081039080840390855afa15801561246f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8981169116149550610b6b945050505050565b60038560088111156124cd57fe5b141561257a5781516042146124ec576124ec610a6c60028686866122d9565b6000826000815181106124fb57fe5b016020015160f81c9050600061251884600163ffffffff61304616565b9050600061252d85602163ffffffff61304616565b905060006001886040516020016125449190615329565b604051602081830303815290604052805190602001208585856040516000815260200160405260405161244d949392919061560c565b600485600881111561258857fe5b14156125a057612599848484613070565b9050610b6b565b60068560088111156125ae57fe5b146125b557fe5b50600083815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205460ff16949350505050565b6125f96145c1565b6101608087015161014080880191909152870151908601526126196145f5565b61262287611151565b905061262c6145f5565b61263587611151565b90506000612641611dcc565b905061264f8984838a613266565b61265b88838389613266565b61266f89898560200151856020015161337e565b6126888989856040015185604001516003543a8b6133c3565b93506126a38982856020015186604001518860000151613518565b6126bc8882846020015185604001518860200151613518565b6126d2836020015183602001518b8b85896135f6565b50505095945050505050565b60606318e4b14160e01b848484604051602401611e1d9392919061589d565b60006109668261270c8561379d565b613825565b60608301516000908161272585838661225a565b9050600581600881111561273557fe5b141561275757612750612748878761385f565b868487613897565b925061278e565b600781600881111561276557fe5b141561277f57612750612778878761385f565b838661394b565b61278b81868487612381565b92505b50509392505050565b61279f61456a565b6127a76145f5565b6127b085611151565b905060006127bc611dcc565b90506127ca86838387613266565b60006127e783604001518860a00151611bd190919063ffffffff16565b905060006127f5878361395a565b905061280588826003543a613970565b945060008460200151905061282189858388604001518a613518565b61282d818a86896139e7565b50505050509392505050565b6000806128516001548461286a90919063ffffffff16565b6000818152600960205260409020549092509050915091565b60006109668261270c85613a7e565b82516000908161288a85838661225a565b9050600581600881111561289a57fe5b14156128ad576127506127488787613b55565b60078160088111156128bb57fe5b141561277f576127506127788787613b55565b8015612a8b5760208451816128df57fe5b066004146128f6576128f6610a6c60008787613b8d565b6000612908858263ffffffff613bac16565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205490915073ffffffffffffffffffffffffffffffffffffffff168061296757612967610a6c60018989613b8d565b6040516060907fa85e59e400000000000000000000000000000000000000000000000000000000906129a39089908990899089906024016156b2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608373ffffffffffffffffffffffffffffffffffffffff1683604051612a2b919061530d565b6000604051808303816000865af19150503d8060008114612a68576040519150601f19603f3d011682016040523d82523d6000602084013e612a6d565b606091505b509150915081612a8557612a85610a6c8b8b84613bf8565b50505050505b5050505050565b612a9a61456a565b612aa5848484612797565b90508281602001511461096657610966610a6c60028584602001516126de565b60606311c7b72060e01b8383604051602401612ae2929190615657565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060631de45ad160e01b8383604051602401612ae292919061537b565b82602001514210612bd457612bd4610a6c600183613c17565b60408301513a8114612bee57612bee610a6c833a84613c34565b60065473ffffffffffffffffffffffffffffffffffffffff168015612c1a57612c1a610a6c8483613c53565b60008381526005602052604090205460ff1615612c3f57612c3f610a6c600085613c17565b606085015173ffffffffffffffffffffffffffffffffffffffff81163314801590612c725750612c70868587612711565b155b15612c8757612c87610a6c60018684896122d9565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff82163314610c50576006805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790555050565b60606320d11f6160e01b8383604051602401612ae2929190615550565b47801561084357604051339082156108fc029083906000818181858888f19350505050158015610c50573d6000803e3d6000fd5b60408051808201909152600481527f0c3b823f00000000000000000000000000000000000000000000000000000000602082015290565b606082015173ffffffffffffffffffffffffffffffffffffffff1615612dce57606082015173ffffffffffffffffffffffffffffffffffffffff163314612dce57612dce610a6c6002836020015133613c70565b6000612dd8611dcc565b90508073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614612e2457612e24610a6c6000846020015184613c70565b505050565b6000818152600a60205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558281015183516101408501516101608601519351859473ffffffffffffffffffffffffffffffffffffffff9485169493909316927f02c310a9a43963ff31a754a4099cc435ed498049687539d72d7818d9b093415c92612ec692909190339061571a565b60405180910390a45050565b606063e946c1bb60e01b848484604051602401611e1d93929190615845565b60008282018381101561096657610966610a6c60008686612ed2565b606063d4092f4f60e01b82604051602401612f289190615832565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b600082612fbb575060006107f5565b82820282848281612fc857fe5b041461096657610966610a6c60018686612ed2565b600081612ff357612ff3610a6c60038585612ed2565b6000828481612ffe57fe5b04949350505050565b600081516000141561302357613023610a6c60028686866122d9565b8160018351038151811061303357fe5b016020015160f81c6008811115610b6b57fe5b6000816020018351101561306757613067610a6c6005855185602001613c8f565b50016020015190565b80516000906130a7837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830163ffffffff613cae16565b6040516060907f1626ba7e00000000000000000000000000000000000000000000000000000000906130df9088908790602401615550565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061316e848363ffffffff613cae16565b600060608673ffffffffffffffffffffffffffffffffffffffff1683604051613197919061530d565b600060405180830381855afa9150503d80600081146131d2576040519150601f19603f3d011682016040523d82523d6000602084013e6131d7565b606091505b50915091508180156131ea575080516020145b1561324c577fb06713810000000000000000000000000000000000000000000000000000000061322182600063ffffffff613bac16565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614945050505050610966565b61325b610a6c89898985613cb2565b505050509392505050565b60038351600681111561327557fe5b1461328f5761328f610a6c84602001518560000151613cd3565b606084015173ffffffffffffffffffffffffffffffffffffffff16156132e357606084015173ffffffffffffffffffffffffffffffffffffffff1633146132e3576132e3610a6c6002856020015133613c70565b602084015173ffffffffffffffffffffffffffffffffffffffff161561334d578173ffffffffffffffffffffffffffffffffffffffff16846020015173ffffffffffffffffffffffffffffffffffffffff161461334d5761334d610a6c6001856020015185613c70565b61335c84846020015183612879565b61337857613378610a6c600085602001518760000151856122d9565b50505050565b60a080840151908501516133979163ffffffff612fac16565b608080850151908601516133b09163ffffffff612fac16565b101561337857613378610a6c8383613cf0565b6133cb6145c1565b60a08801516000906133e3908863ffffffff611bd116565b905060006133fa8a608001518b60a0015184613d0d565b90506000613415888b60a00151611bd190919063ffffffff16565b9050600061342c8b608001518c60a0015184613d0d565b90508515613449576134428c8c85878587613d41565b945061345a565b6134578c8c85878587613e13565b94505b84515160808d015160c08e0151613472929190613d0d565b85516040015284516020015160a08d015160e08e0151613493929190613d0d565b85516060015260208501515160808c015160c08d01516134b4929190613d0d565b856020015160400181815250506134dc8560200151602001518c60a001518d60e00151613d0d565b60208601516060015260006134f7888a63ffffffff612fac16565b86516080908101829052602088015101525050505050979650505050505050565b602081015161352e90839063ffffffff612ef116565b600960008581526020019081526020016000208190555082856040015173ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff167f6869791f0a34781b29882982cc39e882768cf2c96995c2a110c577c53bc932d58861014001518961016001518a61018001518b6101a001518b338a600001518b602001518c604001518d606001518e608001516040516135e79b9a99989796959493929190615766565b60405180910390a45050505050565b835183516040808701519086015161014087015185516020015161361f918b91869088906128ce565b6136398a89610140015186868960200151602001516128ce565b6136538988610180015185848960200151604001516128ce565b61366d8a89610180015186858960000151604001516128ce565b6136838a896101400151868989604001516128ce565b61369989886101400151858989606001516128ce565b60006136b18b8b88600001516080015188888c613eac565b9050806136ce578551600060809182018190526020880151909101525b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614801561371e57506101a080890151908a015161371e9163ffffffff613f0816565b1561375c576137578b8a6101a0015189866137528b60200151606001518c6000015160600151612ef190919063ffffffff16565b6128ce565b613790565b6137768a896101a0015189858a60200151606001516128ce565b6137908b8a6101a0015189868a60000151606001516128ce565b5050505050505050505050565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc71541508815294850195909552908301919091529481019490945273ffffffffffffffffffffffffffffffffffffffff9091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6040516060907fde047db40000000000000000000000000000000000000000000000000000000090612ae29085908590602401615a8c565b805160009060158110156138b5576138b5610a6c60028787876122d9565b60006138e9847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb840163ffffffff613f2d16565b73ffffffffffffffffffffffffffffffffffffffff80871660009081526008602090815260408083209385168352929052205490915060ff1661393357613933610a6c8683613f6d565b6139408188866015613f8a565b979650505050505050565b6000610b6b8385846001613f8a565b60008183106139695781610966565b5090919050565b61397861456a565b6020810184905260a08501516080860151613994918691613d0d565b815260a085015160c08601516139ab918691613d0d565b604082015260a085015160e08601516139c5918691613d0d565b60608201526139da828463ffffffff612fac16565b6080820152949350505050565b613a018484610160015184866000015185602001516128ce565b613a1b8484610140015185600001518585600001516128ce565b613a3584846101a0015184866040015185606001516128ce565b613a53848461018001518560000151866040015185604001516128ce565b6000613a69858360800151866000015186614161565b905080612a8b57600060808301525050505050565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613aca57fe5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b6040516060907f3efe50c80000000000000000000000000000000000000000000000000000000090612ae29085908590602401615a3f565b606063488219a660e01b848484604051602401611e1d9392919061580a565b60008160040183511015613bcd57613bcd610a6c6003855185600401613c8f565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6060634678472b60e01b848484604051602401611e1d93929190615569565b606063f598518460e01b8383604051602401612ae29291906158fc565b606063a26dac0960e01b848484604051602401611e1d939291906155f6565b606063dec4aedf60e01b8383604051602401612ae29291906154d7565b606063e53c76c860e01b848484604051602401611e1d93929190615866565b6060632800659560e01b848484604051602401611e1d939291906158aa565b9052565b6060631b8388f760e01b858585856040516024016122fa94939291906154fb565b606063fdb6ca8d60e01b8383604051602401612ae2929190615594565b606063b6555d6f60e01b8383604051602401612ae2929190615542565b6000613d1a8484846141a6565b15613d2d57613d2d610a6c85858561420c565b610b6b8361224e868563ffffffff612fac16565b613d496145c1565b81851184841184861115613d6957613d6289868661422b565b9250613db8565b86841115613da95782518790528251602001869052608088015160a0890151613d93919089613d0d565b6020808501805192909252905101879052613db8565b613db587878787614268565b92505b8115613dde576020808401510151835151613dd89163ffffffff611bd116565b60408401525b8015613e065782516020908101519084015151613e009163ffffffff611bd116565b60608401525b50505b9695505050505050565b613e1b6145c1565b82841115613e3557613e2e87848461422b565b9050613e83565b82841015613e745780518590528051602090810185905281015184905260a08601516080870151613e67919086614293565b6020808301510152613e83565b613e8085858585614268565b90505b6020808201510151815151613e9d9163ffffffff611bd116565b60408201529695505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff168015613efe57476000613edf8a84848b8b8a6142cb565b9050613ef189848385038b8a8a6142cb565b5060019350505050613e09565b6000915050613e09565b6000815183511480156109665750508051602091820120825192909101919091201490565b60008160140183511015613f4e57613f4e610a6c6004855185601401613c8f565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b606063a15c0d0660e01b8383604051602401612ae292919061537b565b8151600090613fa18484830363ffffffff613cae16565b6040516060907f20c13b0b0000000000000000000000000000000000000000000000000000000090613fd990889088906024016156f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050614068858363ffffffff613cae16565b600060608873ffffffffffffffffffffffffffffffffffffffff1683604051614091919061530d565b600060405180830381855afa9150503d80600081146140cc576040519150601f19603f3d011682016040523d82523d6000602084013e6140d1565b606091505b50915091508180156140e4575080516020145b15614146577f20c13b0b0000000000000000000000000000000000000000000000000000000061411b82600063ffffffff613bac16565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614945050505050610b6b565b614155610a6c8a8a8a85614403565b50505050949350505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff16801561419c576141918682478888886142cb565b506001915050610b6b565b6000915050610b6b565b6000826141b8576141b8610a6c614424565b8115806141c3575083155b156141d057506000610966565b600083806141da57fe5b85840990506141ef858463ffffffff612fac16565b614201826103e863ffffffff612fac16565b101595945050505050565b606063339f3de260e01b848484604051602401611e1d939291906155f6565b6142336145c1565b60208082018051859052518101839052815101839052608084015160a085015161425e919085613d0d565b8151529392505050565b6142706145c1565b805194909452835160209081019390935282840180519290925290519091015290565b60006142a084848461445b565b156142b3576142b3610a6c85858561420c565b610b6b8361224e61223282600163ffffffff611bd116565b60008385106142d75750825b6040516060907fa3b4a3270000000000000000000000000000000000000000000000000000000090614311908690869089906024016153a2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608873ffffffffffffffffffffffffffffffffffffffff16848460405161439a919061530d565b60006040518083038185875af1925050503d80600081146143d7576040519150601f19603f3d011682016040523d82523d6000602084013e6143dc565b606091505b5091509150816143f6576143f6610a6c8b898989866144bf565b5050509695505050505050565b6060635bd0428d60e01b858585856040516024016122fa94939291906153d3565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b60008261446d5761446d610a6c614424565b811580614478575083155b1561448557506000610966565b6000838061448f57fe5b8584099050836144a5818363ffffffff611bd116565b816144ac57fe5b0690506141ef858463ffffffff612fac16565b60606387cb1e7560e01b86868686866040516024016144e29594939291906155b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905095945050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040518060800160405280606081526020016060815260200160008152602001600081525090565b60405180608001604052806145d461456a565b81526020016145e161456a565b815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b803573ffffffffffffffffffffffffffffffffffffffff811681146107f557600080fd5b600082601f830112614712578081fd5b813561472561472082615b1d565b615af6565b81815291506020808301908481018184028601820187101561474657600080fd5b60005b8481101561476d5761475b88836146de565b84529282019290820190600101614749565b505050505092915050565b600082601f830112614788578081fd5b813561479661472082615b1d565b8181529150602080830190840160005b838110156147d3576147be8760208435890101614896565b835260209283019291909101906001016147a6565b5050505092915050565b600082601f8301126147ed578081fd5b81356147fb61472082615b1d565b8181529150602080830190840160005b838110156147d357614823876020843589010161491d565b8352602092830192919091019060010161480b565b600082601f830112614848578081fd5b813561485661472082615b1d565b81815291506020808301908481018184028601820187101561487757600080fd5b60005b8481101561476d5781358452928201929082019060010161487a565b600082601f8301126148a6578081fd5b813567ffffffffffffffff8111156148bc578182fd5b6148ed60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601615af6565b915080825283602082850101111561490457600080fd5b8060208401602084013760009082016020015292915050565b60006101c0808385031215614930578182fd5b61493981615af6565b91505061494683836146de565b815261495583602084016146de565b602082015261496783604084016146de565b604082015261497983606084016146de565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff808211156149db57600080fd5b6149e786838701614896565b83850152610160925082850135915080821115614a0357600080fd5b614a0f86838701614896565b83850152610180925082850135915080821115614a2b57600080fd5b614a3786838701614896565b838501526101a0925082850135915080821115614a5357600080fd5b50614a6085828601614896565b82840152505092915050565b600060a08284031215614a7d578081fd5b614a8760a0615af6565b90508135815260208201356020820152604082013560408201526060820135614aaf81615b91565b6060820152608082013567ffffffffffffffff811115614ace57600080fd5b614ada84828501614896565b60808301525092915050565b600060208284031215614af7578081fd5b61096683836146de565b60008060408385031215614b13578081fd5b614b1d84846146de565b9150614b2c84602085016146de565b90509250929050565b60008060408385031215614b47578182fd5b614b5184846146de565b915060208301358015158114614b65578182fd5b809150509250929050565b60008060008060808587031215614b85578182fd5b843567ffffffffffffffff80821115614b9c578384fd5b614ba888838901614778565b95506020870135915080821115614bbd578384fd5b614bc988838901614702565b94506040870135915080821115614bde578384fd5b614bea88838901614702565b93506060870135915080821115614bff578283fd5b50614c0c87828801614838565b91505092959194509250565b600060208284031215614c29578081fd5b813567ffffffffffffffff811115614c3f578182fd5b610b6b848285016147dd565b60008060008060808587031215614c60578182fd5b843567ffffffffffffffff80821115614c77578384fd5b614c83888389016147dd565b95506020870135915080821115614c98578384fd5b614ca4888389016147dd565b94506040870135915080821115614cb9578384fd5b614cc588838901614778565b93506060870135915080821115614cda578283fd5b50614c0c87828801614778565b600080600060608486031215614cfb578081fd5b833567ffffffffffffffff80821115614d12578283fd5b614d1e878388016147dd565b94506020860135915080821115614d33578283fd5b614d3f87838801614838565b93506040860135915080821115614d54578283fd5b50614d6186828701614778565b9150509250925092565b600080600060608486031215614d7f578081fd5b833567ffffffffffffffff80821115614d96578283fd5b614da2878388016147dd565b9450602086013593506040860135915080821115614d54578283fd5b60008060408385031215614dd0578182fd5b823567ffffffffffffffff80821115614de7578384fd5b81850186601f820112614df8578485fd5b80359250614e0861472084615b1d565b83815260208082019190838101885b87811015614e4057614e2e8c848435890101614a6c565b85529382019390820190600101614e17565b50919750880135945050505080821115614e58578283fd5b50614e6585828601614778565b9150509250929050565b600060208284031215614e80578081fd5b5035919050565b60008060408385031215614e99578182fd5b823591506020830135614b6581615b91565b600080600060608486031215614ebf578081fd5b833592506020840135614ed181615b91565b9150604084013567ffffffffffffffff811115614eec578182fd5b614d6186828701614896565b600060208284031215614f09578081fd5b813561096681615bb3565b600060208284031215614f25578081fd5b815161096681615bb3565b600060a08284031215614f41578081fd5b614f4b60a0615af6565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215614f92578081fd5b813567ffffffffffffffff811115614fa8578182fd5b610b6b8482850161491d565b60008060408385031215614fc6578182fd5b823567ffffffffffffffff80821115614fdd578384fd5b614fe98683870161491d565b93506020850135915080821115614ffe578283fd5b50614e6585828601614896565b60008060008060808587031215615020578182fd5b843567ffffffffffffffff80821115615037578384fd5b6150438883890161491d565b95506020870135915080821115615058578384fd5b6150648883890161491d565b94506040870135915080821115615079578384fd5b61508588838901614896565b9350606087013591508082111561509a578283fd5b50614c0c87828801614896565b6000806000606084860312156150bb578081fd5b833567ffffffffffffffff808211156150d2578283fd5b6150de8783880161491d565b94506020860135935060408601359150808211156150fa578283fd5b50614d6186828701614896565b60008060408385031215615119578182fd5b823567ffffffffffffffff80821115615130578384fd5b614fe986838701614a6c565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156151925761517c8683516151e6565b60a0959095019460209190910190600101615169565b5093949350505050565b600081518084526151b4816020860160208601615b3d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b80518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b60006101c061522684845161513c565b6020830151615238602086018261513c565b50604083015161524b604086018261513c565b50606083015161525e606086018261513c565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152506101408084015182828701526152b78387018261519c565b915050610160915081840151858203838701526152d4828261519c565b9250505061018080840151858303828701526152f0838261519c565b9150506101a091508184015185820383870152613e09828261519c565b6000825161531f818460208701615b3d565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff8616825260806020830152615402608083018661519c565b8281036040840152615414818661519c565b8381036060850152615426818661519c565b98975050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156154a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261549185835161519c565b94509285019290850190600101615457565b5092979650505050505050565b6000602082526109666020830184615156565b901515815260200190565b90815260200190565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600085825273ffffffffffffffffffffffffffffffffffffffff8516602083015260806040830152615530608083018561519c565b8281036060840152613940818561519c565b918252602082015260400190565b600083825260406020830152610b6b604083018461519c565b600084825260606020830152615582606083018561519c565b8281036040840152613e09818561519c565b828152604081016155a483615b87565b8260208301529392505050565b600086825285602083015273ffffffffffffffffffffffffffffffffffffffff808616604084015280851660608401525060a0608083015261394060a083018461519c565b9283526020830191909152604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000092909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060208252610966602083018461519c565b6000608082526156c5608083018761519c565b73ffffffffffffffffffffffffffffffffffffffff95861660208401529390941660408201526060015292915050565b600060408252615708604083018561519c565b8281036020840152610e1a818561519c565b60006060825261572d606083018661519c565b828103602084015261573f818661519c565b91505073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600061016080835261577a8184018f61519c565b838103602085015261578c818f61519c565b91505082810360408401526157a1818d61519c565b83810360608501526157b3818d61519c565b73ffffffffffffffffffffffffffffffffffffffff9b8c16608086015299909a1660a0840152505060c081019590955260e08501939093526101008401919091526101208301526101409091015295945050505050565b600061581585615b69565b84825283602083015260606040830152610e1a606083018461519c565b6020810161583f83615b73565b91905290565b6060810161585285615b73565b938152602081019290925260409091015290565b6060810161587385615b7d565b938152602081019290925273ffffffffffffffffffffffffffffffffffffffff1660409091015290565b6060810161585285615b7d565b606081016008851061585257fe5b60006158c386615b87565b85825284602083015273ffffffffffffffffffffffffffffffffffffffff8416604083015260806060830152613e09608083018461519c565b6040810161590984615b69565b9281526020015290565b60208082526014908201527f5452414e53464552535f5355434345535346554c000000000000000000000000604082015260600190565b60006020825282516080602084015261596660a0840182615156565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08482030160408501526159a18183615156565b604086015160608601526060860151608086015280935050505092915050565b60a081016107f582846151e6565b6000610180820190506159e38284516151e6565b60208301516159f560a08401826151e6565b5060408301516101408301526060909201516101609091015290565b81516060820190615a2181615b87565b80835250602083015160208301526040830151604083015292915050565b600060408252615a526040830185615216565b90508260208301529392505050565b600060608252615a746060830186615216565b8460208401528281036040840152613e09818561519c565b60006040825283516040830152602084015160608301526040840151608083015273ffffffffffffffffffffffffffffffffffffffff60608501511660a0830152608084015160a060c0840152615ae660e084018261519c565b9150508260208301529392505050565b60405181810167ffffffffffffffff81118282101715615b1557600080fd5b604052919050565b600067ffffffffffffffff821115615b33578081fd5b5060209081020190565b60005b83811015615b58578181015183820152602001615b40565b838111156133785750506000910152565b6002811061084357fe5b6004811061084357fe5b6003811061084357fe5b6007811061084357fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461084357600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461084357600080fd5b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a090209056fea365627a7a72315820897f450a05992000843ffc258f91408c60af4df0c5e254daaee4892d72aa3da26c6578706572696d656e74616cf564736f6c63430005100040" + "object": "0x6080604052600436106102dc5760003560e01c80638d45cd2311610184578063beee2e14116100d6578063dd885e2d1161008a578063eea086ba11610064578063eea086ba14610735578063f2fde38b1461074a578063fc74896d1461076a576102dc565b8063dd885e2d146106ed578063dedfc1f11461070f578063e14b58c414610722576102dc565b8063c26cfecd116100bb578063c26cfecd14610698578063c585bb93146106ad578063d9bfa73e146106cd576102dc565b8063beee2e1414610665578063c0fa16cc14610678576102dc565b80639b44d55611610138578063a6c3bf3311610112578063a6c3bf331461061f578063b04fbddd14610632578063b718e29214610652576102dc565b80639b44d556146105bf5780639d3fa4b9146105d2578063a12dcc6f146105ff576102dc565b80638ea8dfe4116101695780638ea8dfe41461056c5780639331c7421461058c5780639694a402146105ac576102dc565b80638d45cd23146105375780638da5cb5b14610557576102dc565b8063607041081161023d5780637b8e3514116101f1578063850a1501116101cb578063850a1501146104ef57806388ec79fb146105045780638bc8efb314610524576102dc565b80637b8e35141461048f5780638171c407146104af57806382c174d0146104cf576102dc565b80636fcf3e9e116102225780636fcf3e9e1461045657806377fcce681461046957806378d29ac11461047c576102dc565b806360704108146104095780636a1a80fd14610436576102dc565b80632ac1262211610294578063369da09911610279578063369da099146103c357806346c02d7a146103e35780634f9559b1146103f6576102dc565b80632ac12622146103905780632da62987146103b0576102dc565b80631ce4c78b116102c55780631ce4c78b1461032e5780632280c91014610350578063288cdc9114610370576102dc565b80630228e168146102e15780630efca18514610317575b600080fd5b3480156102ed57600080fd5b506103016102fc366004614e6f565b61078a565b60405161030e91906154c3565b60405180910390f35b34801561032357600080fd5b5061032c61079f565b005b34801561033a57600080fd5b506103436107b3565b60405161030e91906154ce565b61036361035e366004615107565b6107b9565b60405161030e919061569f565b34801561037c57600080fd5b5061034361038b366004614e6f565b6107fb565b34801561039c57600080fd5b506103016103ab366004614e6f565b61080d565b61032c6103be366004614f81565b610822565b6103d66103d1366004614d6b565b610846565b60405161030e91906159c3565b61032c6103f1366004614e6f565b61096d565b61032c610404366004614e6f565b6109e0565b34801561041557600080fd5b50610429610424366004614ef8565b610aed565b60405161030e919061535a565b610449610444366004614c4b565b610b3b565b60405161030e919061594c565b610449610464366004614c4b565b610b73565b61032c610477366004614b35565b610b91565b6103d661048a366004614d6b565b610c54565b34801561049b57600080fd5b506103016104aa366004614b01565b610da4565b3480156104bb57600080fd5b506103016104ca366004614eab565b610dc4565b3480156104db57600080fd5b506103016104ea366004614e87565b610e23565b3480156104fb57600080fd5b50610429610e43565b61051761051236600461500b565b610e5f565b60405161030e91906159d1565b6103d6610532366004614d6b565b610e7d565b34801561054357600080fd5b50610301610552366004615107565b610eb1565b34801561056357600080fd5b50610429610ed6565b61057f61057a366004614ce7565b610ef2565b60405161030e91906154b0565b34801561059857600080fd5b5061032c6105a7366004614e6f565b61101d565b61057f6105ba366004614ce7565b611065565b6103d66105cd3660046150a7565b61112c565b3480156105de57600080fd5b506105f26105ed366004614f81565b611151565b60405161030e9190615a13565b34801561060b57600080fd5b5061030161061a366004614fb4565b611246565b6103d661062d366004614d6b565b61126b565b34801561063e57600080fd5b5061032c61064d366004614b70565b61129f565b61051761066036600461500b565b61134b565b61057f610673366004614ce7565b611369565b34801561068457600080fd5b5061032c610693366004614ae6565b61141e565b3480156106a457600080fd5b5061034361142f565b3480156106b957600080fd5b5061032c6106c8366004614ae6565b611435565b3480156106d957600080fd5b506103436106e8366004614b01565b6115c9565b3480156106f957600080fd5b506107026115e6565b60405161030e919061562a565b61032c61071d366004614c18565b61160a565b6103d66107303660046150a7565b61164c565b34801561074157600080fd5b50610429611667565b34801561075657600080fd5b5061032c610765366004614ae6565b611683565b61077d610778366004614dbe565b611726565b60405161030e9190615432565b60056020526000908152604090205460ff1681565b6107a761184f565b6107b16000611896565b565b60035481565b60606107c3611931565b156107d9576107d28383611953565b90506107f5565b6107e1611a6d565b6107eb8383611953565b90506107f5611aaf565b92915050565b60096020526000908152604090205481565b600a6020526000908152604090205460ff1681565b61082a611adf565b61083381611b4e565b61083b611b93565b610843611ba7565b50565b61084e61456a565b610856611931565b156108ec57835160005b8181146108e5576000610880846020015187611bd190919063ffffffff16565b905061088a61456a565b6108bb88848151811061089957fe5b6020026020010151838886815181106108ae57fe5b6020026020010151611bf0565b90506108c78582611d31565b9450868560200151106108db5750506108e5565b5050600101610860565b5050610966565b6108f4611a6d565b835160005b81811461095c576000610919846020015187611bd190919063ffffffff16565b905061092361456a565b61093288848151811061089957fe5b905061093e8582611d31565b94508685602001511061095257505061095c565b50506001016108f9565b5050610966611aaf565b9392505050565b610975611adf565b600061097f611dcc565b600083815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff90941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555061083b611b93565b6109e8611adf565b60006109f2611dcc565b9050600073ffffffffffffffffffffffffffffffffffffffff82163314610a195733610a1c565b60005b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600b60209081526040808320938516835292905220549091506001840190808211610a7157610a71610a6c858584611dfe565b611ea3565b73ffffffffffffffffffffffffffffffffffffffff8085166000818152600b602090815260408083209488168084529490915290819020859055517f82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f090610ad99086906154ce565b60405180910390a35050505061083b611b93565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b610b43614599565b610b4b611adf565b610b59858585856001611eab565b9050610b63611b93565b610b6b611ba7565b949350505050565b610b7b614599565b610b83611adf565b610b59858585856000611eab565b610b99611adf565b6000610ba3611dcc565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600860209081526040808320948916808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555192935090917fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190610c379086906154c3565b60405180910390a350610c48611b93565b610c50611ba7565b5050565b610c5c61456a565b610c64611931565b15610d2257835160005b8181146108e5578251600090610c8b90879063ffffffff611bd116565b90506000610cc8888481518110610c9e57fe5b602002602001015160a00151898581518110610cb657fe5b60200260200101516080015184612218565b9050610cd261456a565b610cf6898581518110610ce157fe5b6020026020010151838987815181106108ae57fe5b9050610d028682611d31565b955087866000015110610d17575050506108e5565b505050600101610c6e565b610d2a611a6d565b835160005b81811461095c578251600090610d4c90879063ffffffff611bd116565b90506000610d5f888481518110610c9e57fe5b9050610d6961456a565b610d78898581518110610ce157fe5b9050610d848682611d31565b955087866000015110610d995750505061095c565b505050600101610d2f565b600860209081526000928352604080842090915290825290205460ff1681565b600080610dd285858561225a565b90506005816008811115610de257fe5b1480610df957506007816008811115610df757fe5b145b15610e0e57610e0e610a6c60058787876122d9565b610e1a81868686612381565b95945050505050565b600760209081526000928352604080842090915290825290205460ff1681565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b610e676145c1565b610e6f611adf565b610b598585858560006125f1565b610e8561456a565b610e90848484610c54565b9050828160000151101561096657610966610a6c60008584600001516126de565b600080610ec9600154856126fd90919063ffffffff16565b9050610b6b848285612711565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6060610efc611931565b15610f9f578351604080518281526020808402820101909152818015610f3c57816020015b610f2961456a565b815260200190600190039081610f215790505b50915060005b8181146108e557610f80868281518110610f5857fe5b6020026020010151868381518110610f6c57fe5b60200260200101518684815181106108ae57fe5b838281518110610f8c57fe5b6020908102919091010152600101610f42565b610fa7611a6d565b8351604080518281526020808402820101909152818015610fe257816020015b610fcf61456a565b815260200190600190039081610fc75790505b50915060005b81811461095c57610ffe868281518110610f5857fe5b83828151811061100a57fe5b6020908102919091010152600101610fe8565b61102561184f565b7f3a3e76d7a75e198aef1f53137e4f2a8a2ec74e2e9526db8404d08ccc9f1e621d60035482604051611058929190615542565b60405180910390a1600355565b606061106f611adf565b83516040805182815260208084028201019091528180156110aa57816020015b61109761456a565b81526020019060019003908161108f5790505b50915060005b81811461111a576110fb8682815181106110c657fe5b60200260200101518683815181106110da57fe5b60200260200101518684815181106110ee57fe5b6020026020010151612797565b83828151811061110757fe5b60209081029190910101526001016110b0565b5050611124611b93565b610966611ba7565b61113461456a565b61113c611adf565b611147848484612797565b9050611124611b93565b6111596145f5565b61116282612839565b60408301526020820152608082015161118e578060015b9081600681111561118657fe5b905250610b36565b60a082015161119f57806002611179565b8160a001518160400151106111b657806005611179565b81610100015142106111ca57806004611179565b6020808201516000908152600a909152604090205460ff16156111ef57806006611179565b610120820151825173ffffffffffffffffffffffffffffffffffffffff9081166000908152600b60209081526040808320606088015190941683529290522054111561123d57806006611179565b60038152919050565b60008061125e6001548561286a90919063ffffffff16565b9050610b6b848285612879565b61127361456a565b61127e848484610846565b9050828160200151101561096657610966610a6c60018584602001516126de565b835160005b81811461130f576113078160001b8783815181106112be57fe5b60200260200101518784815181106112d257fe5b60200260200101518785815181106112e657fe5b60200260200101518786815181106112fa57fe5b60200260200101516128ce565b6001016112a4565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134290615915565b60405180910390fd5b6113536145c1565b61135b611adf565b610b598585858560016125f1565b6060611373611adf565b83516040805182815260208084028201019091528180156113ae57816020015b61139b61456a565b8152602001906001900390816113935790505b50915060005b81811461111a576113ff8682815181106113ca57fe5b60200260200101518683815181106113de57fe5b60200260200101518684815181106113f257fe5b6020026020010151612a92565b83828151811061140b57fe5b60209081029190910101526001016113b4565b61142661184f565b61084381611896565b60015481565b61143d61184f565b60008173ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561148557600080fd5b505afa158015611499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114bd9190810190614f14565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205490915073ffffffffffffffffffffffffffffffffffffffff16801561151b5761151b610a6c8383612ac5565b7fffffffff0000000000000000000000000000000000000000000000000000000082166000908152600260205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c03194906115bc9084908690615657565b60405180910390a1505050565b600b60209081526000928352604080842090915290825290205481565b7f20c13b0b0000000000000000000000000000000000000000000000000000000081565b611612611adf565b805160005b8181146116425761163a83828151811061162d57fe5b6020026020010151611b4e565b600101611617565b505061083b611b93565b61165461456a565b61165c611adf565b611147848484612a92565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b61168b61184f565b73ffffffffffffffffffffffffffffffffffffffff81166116b6576116b1610a6c612b67565b610843565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6060611730611931565b156117cd57825160408051828152602080840282010190915281801561176a57816020015b60608152602001906001900390816117555790505b50915060005b8181146117c6576117a785828151811061178657fe5b602002602001015185838151811061179a57fe5b6020026020010151611953565b8382815181106117b357fe5b6020908102919091010152600101611770565b50506107f5565b6117d5611a6d565b825160408051828152602080840282010190915281801561180a57816020015b60608152602001906001900390816117f55790505b50915060005b8181146118455761182685828151811061178657fe5b83828151811061183257fe5b6020908102919091010152600101611810565b50506107f5611aaf565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107b1576000546107b190610a6c90339073ffffffffffffffffffffffffffffffffffffffff16612b9e565b6004546040517fe1a5430ebec577336427f40f15822f1f36c5e3509ff209d6db9e6c9e6941cb0b916118e29173ffffffffffffffffffffffffffffffffffffffff90911690849061537b565b60405180910390a1600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000547501000000000000000000000000000000000000000000900460ff1690565b6060600061196c600154856126fd90919063ffffffff16565b9050611979848483612bbb565b60608401516119888180612c8f565b60008281526005602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556080870151905160609130916119d6919061530d565b600060405180830381855af49150503d8060008114611a11576040519150601f19603f3d011682016040523d82523d6000602084013e611a16565b606091505b509150915081611a2d57611a2d610a6c8583612cf2565b611a38836000612c8f565b60405184907fa4a7329f1dd821363067e07d359e347b4af9b1efe4b6cccf13240228af3c800d90600090a29695505050505050565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690556107b1612d0f565b60005474010000000000000000000000000000000000000000900460ff1615611b0d57611b0d610a6c612d43565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b611b566145f5565b611b5f82611151565b9050611b6b8282612d7a565b600381516006811115611b7a57fe5b14611b855750610843565b610c50828260200151612e29565b611b9b611931565b6107b1576107b1612d0f565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b600082821115611bea57611bea610a6c60028585612ed2565b50900390565b611bf861456a565b6040516060907f9b44d5560000000000000000000000000000000000000000000000000000000090611c3290879087908790602401615a63565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060603073ffffffffffffffffffffffffffffffffffffffff1683604051611cba919061530d565b600060405180830381855af49150503d8060008114611cf5576040519150601f19603f3d011682016040523d82523d6000602084013e611cfa565b606091505b50915091508115611d2757805160a014611d1057fe5b80806020019051611d249190810190614f30565b93505b5050509392505050565b611d3961456a565b81518351611d4c9163ffffffff612ef116565b815260208083015190840151611d679163ffffffff612ef116565b602082015260408083015190840151611d859163ffffffff612ef116565b604082015260608083015190840151611da39163ffffffff612ef116565b606082015260808083015190840151611dc19163ffffffff612ef116565b608082015292915050565b60065460009073ffffffffffffffffffffffffffffffffffffffff16818115611df55781611df7565b335b9250505090565b6060634ad3127560e01b848484604051602401611e1d939291906153a2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b611eb3614599565b8551611ec657611ec6610a6c6000612f0d565b8451611ed957611ed9610a6c6001612f0d565b8351865114611eef57611eef610a6c6002612f0d565b8251855114611f0557611f05610a6c6003612f0d565b8551604051908082528060200260200182016040528015611f4057816020015b611f2d61456a565b815260200190600190039081611f255790505b5081528451604080518281526020808402820101909152908015611f7e57816020015b611f6b61456a565b815260200190600190039081611f635790505b506020820152600080611f8f614617565b88600081518110611f9c57fe5b60200260200101519050611fae614617565b88600081518110611fbb57fe5b602002602001015190506000611fd083612839565b9150506000611fde83612839565b915050611fe961456a565b611ff161456a565b611ff96145c1565b61202c87878f8c8151811061200a57fe5b60200260200101518f8c8151811061201e57fe5b60200260200101518f6125f1565b80516020015190915061204690869063ffffffff612ef116565b945061206381602001516020015185612ef190919063ffffffff16565b9350612073838260000151611d31565b9250612083828260200151611d31565b91506120a081604001518b60400151612ef190919063ffffffff16565b60408b0152606080820151908b01516120be9163ffffffff612ef116565b60608b015260a08701518510612169578951805160018b019a85929181106120e257fe5b60200260200101819052506040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525092508e5189141561214657818a60200151898151811061213557fe5b602002602001018190525050612207565b8e898151811061215257fe5b6020026020010151965061216587612839565b9550505b8560a00151841061220157818a6020015189806001019a508151811061218b57fe5b60200260200101819052506040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525091508d518814156121de57828a600001518a8151811061213557fe5b8d88815181106121ea57fe5b602002602001015195506121fd86612839565b9450505b50611ff1565b505050505050505095945050505050565b6000610b6b8361224e61223282600163ffffffff611bd116565b612242888763ffffffff612fac16565b9063ffffffff612ef116565b9063ffffffff612fdd16565b6000612267848484613007565b905073ffffffffffffffffffffffffffffffffffffffff831661229457612294610a6c60068686866122d9565b600881818111156122a157fe5b60ff16106122b9576122b9610a6c60038686866122d9565b60008160088111156122c757fe5b141561096657610966610a6c60048686865b6060637e5a231860e01b858585856040516024016122fa94939291906158ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050949350505050565b6000600185600881111561239157fe5b14156123b85781516001146123b0576123b0610a6c60028686866122d9565b506000610b6b565b60028560088111156123c657fe5b14156124bf5781516042146123e5576123e5610a6c60028686866122d9565b6000826000815181106123f457fe5b016020015160f81c9050600061241184600163ffffffff61304616565b9050600061242685602163ffffffff61304616565b905060006001888585856040516000815260200160405260405161244d949392919061560c565b6020604051602081039080840390855afa15801561246f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8981169116149550610b6b945050505050565b60038560088111156124cd57fe5b141561257a5781516042146124ec576124ec610a6c60028686866122d9565b6000826000815181106124fb57fe5b016020015160f81c9050600061251884600163ffffffff61304616565b9050600061252d85602163ffffffff61304616565b905060006001886040516020016125449190615329565b604051602081830303815290604052805190602001208585856040516000815260200160405260405161244d949392919061560c565b600485600881111561258857fe5b14156125a057612599848484613070565b9050610b6b565b60068560088111156125ae57fe5b146125b557fe5b50600083815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205460ff16949350505050565b6125f96145c1565b6101608087015161014080880191909152870151908601526126196145f5565b61262287611151565b905061262c6145f5565b61263587611151565b90506000612641611dcc565b905061264f8984838a613266565b61265b88838389613266565b61266f89898560200151856020015161337e565b6126888989856040015185604001516003543a8b6133c3565b93506126a38982856020015186604001518860000151613518565b6126bc8882846020015185604001518860200151613518565b6126d2836020015183602001518b8b85896135f6565b50505095945050505050565b60606318e4b14160e01b848484604051602401611e1d9392919061589e565b60006109668261270c8561379d565b613825565b60608301516000908161272585838661225a565b9050600581600881111561273557fe5b141561275757612750612748878761385f565b868487613897565b925061278e565b600781600881111561276557fe5b141561277f57612750612778878761385f565b838661394b565b61278b81868487612381565b92505b50509392505050565b61279f61456a565b6127a76145f5565b6127b085611151565b905060006127bc611dcc565b90506127ca86838387613266565b60006127e783604001518860a00151611bd190919063ffffffff16565b905060006127f5878361395a565b905061280588826003543a613970565b945060008460200151905061282189858388604001518a613518565b61282d818a86896139e7565b50505050509392505050565b6000806128516001548461286a90919063ffffffff16565b6000818152600960205260409020549092509050915091565b60006109668261270c85613a7e565b82516000908161288a85838661225a565b9050600581600881111561289a57fe5b14156128ad576127506127488787613b55565b60078160088111156128bb57fe5b141561277f576127506127788787613b55565b8015612a8b5760208451816128df57fe5b066004146128f6576128f6610a6c60008787613b8d565b6000612908858263ffffffff613bac16565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205490915073ffffffffffffffffffffffffffffffffffffffff168061296757612967610a6c60018989613b8d565b6040516060907fa85e59e400000000000000000000000000000000000000000000000000000000906129a39089908990899089906024016156b2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608373ffffffffffffffffffffffffffffffffffffffff1683604051612a2b919061530d565b6000604051808303816000865af19150503d8060008114612a68576040519150601f19603f3d011682016040523d82523d6000602084013e612a6d565b606091505b509150915081612a8557612a85610a6c8b8b84613bf8565b50505050505b5050505050565b612a9a61456a565b612aa5848484612797565b90508281602001511461096657610966610a6c60028584602001516126de565b60606311c7b72060e01b8383604051602401612ae2929190615657565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060631de45ad160e01b8383604051602401612ae292919061537b565b82602001514210612bd457612bd4610a6c600183613c17565b60408301513a8114612bee57612bee610a6c833a84613c34565b60065473ffffffffffffffffffffffffffffffffffffffff168015612c1a57612c1a610a6c8483613c53565b60008381526005602052604090205460ff1615612c3f57612c3f610a6c600085613c17565b606085015173ffffffffffffffffffffffffffffffffffffffff81163314801590612c725750612c70868587612711565b155b15612c8757612c87610a6c60018684896122d9565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff82163314610c50576006805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790555050565b60606320d11f6160e01b8383604051602401612ae2929190615550565b47801561084357604051339082156108fc029083906000818181858888f19350505050158015610c50573d6000803e3d6000fd5b60408051808201909152600481527f0c3b823f00000000000000000000000000000000000000000000000000000000602082015290565b606082015173ffffffffffffffffffffffffffffffffffffffff1615612dce57606082015173ffffffffffffffffffffffffffffffffffffffff163314612dce57612dce610a6c6002836020015133613c70565b6000612dd8611dcc565b90508073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614612e2457612e24610a6c6000846020015184613c70565b505050565b6000818152600a60205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558281015183516101408501516101608601519351859473ffffffffffffffffffffffffffffffffffffffff9485169493909316927f02c310a9a43963ff31a754a4099cc435ed498049687539d72d7818d9b093415c92612ec692909190339061571a565b60405180910390a45050565b606063e946c1bb60e01b848484604051602401611e1d93929190615845565b60008282018381101561096657610966610a6c60008686612ed2565b606063d4092f4f60e01b82604051602401612f289190615832565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b600082612fbb575060006107f5565b82820282848281612fc857fe5b041461096657610966610a6c60018686612ed2565b600081612ff357612ff3610a6c60038585612ed2565b6000828481612ffe57fe5b04949350505050565b600081516000141561302357613023610a6c60028686866122d9565b8160018351038151811061303357fe5b016020015160f81c6008811115610b6b57fe5b6000816020018351101561306757613067610a6c6005855185602001613c8f565b50016020015190565b80516000906130a7837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830163ffffffff613cae16565b6040516060907f1626ba7e00000000000000000000000000000000000000000000000000000000906130df9088908790602401615550565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061316e848363ffffffff613cae16565b600060608673ffffffffffffffffffffffffffffffffffffffff1683604051613197919061530d565b600060405180830381855afa9150503d80600081146131d2576040519150601f19603f3d011682016040523d82523d6000602084013e6131d7565b606091505b50915091508180156131ea575080516020145b1561324c577fb06713810000000000000000000000000000000000000000000000000000000061322182600063ffffffff613bac16565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614945050505050610966565b61325b610a6c89898985613cb2565b505050509392505050565b60038351600681111561327557fe5b1461328f5761328f610a6c84602001518560000151613cd3565b606084015173ffffffffffffffffffffffffffffffffffffffff16156132e357606084015173ffffffffffffffffffffffffffffffffffffffff1633146132e3576132e3610a6c6002856020015133613c70565b602084015173ffffffffffffffffffffffffffffffffffffffff161561334d578173ffffffffffffffffffffffffffffffffffffffff16846020015173ffffffffffffffffffffffffffffffffffffffff161461334d5761334d610a6c6001856020015185613c70565b61335c84846020015183612879565b61337857613378610a6c600085602001518760000151856122d9565b50505050565b60a080840151908501516133979163ffffffff612fac16565b608080850151908601516133b09163ffffffff612fac16565b101561337857613378610a6c8383613cf0565b6133cb6145c1565b60a08801516000906133e3908863ffffffff611bd116565b905060006133fa8a608001518b60a0015184613d0d565b90506000613415888b60a00151611bd190919063ffffffff16565b9050600061342c8b608001518c60a0015184613d0d565b90508515613449576134428c8c85878587613d41565b945061345a565b6134578c8c85878587613e13565b94505b84515160808d015160c08e0151613472929190613d0d565b85516040015284516020015160a08d015160e08e0151613493929190613d0d565b85516060015260208501515160808c015160c08d01516134b4929190613d0d565b856020015160400181815250506134dc8560200151602001518c60a001518d60e00151613d0d565b60208601516060015260006134f7888a63ffffffff612fac16565b86516080908101829052602088015101525050505050979650505050505050565b602081015161352e90839063ffffffff612ef116565b600960008581526020019081526020016000208190555082856040015173ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff167f6869791f0a34781b29882982cc39e882768cf2c96995c2a110c577c53bc932d58861014001518961016001518a61018001518b6101a001518b338a600001518b602001518c604001518d606001518e608001516040516135e79b9a99989796959493929190615766565b60405180910390a45050505050565b835183516040808701519086015161014087015185516020015161361f918b91869088906128ce565b6136398a89610140015186868960200151602001516128ce565b6136538988610180015185848960200151604001516128ce565b61366d8a89610180015186858960000151604001516128ce565b6136838a896101400151868989604001516128ce565b61369989886101400151858989606001516128ce565b60006136b18b8b88600001516080015188888c613eac565b9050806136ce578551600060809182018190526020880151909101525b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614801561371e57506101a080890151908a015161371e9163ffffffff613f0816565b1561375c576137578b8a6101a0015189866137528b60200151606001518c6000015160600151612ef190919063ffffffff16565b6128ce565b613790565b6137768a896101a0015189858a60200151606001516128ce565b6137908b8a6101a0015189868a60000151606001516128ce565b5050505050505050505050565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc71541508815294850195909552908301919091529481019490945273ffffffffffffffffffffffffffffffffffffffff9091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6040516060907fde047db40000000000000000000000000000000000000000000000000000000090612ae29085908590602401615a8e565b805160009060158110156138b5576138b5610a6c60028787876122d9565b60006138e9847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb840163ffffffff613f2d16565b73ffffffffffffffffffffffffffffffffffffffff80871660009081526008602090815260408083209385168352929052205490915060ff1661393357613933610a6c8683613f6d565b6139408188866015613f8a565b979650505050505050565b6000610b6b8385846001613f8a565b60008183106139695781610966565b5090919050565b61397861456a565b6020810184905260a08501516080860151613994918691613d0d565b815260a085015160c08601516139ab918691613d0d565b604082015260a085015160e08601516139c5918691613d0d565b60608201526139da828463ffffffff612fac16565b6080820152949350505050565b613a018484610160015184866000015185602001516128ce565b613a1b8484610140015185600001518585600001516128ce565b613a3584846101a0015184866040015185606001516128ce565b613a53848461018001518560000151866040015185604001516128ce565b6000613a69858360800151866000015186614161565b905080612a8b57600060808301525050505050565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613aca57fe5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b6040516060907f3efe50c80000000000000000000000000000000000000000000000000000000090612ae29085908590602401615a41565b606063488219a660e01b848484604051602401611e1d9392919061580a565b60008160040183511015613bcd57613bcd610a6c6003855185600401613c8f565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6060634678472b60e01b848484604051602401611e1d93929190615569565b606063f598518460e01b8383604051602401612ae29291906158fe565b606063a26dac0960e01b848484604051602401611e1d939291906155f6565b606063dec4aedf60e01b8383604051602401612ae29291906154d7565b606063e53c76c860e01b848484604051602401611e1d93929190615866565b6060632800659560e01b848484604051602401611e1d939291906158ac565b9052565b6060631b8388f760e01b858585856040516024016122fa94939291906154fb565b606063fdb6ca8d60e01b8383604051602401612ae2929190615594565b606063b6555d6f60e01b8383604051602401612ae2929190615542565b6000613d1a8484846141a6565b15613d2d57613d2d610a6c85858561420c565b610b6b8361224e868563ffffffff612fac16565b613d496145c1565b81851184841184861115613d6957613d6289868661422b565b9250613db8565b86841115613da95782518790528251602001869052608088015160a0890151613d93919089613d0d565b6020808501805192909252905101879052613db8565b613db587878787614268565b92505b8115613dde576020808401510151835151613dd89163ffffffff611bd116565b60408401525b8015613e065782516020908101519084015151613e009163ffffffff611bd116565b60608401525b50505b9695505050505050565b613e1b6145c1565b82841115613e3557613e2e87848461422b565b9050613e83565b82841015613e745780518590528051602090810185905281015184905260a08601516080870151613e67919086614293565b6020808301510152613e83565b613e8085858585614268565b90505b6020808201510151815151613e9d9163ffffffff611bd116565b60408201529695505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff168015613efe57476000613edf8a84848b8b8a6142cb565b9050613ef189848385038b8a8a6142cb565b5060019350505050613e09565b6000915050613e09565b6000815183511480156109665750508051602091820120825192909101919091201490565b60008160140183511015613f4e57613f4e610a6c6004855185601401613c8f565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b606063a15c0d0660e01b8383604051602401612ae292919061537b565b8151600090613fa18484830363ffffffff613cae16565b6040516060907f20c13b0b0000000000000000000000000000000000000000000000000000000090613fd990889088906024016156f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050614068858363ffffffff613cae16565b600060608873ffffffffffffffffffffffffffffffffffffffff1683604051614091919061530d565b600060405180830381855afa9150503d80600081146140cc576040519150601f19603f3d011682016040523d82523d6000602084013e6140d1565b606091505b50915091508180156140e4575080516020145b15614146577f20c13b0b0000000000000000000000000000000000000000000000000000000061411b82600063ffffffff613bac16565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614945050505050610b6b565b614155610a6c8a8a8a85614403565b50505050949350505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff16801561419c576141918682478888886142cb565b506001915050610b6b565b6000915050610b6b565b6000826141b8576141b8610a6c614424565b8115806141c3575083155b156141d057506000610966565b600083806141da57fe5b85840990506141ef858463ffffffff612fac16565b614201826103e863ffffffff612fac16565b101595945050505050565b606063339f3de260e01b848484604051602401611e1d939291906155f6565b6142336145c1565b60208082018051859052518101839052815101839052608084015160a085015161425e919085613d0d565b8151529392505050565b6142706145c1565b805194909452835160209081019390935282840180519290925290519091015290565b60006142a084848461445b565b156142b3576142b3610a6c85858561420c565b610b6b8361224e61223282600163ffffffff611bd116565b60008385106142d75750825b6040516060907fa3b4a3270000000000000000000000000000000000000000000000000000000090614311908690869089906024016153a2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608873ffffffffffffffffffffffffffffffffffffffff16848460405161439a919061530d565b60006040518083038185875af1925050503d80600081146143d7576040519150601f19603f3d011682016040523d82523d6000602084013e6143dc565b606091505b5091509150816143f6576143f6610a6c8b898989866144bf565b5050509695505050505050565b6060635bd0428d60e01b858585856040516024016122fa94939291906153d3565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b60008261446d5761446d610a6c614424565b811580614478575083155b1561448557506000610966565b6000838061448f57fe5b8584099050836144a5818363ffffffff611bd116565b816144ac57fe5b0690506141ef858463ffffffff612fac16565b60606387cb1e7560e01b86868686866040516024016144e29594939291906155b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905095945050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040518060800160405280606081526020016060815260200160008152602001600081525090565b60405180608001604052806145d461456a565b81526020016145e161456a565b815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b803573ffffffffffffffffffffffffffffffffffffffff811681146107f557600080fd5b600082601f830112614712578081fd5b813561472561472082615b1f565b615af8565b81815291506020808301908481018184028601820187101561474657600080fd5b60005b8481101561476d5761475b88836146de565b84529282019290820190600101614749565b505050505092915050565b600082601f830112614788578081fd5b813561479661472082615b1f565b8181529150602080830190840160005b838110156147d3576147be8760208435890101614896565b835260209283019291909101906001016147a6565b5050505092915050565b600082601f8301126147ed578081fd5b81356147fb61472082615b1f565b8181529150602080830190840160005b838110156147d357614823876020843589010161491d565b8352602092830192919091019060010161480b565b600082601f830112614848578081fd5b813561485661472082615b1f565b81815291506020808301908481018184028601820187101561487757600080fd5b60005b8481101561476d5781358452928201929082019060010161487a565b600082601f8301126148a6578081fd5b813567ffffffffffffffff8111156148bc578182fd5b6148ed60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601615af8565b915080825283602082850101111561490457600080fd5b8060208401602084013760009082016020015292915050565b60006101c0808385031215614930578182fd5b61493981615af8565b91505061494683836146de565b815261495583602084016146de565b602082015261496783604084016146de565b604082015261497983606084016146de565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff808211156149db57600080fd5b6149e786838701614896565b83850152610160925082850135915080821115614a0357600080fd5b614a0f86838701614896565b83850152610180925082850135915080821115614a2b57600080fd5b614a3786838701614896565b838501526101a0925082850135915080821115614a5357600080fd5b50614a6085828601614896565b82840152505092915050565b600060a08284031215614a7d578081fd5b614a8760a0615af8565b90508135815260208201356020820152604082013560408201526060820135614aaf81615b89565b6060820152608082013567ffffffffffffffff811115614ace57600080fd5b614ada84828501614896565b60808301525092915050565b600060208284031215614af7578081fd5b61096683836146de565b60008060408385031215614b13578081fd5b614b1d84846146de565b9150614b2c84602085016146de565b90509250929050565b60008060408385031215614b47578182fd5b614b5184846146de565b915060208301358015158114614b65578182fd5b809150509250929050565b60008060008060808587031215614b85578182fd5b843567ffffffffffffffff80821115614b9c578384fd5b614ba888838901614778565b95506020870135915080821115614bbd578384fd5b614bc988838901614702565b94506040870135915080821115614bde578384fd5b614bea88838901614702565b93506060870135915080821115614bff578283fd5b50614c0c87828801614838565b91505092959194509250565b600060208284031215614c29578081fd5b813567ffffffffffffffff811115614c3f578182fd5b610b6b848285016147dd565b60008060008060808587031215614c60578182fd5b843567ffffffffffffffff80821115614c77578384fd5b614c83888389016147dd565b95506020870135915080821115614c98578384fd5b614ca4888389016147dd565b94506040870135915080821115614cb9578384fd5b614cc588838901614778565b93506060870135915080821115614cda578283fd5b50614c0c87828801614778565b600080600060608486031215614cfb578081fd5b833567ffffffffffffffff80821115614d12578283fd5b614d1e878388016147dd565b94506020860135915080821115614d33578283fd5b614d3f87838801614838565b93506040860135915080821115614d54578283fd5b50614d6186828701614778565b9150509250925092565b600080600060608486031215614d7f578081fd5b833567ffffffffffffffff80821115614d96578283fd5b614da2878388016147dd565b9450602086013593506040860135915080821115614d54578283fd5b60008060408385031215614dd0578182fd5b823567ffffffffffffffff80821115614de7578384fd5b81850186601f820112614df8578485fd5b80359250614e0861472084615b1f565b83815260208082019190838101885b87811015614e4057614e2e8c848435890101614a6c565b85529382019390820190600101614e17565b50919750880135945050505080821115614e58578283fd5b50614e6585828601614778565b9150509250929050565b600060208284031215614e80578081fd5b5035919050565b60008060408385031215614e99578182fd5b823591506020830135614b6581615b89565b600080600060608486031215614ebf578081fd5b833592506020840135614ed181615b89565b9150604084013567ffffffffffffffff811115614eec578182fd5b614d6186828701614896565b600060208284031215614f09578081fd5b813561096681615bab565b600060208284031215614f25578081fd5b815161096681615bab565b600060a08284031215614f41578081fd5b614f4b60a0615af8565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215614f92578081fd5b813567ffffffffffffffff811115614fa8578182fd5b610b6b8482850161491d565b60008060408385031215614fc6578182fd5b823567ffffffffffffffff80821115614fdd578384fd5b614fe98683870161491d565b93506020850135915080821115614ffe578283fd5b50614e6585828601614896565b60008060008060808587031215615020578182fd5b843567ffffffffffffffff80821115615037578384fd5b6150438883890161491d565b95506020870135915080821115615058578384fd5b6150648883890161491d565b94506040870135915080821115615079578384fd5b61508588838901614896565b9350606087013591508082111561509a578283fd5b50614c0c87828801614896565b6000806000606084860312156150bb578081fd5b833567ffffffffffffffff808211156150d2578283fd5b6150de8783880161491d565b94506020860135935060408601359150808211156150fa578283fd5b50614d6186828701614896565b60008060408385031215615119578182fd5b823567ffffffffffffffff80821115615130578384fd5b614fe986838701614a6c565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156151925761517c8683516151e6565b60a0959095019460209190910190600101615169565b5093949350505050565b600081518084526151b4816020860160208601615b3f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b80518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b60006101c061522684845161513c565b6020830151615238602086018261513c565b50604083015161524b604086018261513c565b50606083015161525e606086018261513c565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152506101408084015182828701526152b78387018261519c565b915050610160915081840151858203838701526152d4828261519c565b9250505061018080840151858303828701526152f0838261519c565b9150506101a091508184015185820383870152613e09828261519c565b6000825161531f818460208701615b3f565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff8616825260806020830152615402608083018661519c565b8281036040840152615414818661519c565b8381036060850152615426818661519c565b98975050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156154a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261549185835161519c565b94509285019290850190600101615457565b5092979650505050505050565b6000602082526109666020830184615156565b901515815260200190565b90815260200190565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600085825273ffffffffffffffffffffffffffffffffffffffff8516602083015260806040830152615530608083018561519c565b8281036060840152613940818561519c565b918252602082015260400190565b600083825260406020830152610b6b604083018461519c565b600084825260606020830152615582606083018561519c565b8281036040840152613e09818561519c565b828152604081016155a483615b7f565b8260208301529392505050565b600086825285602083015273ffffffffffffffffffffffffffffffffffffffff808616604084015280851660608401525060a0608083015261394060a083018461519c565b9283526020830191909152604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000092909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060208252610966602083018461519c565b6000608082526156c5608083018761519c565b73ffffffffffffffffffffffffffffffffffffffff95861660208401529390941660408201526060015292915050565b600060408252615708604083018561519c565b8281036020840152610e1a818561519c565b60006060825261572d606083018661519c565b828103602084015261573f818661519c565b91505073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600061016080835261577a8184018f61519c565b838103602085015261578c818f61519c565b91505082810360408401526157a1818d61519c565b83810360608501526157b3818d61519c565b73ffffffffffffffffffffffffffffffffffffffff9b8c16608086015299909a1660a0840152505060c081019590955260e08501939093526101008401919091526101208301526101409091015295945050505050565b600061581585615b6b565b84825283602083015260606040830152610e1a606083018461519c565b6020810161583f83615b75565b91905290565b6060810161585285615b75565b938152602081019290925260409091015290565b606081016003851061587457fe5b938152602081019290925273ffffffffffffffffffffffffffffffffffffffff1660409091015290565b606081016003851061585257fe5b606081016008851061585257fe5b60006158c586615b7f565b85825284602083015273ffffffffffffffffffffffffffffffffffffffff8416604083015260806060830152613e09608083018461519c565b6040810161590b84615b6b565b9281526020015290565b60208082526014908201527f5452414e53464552535f5355434345535346554c000000000000000000000000604082015260600190565b60006020825282516080602084015261596860a0840182615156565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08482030160408501526159a38183615156565b604086015160608601526060860151608086015280935050505092915050565b60a081016107f582846151e6565b6000610180820190506159e58284516151e6565b60208301516159f760a08401826151e6565b5060408301516101408301526060909201516101609091015290565b81516060820190615a2381615b7f565b80835250602083015160208301526040830151604083015292915050565b600060408252615a546040830185615216565b90508260208301529392505050565b600060608252615a766060830186615216565b8460208401528281036040840152613e09818561519c565b60006040825283516040830152602084015160608301526040840151608083015273ffffffffffffffffffffffffffffffffffffffff60608501511660a0830152608084015160a060c0840152615ae860e084018261519c565b9150508260208301529392505050565b60405181810167ffffffffffffffff81118282101715615b1757600080fd5b604052919050565b600067ffffffffffffffff821115615b35578081fd5b5060209081020190565b60005b83811015615b5a578181015183820152602001615b42565b838111156133785750506000910152565b6002811061084357fe5b6004811061084357fe5b6007811061084357fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461084357600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461084357600080fd5b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a090209056fea365627a7a72315820897f450a05992000843ffc258f91408c60af4df0c5e254daaee4892d72aa3da26c6578706572696d656e74616cf564736f6c63430005100040" } } }, diff --git a/packages/contract-artifacts/artifacts/Forwarder.json b/packages/contract-artifacts/artifacts/Forwarder.json index ef9aa6fc45..4ae9adfab3 100644 --- a/packages/contract-artifacts/artifacts/Forwarder.json +++ b/packages/contract-artifacts/artifacts/Forwarder.json @@ -23,6 +23,24 @@ "type": "event" }, { "payable": true, "stateMutability": "payable", "type": "fallback" }, + { + "constant": true, + "inputs": [], + "name": "ERC1155_BATCH_RECEIVED", + "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "ERC1155_RECEIVED", + "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [], @@ -116,6 +134,36 @@ "stateMutability": "payable", "type": "function" }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "operator", "type": "address" }, + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, + { "internalType": "bytes", "name": "data", "type": "bytes" } + ], + "name": "onERC1155BatchReceived", + "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "operator", "type": "address" }, + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "uint256", "name": "id", "type": "uint256" }, + { "internalType": "uint256", "name": "value", "type": "uint256" }, + { "internalType": "bytes", "name": "data", "type": "bytes" } + ], + "name": "onERC1155Received", + "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": true, "inputs": [], @@ -174,6 +222,28 @@ }, "return": "wethSpentAmount Amount of WETH spent on the given set of orders.makerAssetAcquiredAmount Amount of maker asset acquired from the given set of orders." }, + "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)": { + "details": "The smart contract calls this function on the recipient after a `safeTransferFrom`. This function MAY throw to revert and reject the transfer. Return of other than the magic value MUST result in the transaction being reverted Note: the contract address is always the message sender", + "params": { + "data": "Additional data with no specified format", + "from": "The address which previously owned the token", + "ids": "An array containing ids of each token being transferred", + "operator": "The address which called `safeTransferFrom` function", + "values": "An array containing amounts of each token being transferred" + }, + "return": "`bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`" + }, + "onERC1155Received(address,address,uint256,uint256,bytes)": { + "details": "The smart contract calls this function on the recipient after a `safeTransferFrom`. This function MAY throw to revert and reject the transfer. Return of other than the magic value MUST result in the transaction being reverted Note: the contract address is always the message sender", + "params": { + "data": "Additional data with no specified format", + "from": "The address which previously owned the token", + "id": "An array containing the ids of the token being transferred", + "operator": "The address which called `safeTransferFrom` function", + "value": "An array containing the amount of tokens being transferred" + }, + "return": "`bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`" + }, "transferOwnership(address)": { "details": "Change the owner of this contract.", "params": { "newOwner": "New owner address." } @@ -189,10 +259,10 @@ }, "evm": { "bytecode": { - "object": "0x60806040523480156200001157600080fd5b506040516200345438038062003454833981016040819052620000349162000354565b60008054336001600160a01b03199182161782556001805482166001600160a01b0387811691909117918290556002805484168783161790556003805490931685821617909255604051630c0e082160e31b8152911690636070410890620000a890630f47261b60e41b90600401620003e2565b60206040518083038186803b158015620000c157600080fd5b505afa158015620000d6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620000fc919081019062000324565b90506001600160a01b03811662000137576200013762000126620002f060201b620006071760201c565b6200031c60201b620002221760201c565b60035460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906200016d90849060001990600401620003c9565b602060405180830381600087803b1580156200018857600080fd5b505af11580156200019d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001c39190810190620003a7565b506001546040805163850a150160e01b815290516000926001600160a01b03169163850a1501916004808301926020929190829003018186803b1580156200020a57600080fd5b505afa1580156200021f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000245919081019062000324565b90506001600160a01b03811615620002e55760035460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906200028d90849060001990600401620003c9565b602060405180830381600087803b158015620002a857600080fd5b505af1158015620002bd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002e39190810190620003a7565b505b505050505062000410565b6040805160048152602481019091526020810180516001600160e01b031663f3b96b8d60e01b17905290565b805160208201fd5b60006020828403121562000336578081fd5b81516001600160a01b03811681146200034d578182fd5b9392505050565b60008060006060848603121562000369578182fd5b83516200037681620003f7565b60208501519093506200038981620003f7565b60408501519092506200039c81620003f7565b809150509250925092565b600060208284031215620003b9578081fd5b815180151581146200034d578182fd5b6001600160a01b03929092168252602082015260400190565b6001600160e01b031991909116815260200190565b6001600160a01b03811681146200040d57600080fd5b50565b61303480620004206000396000f3fe6080604052600436106100705760003560e01c8063907e5cc31161004e578063907e5cc31461010d5780639e8323151461012e578063e196001b14610141578063f2fde38b1461016357610070565b8063442026ed146100a2578063630f1e6c146100c25780638da5cb5b146100e2575b60035473ffffffffffffffffffffffffffffffffffffffff1633146100a0576100a061009b33610183565b610222565b005b3480156100ae57600080fd5b506100a06100bd366004612a03565b61022a565b3480156100ce57600080fd5b506100a06100dd366004612a43565b610414565b3480156100ee57600080fd5b506100f7610462565b6040516101049190612b99565b60405180910390f35b61012061011b3660046127ef565b61047e565b604051610104929190612f0c565b61012061013c366004612897565b6104b3565b34801561014d57600080fd5b506101566104e9565b6040516101049190612c38565b34801561016f57600080fd5b506100a061017e3660046127b7565b61050d565b60606308b1869860e01b8260405160240161019e9190612b99565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b6000610276600084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff6105b1169050565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821681141561040e576001546040517f6070410800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff169063607041089061031a908590600401612c38565b60206040518083038186803b15801561033257600080fd5b505afa158015610346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061036a91908101906127d3565b905073ffffffffffffffffffffffffffffffffffffffff81166103925761039261009b610607565b60006103de601087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff610661169050565b905061040b81837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6106a1565b50505b50505050565b61041c610762565b61045d83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508592506107ab915050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061048d858561096f565b905061049a878288610ac5565b90935091506104a98184610f27565b5094509492505050565b60008060006104c2858561096f565b90506104cf88888861100b565b90935091506104de8184610f27565b509550959350505050565b7f770501f80000000000000000000000000000000000000000000000000000000081565b610515610762565b73ffffffffffffffffffffffffffffffffffffffff81166105405761053b61009b611346565b6105ae565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35b50565b600081600401835110156105d2576105d261009b600385518560040161137d565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff3b96b8d0000000000000000000000000000000000000000000000000000000017905290565b600081601401835110156106825761068261009b600485518560140161137d565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907f095ea7b300000000000000000000000000000000000000000000000000000000906106d99085908590602401612c12565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061040e8482611423565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107a9576000546107a99061009b90339073ffffffffffffffffffffffffffffffffffffffff166114db565b565b806107b55761096b565b60006107c7838263ffffffff6105b116565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000148061085a57507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f300000000000000000000000000000000000000000000000000000000145b1561086e57610869838361157d565b61045d565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f025717920000000000000000000000000000000000000000000000000000000014156108c257610869838361159d565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd700000000000000000000000000000000000000000000000000000000141561091657610869838361166a565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a000000000000000000000000000000000000000000000000000000001461045d5761045d61009b826116f2565b5050565b8151815160009190811461098b5761098b61009b82855161170d565b34915060005b818114610a3a5760008582815181106109a657fe5b60200260200101519050808410156109c5576109c561009b828661172a565b6109d5848263ffffffff61174716565b93508482815181106109e357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a30573d6000803e3d6000fd5b5050600101610991565b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610aa557600080fd5b505af1158015610ab9573d6000803e3d6000fd5b50505050505092915050565b6000806000610b7a600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3557600080fd5b505afa158015610b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b6d9190810190612ade565b3a9063ffffffff61176616565b86519091507fdc1600f3000000000000000000000000000000000000000000000000000000009060005b818114610f1b57888181518110610bb757fe5b60200260200101516080015160001480610be85750888181518110610bd857fe5b602002602001015160a001516000145b15610bf257610f13565b6000610c3c610c138b8481518110610c0657fe5b6020026020010151611797565b610c1d5785610c20565b60005b610c308b8a63ffffffff61174716565b9063ffffffff61174716565b90506000610c6c60008c8581518110610c5157fe5b602002602001015161014001516105b190919063ffffffff16565b90506000807fffffffff000000000000000000000000000000000000000000000000000000008084169088161415610d7257610cca60108e8781518110610caf57fe5b6020026020010151610140015161066190919063ffffffff16565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190610d1f903090600401612b99565b60206040518083038186803b158015610d3757600080fd5b505afa158015610d4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d6f9190810190612ade565b90505b600080610da68f8881518110610d8457fe5b60200260200101518e8981518110610d9857fe5b60200260200101518861180c565b91509150887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610eb4576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190610e45903090600401612b99565b60206040518083038186803b158015610e5d57600080fd5b505afa158015610e71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e959190810190612ade565b9050610eb0610eaa828663ffffffff61174716565b83611936565b9150505b610ed68f8881518110610ec357fe5b60200260200101516101400151826107ab565b610ee68c8363ffffffff61194d16565b9b50610ef88b8263ffffffff61194d16565b9a508d8c10610f0c57505050505050610f1b565b5050505050505b600101610ba4565b50505050935093915050565b81811115610f3c57610f3c61009b8234611969565b6000610f4e838363ffffffff61174716565b9050801561045d576003546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90610fac908490600401612f03565b600060405180830381600087803b158015610fc657600080fd5b505af1158015610fda573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f1935050505015801561040e573d6000803e3d6000fd5b825160009081907fdc1600f30000000000000000000000000000000000000000000000000000000090825b8181146113265787818151811061104957fe5b6020026020010151608001516000148061107a575087818151811061106a57fe5b602002602001015160a001516000145b156110845761131e565b6000611096888663ffffffff61174716565b905060006110ab60008b8581518110610c5157fe5b90506000807fffffffff000000000000000000000000000000000000000000000000000000008084169088161415611196576110ee60108d8781518110610caf57fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190611143903090600401612b99565b60206040518083038186803b15801561115b57600080fd5b505afa15801561116f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111939190810190612ade565b90505b6000806111ca8e88815181106111a857fe5b60200260200101518d89815181106111bc57fe5b602002602001015188611986565b91509150887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156112d2576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190611269903090600401612b99565b60206040518083038186803b15801561128157600080fd5b505afa158015611295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112b99190810190612ade565b90506112ce610eaa828663ffffffff61174716565b9150505b6112e18e8881518110610ec357fe5b6112f18b8363ffffffff61194d16565b9a506113038a8263ffffffff61194d16565b99508c8a1061131757505050505050611326565b5050505050505b600101611036565b508583101561133c5761133c61009b8785611a58565b5050935093915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060632800659560e01b84848460405160240161139c93929190612c9a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b9392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161144c9190612b7d565b6000604051808303816000865af19150503d8060008114611489576040519150601f19603f3d011682016040523d82523d6000602084013e61148e565b606091505b509150915081156114d25780516114a657505061096b565b8051602014156114d25760006114bd826000611a75565b905080600114156114d05750505061096b565b505b61040e81610222565b6060631de45ad160e01b83836040516024016114f8929190612bba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b600061159083601063ffffffff61066116565b905061045d813384611a81565b806001146115b1576115b161009b82611ab9565b60006115c483601063ffffffff61066116565b905060006115d984602463ffffffff611a7516565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd9061163290309033908690600401612be1565b600060405180830381600087803b15801561164c57600080fd5b505af1158015611660573d6000803e3d6000fd5b5050505050505050565b6060806116846004855186611ad49092919063ffffffff16565b8060200190516116979190810190612949565b8051919350915060005b81811461040b576116ea8382815181106116b757fe5b60200260200101516116e58684815181106116ce57fe5b60200260200101518861176690919063ffffffff16565b6107ab565b6001016116a1565b6060637996a27160e01b8260405160240161019e9190612c38565b6060633ecb6ceb60e01b83836040516024016114f8929190612f0c565b606063ecf40fd960e01b83836040516024016114f8929190612f0c565b6000828211156117605761176061009b60028585611b54565b50900390565b60008261177557506000610601565b8282028284828161178257fe5b041461141c5761141c61009b60018686611b54565b600060038261018001515111801561060157506101808201517f770501f800000000000000000000000000000000000000000000000000000000906117e390600063ffffffff6105b116565b7fffffffff00000000000000000000000000000000000000000000000000000000161492915050565b6000808460e00151600014806118315750611831856101a00151866101400151611b73565b156118885761183e6122af565b611849868587611d20565b90506118668160800151826020015161194d90919063ffffffff16565b60608201518251919450611880919063ffffffff61174716565b91505061192e565b61189c856101a00151866101600151611b73565b1561191d5760a085015160e08601516000916118c9916118c390829063ffffffff61194d16565b86611d5b565b90506118d36122af565b6118de878388611d20565b905061190f81608001516119038360600151846020015161194d90919063ffffffff16565b9063ffffffff61194d16565b9051909350915061192e9050565b61192e61009b866101a00151611d91565b935093915050565b600081831015611946578161141c565b5090919050565b60008282018381101561141c5761141c61009b60008686611b54565b606063cdcbed5d60e01b83836040516024016114f8929190612f0c565b6000808460e00151600014806119ab57506119ab856101a00151866101600151611b73565b156119c55760006118c98660a00151876080015186611d5b565b6119d9856101a00151866101400151611b73565b1561191d576000611a038660a001516118c38860e00151896080015161174790919063ffffffff16565b9050611a0d6122af565b611a18878388611d20565b9050611a358160800151826020015161194d90919063ffffffff16565b60608201518251919550611a4f919063ffffffff61174716565b9250505061192e565b60606391353a0c60e01b83836040516024016114f8929190612f0c565b600061141c8383611dac565b6040516060907fa9059cbb00000000000000000000000000000000000000000000000000000000906106d99085908590602401612c12565b606063baffa47460e01b8260405160240161019e9190612f03565b606081831115611aed57611aed61009b6000858561137d565b8351821115611b0657611b0661009b600184875161137d565b8282036040519080825280601f01601f191660200182016040528015611b33576020820181803883390190505b50905061141c611b4282611dd6565b84611b4c87611dd6565b018351611ddc565b606063e946c1bb60e01b84848460405160240161139c93929190612c78565b600080611b86848263ffffffff6105b116565b90506000611b9a848263ffffffff6105b116565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fdc1600f3000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008416821480611c3257507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b8015611c9057507fffffffff000000000000000000000000000000000000000000000000000000008381169083161480611c9057507fffffffff00000000000000000000000000000000000000000000000000000000838116908216145b15611cfb576000611ca888601063ffffffff61066116565b90506000611cbd88601063ffffffff61066116565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149650505050505050610601565b611d0b878763ffffffff611e9f16565b945050505050610601565b5050505092915050565b611d286122af565b611d3184611797565b15611d4857611d41848484611ec4565b905061141c565b611d53848484612118565b949350505050565b6000611d5383611d85611d7582600163ffffffff61174716565b611903888763ffffffff61176616565b9063ffffffff61228516565b60606331360af160e01b8260405160240161019e9190612c65565b60008160200183511015611dcd57611dcd61009b600585518560200161137d565b50016020015190565b60200190565b6020811015611e06576001816020036101000a03801983511681855116808217865250505061045d565b82821415611e135761045d565b82821115611e4d5760208103905080820181840181515b82851015611e45578451865260209586019590940193611e2a565b90525061045d565b60208103905080820181840183515b81861215611e9657825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09283019290910190611e5c565b85525050505050565b60008151835114801561141c5750508051602091820120825192909101919091201490565b611ecc6122af565b611ed46122de565b604051806101800160405280866000015173ffffffffffffffffffffffffffffffffffffffff168152602001866020015173ffffffffffffffffffffffffffffffffffffffff168152602001866040015173ffffffffffffffffffffffffffffffffffffffff168152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015181526020018660a001518152602001600081526020016000815260200186610100015181526020018661012001518152602001866101400151815260200186610160015181525090506060600073ffffffffffffffffffffffffffffffffffffffff1663b4be83d5905060e01b828686604051602401611fe793929190612ca8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600254915190925073ffffffffffffffffffffffffffffffffffffffff909116906000906060908390612098908690612b7d565b6000604051808303816000865af19150503d80600081146120d5576040519150601f19603f3d011682016040523d82523d6000602084013e6120da565b606091505b5091509150811561210c5780516080146120f057fe5b808060200190516121049190810190612af6565b602088015286525b50505050509392505050565b6121206122af565b6040516060907f9b44d556000000000000000000000000000000000000000000000000000000009061215a90879087908790602401612dc8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600154915190925073ffffffffffffffffffffffffffffffffffffffff90911690600090606090839061220b908690612b7d565b6000604051808303816000865af19150503d8060008114612248576040519150601f19603f3d011682016040523d82523d6000602084013e61224d565b606091505b5091509150811561227a57805160a01461226357fe5b808060200190516122779190810190612a8d565b94505b505050509392505050565b60008161229b5761229b61009b60038585611b54565b60008284816122a657fe5b04949350505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b803561060181612fcf565b600082601f8301126123b2578081fd5b81356123c56123c082612f41565b612f1a565b8181529150602080830190848101818402860182018710156123e657600080fd5b60005b8481101561240e5781356123fc81612fcf565b845292820192908201906001016123e9565b505050505092915050565b600082601f830112612429578081fd5b81516124376123c082612f41565b818152915060208083019084810160005b8481101561240e578151870188603f82011261246357600080fd5b838101516124736123c082612f61565b8181528a604083850101111561248857600080fd5b6124988287830160408601612fa3565b865250509282019290820190600101612448565b600082601f8301126124bc578081fd5b81356124ca6123c082612f41565b8181529150602080830190840160005b83811015611d16576124f28760208435890101612769565b835260209283019291909101906001016124da565b600082601f830112612517578081fd5b81356125256123c082612f41565b818152915060208083019084810160005b8481101561240e57813587016101c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561257657600080fd5b61257f81612f1a565b61258b8b878501612397565b815261259a8b60408501612397565b868201526125ab8b60608501612397565b60408201526125bd8b60808501612397565b606082015260a0830135608082015260c083013560a082015260e083013560c08201526101008084013560e0830152610120808501358284015261014091508185013581840152506101608085013567ffffffffffffffff8082111561262257600080fd5b6126308f8b848a0101612769565b8486015261018093508387013591508082111561264c57600080fd5b61265a8f8b848a0101612769565b838601526101a092508287013591508082111561267657600080fd5b6126848f8b848a0101612769565b848601528587013593508084111561269b57600080fd5b50506126ab8d8984880101612769565b9083015250865250509282019290820190600101612536565b600082601f8301126126d4578081fd5b81356126e26123c082612f41565b81815291506020808301908481018184028601820187101561270357600080fd5b60005b8481101561240e57813584529282019290820190600101612706565b60008083601f840112612733578182fd5b50813567ffffffffffffffff81111561274a578182fd5b60208301915083602082850101111561276257600080fd5b9250929050565b600082601f830112612779578081fd5b81356127876123c082612f61565b915080825283602082850101111561279e57600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156127c8578081fd5b813561141c81612fcf565b6000602082840312156127e4578081fd5b815161141c81612fcf565b60008060008060808587031215612804578283fd5b843567ffffffffffffffff8082111561281b578485fd5b61282788838901612507565b9550602087013591508082111561283c578485fd5b612848888389016124ac565b9450604087013591508082111561285d578384fd5b612869888389016126c4565b9350606087013591508082111561287e578283fd5b5061288b878288016123a2565b91505092959194509250565b600080600080600060a086880312156128ae578283fd5b853567ffffffffffffffff808211156128c5578485fd5b6128d189838a01612507565b96506020880135955060408801359150808211156128ed578485fd5b6128f989838a016124ac565b9450606088013591508082111561290e578283fd5b61291a89838a016126c4565b9350608088013591508082111561292f578283fd5b5061293c888289016123a2565b9150509295509295909350565b6000806040838503121561295b578182fd5b825167ffffffffffffffff80821115612972578384fd5b81850186601f820112612983578485fd5b805192506129936123c084612f41565b80848252602080830192508084018a8283890287010111156129b3578889fd5b8894505b868510156129d55780518452600194909401939281019281016129b7565b5088015190965093505050808211156129ec578283fd5b506129f985828601612419565b9150509250929050565b60008060208385031215612a15578182fd5b823567ffffffffffffffff811115612a2b578283fd5b612a3785828601612722565b90969095509350505050565b600080600060408486031215612a57578081fd5b833567ffffffffffffffff811115612a6d578182fd5b612a7986828701612722565b909790965060209590950135949350505050565b600060a08284031215612a9e578081fd5b612aa860a0612f1a565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215612aef578081fd5b5051919050565b60008060408385031215612b08578182fd5b505080516020909101519092909150565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452612b4b816020860160208601612fa3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251612b8f818460208701612fa3565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60006020825261141c6020830184612b33565b6060810160048510612c8657fe5b938152602081019290925260409091015290565b6060810160088510612c8657fe5b600060608252612cbc606083018651612b19565b6020850151612cce6080840182612b19565b506040850151612ce160a0840182612b19565b506060850151612cf460c0840182612b19565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e088015192506101408381870152828901519350610160925083838701528189015193506101809150838287015280890151935050806101a086015250612d676101e0850183612b33565b8188015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101c0860152612da28184612b33565b9150508560208501528381036040850152612dbd8186612b33565b979650505050505050565b600060608252612ddc606083018651612b19565b6020850151612dee6080840182612b19565b506040850151612e0160a0840182612b19565b506060850151612e1460c0840182612b19565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e0880151925061014083818701528289015193506101609250838387015281890151935061018091508382870152808901519350506101c06101a08181880152612e8a610220880186612b33565b848b015195507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09450848882030183890152612ec68187612b33565b925050828a0151945083878303016101e0880152612ee48286612b33565b9250808a0151945050508185820301610200860152612da28184612b33565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715612f3957600080fd5b604052919050565b600067ffffffffffffffff821115612f57578081fd5b5060209081020190565b600067ffffffffffffffff821115612f77578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015612fbe578181015183820152602001612fa6565b8381111561040e5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff811681146105ae57600080fdfea365627a7a72315820eec27b903034df8255c53e9199fa4129bd65899c9572dc672f6d190dddfbf71b6c6578706572696d656e74616cf564736f6c63430005100040" + "object": "0x60806040523480156200001157600080fd5b5060405162003c9d38038062003c9d833981016040819052620000349162000472565b60008054336001600160a01b031991821617909155600180549091166001600160a01b0383161790556040518390839082908490630f47261b60e41b9062000081908390602401620004e7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217825251620000c191600291620003a0565b50604051630c0e082160e31b81526000906001600160a01b03841690636070410890620000fa90630f47261b60e41b9060040162000514565b60206040518083038186803b1580156200011357600080fd5b505afa15801562000128573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200014e919081019062000442565b90506001600160a01b038116620001895762000189620001786200036b60201b620007b11760201c565b6200039860201b620002d81760201c565b60015460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620001bf90849060001990600401620004fb565b602060405180830381600087803b158015620001da57600080fd5b505af1158015620001ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002159190810190620004c5565b506000836001600160a01b031663850a15016040518163ffffffff1660e01b815260040160206040518083038186803b1580156200025257600080fd5b505afa15801562000267573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200028d919081019062000442565b90506001600160a01b038116156200032d5760015460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620002d590849060001990600401620004fb565b602060405180830381600087803b158015620002f057600080fd5b505af115801562000305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200032b9190810190620004c5565b505b5050600380546001600160a01b039586166001600160a01b031991821617909155600480549490951693169290921790925550620005429350505050565b6040805160048152602481019091526020810180516001600160e01b031663f3b96b8d60e01b1790525b90565b805160208201fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003e357805160ff191683800117855562000413565b8280016001018555821562000413579182015b8281111562000413578251825591602001919060010190620003f6565b506200042192915062000425565b5090565b6200039591905b808211156200042157600081556001016200042c565b60006020828403121562000454578081fd5b81516001600160a01b03811681146200046b578182fd5b9392505050565b60008060006060848603121562000487578182fd5b8351620004948162000529565b6020850151909350620004a78162000529565b6040850151909250620004ba8162000529565b809150509250925092565b600060208284031215620004d7578081fd5b815180151581146200046b578182fd5b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160e01b031991909116815260200190565b6001600160a01b03811681146200053f57600080fd5b50565b61374b80620005526000396000f3fe6080604052600436106100bc5760003560e01c8063bc197c8111610074578063f23a6e611161004e578063f23a6e61146101e4578063f2fde38b14610204578063fc67bf1c14610224576100bc565b8063bc197c811461018d578063e0a5c949146101ba578063e196001b146101cf576100bc565b80638da5cb5b116100a55780638da5cb5b1461012e578063907e5cc3146101595780639e8323151461017a576100bc565b8063442026ed146100ee578063630f1e6c1461010e575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100ec576100ec6100e733610239565b6102d8565b005b3480156100fa57600080fd5b506100ec610109366004613075565b6102e0565b34801561011a57600080fd5b506100ec6101293660046130b5565b6104ca565b34801561013a57600080fd5b50610143610520565b6040516101509190613246565b60405180910390f35b61016c610167366004612e77565b61053c565b604051610150929190613623565b61016c610188366004612f13565b610597565b34801561019957600080fd5b506101ad6101a8366004612d42565b6105f3565b604051610150919061334f565b3480156101c657600080fd5b506101ad610620565b3480156101db57600080fd5b506101ad610644565b3480156101f057600080fd5b506101ad6101ff366004612dfd565b610668565b34801561021057600080fd5b506100ec61021f366004612c72565b610693565b34801561023057600080fd5b506101ad610737565b60606308b1869860e01b826040516024016102549190613246565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b600061032c600084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61075b169050565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082168114156104c4576003546040517f6070410800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906360704108906103d090859060040161334f565b60206040518083038186803b1580156103e857600080fd5b505afa1580156103fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104209190810190612c8e565b905073ffffffffffffffffffffffffffffffffffffffff8116610448576104486100e76107b1565b6000610494601087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61080b169050565b90506104c181837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61084b565b50505b50505050565b6104d261090c565b61051b8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff610955169050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061054b858561096b565b9050610558878288610ac1565b909350915080831115610572576105726100e78434610f28565b610582818463ffffffff610fca16565b905061058d81610fe9565b5094509492505050565b60008060006105a6858561096b565b90506105b38888886110a4565b9093509150808311156105cd576105cd6100e78434610f28565b6105dd818463ffffffff610fca16565b90506105e881610fe9565b509550959350505050565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e610000000000000000000000000000000000000000000000000000000081565b7f770501f80000000000000000000000000000000000000000000000000000000081565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b61069b61090c565b73ffffffffffffffffffffffffffffffffffffffff81166106c6576106c16100e76113e0565b610734565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35b50565b7fbc197c810000000000000000000000000000000000000000000000000000000081565b6000816004018351101561077c5761077c6100e76003855185600401611417565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff3b96b8d0000000000000000000000000000000000000000000000000000000017905290565b6000816014018351101561082c5761082c6100e76004855185601401611417565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907f095ea7b300000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506104c484826114bd565b60005473ffffffffffffffffffffffffffffffffffffffff16331461095357600054610953906100e790339073ffffffffffffffffffffffffffffffffffffffff16611575565b565b6109678230338463ffffffff61159216565b5050565b81518151600091908114610987576109876100e78285516117cd565b34915060005b818114610a365760008582815181106109a257fe5b60200260200101519050808410156109c1576109c16100e782866117ea565b6109d1848263ffffffff610fca16565b93508482815181106109df57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a2c573d6000803e3d6000fd5b505060010161098d565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610aa157600080fd5b505af1158015610ab5573d6000803e3d6000fd5b50505050505092915050565b6000806000610b76600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3157600080fd5b505afa158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b699190810190613150565b3a9063ffffffff61180716565b90507fdc1600f30000000000000000000000000000000000000000000000000000000060005b87518114610f1d57878181518110610bb057fe5b60200260200101516080015160001480610be15750878181518110610bd157fe5b602002602001015160a001516000145b15610beb57610f15565b6000610c35610c0c8a8481518110610bff57fe5b6020026020010151611838565b610c165784610c19565b60005b610c298a8963ffffffff610fca16565b9063ffffffff610fca16565b90506000610c6560008b8581518110610c4a57fe5b6020026020010151610140015161075b90919063ffffffff16565b90506000807fffffffff000000000000000000000000000000000000000000000000000000008084169087161415610d6b57610cc360108d8781518110610ca857fe5b6020026020010151610140015161080b90919063ffffffff16565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190610d18903090600401613246565b60206040518083038186803b158015610d3057600080fd5b505afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d689190810190613150565b90505b600080610d9f8e8881518110610d7d57fe5b60200260200101518d8981518110610d9157fe5b6020026020010151886118ad565b91509150877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ead576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190610e3e903090600401613246565b60206040518083038186803b158015610e5657600080fd5b505afa158015610e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e8e9190810190613150565b9050610ea9610ea3828663ffffffff610fca16565b836119d7565b9150505b610ed8818f8981518110610ebd57fe5b6020026020010151610140015161095590919063ffffffff16565b610ee88b8363ffffffff6119ee16565b9a50610efa8a8263ffffffff6119ee16565b99508c8b10610f0e57505050505050610f1d565b5050505050505b600101610b9c565b505050935093915050565b606063cdcbed5d60e01b8383604051602401610f45929190613623565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b600082821115610fe357610fe36100e760028585611a06565b50900390565b8015610734576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d9061104590849060040161361a565b600060405180830381600087803b15801561105f57600080fd5b505af1158015611073573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f19350505050158015610967573d6000803e3d6000fd5b825160009081907fdc1600f30000000000000000000000000000000000000000000000000000000090825b8181146113c0578781815181106110e257fe5b60200260200101516080015160001480611113575087818151811061110357fe5b602002602001015160a001516000145b1561111d576113b8565b600061112f888663ffffffff610fca16565b9050600061114460008b8581518110610c4a57fe5b90506000807fffffffff00000000000000000000000000000000000000000000000000000000808416908816141561122f5761118760108d8781518110610ca857fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906111dc903090600401613246565b60206040518083038186803b1580156111f457600080fd5b505afa158015611208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061122c9190810190613150565b90505b6000806112638e888151811061124157fe5b60200260200101518d898151811061125557fe5b602002602001015188611a25565b91509150887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561136b576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190611302903090600401613246565b60206040518083038186803b15801561131a57600080fd5b505afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113529190810190613150565b9050611367610ea3828663ffffffff610fca16565b9150505b61137b818f8981518110610ebd57fe5b61138b8b8363ffffffff6119ee16565b9a5061139d8a8263ffffffff6119ee16565b99508c8a106113b1575050505050506113c0565b5050505050505b6001016110cf565b50858310156113d6576113d66100e78785611af7565b5050935093915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060632800659560e01b848484604051602401611436939291906133b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b9392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516114e6919061322a565b6000604051808303816000865af19150503d8060008114611523576040519150601f19603f3d011682016040523d82523d6000602084013e611528565b606091505b5091509150811561156c578051611540575050610967565b80516020141561156c576000611557826000611b14565b9050806001141561156a57505050610967565b505b6104c4816102d8565b6060631de45ad160e01b8383604051602401610f45929190613267565b8061159c576104c4565b60006115ae858263ffffffff61075b16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000148061164157507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f300000000000000000000000000000000000000000000000000000000145b1561165d576116588585858563ffffffff611b2016565b6117c6565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f025717920000000000000000000000000000000000000000000000000000000014156116b9576116588585858563ffffffff611b6a16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415611715576116588585858563ffffffff611c3916565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611771576116588585858563ffffffff611d8f16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a00000000000000000000000000000000000000000000000000000000146117c6576117c66100e782611e23565b5050505050565b6060633ecb6ceb60e01b8383604051602401610f45929190613623565b606063ecf40fd960e01b8383604051602401610f45929190613623565b600082611816575060006107ab565b8282028284828161182357fe5b04146114b6576114b66100e760018686611a06565b60006003826101800151511180156107ab57506101808201517f770501f8000000000000000000000000000000000000000000000000000000009061188490600063ffffffff61075b16565b7fffffffff00000000000000000000000000000000000000000000000000000000161492915050565b6000808460e00151600014806118d257506118d2856101a00151866101400151611e3e565b15611929576118df612710565b6118ea868587611feb565b9050611907816080015182602001516119ee90919063ffffffff16565b60608201518251919450611921919063ffffffff610fca16565b9150506119cf565b61193d856101a00151866101600151611e3e565b156119be5760a085015160e086015160009161196a9161196490829063ffffffff6119ee16565b86612026565b9050611974612710565b61197f878388611feb565b90506119b081608001516119a4836060015184602001516119ee90919063ffffffff16565b9063ffffffff6119ee16565b905190935091506119cf9050565b6119cf6100e7866101a0015161205c565b935093915050565b6000818310156119e757816114b6565b5090919050565b6000828201838110156114b6576114b66100e7600086865b606063e946c1bb60e01b8484846040516024016114369392919061338f565b6000808460e0015160001480611a4a5750611a4a856101a00151866101600151611e3e565b15611a6457600061196a8660a00151876080015186612026565b611a78856101a00151866101400151611e3e565b156119be576000611aa28660a001516119648860e001518960800151610fca90919063ffffffff16565b9050611aac612710565b611ab7878388611feb565b9050611ad4816080015182602001516119ee90919063ffffffff16565b60608201518251919550611aee919063ffffffff610fca16565b925050506119cf565b60606391353a0c60e01b8383604051602401610f45929190613623565b60006114b68383612077565b6000611b3385601063ffffffff61080b16565b905073ffffffffffffffffffffffffffffffffffffffff8416301415611b5e576116588184846120a1565b6117c6818585856120d9565b80600114611b7e57611b7e6100e78261219c565b6000611b9185601063ffffffff61080b16565b90506000611ba686602463ffffffff611b1416565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd90611bff908890889086906004016132f8565b600060405180830381600087803b158015611c1957600080fd5b505af1158015611c2d573d6000803e3d6000fd5b50505050505050505050565b60006060806060611c57600489518a6121b79092919063ffffffff16565b806020019051611c6a9190810190612caa565b9350935093509350600082519050606081604051908082528060200260200182016040528015611ca4578160200160208202803883390190505b50905060005b828114611cf657611cd788868381518110611cc157fe5b602002602001015161180790919063ffffffff16565b828281518110611ce357fe5b6020908102919091010152600101611caa565b506040517f2eb2c2d600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690632eb2c2d690611d51908c908c908a9087908a9060040161328e565b600060405180830381600087803b158015611d6b57600080fd5b505af1158015611d7f573d6000803e3d6000fd5b5050505050505050505050505050565b606080611da960048751886121b79092919063ffffffff16565b806020019051611dbc9190810190612fc5565b8051919350915060005b818114611e1957611e11838281518110611ddc57fe5b60200260200101518888611e0c888681518110611df557fe5b60200260200101518a61180790919063ffffffff16565b611592565b600101611dc6565b5050505050505050565b6060637996a27160e01b82604051602401610254919061334f565b600080611e51848263ffffffff61075b16565b90506000611e65848263ffffffff61075b16565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fdc1600f3000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008416821480611efd57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b8015611f5b57507fffffffff000000000000000000000000000000000000000000000000000000008381169083161480611f5b57507fffffffff00000000000000000000000000000000000000000000000000000000838116908216145b15611fc6576000611f7388601063ffffffff61080b16565b90506000611f8888601063ffffffff61080b16565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161496505050505050506107ab565b611fd6878763ffffffff61223716565b9450505050506107ab565b5050505092915050565b611ff3612710565b611ffc84611838565b156120135761200c84848461225c565b90506114b6565b61201e8484846124b0565b949350505050565b600061201e8361205061204082600163ffffffff610fca16565b6119a4888763ffffffff61180716565b9063ffffffff61261d16565b60606331360af160e01b82604051602401610254919061337c565b60008160200183511015612098576120986100e76005855185602001611417565b50016020015190565b6040516060907fa9059cbb00000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b6040516060907f23b872dd0000000000000000000000000000000000000000000000000000000090612113908690869086906024016132f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506117c685826114bd565b606063baffa47460e01b82604051602401610254919061361a565b6060818311156121d0576121d06100e760008585611417565b83518211156121e9576121e96100e76001848751611417565b8282036040519080825280601f01601f191660200182016040528015612216576020820181803883390190505b5090506114b661222582612647565b8461222f87612647565b01835161264d565b6000815183511480156114b65750508051602091820120825192909101919091201490565b612264612710565b61226c61273f565b604051806101800160405280866000015173ffffffffffffffffffffffffffffffffffffffff168152602001866020015173ffffffffffffffffffffffffffffffffffffffff168152602001866040015173ffffffffffffffffffffffffffffffffffffffff168152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015181526020018660a001518152602001600081526020016000815260200186610100015181526020018661012001518152602001866101400151815260200186610160015181525090506060600073ffffffffffffffffffffffffffffffffffffffff1663b4be83d5905060e01b82868660405160240161237f939291906133bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600454915190925073ffffffffffffffffffffffffffffffffffffffff90911690600090606090839061243090869061322a565b6000604051808303816000865af19150503d806000811461246d576040519150601f19603f3d011682016040523d82523d6000602084013e612472565b606091505b509150915081156124a457805160801461248857fe5b8080602001905161249c9190810190613168565b602088015286525b50505050509392505050565b6124b8612710565b6040516060907f9b44d55600000000000000000000000000000000000000000000000000000000906124f2908790879087906024016134df565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600354915190925073ffffffffffffffffffffffffffffffffffffffff9091169060009060609083906125a390869061322a565b6000604051808303816000865af19150503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b5091509150811561261257805160a0146125fb57fe5b8080602001905161260f91908101906130ff565b94505b505050509392505050565b600081612633576126336100e760038585611a06565b600082848161263e57fe5b04949350505050565b60200190565b6020811015612677576001816020036101000a03801983511681855116808217865250505061051b565b828214156126845761051b565b828211156126be5760208103905080820181840181515b828510156126b657845186526020958601959094019361269b565b90525061051b565b60208103905080820181840183515b8186121561270757825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906126cd565b85525050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b80356107ab816136e6565b600082601f830112612813578081fd5b813561282661282182613658565b613631565b81815291506020808301908481018184028601820187101561284757600080fd5b60005b8481101561286f57813561285d816136e6565b8452928201929082019060010161284a565b505050505092915050565b600082601f83011261288a578081fd5b813561289861282182613658565b8181529150602080830190840160005b83811015611fe1576128c08760208435890101612bd7565b835260209283019291909101906001016128a8565b600082601f8301126128e5578081fd5b81356128f361282182613658565b818152915060208083019084810160005b8481101561286f57813587016101c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561294457600080fd5b61294d81613631565b6129598b8785016127f8565b81526129688b604085016127f8565b868201526129798b606085016127f8565b604082015261298b8b608085016127f8565b606082015260a0830135608082015260c083013560a082015260e083013560c08201526101008084013560e0830152610120808501358284015261014091508185013581840152506101608085013567ffffffffffffffff808211156129f057600080fd5b6129fe8f8b848a0101612bd7565b84860152610180935083870135915080821115612a1a57600080fd5b612a288f8b848a0101612bd7565b838601526101a0925082870135915080821115612a4457600080fd5b612a528f8b848a0101612bd7565b8486015285870135935080841115612a6957600080fd5b5050612a798d8984880101612bd7565b9083015250865250509282019290820190600101612904565b60008083601f840112612aa3578182fd5b50813567ffffffffffffffff811115612aba578182fd5b6020830191508360208083028501011115612ad457600080fd5b9250929050565b600082601f830112612aeb578081fd5b8151612af961282182613658565b818152915060208083019084810181840286018201871015612b1a57600080fd5b60005b8481101561286f57815184529282019290820190600101612b1d565b600082601f830112612b49578081fd5b8135612b5761282182613658565b818152915060208083019084810181840286018201871015612b7857600080fd5b60005b8481101561286f57813584529282019290820190600101612b7b565b60008083601f840112612ba8578182fd5b50813567ffffffffffffffff811115612bbf578182fd5b602083019150836020828501011115612ad457600080fd5b600082601f830112612be7578081fd5b8135612bf561282182613678565b9150808252836020828501011115612c0c57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112612c35578081fd5b8151612c4361282182613678565b9150808252836020828501011115612c5a57600080fd5b612c6b8160208401602086016136ba565b5092915050565b600060208284031215612c83578081fd5b81356114b6816136e6565b600060208284031215612c9f578081fd5b81516114b6816136e6565b60008060008060808587031215612cbf578283fd5b8451612cca816136e6565b602086015190945067ffffffffffffffff80821115612ce7578485fd5b612cf388838901612adb565b94506040870151915080821115612d08578384fd5b612d1488838901612adb565b93506060870151915080821115612d29578283fd5b50612d3687828801612c25565b91505092959194509250565b60008060008060008060008060a0898b031215612d5d578586fd5b8835612d68816136e6565b97506020890135612d78816136e6565b9650604089013567ffffffffffffffff80821115612d94578788fd5b612da08c838d01612a92565b909850965060608b0135915080821115612db8578586fd5b612dc48c838d01612a92565b909650945060808b0135915080821115612ddc578384fd5b50612de98b828c01612b97565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215612e15578384fd5b8635612e20816136e6565b95506020870135612e30816136e6565b94506040870135935060608701359250608087013567ffffffffffffffff811115612e59578283fd5b612e6589828a01612b97565b979a9699509497509295939492505050565b60008060008060808587031215612e8c578182fd5b843567ffffffffffffffff80821115612ea3578384fd5b612eaf888389016128d5565b95506020870135915080821115612ec4578384fd5b612ed08883890161287a565b94506040870135915080821115612ee5578384fd5b612ef188838901612b39565b93506060870135915080821115612f06578283fd5b50612d3687828801612803565b600080600080600060a08688031215612f2a578283fd5b853567ffffffffffffffff80821115612f41578485fd5b612f4d89838a016128d5565b9650602088013595506040880135915080821115612f69578485fd5b612f7589838a0161287a565b94506060880135915080821115612f8a578283fd5b612f9689838a01612b39565b93506080880135915080821115612fab578283fd5b50612fb888828901612803565b9150509295509295909350565b60008060408385031215612fd7578182fd5b825167ffffffffffffffff80821115612fee578384fd5b612ffa86838701612adb565b9350602091508185015181811115613010578384fd5b85019050601f81018613613022578283fd5b805161303061282182613658565b81815283810190838501865b84811015613065576130538b888451890101612c25565b8452928601929086019060010161303c565b5096999098509650505050505050565b60008060208385031215613087578182fd5b823567ffffffffffffffff81111561309d578283fd5b6130a985828601612b97565b90969095509350505050565b6000806000604084860312156130c9578081fd5b833567ffffffffffffffff8111156130df578182fd5b6130eb86828701612b97565b909790965060209590950135949350505050565b600060a08284031215613110578081fd5b61311a60a0613631565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215613161578081fd5b5051919050565b6000806040838503121561317a578182fd5b505080516020909101519092909150565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156131d65781518652602095860195909101906001016131b8565b5093949350505050565b600081518084526131f88160208601602086016136ba565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161323c8184602087016136ba565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526132c760a08301866131a5565b82810360608401526132d981866131a5565b83810360808501526132eb81866131e0565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6000602082526114b660208301846131e0565b606081016004851061339d57fe5b938152602081019290925260409091015290565b606081016008851061339d57fe5b6000606082526133d360608301865161318b565b60208501516133e5608084018261318b565b5060408501516133f860a084018261318b565b50606085015161340b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e088015192506101408381870152828901519350610160925083838701528189015193506101809150838287015280890151935050806101a08601525061347e6101e08501836131e0565b8188015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101c08601526134b981846131e0565b91505085602085015283810360408501526134d481866131e0565b979650505050505050565b6000606082526134f360608301865161318b565b6020850151613505608084018261318b565b50604085015161351860a084018261318b565b50606085015161352b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e0880151925061014083818701528289015193506101609250838387015281890151935061018091508382870152808901519350506101c06101a081818801526135a16102208801866131e0565b848b015195507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa094508488820301838901526135dd81876131e0565b925050828a0151945083878303016101e08801526135fb82866131e0565b9250808a01519450505081858203016102008601526134b981846131e0565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561365057600080fd5b604052919050565b600067ffffffffffffffff82111561366e578081fd5b5060209081020190565b600067ffffffffffffffff82111561368e578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156136d55781810151838201526020016136bd565b838111156104c45750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461073457600080fdfea365627a7a7231582046e7b4801e4017360012dc9f596c66d1113c57a190987d4f3089965a65faa3c56c6578706572696d656e74616cf564736f6c63430005100040" }, "deployedBytecode": { - "object": "0x6080604052600436106100705760003560e01c8063907e5cc31161004e578063907e5cc31461010d5780639e8323151461012e578063e196001b14610141578063f2fde38b1461016357610070565b8063442026ed146100a2578063630f1e6c146100c25780638da5cb5b146100e2575b60035473ffffffffffffffffffffffffffffffffffffffff1633146100a0576100a061009b33610183565b610222565b005b3480156100ae57600080fd5b506100a06100bd366004612a03565b61022a565b3480156100ce57600080fd5b506100a06100dd366004612a43565b610414565b3480156100ee57600080fd5b506100f7610462565b6040516101049190612b99565b60405180910390f35b61012061011b3660046127ef565b61047e565b604051610104929190612f0c565b61012061013c366004612897565b6104b3565b34801561014d57600080fd5b506101566104e9565b6040516101049190612c38565b34801561016f57600080fd5b506100a061017e3660046127b7565b61050d565b60606308b1869860e01b8260405160240161019e9190612b99565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b6000610276600084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff6105b1169050565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821681141561040e576001546040517f6070410800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff169063607041089061031a908590600401612c38565b60206040518083038186803b15801561033257600080fd5b505afa158015610346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061036a91908101906127d3565b905073ffffffffffffffffffffffffffffffffffffffff81166103925761039261009b610607565b60006103de601087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff610661169050565b905061040b81837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6106a1565b50505b50505050565b61041c610762565b61045d83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508592506107ab915050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061048d858561096f565b905061049a878288610ac5565b90935091506104a98184610f27565b5094509492505050565b60008060006104c2858561096f565b90506104cf88888861100b565b90935091506104de8184610f27565b509550959350505050565b7f770501f80000000000000000000000000000000000000000000000000000000081565b610515610762565b73ffffffffffffffffffffffffffffffffffffffff81166105405761053b61009b611346565b6105ae565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35b50565b600081600401835110156105d2576105d261009b600385518560040161137d565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff3b96b8d0000000000000000000000000000000000000000000000000000000017905290565b600081601401835110156106825761068261009b600485518560140161137d565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907f095ea7b300000000000000000000000000000000000000000000000000000000906106d99085908590602401612c12565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061040e8482611423565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107a9576000546107a99061009b90339073ffffffffffffffffffffffffffffffffffffffff166114db565b565b806107b55761096b565b60006107c7838263ffffffff6105b116565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000148061085a57507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f300000000000000000000000000000000000000000000000000000000145b1561086e57610869838361157d565b61045d565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f025717920000000000000000000000000000000000000000000000000000000014156108c257610869838361159d565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd700000000000000000000000000000000000000000000000000000000141561091657610869838361166a565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a000000000000000000000000000000000000000000000000000000001461045d5761045d61009b826116f2565b5050565b8151815160009190811461098b5761098b61009b82855161170d565b34915060005b818114610a3a5760008582815181106109a657fe5b60200260200101519050808410156109c5576109c561009b828661172a565b6109d5848263ffffffff61174716565b93508482815181106109e357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a30573d6000803e3d6000fd5b5050600101610991565b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610aa557600080fd5b505af1158015610ab9573d6000803e3d6000fd5b50505050505092915050565b6000806000610b7a600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3557600080fd5b505afa158015610b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b6d9190810190612ade565b3a9063ffffffff61176616565b86519091507fdc1600f3000000000000000000000000000000000000000000000000000000009060005b818114610f1b57888181518110610bb757fe5b60200260200101516080015160001480610be85750888181518110610bd857fe5b602002602001015160a001516000145b15610bf257610f13565b6000610c3c610c138b8481518110610c0657fe5b6020026020010151611797565b610c1d5785610c20565b60005b610c308b8a63ffffffff61174716565b9063ffffffff61174716565b90506000610c6c60008c8581518110610c5157fe5b602002602001015161014001516105b190919063ffffffff16565b90506000807fffffffff000000000000000000000000000000000000000000000000000000008084169088161415610d7257610cca60108e8781518110610caf57fe5b6020026020010151610140015161066190919063ffffffff16565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190610d1f903090600401612b99565b60206040518083038186803b158015610d3757600080fd5b505afa158015610d4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d6f9190810190612ade565b90505b600080610da68f8881518110610d8457fe5b60200260200101518e8981518110610d9857fe5b60200260200101518861180c565b91509150887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610eb4576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190610e45903090600401612b99565b60206040518083038186803b158015610e5d57600080fd5b505afa158015610e71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e959190810190612ade565b9050610eb0610eaa828663ffffffff61174716565b83611936565b9150505b610ed68f8881518110610ec357fe5b60200260200101516101400151826107ab565b610ee68c8363ffffffff61194d16565b9b50610ef88b8263ffffffff61194d16565b9a508d8c10610f0c57505050505050610f1b565b5050505050505b600101610ba4565b50505050935093915050565b81811115610f3c57610f3c61009b8234611969565b6000610f4e838363ffffffff61174716565b9050801561045d576003546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90610fac908490600401612f03565b600060405180830381600087803b158015610fc657600080fd5b505af1158015610fda573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f1935050505015801561040e573d6000803e3d6000fd5b825160009081907fdc1600f30000000000000000000000000000000000000000000000000000000090825b8181146113265787818151811061104957fe5b6020026020010151608001516000148061107a575087818151811061106a57fe5b602002602001015160a001516000145b156110845761131e565b6000611096888663ffffffff61174716565b905060006110ab60008b8581518110610c5157fe5b90506000807fffffffff000000000000000000000000000000000000000000000000000000008084169088161415611196576110ee60108d8781518110610caf57fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190611143903090600401612b99565b60206040518083038186803b15801561115b57600080fd5b505afa15801561116f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111939190810190612ade565b90505b6000806111ca8e88815181106111a857fe5b60200260200101518d89815181106111bc57fe5b602002602001015188611986565b91509150887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156112d2576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190611269903090600401612b99565b60206040518083038186803b15801561128157600080fd5b505afa158015611295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112b99190810190612ade565b90506112ce610eaa828663ffffffff61174716565b9150505b6112e18e8881518110610ec357fe5b6112f18b8363ffffffff61194d16565b9a506113038a8263ffffffff61194d16565b99508c8a1061131757505050505050611326565b5050505050505b600101611036565b508583101561133c5761133c61009b8785611a58565b5050935093915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060632800659560e01b84848460405160240161139c93929190612c9a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b9392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161144c9190612b7d565b6000604051808303816000865af19150503d8060008114611489576040519150601f19603f3d011682016040523d82523d6000602084013e61148e565b606091505b509150915081156114d25780516114a657505061096b565b8051602014156114d25760006114bd826000611a75565b905080600114156114d05750505061096b565b505b61040e81610222565b6060631de45ad160e01b83836040516024016114f8929190612bba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b600061159083601063ffffffff61066116565b905061045d813384611a81565b806001146115b1576115b161009b82611ab9565b60006115c483601063ffffffff61066116565b905060006115d984602463ffffffff611a7516565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd9061163290309033908690600401612be1565b600060405180830381600087803b15801561164c57600080fd5b505af1158015611660573d6000803e3d6000fd5b5050505050505050565b6060806116846004855186611ad49092919063ffffffff16565b8060200190516116979190810190612949565b8051919350915060005b81811461040b576116ea8382815181106116b757fe5b60200260200101516116e58684815181106116ce57fe5b60200260200101518861176690919063ffffffff16565b6107ab565b6001016116a1565b6060637996a27160e01b8260405160240161019e9190612c38565b6060633ecb6ceb60e01b83836040516024016114f8929190612f0c565b606063ecf40fd960e01b83836040516024016114f8929190612f0c565b6000828211156117605761176061009b60028585611b54565b50900390565b60008261177557506000610601565b8282028284828161178257fe5b041461141c5761141c61009b60018686611b54565b600060038261018001515111801561060157506101808201517f770501f800000000000000000000000000000000000000000000000000000000906117e390600063ffffffff6105b116565b7fffffffff00000000000000000000000000000000000000000000000000000000161492915050565b6000808460e00151600014806118315750611831856101a00151866101400151611b73565b156118885761183e6122af565b611849868587611d20565b90506118668160800151826020015161194d90919063ffffffff16565b60608201518251919450611880919063ffffffff61174716565b91505061192e565b61189c856101a00151866101600151611b73565b1561191d5760a085015160e08601516000916118c9916118c390829063ffffffff61194d16565b86611d5b565b90506118d36122af565b6118de878388611d20565b905061190f81608001516119038360600151846020015161194d90919063ffffffff16565b9063ffffffff61194d16565b9051909350915061192e9050565b61192e61009b866101a00151611d91565b935093915050565b600081831015611946578161141c565b5090919050565b60008282018381101561141c5761141c61009b60008686611b54565b606063cdcbed5d60e01b83836040516024016114f8929190612f0c565b6000808460e00151600014806119ab57506119ab856101a00151866101600151611b73565b156119c55760006118c98660a00151876080015186611d5b565b6119d9856101a00151866101400151611b73565b1561191d576000611a038660a001516118c38860e00151896080015161174790919063ffffffff16565b9050611a0d6122af565b611a18878388611d20565b9050611a358160800151826020015161194d90919063ffffffff16565b60608201518251919550611a4f919063ffffffff61174716565b9250505061192e565b60606391353a0c60e01b83836040516024016114f8929190612f0c565b600061141c8383611dac565b6040516060907fa9059cbb00000000000000000000000000000000000000000000000000000000906106d99085908590602401612c12565b606063baffa47460e01b8260405160240161019e9190612f03565b606081831115611aed57611aed61009b6000858561137d565b8351821115611b0657611b0661009b600184875161137d565b8282036040519080825280601f01601f191660200182016040528015611b33576020820181803883390190505b50905061141c611b4282611dd6565b84611b4c87611dd6565b018351611ddc565b606063e946c1bb60e01b84848460405160240161139c93929190612c78565b600080611b86848263ffffffff6105b116565b90506000611b9a848263ffffffff6105b116565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fdc1600f3000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008416821480611c3257507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b8015611c9057507fffffffff000000000000000000000000000000000000000000000000000000008381169083161480611c9057507fffffffff00000000000000000000000000000000000000000000000000000000838116908216145b15611cfb576000611ca888601063ffffffff61066116565b90506000611cbd88601063ffffffff61066116565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149650505050505050610601565b611d0b878763ffffffff611e9f16565b945050505050610601565b5050505092915050565b611d286122af565b611d3184611797565b15611d4857611d41848484611ec4565b905061141c565b611d53848484612118565b949350505050565b6000611d5383611d85611d7582600163ffffffff61174716565b611903888763ffffffff61176616565b9063ffffffff61228516565b60606331360af160e01b8260405160240161019e9190612c65565b60008160200183511015611dcd57611dcd61009b600585518560200161137d565b50016020015190565b60200190565b6020811015611e06576001816020036101000a03801983511681855116808217865250505061045d565b82821415611e135761045d565b82821115611e4d5760208103905080820181840181515b82851015611e45578451865260209586019590940193611e2a565b90525061045d565b60208103905080820181840183515b81861215611e9657825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09283019290910190611e5c565b85525050505050565b60008151835114801561141c5750508051602091820120825192909101919091201490565b611ecc6122af565b611ed46122de565b604051806101800160405280866000015173ffffffffffffffffffffffffffffffffffffffff168152602001866020015173ffffffffffffffffffffffffffffffffffffffff168152602001866040015173ffffffffffffffffffffffffffffffffffffffff168152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015181526020018660a001518152602001600081526020016000815260200186610100015181526020018661012001518152602001866101400151815260200186610160015181525090506060600073ffffffffffffffffffffffffffffffffffffffff1663b4be83d5905060e01b828686604051602401611fe793929190612ca8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600254915190925073ffffffffffffffffffffffffffffffffffffffff909116906000906060908390612098908690612b7d565b6000604051808303816000865af19150503d80600081146120d5576040519150601f19603f3d011682016040523d82523d6000602084013e6120da565b606091505b5091509150811561210c5780516080146120f057fe5b808060200190516121049190810190612af6565b602088015286525b50505050509392505050565b6121206122af565b6040516060907f9b44d556000000000000000000000000000000000000000000000000000000009061215a90879087908790602401612dc8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600154915190925073ffffffffffffffffffffffffffffffffffffffff90911690600090606090839061220b908690612b7d565b6000604051808303816000865af19150503d8060008114612248576040519150601f19603f3d011682016040523d82523d6000602084013e61224d565b606091505b5091509150811561227a57805160a01461226357fe5b808060200190516122779190810190612a8d565b94505b505050509392505050565b60008161229b5761229b61009b60038585611b54565b60008284816122a657fe5b04949350505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b803561060181612fcf565b600082601f8301126123b2578081fd5b81356123c56123c082612f41565b612f1a565b8181529150602080830190848101818402860182018710156123e657600080fd5b60005b8481101561240e5781356123fc81612fcf565b845292820192908201906001016123e9565b505050505092915050565b600082601f830112612429578081fd5b81516124376123c082612f41565b818152915060208083019084810160005b8481101561240e578151870188603f82011261246357600080fd5b838101516124736123c082612f61565b8181528a604083850101111561248857600080fd5b6124988287830160408601612fa3565b865250509282019290820190600101612448565b600082601f8301126124bc578081fd5b81356124ca6123c082612f41565b8181529150602080830190840160005b83811015611d16576124f28760208435890101612769565b835260209283019291909101906001016124da565b600082601f830112612517578081fd5b81356125256123c082612f41565b818152915060208083019084810160005b8481101561240e57813587016101c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561257657600080fd5b61257f81612f1a565b61258b8b878501612397565b815261259a8b60408501612397565b868201526125ab8b60608501612397565b60408201526125bd8b60808501612397565b606082015260a0830135608082015260c083013560a082015260e083013560c08201526101008084013560e0830152610120808501358284015261014091508185013581840152506101608085013567ffffffffffffffff8082111561262257600080fd5b6126308f8b848a0101612769565b8486015261018093508387013591508082111561264c57600080fd5b61265a8f8b848a0101612769565b838601526101a092508287013591508082111561267657600080fd5b6126848f8b848a0101612769565b848601528587013593508084111561269b57600080fd5b50506126ab8d8984880101612769565b9083015250865250509282019290820190600101612536565b600082601f8301126126d4578081fd5b81356126e26123c082612f41565b81815291506020808301908481018184028601820187101561270357600080fd5b60005b8481101561240e57813584529282019290820190600101612706565b60008083601f840112612733578182fd5b50813567ffffffffffffffff81111561274a578182fd5b60208301915083602082850101111561276257600080fd5b9250929050565b600082601f830112612779578081fd5b81356127876123c082612f61565b915080825283602082850101111561279e57600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156127c8578081fd5b813561141c81612fcf565b6000602082840312156127e4578081fd5b815161141c81612fcf565b60008060008060808587031215612804578283fd5b843567ffffffffffffffff8082111561281b578485fd5b61282788838901612507565b9550602087013591508082111561283c578485fd5b612848888389016124ac565b9450604087013591508082111561285d578384fd5b612869888389016126c4565b9350606087013591508082111561287e578283fd5b5061288b878288016123a2565b91505092959194509250565b600080600080600060a086880312156128ae578283fd5b853567ffffffffffffffff808211156128c5578485fd5b6128d189838a01612507565b96506020880135955060408801359150808211156128ed578485fd5b6128f989838a016124ac565b9450606088013591508082111561290e578283fd5b61291a89838a016126c4565b9350608088013591508082111561292f578283fd5b5061293c888289016123a2565b9150509295509295909350565b6000806040838503121561295b578182fd5b825167ffffffffffffffff80821115612972578384fd5b81850186601f820112612983578485fd5b805192506129936123c084612f41565b80848252602080830192508084018a8283890287010111156129b3578889fd5b8894505b868510156129d55780518452600194909401939281019281016129b7565b5088015190965093505050808211156129ec578283fd5b506129f985828601612419565b9150509250929050565b60008060208385031215612a15578182fd5b823567ffffffffffffffff811115612a2b578283fd5b612a3785828601612722565b90969095509350505050565b600080600060408486031215612a57578081fd5b833567ffffffffffffffff811115612a6d578182fd5b612a7986828701612722565b909790965060209590950135949350505050565b600060a08284031215612a9e578081fd5b612aa860a0612f1a565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215612aef578081fd5b5051919050565b60008060408385031215612b08578182fd5b505080516020909101519092909150565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452612b4b816020860160208601612fa3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251612b8f818460208701612fa3565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60006020825261141c6020830184612b33565b6060810160048510612c8657fe5b938152602081019290925260409091015290565b6060810160088510612c8657fe5b600060608252612cbc606083018651612b19565b6020850151612cce6080840182612b19565b506040850151612ce160a0840182612b19565b506060850151612cf460c0840182612b19565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e088015192506101408381870152828901519350610160925083838701528189015193506101809150838287015280890151935050806101a086015250612d676101e0850183612b33565b8188015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101c0860152612da28184612b33565b9150508560208501528381036040850152612dbd8186612b33565b979650505050505050565b600060608252612ddc606083018651612b19565b6020850151612dee6080840182612b19565b506040850151612e0160a0840182612b19565b506060850151612e1460c0840182612b19565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e0880151925061014083818701528289015193506101609250838387015281890151935061018091508382870152808901519350506101c06101a08181880152612e8a610220880186612b33565b848b015195507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09450848882030183890152612ec68187612b33565b925050828a0151945083878303016101e0880152612ee48286612b33565b9250808a0151945050508185820301610200860152612da28184612b33565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715612f3957600080fd5b604052919050565b600067ffffffffffffffff821115612f57578081fd5b5060209081020190565b600067ffffffffffffffff821115612f77578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015612fbe578181015183820152602001612fa6565b8381111561040e5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff811681146105ae57600080fdfea365627a7a72315820eec27b903034df8255c53e9199fa4129bd65899c9572dc672f6d190dddfbf71b6c6578706572696d656e74616cf564736f6c63430005100040" + "object": "0x6080604052600436106100bc5760003560e01c8063bc197c8111610074578063f23a6e611161004e578063f23a6e61146101e4578063f2fde38b14610204578063fc67bf1c14610224576100bc565b8063bc197c811461018d578063e0a5c949146101ba578063e196001b146101cf576100bc565b80638da5cb5b116100a55780638da5cb5b1461012e578063907e5cc3146101595780639e8323151461017a576100bc565b8063442026ed146100ee578063630f1e6c1461010e575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100ec576100ec6100e733610239565b6102d8565b005b3480156100fa57600080fd5b506100ec610109366004613075565b6102e0565b34801561011a57600080fd5b506100ec6101293660046130b5565b6104ca565b34801561013a57600080fd5b50610143610520565b6040516101509190613246565b60405180910390f35b61016c610167366004612e77565b61053c565b604051610150929190613623565b61016c610188366004612f13565b610597565b34801561019957600080fd5b506101ad6101a8366004612d42565b6105f3565b604051610150919061334f565b3480156101c657600080fd5b506101ad610620565b3480156101db57600080fd5b506101ad610644565b3480156101f057600080fd5b506101ad6101ff366004612dfd565b610668565b34801561021057600080fd5b506100ec61021f366004612c72565b610693565b34801561023057600080fd5b506101ad610737565b60606308b1869860e01b826040516024016102549190613246565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b600061032c600084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61075b169050565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082168114156104c4576003546040517f6070410800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906360704108906103d090859060040161334f565b60206040518083038186803b1580156103e857600080fd5b505afa1580156103fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104209190810190612c8e565b905073ffffffffffffffffffffffffffffffffffffffff8116610448576104486100e76107b1565b6000610494601087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61080b169050565b90506104c181837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61084b565b50505b50505050565b6104d261090c565b61051b8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff610955169050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061054b858561096b565b9050610558878288610ac1565b909350915080831115610572576105726100e78434610f28565b610582818463ffffffff610fca16565b905061058d81610fe9565b5094509492505050565b60008060006105a6858561096b565b90506105b38888886110a4565b9093509150808311156105cd576105cd6100e78434610f28565b6105dd818463ffffffff610fca16565b90506105e881610fe9565b509550959350505050565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e610000000000000000000000000000000000000000000000000000000081565b7f770501f80000000000000000000000000000000000000000000000000000000081565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b61069b61090c565b73ffffffffffffffffffffffffffffffffffffffff81166106c6576106c16100e76113e0565b610734565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35b50565b7fbc197c810000000000000000000000000000000000000000000000000000000081565b6000816004018351101561077c5761077c6100e76003855185600401611417565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff3b96b8d0000000000000000000000000000000000000000000000000000000017905290565b6000816014018351101561082c5761082c6100e76004855185601401611417565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907f095ea7b300000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506104c484826114bd565b60005473ffffffffffffffffffffffffffffffffffffffff16331461095357600054610953906100e790339073ffffffffffffffffffffffffffffffffffffffff16611575565b565b6109678230338463ffffffff61159216565b5050565b81518151600091908114610987576109876100e78285516117cd565b34915060005b818114610a365760008582815181106109a257fe5b60200260200101519050808410156109c1576109c16100e782866117ea565b6109d1848263ffffffff610fca16565b93508482815181106109df57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a2c573d6000803e3d6000fd5b505060010161098d565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610aa157600080fd5b505af1158015610ab5573d6000803e3d6000fd5b50505050505092915050565b6000806000610b76600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3157600080fd5b505afa158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b699190810190613150565b3a9063ffffffff61180716565b90507fdc1600f30000000000000000000000000000000000000000000000000000000060005b87518114610f1d57878181518110610bb057fe5b60200260200101516080015160001480610be15750878181518110610bd157fe5b602002602001015160a001516000145b15610beb57610f15565b6000610c35610c0c8a8481518110610bff57fe5b6020026020010151611838565b610c165784610c19565b60005b610c298a8963ffffffff610fca16565b9063ffffffff610fca16565b90506000610c6560008b8581518110610c4a57fe5b6020026020010151610140015161075b90919063ffffffff16565b90506000807fffffffff000000000000000000000000000000000000000000000000000000008084169087161415610d6b57610cc360108d8781518110610ca857fe5b6020026020010151610140015161080b90919063ffffffff16565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190610d18903090600401613246565b60206040518083038186803b158015610d3057600080fd5b505afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d689190810190613150565b90505b600080610d9f8e8881518110610d7d57fe5b60200260200101518d8981518110610d9157fe5b6020026020010151886118ad565b91509150877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ead576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190610e3e903090600401613246565b60206040518083038186803b158015610e5657600080fd5b505afa158015610e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e8e9190810190613150565b9050610ea9610ea3828663ffffffff610fca16565b836119d7565b9150505b610ed8818f8981518110610ebd57fe5b6020026020010151610140015161095590919063ffffffff16565b610ee88b8363ffffffff6119ee16565b9a50610efa8a8263ffffffff6119ee16565b99508c8b10610f0e57505050505050610f1d565b5050505050505b600101610b9c565b505050935093915050565b606063cdcbed5d60e01b8383604051602401610f45929190613623565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b600082821115610fe357610fe36100e760028585611a06565b50900390565b8015610734576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d9061104590849060040161361a565b600060405180830381600087803b15801561105f57600080fd5b505af1158015611073573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f19350505050158015610967573d6000803e3d6000fd5b825160009081907fdc1600f30000000000000000000000000000000000000000000000000000000090825b8181146113c0578781815181106110e257fe5b60200260200101516080015160001480611113575087818151811061110357fe5b602002602001015160a001516000145b1561111d576113b8565b600061112f888663ffffffff610fca16565b9050600061114460008b8581518110610c4a57fe5b90506000807fffffffff00000000000000000000000000000000000000000000000000000000808416908816141561122f5761118760108d8781518110610ca857fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906111dc903090600401613246565b60206040518083038186803b1580156111f457600080fd5b505afa158015611208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061122c9190810190613150565b90505b6000806112638e888151811061124157fe5b60200260200101518d898151811061125557fe5b602002602001015188611a25565b91509150887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561136b576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190611302903090600401613246565b60206040518083038186803b15801561131a57600080fd5b505afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113529190810190613150565b9050611367610ea3828663ffffffff610fca16565b9150505b61137b818f8981518110610ebd57fe5b61138b8b8363ffffffff6119ee16565b9a5061139d8a8263ffffffff6119ee16565b99508c8a106113b1575050505050506113c0565b5050505050505b6001016110cf565b50858310156113d6576113d66100e78785611af7565b5050935093915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060632800659560e01b848484604051602401611436939291906133b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b9392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516114e6919061322a565b6000604051808303816000865af19150503d8060008114611523576040519150601f19603f3d011682016040523d82523d6000602084013e611528565b606091505b5091509150811561156c578051611540575050610967565b80516020141561156c576000611557826000611b14565b9050806001141561156a57505050610967565b505b6104c4816102d8565b6060631de45ad160e01b8383604051602401610f45929190613267565b8061159c576104c4565b60006115ae858263ffffffff61075b16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000148061164157507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f300000000000000000000000000000000000000000000000000000000145b1561165d576116588585858563ffffffff611b2016565b6117c6565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f025717920000000000000000000000000000000000000000000000000000000014156116b9576116588585858563ffffffff611b6a16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415611715576116588585858563ffffffff611c3916565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611771576116588585858563ffffffff611d8f16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a00000000000000000000000000000000000000000000000000000000146117c6576117c66100e782611e23565b5050505050565b6060633ecb6ceb60e01b8383604051602401610f45929190613623565b606063ecf40fd960e01b8383604051602401610f45929190613623565b600082611816575060006107ab565b8282028284828161182357fe5b04146114b6576114b66100e760018686611a06565b60006003826101800151511180156107ab57506101808201517f770501f8000000000000000000000000000000000000000000000000000000009061188490600063ffffffff61075b16565b7fffffffff00000000000000000000000000000000000000000000000000000000161492915050565b6000808460e00151600014806118d257506118d2856101a00151866101400151611e3e565b15611929576118df612710565b6118ea868587611feb565b9050611907816080015182602001516119ee90919063ffffffff16565b60608201518251919450611921919063ffffffff610fca16565b9150506119cf565b61193d856101a00151866101600151611e3e565b156119be5760a085015160e086015160009161196a9161196490829063ffffffff6119ee16565b86612026565b9050611974612710565b61197f878388611feb565b90506119b081608001516119a4836060015184602001516119ee90919063ffffffff16565b9063ffffffff6119ee16565b905190935091506119cf9050565b6119cf6100e7866101a0015161205c565b935093915050565b6000818310156119e757816114b6565b5090919050565b6000828201838110156114b6576114b66100e7600086865b606063e946c1bb60e01b8484846040516024016114369392919061338f565b6000808460e0015160001480611a4a5750611a4a856101a00151866101600151611e3e565b15611a6457600061196a8660a00151876080015186612026565b611a78856101a00151866101400151611e3e565b156119be576000611aa28660a001516119648860e001518960800151610fca90919063ffffffff16565b9050611aac612710565b611ab7878388611feb565b9050611ad4816080015182602001516119ee90919063ffffffff16565b60608201518251919550611aee919063ffffffff610fca16565b925050506119cf565b60606391353a0c60e01b8383604051602401610f45929190613623565b60006114b68383612077565b6000611b3385601063ffffffff61080b16565b905073ffffffffffffffffffffffffffffffffffffffff8416301415611b5e576116588184846120a1565b6117c6818585856120d9565b80600114611b7e57611b7e6100e78261219c565b6000611b9185601063ffffffff61080b16565b90506000611ba686602463ffffffff611b1416565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd90611bff908890889086906004016132f8565b600060405180830381600087803b158015611c1957600080fd5b505af1158015611c2d573d6000803e3d6000fd5b50505050505050505050565b60006060806060611c57600489518a6121b79092919063ffffffff16565b806020019051611c6a9190810190612caa565b9350935093509350600082519050606081604051908082528060200260200182016040528015611ca4578160200160208202803883390190505b50905060005b828114611cf657611cd788868381518110611cc157fe5b602002602001015161180790919063ffffffff16565b828281518110611ce357fe5b6020908102919091010152600101611caa565b506040517f2eb2c2d600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690632eb2c2d690611d51908c908c908a9087908a9060040161328e565b600060405180830381600087803b158015611d6b57600080fd5b505af1158015611d7f573d6000803e3d6000fd5b5050505050505050505050505050565b606080611da960048751886121b79092919063ffffffff16565b806020019051611dbc9190810190612fc5565b8051919350915060005b818114611e1957611e11838281518110611ddc57fe5b60200260200101518888611e0c888681518110611df557fe5b60200260200101518a61180790919063ffffffff16565b611592565b600101611dc6565b5050505050505050565b6060637996a27160e01b82604051602401610254919061334f565b600080611e51848263ffffffff61075b16565b90506000611e65848263ffffffff61075b16565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fdc1600f3000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008416821480611efd57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b8015611f5b57507fffffffff000000000000000000000000000000000000000000000000000000008381169083161480611f5b57507fffffffff00000000000000000000000000000000000000000000000000000000838116908216145b15611fc6576000611f7388601063ffffffff61080b16565b90506000611f8888601063ffffffff61080b16565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161496505050505050506107ab565b611fd6878763ffffffff61223716565b9450505050506107ab565b5050505092915050565b611ff3612710565b611ffc84611838565b156120135761200c84848461225c565b90506114b6565b61201e8484846124b0565b949350505050565b600061201e8361205061204082600163ffffffff610fca16565b6119a4888763ffffffff61180716565b9063ffffffff61261d16565b60606331360af160e01b82604051602401610254919061337c565b60008160200183511015612098576120986100e76005855185602001611417565b50016020015190565b6040516060907fa9059cbb00000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b6040516060907f23b872dd0000000000000000000000000000000000000000000000000000000090612113908690869086906024016132f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506117c685826114bd565b606063baffa47460e01b82604051602401610254919061361a565b6060818311156121d0576121d06100e760008585611417565b83518211156121e9576121e96100e76001848751611417565b8282036040519080825280601f01601f191660200182016040528015612216576020820181803883390190505b5090506114b661222582612647565b8461222f87612647565b01835161264d565b6000815183511480156114b65750508051602091820120825192909101919091201490565b612264612710565b61226c61273f565b604051806101800160405280866000015173ffffffffffffffffffffffffffffffffffffffff168152602001866020015173ffffffffffffffffffffffffffffffffffffffff168152602001866040015173ffffffffffffffffffffffffffffffffffffffff168152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015181526020018660a001518152602001600081526020016000815260200186610100015181526020018661012001518152602001866101400151815260200186610160015181525090506060600073ffffffffffffffffffffffffffffffffffffffff1663b4be83d5905060e01b82868660405160240161237f939291906133bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600454915190925073ffffffffffffffffffffffffffffffffffffffff90911690600090606090839061243090869061322a565b6000604051808303816000865af19150503d806000811461246d576040519150601f19603f3d011682016040523d82523d6000602084013e612472565b606091505b509150915081156124a457805160801461248857fe5b8080602001905161249c9190810190613168565b602088015286525b50505050509392505050565b6124b8612710565b6040516060907f9b44d55600000000000000000000000000000000000000000000000000000000906124f2908790879087906024016134df565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600354915190925073ffffffffffffffffffffffffffffffffffffffff9091169060009060609083906125a390869061322a565b6000604051808303816000865af19150503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b5091509150811561261257805160a0146125fb57fe5b8080602001905161260f91908101906130ff565b94505b505050509392505050565b600081612633576126336100e760038585611a06565b600082848161263e57fe5b04949350505050565b60200190565b6020811015612677576001816020036101000a03801983511681855116808217865250505061051b565b828214156126845761051b565b828211156126be5760208103905080820181840181515b828510156126b657845186526020958601959094019361269b565b90525061051b565b60208103905080820181840183515b8186121561270757825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906126cd565b85525050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b80356107ab816136e6565b600082601f830112612813578081fd5b813561282661282182613658565b613631565b81815291506020808301908481018184028601820187101561284757600080fd5b60005b8481101561286f57813561285d816136e6565b8452928201929082019060010161284a565b505050505092915050565b600082601f83011261288a578081fd5b813561289861282182613658565b8181529150602080830190840160005b83811015611fe1576128c08760208435890101612bd7565b835260209283019291909101906001016128a8565b600082601f8301126128e5578081fd5b81356128f361282182613658565b818152915060208083019084810160005b8481101561286f57813587016101c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561294457600080fd5b61294d81613631565b6129598b8785016127f8565b81526129688b604085016127f8565b868201526129798b606085016127f8565b604082015261298b8b608085016127f8565b606082015260a0830135608082015260c083013560a082015260e083013560c08201526101008084013560e0830152610120808501358284015261014091508185013581840152506101608085013567ffffffffffffffff808211156129f057600080fd5b6129fe8f8b848a0101612bd7565b84860152610180935083870135915080821115612a1a57600080fd5b612a288f8b848a0101612bd7565b838601526101a0925082870135915080821115612a4457600080fd5b612a528f8b848a0101612bd7565b8486015285870135935080841115612a6957600080fd5b5050612a798d8984880101612bd7565b9083015250865250509282019290820190600101612904565b60008083601f840112612aa3578182fd5b50813567ffffffffffffffff811115612aba578182fd5b6020830191508360208083028501011115612ad457600080fd5b9250929050565b600082601f830112612aeb578081fd5b8151612af961282182613658565b818152915060208083019084810181840286018201871015612b1a57600080fd5b60005b8481101561286f57815184529282019290820190600101612b1d565b600082601f830112612b49578081fd5b8135612b5761282182613658565b818152915060208083019084810181840286018201871015612b7857600080fd5b60005b8481101561286f57813584529282019290820190600101612b7b565b60008083601f840112612ba8578182fd5b50813567ffffffffffffffff811115612bbf578182fd5b602083019150836020828501011115612ad457600080fd5b600082601f830112612be7578081fd5b8135612bf561282182613678565b9150808252836020828501011115612c0c57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112612c35578081fd5b8151612c4361282182613678565b9150808252836020828501011115612c5a57600080fd5b612c6b8160208401602086016136ba565b5092915050565b600060208284031215612c83578081fd5b81356114b6816136e6565b600060208284031215612c9f578081fd5b81516114b6816136e6565b60008060008060808587031215612cbf578283fd5b8451612cca816136e6565b602086015190945067ffffffffffffffff80821115612ce7578485fd5b612cf388838901612adb565b94506040870151915080821115612d08578384fd5b612d1488838901612adb565b93506060870151915080821115612d29578283fd5b50612d3687828801612c25565b91505092959194509250565b60008060008060008060008060a0898b031215612d5d578586fd5b8835612d68816136e6565b97506020890135612d78816136e6565b9650604089013567ffffffffffffffff80821115612d94578788fd5b612da08c838d01612a92565b909850965060608b0135915080821115612db8578586fd5b612dc48c838d01612a92565b909650945060808b0135915080821115612ddc578384fd5b50612de98b828c01612b97565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215612e15578384fd5b8635612e20816136e6565b95506020870135612e30816136e6565b94506040870135935060608701359250608087013567ffffffffffffffff811115612e59578283fd5b612e6589828a01612b97565b979a9699509497509295939492505050565b60008060008060808587031215612e8c578182fd5b843567ffffffffffffffff80821115612ea3578384fd5b612eaf888389016128d5565b95506020870135915080821115612ec4578384fd5b612ed08883890161287a565b94506040870135915080821115612ee5578384fd5b612ef188838901612b39565b93506060870135915080821115612f06578283fd5b50612d3687828801612803565b600080600080600060a08688031215612f2a578283fd5b853567ffffffffffffffff80821115612f41578485fd5b612f4d89838a016128d5565b9650602088013595506040880135915080821115612f69578485fd5b612f7589838a0161287a565b94506060880135915080821115612f8a578283fd5b612f9689838a01612b39565b93506080880135915080821115612fab578283fd5b50612fb888828901612803565b9150509295509295909350565b60008060408385031215612fd7578182fd5b825167ffffffffffffffff80821115612fee578384fd5b612ffa86838701612adb565b9350602091508185015181811115613010578384fd5b85019050601f81018613613022578283fd5b805161303061282182613658565b81815283810190838501865b84811015613065576130538b888451890101612c25565b8452928601929086019060010161303c565b5096999098509650505050505050565b60008060208385031215613087578182fd5b823567ffffffffffffffff81111561309d578283fd5b6130a985828601612b97565b90969095509350505050565b6000806000604084860312156130c9578081fd5b833567ffffffffffffffff8111156130df578182fd5b6130eb86828701612b97565b909790965060209590950135949350505050565b600060a08284031215613110578081fd5b61311a60a0613631565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215613161578081fd5b5051919050565b6000806040838503121561317a578182fd5b505080516020909101519092909150565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156131d65781518652602095860195909101906001016131b8565b5093949350505050565b600081518084526131f88160208601602086016136ba565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161323c8184602087016136ba565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526132c760a08301866131a5565b82810360608401526132d981866131a5565b83810360808501526132eb81866131e0565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6000602082526114b660208301846131e0565b606081016004851061339d57fe5b938152602081019290925260409091015290565b606081016008851061339d57fe5b6000606082526133d360608301865161318b565b60208501516133e5608084018261318b565b5060408501516133f860a084018261318b565b50606085015161340b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e088015192506101408381870152828901519350610160925083838701528189015193506101809150838287015280890151935050806101a08601525061347e6101e08501836131e0565b8188015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101c08601526134b981846131e0565b91505085602085015283810360408501526134d481866131e0565b979650505050505050565b6000606082526134f360608301865161318b565b6020850151613505608084018261318b565b50604085015161351860a084018261318b565b50606085015161352b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e0880151925061014083818701528289015193506101609250838387015281890151935061018091508382870152808901519350506101c06101a081818801526135a16102208801866131e0565b848b015195507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa094508488820301838901526135dd81876131e0565b925050828a0151945083878303016101e08801526135fb82866131e0565b9250808a01519450505081858203016102008601526134b981846131e0565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561365057600080fd5b604052919050565b600067ffffffffffffffff82111561366e578081fd5b5060209081020190565b600067ffffffffffffffff82111561368e578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156136d55781810151838201526020016136bd565b838111156104c45750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461073457600080fdfea365627a7a7231582046e7b4801e4017360012dc9f596c66d1113c57a190987d4f3089965a65faa3c56c6578706572696d656e74616cf564736f6c63430005100040" } } }, diff --git a/packages/contract-artifacts/artifacts/Staking.json b/packages/contract-artifacts/artifacts/Staking.json index bdfa7ad8cf..6cc1dfbfde 100644 --- a/packages/contract-artifacts/artifacts/Staking.json +++ b/packages/contract-artifacts/artifacts/Staking.json @@ -928,10 +928,10 @@ }, "evm": { "bytecode": { - "object": "0x6080604052600080546001600160a01b031916331790556156ac806100256000396000f3fe6080604052600436106103295760003560e01c80638da5cb5b116101a5578063bb7ef7e0116100ec578063e8eeb3f811610095578063f18765321161006f578063f1876532146108bf578063f252b7a1146108df578063f2fde38b146108ff578063ff691b111461091f57610329565b8063e8eeb3f814610875578063e907f0031461088a578063ee99205c146108aa57610329565b8063e0ee036e116100c6578063e0ee036e1461082b578063e1c7392a14610840578063e804d0a41461085557610329565b8063bb7ef7e0146107c9578063c18c9141146107e9578063d39de6e91461080957610329565b8063a694fc3a1161014e578063b3e3337911610128578063b3e3337914610769578063b510879f14610789578063b9181611146107a957610329565b8063a694fc3a1461071f578063b05315241461073f578063b2baa33e1461075457610329565b8063a26171e21161017f578063a26171e2146106e2578063a3b4a327146106f7578063a657e5791461070a57610329565b80638da5cb5b1461068d5780639ad26744146106a25780639c3ccc82146106c257610329565b80634bcc3f6711610274578063624a72321161021d57806370712939116101f757806370712939146106165780637667180814610636578063816667961461064b5780638a2e271a1461066d57610329565b8063624a7232146105cc57806363403801146105e157806368a7d6cd146105f657610329565b80635bd4ab731161024e5780635bd4ab73146105595780635d91121d146105865780635e615a6b146105a657610329565b80634bcc3f67146104f7578063587da0231461052457806358f6c7e31461053957610329565b80633c277fc5116102d657806344a6958b116102b057806344a6958b1461048a57806346b97959146104aa578063494503d4146104d757610329565b80633c277fc51461041b5780633e4ad7321461043d57806342f1181e1461046a57610329565b80632a94c279116103075780632a94c2791461039b5780632e17de78146103ca57806338229d93146103ea57610329565b806301e28d841461032e5780630b9663db146103505780631e7ff8f61461037b575b600080fd5b34801561033a57600080fd5b5061034e610349366004614fc7565b61093f565b005b34801561035c57600080fd5b50610365610a0d565b6040516103729190615327565b60405180910390f35b34801561038757600080fd5b50610365610396366004614fc7565b610b5a565b3480156103a757600080fd5b506103bb6103b63660046150db565b610bf4565b60405161037293929190615514565b3480156103d657600080fd5b5061034e6103e536600461509f565b610c20565b3480156103f657600080fd5b5061040a61040536600461509f565b610dd5565b604051610372959493929190615545565b34801561042757600080fd5b50610430610e04565b6040516103729190615224565b34801561044957600080fd5b5061045d61045836600461509f565b610e1c565b60405161037291906154d5565b34801561047657600080fd5b5061034e610485366004614fc7565b610e3b565b34801561049657600080fd5b5061045d6104a536600461504c565b610e4f565b3480156104b657600080fd5b506104ca6104c536600461509f565b610eae565b6040516103729190615481565b3480156104e357600080fd5b506104306104f236600461509f565b610ef9565b34801561050357600080fd5b5061051761051236600461509f565b610f2d565b60405161037291906154a2565b34801561053057600080fd5b50610365610f8f565b34801561054557600080fd5b5061034e610554366004615144565b610f95565b34801561056557600080fd5b50610579610574366004614fc7565b611192565b604051610372919061531c565b34801561059257600080fd5b5061034e6105a13660046150fc565b6111a7565b3480156105b257600080fd5b506105bb611270565b604051610372959493929190615568565b3480156105d857600080fd5b50610430611299565b3480156105ed57600080fd5b506103656112b1565b34801561060257600080fd5b506103656106113660046151f7565b6112b7565b34801561062257600080fd5b5061034e610631366004614fc7565b6113f0565b34801561064257600080fd5b506103656114a5565b34801561065757600080fd5b506106606114ab565b60405161037291906155ac565b34801561067957600080fd5b5061034e610688366004614fc7565b6114b7565b34801561069957600080fd5b50610430611579565b3480156106ae57600080fd5b5061034e6106bd366004615022565b611595565b3480156106ce57600080fd5b5061034e6106dd366004615199565b6115a7565b3480156106ee57600080fd5b50610365611621565b61034e610705366004614fe2565b611627565b34801561071657600080fd5b50610365611877565b34801561072b57600080fd5b5061034e61073a36600461509f565b61187d565b34801561074b57600080fd5b50610365611992565b34801561076057600080fd5b50610365611998565b34801561077557600080fd5b5061034e61078436600461509f565b6119b6565b34801561079557600080fd5b5061034e6107a436600461509f565b6119f6565b3480156107b557600080fd5b506105796107c4366004614fc7565b611a00565b3480156107d557600080fd5b506103656107e436600461509f565b611a15565b3480156107f557600080fd5b5061036561080436600461509f565b611aa0565b34801561081557600080fd5b5061081e611ab2565b60405161037291906152c3565b34801561083757600080fd5b50610660611b21565b34801561084c57600080fd5b5061034e611b2d565b34801561086157600080fd5b5061045d610870366004615128565b611b47565b34801561088157600080fd5b50610660611c97565b34801561089657600080fd5b506103656108a53660046150b7565b611cab565b3480156108b657600080fd5b50610430611d48565b3480156108cb57600080fd5b506103656108da366004614fc7565b611d64565b3480156108eb57600080fd5b5061045d6108fa366004615022565b611d76565b34801561090b57600080fd5b5061034e61091a366004614fc7565b611db7565b34801561092b57600080fd5b5061034e61093a36600461509f565b611e5a565b610947612087565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff16610987576109876109826001836120aa565b61214c565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517ff50d0d312d501878616eb5e78ebf3ed6dcd3955aaef8165af9c6b057cc4832fb90610a02908390615224565b60405180910390a150565b600c5460009081610a2582600163ffffffff61215416565b6000818152601660205260409020600101549091508015610a4d57610a4d6109828383612173565b610a55612190565b610a5d612203565b600084815260166020526040902055610a74614eaf565b50600083815260166020908152604091829020825160a08101845281548082526001830154938201849052600283015482860181905260038401546060840181905260049094015460808401529451919488947fbb4a26fa0ace13ee4da343896c20eaa44a618fb9071fdd8c2e2c960a4583189d94610af6949193929161552a565b60405180910390a2610b066122a7565b6020810151610b4d57805160405185917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b291610b4491600091615372565b60405180910390a25b6020015193505050505b90565b6000610b64611299565b73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610b9c9190615224565b60206040518083038186803b158015610bb457600080fd5b505afa158015610bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bec9190810190615181565b90505b919050565b601560209081526000928352604080842090915290825290208054600182015460029092015490919083565b33610c29614ede565b73ffffffffffffffffffffffffffffffffffffffff821660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610c76906122ea565b90506000610ca882602001516bffffffffffffffffffffffff1683604001516bffffffffffffffffffffffff16612390565b905080841115610cbf57610cbf61098285836123a6565b73ffffffffffffffffffffffffffffffffffffffff831660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610d0d90856123c3565b610d15611299565b73ffffffffffffffffffffffffffffffffffffffff16639470b0bd84866040518363ffffffff1660e01b8152600401610d4f92919061529d565b600060405180830381600087803b158015610d6957600080fd5b505af1158015610d7d573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd85604051610dc79190615327565b60405180910390a250505050565b601660205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b610e24614ede565b6000828152600760205260409020610bec906122ea565b610e4361244a565b610e4c81612491565b50565b610e57614ede565b610ea560056000846001811115610e6a57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8816825290925290206122ea565b90505b92915050565b610eb6614efe565b506000908152601560209081526040808320600c548452825291829020825160608101845281548152600182015492810192909252600201549181019190915290565b60028181548110610f0657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b610f35614f1f565b506000908152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff169082015290565b600d5481565b3381610fa1575061118d565b6000610fb06020860186615128565b6001811115610fbb57fe5b148015610fdf57506000610fd26020850185615128565b6001811115610fdd57fe5b145b15610fea575061118d565b6001610ff96020860186615128565b600181111561100457fe5b141561101957611019846020013582846125c2565b60016110286020850185615128565b600181111561103357fe5b1415611048576110488360200135828461265b565b600060058161105a6020880188615128565b600181111561106557fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff86168252835290812092509060059082906110af90880188615128565b60018111156110ba57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff87168252909252902090506110fd8282866126f4565b60208086013590870180359073ffffffffffffffffffffffffffffffffffffffff8616907f7d3ad1dcf03b9027064d1d9a474a69e0cecc31324c541d3eb9b5e6fa2f106c8d90889061114f908c615128565b600181111561115a57fe5b61116760208c018c615128565b600181111561117257fe5b60405161118193929190615593565b60405180910390a45050505b505050565b60106020526000908152604090205460ff1681565b816111b1816127ed565b6000838152600a602052604090205474010000000000000000000000000000000000000000900463ffffffff166111e9848285612826565b6000848152600a60205260409081902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff8716021790555184907f8ea2a7a959bd25f226b7b0a4393613f7fdcaa8404e8bad96aa52dc1c1459016790610dc790849087906155bd565b601154601254601354601454929363ffffffff9283169391928281169264010000000090041690565b73ba7f8b5fb1b19c1211c5d49550fcd149177a5eaf90565b60115481565b60085460009033906112d090600163ffffffff61286e16565b600881905591506112e582620f424086612826565b6112ed614f1f565b5060408051808201825273ffffffffffffffffffffffffffffffffffffffff838116825263ffffffff87811660208085019182526000888152600a9091528590208451815492517fffffffffffffffffffffffff00000000000000000000000000000000000000009093169416939093177fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000919092160217905590517fcec6fc86ea644053f6edff1160dfe3fa5c61e7a5ef9f873f145bb03a0bd319e7906113d190859085908990615330565b60405180910390a183156113e8576113e8836119b6565b505092915050565b6113f861244a565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16611431576114316109828261288a565b60005b6002548110156114a1578173ffffffffffffffffffffffffffffffffffffffff166002828154811061146257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415611499576114948282612929565b6114a1565b600101611434565b5050565b600c5481565b60145463ffffffff1681565b6114bf612087565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff16156114fb576114fb6109826000836120aa565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f3e535d1ab441ef41c268fd9b52b478aee02d693c5ca2a84b5d26b89e0922e5e190610a02908390615224565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b61159d61244a565b6114a18282612929565b6115af612087565b6115bc8585858585612b78565b3073ffffffffffffffffffffffffffffffffffffffff1663c6f3a4276040518163ffffffff1660e01b815260040160006040518083038186803b15801561160257600080fd5b505afa158015611616573d6000803e3d6000fd5b505050505050505050565b60135481565b3360009081526010602052604090205460ff1661164a5761164a61098233612c3b565b61165381612c56565b3461172d57611660610e04565b73ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b815260040161169c9392919061526c565b602060405180830381600087803b1580156116b657600080fd5b505af11580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116ee9190810190615083565b61172d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117249061544a565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600960205260409020548061175e575061118d565b600061176982610e1c565b602001516bffffffffffffffffffffffff16905060135481101561178e57505061118d565b600c5460008381526015602090815260408083208484528252808320601690925290912081548061183d576000806117c68888612c77565b6002870182905560018701819055600386015491935091506117ee908263ffffffff61286e16565b60038501556001808501546118089163ffffffff61286e16565b6001850155604051889087907f14b098103235344975b17508c2391721cc9ac3f3fa2b56c7ff46f8480dfd074f90600090a350505b61184d818863ffffffff61286e16565b83556002820154611864908863ffffffff61286e16565b8260020181905550505050505050505050565b60085481565b33611886611299565b73ffffffffffffffffffffffffffffffffffffffff166315cc36f282846040518363ffffffff1660e01b81526004016118c092919061529d565b600060405180830381600087803b1580156118da57600080fd5b505af11580156118ee573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff811660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc602052604090206119409083612d03565b8073ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a836040516119869190615327565b60405180910390a25050565b60175481565b60006119b1601154600d5461286e90919063ffffffff16565b905090565b3360008181526009602052604080822084905551839183917f5640833634fce74eb9211d1209a91dd5a1c8c6a751696bff9323b4db67f815139190a35050565b610e4c8133612d6d565b60016020526000908152604090205460ff1681565b6000611a1f614f1f565b506000828152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611a8385612f45565b91509150611a9683602001518383613002565b5095945050505050565b600b6020526000908152604090205481565b60606002805480602002602001604051908101604052809291908181526020018280548015611b1757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611aec575b5050505050905090565b60125463ffffffff1681565b611b35612087565b611b3d613043565b611b45613056565b565b611b4f614ede565b60016000526004602052611b827fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe056122ea565b90506000826001811115611b9257fe5b1415610bef576000611ba2611299565b73ffffffffffffffffffffffffffffffffffffffff16639706e0c06040518163ffffffff1660e01b815260040160206040518083038186803b158015611be757600080fd5b505afa158015611bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c1f9190810190615181565b9050611c4e611c4983602001516bffffffffffffffffffffffff168361215490919063ffffffff16565b613081565b6bffffffffffffffffffffffff90811660208401526040830151611c7e91611c499184911663ffffffff61215416565b6bffffffffffffffffffffffff16604083015250919050565b601454640100000000900463ffffffff1681565b6000611cb5614f1f565b506000838152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611d1986612f45565b915091506000611d2e84602001518484613002565b915050611d3d878783856130a5565b979650505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60096020526000908152604090205481565b611d7e614ede565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208584529091529020610ea5906122ea565b611dbf61244a565b73ffffffffffffffffffffffffffffffffffffffff8116611dea57611de56109826131f2565b610e4c565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b600c546000611e7082600163ffffffff61215416565b9050611e7a614eaf565b50600081815260166020908152604091829020825160a08101845281548152600182015492810183905260028201549381019390935260038101546060840152600401546080830152611ecf57505050610e4c565b611ed7614efe565b5060008481526015602090815260408083208584528252918290208251606081018452815480825260018301549382019390935260029091015492810192909252611f255750505050610e4c565b6000858152601560209081526040808320868452909152812081815560018101829055600201819055611f588284613229565b9050600080611f6c8884866040015161329e565b9150915087877ff1116b309178aa62dcb6bf8c3b8bc2321724907c7ebf52192d14c8ce3aa9194c8484604051611fa3929190615372565b60405180910390a36000611fbd838363ffffffff61286e16565b6080870151909150611fd5908263ffffffff61286e16565b6080870181905260008881526016602090815260409091206004019190915586015161200890600163ffffffff61215416565b602080880182815260008a8152601690925260409091206001019190915551611616576080860151865188917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b291612066908263ffffffff61215416565b604051612074929190615372565b60405180910390a2505050505050505050565b3360009081526001602052604090205460ff16611b4557611b45610982336133ee565b606063b9588e4360e01b83836040516024016120c79291906153ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b805160208201fd5b60008282111561216d5761216d61098260028585613409565b50900390565b606063614b800a60e01b83836040516024016120c7929190615372565b30318015610e4c576121a0610e04565b73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121e757600080fd5b505af11580156121fb573d6000803e3d6000fd5b505050505050565b60006119b1601754612213610e04565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161224b9190615224565b60206040518083038186803b15801561226357600080fd5b505afa158015612277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061229b9190810190615181565b9063ffffffff61215416565b4260006122b2611998565b9050818111156122c9576122c961098282846134ae565b600c546000906122e090600163ffffffff61286e16565b600c555050600d55565b6122f2614ede565b5060408051606081018252825467ffffffffffffffff81168083526bffffffffffffffffffffffff680100000000000000008304811660208501527401000000000000000000000000000000000000000090920490911692820192909252600c54909181111561238a57612365816134cb565b67ffffffffffffffff16825260408201516bffffffffffffffffffffffff1660208301525b50919050565b600081831061239f5781610ea5565b5090919050565b60606384c8b7c960e01b83836040516024016120c7929190615372565b6123cb614ede565b6123d4836122ea565b90506123fe611c498383604001516bffffffffffffffffffffffff1661215490919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161242d91611c4991168463ffffffff61215416565b6bffffffffffffffffffffffff16602082015261118d83826134eb565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b4557600054611b459061098290339073ffffffffffffffffffffffffffffffffffffffff166135a5565b73ffffffffffffffffffffffffffffffffffffffff81166124b7576124b76109826135c2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16156124f1576124f1610982826135f9565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b6125cb83613614565b6125d58383612d6d565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600660209081526040808320868452909152902061260f908261364b565b6000838152600760205260409020612627908261364b565b6001600052600460205261118d7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe058261364b565b61266483613614565b61266e8383612d6d565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020908152604080832086845290915290206126a890826136a3565b60008381526007602052604090206126c090826136a3565b6001600052600460205261118d7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05826136a3565b6126fe83836136de565b156127085761118d565b612710614ede565b612719846122ea565b9050612723614ede565b61272c846122ea565b905081604001516bffffffffffffffffffffffff16831115612767576127676109828484604001516bffffffffffffffffffffffff166123a6565b604082015161278e90611c49906bffffffffffffffffffffffff168563ffffffff61215416565b6bffffffffffffffffffffffff9081166040808501919091528201516127bf91611c4991168563ffffffff61286e16565b6bffffffffffffffffffffffff1660408201526127dc85836134eb565b6127e684826134eb565b5050505050565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff163381146114a1576114a161098233846136e5565b620f424063ffffffff8216111561284b5761284661098260008584613702565b61118d565b8163ffffffff168163ffffffff16111561118d5761118d61098260018584613702565b600082820183811015610ea557610ea561098260008686613409565b606063eb5108a260e01b826040516024016128a59190615224565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16612962576129626109828361288a565b600254811061297d5761297d61098282600280549050613721565b8173ffffffffffffffffffffffffffffffffffffffff16600282815481106129a157fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614612a0357612a03610982600283815481106129db57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff168461373e565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612a7e57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110612ab157fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190612b309082614f36565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60118590556012805463ffffffff8087167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000092831617909255601385905560148054848416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9487169190931617929092161790556040517f613157dbb0e920deab8ad6ddd3805e87cbf57344b9fe780f1764790ec789754290612c2c9087908790879087908790615568565b60405180910390a15050505050565b606063b56d2df060e01b826040516024016128a59190615224565b803414158015612c6557503415155b15610e4c57610e4c610982823461375b565b6000828152600a602052604081205481908190612caa9073ffffffffffffffffffffffffffffffffffffffff1686611d76565b602001516bffffffffffffffffffffffff169050612cce848263ffffffff61215416565b601254909350612cf990612cec9063ffffffff16620f424086613778565b829063ffffffff61286e16565b9150509250929050565b612d0b614ede565b612d14836122ea565b9050612d3e611c498383604001516bffffffffffffffffffffffff1661286e90919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161242d91611c4991168463ffffffff61286e16565b612d768261379a565b6000612d8583836000806130a5565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208784529091529020909150612dc1906122ea565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600660209081526040808320888452825291829020845181549286015195909301517fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921667ffffffffffffffff909316929092177fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff16680100000000000000006bffffffffffffffffffffffff95861602179092167401000000000000000000000000000000000000000093909216929092021790558015612f3c57612ea6838261380e565b612eae610e04565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401612ee892919061529d565b602060405180830381600087803b158015612f0257600080fd5b505af1158015612f16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f3a9190810190615083565b505b61118d83613856565b6000806000612f606001600c5461215490919063ffffffff16565b9050612f6a614efe565b50600084815260156020908152604080832084845282528083208151606080820184528254825260018084015483870152600293840154838601528787526016865295849020845160a0810186528154815296810154958701959095529184015492850192909252600383015490840152600490910154608083015290612ff2908290613229565b9350806040015192505050915091565b600080826130125783915061303b565b61302663ffffffff8616620f424086613863565b9150613038848363ffffffff61215416565b90505b935093915050565b61304b613899565b42600d556001600c55565b61305e6138ae565b620d2f00620dbba068056bc75e2d63100000600260036127e68585858585612b78565b806bffffffffffffffffffffffff81168114610bef57610bef610982600284613913565b600c546000906130b3614ede565b5073ffffffffffffffffffffffffffffffffffffffff851660009081526006602090815260408083208984528252918290208251606081018452905467ffffffffffffffff81168083526bffffffffffffffffffffffff6801000000000000000083048116948401949094527401000000000000000000000000000000000000000090910490921692810192909252821415613154576000925050506131ea565b61316081838787613930565b81519093506000906131839067ffffffffffffffff16600163ffffffff61286e16565b90506131c16131b48984602001516bffffffffffffffffffffffff16856000015167ffffffffffffffff16856139b3565b859063ffffffff61286e16565b93506131e46131b48984604001516bffffffffffffffffffffffff1684876139b3565b93505050505b949350505050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b815160009061323757610ea8565b8151835160408401516020860151606086015160145461326d95949392919063ffffffff80821691640100000000900416613a4c565b608083015183519192506000916132899163ffffffff61215416565b905081811015613297578091505b5092915050565b6000806132a9614f1f565b506000858152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff1690820181905261330d908686613002565b909350915082156133ca57613320610e04565b81516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff929092169163a9059cbb9161337691879060040161529d565b602060405180830381600087803b15801561339057600080fd5b505af11580156133a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133c89190810190615083565b505b81156133e5576133da8683613b0f565b6133e5868386613b50565b50935093915050565b606063b65a25b960e01b826040516024016128a59190615224565b606063e946c1bb60e01b84848460405160240161342893929190615380565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b606063a6bcde4760e01b83836040516024016120c7929190615372565b8067ffffffffffffffff81168114610bef57610bef610982600184613913565b8051825460408301516020909301516bffffffffffffffffffffffff90811668010000000000000000027fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff91909416740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff9094167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090931692909217929092161716179055565b6060631de45ad160e01b83836040516024016120c7929190615245565b60408051808201909152600481527f57654fe400000000000000000000000000000000000000000000000000000000602082015290565b606063de16f1a060e01b826040516024016128a59190615224565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff16610e4c57610e4c610982826000613c39565b613653614ede565b61365c836122ea565b9050613686611c498383604001516bffffffffffffffffffffffff1661215490919063ffffffff16565b6bffffffffffffffffffffffff16604082015261118d83826134eb565b6136ab614ede565b6136b4836122ea565b9050613686611c498383604001516bffffffffffffffffffffffff1661286e90919063ffffffff16565b1460011690565b60606382ded78560e01b83836040516024016120c792919061529d565b60606322df959760e01b848484604051602401613428939291906153ec565b606063e9f8377160e01b83836040516024016120c7929190615372565b606063140a84db60e01b83836040516024016120c7929190615245565b60606331d7a50560e01b83836040516024016120c7929190615372565b60006131ea8361378e868563ffffffff613c5616565b9063ffffffff613c8716565b600c546000906137b190600163ffffffff61215416565b90506137bb614efe565b50600082815260156020908152604080832084845282529182902082516060810184528154808252600183015493820193909352600290910154928101929092521561118d5761118d6109828484613cb1565b6000828152600b602052604090205461382d908263ffffffff61215416565b6000838152600b602052604090205560175461384f908263ffffffff61215416565b6017555050565b610e4c8160006001613b50565b60006131ea8361378e61387d82600163ffffffff61215416565b61388d888763ffffffff613c5616565b9063ffffffff61286e16565b600d5415611b4557611b456109826000613cce565b601154158015906138c6575060125463ffffffff1615155b80156138d3575060135415155b80156138e6575060145463ffffffff1615155b80156139015750601454640100000000900463ffffffff1615155b15611b4557611b456109826001613cce565b606063c996af7b60e01b83836040516024016120c79291906153a2565b600082158061393d575081155b1561394a575060006131ea565b600061395d85600163ffffffff61215416565b865167ffffffffffffffff16101561397957856040015161397f565b85602001515b6bffffffffffffffffffffffff1690508061399e5760009150506131ea565b6139a9848483613778565b9695505050505050565b60008315806139c157508183145b156139ce575060006131ea565b818310613a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172490615413565b613a0f614f5a565b613a198685613d0d565b9050613a23614f5a565b613a2d8785613d0d565b9050611d3d81600001518260200151846000015185602001518a613e2b565b600080613a598888613eb7565b90506000613a678787613eb7565b9050811580613a74575080155b15613a85575060009150611d3d9050565b600081831315613a9e57613a998284613f09565b613aa8565b613aa88383613f09565b9050613ad1613acc613ab983613f28565b8863ffffffff168863ffffffff166145ca565b6145d9565b905081831315613aea57613ae58282613f09565b613af4565b613af48282614bc3565b9050613b00818c614bef565b9b9a5050505050505050505050565b6000828152600b6020526040902054613b2e908263ffffffff61286e16565b6000838152600b602052604090205560175461384f908263ffffffff61286e16565b6000838152600f6020526040902054600c5480821415613b7157505061118d565b613b79614f5a565b506000858152600e602090815260408083208584528252918290208251808401909352805483526001015490820152613bb0614f5a565b613bb982614c31565b15613bf257613bd2826000015183602001518888614c3a565b60208301819052818352613be69190614c9c565b60208301528152613bfd565b602081018590528581525b6000878152600e6020908152604080832086845282528083208451815593820151600190940193909355978152600f9097529095205550505050565b6060639ae94f0160e01b83836040516024016120c7929190615362565b600082613c6557506000610ea8565b82820282848281613c7257fe5b0414610ea557610ea561098260018686613409565b600081613c9d57613c9d61098260038585613409565b6000828481613ca857fe5b04949350505050565b6060635caa0b0560e01b83836040516024016120c7929190615372565b60607f0b02d77300000000000000000000000000000000000000000000000000000000826001811115613cfd57fe5b6040516024016128a591906155d4565b613d15614f5a565b506000828152600e602090815260408083208484528252918290208251808401909352805483526001015490820152613d4d81614c31565b15613d5757610ea8565b6000613d6a83600163ffffffff61215416565b6000858152600e60209081526040808320848452825291829020825180840190935280548352600101549082015292509050613da582614c31565b15613db05750610ea8565b6000848152600f602052604090205483811015613e0d576000858152600e6020908152604080832084845282529182902082518084019093528054835260010154908201529250613e0083614c31565b15613e0d5750610ea89050565b50506040805180820190915260008152600160208201529392505050565b600081613e3a57506000613eae565b83613e5a57613e538561378e848963ffffffff613c5616565b9050613eae565b6000613e7f613e6f868863ffffffff613c5616565b61229b898763ffffffff613c5616565b90506000613e93828663ffffffff613c8716565b9050613ea98761378e868463ffffffff613c5616565b925050505b95945050505050565b600080831215613ecf57613ecf610982600185614cc5565b6000821215613ee657613ee6610982600184614cc5565b610ea5613f03846f80000000000000000000000000000000614d06565b83614d4e565b6000610ea5613f03846f80000000000000000000000000000000614d06565b60006f80000000000000000000000000000000821315613f5057613f50610982600184614dcf565b60008213613f6657613f66610982600084614dcf565b6f80000000000000000000000000000000821415613f8657506000610bef565b640733048c5a8213613fb957507fffffffffffffffffffffffffffffffe010000000000000000000000000000000610bef565b60008060006a01c8464f761647600000008513614018577ffffffffffffffffffffffffffffffff000000000000000000000000000000000909301926a01c8464f761647600000006f8000000000000000000000000000000086020594505b6cf1aaddd7742e900000000000008513614076577ffffffffffffffffffffffffffffffff800000000000000000000000000000000909301926cf1aaddd7742e900000000000006f8000000000000000000000000000000086020594505b6e0afe10820813d7800000000000000085136140d8577ffffffffffffffffffffffffffffffffc00000000000000000000000000000000909301926e0afe10820813d780000000000000006f8000000000000000000000000000000086020594505b6f02582ab704279ec00000000000000000851361413c577ffffffffffffffffffffffffffffffffe00000000000000000000000000000000909301926f02582ab704279ec000000000000000006f8000000000000000000000000000000086020594505b6f1152aaa3bf81cc00000000000000000085136141a0577fffffffffffffffffffffffffffffffff00000000000000000000000000000000909301926f1152aaa3bf81cc0000000000000000006f8000000000000000000000000000000086020594505b6f2f16ac6c59de700000000000000000008513614204577fffffffffffffffffffffffffffffffff80000000000000000000000000000000909301926f2f16ac6c59de700000000000000000006f8000000000000000000000000000000086020594505b6f4da2cbf1be58280000000000000000008513614268577fffffffffffffffffffffffffffffffffc0000000000000000000000000000000909301926f4da2cbf1be58280000000000000000006f8000000000000000000000000000000086020594505b6f63afbe7ab2082c00000000000000000085136142cc577fffffffffffffffffffffffffffffffffe0000000000000000000000000000000909301926f63afbe7ab2082c0000000000000000006f8000000000000000000000000000000086020594505b6f70f5a893b608861e1f58934f97aea57d8513614330577ffffffffffffffffffffffffffffffffff0000000000000000000000000000000909301926f70f5a893b608861e1f58934f97aea57d6f8000000000000000000000000000000086020594505b7fffffffffffffffffffffffffffffffff80000000000000000000000000000000850192508291506f80000000000000000000000000000000828002059050700100000000000000000000000000000000838103830205840193506f80000000000000000000000000000000818302816143a657fe5b059150700200000000000000000000000000000000836faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa038302816143d757fe5b05840193506f80000000000000000000000000000000818302816143f757fe5b059150700300000000000000000000000000000000836f999999999999999999999999999999990383028161442857fe5b05840193506f800000000000000000000000000000008183028161444857fe5b059150700400000000000000000000000000000000836f924924924924924924924924924924920383028161447957fe5b05840193506f800000000000000000000000000000008183028161449957fe5b059150700500000000000000000000000000000000836f8e38e38e38e38e38e38e38e38e38e38e038302816144ca57fe5b05840193506f80000000000000000000000000000000818302816144ea57fe5b059150700600000000000000000000000000000000836f8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b0383028161451b57fe5b05840193506f800000000000000000000000000000008183028161453b57fe5b059150700700000000000000000000000000000000836f89d89d89d89d89d89d89d89d89d89d890383028161456c57fe5b05840193506f800000000000000000000000000000008183028161458c57fe5b059150700800000000000000000000000000000000836f88888888888888888888888888888888038302816145bd57fe5b0584019350505050919050565b60006131ea613f038585614d06565b60007fffffffffffffffffffffffffffffffe01000000000000000000000000000000082121561460b57506000610bef565b8161462757506f80000000000000000000000000000000610bef565b600082131561463e5761463e610982600184614dcf565b6f800000000000000000000000000000006f1000000000000000000000000000000083078080028290056710e1b3be415a0000810293909301929091818302059050806705a0913f6b1e000002830192506f80000000000000000000000000000000828202816146aa57fe5b05905080670168244fdac7800002830192506f80000000000000000000000000000000828202816146d757fe5b05905080664807432bc1800002830192506f800000000000000000000000000000008282028161470357fe5b05905080660c0135dca0400002830192506f800000000000000000000000000000008282028161472f57fe5b059050806601b707b1cdc00002830192506f800000000000000000000000000000008282028161475b57fe5b059050806536e0f639b80002830192506f800000000000000000000000000000008282028161478657fe5b05905080650618fee9f80002830192506f80000000000000000000000000000000828202816147b157fe5b05905080649c197dcc0002830192506f80000000000000000000000000000000828202816147db57fe5b05905080640e30dce40002830192506f800000000000000000000000000000008282028161480557fe5b0590508064012ebd130002830192506f800000000000000000000000000000008282028161482f57fe5b059050806317499f0002830192506f800000000000000000000000000000008282028161485857fe5b059050806301a9d48002830192506f800000000000000000000000000000008282028161488157fe5b05905080621c638002830192506f80000000000000000000000000000000828202816148a957fe5b059050806201c63802830192506f80000000000000000000000000000000828202816148d157fe5b05905080611ab802830192506f80000000000000000000000000000000828202816148f857fe5b0590508061017c02830192506f800000000000000000000000000000008282028161491f57fe5b05905080601402830192506f800000000000000000000000000000008282028161494557fe5b600095909503946721c3677c82b400009190059384010582016f80000000000000000000000000000000019290507010000000000000000000000000000000008416156149b4577243cbaf42a000812488fc5c220ad7b97bf6e99e6cf1aaddd7742e56d32fb9f9974484020592505b7008000000000000000000000000000000008416156149f6577105d27a9f51c31b7c2f8038212a05747799916e0afe10820813d65dfe6a33c07f738f84020592505b700400000000000000000000000000000000841615614a3857701b4c902e273a58678d6d3bfdb93db96d026f02582ab704279e8efd15e0265855c47a84020592505b700200000000000000000000000000000000841615614a7a577003b1cc971a9bb5b9867477440d6d1577506f1152aaa3bf81cb9fdb76eae12d02957184020592505b700100000000000000000000000000000000841615614abc5770015bf0a8b1457695355fb8ac404e7a79e36f2f16ac6c59de6f8d5d6f63c1482a7c8684020592505b6f80000000000000000000000000000000841615614afc576fd3094c70f034de4b96ff7d5b6f99fcd86f4da2cbf1be5827f9eb3ad1aa9866ebb384020592505b6f40000000000000000000000000000000841615614b3c576fa45af1e1f40c333b3de1db4dd55f29a76f63afbe7ab2082ba1a0ae5e4eb1b479dc84020592505b6f20000000000000000000000000000000841615614b7c576f910b022db7ae67ce76b441c27035c6a16f70f5a893b608861e1f58934f97aea57d84020592505b6f10000000000000000000000000000000841615614bbc576f88415abbe9a76bead8d00cf112e4d4a86f783eafef1c0a8f3978c7f81824d62ebf84020592505b5050919050565b60006f80000000000000000000000000000000614be08484614d06565b81614be757fe5b059392505050565b600080821215614c0757614c07610982600184614cc5565b6000614c138484614d06565b905060008113614c27576000915050610ea8565b607f1c9392505050565b60200151151590565b60008085614c4c575082905081614c93565b83614c5b575084905083614c93565b614c7e614c6e858763ffffffff613c5616565b61388d888663ffffffff613c5616565b9150614c90858463ffffffff613c5616565b90505b94509492505050565b600080614cba84846f80000000000000000000000000000000614dfe565b915091509250929050565b60607fbd79545f00000000000000000000000000000000000000000000000000000000836001811115614cf457fe5b836040516024016120c79291906155e2565b600082614d1557506000610ea8565b5081810281838281614d2357fe5b05141580614d3a575082828281614d3657fe5b0514155b15610ea857610ea861098260018585614e6c565b600081614d6457614d6461098260028585614e6c565b7f800000000000000000000000000000000000000000000000000000000000000083148015614db25750817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff145b15614dc657614dc661098260038585614e6c565b818381614be757fe5b60607fed2f26a100000000000000000000000000000000000000000000000000000000836001811115614cf457fe5b60008082851180614e0e57508284115b15614e6357600084861015614e235784614e25565b855b9050614e37818563ffffffff613c8716565b9050614e49868263ffffffff613c8716565b9250614e5b858263ffffffff613c8716565b91505061303b565b50929391925050565b60607f8c12dfe700000000000000000000000000000000000000000000000000000000846003811115614e9b57fe5b8484604051602401613428939291906155f5565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b60405180606001604052806000815260200160008152602001600081525090565b604080518082019091526000808252602082015290565b81548183558181111561118d5760008381526020902061118d918101908301614f74565b604051806040016040528060008152602001600081525090565b610b5791905b80821115614f8e5760008155600101614f7a565b5090565b803573ffffffffffffffffffffffffffffffffffffffff81168114610ea857600080fd5b60006040828403121561238a578081fd5b600060208284031215614fd8578081fd5b610ea58383614f92565b600080600060608486031215614ff6578182fd5b83356150018161561a565b925060208401356150118161561a565b929592945050506040919091013590565b60008060408385031215615034578182fd5b61503e8484614f92565b946020939093013593505050565b6000806040838503121561505e578182fd5b6150688484614f92565b915060208301356150788161564a565b809150509250929050565b600060208284031215615094578081fd5b8151610ea58161563c565b6000602082840312156150b0578081fd5b5035919050565b600080604083850312156150c9578182fd5b8235915060208301356150788161561a565b600080604083850312156150ed578182fd5b50508035926020909101359150565b6000806040838503121561510e578182fd5b82359150602083013563ffffffff81168114615078578182fd5b600060208284031215615139578081fd5b8135610ea58161564a565b600080600060a08486031215615158578283fd5b6151628585614fb6565b92506151718560408601614fb6565b9150608084013590509250925092565b600060208284031215615192578081fd5b5051919050565b600080600080600060a086880312156151b0578283fd5b8535945060208601356151c281615657565b93506040860135925060608601356151d981615657565b915060808601356151e981615657565b809150509295509295909350565b60008060408385031215615209578182fd5b823561521481615657565b915060208301356150788161563c565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561531157835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016152dd565b509095945050505050565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff91909116602083015263ffffffff16604082015260600190565b9182521515602082015260400190565b918252602082015260400190565b606081016004851061538e57fe5b938152602081019290925260409091015290565b60408101600384106153b057fe5b9281526020015290565b604081016153c784615610565b92815273ffffffffffffffffffffffffffffffffffffffff9190911660209091015290565b606081016153f985615610565b938152602081019290925263ffffffff1660409091015290565b60208082526013908201527f43525f494e54455256414c5f494e56414c494400000000000000000000000000604082015260600190565b60208082526014908201527f574554485f5452414e534645525f4641494c4544000000000000000000000000604082015260600190565b81518152602080830151908201526040918201519181019190915260600190565b815173ffffffffffffffffffffffffffffffffffffffff16815260209182015163ffffffff169181019190915260400190565b815167ffffffffffffffff1681526020808301516bffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b94855263ffffffff938416602086015260408501929092528216606084015216608082015260a00190565b92835260ff918216602084015216604082015260600190565b63ffffffff91909116815260200190565b63ffffffff92831681529116602082015260400190565b60ff91909116815260200190565b60ff929092168252602082015260400190565b60ff9390931683526020830191909152604082015260600190565b60028110610e4c57fe5b73ffffffffffffffffffffffffffffffffffffffff81168114610e4c57600080fd5b8015158114610e4c57600080fd5b60028110610e4c57600080fd5b63ffffffff81168114610e4c57600080fdfea365627a7a723158205024e9d661fc969de54dcf3c94b2f323b81b2f191fbdfed639fa0724cfd2f6a96c6578706572696d656e74616cf564736f6c634300050c0040" + "object": "0x6080604052600080546001600160a01b031916331790556156b7806100256000396000f3fe6080604052600436106103295760003560e01c80638da5cb5b116101a5578063bb7ef7e0116100ec578063e8eeb3f811610095578063f18765321161006f578063f1876532146108bf578063f252b7a1146108df578063f2fde38b146108ff578063ff691b111461091f57610329565b8063e8eeb3f814610875578063e907f0031461088a578063ee99205c146108aa57610329565b8063e0ee036e116100c6578063e0ee036e1461082b578063e1c7392a14610840578063e804d0a41461085557610329565b8063bb7ef7e0146107c9578063c18c9141146107e9578063d39de6e91461080957610329565b8063a694fc3a1161014e578063b3e3337911610128578063b3e3337914610769578063b510879f14610789578063b9181611146107a957610329565b8063a694fc3a1461071f578063b05315241461073f578063b2baa33e1461075457610329565b8063a26171e21161017f578063a26171e2146106e2578063a3b4a327146106f7578063a657e5791461070a57610329565b80638da5cb5b1461068d5780639ad26744146106a25780639c3ccc82146106c257610329565b80634bcc3f6711610274578063624a72321161021d57806370712939116101f757806370712939146106165780637667180814610636578063816667961461064b5780638a2e271a1461066d57610329565b8063624a7232146105cc57806363403801146105e157806368a7d6cd146105f657610329565b80635bd4ab731161024e5780635bd4ab73146105595780635d91121d146105865780635e615a6b146105a657610329565b80634bcc3f67146104f7578063587da0231461052457806358f6c7e31461053957610329565b80633c277fc5116102d657806344a6958b116102b057806344a6958b1461048a57806346b97959146104aa578063494503d4146104d757610329565b80633c277fc51461041b5780633e4ad7321461043d57806342f1181e1461046a57610329565b80632a94c279116103075780632a94c2791461039b5780632e17de78146103ca57806338229d93146103ea57610329565b806301e28d841461032e5780630b9663db146103505780631e7ff8f61461037b575b600080fd5b34801561033a57600080fd5b5061034e610349366004614fd2565b61093f565b005b34801561035c57600080fd5b50610365610a0d565b6040516103729190615332565b60405180910390f35b34801561038757600080fd5b50610365610396366004614fd2565b610b5a565b3480156103a757600080fd5b506103bb6103b63660046150e6565b610bf4565b6040516103729392919061551f565b3480156103d657600080fd5b5061034e6103e53660046150aa565b610c20565b3480156103f657600080fd5b5061040a6104053660046150aa565b610dd5565b604051610372959493929190615550565b34801561042757600080fd5b50610430610e04565b604051610372919061522f565b34801561044957600080fd5b5061045d6104583660046150aa565b610e1c565b60405161037291906154e0565b34801561047657600080fd5b5061034e610485366004614fd2565b610e3b565b34801561049657600080fd5b5061045d6104a5366004615057565b610e4f565b3480156104b657600080fd5b506104ca6104c53660046150aa565b610eae565b604051610372919061548c565b3480156104e357600080fd5b506104306104f23660046150aa565b610ef9565b34801561050357600080fd5b506105176105123660046150aa565b610f2d565b60405161037291906154ad565b34801561053057600080fd5b50610365610f8f565b34801561054557600080fd5b5061034e61055436600461514f565b610f95565b34801561056557600080fd5b50610579610574366004614fd2565b611192565b6040516103729190615327565b34801561059257600080fd5b5061034e6105a1366004615107565b6111a7565b3480156105b257600080fd5b506105bb611270565b604051610372959493929190615573565b3480156105d857600080fd5b50610430611299565b3480156105ed57600080fd5b506103656112b1565b34801561060257600080fd5b50610365610611366004615202565b6112b7565b34801561062257600080fd5b5061034e610631366004614fd2565b6113f0565b34801561064257600080fd5b506103656114a5565b34801561065757600080fd5b506106606114ab565b60405161037291906155b7565b34801561067957600080fd5b5061034e610688366004614fd2565b6114b7565b34801561069957600080fd5b50610430611579565b3480156106ae57600080fd5b5061034e6106bd36600461502d565b611595565b3480156106ce57600080fd5b5061034e6106dd3660046151a4565b6115a7565b3480156106ee57600080fd5b50610365611621565b61034e610705366004614fed565b611627565b34801561071657600080fd5b50610365611877565b34801561072b57600080fd5b5061034e61073a3660046150aa565b61187d565b34801561074b57600080fd5b50610365611992565b34801561076057600080fd5b50610365611998565b34801561077557600080fd5b5061034e6107843660046150aa565b6119b6565b34801561079557600080fd5b5061034e6107a43660046150aa565b6119f6565b3480156107b557600080fd5b506105796107c4366004614fd2565b611a00565b3480156107d557600080fd5b506103656107e43660046150aa565b611a15565b3480156107f557600080fd5b506103656108043660046150aa565b611aa0565b34801561081557600080fd5b5061081e611ab2565b60405161037291906152ce565b34801561083757600080fd5b50610660611b21565b34801561084c57600080fd5b5061034e611b2d565b34801561086157600080fd5b5061045d610870366004615133565b611b47565b34801561088157600080fd5b50610660611c97565b34801561089657600080fd5b506103656108a53660046150c2565b611cab565b3480156108b657600080fd5b50610430611d48565b3480156108cb57600080fd5b506103656108da366004614fd2565b611d64565b3480156108eb57600080fd5b5061045d6108fa36600461502d565b611d76565b34801561090b57600080fd5b5061034e61091a366004614fd2565b611db7565b34801561092b57600080fd5b5061034e61093a3660046150aa565b611e5a565b610947612087565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff16610987576109876109826001836120aa565b61214c565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517ff50d0d312d501878616eb5e78ebf3ed6dcd3955aaef8165af9c6b057cc4832fb90610a0290839061522f565b60405180910390a150565b600c5460009081610a2582600163ffffffff61215416565b6000818152601660205260409020600101549091508015610a4d57610a4d6109828383612173565b610a55612190565b610a5d612203565b600084815260166020526040902055610a74614eba565b50600083815260166020908152604091829020825160a08101845281548082526001830154938201849052600283015482860181905260038401546060840181905260049094015460808401529451919488947fbb4a26fa0ace13ee4da343896c20eaa44a618fb9071fdd8c2e2c960a4583189d94610af69491939291615535565b60405180910390a2610b066122a7565b6020810151610b4d57805160405185917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b291610b449160009161537d565b60405180910390a25b6020015193505050505b90565b6000610b64611299565b73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610b9c919061522f565b60206040518083038186803b158015610bb457600080fd5b505afa158015610bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bec919081019061518c565b90505b919050565b601560209081526000928352604080842090915290825290208054600182015460029092015490919083565b33610c29614ee9565b73ffffffffffffffffffffffffffffffffffffffff821660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610c76906122ea565b90506000610ca882602001516bffffffffffffffffffffffff1683604001516bffffffffffffffffffffffff16612390565b905080841115610cbf57610cbf61098285836123a6565b73ffffffffffffffffffffffffffffffffffffffff831660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610d0d90856123c3565b610d15611299565b73ffffffffffffffffffffffffffffffffffffffff16639470b0bd84866040518363ffffffff1660e01b8152600401610d4f9291906152a8565b600060405180830381600087803b158015610d6957600080fd5b505af1158015610d7d573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd85604051610dc79190615332565b60405180910390a250505050565b601660205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b610e24614ee9565b6000828152600760205260409020610bec906122ea565b610e4361244a565b610e4c81612491565b50565b610e57614ee9565b610ea560056000846001811115610e6a57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8816825290925290206122ea565b90505b92915050565b610eb6614f09565b506000908152601560209081526040808320600c548452825291829020825160608101845281548152600182015492810192909252600201549181019190915290565b60028181548110610f0657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b610f35614f2a565b506000908152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff169082015290565b600d5481565b3381610fa1575061118d565b6000610fb06020860186615133565b6001811115610fbb57fe5b148015610fdf57506000610fd26020850185615133565b6001811115610fdd57fe5b145b15610fea575061118d565b6001610ff96020860186615133565b600181111561100457fe5b141561101957611019846020013582846125c2565b60016110286020850185615133565b600181111561103357fe5b1415611048576110488360200135828461265b565b600060058161105a6020880188615133565b600181111561106557fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff86168252835290812092509060059082906110af90880188615133565b60018111156110ba57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff87168252909252902090506110fd8282866126f4565b60208086013590870180359073ffffffffffffffffffffffffffffffffffffffff8616907f7d3ad1dcf03b9027064d1d9a474a69e0cecc31324c541d3eb9b5e6fa2f106c8d90889061114f908c615133565b600181111561115a57fe5b61116760208c018c615133565b600181111561117257fe5b6040516111819392919061559e565b60405180910390a45050505b505050565b60106020526000908152604090205460ff1681565b816111b1816127ed565b6000838152600a602052604090205474010000000000000000000000000000000000000000900463ffffffff166111e9848285612826565b6000848152600a60205260409081902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff8716021790555184907f8ea2a7a959bd25f226b7b0a4393613f7fdcaa8404e8bad96aa52dc1c1459016790610dc790849087906155c8565b601154601254601354601454929363ffffffff9283169391928281169264010000000090041690565b73ba7f8b5fb1b19c1211c5d49550fcd149177a5eaf90565b60115481565b60085460009033906112d090600163ffffffff61286e16565b600881905591506112e582620f424086612826565b6112ed614f2a565b5060408051808201825273ffffffffffffffffffffffffffffffffffffffff838116825263ffffffff87811660208085019182526000888152600a9091528590208451815492517fffffffffffffffffffffffff00000000000000000000000000000000000000009093169416939093177fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000919092160217905590517fcec6fc86ea644053f6edff1160dfe3fa5c61e7a5ef9f873f145bb03a0bd319e7906113d19085908590899061533b565b60405180910390a183156113e8576113e8836119b6565b505092915050565b6113f861244a565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16611431576114316109828261288a565b60005b6002548110156114a1578173ffffffffffffffffffffffffffffffffffffffff166002828154811061146257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415611499576114948282612929565b6114a1565b600101611434565b5050565b600c5481565b60145463ffffffff1681565b6114bf612087565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff16156114fb576114fb6109826000836120aa565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f3e535d1ab441ef41c268fd9b52b478aee02d693c5ca2a84b5d26b89e0922e5e190610a0290839061522f565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b61159d61244a565b6114a18282612929565b6115af612087565b6115bc8585858585612b78565b3073ffffffffffffffffffffffffffffffffffffffff1663c6f3a4276040518163ffffffff1660e01b815260040160006040518083038186803b15801561160257600080fd5b505afa158015611616573d6000803e3d6000fd5b505050505050505050565b60135481565b3360009081526010602052604090205460ff1661164a5761164a61098233612c3b565b61165381612c56565b3461172d57611660610e04565b73ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b815260040161169c93929190615277565b602060405180830381600087803b1580156116b657600080fd5b505af11580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116ee919081019061508e565b61172d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172490615455565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600960205260409020548061175e575061118d565b600061176982610e1c565b602001516bffffffffffffffffffffffff16905060135481101561178e57505061118d565b600c5460008381526015602090815260408083208484528252808320601690925290912081548061183d576000806117c68888612c77565b6002870182905560018701819055600386015491935091506117ee908263ffffffff61286e16565b60038501556001808501546118089163ffffffff61286e16565b6001850155604051889087907f14b098103235344975b17508c2391721cc9ac3f3fa2b56c7ff46f8480dfd074f90600090a350505b61184d818863ffffffff61286e16565b83556002820154611864908863ffffffff61286e16565b8260020181905550505050505050505050565b60085481565b33611886611299565b73ffffffffffffffffffffffffffffffffffffffff166315cc36f282846040518363ffffffff1660e01b81526004016118c09291906152a8565b600060405180830381600087803b1580156118da57600080fd5b505af11580156118ee573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff811660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc602052604090206119409083612d03565b8073ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a836040516119869190615332565b60405180910390a25050565b60175481565b60006119b1601154600d5461286e90919063ffffffff16565b905090565b3360008181526009602052604080822084905551839183917f5640833634fce74eb9211d1209a91dd5a1c8c6a751696bff9323b4db67f815139190a35050565b610e4c8133612d6d565b60016020526000908152604090205460ff1681565b6000611a1f614f2a565b506000828152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611a8385612f45565b91509150611a9683602001518383613002565b5095945050505050565b600b6020526000908152604090205481565b60606002805480602002602001604051908101604052809291908181526020018280548015611b1757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611aec575b5050505050905090565b60125463ffffffff1681565b611b35612087565b611b3d613043565b611b45613056565b565b611b4f614ee9565b60016000526004602052611b827fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe056122ea565b90506000826001811115611b9257fe5b1415610bef576000611ba2611299565b73ffffffffffffffffffffffffffffffffffffffff16639706e0c06040518163ffffffff1660e01b815260040160206040518083038186803b158015611be757600080fd5b505afa158015611bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c1f919081019061518c565b9050611c4e611c4983602001516bffffffffffffffffffffffff168361215490919063ffffffff16565b613081565b6bffffffffffffffffffffffff90811660208401526040830151611c7e91611c499184911663ffffffff61215416565b6bffffffffffffffffffffffff16604083015250919050565b601454640100000000900463ffffffff1681565b6000611cb5614f2a565b506000838152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611d1986612f45565b915091506000611d2e84602001518484613002565b915050611d3d878783856130a5565b979650505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60096020526000908152604090205481565b611d7e614ee9565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208584529091529020610ea5906122ea565b611dbf61244a565b73ffffffffffffffffffffffffffffffffffffffff8116611dea57611de56109826131f2565b610e4c565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b600c546000611e7082600163ffffffff61215416565b9050611e7a614eba565b50600081815260166020908152604091829020825160a08101845281548152600182015492810183905260028201549381019390935260038101546060840152600401546080830152611ecf57505050610e4c565b611ed7614f09565b5060008481526015602090815260408083208584528252918290208251606081018452815480825260018301549382019390935260029091015492810192909252611f255750505050610e4c565b6000858152601560209081526040808320868452909152812081815560018101829055600201819055611f588284613229565b9050600080611f6c8884866040015161329e565b9150915087877ff1116b309178aa62dcb6bf8c3b8bc2321724907c7ebf52192d14c8ce3aa9194c8484604051611fa392919061537d565b60405180910390a36000611fbd838363ffffffff61286e16565b6080870151909150611fd5908263ffffffff61286e16565b6080870181905260008881526016602090815260409091206004019190915586015161200890600163ffffffff61215416565b602080880182815260008a8152601690925260409091206001019190915551611616576080860151865188917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b291612066908263ffffffff61215416565b60405161207492919061537d565b60405180910390a2505050505050505050565b3360009081526001602052604090205460ff16611b4557611b45610982336133ee565b606063b9588e4360e01b83836040516024016120c79291906153c5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b805160208201fd5b60008282111561216d5761216d61098260028585613409565b50900390565b606063614b800a60e01b83836040516024016120c792919061537d565b30318015610e4c576121a0610e04565b73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121e757600080fd5b505af11580156121fb573d6000803e3d6000fd5b505050505050565b60006119b1601754612213610e04565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161224b919061522f565b60206040518083038186803b15801561226357600080fd5b505afa158015612277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061229b919081019061518c565b9063ffffffff61215416565b4260006122b2611998565b9050818111156122c9576122c961098282846134ae565b600c546000906122e090600163ffffffff61286e16565b600c555050600d55565b6122f2614ee9565b5060408051606081018252825467ffffffffffffffff81168083526bffffffffffffffffffffffff680100000000000000008304811660208501527401000000000000000000000000000000000000000090920490911692820192909252600c54909181111561238a57612365816134cb565b67ffffffffffffffff16825260408201516bffffffffffffffffffffffff1660208301525b50919050565b600081831061239f5781610ea5565b5090919050565b60606384c8b7c960e01b83836040516024016120c792919061537d565b6123cb614ee9565b6123d4836122ea565b90506123fe611c498383604001516bffffffffffffffffffffffff1661215490919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161242d91611c4991168463ffffffff61215416565b6bffffffffffffffffffffffff16602082015261118d83826134eb565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b4557600054611b459061098290339073ffffffffffffffffffffffffffffffffffffffff166135a5565b73ffffffffffffffffffffffffffffffffffffffff81166124b7576124b76109826135c2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16156124f1576124f1610982826135f9565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b6125cb83613614565b6125d58383612d6d565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600660209081526040808320868452909152902061260f908261364b565b6000838152600760205260409020612627908261364b565b6001600052600460205261118d7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe058261364b565b61266483613614565b61266e8383612d6d565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020908152604080832086845290915290206126a890826136a3565b60008381526007602052604090206126c090826136a3565b6001600052600460205261118d7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05826136a3565b6126fe83836136de565b156127085761118d565b612710614ee9565b612719846122ea565b9050612723614ee9565b61272c846122ea565b905081604001516bffffffffffffffffffffffff16831115612767576127676109828484604001516bffffffffffffffffffffffff166123a6565b604082015161278e90611c49906bffffffffffffffffffffffff168563ffffffff61215416565b6bffffffffffffffffffffffff9081166040808501919091528201516127bf91611c4991168563ffffffff61286e16565b6bffffffffffffffffffffffff1660408201526127dc85836134eb565b6127e684826134eb565b5050505050565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff163381146114a1576114a161098233846136e5565b620f424063ffffffff8216111561284b5761284661098260008584613702565b61118d565b8163ffffffff168163ffffffff16111561118d5761118d61098260018584613702565b600082820183811015610ea557610ea561098260008686613409565b606063eb5108a260e01b826040516024016128a5919061522f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16612962576129626109828361288a565b600254811061297d5761297d61098282600280549050613721565b8173ffffffffffffffffffffffffffffffffffffffff16600282815481106129a157fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614612a0357612a03610982600283815481106129db57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff168461373e565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612a7e57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110612ab157fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190612b309082614f41565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60118590556012805463ffffffff8087167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000092831617909255601385905560148054848416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9487169190931617929092161790556040517f613157dbb0e920deab8ad6ddd3805e87cbf57344b9fe780f1764790ec789754290612c2c9087908790879087908790615573565b60405180910390a15050505050565b606063b56d2df060e01b826040516024016128a5919061522f565b803414158015612c6557503415155b15610e4c57610e4c610982823461375b565b6000828152600a602052604081205481908190612caa9073ffffffffffffffffffffffffffffffffffffffff1686611d76565b602001516bffffffffffffffffffffffff169050612cce848263ffffffff61215416565b601254909350612cf990612cec9063ffffffff16620f424086613778565b829063ffffffff61286e16565b9150509250929050565b612d0b614ee9565b612d14836122ea565b9050612d3e611c498383604001516bffffffffffffffffffffffff1661286e90919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161242d91611c4991168463ffffffff61286e16565b612d768261379a565b6000612d8583836000806130a5565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208784529091529020909150612dc1906122ea565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600660209081526040808320888452825291829020845181549286015195909301517fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921667ffffffffffffffff909316929092177fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff16680100000000000000006bffffffffffffffffffffffff95861602179092167401000000000000000000000000000000000000000093909216929092021790558015612f3c57612ea6838261380e565b612eae610e04565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401612ee89291906152a8565b602060405180830381600087803b158015612f0257600080fd5b505af1158015612f16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f3a919081019061508e565b505b61118d83613856565b6000806000612f606001600c5461215490919063ffffffff16565b9050612f6a614f09565b50600084815260156020908152604080832084845282528083208151606080820184528254825260018084015483870152600293840154838601528787526016865295849020845160a0810186528154815296810154958701959095529184015492850192909252600383015490840152600490910154608083015290612ff2908290613229565b9350806040015192505050915091565b600080826130125783915061303b565b61302663ffffffff8616620f424086613863565b9150613038848363ffffffff61215416565b90505b935093915050565b61304b613899565b42600d556001600c55565b61305e6138ae565b620d2f00620dbba068056bc75e2d63100000600260036127e68585858585612b78565b806bffffffffffffffffffffffff81168114610bef57610bef610982600284613913565b600c546000906130b3614ee9565b5073ffffffffffffffffffffffffffffffffffffffff851660009081526006602090815260408083208984528252918290208251606081018452905467ffffffffffffffff81168083526bffffffffffffffffffffffff6801000000000000000083048116948401949094527401000000000000000000000000000000000000000090910490921692810192909252821415613154576000925050506131ea565b61316081838787613930565b81519093506000906131839067ffffffffffffffff16600163ffffffff61286e16565b90506131c16131b48984602001516bffffffffffffffffffffffff16856000015167ffffffffffffffff16856139b3565b859063ffffffff61286e16565b93506131e46131b48984604001516bffffffffffffffffffffffff1684876139b3565b93505050505b949350505050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b815160009061323757610ea8565b8151835160408401516020860151606086015160145461326d95949392919063ffffffff80821691640100000000900416613a4c565b608083015183519192506000916132899163ffffffff61215416565b905081811015613297578091505b5092915050565b6000806132a9614f2a565b506000858152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff1690820181905261330d908686613002565b909350915082156133ca57613320610e04565b81516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff929092169163a9059cbb916133769187906004016152a8565b602060405180830381600087803b15801561339057600080fd5b505af11580156133a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133c8919081019061508e565b505b81156133e5576133da8683613b0f565b6133e5868386613b50565b50935093915050565b606063b65a25b960e01b826040516024016128a5919061522f565b606063e946c1bb60e01b8484846040516024016134289392919061538b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b606063a6bcde4760e01b83836040516024016120c792919061537d565b8067ffffffffffffffff81168114610bef57610bef610982600184613913565b8051825460408301516020909301516bffffffffffffffffffffffff90811668010000000000000000027fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff91909416740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff9094167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090931692909217929092161716179055565b6060631de45ad160e01b83836040516024016120c7929190615250565b60408051808201909152600481527f57654fe400000000000000000000000000000000000000000000000000000000602082015290565b606063de16f1a060e01b826040516024016128a5919061522f565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff16610e4c57610e4c610982826000613c39565b613653614ee9565b61365c836122ea565b9050613686611c498383604001516bffffffffffffffffffffffff1661215490919063ffffffff16565b6bffffffffffffffffffffffff16604082015261118d83826134eb565b6136ab614ee9565b6136b4836122ea565b9050613686611c498383604001516bffffffffffffffffffffffff1661286e90919063ffffffff16565b1460011690565b60606382ded78560e01b83836040516024016120c79291906152a8565b60606322df959760e01b848484604051602401613428939291906153f7565b606063e9f8377160e01b83836040516024016120c792919061537d565b606063140a84db60e01b83836040516024016120c7929190615250565b60606331d7a50560e01b83836040516024016120c792919061537d565b60006131ea8361378e868563ffffffff613c5616565b9063ffffffff613c8716565b600c546000906137b190600163ffffffff61215416565b90506137bb614f09565b50600082815260156020908152604080832084845282529182902082516060810184528154808252600183015493820193909352600290910154928101929092521561118d5761118d6109828484613cb1565b6000828152600b602052604090205461382d908263ffffffff61215416565b6000838152600b602052604090205560175461384f908263ffffffff61215416565b6017555050565b610e4c8160006001613b50565b60006131ea8361378e61387d82600163ffffffff61215416565b61388d888763ffffffff613c5616565b9063ffffffff61286e16565b600d5415611b4557611b456109826000613cce565b601154158015906138c6575060125463ffffffff1615155b80156138d3575060135415155b80156138e6575060145463ffffffff1615155b80156139015750601454640100000000900463ffffffff1615155b15611b4557611b456109826001613cce565b606063c996af7b60e01b83836040516024016120c79291906153ad565b600082158061393d575081155b1561394a575060006131ea565b600061395d85600163ffffffff61215416565b865167ffffffffffffffff16101561397957856040015161397f565b85602001515b6bffffffffffffffffffffffff1690508061399e5760009150506131ea565b6139a9848483613778565b9695505050505050565b60008315806139c157508183145b156139ce575060006131ea565b818310613a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117249061541e565b613a0f614f65565b613a198685613d0d565b9050613a23614f65565b613a2d8785613d0d565b9050611d3d81600001518260200151846000015185602001518a613e2b565b600080613a598888613eb7565b90506000613a678787613eb7565b9050811580613a74575080155b15613a85575060009150611d3d9050565b600081831315613a9e57613a998284613f09565b613aa8565b613aa88383613f09565b9050613ad1613acc613ab983613f28565b8863ffffffff168863ffffffff166145ca565b6145d9565b905081831315613aea57613ae58282613f09565b613af4565b613af48282614bc3565b9050613b00818c614bef565b9b9a5050505050505050505050565b6000828152600b6020526040902054613b2e908263ffffffff61286e16565b6000838152600b602052604090205560175461384f908263ffffffff61286e16565b6000838152600f6020526040902054600c5480821415613b7157505061118d565b613b79614f65565b506000858152600e602090815260408083208584528252918290208251808401909352805483526001015490820152613bb0614f65565b613bb982614c31565b15613bf257613bd2826000015183602001518888614c3a565b60208301819052818352613be69190614c9c565b60208301528152613bfd565b602081018590528581525b6000878152600e6020908152604080832086845282528083208451815593820151600190940193909355978152600f9097529095205550505050565b6060639ae94f0160e01b83836040516024016120c792919061536d565b600082613c6557506000610ea8565b82820282848281613c7257fe5b0414610ea557610ea561098260018686613409565b600081613c9d57613c9d61098260038585613409565b6000828481613ca857fe5b04949350505050565b6060635caa0b0560e01b83836040516024016120c792919061537d565b60607f0b02d77300000000000000000000000000000000000000000000000000000000826001811115613cfd57fe5b6040516024016128a591906155df565b613d15614f65565b506000828152600e602090815260408083208484528252918290208251808401909352805483526001015490820152613d4d81614c31565b15613d5757610ea8565b6000613d6a83600163ffffffff61215416565b6000858152600e60209081526040808320848452825291829020825180840190935280548352600101549082015292509050613da582614c31565b15613db05750610ea8565b6000848152600f602052604090205483811015613e0d576000858152600e6020908152604080832084845282529182902082518084019093528054835260010154908201529250613e0083614c31565b15613e0d5750610ea89050565b50506040805180820190915260008152600160208201529392505050565b600081613e3a57506000613eae565b83613e5a57613e538561378e848963ffffffff613c5616565b9050613eae565b6000613e7f613e6f868863ffffffff613c5616565b61229b898763ffffffff613c5616565b90506000613e93828663ffffffff613c8716565b9050613ea98761378e868463ffffffff613c5616565b925050505b95945050505050565b600080831215613ecf57613ecf610982600185614cc5565b6000821215613ee657613ee6610982600184614cc5565b610ea5613f03846f80000000000000000000000000000000614d06565b83614d59565b6000610ea5613f03846f80000000000000000000000000000000614d06565b60006f80000000000000000000000000000000821315613f5057613f50610982600184614dda565b60008213613f6657613f66610982600084614dda565b6f80000000000000000000000000000000821415613f8657506000610bef565b640733048c5a8213613fb957507fffffffffffffffffffffffffffffffe010000000000000000000000000000000610bef565b60008060006a01c8464f761647600000008513614018577ffffffffffffffffffffffffffffffff000000000000000000000000000000000909301926a01c8464f761647600000006f8000000000000000000000000000000086020594505b6cf1aaddd7742e900000000000008513614076577ffffffffffffffffffffffffffffffff800000000000000000000000000000000909301926cf1aaddd7742e900000000000006f8000000000000000000000000000000086020594505b6e0afe10820813d7800000000000000085136140d8577ffffffffffffffffffffffffffffffffc00000000000000000000000000000000909301926e0afe10820813d780000000000000006f8000000000000000000000000000000086020594505b6f02582ab704279ec00000000000000000851361413c577ffffffffffffffffffffffffffffffffe00000000000000000000000000000000909301926f02582ab704279ec000000000000000006f8000000000000000000000000000000086020594505b6f1152aaa3bf81cc00000000000000000085136141a0577fffffffffffffffffffffffffffffffff00000000000000000000000000000000909301926f1152aaa3bf81cc0000000000000000006f8000000000000000000000000000000086020594505b6f2f16ac6c59de700000000000000000008513614204577fffffffffffffffffffffffffffffffff80000000000000000000000000000000909301926f2f16ac6c59de700000000000000000006f8000000000000000000000000000000086020594505b6f4da2cbf1be58280000000000000000008513614268577fffffffffffffffffffffffffffffffffc0000000000000000000000000000000909301926f4da2cbf1be58280000000000000000006f8000000000000000000000000000000086020594505b6f63afbe7ab2082c00000000000000000085136142cc577fffffffffffffffffffffffffffffffffe0000000000000000000000000000000909301926f63afbe7ab2082c0000000000000000006f8000000000000000000000000000000086020594505b6f70f5a893b608861e1f58934f97aea57d8513614330577ffffffffffffffffffffffffffffffffff0000000000000000000000000000000909301926f70f5a893b608861e1f58934f97aea57d6f8000000000000000000000000000000086020594505b7fffffffffffffffffffffffffffffffff80000000000000000000000000000000850192508291506f80000000000000000000000000000000828002059050700100000000000000000000000000000000838103830205840193506f80000000000000000000000000000000818302816143a657fe5b059150700200000000000000000000000000000000836faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa038302816143d757fe5b05840193506f80000000000000000000000000000000818302816143f757fe5b059150700300000000000000000000000000000000836f999999999999999999999999999999990383028161442857fe5b05840193506f800000000000000000000000000000008183028161444857fe5b059150700400000000000000000000000000000000836f924924924924924924924924924924920383028161447957fe5b05840193506f800000000000000000000000000000008183028161449957fe5b059150700500000000000000000000000000000000836f8e38e38e38e38e38e38e38e38e38e38e038302816144ca57fe5b05840193506f80000000000000000000000000000000818302816144ea57fe5b059150700600000000000000000000000000000000836f8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b0383028161451b57fe5b05840193506f800000000000000000000000000000008183028161453b57fe5b059150700700000000000000000000000000000000836f89d89d89d89d89d89d89d89d89d89d890383028161456c57fe5b05840193506f800000000000000000000000000000008183028161458c57fe5b059150700800000000000000000000000000000000836f88888888888888888888888888888888038302816145bd57fe5b0584019350505050919050565b60006131ea613f038585614d06565b60007fffffffffffffffffffffffffffffffe01000000000000000000000000000000082121561460b57506000610bef565b8161462757506f80000000000000000000000000000000610bef565b600082131561463e5761463e610982600184614dda565b6f800000000000000000000000000000006f1000000000000000000000000000000083078080028290056710e1b3be415a0000810293909301929091818302059050806705a0913f6b1e000002830192506f80000000000000000000000000000000828202816146aa57fe5b05905080670168244fdac7800002830192506f80000000000000000000000000000000828202816146d757fe5b05905080664807432bc1800002830192506f800000000000000000000000000000008282028161470357fe5b05905080660c0135dca0400002830192506f800000000000000000000000000000008282028161472f57fe5b059050806601b707b1cdc00002830192506f800000000000000000000000000000008282028161475b57fe5b059050806536e0f639b80002830192506f800000000000000000000000000000008282028161478657fe5b05905080650618fee9f80002830192506f80000000000000000000000000000000828202816147b157fe5b05905080649c197dcc0002830192506f80000000000000000000000000000000828202816147db57fe5b05905080640e30dce40002830192506f800000000000000000000000000000008282028161480557fe5b0590508064012ebd130002830192506f800000000000000000000000000000008282028161482f57fe5b059050806317499f0002830192506f800000000000000000000000000000008282028161485857fe5b059050806301a9d48002830192506f800000000000000000000000000000008282028161488157fe5b05905080621c638002830192506f80000000000000000000000000000000828202816148a957fe5b059050806201c63802830192506f80000000000000000000000000000000828202816148d157fe5b05905080611ab802830192506f80000000000000000000000000000000828202816148f857fe5b0590508061017c02830192506f800000000000000000000000000000008282028161491f57fe5b05905080601402830192506f800000000000000000000000000000008282028161494557fe5b600095909503946721c3677c82b400009190059384010582016f80000000000000000000000000000000019290507010000000000000000000000000000000008416156149b4577243cbaf42a000812488fc5c220ad7b97bf6e99e6cf1aaddd7742e56d32fb9f9974484020592505b7008000000000000000000000000000000008416156149f6577105d27a9f51c31b7c2f8038212a05747799916e0afe10820813d65dfe6a33c07f738f84020592505b700400000000000000000000000000000000841615614a3857701b4c902e273a58678d6d3bfdb93db96d026f02582ab704279e8efd15e0265855c47a84020592505b700200000000000000000000000000000000841615614a7a577003b1cc971a9bb5b9867477440d6d1577506f1152aaa3bf81cb9fdb76eae12d02957184020592505b700100000000000000000000000000000000841615614abc5770015bf0a8b1457695355fb8ac404e7a79e36f2f16ac6c59de6f8d5d6f63c1482a7c8684020592505b6f80000000000000000000000000000000841615614afc576fd3094c70f034de4b96ff7d5b6f99fcd86f4da2cbf1be5827f9eb3ad1aa9866ebb384020592505b6f40000000000000000000000000000000841615614b3c576fa45af1e1f40c333b3de1db4dd55f29a76f63afbe7ab2082ba1a0ae5e4eb1b479dc84020592505b6f20000000000000000000000000000000841615614b7c576f910b022db7ae67ce76b441c27035c6a16f70f5a893b608861e1f58934f97aea57d84020592505b6f10000000000000000000000000000000841615614bbc576f88415abbe9a76bead8d00cf112e4d4a86f783eafef1c0a8f3978c7f81824d62ebf84020592505b5050919050565b60006f80000000000000000000000000000000614be08484614d06565b81614be757fe5b059392505050565b600080821215614c0757614c07610982600184614cc5565b6000614c138484614d06565b905060008113614c27576000915050610ea8565b607f1c9392505050565b60200151151590565b60008085614c4c575082905081614c93565b83614c5b575084905083614c93565b614c7e614c6e858763ffffffff613c5616565b61388d888663ffffffff613c5616565b9150614c90858463ffffffff613c5616565b90505b94509492505050565b600080614cba84846f80000000000000000000000000000000614e09565b915091509250929050565b60607fbd79545f00000000000000000000000000000000000000000000000000000000836001811115614cf457fe5b836040516024016120c79291906155ed565b6000821580614d13575081155b15614d2057506000610ea8565b5081810281838281614d2e57fe5b05141580614d45575082828281614d4157fe5b0514155b15610ea857610ea861098260018585614e77565b600081614d6f57614d6f61098260028585614e77565b7f800000000000000000000000000000000000000000000000000000000000000083148015614dbd5750817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff145b15614dd157614dd161098260038585614e77565b818381614be757fe5b60607fed2f26a100000000000000000000000000000000000000000000000000000000836001811115614cf457fe5b60008082851180614e1957508284115b15614e6e57600084861015614e2e5784614e30565b855b9050614e42818563ffffffff613c8716565b9050614e54868263ffffffff613c8716565b9250614e66858263ffffffff613c8716565b91505061303b565b50929391925050565b60607f8c12dfe700000000000000000000000000000000000000000000000000000000846003811115614ea657fe5b848460405160240161342893929190615600565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b60405180606001604052806000815260200160008152602001600081525090565b604080518082019091526000808252602082015290565b81548183558181111561118d5760008381526020902061118d918101908301614f7f565b604051806040016040528060008152602001600081525090565b610b5791905b80821115614f995760008155600101614f85565b5090565b803573ffffffffffffffffffffffffffffffffffffffff81168114610ea857600080fd5b60006040828403121561238a578081fd5b600060208284031215614fe3578081fd5b610ea58383614f9d565b600080600060608486031215615001578182fd5b833561500c81615625565b9250602084013561501c81615625565b929592945050506040919091013590565b6000806040838503121561503f578182fd5b6150498484614f9d565b946020939093013593505050565b60008060408385031215615069578182fd5b6150738484614f9d565b9150602083013561508381615655565b809150509250929050565b60006020828403121561509f578081fd5b8151610ea581615647565b6000602082840312156150bb578081fd5b5035919050565b600080604083850312156150d4578182fd5b82359150602083013561508381615625565b600080604083850312156150f8578182fd5b50508035926020909101359150565b60008060408385031215615119578182fd5b82359150602083013563ffffffff81168114615083578182fd5b600060208284031215615144578081fd5b8135610ea581615655565b600080600060a08486031215615163578283fd5b61516d8585614fc1565b925061517c8560408601614fc1565b9150608084013590509250925092565b60006020828403121561519d578081fd5b5051919050565b600080600080600060a086880312156151bb578283fd5b8535945060208601356151cd81615662565b93506040860135925060608601356151e481615662565b915060808601356151f481615662565b809150509295509295909350565b60008060408385031215615214578182fd5b823561521f81615662565b9150602083013561508381615647565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561531c57835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016152e8565b509095945050505050565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff91909116602083015263ffffffff16604082015260600190565b9182521515602082015260400190565b918252602082015260400190565b606081016004851061539957fe5b938152602081019290925260409091015290565b60408101600384106153bb57fe5b9281526020015290565b604081016153d28461561b565b92815273ffffffffffffffffffffffffffffffffffffffff9190911660209091015290565b606081016154048561561b565b938152602081019290925263ffffffff1660409091015290565b60208082526013908201527f43525f494e54455256414c5f494e56414c494400000000000000000000000000604082015260600190565b60208082526014908201527f574554485f5452414e534645525f4641494c4544000000000000000000000000604082015260600190565b81518152602080830151908201526040918201519181019190915260600190565b815173ffffffffffffffffffffffffffffffffffffffff16815260209182015163ffffffff169181019190915260400190565b815167ffffffffffffffff1681526020808301516bffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b94855263ffffffff938416602086015260408501929092528216606084015216608082015260a00190565b92835260ff918216602084015216604082015260600190565b63ffffffff91909116815260200190565b63ffffffff92831681529116602082015260400190565b60ff91909116815260200190565b60ff929092168252602082015260400190565b60ff9390931683526020830191909152604082015260600190565b60028110610e4c57fe5b73ffffffffffffffffffffffffffffffffffffffff81168114610e4c57600080fd5b8015158114610e4c57600080fd5b60028110610e4c57600080fd5b63ffffffff81168114610e4c57600080fdfea365627a7a72315820352718cf5f2c91e8851fff746b6f2d10f8b5907f32fd611445054d1ea922cbe66c6578706572696d656e74616cf564736f6c634300050c0040" }, "deployedBytecode": { - "object": "0x6080604052600436106103295760003560e01c80638da5cb5b116101a5578063bb7ef7e0116100ec578063e8eeb3f811610095578063f18765321161006f578063f1876532146108bf578063f252b7a1146108df578063f2fde38b146108ff578063ff691b111461091f57610329565b8063e8eeb3f814610875578063e907f0031461088a578063ee99205c146108aa57610329565b8063e0ee036e116100c6578063e0ee036e1461082b578063e1c7392a14610840578063e804d0a41461085557610329565b8063bb7ef7e0146107c9578063c18c9141146107e9578063d39de6e91461080957610329565b8063a694fc3a1161014e578063b3e3337911610128578063b3e3337914610769578063b510879f14610789578063b9181611146107a957610329565b8063a694fc3a1461071f578063b05315241461073f578063b2baa33e1461075457610329565b8063a26171e21161017f578063a26171e2146106e2578063a3b4a327146106f7578063a657e5791461070a57610329565b80638da5cb5b1461068d5780639ad26744146106a25780639c3ccc82146106c257610329565b80634bcc3f6711610274578063624a72321161021d57806370712939116101f757806370712939146106165780637667180814610636578063816667961461064b5780638a2e271a1461066d57610329565b8063624a7232146105cc57806363403801146105e157806368a7d6cd146105f657610329565b80635bd4ab731161024e5780635bd4ab73146105595780635d91121d146105865780635e615a6b146105a657610329565b80634bcc3f67146104f7578063587da0231461052457806358f6c7e31461053957610329565b80633c277fc5116102d657806344a6958b116102b057806344a6958b1461048a57806346b97959146104aa578063494503d4146104d757610329565b80633c277fc51461041b5780633e4ad7321461043d57806342f1181e1461046a57610329565b80632a94c279116103075780632a94c2791461039b5780632e17de78146103ca57806338229d93146103ea57610329565b806301e28d841461032e5780630b9663db146103505780631e7ff8f61461037b575b600080fd5b34801561033a57600080fd5b5061034e610349366004614fc7565b61093f565b005b34801561035c57600080fd5b50610365610a0d565b6040516103729190615327565b60405180910390f35b34801561038757600080fd5b50610365610396366004614fc7565b610b5a565b3480156103a757600080fd5b506103bb6103b63660046150db565b610bf4565b60405161037293929190615514565b3480156103d657600080fd5b5061034e6103e536600461509f565b610c20565b3480156103f657600080fd5b5061040a61040536600461509f565b610dd5565b604051610372959493929190615545565b34801561042757600080fd5b50610430610e04565b6040516103729190615224565b34801561044957600080fd5b5061045d61045836600461509f565b610e1c565b60405161037291906154d5565b34801561047657600080fd5b5061034e610485366004614fc7565b610e3b565b34801561049657600080fd5b5061045d6104a536600461504c565b610e4f565b3480156104b657600080fd5b506104ca6104c536600461509f565b610eae565b6040516103729190615481565b3480156104e357600080fd5b506104306104f236600461509f565b610ef9565b34801561050357600080fd5b5061051761051236600461509f565b610f2d565b60405161037291906154a2565b34801561053057600080fd5b50610365610f8f565b34801561054557600080fd5b5061034e610554366004615144565b610f95565b34801561056557600080fd5b50610579610574366004614fc7565b611192565b604051610372919061531c565b34801561059257600080fd5b5061034e6105a13660046150fc565b6111a7565b3480156105b257600080fd5b506105bb611270565b604051610372959493929190615568565b3480156105d857600080fd5b50610430611299565b3480156105ed57600080fd5b506103656112b1565b34801561060257600080fd5b506103656106113660046151f7565b6112b7565b34801561062257600080fd5b5061034e610631366004614fc7565b6113f0565b34801561064257600080fd5b506103656114a5565b34801561065757600080fd5b506106606114ab565b60405161037291906155ac565b34801561067957600080fd5b5061034e610688366004614fc7565b6114b7565b34801561069957600080fd5b50610430611579565b3480156106ae57600080fd5b5061034e6106bd366004615022565b611595565b3480156106ce57600080fd5b5061034e6106dd366004615199565b6115a7565b3480156106ee57600080fd5b50610365611621565b61034e610705366004614fe2565b611627565b34801561071657600080fd5b50610365611877565b34801561072b57600080fd5b5061034e61073a36600461509f565b61187d565b34801561074b57600080fd5b50610365611992565b34801561076057600080fd5b50610365611998565b34801561077557600080fd5b5061034e61078436600461509f565b6119b6565b34801561079557600080fd5b5061034e6107a436600461509f565b6119f6565b3480156107b557600080fd5b506105796107c4366004614fc7565b611a00565b3480156107d557600080fd5b506103656107e436600461509f565b611a15565b3480156107f557600080fd5b5061036561080436600461509f565b611aa0565b34801561081557600080fd5b5061081e611ab2565b60405161037291906152c3565b34801561083757600080fd5b50610660611b21565b34801561084c57600080fd5b5061034e611b2d565b34801561086157600080fd5b5061045d610870366004615128565b611b47565b34801561088157600080fd5b50610660611c97565b34801561089657600080fd5b506103656108a53660046150b7565b611cab565b3480156108b657600080fd5b50610430611d48565b3480156108cb57600080fd5b506103656108da366004614fc7565b611d64565b3480156108eb57600080fd5b5061045d6108fa366004615022565b611d76565b34801561090b57600080fd5b5061034e61091a366004614fc7565b611db7565b34801561092b57600080fd5b5061034e61093a36600461509f565b611e5a565b610947612087565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff16610987576109876109826001836120aa565b61214c565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517ff50d0d312d501878616eb5e78ebf3ed6dcd3955aaef8165af9c6b057cc4832fb90610a02908390615224565b60405180910390a150565b600c5460009081610a2582600163ffffffff61215416565b6000818152601660205260409020600101549091508015610a4d57610a4d6109828383612173565b610a55612190565b610a5d612203565b600084815260166020526040902055610a74614eaf565b50600083815260166020908152604091829020825160a08101845281548082526001830154938201849052600283015482860181905260038401546060840181905260049094015460808401529451919488947fbb4a26fa0ace13ee4da343896c20eaa44a618fb9071fdd8c2e2c960a4583189d94610af6949193929161552a565b60405180910390a2610b066122a7565b6020810151610b4d57805160405185917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b291610b4491600091615372565b60405180910390a25b6020015193505050505b90565b6000610b64611299565b73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610b9c9190615224565b60206040518083038186803b158015610bb457600080fd5b505afa158015610bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bec9190810190615181565b90505b919050565b601560209081526000928352604080842090915290825290208054600182015460029092015490919083565b33610c29614ede565b73ffffffffffffffffffffffffffffffffffffffff821660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610c76906122ea565b90506000610ca882602001516bffffffffffffffffffffffff1683604001516bffffffffffffffffffffffff16612390565b905080841115610cbf57610cbf61098285836123a6565b73ffffffffffffffffffffffffffffffffffffffff831660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610d0d90856123c3565b610d15611299565b73ffffffffffffffffffffffffffffffffffffffff16639470b0bd84866040518363ffffffff1660e01b8152600401610d4f92919061529d565b600060405180830381600087803b158015610d6957600080fd5b505af1158015610d7d573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd85604051610dc79190615327565b60405180910390a250505050565b601660205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b610e24614ede565b6000828152600760205260409020610bec906122ea565b610e4361244a565b610e4c81612491565b50565b610e57614ede565b610ea560056000846001811115610e6a57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8816825290925290206122ea565b90505b92915050565b610eb6614efe565b506000908152601560209081526040808320600c548452825291829020825160608101845281548152600182015492810192909252600201549181019190915290565b60028181548110610f0657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b610f35614f1f565b506000908152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff169082015290565b600d5481565b3381610fa1575061118d565b6000610fb06020860186615128565b6001811115610fbb57fe5b148015610fdf57506000610fd26020850185615128565b6001811115610fdd57fe5b145b15610fea575061118d565b6001610ff96020860186615128565b600181111561100457fe5b141561101957611019846020013582846125c2565b60016110286020850185615128565b600181111561103357fe5b1415611048576110488360200135828461265b565b600060058161105a6020880188615128565b600181111561106557fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff86168252835290812092509060059082906110af90880188615128565b60018111156110ba57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff87168252909252902090506110fd8282866126f4565b60208086013590870180359073ffffffffffffffffffffffffffffffffffffffff8616907f7d3ad1dcf03b9027064d1d9a474a69e0cecc31324c541d3eb9b5e6fa2f106c8d90889061114f908c615128565b600181111561115a57fe5b61116760208c018c615128565b600181111561117257fe5b60405161118193929190615593565b60405180910390a45050505b505050565b60106020526000908152604090205460ff1681565b816111b1816127ed565b6000838152600a602052604090205474010000000000000000000000000000000000000000900463ffffffff166111e9848285612826565b6000848152600a60205260409081902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff8716021790555184907f8ea2a7a959bd25f226b7b0a4393613f7fdcaa8404e8bad96aa52dc1c1459016790610dc790849087906155bd565b601154601254601354601454929363ffffffff9283169391928281169264010000000090041690565b73ba7f8b5fb1b19c1211c5d49550fcd149177a5eaf90565b60115481565b60085460009033906112d090600163ffffffff61286e16565b600881905591506112e582620f424086612826565b6112ed614f1f565b5060408051808201825273ffffffffffffffffffffffffffffffffffffffff838116825263ffffffff87811660208085019182526000888152600a9091528590208451815492517fffffffffffffffffffffffff00000000000000000000000000000000000000009093169416939093177fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000919092160217905590517fcec6fc86ea644053f6edff1160dfe3fa5c61e7a5ef9f873f145bb03a0bd319e7906113d190859085908990615330565b60405180910390a183156113e8576113e8836119b6565b505092915050565b6113f861244a565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16611431576114316109828261288a565b60005b6002548110156114a1578173ffffffffffffffffffffffffffffffffffffffff166002828154811061146257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415611499576114948282612929565b6114a1565b600101611434565b5050565b600c5481565b60145463ffffffff1681565b6114bf612087565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff16156114fb576114fb6109826000836120aa565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f3e535d1ab441ef41c268fd9b52b478aee02d693c5ca2a84b5d26b89e0922e5e190610a02908390615224565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b61159d61244a565b6114a18282612929565b6115af612087565b6115bc8585858585612b78565b3073ffffffffffffffffffffffffffffffffffffffff1663c6f3a4276040518163ffffffff1660e01b815260040160006040518083038186803b15801561160257600080fd5b505afa158015611616573d6000803e3d6000fd5b505050505050505050565b60135481565b3360009081526010602052604090205460ff1661164a5761164a61098233612c3b565b61165381612c56565b3461172d57611660610e04565b73ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b815260040161169c9392919061526c565b602060405180830381600087803b1580156116b657600080fd5b505af11580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116ee9190810190615083565b61172d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117249061544a565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600960205260409020548061175e575061118d565b600061176982610e1c565b602001516bffffffffffffffffffffffff16905060135481101561178e57505061118d565b600c5460008381526015602090815260408083208484528252808320601690925290912081548061183d576000806117c68888612c77565b6002870182905560018701819055600386015491935091506117ee908263ffffffff61286e16565b60038501556001808501546118089163ffffffff61286e16565b6001850155604051889087907f14b098103235344975b17508c2391721cc9ac3f3fa2b56c7ff46f8480dfd074f90600090a350505b61184d818863ffffffff61286e16565b83556002820154611864908863ffffffff61286e16565b8260020181905550505050505050505050565b60085481565b33611886611299565b73ffffffffffffffffffffffffffffffffffffffff166315cc36f282846040518363ffffffff1660e01b81526004016118c092919061529d565b600060405180830381600087803b1580156118da57600080fd5b505af11580156118ee573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff811660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc602052604090206119409083612d03565b8073ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a836040516119869190615327565b60405180910390a25050565b60175481565b60006119b1601154600d5461286e90919063ffffffff16565b905090565b3360008181526009602052604080822084905551839183917f5640833634fce74eb9211d1209a91dd5a1c8c6a751696bff9323b4db67f815139190a35050565b610e4c8133612d6d565b60016020526000908152604090205460ff1681565b6000611a1f614f1f565b506000828152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611a8385612f45565b91509150611a9683602001518383613002565b5095945050505050565b600b6020526000908152604090205481565b60606002805480602002602001604051908101604052809291908181526020018280548015611b1757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611aec575b5050505050905090565b60125463ffffffff1681565b611b35612087565b611b3d613043565b611b45613056565b565b611b4f614ede565b60016000526004602052611b827fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe056122ea565b90506000826001811115611b9257fe5b1415610bef576000611ba2611299565b73ffffffffffffffffffffffffffffffffffffffff16639706e0c06040518163ffffffff1660e01b815260040160206040518083038186803b158015611be757600080fd5b505afa158015611bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c1f9190810190615181565b9050611c4e611c4983602001516bffffffffffffffffffffffff168361215490919063ffffffff16565b613081565b6bffffffffffffffffffffffff90811660208401526040830151611c7e91611c499184911663ffffffff61215416565b6bffffffffffffffffffffffff16604083015250919050565b601454640100000000900463ffffffff1681565b6000611cb5614f1f565b506000838152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611d1986612f45565b915091506000611d2e84602001518484613002565b915050611d3d878783856130a5565b979650505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60096020526000908152604090205481565b611d7e614ede565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208584529091529020610ea5906122ea565b611dbf61244a565b73ffffffffffffffffffffffffffffffffffffffff8116611dea57611de56109826131f2565b610e4c565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b600c546000611e7082600163ffffffff61215416565b9050611e7a614eaf565b50600081815260166020908152604091829020825160a08101845281548152600182015492810183905260028201549381019390935260038101546060840152600401546080830152611ecf57505050610e4c565b611ed7614efe565b5060008481526015602090815260408083208584528252918290208251606081018452815480825260018301549382019390935260029091015492810192909252611f255750505050610e4c565b6000858152601560209081526040808320868452909152812081815560018101829055600201819055611f588284613229565b9050600080611f6c8884866040015161329e565b9150915087877ff1116b309178aa62dcb6bf8c3b8bc2321724907c7ebf52192d14c8ce3aa9194c8484604051611fa3929190615372565b60405180910390a36000611fbd838363ffffffff61286e16565b6080870151909150611fd5908263ffffffff61286e16565b6080870181905260008881526016602090815260409091206004019190915586015161200890600163ffffffff61215416565b602080880182815260008a8152601690925260409091206001019190915551611616576080860151865188917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b291612066908263ffffffff61215416565b604051612074929190615372565b60405180910390a2505050505050505050565b3360009081526001602052604090205460ff16611b4557611b45610982336133ee565b606063b9588e4360e01b83836040516024016120c79291906153ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b805160208201fd5b60008282111561216d5761216d61098260028585613409565b50900390565b606063614b800a60e01b83836040516024016120c7929190615372565b30318015610e4c576121a0610e04565b73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121e757600080fd5b505af11580156121fb573d6000803e3d6000fd5b505050505050565b60006119b1601754612213610e04565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161224b9190615224565b60206040518083038186803b15801561226357600080fd5b505afa158015612277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061229b9190810190615181565b9063ffffffff61215416565b4260006122b2611998565b9050818111156122c9576122c961098282846134ae565b600c546000906122e090600163ffffffff61286e16565b600c555050600d55565b6122f2614ede565b5060408051606081018252825467ffffffffffffffff81168083526bffffffffffffffffffffffff680100000000000000008304811660208501527401000000000000000000000000000000000000000090920490911692820192909252600c54909181111561238a57612365816134cb565b67ffffffffffffffff16825260408201516bffffffffffffffffffffffff1660208301525b50919050565b600081831061239f5781610ea5565b5090919050565b60606384c8b7c960e01b83836040516024016120c7929190615372565b6123cb614ede565b6123d4836122ea565b90506123fe611c498383604001516bffffffffffffffffffffffff1661215490919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161242d91611c4991168463ffffffff61215416565b6bffffffffffffffffffffffff16602082015261118d83826134eb565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b4557600054611b459061098290339073ffffffffffffffffffffffffffffffffffffffff166135a5565b73ffffffffffffffffffffffffffffffffffffffff81166124b7576124b76109826135c2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16156124f1576124f1610982826135f9565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b6125cb83613614565b6125d58383612d6d565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600660209081526040808320868452909152902061260f908261364b565b6000838152600760205260409020612627908261364b565b6001600052600460205261118d7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe058261364b565b61266483613614565b61266e8383612d6d565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020908152604080832086845290915290206126a890826136a3565b60008381526007602052604090206126c090826136a3565b6001600052600460205261118d7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05826136a3565b6126fe83836136de565b156127085761118d565b612710614ede565b612719846122ea565b9050612723614ede565b61272c846122ea565b905081604001516bffffffffffffffffffffffff16831115612767576127676109828484604001516bffffffffffffffffffffffff166123a6565b604082015161278e90611c49906bffffffffffffffffffffffff168563ffffffff61215416565b6bffffffffffffffffffffffff9081166040808501919091528201516127bf91611c4991168563ffffffff61286e16565b6bffffffffffffffffffffffff1660408201526127dc85836134eb565b6127e684826134eb565b5050505050565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff163381146114a1576114a161098233846136e5565b620f424063ffffffff8216111561284b5761284661098260008584613702565b61118d565b8163ffffffff168163ffffffff16111561118d5761118d61098260018584613702565b600082820183811015610ea557610ea561098260008686613409565b606063eb5108a260e01b826040516024016128a59190615224565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16612962576129626109828361288a565b600254811061297d5761297d61098282600280549050613721565b8173ffffffffffffffffffffffffffffffffffffffff16600282815481106129a157fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614612a0357612a03610982600283815481106129db57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff168461373e565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612a7e57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110612ab157fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190612b309082614f36565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60118590556012805463ffffffff8087167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000092831617909255601385905560148054848416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9487169190931617929092161790556040517f613157dbb0e920deab8ad6ddd3805e87cbf57344b9fe780f1764790ec789754290612c2c9087908790879087908790615568565b60405180910390a15050505050565b606063b56d2df060e01b826040516024016128a59190615224565b803414158015612c6557503415155b15610e4c57610e4c610982823461375b565b6000828152600a602052604081205481908190612caa9073ffffffffffffffffffffffffffffffffffffffff1686611d76565b602001516bffffffffffffffffffffffff169050612cce848263ffffffff61215416565b601254909350612cf990612cec9063ffffffff16620f424086613778565b829063ffffffff61286e16565b9150509250929050565b612d0b614ede565b612d14836122ea565b9050612d3e611c498383604001516bffffffffffffffffffffffff1661286e90919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161242d91611c4991168463ffffffff61286e16565b612d768261379a565b6000612d8583836000806130a5565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208784529091529020909150612dc1906122ea565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600660209081526040808320888452825291829020845181549286015195909301517fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921667ffffffffffffffff909316929092177fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff16680100000000000000006bffffffffffffffffffffffff95861602179092167401000000000000000000000000000000000000000093909216929092021790558015612f3c57612ea6838261380e565b612eae610e04565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401612ee892919061529d565b602060405180830381600087803b158015612f0257600080fd5b505af1158015612f16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f3a9190810190615083565b505b61118d83613856565b6000806000612f606001600c5461215490919063ffffffff16565b9050612f6a614efe565b50600084815260156020908152604080832084845282528083208151606080820184528254825260018084015483870152600293840154838601528787526016865295849020845160a0810186528154815296810154958701959095529184015492850192909252600383015490840152600490910154608083015290612ff2908290613229565b9350806040015192505050915091565b600080826130125783915061303b565b61302663ffffffff8616620f424086613863565b9150613038848363ffffffff61215416565b90505b935093915050565b61304b613899565b42600d556001600c55565b61305e6138ae565b620d2f00620dbba068056bc75e2d63100000600260036127e68585858585612b78565b806bffffffffffffffffffffffff81168114610bef57610bef610982600284613913565b600c546000906130b3614ede565b5073ffffffffffffffffffffffffffffffffffffffff851660009081526006602090815260408083208984528252918290208251606081018452905467ffffffffffffffff81168083526bffffffffffffffffffffffff6801000000000000000083048116948401949094527401000000000000000000000000000000000000000090910490921692810192909252821415613154576000925050506131ea565b61316081838787613930565b81519093506000906131839067ffffffffffffffff16600163ffffffff61286e16565b90506131c16131b48984602001516bffffffffffffffffffffffff16856000015167ffffffffffffffff16856139b3565b859063ffffffff61286e16565b93506131e46131b48984604001516bffffffffffffffffffffffff1684876139b3565b93505050505b949350505050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b815160009061323757610ea8565b8151835160408401516020860151606086015160145461326d95949392919063ffffffff80821691640100000000900416613a4c565b608083015183519192506000916132899163ffffffff61215416565b905081811015613297578091505b5092915050565b6000806132a9614f1f565b506000858152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff1690820181905261330d908686613002565b909350915082156133ca57613320610e04565b81516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff929092169163a9059cbb9161337691879060040161529d565b602060405180830381600087803b15801561339057600080fd5b505af11580156133a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133c89190810190615083565b505b81156133e5576133da8683613b0f565b6133e5868386613b50565b50935093915050565b606063b65a25b960e01b826040516024016128a59190615224565b606063e946c1bb60e01b84848460405160240161342893929190615380565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b606063a6bcde4760e01b83836040516024016120c7929190615372565b8067ffffffffffffffff81168114610bef57610bef610982600184613913565b8051825460408301516020909301516bffffffffffffffffffffffff90811668010000000000000000027fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff91909416740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff9094167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090931692909217929092161716179055565b6060631de45ad160e01b83836040516024016120c7929190615245565b60408051808201909152600481527f57654fe400000000000000000000000000000000000000000000000000000000602082015290565b606063de16f1a060e01b826040516024016128a59190615224565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff16610e4c57610e4c610982826000613c39565b613653614ede565b61365c836122ea565b9050613686611c498383604001516bffffffffffffffffffffffff1661215490919063ffffffff16565b6bffffffffffffffffffffffff16604082015261118d83826134eb565b6136ab614ede565b6136b4836122ea565b9050613686611c498383604001516bffffffffffffffffffffffff1661286e90919063ffffffff16565b1460011690565b60606382ded78560e01b83836040516024016120c792919061529d565b60606322df959760e01b848484604051602401613428939291906153ec565b606063e9f8377160e01b83836040516024016120c7929190615372565b606063140a84db60e01b83836040516024016120c7929190615245565b60606331d7a50560e01b83836040516024016120c7929190615372565b60006131ea8361378e868563ffffffff613c5616565b9063ffffffff613c8716565b600c546000906137b190600163ffffffff61215416565b90506137bb614efe565b50600082815260156020908152604080832084845282529182902082516060810184528154808252600183015493820193909352600290910154928101929092521561118d5761118d6109828484613cb1565b6000828152600b602052604090205461382d908263ffffffff61215416565b6000838152600b602052604090205560175461384f908263ffffffff61215416565b6017555050565b610e4c8160006001613b50565b60006131ea8361378e61387d82600163ffffffff61215416565b61388d888763ffffffff613c5616565b9063ffffffff61286e16565b600d5415611b4557611b456109826000613cce565b601154158015906138c6575060125463ffffffff1615155b80156138d3575060135415155b80156138e6575060145463ffffffff1615155b80156139015750601454640100000000900463ffffffff1615155b15611b4557611b456109826001613cce565b606063c996af7b60e01b83836040516024016120c79291906153a2565b600082158061393d575081155b1561394a575060006131ea565b600061395d85600163ffffffff61215416565b865167ffffffffffffffff16101561397957856040015161397f565b85602001515b6bffffffffffffffffffffffff1690508061399e5760009150506131ea565b6139a9848483613778565b9695505050505050565b60008315806139c157508183145b156139ce575060006131ea565b818310613a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172490615413565b613a0f614f5a565b613a198685613d0d565b9050613a23614f5a565b613a2d8785613d0d565b9050611d3d81600001518260200151846000015185602001518a613e2b565b600080613a598888613eb7565b90506000613a678787613eb7565b9050811580613a74575080155b15613a85575060009150611d3d9050565b600081831315613a9e57613a998284613f09565b613aa8565b613aa88383613f09565b9050613ad1613acc613ab983613f28565b8863ffffffff168863ffffffff166145ca565b6145d9565b905081831315613aea57613ae58282613f09565b613af4565b613af48282614bc3565b9050613b00818c614bef565b9b9a5050505050505050505050565b6000828152600b6020526040902054613b2e908263ffffffff61286e16565b6000838152600b602052604090205560175461384f908263ffffffff61286e16565b6000838152600f6020526040902054600c5480821415613b7157505061118d565b613b79614f5a565b506000858152600e602090815260408083208584528252918290208251808401909352805483526001015490820152613bb0614f5a565b613bb982614c31565b15613bf257613bd2826000015183602001518888614c3a565b60208301819052818352613be69190614c9c565b60208301528152613bfd565b602081018590528581525b6000878152600e6020908152604080832086845282528083208451815593820151600190940193909355978152600f9097529095205550505050565b6060639ae94f0160e01b83836040516024016120c7929190615362565b600082613c6557506000610ea8565b82820282848281613c7257fe5b0414610ea557610ea561098260018686613409565b600081613c9d57613c9d61098260038585613409565b6000828481613ca857fe5b04949350505050565b6060635caa0b0560e01b83836040516024016120c7929190615372565b60607f0b02d77300000000000000000000000000000000000000000000000000000000826001811115613cfd57fe5b6040516024016128a591906155d4565b613d15614f5a565b506000828152600e602090815260408083208484528252918290208251808401909352805483526001015490820152613d4d81614c31565b15613d5757610ea8565b6000613d6a83600163ffffffff61215416565b6000858152600e60209081526040808320848452825291829020825180840190935280548352600101549082015292509050613da582614c31565b15613db05750610ea8565b6000848152600f602052604090205483811015613e0d576000858152600e6020908152604080832084845282529182902082518084019093528054835260010154908201529250613e0083614c31565b15613e0d5750610ea89050565b50506040805180820190915260008152600160208201529392505050565b600081613e3a57506000613eae565b83613e5a57613e538561378e848963ffffffff613c5616565b9050613eae565b6000613e7f613e6f868863ffffffff613c5616565b61229b898763ffffffff613c5616565b90506000613e93828663ffffffff613c8716565b9050613ea98761378e868463ffffffff613c5616565b925050505b95945050505050565b600080831215613ecf57613ecf610982600185614cc5565b6000821215613ee657613ee6610982600184614cc5565b610ea5613f03846f80000000000000000000000000000000614d06565b83614d4e565b6000610ea5613f03846f80000000000000000000000000000000614d06565b60006f80000000000000000000000000000000821315613f5057613f50610982600184614dcf565b60008213613f6657613f66610982600084614dcf565b6f80000000000000000000000000000000821415613f8657506000610bef565b640733048c5a8213613fb957507fffffffffffffffffffffffffffffffe010000000000000000000000000000000610bef565b60008060006a01c8464f761647600000008513614018577ffffffffffffffffffffffffffffffff000000000000000000000000000000000909301926a01c8464f761647600000006f8000000000000000000000000000000086020594505b6cf1aaddd7742e900000000000008513614076577ffffffffffffffffffffffffffffffff800000000000000000000000000000000909301926cf1aaddd7742e900000000000006f8000000000000000000000000000000086020594505b6e0afe10820813d7800000000000000085136140d8577ffffffffffffffffffffffffffffffffc00000000000000000000000000000000909301926e0afe10820813d780000000000000006f8000000000000000000000000000000086020594505b6f02582ab704279ec00000000000000000851361413c577ffffffffffffffffffffffffffffffffe00000000000000000000000000000000909301926f02582ab704279ec000000000000000006f8000000000000000000000000000000086020594505b6f1152aaa3bf81cc00000000000000000085136141a0577fffffffffffffffffffffffffffffffff00000000000000000000000000000000909301926f1152aaa3bf81cc0000000000000000006f8000000000000000000000000000000086020594505b6f2f16ac6c59de700000000000000000008513614204577fffffffffffffffffffffffffffffffff80000000000000000000000000000000909301926f2f16ac6c59de700000000000000000006f8000000000000000000000000000000086020594505b6f4da2cbf1be58280000000000000000008513614268577fffffffffffffffffffffffffffffffffc0000000000000000000000000000000909301926f4da2cbf1be58280000000000000000006f8000000000000000000000000000000086020594505b6f63afbe7ab2082c00000000000000000085136142cc577fffffffffffffffffffffffffffffffffe0000000000000000000000000000000909301926f63afbe7ab2082c0000000000000000006f8000000000000000000000000000000086020594505b6f70f5a893b608861e1f58934f97aea57d8513614330577ffffffffffffffffffffffffffffffffff0000000000000000000000000000000909301926f70f5a893b608861e1f58934f97aea57d6f8000000000000000000000000000000086020594505b7fffffffffffffffffffffffffffffffff80000000000000000000000000000000850192508291506f80000000000000000000000000000000828002059050700100000000000000000000000000000000838103830205840193506f80000000000000000000000000000000818302816143a657fe5b059150700200000000000000000000000000000000836faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa038302816143d757fe5b05840193506f80000000000000000000000000000000818302816143f757fe5b059150700300000000000000000000000000000000836f999999999999999999999999999999990383028161442857fe5b05840193506f800000000000000000000000000000008183028161444857fe5b059150700400000000000000000000000000000000836f924924924924924924924924924924920383028161447957fe5b05840193506f800000000000000000000000000000008183028161449957fe5b059150700500000000000000000000000000000000836f8e38e38e38e38e38e38e38e38e38e38e038302816144ca57fe5b05840193506f80000000000000000000000000000000818302816144ea57fe5b059150700600000000000000000000000000000000836f8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b0383028161451b57fe5b05840193506f800000000000000000000000000000008183028161453b57fe5b059150700700000000000000000000000000000000836f89d89d89d89d89d89d89d89d89d89d890383028161456c57fe5b05840193506f800000000000000000000000000000008183028161458c57fe5b059150700800000000000000000000000000000000836f88888888888888888888888888888888038302816145bd57fe5b0584019350505050919050565b60006131ea613f038585614d06565b60007fffffffffffffffffffffffffffffffe01000000000000000000000000000000082121561460b57506000610bef565b8161462757506f80000000000000000000000000000000610bef565b600082131561463e5761463e610982600184614dcf565b6f800000000000000000000000000000006f1000000000000000000000000000000083078080028290056710e1b3be415a0000810293909301929091818302059050806705a0913f6b1e000002830192506f80000000000000000000000000000000828202816146aa57fe5b05905080670168244fdac7800002830192506f80000000000000000000000000000000828202816146d757fe5b05905080664807432bc1800002830192506f800000000000000000000000000000008282028161470357fe5b05905080660c0135dca0400002830192506f800000000000000000000000000000008282028161472f57fe5b059050806601b707b1cdc00002830192506f800000000000000000000000000000008282028161475b57fe5b059050806536e0f639b80002830192506f800000000000000000000000000000008282028161478657fe5b05905080650618fee9f80002830192506f80000000000000000000000000000000828202816147b157fe5b05905080649c197dcc0002830192506f80000000000000000000000000000000828202816147db57fe5b05905080640e30dce40002830192506f800000000000000000000000000000008282028161480557fe5b0590508064012ebd130002830192506f800000000000000000000000000000008282028161482f57fe5b059050806317499f0002830192506f800000000000000000000000000000008282028161485857fe5b059050806301a9d48002830192506f800000000000000000000000000000008282028161488157fe5b05905080621c638002830192506f80000000000000000000000000000000828202816148a957fe5b059050806201c63802830192506f80000000000000000000000000000000828202816148d157fe5b05905080611ab802830192506f80000000000000000000000000000000828202816148f857fe5b0590508061017c02830192506f800000000000000000000000000000008282028161491f57fe5b05905080601402830192506f800000000000000000000000000000008282028161494557fe5b600095909503946721c3677c82b400009190059384010582016f80000000000000000000000000000000019290507010000000000000000000000000000000008416156149b4577243cbaf42a000812488fc5c220ad7b97bf6e99e6cf1aaddd7742e56d32fb9f9974484020592505b7008000000000000000000000000000000008416156149f6577105d27a9f51c31b7c2f8038212a05747799916e0afe10820813d65dfe6a33c07f738f84020592505b700400000000000000000000000000000000841615614a3857701b4c902e273a58678d6d3bfdb93db96d026f02582ab704279e8efd15e0265855c47a84020592505b700200000000000000000000000000000000841615614a7a577003b1cc971a9bb5b9867477440d6d1577506f1152aaa3bf81cb9fdb76eae12d02957184020592505b700100000000000000000000000000000000841615614abc5770015bf0a8b1457695355fb8ac404e7a79e36f2f16ac6c59de6f8d5d6f63c1482a7c8684020592505b6f80000000000000000000000000000000841615614afc576fd3094c70f034de4b96ff7d5b6f99fcd86f4da2cbf1be5827f9eb3ad1aa9866ebb384020592505b6f40000000000000000000000000000000841615614b3c576fa45af1e1f40c333b3de1db4dd55f29a76f63afbe7ab2082ba1a0ae5e4eb1b479dc84020592505b6f20000000000000000000000000000000841615614b7c576f910b022db7ae67ce76b441c27035c6a16f70f5a893b608861e1f58934f97aea57d84020592505b6f10000000000000000000000000000000841615614bbc576f88415abbe9a76bead8d00cf112e4d4a86f783eafef1c0a8f3978c7f81824d62ebf84020592505b5050919050565b60006f80000000000000000000000000000000614be08484614d06565b81614be757fe5b059392505050565b600080821215614c0757614c07610982600184614cc5565b6000614c138484614d06565b905060008113614c27576000915050610ea8565b607f1c9392505050565b60200151151590565b60008085614c4c575082905081614c93565b83614c5b575084905083614c93565b614c7e614c6e858763ffffffff613c5616565b61388d888663ffffffff613c5616565b9150614c90858463ffffffff613c5616565b90505b94509492505050565b600080614cba84846f80000000000000000000000000000000614dfe565b915091509250929050565b60607fbd79545f00000000000000000000000000000000000000000000000000000000836001811115614cf457fe5b836040516024016120c79291906155e2565b600082614d1557506000610ea8565b5081810281838281614d2357fe5b05141580614d3a575082828281614d3657fe5b0514155b15610ea857610ea861098260018585614e6c565b600081614d6457614d6461098260028585614e6c565b7f800000000000000000000000000000000000000000000000000000000000000083148015614db25750817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff145b15614dc657614dc661098260038585614e6c565b818381614be757fe5b60607fed2f26a100000000000000000000000000000000000000000000000000000000836001811115614cf457fe5b60008082851180614e0e57508284115b15614e6357600084861015614e235784614e25565b855b9050614e37818563ffffffff613c8716565b9050614e49868263ffffffff613c8716565b9250614e5b858263ffffffff613c8716565b91505061303b565b50929391925050565b60607f8c12dfe700000000000000000000000000000000000000000000000000000000846003811115614e9b57fe5b8484604051602401613428939291906155f5565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b60405180606001604052806000815260200160008152602001600081525090565b604080518082019091526000808252602082015290565b81548183558181111561118d5760008381526020902061118d918101908301614f74565b604051806040016040528060008152602001600081525090565b610b5791905b80821115614f8e5760008155600101614f7a565b5090565b803573ffffffffffffffffffffffffffffffffffffffff81168114610ea857600080fd5b60006040828403121561238a578081fd5b600060208284031215614fd8578081fd5b610ea58383614f92565b600080600060608486031215614ff6578182fd5b83356150018161561a565b925060208401356150118161561a565b929592945050506040919091013590565b60008060408385031215615034578182fd5b61503e8484614f92565b946020939093013593505050565b6000806040838503121561505e578182fd5b6150688484614f92565b915060208301356150788161564a565b809150509250929050565b600060208284031215615094578081fd5b8151610ea58161563c565b6000602082840312156150b0578081fd5b5035919050565b600080604083850312156150c9578182fd5b8235915060208301356150788161561a565b600080604083850312156150ed578182fd5b50508035926020909101359150565b6000806040838503121561510e578182fd5b82359150602083013563ffffffff81168114615078578182fd5b600060208284031215615139578081fd5b8135610ea58161564a565b600080600060a08486031215615158578283fd5b6151628585614fb6565b92506151718560408601614fb6565b9150608084013590509250925092565b600060208284031215615192578081fd5b5051919050565b600080600080600060a086880312156151b0578283fd5b8535945060208601356151c281615657565b93506040860135925060608601356151d981615657565b915060808601356151e981615657565b809150509295509295909350565b60008060408385031215615209578182fd5b823561521481615657565b915060208301356150788161563c565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561531157835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016152dd565b509095945050505050565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff91909116602083015263ffffffff16604082015260600190565b9182521515602082015260400190565b918252602082015260400190565b606081016004851061538e57fe5b938152602081019290925260409091015290565b60408101600384106153b057fe5b9281526020015290565b604081016153c784615610565b92815273ffffffffffffffffffffffffffffffffffffffff9190911660209091015290565b606081016153f985615610565b938152602081019290925263ffffffff1660409091015290565b60208082526013908201527f43525f494e54455256414c5f494e56414c494400000000000000000000000000604082015260600190565b60208082526014908201527f574554485f5452414e534645525f4641494c4544000000000000000000000000604082015260600190565b81518152602080830151908201526040918201519181019190915260600190565b815173ffffffffffffffffffffffffffffffffffffffff16815260209182015163ffffffff169181019190915260400190565b815167ffffffffffffffff1681526020808301516bffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b94855263ffffffff938416602086015260408501929092528216606084015216608082015260a00190565b92835260ff918216602084015216604082015260600190565b63ffffffff91909116815260200190565b63ffffffff92831681529116602082015260400190565b60ff91909116815260200190565b60ff929092168252602082015260400190565b60ff9390931683526020830191909152604082015260600190565b60028110610e4c57fe5b73ffffffffffffffffffffffffffffffffffffffff81168114610e4c57600080fd5b8015158114610e4c57600080fd5b60028110610e4c57600080fd5b63ffffffff81168114610e4c57600080fdfea365627a7a723158205024e9d661fc969de54dcf3c94b2f323b81b2f191fbdfed639fa0724cfd2f6a96c6578706572696d656e74616cf564736f6c634300050c0040" + "object": "0x6080604052600436106103295760003560e01c80638da5cb5b116101a5578063bb7ef7e0116100ec578063e8eeb3f811610095578063f18765321161006f578063f1876532146108bf578063f252b7a1146108df578063f2fde38b146108ff578063ff691b111461091f57610329565b8063e8eeb3f814610875578063e907f0031461088a578063ee99205c146108aa57610329565b8063e0ee036e116100c6578063e0ee036e1461082b578063e1c7392a14610840578063e804d0a41461085557610329565b8063bb7ef7e0146107c9578063c18c9141146107e9578063d39de6e91461080957610329565b8063a694fc3a1161014e578063b3e3337911610128578063b3e3337914610769578063b510879f14610789578063b9181611146107a957610329565b8063a694fc3a1461071f578063b05315241461073f578063b2baa33e1461075457610329565b8063a26171e21161017f578063a26171e2146106e2578063a3b4a327146106f7578063a657e5791461070a57610329565b80638da5cb5b1461068d5780639ad26744146106a25780639c3ccc82146106c257610329565b80634bcc3f6711610274578063624a72321161021d57806370712939116101f757806370712939146106165780637667180814610636578063816667961461064b5780638a2e271a1461066d57610329565b8063624a7232146105cc57806363403801146105e157806368a7d6cd146105f657610329565b80635bd4ab731161024e5780635bd4ab73146105595780635d91121d146105865780635e615a6b146105a657610329565b80634bcc3f67146104f7578063587da0231461052457806358f6c7e31461053957610329565b80633c277fc5116102d657806344a6958b116102b057806344a6958b1461048a57806346b97959146104aa578063494503d4146104d757610329565b80633c277fc51461041b5780633e4ad7321461043d57806342f1181e1461046a57610329565b80632a94c279116103075780632a94c2791461039b5780632e17de78146103ca57806338229d93146103ea57610329565b806301e28d841461032e5780630b9663db146103505780631e7ff8f61461037b575b600080fd5b34801561033a57600080fd5b5061034e610349366004614fd2565b61093f565b005b34801561035c57600080fd5b50610365610a0d565b6040516103729190615332565b60405180910390f35b34801561038757600080fd5b50610365610396366004614fd2565b610b5a565b3480156103a757600080fd5b506103bb6103b63660046150e6565b610bf4565b6040516103729392919061551f565b3480156103d657600080fd5b5061034e6103e53660046150aa565b610c20565b3480156103f657600080fd5b5061040a6104053660046150aa565b610dd5565b604051610372959493929190615550565b34801561042757600080fd5b50610430610e04565b604051610372919061522f565b34801561044957600080fd5b5061045d6104583660046150aa565b610e1c565b60405161037291906154e0565b34801561047657600080fd5b5061034e610485366004614fd2565b610e3b565b34801561049657600080fd5b5061045d6104a5366004615057565b610e4f565b3480156104b657600080fd5b506104ca6104c53660046150aa565b610eae565b604051610372919061548c565b3480156104e357600080fd5b506104306104f23660046150aa565b610ef9565b34801561050357600080fd5b506105176105123660046150aa565b610f2d565b60405161037291906154ad565b34801561053057600080fd5b50610365610f8f565b34801561054557600080fd5b5061034e61055436600461514f565b610f95565b34801561056557600080fd5b50610579610574366004614fd2565b611192565b6040516103729190615327565b34801561059257600080fd5b5061034e6105a1366004615107565b6111a7565b3480156105b257600080fd5b506105bb611270565b604051610372959493929190615573565b3480156105d857600080fd5b50610430611299565b3480156105ed57600080fd5b506103656112b1565b34801561060257600080fd5b50610365610611366004615202565b6112b7565b34801561062257600080fd5b5061034e610631366004614fd2565b6113f0565b34801561064257600080fd5b506103656114a5565b34801561065757600080fd5b506106606114ab565b60405161037291906155b7565b34801561067957600080fd5b5061034e610688366004614fd2565b6114b7565b34801561069957600080fd5b50610430611579565b3480156106ae57600080fd5b5061034e6106bd36600461502d565b611595565b3480156106ce57600080fd5b5061034e6106dd3660046151a4565b6115a7565b3480156106ee57600080fd5b50610365611621565b61034e610705366004614fed565b611627565b34801561071657600080fd5b50610365611877565b34801561072b57600080fd5b5061034e61073a3660046150aa565b61187d565b34801561074b57600080fd5b50610365611992565b34801561076057600080fd5b50610365611998565b34801561077557600080fd5b5061034e6107843660046150aa565b6119b6565b34801561079557600080fd5b5061034e6107a43660046150aa565b6119f6565b3480156107b557600080fd5b506105796107c4366004614fd2565b611a00565b3480156107d557600080fd5b506103656107e43660046150aa565b611a15565b3480156107f557600080fd5b506103656108043660046150aa565b611aa0565b34801561081557600080fd5b5061081e611ab2565b60405161037291906152ce565b34801561083757600080fd5b50610660611b21565b34801561084c57600080fd5b5061034e611b2d565b34801561086157600080fd5b5061045d610870366004615133565b611b47565b34801561088157600080fd5b50610660611c97565b34801561089657600080fd5b506103656108a53660046150c2565b611cab565b3480156108b657600080fd5b50610430611d48565b3480156108cb57600080fd5b506103656108da366004614fd2565b611d64565b3480156108eb57600080fd5b5061045d6108fa36600461502d565b611d76565b34801561090b57600080fd5b5061034e61091a366004614fd2565b611db7565b34801561092b57600080fd5b5061034e61093a3660046150aa565b611e5a565b610947612087565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff16610987576109876109826001836120aa565b61214c565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517ff50d0d312d501878616eb5e78ebf3ed6dcd3955aaef8165af9c6b057cc4832fb90610a0290839061522f565b60405180910390a150565b600c5460009081610a2582600163ffffffff61215416565b6000818152601660205260409020600101549091508015610a4d57610a4d6109828383612173565b610a55612190565b610a5d612203565b600084815260166020526040902055610a74614eba565b50600083815260166020908152604091829020825160a08101845281548082526001830154938201849052600283015482860181905260038401546060840181905260049094015460808401529451919488947fbb4a26fa0ace13ee4da343896c20eaa44a618fb9071fdd8c2e2c960a4583189d94610af69491939291615535565b60405180910390a2610b066122a7565b6020810151610b4d57805160405185917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b291610b449160009161537d565b60405180910390a25b6020015193505050505b90565b6000610b64611299565b73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610b9c919061522f565b60206040518083038186803b158015610bb457600080fd5b505afa158015610bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bec919081019061518c565b90505b919050565b601560209081526000928352604080842090915290825290208054600182015460029092015490919083565b33610c29614ee9565b73ffffffffffffffffffffffffffffffffffffffff821660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610c76906122ea565b90506000610ca882602001516bffffffffffffffffffffffff1683604001516bffffffffffffffffffffffff16612390565b905080841115610cbf57610cbf61098285836123a6565b73ffffffffffffffffffffffffffffffffffffffff831660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610d0d90856123c3565b610d15611299565b73ffffffffffffffffffffffffffffffffffffffff16639470b0bd84866040518363ffffffff1660e01b8152600401610d4f9291906152a8565b600060405180830381600087803b158015610d6957600080fd5b505af1158015610d7d573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd85604051610dc79190615332565b60405180910390a250505050565b601660205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b610e24614ee9565b6000828152600760205260409020610bec906122ea565b610e4361244a565b610e4c81612491565b50565b610e57614ee9565b610ea560056000846001811115610e6a57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8816825290925290206122ea565b90505b92915050565b610eb6614f09565b506000908152601560209081526040808320600c548452825291829020825160608101845281548152600182015492810192909252600201549181019190915290565b60028181548110610f0657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b610f35614f2a565b506000908152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff169082015290565b600d5481565b3381610fa1575061118d565b6000610fb06020860186615133565b6001811115610fbb57fe5b148015610fdf57506000610fd26020850185615133565b6001811115610fdd57fe5b145b15610fea575061118d565b6001610ff96020860186615133565b600181111561100457fe5b141561101957611019846020013582846125c2565b60016110286020850185615133565b600181111561103357fe5b1415611048576110488360200135828461265b565b600060058161105a6020880188615133565b600181111561106557fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff86168252835290812092509060059082906110af90880188615133565b60018111156110ba57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff87168252909252902090506110fd8282866126f4565b60208086013590870180359073ffffffffffffffffffffffffffffffffffffffff8616907f7d3ad1dcf03b9027064d1d9a474a69e0cecc31324c541d3eb9b5e6fa2f106c8d90889061114f908c615133565b600181111561115a57fe5b61116760208c018c615133565b600181111561117257fe5b6040516111819392919061559e565b60405180910390a45050505b505050565b60106020526000908152604090205460ff1681565b816111b1816127ed565b6000838152600a602052604090205474010000000000000000000000000000000000000000900463ffffffff166111e9848285612826565b6000848152600a60205260409081902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff8716021790555184907f8ea2a7a959bd25f226b7b0a4393613f7fdcaa8404e8bad96aa52dc1c1459016790610dc790849087906155c8565b601154601254601354601454929363ffffffff9283169391928281169264010000000090041690565b73ba7f8b5fb1b19c1211c5d49550fcd149177a5eaf90565b60115481565b60085460009033906112d090600163ffffffff61286e16565b600881905591506112e582620f424086612826565b6112ed614f2a565b5060408051808201825273ffffffffffffffffffffffffffffffffffffffff838116825263ffffffff87811660208085019182526000888152600a9091528590208451815492517fffffffffffffffffffffffff00000000000000000000000000000000000000009093169416939093177fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000919092160217905590517fcec6fc86ea644053f6edff1160dfe3fa5c61e7a5ef9f873f145bb03a0bd319e7906113d19085908590899061533b565b60405180910390a183156113e8576113e8836119b6565b505092915050565b6113f861244a565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16611431576114316109828261288a565b60005b6002548110156114a1578173ffffffffffffffffffffffffffffffffffffffff166002828154811061146257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415611499576114948282612929565b6114a1565b600101611434565b5050565b600c5481565b60145463ffffffff1681565b6114bf612087565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff16156114fb576114fb6109826000836120aa565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f3e535d1ab441ef41c268fd9b52b478aee02d693c5ca2a84b5d26b89e0922e5e190610a0290839061522f565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b61159d61244a565b6114a18282612929565b6115af612087565b6115bc8585858585612b78565b3073ffffffffffffffffffffffffffffffffffffffff1663c6f3a4276040518163ffffffff1660e01b815260040160006040518083038186803b15801561160257600080fd5b505afa158015611616573d6000803e3d6000fd5b505050505050505050565b60135481565b3360009081526010602052604090205460ff1661164a5761164a61098233612c3b565b61165381612c56565b3461172d57611660610e04565b73ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b815260040161169c93929190615277565b602060405180830381600087803b1580156116b657600080fd5b505af11580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116ee919081019061508e565b61172d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172490615455565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600960205260409020548061175e575061118d565b600061176982610e1c565b602001516bffffffffffffffffffffffff16905060135481101561178e57505061118d565b600c5460008381526015602090815260408083208484528252808320601690925290912081548061183d576000806117c68888612c77565b6002870182905560018701819055600386015491935091506117ee908263ffffffff61286e16565b60038501556001808501546118089163ffffffff61286e16565b6001850155604051889087907f14b098103235344975b17508c2391721cc9ac3f3fa2b56c7ff46f8480dfd074f90600090a350505b61184d818863ffffffff61286e16565b83556002820154611864908863ffffffff61286e16565b8260020181905550505050505050505050565b60085481565b33611886611299565b73ffffffffffffffffffffffffffffffffffffffff166315cc36f282846040518363ffffffff1660e01b81526004016118c09291906152a8565b600060405180830381600087803b1580156118da57600080fd5b505af11580156118ee573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff811660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc602052604090206119409083612d03565b8073ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a836040516119869190615332565b60405180910390a25050565b60175481565b60006119b1601154600d5461286e90919063ffffffff16565b905090565b3360008181526009602052604080822084905551839183917f5640833634fce74eb9211d1209a91dd5a1c8c6a751696bff9323b4db67f815139190a35050565b610e4c8133612d6d565b60016020526000908152604090205460ff1681565b6000611a1f614f2a565b506000828152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611a8385612f45565b91509150611a9683602001518383613002565b5095945050505050565b600b6020526000908152604090205481565b60606002805480602002602001604051908101604052809291908181526020018280548015611b1757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611aec575b5050505050905090565b60125463ffffffff1681565b611b35612087565b611b3d613043565b611b45613056565b565b611b4f614ee9565b60016000526004602052611b827fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe056122ea565b90506000826001811115611b9257fe5b1415610bef576000611ba2611299565b73ffffffffffffffffffffffffffffffffffffffff16639706e0c06040518163ffffffff1660e01b815260040160206040518083038186803b158015611be757600080fd5b505afa158015611bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c1f919081019061518c565b9050611c4e611c4983602001516bffffffffffffffffffffffff168361215490919063ffffffff16565b613081565b6bffffffffffffffffffffffff90811660208401526040830151611c7e91611c499184911663ffffffff61215416565b6bffffffffffffffffffffffff16604083015250919050565b601454640100000000900463ffffffff1681565b6000611cb5614f2a565b506000838152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611d1986612f45565b915091506000611d2e84602001518484613002565b915050611d3d878783856130a5565b979650505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60096020526000908152604090205481565b611d7e614ee9565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208584529091529020610ea5906122ea565b611dbf61244a565b73ffffffffffffffffffffffffffffffffffffffff8116611dea57611de56109826131f2565b610e4c565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b600c546000611e7082600163ffffffff61215416565b9050611e7a614eba565b50600081815260166020908152604091829020825160a08101845281548152600182015492810183905260028201549381019390935260038101546060840152600401546080830152611ecf57505050610e4c565b611ed7614f09565b5060008481526015602090815260408083208584528252918290208251606081018452815480825260018301549382019390935260029091015492810192909252611f255750505050610e4c565b6000858152601560209081526040808320868452909152812081815560018101829055600201819055611f588284613229565b9050600080611f6c8884866040015161329e565b9150915087877ff1116b309178aa62dcb6bf8c3b8bc2321724907c7ebf52192d14c8ce3aa9194c8484604051611fa392919061537d565b60405180910390a36000611fbd838363ffffffff61286e16565b6080870151909150611fd5908263ffffffff61286e16565b6080870181905260008881526016602090815260409091206004019190915586015161200890600163ffffffff61215416565b602080880182815260008a8152601690925260409091206001019190915551611616576080860151865188917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b291612066908263ffffffff61215416565b60405161207492919061537d565b60405180910390a2505050505050505050565b3360009081526001602052604090205460ff16611b4557611b45610982336133ee565b606063b9588e4360e01b83836040516024016120c79291906153c5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b805160208201fd5b60008282111561216d5761216d61098260028585613409565b50900390565b606063614b800a60e01b83836040516024016120c792919061537d565b30318015610e4c576121a0610e04565b73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121e757600080fd5b505af11580156121fb573d6000803e3d6000fd5b505050505050565b60006119b1601754612213610e04565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161224b919061522f565b60206040518083038186803b15801561226357600080fd5b505afa158015612277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061229b919081019061518c565b9063ffffffff61215416565b4260006122b2611998565b9050818111156122c9576122c961098282846134ae565b600c546000906122e090600163ffffffff61286e16565b600c555050600d55565b6122f2614ee9565b5060408051606081018252825467ffffffffffffffff81168083526bffffffffffffffffffffffff680100000000000000008304811660208501527401000000000000000000000000000000000000000090920490911692820192909252600c54909181111561238a57612365816134cb565b67ffffffffffffffff16825260408201516bffffffffffffffffffffffff1660208301525b50919050565b600081831061239f5781610ea5565b5090919050565b60606384c8b7c960e01b83836040516024016120c792919061537d565b6123cb614ee9565b6123d4836122ea565b90506123fe611c498383604001516bffffffffffffffffffffffff1661215490919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161242d91611c4991168463ffffffff61215416565b6bffffffffffffffffffffffff16602082015261118d83826134eb565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b4557600054611b459061098290339073ffffffffffffffffffffffffffffffffffffffff166135a5565b73ffffffffffffffffffffffffffffffffffffffff81166124b7576124b76109826135c2565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16156124f1576124f1610982826135f9565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b6125cb83613614565b6125d58383612d6d565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600660209081526040808320868452909152902061260f908261364b565b6000838152600760205260409020612627908261364b565b6001600052600460205261118d7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe058261364b565b61266483613614565b61266e8383612d6d565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020908152604080832086845290915290206126a890826136a3565b60008381526007602052604090206126c090826136a3565b6001600052600460205261118d7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05826136a3565b6126fe83836136de565b156127085761118d565b612710614ee9565b612719846122ea565b9050612723614ee9565b61272c846122ea565b905081604001516bffffffffffffffffffffffff16831115612767576127676109828484604001516bffffffffffffffffffffffff166123a6565b604082015161278e90611c49906bffffffffffffffffffffffff168563ffffffff61215416565b6bffffffffffffffffffffffff9081166040808501919091528201516127bf91611c4991168563ffffffff61286e16565b6bffffffffffffffffffffffff1660408201526127dc85836134eb565b6127e684826134eb565b5050505050565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff163381146114a1576114a161098233846136e5565b620f424063ffffffff8216111561284b5761284661098260008584613702565b61118d565b8163ffffffff168163ffffffff16111561118d5761118d61098260018584613702565b600082820183811015610ea557610ea561098260008686613409565b606063eb5108a260e01b826040516024016128a5919061522f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16612962576129626109828361288a565b600254811061297d5761297d61098282600280549050613721565b8173ffffffffffffffffffffffffffffffffffffffff16600282815481106129a157fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614612a0357612a03610982600283815481106129db57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff168461373e565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612a7e57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110612ab157fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190612b309082614f41565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60118590556012805463ffffffff8087167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000092831617909255601385905560148054848416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9487169190931617929092161790556040517f613157dbb0e920deab8ad6ddd3805e87cbf57344b9fe780f1764790ec789754290612c2c9087908790879087908790615573565b60405180910390a15050505050565b606063b56d2df060e01b826040516024016128a5919061522f565b803414158015612c6557503415155b15610e4c57610e4c610982823461375b565b6000828152600a602052604081205481908190612caa9073ffffffffffffffffffffffffffffffffffffffff1686611d76565b602001516bffffffffffffffffffffffff169050612cce848263ffffffff61215416565b601254909350612cf990612cec9063ffffffff16620f424086613778565b829063ffffffff61286e16565b9150509250929050565b612d0b614ee9565b612d14836122ea565b9050612d3e611c498383604001516bffffffffffffffffffffffff1661286e90919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161242d91611c4991168463ffffffff61286e16565b612d768261379a565b6000612d8583836000806130a5565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208784529091529020909150612dc1906122ea565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600660209081526040808320888452825291829020845181549286015195909301517fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921667ffffffffffffffff909316929092177fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff16680100000000000000006bffffffffffffffffffffffff95861602179092167401000000000000000000000000000000000000000093909216929092021790558015612f3c57612ea6838261380e565b612eae610e04565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401612ee89291906152a8565b602060405180830381600087803b158015612f0257600080fd5b505af1158015612f16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f3a919081019061508e565b505b61118d83613856565b6000806000612f606001600c5461215490919063ffffffff16565b9050612f6a614f09565b50600084815260156020908152604080832084845282528083208151606080820184528254825260018084015483870152600293840154838601528787526016865295849020845160a0810186528154815296810154958701959095529184015492850192909252600383015490840152600490910154608083015290612ff2908290613229565b9350806040015192505050915091565b600080826130125783915061303b565b61302663ffffffff8616620f424086613863565b9150613038848363ffffffff61215416565b90505b935093915050565b61304b613899565b42600d556001600c55565b61305e6138ae565b620d2f00620dbba068056bc75e2d63100000600260036127e68585858585612b78565b806bffffffffffffffffffffffff81168114610bef57610bef610982600284613913565b600c546000906130b3614ee9565b5073ffffffffffffffffffffffffffffffffffffffff851660009081526006602090815260408083208984528252918290208251606081018452905467ffffffffffffffff81168083526bffffffffffffffffffffffff6801000000000000000083048116948401949094527401000000000000000000000000000000000000000090910490921692810192909252821415613154576000925050506131ea565b61316081838787613930565b81519093506000906131839067ffffffffffffffff16600163ffffffff61286e16565b90506131c16131b48984602001516bffffffffffffffffffffffff16856000015167ffffffffffffffff16856139b3565b859063ffffffff61286e16565b93506131e46131b48984604001516bffffffffffffffffffffffff1684876139b3565b93505050505b949350505050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b815160009061323757610ea8565b8151835160408401516020860151606086015160145461326d95949392919063ffffffff80821691640100000000900416613a4c565b608083015183519192506000916132899163ffffffff61215416565b905081811015613297578091505b5092915050565b6000806132a9614f2a565b506000858152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff1690820181905261330d908686613002565b909350915082156133ca57613320610e04565b81516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff929092169163a9059cbb916133769187906004016152a8565b602060405180830381600087803b15801561339057600080fd5b505af11580156133a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133c8919081019061508e565b505b81156133e5576133da8683613b0f565b6133e5868386613b50565b50935093915050565b606063b65a25b960e01b826040516024016128a5919061522f565b606063e946c1bb60e01b8484846040516024016134289392919061538b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b606063a6bcde4760e01b83836040516024016120c792919061537d565b8067ffffffffffffffff81168114610bef57610bef610982600184613913565b8051825460408301516020909301516bffffffffffffffffffffffff90811668010000000000000000027fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff91909416740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff9094167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090931692909217929092161716179055565b6060631de45ad160e01b83836040516024016120c7929190615250565b60408051808201909152600481527f57654fe400000000000000000000000000000000000000000000000000000000602082015290565b606063de16f1a060e01b826040516024016128a5919061522f565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff16610e4c57610e4c610982826000613c39565b613653614ee9565b61365c836122ea565b9050613686611c498383604001516bffffffffffffffffffffffff1661215490919063ffffffff16565b6bffffffffffffffffffffffff16604082015261118d83826134eb565b6136ab614ee9565b6136b4836122ea565b9050613686611c498383604001516bffffffffffffffffffffffff1661286e90919063ffffffff16565b1460011690565b60606382ded78560e01b83836040516024016120c79291906152a8565b60606322df959760e01b848484604051602401613428939291906153f7565b606063e9f8377160e01b83836040516024016120c792919061537d565b606063140a84db60e01b83836040516024016120c7929190615250565b60606331d7a50560e01b83836040516024016120c792919061537d565b60006131ea8361378e868563ffffffff613c5616565b9063ffffffff613c8716565b600c546000906137b190600163ffffffff61215416565b90506137bb614f09565b50600082815260156020908152604080832084845282529182902082516060810184528154808252600183015493820193909352600290910154928101929092521561118d5761118d6109828484613cb1565b6000828152600b602052604090205461382d908263ffffffff61215416565b6000838152600b602052604090205560175461384f908263ffffffff61215416565b6017555050565b610e4c8160006001613b50565b60006131ea8361378e61387d82600163ffffffff61215416565b61388d888763ffffffff613c5616565b9063ffffffff61286e16565b600d5415611b4557611b456109826000613cce565b601154158015906138c6575060125463ffffffff1615155b80156138d3575060135415155b80156138e6575060145463ffffffff1615155b80156139015750601454640100000000900463ffffffff1615155b15611b4557611b456109826001613cce565b606063c996af7b60e01b83836040516024016120c79291906153ad565b600082158061393d575081155b1561394a575060006131ea565b600061395d85600163ffffffff61215416565b865167ffffffffffffffff16101561397957856040015161397f565b85602001515b6bffffffffffffffffffffffff1690508061399e5760009150506131ea565b6139a9848483613778565b9695505050505050565b60008315806139c157508183145b156139ce575060006131ea565b818310613a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117249061541e565b613a0f614f65565b613a198685613d0d565b9050613a23614f65565b613a2d8785613d0d565b9050611d3d81600001518260200151846000015185602001518a613e2b565b600080613a598888613eb7565b90506000613a678787613eb7565b9050811580613a74575080155b15613a85575060009150611d3d9050565b600081831315613a9e57613a998284613f09565b613aa8565b613aa88383613f09565b9050613ad1613acc613ab983613f28565b8863ffffffff168863ffffffff166145ca565b6145d9565b905081831315613aea57613ae58282613f09565b613af4565b613af48282614bc3565b9050613b00818c614bef565b9b9a5050505050505050505050565b6000828152600b6020526040902054613b2e908263ffffffff61286e16565b6000838152600b602052604090205560175461384f908263ffffffff61286e16565b6000838152600f6020526040902054600c5480821415613b7157505061118d565b613b79614f65565b506000858152600e602090815260408083208584528252918290208251808401909352805483526001015490820152613bb0614f65565b613bb982614c31565b15613bf257613bd2826000015183602001518888614c3a565b60208301819052818352613be69190614c9c565b60208301528152613bfd565b602081018590528581525b6000878152600e6020908152604080832086845282528083208451815593820151600190940193909355978152600f9097529095205550505050565b6060639ae94f0160e01b83836040516024016120c792919061536d565b600082613c6557506000610ea8565b82820282848281613c7257fe5b0414610ea557610ea561098260018686613409565b600081613c9d57613c9d61098260038585613409565b6000828481613ca857fe5b04949350505050565b6060635caa0b0560e01b83836040516024016120c792919061537d565b60607f0b02d77300000000000000000000000000000000000000000000000000000000826001811115613cfd57fe5b6040516024016128a591906155df565b613d15614f65565b506000828152600e602090815260408083208484528252918290208251808401909352805483526001015490820152613d4d81614c31565b15613d5757610ea8565b6000613d6a83600163ffffffff61215416565b6000858152600e60209081526040808320848452825291829020825180840190935280548352600101549082015292509050613da582614c31565b15613db05750610ea8565b6000848152600f602052604090205483811015613e0d576000858152600e6020908152604080832084845282529182902082518084019093528054835260010154908201529250613e0083614c31565b15613e0d5750610ea89050565b50506040805180820190915260008152600160208201529392505050565b600081613e3a57506000613eae565b83613e5a57613e538561378e848963ffffffff613c5616565b9050613eae565b6000613e7f613e6f868863ffffffff613c5616565b61229b898763ffffffff613c5616565b90506000613e93828663ffffffff613c8716565b9050613ea98761378e868463ffffffff613c5616565b925050505b95945050505050565b600080831215613ecf57613ecf610982600185614cc5565b6000821215613ee657613ee6610982600184614cc5565b610ea5613f03846f80000000000000000000000000000000614d06565b83614d59565b6000610ea5613f03846f80000000000000000000000000000000614d06565b60006f80000000000000000000000000000000821315613f5057613f50610982600184614dda565b60008213613f6657613f66610982600084614dda565b6f80000000000000000000000000000000821415613f8657506000610bef565b640733048c5a8213613fb957507fffffffffffffffffffffffffffffffe010000000000000000000000000000000610bef565b60008060006a01c8464f761647600000008513614018577ffffffffffffffffffffffffffffffff000000000000000000000000000000000909301926a01c8464f761647600000006f8000000000000000000000000000000086020594505b6cf1aaddd7742e900000000000008513614076577ffffffffffffffffffffffffffffffff800000000000000000000000000000000909301926cf1aaddd7742e900000000000006f8000000000000000000000000000000086020594505b6e0afe10820813d7800000000000000085136140d8577ffffffffffffffffffffffffffffffffc00000000000000000000000000000000909301926e0afe10820813d780000000000000006f8000000000000000000000000000000086020594505b6f02582ab704279ec00000000000000000851361413c577ffffffffffffffffffffffffffffffffe00000000000000000000000000000000909301926f02582ab704279ec000000000000000006f8000000000000000000000000000000086020594505b6f1152aaa3bf81cc00000000000000000085136141a0577fffffffffffffffffffffffffffffffff00000000000000000000000000000000909301926f1152aaa3bf81cc0000000000000000006f8000000000000000000000000000000086020594505b6f2f16ac6c59de700000000000000000008513614204577fffffffffffffffffffffffffffffffff80000000000000000000000000000000909301926f2f16ac6c59de700000000000000000006f8000000000000000000000000000000086020594505b6f4da2cbf1be58280000000000000000008513614268577fffffffffffffffffffffffffffffffffc0000000000000000000000000000000909301926f4da2cbf1be58280000000000000000006f8000000000000000000000000000000086020594505b6f63afbe7ab2082c00000000000000000085136142cc577fffffffffffffffffffffffffffffffffe0000000000000000000000000000000909301926f63afbe7ab2082c0000000000000000006f8000000000000000000000000000000086020594505b6f70f5a893b608861e1f58934f97aea57d8513614330577ffffffffffffffffffffffffffffffffff0000000000000000000000000000000909301926f70f5a893b608861e1f58934f97aea57d6f8000000000000000000000000000000086020594505b7fffffffffffffffffffffffffffffffff80000000000000000000000000000000850192508291506f80000000000000000000000000000000828002059050700100000000000000000000000000000000838103830205840193506f80000000000000000000000000000000818302816143a657fe5b059150700200000000000000000000000000000000836faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa038302816143d757fe5b05840193506f80000000000000000000000000000000818302816143f757fe5b059150700300000000000000000000000000000000836f999999999999999999999999999999990383028161442857fe5b05840193506f800000000000000000000000000000008183028161444857fe5b059150700400000000000000000000000000000000836f924924924924924924924924924924920383028161447957fe5b05840193506f800000000000000000000000000000008183028161449957fe5b059150700500000000000000000000000000000000836f8e38e38e38e38e38e38e38e38e38e38e038302816144ca57fe5b05840193506f80000000000000000000000000000000818302816144ea57fe5b059150700600000000000000000000000000000000836f8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b0383028161451b57fe5b05840193506f800000000000000000000000000000008183028161453b57fe5b059150700700000000000000000000000000000000836f89d89d89d89d89d89d89d89d89d89d890383028161456c57fe5b05840193506f800000000000000000000000000000008183028161458c57fe5b059150700800000000000000000000000000000000836f88888888888888888888888888888888038302816145bd57fe5b0584019350505050919050565b60006131ea613f038585614d06565b60007fffffffffffffffffffffffffffffffe01000000000000000000000000000000082121561460b57506000610bef565b8161462757506f80000000000000000000000000000000610bef565b600082131561463e5761463e610982600184614dda565b6f800000000000000000000000000000006f1000000000000000000000000000000083078080028290056710e1b3be415a0000810293909301929091818302059050806705a0913f6b1e000002830192506f80000000000000000000000000000000828202816146aa57fe5b05905080670168244fdac7800002830192506f80000000000000000000000000000000828202816146d757fe5b05905080664807432bc1800002830192506f800000000000000000000000000000008282028161470357fe5b05905080660c0135dca0400002830192506f800000000000000000000000000000008282028161472f57fe5b059050806601b707b1cdc00002830192506f800000000000000000000000000000008282028161475b57fe5b059050806536e0f639b80002830192506f800000000000000000000000000000008282028161478657fe5b05905080650618fee9f80002830192506f80000000000000000000000000000000828202816147b157fe5b05905080649c197dcc0002830192506f80000000000000000000000000000000828202816147db57fe5b05905080640e30dce40002830192506f800000000000000000000000000000008282028161480557fe5b0590508064012ebd130002830192506f800000000000000000000000000000008282028161482f57fe5b059050806317499f0002830192506f800000000000000000000000000000008282028161485857fe5b059050806301a9d48002830192506f800000000000000000000000000000008282028161488157fe5b05905080621c638002830192506f80000000000000000000000000000000828202816148a957fe5b059050806201c63802830192506f80000000000000000000000000000000828202816148d157fe5b05905080611ab802830192506f80000000000000000000000000000000828202816148f857fe5b0590508061017c02830192506f800000000000000000000000000000008282028161491f57fe5b05905080601402830192506f800000000000000000000000000000008282028161494557fe5b600095909503946721c3677c82b400009190059384010582016f80000000000000000000000000000000019290507010000000000000000000000000000000008416156149b4577243cbaf42a000812488fc5c220ad7b97bf6e99e6cf1aaddd7742e56d32fb9f9974484020592505b7008000000000000000000000000000000008416156149f6577105d27a9f51c31b7c2f8038212a05747799916e0afe10820813d65dfe6a33c07f738f84020592505b700400000000000000000000000000000000841615614a3857701b4c902e273a58678d6d3bfdb93db96d026f02582ab704279e8efd15e0265855c47a84020592505b700200000000000000000000000000000000841615614a7a577003b1cc971a9bb5b9867477440d6d1577506f1152aaa3bf81cb9fdb76eae12d02957184020592505b700100000000000000000000000000000000841615614abc5770015bf0a8b1457695355fb8ac404e7a79e36f2f16ac6c59de6f8d5d6f63c1482a7c8684020592505b6f80000000000000000000000000000000841615614afc576fd3094c70f034de4b96ff7d5b6f99fcd86f4da2cbf1be5827f9eb3ad1aa9866ebb384020592505b6f40000000000000000000000000000000841615614b3c576fa45af1e1f40c333b3de1db4dd55f29a76f63afbe7ab2082ba1a0ae5e4eb1b479dc84020592505b6f20000000000000000000000000000000841615614b7c576f910b022db7ae67ce76b441c27035c6a16f70f5a893b608861e1f58934f97aea57d84020592505b6f10000000000000000000000000000000841615614bbc576f88415abbe9a76bead8d00cf112e4d4a86f783eafef1c0a8f3978c7f81824d62ebf84020592505b5050919050565b60006f80000000000000000000000000000000614be08484614d06565b81614be757fe5b059392505050565b600080821215614c0757614c07610982600184614cc5565b6000614c138484614d06565b905060008113614c27576000915050610ea8565b607f1c9392505050565b60200151151590565b60008085614c4c575082905081614c93565b83614c5b575084905083614c93565b614c7e614c6e858763ffffffff613c5616565b61388d888663ffffffff613c5616565b9150614c90858463ffffffff613c5616565b90505b94509492505050565b600080614cba84846f80000000000000000000000000000000614e09565b915091509250929050565b60607fbd79545f00000000000000000000000000000000000000000000000000000000836001811115614cf457fe5b836040516024016120c79291906155ed565b6000821580614d13575081155b15614d2057506000610ea8565b5081810281838281614d2e57fe5b05141580614d45575082828281614d4157fe5b0514155b15610ea857610ea861098260018585614e77565b600081614d6f57614d6f61098260028585614e77565b7f800000000000000000000000000000000000000000000000000000000000000083148015614dbd5750817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff145b15614dd157614dd161098260038585614e77565b818381614be757fe5b60607fed2f26a100000000000000000000000000000000000000000000000000000000836001811115614cf457fe5b60008082851180614e1957508284115b15614e6e57600084861015614e2e5784614e30565b855b9050614e42818563ffffffff613c8716565b9050614e54868263ffffffff613c8716565b9250614e66858263ffffffff613c8716565b91505061303b565b50929391925050565b60607f8c12dfe700000000000000000000000000000000000000000000000000000000846003811115614ea657fe5b848460405160240161342893929190615600565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b60405180606001604052806000815260200160008152602001600081525090565b604080518082019091526000808252602082015290565b81548183558181111561118d5760008381526020902061118d918101908301614f7f565b604051806040016040528060008152602001600081525090565b610b5791905b80821115614f995760008155600101614f85565b5090565b803573ffffffffffffffffffffffffffffffffffffffff81168114610ea857600080fd5b60006040828403121561238a578081fd5b600060208284031215614fe3578081fd5b610ea58383614f9d565b600080600060608486031215615001578182fd5b833561500c81615625565b9250602084013561501c81615625565b929592945050506040919091013590565b6000806040838503121561503f578182fd5b6150498484614f9d565b946020939093013593505050565b60008060408385031215615069578182fd5b6150738484614f9d565b9150602083013561508381615655565b809150509250929050565b60006020828403121561509f578081fd5b8151610ea581615647565b6000602082840312156150bb578081fd5b5035919050565b600080604083850312156150d4578182fd5b82359150602083013561508381615625565b600080604083850312156150f8578182fd5b50508035926020909101359150565b60008060408385031215615119578182fd5b82359150602083013563ffffffff81168114615083578182fd5b600060208284031215615144578081fd5b8135610ea581615655565b600080600060a08486031215615163578283fd5b61516d8585614fc1565b925061517c8560408601614fc1565b9150608084013590509250925092565b60006020828403121561519d578081fd5b5051919050565b600080600080600060a086880312156151bb578283fd5b8535945060208601356151cd81615662565b93506040860135925060608601356151e481615662565b915060808601356151f481615662565b809150509295509295909350565b60008060408385031215615214578182fd5b823561521f81615662565b9150602083013561508381615647565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561531c57835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016152e8565b509095945050505050565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff91909116602083015263ffffffff16604082015260600190565b9182521515602082015260400190565b918252602082015260400190565b606081016004851061539957fe5b938152602081019290925260409091015290565b60408101600384106153bb57fe5b9281526020015290565b604081016153d28461561b565b92815273ffffffffffffffffffffffffffffffffffffffff9190911660209091015290565b606081016154048561561b565b938152602081019290925263ffffffff1660409091015290565b60208082526013908201527f43525f494e54455256414c5f494e56414c494400000000000000000000000000604082015260600190565b60208082526014908201527f574554485f5452414e534645525f4641494c4544000000000000000000000000604082015260600190565b81518152602080830151908201526040918201519181019190915260600190565b815173ffffffffffffffffffffffffffffffffffffffff16815260209182015163ffffffff169181019190915260400190565b815167ffffffffffffffff1681526020808301516bffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b94855263ffffffff938416602086015260408501929092528216606084015216608082015260a00190565b92835260ff918216602084015216604082015260600190565b63ffffffff91909116815260200190565b63ffffffff92831681529116602082015260400190565b60ff91909116815260200190565b60ff929092168252602082015260400190565b60ff9390931683526020830191909152604082015260600190565b60028110610e4c57fe5b73ffffffffffffffffffffffffffffffffffffffff81168114610e4c57600080fd5b8015158114610e4c57600080fd5b60028110610e4c57600080fd5b63ffffffff81168114610e4c57600080fdfea365627a7a72315820352718cf5f2c91e8851fff746b6f2d10f8b5907f32fd611445054d1ea922cbe66c6578706572696d656e74616cf564736f6c634300050c0040" } } }, diff --git a/packages/contract-wrappers/src/generated-wrappers/coordinator.ts b/packages/contract-wrappers/src/generated-wrappers/coordinator.ts index 048fcfc7aa..c7966e94ca 100644 --- a/packages/contract-wrappers/src/generated-wrappers/coordinator.ts +++ b/packages/contract-wrappers/src/generated-wrappers/coordinator.ts @@ -34,6 +34,7 @@ import * as ethers from 'ethers'; // tslint:enable:no-unused-variable /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class CoordinatorContract extends BaseContract { diff --git a/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts b/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts index 1346b79e5c..78c2c7d07c 100644 --- a/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts +++ b/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts @@ -34,6 +34,7 @@ import * as ethers from 'ethers'; // tslint:enable:no-unused-variable /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class DevUtilsContract extends BaseContract { @@ -41,7 +42,7 @@ export class DevUtilsContract extends BaseContract { * @ignore */ public static deployedBytecode = - '0x608060405234801561001057600080fd5b50600436106102f45760003560e01c80639a7e752611610191578063ca49f47c116100e3578063d3d862d111610097578063e4e6e7da11610071578063e4e6e7da1461077e578063e77286eb1461079f578063ee4f5a94146107c1576102f4565b8063d3d862d114610729578063d46950281461073c578063e25cabf71461075c576102f4565b8063d001c5dc116100c8578063d001c5dc146106f0578063d186037f14610703578063d363790514610716576102f4565b8063ca49f47c146106ac578063cafd3a07146106cf576102f4565b8063a6627e9f11610145578063bbb2dcf61161011f578063bbb2dcf614610661578063bc03f96414610683578063c26cfecd146106a4576102f4565b8063a6627e9f14610618578063acaedc741461062b578063b43cffe11461064e576102f4565b8063a070cac811610176578063a070cac8146105d2578063a0901e51146105e5578063a5cd62ba146105f8576102f4565b80639a7e75261461058b5780639eadc835146105ae576102f4565b80634dfdac201161024a5780637914b2ec116101fe5780637b66ad34116101d85780637b66ad34146105445780637d727512146105655780638f4ce47914610578576102f4565b80637914b2ec146104f05780637982653e1461051157806379c9c42614610531576102f4565b806363eb39921161022f57806363eb39921461049857806365129042146104ab578063750bdb30146104cd576102f4565b80634dfdac2014610458578063590aa87514610478576102f4565b8063314853ff116102ac5780633db6dc61116102865780633db6dc61146103ff578063459be5e21461042257806346eb65cb14610443576102f4565b8063314853ff146103a8578063327d3054146103ca57806332aae3ad146103dd576102f4565b80630d7b7d76116102dd5780630d7b7d7614610345578063165979e1146103665780632322cf7614610388576102f4565b806302d0aec3146102f957806304a5618a14610323575b600080fd5b61030c610307366004614a21565b6107e3565b60405161031a92919061535e565b60405180910390f35b610336610331366004614a21565b61083f565b60405161031a93929190615488565b610358610353366004614603565b6108ba565b60405161031a92919061530c565b610379610374366004614a21565b6108dc565b60405161031a939291906155c3565b61039b610396366004614603565b610939565b60405161031a91906152c9565b6103bb6103b6366004614a21565b610961565b60405161031a93929190615333565b6103586103d8366004614a21565b6109a8565b6103f06103eb366004614a21565b6109ea565b60405161031a93929190615539565b61041261040d366004614a21565b610a3d565b60405161031a94939291906152d2565b610435610430366004614a21565b610a87565b60405161031a9291906155ac565b610456610451366004614a21565b610add565b005b61046b61046636600461452a565b610c5f565b60405161031a9190615263565b61048b610486366004614341565b610ce2565b60405161031a91906154e8565b61048b6104a6366004614647565b610d52565b6104be6104b9366004614a21565b610dc8565b60405161031a9392919061502f565b6104e06104db366004614a21565b610e02565b60405161031a94939291906153b3565b6105036104fe366004614a21565b610e99565b60405161031a929190615390565b61052461051f366004614ab8565b610ed1565b60405161031a91906155de565b61039b61053f366004614bc0565b61118c565b610557610552366004614a21565b611215565b60405161031a929190615015565b61039b610573366004614603565b61124d565b610503610586366004614a21565b6118a4565b61059e610599366004614a21565b61191a565b60405161031a94939291906155f2565b6105c16105bc366004614a21565b61197b565b60405161031a9594939291906153ef565b61039b6105e0366004614b67565b611a0c565b61046b6105f33660046146c9565b611a8d565b61060b6106063660046146fc565b611b06565b60405161031a919061517b565b61048b61062636600461469e565b611bc9565b61063e610639366004614a21565b611c22565b60405161031a94939291906150d7565b61048b61065c366004614578565b611c5e565b61067461066f366004614a21565b611cd6565b60405161031a939291906154b3565b610696610691366004614a21565b611d50565b60405161031a92919061531a565b61039b611d89565b6106bf6106ba366004614a21565b611d8f565b60405161031a9493929190615445565b6106e26106dd366004614a21565b611e19565b60405161031a929190615629565b61046b6106fe36600461452a565b611e67565b61039b610711366004614603565b611ed5565b610524610724366004614ab8565b6126c7565b61048b6107373660046147cd565b612a77565b61074f61074a366004614a21565b612a96565b60405161031a919061537b565b61076f61076a366004614776565b612b91565b60405161031a939291906151c8565b61079161078c36600461452a565b612cc9565b60405161031a9291906152a4565b6107b26107ad366004614b10565b612ce2565b60405161031a939291906156db565b6107d46107cf366004614a21565b612fa4565b60405161031a93929190615582565b6000806107f7836107f2612fe1565b613005565b600061081060048551866130459092919063ffffffff16565b80602001905161082391908101906149d4565b909350905060ff8116600681111561083757fe5b915050915091565b60008080610853848263ffffffff61308816565b92506001600160e01b0319831663012b8bc960e11b1461088e5760405162461bcd60e51b8152600401610885906156a4565b60405180910390fd5b61089f84601063ffffffff6130bc16565b91506108b284602463ffffffff6130ef16565b929491935050565b6000806108c7848461124d565b91506108d38484611ed5565b90509250929050565b60008060006108ed846107f26130fb565b600061090660048651876130459092919063ffffffff16565b8060200190516109199190810190614d92565b9094509250905060ff8116600281111561092f57fe5b9350509193909250565b600080600061094885856108ba565b91509150610956828261311f565b925050505b92915050565b6000606080610972846107f2613135565b835161098890859060049063ffffffff61304516565b80602001905161099b9190810190614974565b9196909550909350915050565b6000806109b7836107f2613159565b82516109cd90849060049063ffffffff61304516565b8060200190516109e09190810190614916565b9094909350915050565b60008060606109fb846107f261317d565b6000610a1460048651876130459092919063ffffffff16565b806020019051610a279190810190614d52565b9094509250905060ff8116600181111561092f57fe5b600080606080610a4f856107f26131a1565b8451610a6590869060049063ffffffff61304516565b806020019051610a7891908101906148d2565b92989197509550909350915050565b600080610a96836107f26131c5565b6000610aaf60048551866130459092919063ffffffff16565b806020019051610ac29190810190614c90565b9250905060ff81166003811115610ad557fe5b925050915091565b6000610aef828263ffffffff61308816565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415610b3357610b2c826118a4565b5050610c5b565b6001600160e01b0319811663012b8bc960e11b1415610b5d57610b558261083f565b505050610c5b565b6001600160e01b031981167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415610ba257610b988261197b565b5050505050610c5b565b6001600160e01b031981166394cfcdd760e01b1415610bc457610b5582611cd6565b6001600160e01b031981167fc339d10a000000000000000000000000000000000000000000000000000000001415610c0857610bff82611d8f565b50505050610c5b565b6001600160e01b031981167fdc1600f3000000000000000000000000000000000000000000000000000000001415610c4357610bff82610e02565b60405162461bcd60e51b8152600401610885906156a4565b5050565b606060008251905080604051908082528060200260200182016040528015610c91578160200160208202803883390190505b50915060005b818114610cda57610cbb85858381518110610cae57fe5b6020026020010151611ed5565b838281518110610cc757fe5b6020908102919091010152600101610c97565b505092915050565b6040516060907ff47261b00000000000000000000000000000000000000000000000000000000090610d18908490602401615001565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b919050565b6040516060907fc339d10a0000000000000000000000000000000000000000000000000000000090610d8c908690869086906024016150a5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b9392505050565b6000806000610dd9846107f26131e9565b8351610def90859060049063ffffffff61304516565b80602001905161099b91908101906143f8565b600080806060610e18858363ffffffff61308816565b93506001600160e01b031984167fdc1600f30000000000000000000000000000000000000000000000000000000014610e635760405162461bcd60e51b8152600401610885906156a4565b8451610e7990869060049063ffffffff61320d16565b806020019051610e8c9190810190614396565b9597919650949350915050565b600080610ea8836107f261328d565b8251610ebe90849060049063ffffffff61304516565b8060200190516109e091908101906149f8565b6000610edb613f0c565b610f6c8584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b505afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f669190810190614c78565b3a6132b1565b60408051600280825260608281019093529293509091816020015b6060815260200190600190039081610f8757505060408051600280825260608083018452939450909160208301908038833950506040805160028082526060808301845294955090925090602083019080388339505060408051600280825260608083018452949550909250906020830190803883390190505090508861014001518460008151811061101657fe5b602002602001018190525088600001518360008151811061103357fe5b6001600160a01b039283166020918202929092010152881615611056578761106c565b73377f698c4c287018d09b516f415317aec59193325b8260008151811061107957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460000151816000815181106110ab57fe5b602002602001018181525050886101800151846001815181106110ca57fe5b60200260200101819052508860000151836001815181106110e757fe5b6001600160a01b03928316602091820292909201015260408a01511615611112578860400151611128565b73377f698c4c287018d09b516f415317aec59193325b8260018151811061113557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160018151811061116757fe5b60200260200101818152505061117f84848484613328565b9998505050505050505050565b600061120d846112086040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876134e6565b61353d565b949350505050565b600080611224836107f2613551565b825161123a90849060049063ffffffff61304516565b8060200190516109e0919081019061435d565b600080611260838263ffffffff61308816565b90506001600160e01b031981167ff47261b00000000000000000000000000000000000000000000000000000000014156112bb5760006112a784601063ffffffff6130bc16565b90506112b38186613575565b92505061189d565b6001600160e01b0319811663012b8bc960e11b1415611413576000806112e08561083f565b6040519194509250606091507f6352211e000000000000000000000000000000000000000000000000000000009061131c9084906024016152c9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b03168360405161136d9190614fe5565b600060405180830381855afa9150503d80600081146113a8576040519150601f19603f3d011682016040523d82523d6000602084013e6113ad565b606091505b509150915060008280156113c2575081516020145b6113cd5760006113de565b6113de82600c63ffffffff6130bc16565b9050896001600160a01b0316816001600160a01b031614611400576000611403565b60015b60ff16975050505050505061189d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156116035760006060806114538661197b565b5081519296509094509250905060005b8181146115f95782818151811061147657fe5b60200260200101516000141561148b576115f1565b83516060907efdd58e00000000000000000000000000000000000000000000000000000000908b908790859081106114bf57fe5b60200260200101516040516024016114d892919061510b565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060876001600160a01b0316836040516115299190614fe5565b600060405180830381855afa9150503d8060008114611564576040519150601f19603f3d011682016040523d82523d6000602084013e611569565b606091505b5091509150600082801561157e575081516020145b61158957600061159a565b61159a82600063ffffffff6130ef16565b905060008786815181106115aa57fe5b602002602001015182816115ba57fe5b049050806115d65760009b50505050505050505050505061095b565b8b8110806115e257508b155b156115eb57809b505b50505050505b600101611463565b505050505061189d565b6001600160e01b031981167fc339d10a000000000000000000000000000000000000000000000000000000001415611721576040516060907fa85e59e40000000000000000000000000000000000000000000000000000000090611672908690600090819081906024016154fb565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260045491519092506000916001600160a01b0316906116c4908490614fe5565b600060405180830381855afa9150503d80600081146116ff576040519150601f19603f3d011682016040523d82523d6000602084013e611704565b606091505b5050905080611714576000611718565b6000195b9350505061189d565b6001600160e01b031981167fdc1600f30000000000000000000000000000000000000000000000000000000014156117c85760008061175f85610e02565b50925092505061176d613678565b6001600160a01b0316826001600160a01b031614801561179a57506005546001600160a01b038281169116145b156117c15760006117b26117ac613690565b88613575565b90506117bd816136a8565b9450505b505061189d565b6001600160e01b031981166394cfcdd760e01b141561189d576060806117ed85611cd6565b80519194509250905060005b8181146118985783818151811061180c57fe5b60200260200101516000141561182157611890565b60006118408985848151811061183357fe5b602002602001015161124d565b9050600085838151811061185057fe5b6020026020010151828161186057fe5b0490508061187857600097505050505050505061095b565b87811080611884575087155b1561188d578097505b50505b6001016117f9565b505050505b5092915050565b6000806118b7838263ffffffff61308816565b91506001600160e01b031982167ff47261b000000000000000000000000000000000000000000000000000000000146119025760405162461bcd60e51b8152600401610885906156a4565b61191383601063ffffffff6130bc16565b9050915091565b6000806000606061192d856107f26138a6565b600061194660048751886130459092919063ffffffff16565b8060200190516119599190810190614cf4565b91965094509250905060ff8116600681111561197157fe5b9450509193509193565b60008060608080611992868563ffffffff61308816565b94506001600160e01b031985167fa7cb5fb700000000000000000000000000000000000000000000000000000000146119dd5760405162461bcd60e51b8152600401610885906156a4565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b600061120d84611a886040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876134e6565b6138ca565b6060808251604051908082528060200260200182016040528015611abb578160200160208202803883390190505b50905060005b8351811461189d57838181518110611ad557fe5b60200260200101516001600160a01b031631828281518110611af357fe5b6020908102919091010152600101611ac1565b606060008451905080604051908082528060200260200182016040528015611b38578160200160208202803883390190505b50915060005b818114611bc057611b89868281518110611b5457fe5b6020026020010151868381518110611b6857fe5b6020026020010151868481518110611b7c57fe5b60200260200101516126c7565b838281518110611b9557fe5b60200260200101906004811115611ba857fe5b90816004811115611bb557fe5b905250600101611b3e565b50509392505050565b60405160609063012b8bc960e11b90611be8908590859060240161510b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905092915050565b60006060806060611c35856107f26138d9565b8451611c4b90869060049063ffffffff61304516565b806020019051610a789190810190614492565b6040516060907fa7cb5fb70000000000000000000000000000000000000000000000000000000090611c9a908790879087908790602401615053565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050949350505050565b6000606080611ceb848463ffffffff61308816565b92506001600160e01b031983166394cfcdd760e01b14611d1d5760405162461bcd60e51b8152600401610885906156a4565b8351611d3390859060049063ffffffff61320d16565b806020019051611d469190810190614802565b9395909450915050565b60006060611d60836107f26138fd565b8251611d7690849060049063ffffffff61304516565b8060200190516109e09190810190614939565b60075481565b600080606081611da5858263ffffffff61308816565b93506001600160e01b031984167fc339d10a0000000000000000000000000000000000000000000000000000000014611df05760405162461bcd60e51b8152600401610885906156a4565b8451611e0690869060049063ffffffff61320d16565b806020019051610e8c919081019061443a565b600080611e28836107f2613921565b6000611e4160048551866130459092919063ffffffff16565b806020019051611e549190810190614c90565b9250905060ff81166001811115610ad557fe5b606060008251905080604051908082528060200260200182016040528015611e99578160200160208202803883390190505b50915060005b818114610cda57611eb68585838151811061183357fe5b838281518110611ec257fe5b6020908102919091010152600101611e9f565b600080611ee8838263ffffffff61308816565b90506001600160e01b031981166394cfcdd760e01b1415611fb857606080611f0f85611cd6565b80519194509250905060005b818114611fad57838181518110611f2e57fe5b602002602001015160001415611f4357611fa5565b6000611f5589858481518110610cae57fe5b90506000858381518110611f6557fe5b60200260200101518281611f7557fe5b04905080611f8d57600097505050505050505061095b565b87811080611f99575087155b15611fa2578097505b50505b600101611f1b565b5061095b9350505050565b6001600160e01b031981167ff47261b000000000000000000000000000000000000000000000000000000000141561210e576000611ffd84601063ffffffff6130bc16565b6001546040519192506060917fdd62ed3e00000000000000000000000000000000000000000000000000000000916120439189916001600160a01b031690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b0316836040516120949190614fe5565b600060405180830381855afa9150503d80600081146120cf576040519150601f19603f3d011682016040523d82523d6000602084013e6120d4565b606091505b50915091508180156120e7575080516020145b6120f2576000612103565b61210381600063ffffffff6130ef16565b95505050505061189d565b6001600160e01b0319811663012b8bc960e11b1415612373576000806121338561083f565b600254604051929550909350606092507fe985e9c5000000000000000000000000000000000000000000000000000000009161217f918a916001600160a01b0390911690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516121d09190614fe5565b600060405180830381855afa9150503d806000811461220b576040519150601f19603f3d011682016040523d82523d6000602084013e612210565b606091505b509150915081158061222457508051602014155b80612240575061223b81600063ffffffff6130ef16565b600114155b15612364576040516060907f081812fc000000000000000000000000000000000000000000000000000000009061227b9087906024016152c9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050856001600160a01b0316816040516122c89190614fe5565b600060405180830381855afa9150503d8060008114612303576040519150601f19603f3d011682016040523d82523d6000602084013e612308565b606091505b50909350915082801561231c575081516020145b801561234b57506002546001600160a01b031661234083600c63ffffffff6130bc16565b6001600160a01b0316145b612356576000612359565b60015b60ff169750506115f9565b6000199650505050505061189d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156124d35760006123b08461197b565b5050600354604051929450606093507fe985e9c500000000000000000000000000000000000000000000000000000000926123fa925089916001600160a01b031690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b03168360405161244b9190614fe5565b600060405180830381855afa9150503d8060008114612486576040519150601f19603f3d011682016040523d82523d6000602084013e61248b565b606091505b509150915081801561249e575080516020145b80156124ba57506124b681600063ffffffff6130ef16565b6001145b6124c5576000612103565b60001995505050505061189d565b6001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000141561250f57600019915061189d565b6001600160e01b031981167fdc1600f300000000000000000000000000000000000000000000000000000000141561189d5760008061254d85610e02565b50925092505061255b613678565b6001600160a01b0316826001600160a01b031614801561258857506005546001600160a01b038281169116145b156126be576005546040516060917fdd62ed3e00000000000000000000000000000000000000000000000000000000916125d2918a916001600160a01b0390911690602401615015565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905060006060612612613690565b6001600160a01b0316836040516126299190614fe5565b600060405180830381855afa9150503d8060008114612664576040519150601f19603f3d011682016040523d82523d6000602084013e612669565b606091505b5091509150600082801561267e575081516020145b61268957600061269a565b61269a82600063ffffffff6130ef16565b905060001981146126b3576126ae816136a8565b6126b7565b6000195b9750505050505b50505092915050565b60006126d1613f0c565b6127248584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b60408051600480825260a0820190925291925060609190816020015b606081526020019060019003908161274057505060408051600480825260a082019092529192506060919060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339019050509050886101600151846000815181106127d657fe5b602002602001018190525087836000815181106127ef57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088600001518260008151811061282157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050868160008151811061284f57fe5b6020026020010181815250508861014001518460018151811061286e57fe5b602002602001018190525088600001518360018151811061288b57fe5b6001600160a01b0392831660209182029290920101528816156128ae57876128c4565b73377f698c4c287018d09b516f415317aec59193325b826001815181106128d157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084600001518160018151811061290357fe5b602002602001018181525050886101a001518460028151811061292257fe5b6020026020010181905250878360028151811061293b57fe5b6001600160a01b03928316602091820292909201015260408a0151161561296657886040015161297c565b73377f698c4c287018d09b516f415317aec59193325b8260028151811061298957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460600151816002815181106129bb57fe5b602002602001018181525050886101800151846003815181106129da57fe5b60200260200101819052508860000151836003815181106129f757fe5b6001600160a01b03928316602091820292909201015260408a01511615612a22578860400151612a38565b73377f698c4c287018d09b516f415317aec59193325b82600381518110612a4557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160038151811061116757fe5b6040516060906394cfcdd760e01b90611be89085908590602401615276565b6000612aa8828263ffffffff61308816565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001480612af257506001600160e01b0319811663012b8bc960e11b145b80612b2657506001600160e01b031981167fa7cb5fb700000000000000000000000000000000000000000000000000000000145b80612b4157506001600160e01b031981166394cfcdd760e01b145b80612b7557506001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000145b610d4d5760405162461bcd60e51b8152600401610885906156a4565b606080606060008551905080604051908082528060200260200182016040528015612bd657816020015b612bc3613f3b565b815260200190600190039081612bbb5790505b50935080604051908082528060200260200182016040528015612c03578160200160208202803883390190505b50925080604051908082528060200260200182016040528015612c30578160200160208202803883390190505b50915060005b818114612cc057612c6d878281518110612c4c57fe5b6020026020010151878381518110612c6057fe5b6020026020010151612ce2565b8751889085908110612c7b57fe5b60200260200101878581518110612c8e57fe5b60200260200101878681518110612ca157fe5b9315156020948502919091019093019290925291905252600101612c36565b50509250925092565b606080612cd68484611e67565b91506108d38484610c5f565b612cea613f3b565b6006546040517f9d3fa4b900000000000000000000000000000000000000000000000000000000815260009182916001600160a01b0390911690639d3fa4b990612d389088906004016156ff565b60606040518083038186803b158015612d5057600080fd5b505afa158015612d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d889190810190614a70565b85516006546040517fa12dcc6f00000000000000000000000000000000000000000000000000000000815292955090916001600160a01b039091169063a12dcc6f90612dda9089908990600401615712565b60206040518083038186803b158015612df257600080fd5b505afa158015612e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e2a91908101906148b2565b91506000612e3d82886101400151610939565b60a088015160c08901516101808a01516101408b015193945091929091600091612e6c9163ffffffff61394516565b15612e9957612e9284612e8c848d6080015161396a90919063ffffffff16565b85613986565b9050612ef2565b81612ead57612e92848b6080015185613986565b6000612ebe868c6101800151610939565b90506000612ed1868d6080015187613986565b90506000612ee0838688613986565b9050612eec828261311f565b93505050505b612f12612f0c8960400151856139a890919063ffffffff16565b8261311f565b96506004612f258b8c602001518a610ed1565b6004811115612f3057fe5b14612f3c576000612f3e565b865b9650612f4e8a61016001516139c7565b612f5757600096505b60e08a015115801590612f755750612f738a6101a001516139c7565b155b15612f7f57600096505b600388516006811115612f8e57fe5b14612f9857600096505b50505050509250925092565b6000806000612fb5846107f2613ab1565b6000612fce60048651876130459092919063ffffffff16565b8060200190516109199190810190614cbd565b7ffdb6ca8d0000000000000000000000000000000000000000000000000000000090565b6000613012836000613088565b90506001600160e01b0319808216908316146130405760405162461bcd60e51b81526004016108859061566d565b505050565b6060818311156130635761306361305e60008585613ad5565b613af4565b835182111561307c5761307c61305e6001848751613ad5565b50819003910190815290565b600081600401835110156130a9576130a961305e6003855185600401613ad5565b5001602001516001600160e01b03191690565b600081601401835110156130dd576130dd61305e6004855185601401613ad5565b5001601401516001600160a01b031690565b6000610dc18383613afc565b7f18e4b1410000000000000000000000000000000000000000000000000000000090565b600081831061312e5781610dc1565b5090919050565b7f4678472b0000000000000000000000000000000000000000000000000000000090565b7fb6555d6f0000000000000000000000000000000000000000000000000000000090565b7f488219a60000000000000000000000000000000000000000000000000000000090565b7f1b8388f70000000000000000000000000000000000000000000000000000000090565b7fe94a7ed00000000000000000000000000000000000000000000000000000000090565b7f4ad312750000000000000000000000000000000000000000000000000000000090565b6060818311156132265761322661305e60008585613ad5565b835182111561323f5761323f61305e6001848751613ad5565b8282036040519080825280601f01601f19166020018201604052801561326c576020820181803883390190505b509050610dc161327b82613b26565b8461328587613b26565b018351613b2c565b7f11c7b7200000000000000000000000000000000000000000000000000000000090565b6132b9613f0c565b6020810184905260a085015160808601516132d5918691613bd1565b815260a085015160c08601516132ec918691613bd1565b604082015260a085015160e0860151613306918691613bd1565b606082015261331b828463ffffffff613c0516565b6080820152949350505050565b6040516000906060907fb04fbddd0000000000000000000000000000000000000000000000000000000090613367908890889088908890602401615124565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260065491519092506060916001600160a01b0316906133b9908490614fe5565b6000604051808303816000865af19150503d80600081146133f6576040519150601f19603f3d011682016040523d82523d6000602084013e6133fb565b606091505b50915060009050613412828263ffffffff61308816565b905061341c61317d565b6001600160e01b03198281169116141561345957600061343b836109ea565b5091505060ff8116600481111561344e57fe5b94505050505061120d565b613461613135565b6001600160e01b03198281169116141561349457600061348083610961565b509091505060ff8116600481111561344e57fe5b815160208301207ff43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce014156134ce576004935050505061120d565b60405162461bcd60e51b815260040161088590615636565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b6000610dc18261354c85613c36565b613cb1565b7fa15c0d060000000000000000000000000000000000000000000000000000000090565b6040516000906060907f70a0823100000000000000000000000000000000000000000000000000000000906135ae908590602401615001565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060856001600160a01b0316836040516135ff9190614fe5565b600060405180830381855afa9150503d806000811461363a576040519150601f19603f3d011682016040523d82523d6000602084013e61363f565b606091505b5091509150818015613652575080516020145b61365d57600061366e565b61366e81600063ffffffff6130ef16565b9695505050505050565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b6000806136b3613690565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156136ed57600080fd5b505af1158015613701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137259190810190614a54565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561376457600080fd5b505af1158015613778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061379c9190810190614c78565b421161381a57816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156137dd57600080fd5b505af11580156137f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506138159190810190614c78565b61388d565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561385557600080fd5b505af1158015613869573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061388d9190810190614c78565b905061120d816b033b2e3c9fd0803ce800000086613986565b7f7e5a23180000000000000000000000000000000000000000000000000000000090565b6000610dc18261354c85613ceb565b7f5bd0428d0000000000000000000000000000000000000000000000000000000090565b7f20d11f610000000000000000000000000000000000000000000000000000000090565b7ff59851840000000000000000000000000000000000000000000000000000000090565b600081518351148015610dc15750508051602091820120825192909101919091201490565b600082820183811015610dc157610dc161305e60008686613da4565b600061120d8361399c868563ffffffff613c0516565b9063ffffffff613dc316565b6000828211156139c1576139c161305e60028585613da4565b50900390565b600060208251816139d457fe5b066004146139e457506000610d4d565b60006139f6838263ffffffff61308816565b90506001600160e01b031981166394cfcdd760e01b14613a1a576001915050610d4d565b606080613a2685611cd6565b80519194509250905060005b818114613aa4576000613a626000858481518110613a4c57fe5b602002602001015161308890919063ffffffff16565b90506001600160e01b0319811663012b8bc960e11b1415613a9b57613a878483613ded565b15613a9b5760009650505050505050610d4d565b50600101613a32565b5060019695505050505050565b7fe53c76c80000000000000000000000000000000000000000000000000000000090565b6060632800659560e01b848484604051602401610d8c939291906155d0565b805160208201fd5b60008160200183511015613b1d57613b1d61305e6005855185602001613ad5565b50016020015190565b60200190565b6020811015613b56576001816020036101000a038019835116818551168082178652505050613040565b82821415613b6357613040565b82821115613b9d5760208103905080820181840181515b82851015613b95578451865260209586019590940193613b7a565b905250613040565b60208103905080820181840183515b81861215613bc85782518252601f199283019290910190613bac565b85525050505050565b6000613bde848484613e50565b15613bf157613bf161305e858585613eb6565b61120d8361399c868563ffffffff613c0516565b600082613c145750600061095b565b82820282848281613c2157fe5b0414610dc157610dc161305e60018686613da4565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613d3757fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b606063e946c1bb60e01b848484604051602401610d8c93929190615561565b600081613dd957613dd961305e60038585613da4565b6000828481613de457fe5b04949350505050565b8151600090600183015b81811015610cda57613e38858281518110613e0e57fe5b6020026020010151868681518110613e2257fe5b602002602001015161394590919063ffffffff16565b15613e485760019250505061095b565b600101613df7565b600082613e6257613e6261305e613ed5565b811580613e6d575083155b15613e7a57506000610dc1565b60008380613e8457fe5b8584099050613e99858463ffffffff613c0516565b613eab826103e863ffffffff613c0516565b101595945050505050565b606063339f3de260e01b848484604051602401610d8c93929190615737565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b803561095b81615813565b600082601f830112613f78578081fd5b8135613f8b613f8682615774565b61574d565b818152915060208083019084810181840286018201871015613fac57600080fd5b60005b84811015611898578135613fc281615813565b84529282019290820190600101613faf565b600082601f830112613fe4578081fd5b8151613ff2613f8682615774565b8181529150602080830190840160005b8381101561402f5761401a876020845189010161419b565b83526020928301929190910190600101614002565b5050505092915050565b600082601f830112614049578081fd5b8135614057613f8682615774565b8181529150602080830190840160005b8381101561402f5761407f876020843589010161414d565b83526020928301929190910190600101614067565b600082601f8301126140a4578081fd5b81356140b2613f8682615774565b8181529150602080830190840160005b8381101561402f576140da87602084358901016141e1565b835260209283019291909101906001016140c2565b600082601f8301126140ff578081fd5b813561410d613f8682615774565b81815291506020808301908481018184028601820187101561412e57600080fd5b60005b8481101561189857813584529282019290820190600101614131565b600082601f83011261415d578081fd5b813561416b613f8682615794565b915080825283602082850101111561418257600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126141ab578081fd5b81516141b9613f8682615794565b91508082528360208285010111156141d057600080fd5b61189d8160208401602086016157b8565b60006101c08083850312156141f4578182fd5b6141fd8161574d565b91505061420a8383613f5d565b81526142198360208401613f5d565b602082015261422b8360408401613f5d565b604082015261423d8360608401613f5d565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561429f57600080fd5b6142ab8683870161414d565b838501526101609250828501359150808211156142c757600080fd5b6142d38683870161414d565b838501526101809250828501359150808211156142ef57600080fd5b6142fb8683870161414d565b838501526101a092508285013591508082111561431757600080fd5b506143248582860161414d565b82840152505092915050565b805160ff8116811461095b57600080fd5b600060208284031215614352578081fd5b8135610dc181615813565b6000806040838503121561436f578081fd5b825161437a81615813565b602084015190925061438b81615813565b809150509250929050565b6000806000606084860312156143aa578081fd5b83516143b581615813565b60208501519093506143c681615813565b604085015190925067ffffffffffffffff8111156143e2578182fd5b6143ee8682870161419b565b9150509250925092565b60008060006060848603121561440c578081fd5b835161441781615813565b602085015190935061442881615813565b80925050604084015190509250925092565b60008060006060848603121561444e578081fd5b835161445981615813565b602085015190935067ffffffffffffffff811115614475578182fd5b6144818682870161419b565b925050604084015190509250925092565b600080600080608085870312156144a7578182fd5b84516144b281615813565b602086015190945067ffffffffffffffff808211156144cf578384fd5b6144db8883890161419b565b945060408701519150808211156144f0578384fd5b6144fc8883890161419b565b93506060870151915080821115614511578283fd5b5061451e8782880161419b565b91505092959194509250565b6000806040838503121561453c578182fd5b823561454781615813565b9150602083013567ffffffffffffffff811115614562578182fd5b61456e85828601614039565b9150509250929050565b6000806000806080858703121561458d578182fd5b843561459881615813565b9350602085013567ffffffffffffffff808211156145b4578384fd5b6145c0888389016140ef565b945060408701359150808211156145d5578384fd5b6145e1888389016140ef565b935060608701359150808211156145f6578283fd5b5061451e8782880161414d565b60008060408385031215614615578182fd5b823561462081615813565b9150602083013567ffffffffffffffff81111561463b578182fd5b61456e8582860161414d565b60008060006060848603121561465b578081fd5b833561466681615813565b9250602084013567ffffffffffffffff811115614681578182fd5b61468d8682870161414d565b925050604084013590509250925092565b600080604083850312156146b0578182fd5b82356146bb81615813565b946020939093013593505050565b6000602082840312156146da578081fd5b813567ffffffffffffffff8111156146f0578182fd5b61120d84828501613f68565b600080600060608486031215614710578081fd5b833567ffffffffffffffff80821115614727578283fd5b61473387838801614094565b94506020860135915080821115614748578283fd5b61475487838801613f68565b93506040860135915080821115614769578283fd5b506143ee868287016140ef565b60008060408385031215614788578182fd5b823567ffffffffffffffff8082111561479f578384fd5b6147ab86838701614094565b935060208501359150808211156147c0578283fd5b5061456e85828601614039565b600080604083850312156147df578182fd5b823567ffffffffffffffff808211156147f6578384fd5b6147ab868387016140ef565b60008060408385031215614814578182fd5b825167ffffffffffffffff8082111561482b578384fd5b81850186601f82011261483c578485fd5b8051925061484c613f8684615774565b80848252602080830192508084018a82838902870101111561486c578889fd5b8894505b8685101561488e578051845260019490940193928101928101614870565b5088015190965093505050808211156148a5578283fd5b5061456e85828601613fd4565b6000602082840312156148c3578081fd5b81518015158114610dc1578182fd5b600080600080608085870312156148e7578182fd5b8451935060208501516148f981615813565b604086015190935067ffffffffffffffff808211156144f0578384fd5b60008060408385031215614928578182fd5b505080516020909101519092909150565b6000806040838503121561494b578182fd5b82519150602083015167ffffffffffffffff811115614968578182fd5b61456e8582860161419b565b600080600060608486031215614988578081fd5b83519250602084015167ffffffffffffffff808211156149a6578283fd5b6149b28783880161419b565b935060408601519150808211156149c7578283fd5b506143ee8682870161419b565b600080604083850312156149e6578182fd5b82519150602083015161438b81615828565b60008060408385031215614a0a578182fd5b82516001600160e01b03198116811461437a578283fd5b600060208284031215614a32578081fd5b813567ffffffffffffffff811115614a48578182fd5b61120d8482850161414d565b600060208284031215614a65578081fd5b8151610dc181615813565b600060608284031215614a81578081fd5b614a8b606061574d565b825160078110614a99578283fd5b8152602083810151908201526040928301519281019290925250919050565b600080600060608486031215614acc578081fd5b833567ffffffffffffffff811115614ae2578182fd5b614aee868287016141e1565b9350506020840135614aff81615813565b929592945050506040919091013590565b60008060408385031215614b22578182fd5b823567ffffffffffffffff80821115614b39578384fd5b614b45868387016141e1565b93506020850135915080821115614b5a578283fd5b5061456e8582860161414d565b600080600060608486031215614b7b578081fd5b833567ffffffffffffffff811115614b91578182fd5b614b9d868287016141e1565b935050602084013591506040840135614bb581615813565b809150509250925092565b600080600060608486031215614bd4578081fd5b833567ffffffffffffffff80821115614beb578283fd5b81860160a08189031215614bfd578384fd5b614c0760a061574d565b9250803583526020810135602084015260408101356040840152614c2e8860608301613f5d565b6060840152608081013582811115614c44578485fd5b614c508982840161414d565b608085015250919450505060208401359150614c6f8560408601613f5d565b90509250925092565b600060208284031215614c89578081fd5b5051919050565b60008060408385031215614ca2578182fd5b8251614cad81615828565b6020939093015192949293505050565b600080600060608486031215614cd1578081fd5b8351614cdc81615828565b602085015160408601519194509250614bb581615813565b60008060008060808587031215614d09578182fd5b614d138686614330565b9350602085015192506040850151614d2a81615813565b606086015190925067ffffffffffffffff811115614d46578182fd5b61451e8782880161419b565b600080600060608486031215614d66578081fd5b614d708585614330565b925060208401519150604084015167ffffffffffffffff8111156143e2578182fd5b600080600060608486031215614da6578081fd5b614db08585614330565b925060208401519150604084015190509250925092565b6001600160a01b03169052565b6000815180845260208401935060208301825b82811015614e0e5781516001600160a01b0316865260209586019590910190600101614de7565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b84811015614e63578284038852614e4d848351614ea0565b6020988901989094509190910190600101614e35565b50919695505050505050565b6000815180845260208401935060208301825b82811015614e0e578151865260209586019590910190600101614e82565b60008151808452614eb88160208601602086016157b8565b601f01601f19169290920160200192915050565b8051614ed781615809565b825260208181015190830152604090810151910152565b60006101c0614efe848451614dc7565b6020830151614f106020860182614dc7565b506040830151614f236040860182614dc7565b506060830151614f366060860182614dc7565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518186015250610120808401518186015250610140808401518282870152614f8f83870182614ea0565b91505061016091508184015185820383870152614fac8282614ea0565b925050506101808084015185830382870152614fc88382614ea0565b9150506101a09150818401518582038387015261366e8282614ea0565b60008251614ff78184602087016157b8565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006001600160a01b0386168252608060208301526150756080830186614e6f565b82810360408401526150878186614e6f565b83810360608501526150998186614ea0565b98975050505050505050565b60006001600160a01b0385168252606060208301526150c76060830185614ea0565b9050826040830152949350505050565b60006001600160a01b0386168252608060208301526150f96080830186614ea0565b82810360408401526150878186614ea0565b6001600160a01b03929092168252602082015260400190565b6000608082526151376080830187614e18565b82810360208401526151498187614dd4565b838103604085015261515b8187614dd4565b91505082810360608401526151708185614e6f565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156151bd578351600581106151a957fe5b835260209384019390920191600101615195565b509095945050505050565b606080825284519082018190526000906020906080840190828801845b8281101561520b576151f8848351614ecc565b60609390930192908401906001016151e5565b5050508381038285015261521f8187614e6f565b84810360408601528551808252908301915082860190845b81811015615255578251151584529284019291840191600101615237565b509198975050505050505050565b600060208252610dc16020830184614e6f565b6000604082526152896040830185614e6f565b828103602084015261529b8185614e18565b95945050505050565b6000604082526152b76040830185614e6f565b828103602084015261529b8185614e6f565b90815260200190565b60008582526001600160a01b0385166020830152608060408301526152fa6080830185614ea0565b82810360608401526151708185614ea0565b918252602082015260400190565b60008382526040602083015261120d6040830184614ea0565b60008482526060602083015261534c6060830185614ea0565b828103604084015261366e8185614ea0565b8281526040810161536e83615809565b8260208301529392505050565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b60006001600160e01b0319861682526001600160a01b0380861660208401528085166040840152506080606083015261366e6080830184614ea0565b60006001600160e01b0319871682526001600160a01b038616602083015260a0604083015261542160a0830186614e6f565b82810360608401526154338186614e6f565b838103608085015261117f8186614ea0565b60006001600160e01b0319861682526001600160a01b0385166020830152608060408301526154776080830185614ea0565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b60006001600160e01b031985168252606060208301526154d66060830185614e6f565b828103604084015261366e8185614e18565b600060208252610dc16020830184614ea0565b60006080825261550e6080830187614ea0565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6000615544856157e8565b8482528360208301526060604083015261529b6060830184614ea0565b6060810161556e856157f5565b938152602081019290925260409091015290565b6060810161558f856157ff565b93815260208101929092526001600160a01b031660409091015290565b604081016155b9846157f5565b9281526020015290565b6060810161556e856157ff565b606081016008851061556e57fe5b60208101600583106155ec57fe5b91905290565b60006155fd86615809565b8582528460208301526001600160a01b03841660408301526080606083015261366e6080830184614ea0565b604081016155b9846157e8565b60208082526013908201527f554e4b4e4f574e5f52455455524e5f4441544100000000000000000000000000604082015260600190565b6020808252600c908201527f4241445f53454c4543544f520000000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f57524f4e475f50524f58595f4944000000000000000000000000000000000000604082015260600190565b60a081016156e98286614ecc565b8360608301528215156080830152949350505050565b600060208252610dc16020830184614eee565b6000604082526157256040830185614eee565b828103602084015261529b8185614ea0565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561576c57600080fd5b604052919050565b600067ffffffffffffffff82111561578a578081fd5b5060209081020190565b600067ffffffffffffffff8211156157aa578081fd5b50601f01601f191660200190565b60005b838110156157d35781810151838201526020016157bb565b838111156157e2576000848401525b50505050565b600281106157f257fe5b50565b600481106157f257fe5b600381106157f257fe5b600781106157f257fe5b6001600160a01b03811681146157f257600080fd5b60ff811681146157f257600080fdfea365627a7a72315820b8f5e1baee716487ac576e78a6a19b92db1db8535a5a9d8ed8a3c9e3e2968a386c6578706572696d656e74616cf564736f6c63430005100040'; + '0x608060405234801561001057600080fd5b506004361061025c5760003560e01c8063a5cd62ba11610145578063d3637905116100bd578063e4e6e7da1161008c578063ee18599711610071578063ee185997146105b5578063ef3bb097146105bd578063ff84e7cc146105c55761025c565b8063e4e6e7da14610572578063e77286eb146105935761025c565b8063d36379051461050a578063d3d862d11461051d578063d469502814610530578063e25cabf7146105505761025c565b8063c26cfecd11610114578063ca49f47c116100f9578063ca49f47c146104c1578063d001c5dc146104e4578063d186037f146104f75761025c565b8063c26cfecd146104b1578063c82037ef146104b95761025c565b8063a5cd62ba14610449578063a6627e9f14610469578063b43cffe11461047c578063bbb2dcf61461048f5761025c565b80637982653e116101d85780639baf2705116101a75780639eadc8351161018c5780639eadc835146103ff578063a070cac814610423578063a0901e51146104365761025c565b80639baf2705146103e25780639cd01605146103f75761025c565b80637982653e1461037b57806379c9c4261461039b5780637d727512146103ae5780638f4ce479146103c15761025c565b80634dfdac201161022f57806363eb39921161021457806363eb3992146103225780636f83188e14610335578063750bdb30146103585761025c565b80634dfdac20146102e2578063590aa875146103025761025c565b806304a5618a146102615780630d7b7d761461028c5780632322cf76146102ad57806346eb65cb146102cd575b600080fd5b61027461026f36600461406c565b6105cd565b60405161028393929190614aee565b60405180910390f35b61029f61029a366004613b30565b610666565b604051610283929190614cd6565b6102c06102bb366004613b30565b610688565b60405161028391906149cb565b6102e06102db36600461406c565b6106b0565b005b6102f56102f0366004613a4b565b610734565b6040516102839190614923565b610315610310366004613a2f565b6107b7565b6040516102839190614b4e565b610315610330366004613b74565b610866565b61034861034336600461406c565b610919565b6040516102839493929190614be2565b61036b61036636600461406c565b6109b9565b6040516102839493929190614a0c565b61038e610389366004614242565b610a4b565b6040516102839190614bcf565b6102c06103a936600461434a565b610afd565b6102c06103bc366004613b30565b610b7e565b6103d46103cf36600461406c565b611474565b6040516102839291906149e9565b6103ea611507565b604051610283919061467e565b6103ea611516565b61041261040d36600461406c565b611525565b604051610283959493929190614a48565b6102c06104313660046142f1565b6115ca565b6102f5610444366004613bf6565b61164b565b61045c610457366004613cc4565b6116c4565b604051610283919061482b565b610315610477366004613bcb565b61177e565b61031561048a366004613a99565b61182e565b6104a261049d36600461406c565b6118e4565b60405161028393929190614b19565b6102c0611974565b6103ea61197a565b6104d46104cf36600461406c565b611989565b6040516102839493929190614aab565b6102f56104f2366004613a4b565b611a1b565b6102c0610505366004613b30565b611a89565b61038e610518366004614242565b612365565b61031561052b366004613d9f565b6123c7565b61054361053e36600461406c565b61241c565b60405161028391906149d4565b61056361055e366004613d48565b6124bf565b60405161028393929190614877565b610585610580366004613a4b565b6125f7565b6040516102839291906149a6565b6105a66105a136600461429a565b612610565b60405161028393929190614c7a565b6103ea612980565b6103ea61298f565b6103ea61299e565b600080600073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a856040518263ffffffff1660e01b81526004016106099190614b4e565b60606040518083038186803b15801561062157600080fd5b505af4158015610635573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106599190810190613fc2565b9250925092509193909250565b6000806106738484610b7e565b915061067f8484611a89565b90509250929050565b60008060006106978585610666565b915091506106a582826129ad565b925050505b92915050565b6040517f46eb65cb00000000000000000000000000000000000000000000000000000000815273__$d8b635de2bf4a097b4e18b67d0fb68e779$__906346eb65cb90610700908490600401614b4e565b60006040518083038186803b15801561071857600080fd5b505af415801561072c573d6000803e3d6000fd5b505050505b50565b606060008251905080604051908082528060200260200182016040528015610766578160200160208202803883390190505b50915060005b8181146107af576107908585838151811061078357fe5b6020026020010151611a89565b83828151811061079c57fe5b602090810291909101015260010161076c565b505092915050565b6040517f590aa87500000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063590aa8759061080a90859060040161467e565b60006040518083038186803b15801561082257600080fd5b505af4158015610836573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085e919081019061409f565b90505b919050565b6040517f63eb399200000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__906363eb3992906108bd908790879087906004016147ab565b60006040518083038186803b1580156108d557600080fd5b505af41580156108e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610911919081019061409f565b949350505050565b60608060608073__$fddee3b26a806429350031cf3481976d2e$__636f83188e866040518263ffffffff1660e01b81526004016109569190614b4e565b60006040518083038186803b15801561096e57600080fd5b505af4158015610982573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa919081019061410d565b93509350935093509193509193565b6000806000606073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016109f79190614b4e565b60006040518083038186803b158015610a0f57600080fd5b505af4158015610a23573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa9190810190613e46565b600080546040517f9caa023b00000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__91639caa023b91610aad916001600160a01b0316908890889088906004016147dd565b60206040518083038186803b158015610ac557600080fd5b505af4158015610ad9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061091191908101906140ee565b600061091184610b796040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876129c3565b612a1a565b600080610b91838263ffffffff612a2e16565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415610bec576000610bd884601063ffffffff612a6716565b9050610be48186612a9a565b92505061146d565b6001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415610e055760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a866040518263ffffffff1660e01b8152600401610c589190614b4e565b60606040518083038186803b158015610c7057600080fd5b505af4158015610c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ca89190810190613fc2565b6040519194509250606091507f6352211e0000000000000000000000000000000000000000000000000000000090610ce49084906024016149cb565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b031683604051610d5f9190614662565b600060405180830381855afa9150503d8060008114610d9a576040519150601f19603f3d011682016040523d82523d6000602084013e610d9f565b606091505b50915091506000828015610db4575081516020145b610dbf576000610dd0565b610dd082600c63ffffffff612a6716565b9050896001600160a01b0316816001600160a01b031614610df2576000610df5565b60015b60ff16975050505050505061146d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156110a157600060608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__639eadc835876040518263ffffffff1660e01b8152600401610e739190614b4e565b60006040518083038186803b158015610e8b57600080fd5b505af4158015610e9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ec79190810190613eb0565b5081519296509094509250905060005b81811461109757828181518110610eea57fe5b602002602001015160001415610eff5761108f565b83516060907efdd58e00000000000000000000000000000000000000000000000000000000908b90879085908110610f3357fe5b6020026020010151604051602401610f4c929190614812565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060876001600160a01b031683604051610fc79190614662565b600060405180830381855afa9150503d8060008114611002576040519150601f19603f3d011682016040523d82523d6000602084013e611007565b606091505b5091509150600082801561101c575081516020145b611027576000611038565b61103882600063ffffffff612b9216565b9050600087868151811061104857fe5b6020026020010151828161105857fe5b049050806110745760009b5050505050505050505050506106aa565b8b81108061108057508b155b1561108957809b505b50505050505b600101610ed7565b505050505061146d565b6001600160e01b031981167fc339d10a0000000000000000000000000000000000000000000000000000000014156111d4576040516060907fa85e59e4000000000000000000000000000000000000000000000000000000009061111090869060009081908190602401614b61565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611177908490614662565b600060405180830381855afa9150503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b50509050806111c75760006111cb565b6000195b9350505061146d565b6001600160e01b031981167fdc1600f30000000000000000000000000000000000000000000000000000000014156112fd5760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016112409190614b4e565b60006040518083038186803b15801561125857600080fd5b505af415801561126c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112949190810190613e46565b5092509250506112a2612b9e565b6001600160a01b0316826001600160a01b03161480156112cf57506005546001600160a01b038281169116145b156112f65760006112e76112e1612bb6565b88612a9a565b90506112f281612bce565b9450505b505061146d565b6001600160e01b031981167f94cfcdd700000000000000000000000000000000000000000000000000000000141561146d5760608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6866040518263ffffffff1660e01b81526004016113699190614b4e565b60006040518083038186803b15801561138157600080fd5b505af4158015611395573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113bd9190810190614002565b80519194509250905060005b818114611468578381815181106113dc57fe5b6020026020010151600014156113f157611460565b60006114108985848151811061140357fe5b6020026020010151610b7e565b9050600085838151811061142057fe5b6020026020010151828161143057fe5b049050806114485760009750505050505050506106aa565b87811080611454575087155b1561145d578097505b50505b6001016113c9565b505050505b5092915050565b60008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__638f4ce479846040518263ffffffff1660e01b81526004016114ae9190614b4e565b604080518083038186803b1580156114c557600080fd5b505af41580156114d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114fd9190810190613e0f565b915091505b915091565b6004546001600160a01b031681565b6000546001600160a01b031681565b600080606080606073__$d8b635de2bf4a097b4e18b67d0fb68e779$__639eadc835876040518263ffffffff1660e01b81526004016115649190614b4e565b60006040518083038186803b15801561157c57600080fd5b505af4158015611590573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115b89190810190613eb0565b939a9299509097509550909350915050565b6000610911846116466040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876129c3565b612dcc565b6060808251604051908082528060200260200182016040528015611679578160200160208202803883390190505b50905060005b8351811461146d5783818151811061169357fe5b60200260200101516001600160a01b0316318282815181106116b157fe5b602090810291909101015260010161167f565b6000546040517f02cffc4500000000000000000000000000000000000000000000000000000000815260609173__$7a69f714cdde1cb6b62e3c39bc8c94deae$__916302cffc459161172a916001600160a01b03909116908890889088906004016146ac565b60006040518083038186803b15801561174257600080fd5b505af4158015611756573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109119190810190613c29565b6040517fa6627e9f00000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063a6627e9f906117d39086908690600401614812565b60006040518083038186803b1580156117eb57600080fd5b505af41580156117ff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611827919081019061409f565b9392505050565b6040517fb43cffe100000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063b43cffe190611887908890889088908890600401614765565b60006040518083038186803b15801561189f57600080fd5b505af41580156118b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118db919081019061409f565b95945050505050565b600060608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6856040518263ffffffff1660e01b81526004016119209190614b4e565b60006040518083038186803b15801561193857600080fd5b505af415801561194c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106599190810190614002565b60065481565b6005546001600160a01b031681565b6000806060600073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63ca49f47c866040518263ffffffff1660e01b81526004016119c79190614b4e565b60006040518083038186803b1580156119df57600080fd5b505af41580156119f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109aa9190810190613f5a565b606060008251905080604051908082528060200260200182016040528015611a4d578160200160208202803883390190505b50915060005b8181146107af57611a6a8585838151811061140357fe5b838281518110611a7657fe5b6020908102919091010152600101611a53565b600080611a9c838263ffffffff612a2e16565b90506001600160e01b031981167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611c075760608073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63bbb2dcf6866040518263ffffffff1660e01b8152600401611b0a9190614b4e565b60006040518083038186803b158015611b2257600080fd5b505af4158015611b36573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b5e9190810190614002565b80519194509250905060005b818114611bfc57838181518110611b7d57fe5b602002602001015160001415611b9257611bf4565b6000611ba48985848151811061078357fe5b90506000858381518110611bb457fe5b60200260200101518281611bc457fe5b04905080611bdc5760009750505050505050506106aa565b87811080611be8575087155b15611bf1578097505b50505b600101611b6a565b506106aa9350505050565b6001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415611c68576000611c4c84601063ffffffff612a6716565b600154909150610be490829087906001600160a01b0316612ddb565b6001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415611fb85760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__6304a5618a866040518263ffffffff1660e01b8152600401611cd49190614b4e565b60606040518083038186803b158015611cec57600080fd5b505af4158015611d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d249190810190613fc2565b600254604051929550909350606092507fe985e9c50000000000000000000000000000000000000000000000000000000091611d70918a916001600160a01b0390911690602401614692565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b031683604051611deb9190614662565b600060405180830381855afa9150503d8060008114611e26576040519150601f19603f3d011682016040523d82523d6000602084013e611e2b565b606091505b5091509150811580611e3f57508051602014155b80611e5b5750611e5681600063ffffffff612b9216565b600114155b15611fa9576040516060907f081812fc0000000000000000000000000000000000000000000000000000000090611e969087906024016149cb565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050856001600160a01b031681604051611f0d9190614662565b600060405180830381855afa9150503d8060008114611f48576040519150601f19603f3d011682016040523d82523d6000602084013e611f4d565b606091505b509093509150828015611f61575081516020145b8015611f9057506002546001600160a01b0316611f8583600c63ffffffff612a6716565b6001600160a01b0316145b611f9b576000611f9e565b60015b60ff16975050611097565b6000199650505050505061146d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156121df576040517f9eadc83500000000000000000000000000000000000000000000000000000000815260009073__$d8b635de2bf4a097b4e18b67d0fb68e779$__90639eadc8359061203d908790600401614b4e565b60006040518083038186803b15801561205557600080fd5b505af4158015612069573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120919190810190613eb0565b5050600354604051929450606093507fe985e9c500000000000000000000000000000000000000000000000000000000926120db925089916001600160a01b031690602401614692565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060836001600160a01b0316836040516121569190614662565b600060405180830381855afa9150503d8060008114612191576040519150601f19603f3d011682016040523d82523d6000602084013e612196565b606091505b50915091508180156121a9575080516020145b80156121c557506121c181600063ffffffff612b9216565b6001145b6121d05760006121d4565b6000195b95505050505061146d565b6001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000141561221b57600019915061146d565b6001600160e01b031981167fdc1600f300000000000000000000000000000000000000000000000000000000141561146d5760008073__$d8b635de2bf4a097b4e18b67d0fb68e779$__63750bdb30866040518263ffffffff1660e01b81526004016122879190614b4e565b60006040518083038186803b15801561229f57600080fd5b505af41580156122b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122db9190810190613e46565b5092509250506122e9612b9e565b6001600160a01b0316826001600160a01b031614801561231657506005546001600160a01b038281169116145b1561235c57600061233b612328612bb6565b60055489906001600160a01b0316612ddb565b905060001981146123545761234f81612bce565b612358565b6000195b9450505b50505092915050565b600080546040517f8dccde0400000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__91638dccde0491610aad916001600160a01b0316908890889088906004016147dd565b6040517fd3d862d100000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063d3d862d1906117d39086908690600401614936565b6040517fd469502800000000000000000000000000000000000000000000000000000000815260009073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063d46950289061246f908590600401614b4e565b60206040518083038186803b15801561248757600080fd5b505af415801561249b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061085e9190810190613df4565b60608060606000855190508060405190808252806020026020018201604052801561250457816020015b6124f1613467565b8152602001906001900390816124e95790505b50935080604051908082528060200260200182016040528015612531578160200160208202803883390190505b5092508060405190808252806020026020018201604052801561255e578160200160208202803883390190505b50915060005b8181146125ee5761259b87828151811061257a57fe5b602002602001015187838151811061258e57fe5b6020026020010151612610565b87518890859081106125a957fe5b602002602001018785815181106125bc57fe5b602002602001018786815181106125cf57fe5b9315156020948502919091019093019290925291905252600101612564565b50509250925092565b6060806126048484611a1b565b915061067f8484610734565b612618613467565b600080546040517f9d3fa4b900000000000000000000000000000000000000000000000000000000815282916001600160a01b031690639d3fa4b990612662908890600401614c9e565b60606040518083038186803b15801561267a57600080fd5b505afa15801561268e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126b291908101906141fa565b85516000546040517fa12dcc6f00000000000000000000000000000000000000000000000000000000815292955090916001600160a01b039091169063a12dcc6f906127049089908990600401614cb1565b60206040518083038186803b15801561271c57600080fd5b505afa158015612730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127549190810190613dd4565b9150600061276187612ee5565b90506000612782886101800151896101400151612f0190919063ffffffff16565b156127b7576127b0826127a68a60c001518b60800151612f2690919063ffffffff16565b8a60a00151612f42565b9050612824565b60c08801516127d3576127b08289608001518a60a00151612f42565b60006127e4848a6101800151610688565b905060006127fb848b608001518c60a00151612f42565b90506000612812838c60c001518d60a00151612f42565b905061281e82826129ad565b93505050505b61284861284287604001518a60a00151612f6490919063ffffffff16565b826129ad565b9450600460005460208a01516040517f9caa023b00000000000000000000000000000000000000000000000000000000815273__$7a69f714cdde1cb6b62e3c39bc8c94deae$__92639caa023b926128b3926001600160a01b03909216918e91908c906004016147dd565b60206040518083038186803b1580156128cb57600080fd5b505af41580156128df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061290391908101906140ee565b600481111561290e57fe5b1461291a57600061291c565b845b945061292c886101600151612f83565b61293557600094505b60e0880151158015906129535750612951886101a00151612f83565b155b1561295d57600094505b60038651600681111561296c57fe5b1461297657600094505b5050509250925092565b6001546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b031681565b60008183106129bc5781611827565b5090919050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600061182782612a2985613138565b6131b3565b60008160040183511015612a5457612a54612a4f60038551856004016131ed565b61325c565b5001602001516001600160e01b03191690565b60008160140183511015612a8857612a88612a4f60048551856014016131ed565b5001601401516001600160a01b031690565b60405160009081906060906001600160a01b038616907f70a082310000000000000000000000000000000000000000000000000000000090612ae090879060240161467e565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909416939093179092529051612b339190614662565b600060405180830381855afa9150503d8060008114612b6e576040519150601f19603f3d011682016040523d82523d6000602084013e612b73565b606091505b5091509150818015612b86575080516020145b156107af576106a58160005b60006118278383613264565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b600080612bd9612bb6565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c1357600080fd5b505af1158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c4b91908101906140d2565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c8a57600080fd5b505af1158015612c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612cc29190810190614403565b4211612d4057816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d0357600080fd5b505af1158015612d17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d3b9190810190614403565b612db3565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d7b57600080fd5b505af1158015612d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612db39190810190614403565b9050610911816b033b2e3c9fd0803ce800000086612f42565b600061182782612a298561328e565b60405160009081906060906001600160a01b038716907fdd62ed3e0000000000000000000000000000000000000000000000000000000090612e239088908890602401614692565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909416939093179092529051612e769190614662565b600060405180830381855afa9150503d8060008114612eb1576040519150601f19603f3d011682016040523d82523d6000602084013e612eb6565b606091505b5091509150818015612ec9575080516020145b15612edc57612ed9816000612b92565b92505b50509392505050565b6000806000612ef384613347565b9150915061091182826129ad565b6000815183511480156118275750508051602091820120825192909101919091201490565b60008282018381101561182757611827612a4f6000868661338a565b600061091183612f58868563ffffffff6133a916565b9063ffffffff6133da16565b600082821115612f7d57612f7d612a4f6002858561338a565b50900390565b60006020825181612f9057fe5b06600414612fa057506000610861565b6000612fb2838263ffffffff612a2e16565b90506001600160e01b031981167f94cfcdd70000000000000000000000000000000000000000000000000000000014612fef576001915050610861565b6040517fbbb2dcf600000000000000000000000000000000000000000000000000000000815260609073__$d8b635de2bf4a097b4e18b67d0fb68e779$__9063bbb2dcf690613042908790600401614b4e565b60006040518083038186803b15801561305a57600080fd5b505af415801561306e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130969190810190614002565b80519093509150600090505b81811461312c5760006130d260008584815181106130bc57fe5b6020026020010151612a2e90919063ffffffff16565b90506001600160e01b031981167f02571792000000000000000000000000000000000000000000000000000000001415613123576131108483613404565b1561312357600095505050505050610861565b506001016130a2565b50600195945050505050565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6060632800659560e01b84848460405160240161320c93929190614bc1565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b6000816020018351101561328557613285612a4f60058551856020016131ed565b50016020015190565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534939092909160208710156132da57fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b600080600483610140015151101561336457506000905080611502565b6133778360000151846101400151610b7e565b6114fd8460000151856101400151611a89565b606063e946c1bb60e01b84848460405160240161320c93929190614b9f565b6000826133b8575060006106aa565b828202828482816133c557fe5b041461182757611827612a4f6001868661338a565b6000816133f0576133f0612a4f6003858561338a565b60008284816133fb57fe5b04949350505050565b8151600090600183015b818110156107af5761344f85828151811061342557fe5b602002602001015186868151811061343957fe5b6020026020010151612f0190919063ffffffff16565b1561345f576001925050506106aa565b60010161340e565b6040805160608101909152806000815260006020820181905260409091015290565b80356106aa81614d89565b80516106aa81614d89565b600082601f8301126134af578081fd5b81356134c26134bd82614d0b565b614ce4565b8181529150602080830190848101818402860182018710156134e357600080fd5b60005b848110156114685781356134f981614d89565b845292820192908201906001016134e6565b600082601f83011261351b578081fd5b81356135296134bd82614d0b565b8181529150602080830190840160005b838110156135665761355187602084358901016136fa565b83526020928301929190910190600101613539565b5050505092915050565b600082601f830112613580578081fd5b815161358e6134bd82614d0b565b8181529150602080830190840160005b83811015613566576135b68760208451890101613748565b8352602092830192919091019060010161359e565b600082601f8301126135db578081fd5b81356135e96134bd82614d0b565b8181529150602080830190840160005b8381101561356657613611876020843589010161379d565b835260209283019291909101906001016135f9565b600082601f830112613636578081fd5b81356136446134bd82614d0b565b81815291506020808301908481018184028601820187101561366557600080fd5b60005b8481101561146857813584529282019290820190600101613668565b600082601f830112613694578081fd5b81516136a26134bd82614d0b565b8181529150602080830190848101818402860182018710156136c357600080fd5b60005b84811015611468578151845292820192908201906001016136c6565b80516001600160e01b0319811681146106aa57600080fd5b600082601f83011261370a578081fd5b81356137186134bd82614d2b565b915080825283602082850101111561372f57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613758578081fd5b81516137666134bd82614d2b565b915080825283602082850101111561377d57600080fd5b61146d816020840160208601614d4f565b8051600581106106aa57600080fd5b60006101c08083850312156137b0578182fd5b6137b981614ce4565b9150506137c68383613489565b81526137d58360208401613489565b60208201526137e78360408401613489565b60408201526137f98360608401613489565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561385b57600080fd5b613867868387016136fa565b8385015261016092508285013591508082111561388357600080fd5b61388f868387016136fa565b838501526101809250828501359150808211156138ab57600080fd5b6138b7868387016136fa565b838501526101a09250828501359150808211156138d357600080fd5b506138e0858286016136fa565b82840152505092915050565b60006101c08083850312156138ff578182fd5b61390881614ce4565b9150506139158383613494565b81526139248360208401613494565b60208201526139368360408401613494565b60408201526139488360608401613494565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156139aa57600080fd5b6139b686838701613748565b838501526101609250828501519150808211156139d257600080fd5b6139de86838701613748565b838501526101809250828501519150808211156139fa57600080fd5b613a0686838701613748565b838501526101a0925082850151915080821115613a2257600080fd5b506138e085828601613748565b600060208284031215613a40578081fd5b813561182781614d89565b60008060408385031215613a5d578081fd5b8235613a6881614d89565b9150602083013567ffffffffffffffff811115613a83578182fd5b613a8f8582860161350b565b9150509250929050565b60008060008060808587031215613aae578182fd5b8435613ab981614d89565b9350602085013567ffffffffffffffff80821115613ad5578384fd5b613ae188838901613626565b94506040870135915080821115613af6578384fd5b613b0288838901613626565b93506060870135915080821115613b17578283fd5b50613b24878288016136fa565b91505092959194509250565b60008060408385031215613b42578182fd5b8235613b4d81614d89565b9150602083013567ffffffffffffffff811115613b68578182fd5b613a8f858286016136fa565b600080600060608486031215613b88578081fd5b8335613b9381614d89565b9250602084013567ffffffffffffffff811115613bae578182fd5b613bba868287016136fa565b925050604084013590509250925092565b60008060408385031215613bdd578182fd5b8235613be881614d89565b946020939093013593505050565b600060208284031215613c07578081fd5b813567ffffffffffffffff811115613c1d578182fd5b6109118482850161349f565b60006020808385031215613c3b578182fd5b825167ffffffffffffffff811115613c51578283fd5b80840185601f820112613c62578384fd5b80519150613c726134bd83614d0b565b8281528381019082850185850284018601891015613c8e578687fd5b8693505b84841015613cb857613ca4898261378e565b835260019390930192918501918501613c92565b50979650505050505050565b600080600060608486031215613cd8578081fd5b833567ffffffffffffffff80821115613cef578283fd5b613cfb878388016135cb565b94506020860135915080821115613d10578283fd5b613d1c8783880161349f565b93506040860135915080821115613d31578283fd5b50613d3e86828701613626565b9150509250925092565b60008060408385031215613d5a578182fd5b823567ffffffffffffffff80821115613d71578384fd5b613d7d868387016135cb565b93506020850135915080821115613d92578283fd5b50613a8f8582860161350b565b60008060408385031215613db1578182fd5b823567ffffffffffffffff80821115613dc8578384fd5b613d7d86838701613626565b600060208284031215613de5578081fd5b81518015158114611827578182fd5b600060208284031215613e05578081fd5b61182783836136e2565b60008060408385031215613e21578182fd5b613e2b84846136e2565b91506020830151613e3b81614d89565b809150509250929050565b60008060008060808587031215613e5b578182fd5b8451613e6681614d9e565b6020860151909450613e7781614d89565b6040860151909350613e8881614d89565b606086015190925067ffffffffffffffff811115613ea4578182fd5b613b2487828801613748565b600080600080600060a08688031215613ec7578283fd5b613ed187876136e2565b94506020860151613ee181614d89565b604087015190945067ffffffffffffffff80821115613efe578485fd5b613f0a89838a01613684565b94506060880151915080821115613f1f578283fd5b613f2b89838a01613684565b93506080880151915080821115613f40578283fd5b50613f4d88828901613748565b9150509295509295909350565b60008060008060808587031215613f6f578182fd5b613f7986866136e2565b93506020850151613f8981614d89565b604086015190935067ffffffffffffffff811115613fa5578283fd5b613fb187828801613748565b606096909601519497939650505050565b600080600060608486031215613fd6578081fd5b613fe085856136e2565b92506020840151613ff081614d89565b80925050604084015190509250925092565b600080600060608486031215614016578081fd5b835161402181614d9e565b602085015190935067ffffffffffffffff8082111561403e578283fd5b61404a87838801613684565b9350604086015191508082111561405f578283fd5b50613d3e86828701613570565b60006020828403121561407d578081fd5b813567ffffffffffffffff811115614093578182fd5b610911848285016136fa565b6000602082840312156140b0578081fd5b815167ffffffffffffffff8111156140c6578182fd5b61091184828501613748565b6000602082840312156140e3578081fd5b815161182781614d89565b6000602082840312156140ff578081fd5b815160058110611827578182fd5b60008060008060808587031215614122578182fd5b845167ffffffffffffffff80821115614139578384fd5b61414588838901613748565b955060209150818701518181111561415b578485fd5b80880189601f82011261416c578586fd5b8051915061417c6134bd83614d0b565b82815284810190828601885b858110156141b15761419f8e8984518801016138ec565b84529287019290870190600101614188565b505060408b01519098509450505050808211156141cc578384fd5b6141d888838901613684565b935060608701519150808211156141ed578283fd5b50613b2487828801613570565b60006060828403121561420b578081fd5b6142156060614ce4565b825160078110614223578283fd5b8152602083810151908201526040928301519281019290925250919050565b600080600060608486031215614256578081fd5b833567ffffffffffffffff81111561426c578182fd5b6142788682870161379d565b935050602084013561428981614d89565b929592945050506040919091013590565b600080604083850312156142ac578182fd5b823567ffffffffffffffff808211156142c3578384fd5b6142cf8683870161379d565b935060208501359150808211156142e4578283fd5b50613a8f858286016136fa565b600080600060608486031215614305578081fd5b833567ffffffffffffffff81111561431b578182fd5b6143278682870161379d565b93505060208401359150604084013561433f81614d89565b809150509250925092565b60008060006060848603121561435e578081fd5b833567ffffffffffffffff80821115614375578283fd5b81860160a08189031215614387578384fd5b61439160a0614ce4565b925080358352602081013560208401526040810135604084015260608101356143b981614d89565b60608401526080810135828111156143cf578485fd5b6143db898284016136fa565b6080850152509194505050602084013591506143fa8560408601613489565b90509250925092565b600060208284031215614414578081fd5b5051919050565b1515815260200190565b6000614431838361453e565b505060600190565b6001600160a01b03169052565b6000815180845260208401935060208301825b828110156144805781516001600160a01b0316865260209586019590910190600101614459565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b848110156144d55782840388526144bf848351614512565b60209889019890945091909101906001016144a7565b50919695505050505050565b6000815180845260208401935060208301825b828110156144805781518652602095860195909101906001016144f4565b6000815180845261452a816020860160208601614d4f565b601f01601f19169290920160200192915050565b80516007811061454a57fe5b825260208181015190830152604090810151910152565b60006101c0614571848451614439565b60208301516145836020860182614439565b5060408301516145966040860182614439565b5060608301516145a96060860182614439565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e085015261010080840151818601525061012080840151818601525061014080840151828287015261460283870182614512565b9150506101609150818401518582038387015261461f8282614512565b92505050610180808401518583038287015261463b8382614512565b9150506101a0915081840151858203838701526146588282614512565b9695505050505050565b60008251614674818460208701614d4f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6000608082016001600160a01b03871683526080602084015280865180835260a08501915060a060208202860101925060208801845b82811015614731577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6087860301845261471c858351614561565b945060209384019391909101906001016146e2565b5050505082810360408401526147478186614446565b838103606085015261475981866144e1565b98975050505050505050565b60006001600160a01b03861682526080602083015261478760808301866144e1565b828103604084015261479981866144e1565b83810360608501526147598186614512565b60006001600160a01b0385168252606060208301526147cd6060830185614512565b9050826040830152949350505050565b60006001600160a01b038087168352608060208401526148006080840187614561565b94166040830152506060015292915050565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561486c57835161485881614d7f565b835260209384019390920191600101614845565b509095945050505050565b6000606082016060835280865161488e81846149cb565b9150602088019250835b818110156148bc576148ab838551614425565b602094909401939250600101614898565b505083810360208501526148d081876144e1565b91505082810360408401528084516148e881846149cb565b9150602086019250835b818110156149165761490583855161441b565b6020949094019392506001016148f2565b5090979650505050505050565b60006020825261182760208301846144e1565b60006040825261494960408301856144e1565b602083820381850152818551808452828401915082838202850101838801865b8381101561499757601f19878403018552614985838351614512565b94860194925090850190600101614969565b50909998505050505050505050565b6000604082526149b960408301856144e1565b82810360208401526118db81856144e1565b90815260200190565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b60006001600160e01b0319861682526001600160a01b038086166020840152808516604084015250608060608301526146586080830184614512565b60006001600160e01b0319871682526001600160a01b038616602083015260a06040830152614a7a60a08301866144e1565b8281036060840152614a8c81866144e1565b8381036080850152614a9e8186614512565b9998505050505050505050565b60006001600160e01b0319861682526001600160a01b038516602083015260806040830152614add6080830185614512565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b60006001600160e01b03198516825260606020830152614b3c60608301856144e1565b8281036040840152614658818561448a565b6000602082526118276020830184614512565b600060808252614b746080830187614512565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6060810160048510614bad57fe5b938152602081019290925260409091015290565b6060810160088510614bad57fe5b60208101614bdc83614d7f565b91905290565b600060808252614bf56080830187614512565b602083820381850152818751808452828401915082838202850101838a01865b83811015614c4357601f19878403018552614c31838351614561565b94860194925090850190600101614c15565b50508681036040880152614c57818a6144e1565b9450505050508281036060840152614c6f818561448a565b979650505050505050565b60a08101614c88828661453e565b8360608301528215156080830152949350505050565b6000602082526118276020830184614561565b600060408252614cc46040830185614561565b82810360208401526118db8185614512565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715614d0357600080fd5b604052919050565b600067ffffffffffffffff821115614d21578081fd5b5060209081020190565b600067ffffffffffffffff821115614d41578081fd5b50601f01601f191660200190565b60005b83811015614d6a578181015183820152602001614d52565b83811115614d79576000848401525b50505050565b6005811061073157fe5b6001600160a01b038116811461073157600080fd5b6001600160e01b03198116811461073157600080fdfea365627a7a72315820d5f953a2f0be372b5155353406d20980ed27dc327f638f1b56f5c24fc55036106c6578706572696d656e74616cf564736f6c63430005100040'; public static contractName = 'DevUtils'; private readonly _methodABIIndex: { [name: string]: number } = {}; public static async deployFrom0xArtifactAsync( @@ -49,8 +50,8 @@ export class DevUtilsContract extends BaseContract { supportedProvider: SupportedProvider, txDefaults: Partial, logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact }, - _exchange: string, - _chaiBridge: string, + exchange_: string, + chaiBridge_: string, ): Promise { assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ schemas.addressSchema, @@ -75,8 +76,8 @@ export class DevUtilsContract extends BaseContract { provider, txDefaults, logDecodeDependenciesAbiOnly, - _exchange, - _chaiBridge, + exchange_, + chaiBridge_, ); } @@ -86,8 +87,8 @@ export class DevUtilsContract extends BaseContract { supportedProvider: SupportedProvider, txDefaults: Partial, logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact }, - _exchange: string, - _chaiBridge: string, + exchange_: string, + chaiBridge_: string, ): Promise { assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ schemas.addressSchema, @@ -118,8 +119,8 @@ export class DevUtilsContract extends BaseContract { provider, txDefaults, logDecodeDependenciesAbiOnly, - _exchange, - _chaiBridge, + exchange_, + chaiBridge_, ); } @@ -129,8 +130,8 @@ export class DevUtilsContract extends BaseContract { supportedProvider: SupportedProvider, txDefaults: Partial, logDecodeDependencies: { [contractName: string]: ContractAbi }, - _exchange: string, - _chaiBridge: string, + exchange_: string, + chaiBridge_: string, ): Promise { assert.isHexString('bytecode', bytecode); assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ @@ -140,14 +141,14 @@ export class DevUtilsContract extends BaseContract { ]); const provider = providerUtils.standardizeOrThrow(supportedProvider); const constructorAbi = BaseContract._lookupConstructorAbi(abi); - [_exchange, _chaiBridge] = BaseContract._formatABIDataItemList( + [exchange_, chaiBridge_] = BaseContract._formatABIDataItemList( constructorAbi.inputs, - [_exchange, _chaiBridge], + [exchange_, chaiBridge_], BaseContract._bigNumberToString, ); const iface = new ethers.utils.Interface(abi); const deployInfo = iface.deployFunction; - const txData = deployInfo.encode(bytecode, [_exchange, _chaiBridge]); + const txData = deployInfo.encode(bytecode, [exchange_, chaiBridge_]); const web3Wrapper = new Web3Wrapper(provider); const txDataWithDefaults = await BaseContract._applyDefaultsToContractTxDataAsync( { @@ -166,7 +167,7 @@ export class DevUtilsContract extends BaseContract { txDefaults, logDecodeDependencies, ); - contractInstance.constructorArgs = [_exchange, _chaiBridge]; + contractInstance.constructorArgs = [exchange_, chaiBridge_]; return contractInstance; } @@ -178,11 +179,11 @@ export class DevUtilsContract extends BaseContract { { inputs: [ { - name: '_exchange', + name: 'exchange_', type: 'address', }, { - name: '_chaiBridge', + name: 'chaiBridge_', type: 'address', }, ], @@ -207,52 +208,16 @@ export class DevUtilsContract extends BaseContract { }, { constant: true, - inputs: [ - { - name: 'encoded', - type: 'bytes', - }, - ], - name: 'decodeAssetProxyDispatchError', + inputs: [], + name: 'chaiBridgeAddress', outputs: [ { - name: 'errorCode', - type: 'uint8', - }, - { - name: 'orderHash', - type: 'bytes32', - }, - { - name: 'assetData', - type: 'bytes', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'encoded', - type: 'bytes', - }, - ], - name: 'decodeAssetProxyExistsError', - outputs: [ - { - name: 'assetProxyId', - type: 'bytes4', - }, - { - name: 'assetProxyAddress', + name: '', type: 'address', }, ], payable: false, - stateMutability: 'pure', + stateMutability: 'view', type: 'function', }, { @@ -274,64 +239,6 @@ export class DevUtilsContract extends BaseContract { stateMutability: 'pure', type: 'function', }, - { - constant: true, - inputs: [ - { - name: 'encoded', - type: 'bytes', - }, - ], - name: 'decodeAssetProxyTransferError', - outputs: [ - { - name: 'orderHash', - type: 'bytes32', - }, - { - name: 'assetData', - type: 'bytes', - }, - { - name: 'errorData', - type: 'bytes', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'encoded', - type: 'bytes', - }, - ], - name: 'decodeEIP1271SignatureError', - outputs: [ - { - name: 'verifyingContractAddress', - type: 'address', - }, - { - name: 'data', - type: 'bytes', - }, - { - name: 'signature', - type: 'bytes', - }, - { - name: 'errorData', - type: 'bytes', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, { constant: true, inputs: [ @@ -448,83 +355,6 @@ export class DevUtilsContract extends BaseContract { stateMutability: 'pure', type: 'function', }, - { - constant: true, - inputs: [ - { - name: 'encoded', - type: 'bytes', - }, - ], - name: 'decodeExchangeInvalidContextError', - outputs: [ - { - name: 'errorCode', - type: 'uint8', - }, - { - name: 'orderHash', - type: 'bytes32', - }, - { - name: 'contextAddress', - type: 'address', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'encoded', - type: 'bytes', - }, - ], - name: 'decodeFillError', - outputs: [ - { - name: 'errorCode', - type: 'uint8', - }, - { - name: 'orderHash', - type: 'bytes32', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'encoded', - type: 'bytes', - }, - ], - name: 'decodeIncompleteFillError', - outputs: [ - { - name: 'errorCode', - type: 'uint8', - }, - { - name: 'expectedAssetFillAmount', - type: 'uint256', - }, - { - name: 'actualAssetFillAmount', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, { constant: true, inputs: [ @@ -552,164 +382,6 @@ export class DevUtilsContract extends BaseContract { stateMutability: 'pure', type: 'function', }, - { - constant: true, - inputs: [ - { - name: 'encoded', - type: 'bytes', - }, - ], - name: 'decodeNegativeSpreadError', - outputs: [ - { - name: 'leftOrderHash', - type: 'bytes32', - }, - { - name: 'rightOrderHash', - type: 'bytes32', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'encoded', - type: 'bytes', - }, - ], - name: 'decodeOrderEpochError', - outputs: [ - { - name: 'makerAddress', - type: 'address', - }, - { - name: 'orderSenderAddress', - type: 'address', - }, - { - name: 'currentEpoch', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'encoded', - type: 'bytes', - }, - ], - name: 'decodeOrderStatusError', - outputs: [ - { - name: 'orderHash', - type: 'bytes32', - }, - { - name: 'orderStatus', - type: 'uint8', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'encoded', - type: 'bytes', - }, - ], - name: 'decodeSignatureError', - outputs: [ - { - name: 'errorCode', - type: 'uint8', - }, - { - name: 'hash', - type: 'bytes32', - }, - { - name: 'signerAddress', - type: 'address', - }, - { - name: 'signature', - type: 'bytes', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'encoded', - type: 'bytes', - }, - ], - name: 'decodeSignatureValidatorNotApprovedError', - outputs: [ - { - name: 'signerAddress', - type: 'address', - }, - { - name: 'validatorAddress', - type: 'address', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'encoded', - type: 'bytes', - }, - ], - name: 'decodeSignatureWalletError', - outputs: [ - { - name: 'hash', - type: 'bytes32', - }, - { - name: 'signerAddress', - type: 'address', - }, - { - name: 'signature', - type: 'bytes', - }, - { - name: 'errorData', - type: 'bytes', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, { constant: true, inputs: [ @@ -745,42 +417,85 @@ export class DevUtilsContract extends BaseContract { constant: true, inputs: [ { - name: 'encoded', + name: 'transactionData', type: 'bytes', }, ], - name: 'decodeTransactionError', + name: 'decodeZeroExTransactionData', outputs: [ { - name: 'errorCode', - type: 'uint8', + name: 'functionName', + type: 'string', }, { - name: 'transactionHash', - type: 'bytes32', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'encoded', - type: 'bytes', - }, - ], - name: 'decodeTransactionExecutionError', - outputs: [ - { - name: 'transactionHash', - type: 'bytes32', + name: 'orders', + type: 'tuple[]', + components: [ + { + name: 'makerAddress', + type: 'address', + }, + { + name: 'takerAddress', + type: 'address', + }, + { + name: 'feeRecipientAddress', + type: 'address', + }, + { + name: 'senderAddress', + type: 'address', + }, + { + name: 'makerAssetAmount', + type: 'uint256', + }, + { + name: 'takerAssetAmount', + type: 'uint256', + }, + { + name: 'makerFee', + type: 'uint256', + }, + { + name: 'takerFee', + type: 'uint256', + }, + { + name: 'expirationTimeSeconds', + type: 'uint256', + }, + { + name: 'salt', + type: 'uint256', + }, + { + name: 'makerAssetData', + type: 'bytes', + }, + { + name: 'takerAssetData', + type: 'bytes', + }, + { + name: 'makerFeeAssetData', + type: 'bytes', + }, + { + name: 'takerFeeAssetData', + type: 'bytes', + }, + ], }, { - name: 'errorData', - type: 'bytes', + name: 'takerAssetFillAmounts', + type: 'uint256[]', + }, + { + name: 'signatures', + type: 'bytes[]', }, ], payable: false, @@ -910,6 +625,62 @@ export class DevUtilsContract extends BaseContract { stateMutability: 'pure', type: 'function', }, + { + constant: true, + inputs: [], + name: 'erc1155ProxyAddress', + outputs: [ + { + name: '', + type: 'address', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'erc20ProxyAddress', + outputs: [ + { + name: '', + type: 'address', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'erc721ProxyAddress', + outputs: [ + { + name: '', + type: 'address', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'exchangeAddress', + outputs: [ + { + name: '', + type: 'address', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, { constant: false, inputs: [ @@ -1707,6 +1478,20 @@ export class DevUtilsContract extends BaseContract { stateMutability: 'pure', type: 'function', }, + { + constant: true, + inputs: [], + name: 'staticCallProxyAddress', + outputs: [ + { + name: '', + type: 'address', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, ] as ContractAbi; return abi; } @@ -1806,68 +1591,23 @@ export class DevUtilsContract extends BaseContract { }, }; } - /** - * Decompose an ABI-encoded AssetProxyDispatchError. - * @param encoded ABI-encoded revert error. - * @returns errorCode The error code.orderHash Hash of the order being dispatched.assetData Asset data of the order being dispatched. - */ - public decodeAssetProxyDispatchError(encoded: string): ContractFunctionObj<[number, string, string]> { + public chaiBridgeAddress(): ContractFunctionObj { const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeAssetProxyDispatchError(bytes)'; + const functionSignature = 'chaiBridgeAddress()'; return { - async callAsync( - callData: Partial = {}, - defaultBlock?: BlockParam, - ): Promise<[number, string, string]> { + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[number, string, string]>(rawCallResult); + return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); - }, - }; - } - /** - * Decompose an ABI-encoded AssetProxyExistsError. - * @param encoded ABI-encoded revert error. - * @returns assetProxyId Id of asset proxy.assetProxyAddress The address of the asset proxy. - */ - public decodeAssetProxyExistsError(encoded: string): ContractFunctionObj<[string, string]> { - const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeAssetProxyExistsError(bytes)'; - - return { - async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise<[string, string]> { - BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[string, string]>(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); + return self._strictEncodeArguments(functionSignature, []); }, }; } @@ -1903,74 +1643,6 @@ export class DevUtilsContract extends BaseContract { }, }; } - /** - * Decompose an ABI-encoded AssetProxyTransferError. - * @param encoded ABI-encoded revert error. - * @returns orderHash Hash of the order being dispatched.assetData Asset data of the order being dispatched.errorData ABI-encoded revert data from the asset proxy. - */ - public decodeAssetProxyTransferError(encoded: string): ContractFunctionObj<[string, string, string]> { - const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeAssetProxyTransferError(bytes)'; - - return { - async callAsync( - callData: Partial = {}, - defaultBlock?: BlockParam, - ): Promise<[string, string, string]> { - BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[string, string, string]>(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); - }, - }; - } - /** - * Decompose an ABI-encoded SignatureValidatorError. - * @param encoded ABI-encoded revert error. - * @returns signerAddress The expected signer of the hash.signature The full signature bytes.errorData The revert data thrown by the validator contract. - */ - public decodeEIP1271SignatureError(encoded: string): ContractFunctionObj<[string, string, string, string]> { - const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeEIP1271SignatureError(bytes)'; - - return { - async callAsync( - callData: Partial = {}, - defaultBlock?: BlockParam, - ): Promise<[string, string, string, string]> { - BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[string, string, string, string]>(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); - }, - }; - } /** * Decode ERC-1155 asset data from the format described in the AssetProxy contract specification. * @param assetData AssetProxy-compliant asset data describing an ERC-1155 set @@ -2111,105 +1783,6 @@ export class DevUtilsContract extends BaseContract { }, }; } - /** - * Decompose an ABI-encoded OrderStatusError. - * @param encoded ABI-encoded revert error. - * @returns errorCode Error code that corresponds to invalid maker, taker, or sender.orderHash The order hash.contextAddress The maker, taker, or sender address - */ - public decodeExchangeInvalidContextError(encoded: string): ContractFunctionObj<[number, string, string]> { - const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeExchangeInvalidContextError(bytes)'; - - return { - async callAsync( - callData: Partial = {}, - defaultBlock?: BlockParam, - ): Promise<[number, string, string]> { - BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[number, string, string]>(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); - }, - }; - } - /** - * Decompose an ABI-encoded FillError. - * @param encoded ABI-encoded revert error. - * @returns errorCode The error code.orderHash The order hash. - */ - public decodeFillError(encoded: string): ContractFunctionObj<[number, string]> { - const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeFillError(bytes)'; - - return { - async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise<[number, string]> { - BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[number, string]>(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); - }, - }; - } - /** - * Decompose an ABI-encoded IncompleteFillError. - * @param encoded ABI-encoded revert error. - * @returns orderHash Hash of the order being filled. - */ - public decodeIncompleteFillError(encoded: string): ContractFunctionObj<[number, BigNumber, BigNumber]> { - const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeIncompleteFillError(bytes)'; - - return { - async callAsync( - callData: Partial = {}, - defaultBlock?: BlockParam, - ): Promise<[number, BigNumber, BigNumber]> { - BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[number, BigNumber, BigNumber]>(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); - }, - }; - } /** * Decode multi-asset data from the format described in the AssetProxy contract specification. * @param assetData AssetProxy-compliant data describing a multi-asset basket. @@ -2244,201 +1817,6 @@ export class DevUtilsContract extends BaseContract { }, }; } - /** - * Decompose an ABI-encoded NegativeSpreadError. - * @param encoded ABI-encoded revert error. - * @returns leftOrderHash Hash of the left order being matched.rightOrderHash Hash of the right order being matched. - */ - public decodeNegativeSpreadError(encoded: string): ContractFunctionObj<[string, string]> { - const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeNegativeSpreadError(bytes)'; - - return { - async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise<[string, string]> { - BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[string, string]>(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); - }, - }; - } - /** - * Decompose an ABI-encoded OrderEpochError. - * @param encoded ABI-encoded revert error. - * @returns makerAddress The order maker.orderSenderAddress The order sender.currentEpoch The current epoch for the maker. - */ - public decodeOrderEpochError(encoded: string): ContractFunctionObj<[string, string, BigNumber]> { - const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeOrderEpochError(bytes)'; - - return { - async callAsync( - callData: Partial = {}, - defaultBlock?: BlockParam, - ): Promise<[string, string, BigNumber]> { - BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[string, string, BigNumber]>(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); - }, - }; - } - /** - * Decompose an ABI-encoded OrderStatusError. - * @param encoded ABI-encoded revert error. - * @returns orderHash The order hash.orderStatus The order status. - */ - public decodeOrderStatusError(encoded: string): ContractFunctionObj<[string, number]> { - const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeOrderStatusError(bytes)'; - - return { - async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise<[string, number]> { - BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[string, number]>(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); - }, - }; - } - /** - * Decompose an ABI-encoded SignatureError. - * @param encoded ABI-encoded revert error. - * @returns errorCode The error code.signerAddress The expected signer of the hash.signature The full signature. - */ - public decodeSignatureError(encoded: string): ContractFunctionObj<[number, string, string, string]> { - const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeSignatureError(bytes)'; - - return { - async callAsync( - callData: Partial = {}, - defaultBlock?: BlockParam, - ): Promise<[number, string, string, string]> { - BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[number, string, string, string]>(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); - }, - }; - } - /** - * Decompose an ABI-encoded SignatureValidatorNotApprovedError. - * @param encoded ABI-encoded revert error. - * @returns signerAddress The expected signer of the hash.validatorAddress The expected validator. - */ - public decodeSignatureValidatorNotApprovedError(encoded: string): ContractFunctionObj<[string, string]> { - const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeSignatureValidatorNotApprovedError(bytes)'; - - return { - async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise<[string, string]> { - BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[string, string]>(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); - }, - }; - } - /** - * Decompose an ABI-encoded SignatureWalletError. - * @param encoded ABI-encoded revert error. - * @returns errorCode The error code.signerAddress The expected signer of the hash.signature The full signature bytes.errorData The revert data thrown by the validator contract. - */ - public decodeSignatureWalletError(encoded: string): ContractFunctionObj<[string, string, string, string]> { - const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeSignatureWalletError(bytes)'; - - return { - async callAsync( - callData: Partial = {}, - defaultBlock?: BlockParam, - ): Promise<[string, string, string, string]> { - BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[string, string, string, string]>(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); - }, - }; - } /** * Decode StaticCall asset data from the format described in the AssetProxy contract specification. * @param assetData AssetProxy-compliant asset data describing a StaticCall @@ -2475,17 +1853,67 @@ export class DevUtilsContract extends BaseContract { }; } /** - * Decompose an ABI-encoded TransactionError. - * @param encoded ABI-encoded revert error. - * @returns errorCode The error code.transactionHash Hash of the transaction. + * Decodes the call data for an Exchange contract method call. + * @param transactionData ABI-encoded calldata for an Exchange contract + * method call. + * @returns The name of the function called, and the parameters it was given. For single-order fills and cancels, the arrays will have just one element. */ - public decodeTransactionError(encoded: string): ContractFunctionObj<[number, string]> { + public decodeZeroExTransactionData( + transactionData: string, + ): ContractFunctionObj< + [ + string, + Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + makerFeeAssetData: string; + takerFeeAssetData: string; + }>, + BigNumber[], + string[] + ] + > { const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeTransactionError(bytes)'; + assert.isString('transactionData', transactionData); + const functionSignature = 'decodeZeroExTransactionData(bytes)'; return { - async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise<[number, string]> { + async callAsync( + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise< + [ + string, + Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + makerFeeAssetData: string; + takerFeeAssetData: string; + }>, + BigNumber[], + string[] + ] + > { BaseContract._assertCallParams(callData, defaultBlock); let rawCallResult; if (self._deployedBytecodeIfExists) { @@ -2498,41 +1926,32 @@ export class DevUtilsContract extends BaseContract { } const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[number, string]>(rawCallResult); + return abiEncoder.strictDecodeReturnValue< + [ + string, + Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + makerFeeAssetData: string; + takerFeeAssetData: string; + }>, + BigNumber[], + string[] + ] + >(rawCallResult); }, getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); - }, - }; - } - /** - * Decompose an ABI-encoded TransactionExecutionError. - * @param encoded ABI-encoded revert error. - * @returns transactionHash Hash of the transaction.errorData Error thrown by exeucteTransaction(). - */ - public decodeTransactionExecutionError(encoded: string): ContractFunctionObj<[string, string]> { - const self = (this as any) as DevUtilsContract; - assert.isString('encoded', encoded); - const functionSignature = 'decodeTransactionExecutionError(bytes)'; - - return { - async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise<[string, string]> { - BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue<[string, string]>(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [encoded]); + return self._strictEncodeArguments(functionSignature, [transactionData]); }, }; } @@ -2730,6 +2149,86 @@ export class DevUtilsContract extends BaseContract { }, }; } + public erc1155ProxyAddress(): ContractFunctionObj { + const self = (this as any) as DevUtilsContract; + const functionSignature = 'erc1155ProxyAddress()'; + + return { + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, []); + }, + }; + } + public erc20ProxyAddress(): ContractFunctionObj { + const self = (this as any) as DevUtilsContract; + const functionSignature = 'erc20ProxyAddress()'; + + return { + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, []); + }, + }; + } + public erc721ProxyAddress(): ContractFunctionObj { + const self = (this as any) as DevUtilsContract; + const functionSignature = 'erc721ProxyAddress()'; + + return { + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, []); + }, + }; + } + public exchangeAddress(): ContractFunctionObj { + const self = (this as any) as DevUtilsContract; + const functionSignature = 'exchangeAddress()'; + + return { + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, []); + }, + }; + } /** * Returns the number of asset(s) (described by assetData) that the corresponding AssetProxy contract is authorized to spend. When the asset data contains multiple assets (eg for Multi-Asset), the return value indicates how many complete "baskets" of those assets may be spent by all of the corresponding AssetProxy contracts. * @param ownerAddress Owner of the assets specified by assetData. @@ -3609,7 +3108,7 @@ export class DevUtilsContract extends BaseContract { }; } /** - * Gets the amount of an asset transferable by the owner. + * Gets the amount of an asset transferable by the maker of an order. * @param ownerAddress Address of the owner of the asset. * @param assetData Description of tokens, per the AssetProxy contract * specification. @@ -3693,6 +3192,26 @@ export class DevUtilsContract extends BaseContract { }, }; } + public staticCallProxyAddress(): ContractFunctionObj { + const self = (this as any) as DevUtilsContract; + const functionSignature = 'staticCallProxyAddress()'; + + return { + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, []); + }, + }; + } constructor( address: string, diff --git a/packages/contract-wrappers/src/generated-wrappers/erc20_token.ts b/packages/contract-wrappers/src/generated-wrappers/erc20_token.ts index 02f831b38b..0a10c06517 100644 --- a/packages/contract-wrappers/src/generated-wrappers/erc20_token.ts +++ b/packages/contract-wrappers/src/generated-wrappers/erc20_token.ts @@ -55,6 +55,7 @@ export interface ERC20TokenTransferEventArgs extends DecodedLogArgs { } /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class ERC20TokenContract extends BaseContract { diff --git a/packages/contract-wrappers/src/generated-wrappers/erc721_token.ts b/packages/contract-wrappers/src/generated-wrappers/erc721_token.ts index e51818dc2b..6e97f136fe 100644 --- a/packages/contract-wrappers/src/generated-wrappers/erc721_token.ts +++ b/packages/contract-wrappers/src/generated-wrappers/erc721_token.ts @@ -65,6 +65,7 @@ export interface ERC721TokenTransferEventArgs extends DecodedLogArgs { } /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class ERC721TokenContract extends BaseContract { diff --git a/packages/contract-wrappers/src/generated-wrappers/exchange.ts b/packages/contract-wrappers/src/generated-wrappers/exchange.ts index a39c898884..3b5de54cee 100644 --- a/packages/contract-wrappers/src/generated-wrappers/exchange.ts +++ b/packages/contract-wrappers/src/generated-wrappers/exchange.ts @@ -121,6 +121,7 @@ export interface ExchangeTransactionExecutionEventArgs extends DecodedLogArgs { } /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class ExchangeContract extends BaseContract { diff --git a/packages/contract-wrappers/src/generated-wrappers/forwarder.ts b/packages/contract-wrappers/src/generated-wrappers/forwarder.ts index 1c602bc852..31b4e175a1 100644 --- a/packages/contract-wrappers/src/generated-wrappers/forwarder.ts +++ b/packages/contract-wrappers/src/generated-wrappers/forwarder.ts @@ -47,6 +47,7 @@ export interface ForwarderOwnershipTransferredEventArgs extends DecodedLogArgs { } /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class ForwarderContract extends BaseContract { @@ -238,6 +239,34 @@ export class ForwarderContract extends BaseContract { stateMutability: 'payable', type: 'fallback', }, + { + constant: true, + inputs: [], + name: 'ERC1155_BATCH_RECEIVED', + outputs: [ + { + name: '', + type: 'bytes4', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'ERC1155_RECEIVED', + outputs: [ + { + name: '', + type: 'bytes4', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, { constant: true, inputs: [], @@ -456,6 +485,76 @@ export class ForwarderContract extends BaseContract { stateMutability: 'payable', type: 'function', }, + { + constant: false, + inputs: [ + { + name: 'operator', + type: 'address', + }, + { + name: 'from', + type: 'address', + }, + { + name: 'ids', + type: 'uint256[]', + }, + { + name: 'values', + type: 'uint256[]', + }, + { + name: 'data', + type: 'bytes', + }, + ], + name: 'onERC1155BatchReceived', + outputs: [ + { + name: '', + type: 'bytes4', + }, + ], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + { + constant: false, + inputs: [ + { + name: 'operator', + type: 'address', + }, + { + name: 'from', + type: 'address', + }, + { + name: 'id', + type: 'uint256', + }, + { + name: 'value', + type: 'uint256', + }, + { + name: 'data', + type: 'bytes', + }, + ], + name: 'onERC1155Received', + outputs: [ + { + name: '', + type: 'bytes4', + }, + ], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, { constant: true, inputs: [], @@ -581,6 +680,46 @@ export class ForwarderContract extends BaseContract { return abiEncoder.getSelector(); } + public ERC1155_BATCH_RECEIVED(): ContractFunctionObj { + const self = (this as any) as ForwarderContract; + const functionSignature = 'ERC1155_BATCH_RECEIVED()'; + + return { + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, []); + }, + }; + } + public ERC1155_RECEIVED(): ContractFunctionObj { + const self = (this as any) as ForwarderContract; + const functionSignature = 'ERC1155_RECEIVED()'; + + return { + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, []); + }, + }; + } public EXCHANGE_V2_ORDER_ID(): ContractFunctionObj { const self = (this as any) as ForwarderContract; const functionSignature = 'EXCHANGE_V2_ORDER_ID()'; @@ -842,6 +981,150 @@ export class ForwarderContract extends BaseContract { }, }; } + /** + * The smart contract calls this function on the recipient after a `safeTransferFrom`. This function MAY throw to revert and reject the transfer. Return of other than the magic value MUST result in the transaction being reverted Note: the contract address is always the message sender + * @param operator The address which called `safeTransferFrom` function + * @param from The address which previously owned the token + * @param ids An array containing ids of each token being transferred + * @param values An array containing amounts of each token being transferred + * @param data Additional data with no specified format + * @returns `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` + */ + public onERC1155BatchReceived( + operator: string, + from: string, + ids: BigNumber[], + values: BigNumber[], + data: string, + ): ContractTxFunctionObj { + const self = (this as any) as ForwarderContract; + assert.isString('operator', operator); + assert.isString('from', from); + assert.isArray('ids', ids); + assert.isArray('values', values); + assert.isString('data', data); + const functionSignature = 'onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)'; + + return { + async sendTransactionAsync( + txData?: Partial | undefined, + opts: SendTransactionOpts = { shouldValidate: true }, + ): Promise { + const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( + { ...txData, data: this.getABIEncodedTransactionData() }, + this.estimateGasAsync.bind(this), + ); + if (opts.shouldValidate !== false) { + await this.callAsync(txDataWithDefaults); + } + return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); + }, + awaitTransactionSuccessAsync( + txData?: Partial, + opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, + ): PromiseWithTransactionHash { + return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); + }, + async estimateGasAsync(txData?: Partial | undefined): Promise { + const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ + ...txData, + data: this.getABIEncodedTransactionData(), + }); + return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); + }, + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, [ + operator.toLowerCase(), + from.toLowerCase(), + ids, + values, + data, + ]); + }, + }; + } + /** + * The smart contract calls this function on the recipient after a `safeTransferFrom`. This function MAY throw to revert and reject the transfer. Return of other than the magic value MUST result in the transaction being reverted Note: the contract address is always the message sender + * @param operator The address which called `safeTransferFrom` function + * @param from The address which previously owned the token + * @param id An array containing the ids of the token being transferred + * @param value An array containing the amount of tokens being transferred + * @param data Additional data with no specified format + * @returns `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` + */ + public onERC1155Received( + operator: string, + from: string, + id: BigNumber, + value: BigNumber, + data: string, + ): ContractTxFunctionObj { + const self = (this as any) as ForwarderContract; + assert.isString('operator', operator); + assert.isString('from', from); + assert.isBigNumber('id', id); + assert.isBigNumber('value', value); + assert.isString('data', data); + const functionSignature = 'onERC1155Received(address,address,uint256,uint256,bytes)'; + + return { + async sendTransactionAsync( + txData?: Partial | undefined, + opts: SendTransactionOpts = { shouldValidate: true }, + ): Promise { + const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( + { ...txData, data: this.getABIEncodedTransactionData() }, + this.estimateGasAsync.bind(this), + ); + if (opts.shouldValidate !== false) { + await this.callAsync(txDataWithDefaults); + } + return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); + }, + awaitTransactionSuccessAsync( + txData?: Partial, + opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, + ): PromiseWithTransactionHash { + return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); + }, + async estimateGasAsync(txData?: Partial | undefined): Promise { + const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ + ...txData, + data: this.getABIEncodedTransactionData(), + }); + return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); + }, + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, [ + operator.toLowerCase(), + from.toLowerCase(), + id, + value, + data, + ]); + }, + }; + } public owner(): ContractFunctionObj { const self = (this as any) as ForwarderContract; const functionSignature = 'owner()'; diff --git a/packages/contract-wrappers/src/generated-wrappers/i_asset_data.ts b/packages/contract-wrappers/src/generated-wrappers/i_asset_data.ts index 4be8521cf0..720383f44a 100644 --- a/packages/contract-wrappers/src/generated-wrappers/i_asset_data.ts +++ b/packages/contract-wrappers/src/generated-wrappers/i_asset_data.ts @@ -34,6 +34,7 @@ import * as ethers from 'ethers'; // tslint:enable:no-unused-variable /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class IAssetDataContract extends BaseContract { diff --git a/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts b/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts index 802bd42e58..d6d7b1085c 100644 --- a/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts +++ b/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts @@ -34,6 +34,7 @@ import * as ethers from 'ethers'; // tslint:enable:no-unused-variable /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class IERC20BridgeSamplerContract extends BaseContract { @@ -952,7 +953,7 @@ export class IERC20BridgeSamplerContract extends BaseContract { * @returns ordersAndSamples How much taker asset can be filled by each order in `orders`. Taker amounts sold for each source at each maker token amount. First indexed by source index, then sample index */ public queryBatchOrdersAndSampleBuys( - orders: Array>, + }>[], orderSignatures: string[][], sources: string[], makerTokenAmounts: BigNumber[][], @@ -1017,7 +1018,7 @@ export class IERC20BridgeSamplerContract extends BaseContract { * @returns ordersAndSamples How much taker asset can be filled by each order in `orders`. Maker amounts bought for each source at each taker token amount. First indexed by source index, then sample index. */ public queryBatchOrdersAndSampleSells( - orders: Array>, + }>[], orderSignatures: string[][], sources: string[], takerTokenAmounts: BigNumber[][], diff --git a/packages/contract-wrappers/src/generated-wrappers/lib_transaction_decoder.ts b/packages/contract-wrappers/src/generated-wrappers/lib_transaction_decoder.ts deleted file mode 100644 index ea9b0ebe19..0000000000 --- a/packages/contract-wrappers/src/generated-wrappers/lib_transaction_decoder.ts +++ /dev/null @@ -1,464 +0,0 @@ -// tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma enum-naming -// tslint:disable:whitespace no-unbound-method no-trailing-whitespace -// tslint:disable:no-unused-variable -import { - AwaitTransactionSuccessOpts, - ContractFunctionObj, - ContractTxFunctionObj, - SendTransactionOpts, - BaseContract, - PromiseWithTransactionHash, - methodAbiToFunctionSignature, - linkLibrariesInBytecode, -} from '@0x/base-contract'; -import { schemas } from '@0x/json-schemas'; -import { - BlockParam, - BlockParamLiteral, - BlockRange, - CallData, - ContractAbi, - ContractArtifact, - DecodedLogArgs, - MethodAbi, - TransactionReceiptWithDecodedLogs, - TxData, - TxDataPayable, - SupportedProvider, -} from 'ethereum-types'; -import { BigNumber, classUtils, hexUtils, logUtils, providerUtils } from '@0x/utils'; -import { EventCallback, IndexedFilterValues, SimpleContractArtifact } from '@0x/types'; -import { Web3Wrapper } from '@0x/web3-wrapper'; -import { assert } from '@0x/assert'; -import * as ethers from 'ethers'; -// tslint:enable:no-unused-variable - -/* istanbul ignore next */ -// tslint:disable:no-parameter-reassignment -// tslint:disable-next-line:class-name -export class LibTransactionDecoderContract extends BaseContract { - /** - * @ignore - */ - public static deployedBytecode = - '0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80636f83188e14610030575b600080fd5b61004361003e3660046113f4565b61005c565b604051610053949392919061176e565b60405180910390f35b60608080806000610073868263ffffffff610ba616565b90506001600160e01b031981167fdedfc1f10000000000000000000000000000000000000000000000000000000014156100e4576040518060400160405280601181526020017f626174636843616e63656c4f7264657273000000000000000000000000000000815250945061067c565b6001600160e01b031981167f9694a402000000000000000000000000000000000000000000000000000000001415610153576040518060400160405280600f81526020017f626174636846696c6c4f72646572730000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f8ea8dfe40000000000000000000000000000000000000000000000000000000014156101c2576040518060400160405280601681526020017f626174636846696c6c4f72646572734e6f5468726f7700000000000000000000815250945061067c565b6001600160e01b031981167fbeee2e14000000000000000000000000000000000000000000000000000000001415610231576040518060400160405280601581526020017f626174636846696c6c4f724b696c6c4f72646572730000000000000000000000815250945061067c565b6001600160e01b031981167f2da629870000000000000000000000000000000000000000000000000000000014156102a0576040518060400160405280600b81526020017f63616e63656c4f72646572000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f9b44d55600000000000000000000000000000000000000000000000000000000141561030f576040518060400160405280600981526020017f66696c6c4f726465720000000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167fe14b58c400000000000000000000000000000000000000000000000000000000141561037e576040518060400160405280600f81526020017f66696c6c4f724b696c6c4f726465720000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f78d29ac10000000000000000000000000000000000000000000000000000000014156103ed576040518060400160405280601681526020017f6d61726b65744275794f72646572734e6f5468726f7700000000000000000000815250945061067c565b6001600160e01b031981167f369da09900000000000000000000000000000000000000000000000000000000141561045c576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f77000000000000000000815250945061067c565b6001600160e01b031981167f8bc8efb30000000000000000000000000000000000000000000000000000000014156104cb576040518060400160405280601981526020017f6d61726b65744275794f726465727346696c6c4f724b696c6c00000000000000815250945061067c565b6001600160e01b031981167fa6c3bf3300000000000000000000000000000000000000000000000000000000141561053a576040518060400160405280601a81526020017f6d61726b657453656c6c4f726465727346696c6c4f724b696c6c000000000000815250945061067c565b6001600160e01b031981167f88ec79fb0000000000000000000000000000000000000000000000000000000014156105a9576040518060400160405280600b81526020017f6d617463684f7264657273000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f4f9559b100000000000000000000000000000000000000000000000000000000148061060a57506001600160e01b031981167f2280c91000000000000000000000000000000000000000000000000000000000145b1561064a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061186d565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190611836565b6001600160e01b031981167fdedfc1f10000000000000000000000000000000000000000000000000000000014156107215785516106c490879060049063ffffffff610be916565b8060200190516106d79190810190611289565b604080516000808252602082019092529195505b5060408051600080825260208201909252919450610719565b60608152602001906001900390816107045790505b509150610b9e565b6001600160e01b031981167fbeee2e1400000000000000000000000000000000000000000000000000000000148061078257506001600160e01b031981167f9694a40200000000000000000000000000000000000000000000000000000000145b806107b657506001600160e01b031981167f8ea8dfe400000000000000000000000000000000000000000000000000000000145b156107d0576107c486610c70565b91955093509150610b9e565b6001600160e01b031981167f2da629870000000000000000000000000000000000000000000000000000000014156108b85760408051600180825281830190925290816020015b61081f610f3d565b815260200190600190039081610817575050865190945061084a90879060049063ffffffff610be916565b80602001905161085d919081019061146b565b8460008151811061086a57fe5b602002602001018190525060006040519080825280602002602001820160405280156106eb578160200160208202803883390190505060408051600080825260208201909252919450610719565b6001600160e01b031981167fe14b58c400000000000000000000000000000000000000000000000000000000148061091957506001600160e01b031981167f9b44d55600000000000000000000000000000000000000000000000000000000145b15610927576107c486610cac565b6001600160e01b031981167f78d29ac100000000000000000000000000000000000000000000000000000000148061098857506001600160e01b031981167f369da09900000000000000000000000000000000000000000000000000000000145b806109bc57506001600160e01b031981167f8bc8efb300000000000000000000000000000000000000000000000000000000145b806109f057506001600160e01b031981167fa6c3bf3300000000000000000000000000000000000000000000000000000000145b156109fe576107c486610da6565b6001600160e01b031981167f88ec79fb000000000000000000000000000000000000000000000000000000001415610b9e57610a38610f3d565b610a40610f3d565b606080610a5a60048b518c610be99092919063ffffffff16565b806020019051610a6d919081019061149e565b604080516002808252606082019092529498509296509094509250816020015b610a95610f3d565b815260200190600190039081610a8d5790505097508388600081518110610ab857fe5b60200260200101819052508288600181518110610ad157fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a0015187600081518110610b1157fe5b6020026020010181815250508260a0015187600181518110610b2f57fe5b60209081029190910101526040805160028082526060820190925290816020015b6060815260200190600190039081610b505790505095508186600081518110610b7557fe5b60200260200101819052508086600181518110610b8e57fe5b6020026020010181905250505050505b509193509193565b60008160040183511015610bcc57610bcc610bc76003855185600401610e1a565b610e89565b5060208183018101519101906001600160e01b0319165b92915050565b606081831115610c0257610c02610bc760008585610e1a565b8351821115610c1b57610c1b610bc76001848751610e1a565b8282036040519080825280601f01601f191660200182016040528015610c48576020820181803883390190505b509050610c69610c5782610e91565b84610c6187610e91565b018351610e97565b9392505050565b6060806060610c8c6004855186610be99092919063ffffffff16565b806020019051610c9f91908101906112c4565b9196909550909350915050565b60408051600180825281830190925260609182918291816020015b610ccf610f3d565b815260200190600190039081610cc75750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b6060815260200190600190039081610d185750508451909150610d4590859060049063ffffffff610be916565b806020019051610d589190810190611546565b85600081518110610d6557fe5b6020026020010185600081518110610d7957fe5b6020026020010185600081518110610d8d57fe5b6020908102919091010192909252919052529193909250565b604080516001808252818301909252606091829182916020808301908038833950508551919350610de29186915060049063ffffffff610be916565b806020019051610df591908101906113a1565b84518590600090610e0257fe5b60209081029190910101919091529095929450925050565b6060632800659560e01b848484604051602401610e399392919061174c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b60200190565b6020811015610ec1576001816020036101000a038019835116818551168082178652505050610f38565b82821415610ece57610f38565b82821115610f085760208103905080820181840181515b82851015610f00578451865260209586019590940193610ee5565b905250610f38565b60208103905080820181840183515b81861215610f335782518252601f199283019290910190610f17565b855250505b505050565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b805173ffffffffffffffffffffffffffffffffffffffff81168114610be357600080fd5b600082601f830112611038578081fd5b815161104b611046826118cb565b6118a4565b8181529150602080830190840160005b838110156110885761107387602084518901016110ed565b8352602092830192919091019060010161105b565b5050505092915050565b600082601f8301126110a2578081fd5b81516110b0611046826118cb565b8181529150602080830190840160005b83811015611088576110d8876020845189010161113a565b835260209283019291909101906001016110c0565b600082601f8301126110fd578081fd5b815161110b611046826118eb565b915080825283602082850101111561112257600080fd5b611133816020840160208601611918565b5092915050565b60006101c080838503121561114d578182fd5b611156816118a4565b9150506111638383611004565b81526111728360208401611004565b60208201526111848360408401611004565b60408201526111968360608401611004565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156111f857600080fd5b611204868387016110ed565b8385015261016092508285015191508082111561122057600080fd5b61122c868387016110ed565b8385015261018092508285015191508082111561124857600080fd5b611254868387016110ed565b838501526101a092508285015191508082111561127057600080fd5b5061127d858286016110ed565b82840152505092915050565b60006020828403121561129a578081fd5b815167ffffffffffffffff8111156112b0578182fd5b6112bc84828501611092565b949350505050565b6000806000606084860312156112d8578182fd5b835167ffffffffffffffff808211156112ef578384fd5b6112fb87838801611092565b9450602091508186015181811115611311578485fd5b80870188601f820112611322578586fd5b80519150611332611046836118cb565b82815284810190828601868502840187018c101561134e578889fd5b8893505b84841015611370578051835260019390930192918601918601611352565b5060408a015190975094505050508082111561138a578283fd5b5061139786828701611028565b9150509250925092565b6000806000606084860312156113b5578283fd5b835167ffffffffffffffff808211156113cc578485fd5b6113d887838801611092565b945060208601519350604086015191508082111561138a578283fd5b600060208284031215611405578081fd5b813567ffffffffffffffff81111561141b578182fd5b80830184601f82011261142c578283fd5b8035915061143c611046836118eb565b828152856020848401011115611450578384fd5b82602083016020830137918201602001929092529392505050565b60006020828403121561147c578081fd5b815167ffffffffffffffff811115611492578182fd5b6112bc8482850161113a565b600080600080608085870312156114b3578081fd5b845167ffffffffffffffff808211156114ca578283fd5b6114d68883890161113a565b955060208701519150808211156114eb578283fd5b6114f78883890161113a565b9450604087015191508082111561150c578283fd5b611518888389016110ed565b9350606087015191508082111561152d578283fd5b5061153a878288016110ed565b91505092959194509250565b60008060006060848603121561155a578283fd5b835167ffffffffffffffff80821115611571578485fd5b61157d8783880161113a565b9450602086015193506040860151915080821115611599578283fd5b50611397868287016110ed565b60006101c06115b68484516116af565b60208301516115c860208601826116af565b5060408301516115db60408601826116af565b5060608301516115ee60608601826116af565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e085015261010080840151818601525061012080840151818601525061014080840151828287015261164783870182611720565b915050610160915081840151858203838701526116648282611720565b9250505061018080840151858303828701526116808382611720565b9150506101a09150818401518582038387015261169d8282611720565b9695505050505050565b815260200190565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526020840180819550602083028101915060208501845b848110156117145782840388526116fe848351611720565b60209889019890945091909101906001016116e6565b50919695505050505050565b60008151808452611738816020860160208601611918565b601f01601f19169290920160200192915050565b606081016008851061175a57fe5b938152602081019290925260409091015290565b6000608082526117816080830187611720565b602083820381850152818751611797818561190f565b91508193508281028201838a01865b838110156117d05786830385526117be8383516115a6565b948601949250908501906001016117a6565b50508681036040880152809450885192506117eb838261190f565b94505050818701845b82811015611815576118078583516116a7565b9450908301906001016117f4565b50505050828103606084015261182b81856116c9565b979650505050505050565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201527f554e494d504c454d454e54454400000000000000000000000000000000000000604082015260600190565b60405181810167ffffffffffffffff811182821017156118c357600080fd5b604052919050565b600067ffffffffffffffff8211156118e1578081fd5b5060209081020190565b600067ffffffffffffffff821115611901578081fd5b50601f01601f191660200190565b90815260200190565b60005b8381101561193357818101518382015260200161191b565b83811115611942576000848401525b5050505056fea365627a7a72315820884abdfe69fd82b726a34318b3e10d0da6e8c516e328d10258429ee105f0ad396c6578706572696d656e74616cf564736f6c63430005100040'; - public static contractName = 'LibTransactionDecoder'; - private readonly _methodABIIndex: { [name: string]: number } = {}; - public static async deployFrom0xArtifactAsync( - artifact: ContractArtifact | SimpleContractArtifact, - supportedProvider: SupportedProvider, - txDefaults: Partial, - logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact }, - ): Promise { - assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ - schemas.addressSchema, - schemas.numberSchema, - schemas.jsNumber, - ]); - if (artifact.compilerOutput === undefined) { - throw new Error('Compiler output not found in the artifact file'); - } - const provider = providerUtils.standardizeOrThrow(supportedProvider); - const bytecode = artifact.compilerOutput.evm.bytecode.object; - const abi = artifact.compilerOutput.abi; - const logDecodeDependenciesAbiOnly: { [contractName: string]: ContractAbi } = {}; - if (Object.keys(logDecodeDependencies) !== undefined) { - for (const key of Object.keys(logDecodeDependencies)) { - logDecodeDependenciesAbiOnly[key] = logDecodeDependencies[key].compilerOutput.abi; - } - } - return LibTransactionDecoderContract.deployAsync( - bytecode, - abi, - provider, - txDefaults, - logDecodeDependenciesAbiOnly, - ); - } - - public static async deployWithLibrariesFrom0xArtifactAsync( - artifact: ContractArtifact, - libraryArtifacts: { [libraryName: string]: ContractArtifact }, - supportedProvider: SupportedProvider, - txDefaults: Partial, - logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact }, - ): Promise { - assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ - schemas.addressSchema, - schemas.numberSchema, - schemas.jsNumber, - ]); - if (artifact.compilerOutput === undefined) { - throw new Error('Compiler output not found in the artifact file'); - } - const provider = providerUtils.standardizeOrThrow(supportedProvider); - const abi = artifact.compilerOutput.abi; - const logDecodeDependenciesAbiOnly: { [contractName: string]: ContractAbi } = {}; - if (Object.keys(logDecodeDependencies) !== undefined) { - for (const key of Object.keys(logDecodeDependencies)) { - logDecodeDependenciesAbiOnly[key] = logDecodeDependencies[key].compilerOutput.abi; - } - } - const libraryAddresses = await LibTransactionDecoderContract._deployLibrariesAsync( - artifact, - libraryArtifacts, - new Web3Wrapper(provider), - txDefaults, - ); - const bytecode = linkLibrariesInBytecode(artifact, libraryAddresses); - return LibTransactionDecoderContract.deployAsync( - bytecode, - abi, - provider, - txDefaults, - logDecodeDependenciesAbiOnly, - ); - } - - public static async deployAsync( - bytecode: string, - abi: ContractAbi, - supportedProvider: SupportedProvider, - txDefaults: Partial, - logDecodeDependencies: { [contractName: string]: ContractAbi }, - ): Promise { - assert.isHexString('bytecode', bytecode); - assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ - schemas.addressSchema, - schemas.numberSchema, - schemas.jsNumber, - ]); - const provider = providerUtils.standardizeOrThrow(supportedProvider); - const constructorAbi = BaseContract._lookupConstructorAbi(abi); - [] = BaseContract._formatABIDataItemList(constructorAbi.inputs, [], BaseContract._bigNumberToString); - const iface = new ethers.utils.Interface(abi); - const deployInfo = iface.deployFunction; - const txData = deployInfo.encode(bytecode, []); - const web3Wrapper = new Web3Wrapper(provider); - const txDataWithDefaults = await BaseContract._applyDefaultsToContractTxDataAsync( - { - data: txData, - ...txDefaults, - }, - web3Wrapper.estimateGasAsync.bind(web3Wrapper), - ); - const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults); - logUtils.log(`transactionHash: ${txHash}`); - const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash); - logUtils.log(`LibTransactionDecoder successfully deployed at ${txReceipt.contractAddress}`); - const contractInstance = new LibTransactionDecoderContract( - txReceipt.contractAddress as string, - provider, - txDefaults, - logDecodeDependencies, - ); - contractInstance.constructorArgs = []; - return contractInstance; - } - - /** - * @returns The contract ABI - */ - public static ABI(): ContractAbi { - const abi = [ - { - constant: true, - inputs: [ - { - name: 'transactionData', - type: 'bytes', - }, - ], - name: 'decodeZeroExTransactionData', - outputs: [ - { - name: 'functionName', - type: 'string', - }, - { - name: 'orders', - type: 'tuple[]', - components: [ - { - name: 'makerAddress', - type: 'address', - }, - { - name: 'takerAddress', - type: 'address', - }, - { - name: 'feeRecipientAddress', - type: 'address', - }, - { - name: 'senderAddress', - type: 'address', - }, - { - name: 'makerAssetAmount', - type: 'uint256', - }, - { - name: 'takerAssetAmount', - type: 'uint256', - }, - { - name: 'makerFee', - type: 'uint256', - }, - { - name: 'takerFee', - type: 'uint256', - }, - { - name: 'expirationTimeSeconds', - type: 'uint256', - }, - { - name: 'salt', - type: 'uint256', - }, - { - name: 'makerAssetData', - type: 'bytes', - }, - { - name: 'takerAssetData', - type: 'bytes', - }, - { - name: 'makerFeeAssetData', - type: 'bytes', - }, - { - name: 'takerFeeAssetData', - type: 'bytes', - }, - ], - }, - { - name: 'takerAssetFillAmounts', - type: 'uint256[]', - }, - { - name: 'signatures', - type: 'bytes[]', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - ] as ContractAbi; - return abi; - } - - protected static async _deployLibrariesAsync( - artifact: ContractArtifact, - libraryArtifacts: { [libraryName: string]: ContractArtifact }, - web3Wrapper: Web3Wrapper, - txDefaults: Partial, - libraryAddresses: { [libraryName: string]: string } = {}, - ): Promise<{ [libraryName: string]: string }> { - const links = artifact.compilerOutput.evm.bytecode.linkReferences; - // Go through all linked libraries, recursively deploying them if necessary. - for (const link of Object.values(links)) { - for (const libraryName of Object.keys(link)) { - if (!libraryAddresses[libraryName]) { - // Library not yet deployed. - const libraryArtifact = libraryArtifacts[libraryName]; - if (!libraryArtifact) { - throw new Error(`Missing artifact for linked library "${libraryName}"`); - } - // Deploy any dependent libraries used by this library. - await LibTransactionDecoderContract._deployLibrariesAsync( - libraryArtifact, - libraryArtifacts, - web3Wrapper, - txDefaults, - libraryAddresses, - ); - // Deploy this library. - const linkedLibraryBytecode = linkLibrariesInBytecode(libraryArtifact, libraryAddresses); - const txDataWithDefaults = await BaseContract._applyDefaultsToContractTxDataAsync( - { - data: linkedLibraryBytecode, - ...txDefaults, - }, - web3Wrapper.estimateGasAsync.bind(web3Wrapper), - ); - const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults); - logUtils.log(`transactionHash: ${txHash}`); - const { contractAddress } = await web3Wrapper.awaitTransactionSuccessAsync(txHash); - logUtils.log(`${libraryArtifact.contractName} successfully deployed at ${contractAddress}`); - libraryAddresses[libraryArtifact.contractName] = contractAddress as string; - } - } - } - return libraryAddresses; - } - - public getFunctionSignature(methodName: string): string { - const index = this._methodABIIndex[methodName]; - const methodAbi = LibTransactionDecoderContract.ABI()[index] as MethodAbi; // tslint:disable-line:no-unnecessary-type-assertion - const functionSignature = methodAbiToFunctionSignature(methodAbi); - return functionSignature; - } - - public getABIDecodedTransactionData(methodName: string, callData: string): T { - const functionSignature = this.getFunctionSignature(methodName); - const self = (this as any) as LibTransactionDecoderContract; - const abiEncoder = self._lookupAbiEncoder(functionSignature); - const abiDecodedCallData = abiEncoder.strictDecode(callData); - return abiDecodedCallData; - } - - public getABIDecodedReturnData(methodName: string, callData: string): T { - const functionSignature = this.getFunctionSignature(methodName); - const self = (this as any) as LibTransactionDecoderContract; - const abiEncoder = self._lookupAbiEncoder(functionSignature); - const abiDecodedCallData = abiEncoder.strictDecodeReturnValue(callData); - return abiDecodedCallData; - } - - public getSelector(methodName: string): string { - const functionSignature = this.getFunctionSignature(methodName); - const self = (this as any) as LibTransactionDecoderContract; - const abiEncoder = self._lookupAbiEncoder(functionSignature); - return abiEncoder.getSelector(); - } - - /** - * Decodes the call data for an Exchange contract method call. - * @param transactionData ABI-encoded calldata for an Exchange contract - * method call. - * @returns The name of the function called, and the parameters it was given. For single-order fills and cancels, the arrays will have just one element. - */ - public decodeZeroExTransactionData( - transactionData: string, - ): ContractFunctionObj< - [ - string, - Array<{ - makerAddress: string; - takerAddress: string; - feeRecipientAddress: string; - senderAddress: string; - makerAssetAmount: BigNumber; - takerAssetAmount: BigNumber; - makerFee: BigNumber; - takerFee: BigNumber; - expirationTimeSeconds: BigNumber; - salt: BigNumber; - makerAssetData: string; - takerAssetData: string; - makerFeeAssetData: string; - takerFeeAssetData: string; - }>, - BigNumber[], - string[] - ] - > { - const self = (this as any) as LibTransactionDecoderContract; - assert.isString('transactionData', transactionData); - const functionSignature = 'decodeZeroExTransactionData(bytes)'; - - return { - async callAsync( - callData: Partial = {}, - defaultBlock?: BlockParam, - ): Promise< - [ - string, - Array<{ - makerAddress: string; - takerAddress: string; - feeRecipientAddress: string; - senderAddress: string; - makerAssetAmount: BigNumber; - takerAssetAmount: BigNumber; - makerFee: BigNumber; - takerFee: BigNumber; - expirationTimeSeconds: BigNumber; - salt: BigNumber; - makerAssetData: string; - takerAssetData: string; - makerFeeAssetData: string; - takerFeeAssetData: string; - }>, - BigNumber[], - string[] - ] - > { - BaseContract._assertCallParams(callData, defaultBlock); - let rawCallResult; - if (self._deployedBytecodeIfExists) { - rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - } else { - rawCallResult = await self._performCallAsync( - { ...callData, data: this.getABIEncodedTransactionData() }, - defaultBlock, - ); - } - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue< - [ - string, - Array<{ - makerAddress: string; - takerAddress: string; - feeRecipientAddress: string; - senderAddress: string; - makerAssetAmount: BigNumber; - takerAssetAmount: BigNumber; - makerFee: BigNumber; - takerFee: BigNumber; - expirationTimeSeconds: BigNumber; - salt: BigNumber; - makerAssetData: string; - takerAssetData: string; - makerFeeAssetData: string; - takerFeeAssetData: string; - }>, - BigNumber[], - string[] - ] - >(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [transactionData]); - }, - }; - } - - constructor( - address: string, - supportedProvider: SupportedProvider, - txDefaults?: Partial, - logDecodeDependencies?: { [contractName: string]: ContractAbi }, - deployedBytecode: string | undefined = LibTransactionDecoderContract.deployedBytecode, - ) { - super( - 'LibTransactionDecoder', - LibTransactionDecoderContract.ABI(), - address, - supportedProvider, - txDefaults, - logDecodeDependencies, - deployedBytecode, - ); - classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); - LibTransactionDecoderContract.ABI().forEach((item, index) => { - if (item.type === 'function') { - const methodAbi = item as MethodAbi; - this._methodABIIndex[methodAbi.name] = index; - } - }); - } -} - -// tslint:disable:max-file-line-count -// tslint:enable:no-unbound-method no-parameter-reassignment no-consecutive-blank-lines ordered-imports align -// tslint:enable:trailing-comma whitespace no-trailing-whitespace diff --git a/packages/contract-wrappers/src/generated-wrappers/staking.ts b/packages/contract-wrappers/src/generated-wrappers/staking.ts index 83c3d1ea04..d00625ed17 100644 --- a/packages/contract-wrappers/src/generated-wrappers/staking.ts +++ b/packages/contract-wrappers/src/generated-wrappers/staking.ts @@ -166,6 +166,7 @@ export interface StakingUnstakeEventArgs extends DecodedLogArgs { } /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class StakingContract extends BaseContract { diff --git a/packages/contract-wrappers/src/generated-wrappers/staking_proxy.ts b/packages/contract-wrappers/src/generated-wrappers/staking_proxy.ts index bdd59569f8..1f271ee273 100644 --- a/packages/contract-wrappers/src/generated-wrappers/staking_proxy.ts +++ b/packages/contract-wrappers/src/generated-wrappers/staking_proxy.ts @@ -72,6 +72,7 @@ export interface StakingProxyStakingContractAttachedToProxyEventArgs extends Dec export interface StakingProxyStakingContractDetachedFromProxyEventArgs extends DecodedLogArgs {} /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class StakingProxyContract extends BaseContract { diff --git a/packages/contract-wrappers/src/generated-wrappers/weth9.ts b/packages/contract-wrappers/src/generated-wrappers/weth9.ts index e99fc2651e..e5de378a61 100644 --- a/packages/contract-wrappers/src/generated-wrappers/weth9.ts +++ b/packages/contract-wrappers/src/generated-wrappers/weth9.ts @@ -71,6 +71,7 @@ export interface WETH9WithdrawalEventArgs extends DecodedLogArgs { } /* istanbul ignore next */ +// tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class WETH9Contract extends BaseContract {